Merge branch 'master' of git://git.denx.de/u-boot-fsl-qoriq
diff --git a/Makefile b/Makefile
index 954a865..4dc179b 100644
--- a/Makefile
+++ b/Makefile
@@ -1452,6 +1452,7 @@
 		-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
 		-o -name '*.symtypes' -o -name 'modules.order' \
 		-o -name modules.builtin -o -name '.tmp_*.o.*' \
+		-o -name 'dsdt.aml' -o -name 'dsdt.asl.tmp' -o -name 'dsdt.c' \
 		-o -name '*.gcno' \) -type f -print | xargs rm -f
 
 # mrproper - Delete all generated files, including .config
diff --git a/README b/README
index 88ff837..6f4c09a 100644
--- a/README
+++ b/README
@@ -1003,6 +1003,7 @@
 		CONFIG_CMD_ECHO		  echo arguments
 		CONFIG_CMD_EDITENV	  edit env variable
 		CONFIG_CMD_EEPROM	* EEPROM read/write support
+		CONFIG_CMD_EEPROM_LAYOUT* EEPROM layout aware commands
 		CONFIG_CMD_ELF		* bootelf, bootvx
 		CONFIG_CMD_ENV_CALLBACK	* display details about env callbacks
 		CONFIG_CMD_ENV_FLAGS	* display details about env flags
@@ -1066,7 +1067,7 @@
 		CONFIG_CMD_RUN		  run command in env variable
 		CONFIG_CMD_SANDBOX	* sb command to access sandbox features
 		CONFIG_CMD_SAVES	* save S record dump
-		CONFIG_CMD_SCSI		* SCSI Support
+		CONFIG_SCSI		* SCSI Support
 		CONFIG_CMD_SDRAM	* print SDRAM configuration information
 					  (requires CONFIG_CMD_I2C)
 		CONFIG_CMD_SETGETDCR	  Support for DCR Register access
@@ -1254,7 +1255,7 @@
 		CONFIG_MTD_PARTITIONS  Memory Technology Device partition table.
 
 		If IDE or SCSI support is enabled (CONFIG_CMD_IDE or
-		CONFIG_CMD_SCSI) you must configure support for at
+		CONFIG_SCSI) you must configure support for at
 		least one non-MTD partition type as well.
 
 - IDE Reset method:
@@ -3487,6 +3488,10 @@
 		consider that a completely unreadable NAND block is bad,
 		and thus should be skipped silently.
 
+		CONFIG_SPL_ABORT_ON_RAW_IMAGE
+		When defined, SPL will proceed to another boot method
+		if the image it has loaded does not have a signature.
+
 		CONFIG_SPL_RELOC_STACK
 		Adress of the start of the stack SPL will use after
 		relocation.  If unspecified, this is equal to
diff --git a/api/api.c b/api/api.c
index 457dc36..8a1433a 100644
--- a/api/api.c
+++ b/api/api.c
@@ -52,7 +52,7 @@
 {
 	int *c;
 
-	if ((c = (int *)va_arg(ap, u_int32_t)) == NULL)
+	if ((c = (int *)va_arg(ap, uintptr_t)) == NULL)
 		return API_EINVAL;
 
 	*c = getc();
@@ -68,7 +68,7 @@
 {
 	int *t;
 
-	if ((t = (int *)va_arg(ap, u_int32_t)) == NULL)
+	if ((t = (int *)va_arg(ap, uintptr_t)) == NULL)
 		return API_EINVAL;
 
 	*t = tstc();
@@ -84,7 +84,7 @@
 {
 	char *c;
 
-	if ((c = (char *)va_arg(ap, u_int32_t)) == NULL)
+	if ((c = (char *)va_arg(ap, uintptr_t)) == NULL)
 		return API_EINVAL;
 
 	putc(*c);
@@ -100,7 +100,7 @@
 {
 	char *s;
 
-	if ((s = (char *)va_arg(ap, u_int32_t)) == NULL)
+	if ((s = (char *)va_arg(ap, uintptr_t)) == NULL)
 		return API_EINVAL;
 
 	puts(s);
@@ -132,7 +132,7 @@
 {
 	struct sys_info *si;
 
-	si = (struct sys_info *)va_arg(ap, u_int32_t);
+	si = (struct sys_info *)va_arg(ap, uintptr_t);
 	if (si == NULL)
 		return API_ENOMEM;
 
@@ -148,7 +148,7 @@
 {
 	unsigned long *d;
 
-	if ((d = (unsigned long *)va_arg(ap, u_int32_t)) == NULL)
+	if ((d = (unsigned long *)va_arg(ap, unsigned long)) == NULL)
 		return API_EINVAL;
 
 	udelay(*d);
@@ -164,11 +164,11 @@
 {
 	unsigned long *base, *cur;
 
-	cur = (unsigned long *)va_arg(ap, u_int32_t);
+	cur = (unsigned long *)va_arg(ap, unsigned long);
 	if (cur == NULL)
 		return API_EINVAL;
 
-	base = (unsigned long *)va_arg(ap, u_int32_t);
+	base = (unsigned long *)va_arg(ap, unsigned long);
 	if (base == NULL)
 		return API_EINVAL;
 
@@ -199,7 +199,7 @@
 	struct device_info *di;
 
 	/* arg is ptr to the device_info struct we are going to fill out */
-	di = (struct device_info *)va_arg(ap, u_int32_t);
+	di = (struct device_info *)va_arg(ap, uintptr_t);
 	if (di == NULL)
 		return API_EINVAL;
 
@@ -233,7 +233,7 @@
 	int err = 0;
 
 	/* arg is ptr to the device_info struct */
-	di = (struct device_info *)va_arg(ap, u_int32_t);
+	di = (struct device_info *)va_arg(ap, uintptr_t);
 	if (di == NULL)
 		return API_EINVAL;
 
@@ -265,7 +265,7 @@
 	int err = 0;
 
 	/* arg is ptr to the device_info struct */
-	di = (struct device_info *)va_arg(ap, u_int32_t);
+	di = (struct device_info *)va_arg(ap, uintptr_t);
 	if (di == NULL)
 		return API_EINVAL;
 
@@ -319,7 +319,7 @@
 	int err = 0;
 
 	/* 1. arg is ptr to the device_info struct */
-	di = (struct device_info *)va_arg(ap, u_int32_t);
+	di = (struct device_info *)va_arg(ap, uintptr_t);
 	if (di == NULL)
 		return API_EINVAL;
 
@@ -329,12 +329,12 @@
 		return API_ENODEV;
 
 	/* 2. arg is ptr to buffer from where to get data to write */
-	buf = (void *)va_arg(ap, u_int32_t);
+	buf = (void *)va_arg(ap, uintptr_t);
 	if (buf == NULL)
 		return API_EINVAL;
 
 	/* 3. arg is length of buffer */
-	len = (int *)va_arg(ap, u_int32_t);
+	len = (int *)va_arg(ap, uintptr_t);
 	if (len == NULL)
 		return API_EINVAL;
 	if (*len <= 0)
@@ -387,7 +387,7 @@
 	int *len_net, *act_len_net;
 
 	/* 1. arg is ptr to the device_info struct */
-	di = (struct device_info *)va_arg(ap, u_int32_t);
+	di = (struct device_info *)va_arg(ap, uintptr_t);
 	if (di == NULL)
 		return API_EINVAL;
 
@@ -397,23 +397,23 @@
 		return API_ENODEV;
 
 	/* 2. arg is ptr to buffer from where to put the read data */
-	buf = (void *)va_arg(ap, u_int32_t);
+	buf = (void *)va_arg(ap, uintptr_t);
 	if (buf == NULL)
 		return API_EINVAL;
 
 	if (di->type & DEV_TYP_STOR) {
 		/* 3. arg - ptr to var with # of blocks to read */
-		len_stor = (lbasize_t *)va_arg(ap, u_int32_t);
+		len_stor = (lbasize_t *)va_arg(ap, uintptr_t);
 		if (!len_stor)
 			return API_EINVAL;
 		if (*len_stor <= 0)
 			return API_EINVAL;
 
 		/* 4. arg - ptr to var with start block */
-		start = (lbastart_t *)va_arg(ap, u_int32_t);
+		start = (lbastart_t *)va_arg(ap, uintptr_t);
 
 		/* 5. arg - ptr to var where to put the len actually read */
-		act_len_stor = (lbasize_t *)va_arg(ap, u_int32_t);
+		act_len_stor = (lbasize_t *)va_arg(ap, uintptr_t);
 		if (!act_len_stor)
 			return API_EINVAL;
 
@@ -422,14 +422,14 @@
 	} else if (di->type & DEV_TYP_NET) {
 
 		/* 3. arg points to the var with length of packet to read */
-		len_net = (int *)va_arg(ap, u_int32_t);
+		len_net = (int *)va_arg(ap, uintptr_t);
 		if (!len_net)
 			return API_EINVAL;
 		if (*len_net <= 0)
 			return API_EINVAL;
 
 		/* 4. - ptr to var where to put the len actually read */
-		act_len_net = (int *)va_arg(ap, u_int32_t);
+		act_len_net = (int *)va_arg(ap, uintptr_t);
 		if (!act_len_net)
 			return API_EINVAL;
 
@@ -453,9 +453,9 @@
 {
 	char *name, **value;
 
-	if ((name = (char *)va_arg(ap, u_int32_t)) == NULL)
+	if ((name = (char *)va_arg(ap, uintptr_t)) == NULL)
 		return API_EINVAL;
-	if ((value = (char **)va_arg(ap, u_int32_t)) == NULL)
+	if ((value = (char **)va_arg(ap, uintptr_t)) == NULL)
 		return API_EINVAL;
 
 	*value = getenv(name);
@@ -476,9 +476,9 @@
 {
 	char *name, *value;
 
-	if ((name = (char *)va_arg(ap, u_int32_t)) == NULL)
+	if ((name = (char *)va_arg(ap, uintptr_t)) == NULL)
 		return API_EINVAL;
-	if ((value = (char *)va_arg(ap, u_int32_t)) == NULL)
+	if ((value = (char *)va_arg(ap, uintptr_t)) == NULL)
 		return API_EINVAL;
 
 	setenv(name, value);
@@ -498,9 +498,9 @@
 	int i, n;
 	char *last, **next;
 
-	last = (char *)va_arg(ap, u_int32_t);
+	last = (char *)va_arg(ap, unsigned long);
 
-	if ((next = (char **)va_arg(ap, u_int32_t)) == NULL)
+	if ((next = (char **)va_arg(ap, uintptr_t)) == NULL)
 		return API_EINVAL;
 
 	if (last == NULL)
@@ -662,14 +662,14 @@
 	}
 
 	setenv_hex("api_address", (unsigned long)sig);
-	debugf("API sig @ 0x%08x\n", sig);
+	debugf("API sig @ 0x%lX\n", (unsigned long)sig);
 	memcpy(sig->magic, API_SIG_MAGIC, 8);
 	sig->version = API_SIG_VERSION;
 	sig->syscall = &syscall;
 	sig->checksum = 0;
 	sig->checksum = crc32(0, (unsigned char *)sig,
 			      sizeof(struct api_signature));
-	debugf("syscall entry: 0x%08x\n", sig->syscall);
+	debugf("syscall entry: 0x%lX\n", (unsigned long)sig->syscall);
 }
 
 void platform_set_mr(struct sys_info *si, unsigned long start, unsigned long size,
diff --git a/api/api_storage.c b/api/api_storage.c
index 8c30c56..d425a9a 100644
--- a/api/api_storage.c
+++ b/api/api_storage.c
@@ -67,7 +67,7 @@
 	specs[ENUM_SATA].type = DEV_TYP_STOR | DT_STOR_SATA;
 	specs[ENUM_SATA].name = "sata";
 #endif
-#if defined(CONFIG_CMD_SCSI)
+#if defined(CONFIG_SCSI)
 	specs[ENUM_SCSI].max_dev = CONFIG_SYS_SCSI_MAX_DEVICE;
 	specs[ENUM_SCSI].enum_started = 0;
 	specs[ENUM_SCSI].enum_ended = 0;
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 6b65d8e..729b181 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -594,6 +594,7 @@
 	select DM
 	select OF_CONTROL
 	select DM_SERIAL
+	select SUPPORT_SPL
 
 config TEGRA
 	bool "NVIDIA Tegra"
diff --git a/arch/arm/cpu/armv7/mx7/clock_slice.c b/arch/arm/cpu/armv7/mx7/clock_slice.c
index ad5d504..1665df9 100644
--- a/arch/arm/cpu/armv7/mx7/clock_slice.c
+++ b/arch/arm/cpu/armv7/mx7/clock_slice.c
@@ -55,7 +55,7 @@
 	  PLL_ENET_MAIN_250M_CLK, PLL_AUDIO_MAIN_CLK}
 	},
 	{AHB_CLK_ROOT, CCM_AHB_CHANNEL,
-	 {OSC_24M_CLK, PLL_SYS_PFD2_135M_CLK, PLL_DRAM_MAIN_533M_CLK,
+	 {OSC_24M_CLK, PLL_SYS_PFD2_270M_CLK, PLL_DRAM_MAIN_533M_CLK,
 	  PLL_SYS_PFD0_392M_CLK, PLL_ENET_MAIN_125M_CLK, PLL_USB_MAIN_480M_CLK,
 	  PLL_AUDIO_MAIN_CLK, PLL_VIDEO_MAIN_CLK}
 	},
diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S
index c3cc819..e933021 100644
--- a/arch/arm/cpu/armv8/start.S
+++ b/arch/arm/cpu/armv8/start.S
@@ -216,7 +216,7 @@
 #endif
 #endif
 
-#ifndef CONFIG_ARMV8_MULTIENTRY
+#ifdef CONFIG_ARMV8_MULTIENTRY
 	branch_if_master x0, x1, 2f
 
 	/*
diff --git a/arch/arm/cpu/armv8/zynqmp/Makefile b/arch/arm/cpu/armv8/zynqmp/Makefile
index d0ed222..be8673a 100644
--- a/arch/arm/cpu/armv8/zynqmp/Makefile
+++ b/arch/arm/cpu/armv8/zynqmp/Makefile
@@ -9,3 +9,4 @@
 obj-y	+= cpu.o
 obj-$(CONFIG_MP)	+= mp.o
 obj-y	+= slcr.o
+obj-$(CONFIG_SPL_BUILD) += spl.o
diff --git a/arch/arm/cpu/armv8/zynqmp/spl.c b/arch/arm/cpu/armv8/zynqmp/spl.c
new file mode 100644
index 0000000..e3e2a4f
--- /dev/null
+++ b/arch/arm/cpu/armv8/zynqmp/spl.c
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2015 - 2016 Xilinx, Inc.
+ *
+ * Michal Simek <michal.simek@xilinx.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <debug_uart.h>
+#include <spl.h>
+
+#include <asm/io.h>
+#include <asm/spl.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/sys_proto.h>
+
+void board_init_f(ulong dummy)
+{
+	psu_init();
+	board_early_init_r();
+
+#ifdef CONFIG_DEBUG_UART
+	/* Uart debug for sure */
+	debug_uart_init();
+	puts("Debug uart enabled\n"); /* or printch() */
+#endif
+	/* Delay is required for clocks to be propagated */
+	udelay(1000000);
+
+	/* Clear the BSS */
+	memset(__bss_start, 0, __bss_end - __bss_start);
+
+	/* No need to call timer init - it is empty for ZynqMP */
+	board_init_r(NULL, 0);
+}
+
+#ifdef CONFIG_SPL_BOARD_INIT
+void spl_board_init(void)
+{
+	preloader_console_init();
+	board_init();
+}
+#endif
+
+u32 spl_boot_device(void)
+{
+	u32 reg = 0;
+	u8 bootmode;
+
+	reg = readl(&crlapb_base->boot_mode);
+	bootmode = reg & BOOT_MODES_MASK;
+
+	switch (bootmode) {
+	case JTAG_MODE:
+		return BOOT_DEVICE_RAM;
+#ifdef CONFIG_SPL_MMC_SUPPORT
+	case EMMC_MODE:
+	case SD_MODE:
+	case SD_MODE1:
+		return BOOT_DEVICE_MMC1;
+#endif
+	default:
+		printf("Invalid Boot Mode:0x%x\n", bootmode);
+		break;
+	}
+
+	return 0;
+}
+
+u32 spl_boot_mode(void)
+{
+	switch (spl_boot_device()) {
+	case BOOT_DEVICE_RAM:
+		return 0;
+	case BOOT_DEVICE_MMC1:
+		return MMCSD_MODE_FS;
+	default:
+		puts("spl: error: unsupported device\n");
+		hang();
+	}
+}
+
+__weak void psu_init(void)
+{
+	 /*
+	  * This function is overridden by the one in
+	  * board/xilinx/zynqmp/(platform)/psu_init_gpl.c, if it exists.
+	  */
+}
+
+#ifdef CONFIG_SPL_OS_BOOT
+int spl_start_uboot(void)
+{
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_SPL_LOAD_FIT
+int board_fit_config_name_match(const char *name)
+{
+	/* Just empty function now - can't decide what to choose */
+	debug("%s: %s\n", __func__, name);
+
+	return 0;
+}
+#endif
diff --git a/arch/arm/dts/am4372.dtsi b/arch/arm/dts/am4372.dtsi
index c95d1d3..3ffa8e0 100644
--- a/arch/arm/dts/am4372.dtsi
+++ b/arch/arm/dts/am4372.dtsi
@@ -547,6 +547,7 @@
 			active_slave = <0>;
 			cpts_clock_mult = <0x80000000>;
 			cpts_clock_shift = <29>;
+			syscon = <&scm_conf>;
 			ranges;
 
 			davinci_mdio: mdio@4a101000 {
diff --git a/arch/arm/dts/dra7.dtsi b/arch/arm/dts/dra7.dtsi
index e7fecf7..0f242e6 100644
--- a/arch/arm/dts/dra7.dtsi
+++ b/arch/arm/dts/dra7.dtsi
@@ -1411,7 +1411,7 @@
 			ti,irqs-safe-map = <0>;
 		};
 
-		mac: ethernet@4a100000 {
+		mac: ethernet@48484000 {
 			compatible = "ti,cpsw";
 			ti,hwmods = "gmac";
 			clocks = <&dpll_gmac_ck>, <&gmac_gmii_ref_clk_div>;
@@ -1426,6 +1426,7 @@
 			active_slave = <0>;
 			cpts_clock_mult = <0x80000000>;
 			cpts_clock_shift = <29>;
+			syscon = <&scm_conf>;
 			reg = <0x48484000 0x1000
 			       0x48485200 0x2E00>;
 			#address-cells = <1>;
diff --git a/arch/arm/dts/exynos4210-universal_c210.dts b/arch/arm/dts/exynos4210-universal_c210.dts
index 16948c9..ad3527e 100644
--- a/arch/arm/dts/exynos4210-universal_c210.dts
+++ b/arch/arm/dts/exynos4210-universal_c210.dts
@@ -42,11 +42,11 @@
 	};
 
 	soft-spi {
-		compatible = "u-boot,soft-spi";
-		cs-gpio = <&gpy4 3 0>;
-		sclk-gpio = <&gpy3 1 0>;
-		mosi-gpio = <&gpy3 3 0>;
-		miso-gpio = <&gpy3 0 0>;
+		compatible = "spi-gpio";
+		cs-gpios = <&gpy4 3 0>;
+		gpio-sck = <&gpy3 1 0>;
+		gpio-mosi = <&gpy3 3 0>;
+		gpio-miso = <&gpy3 0 0>;
 		spi-delay-us = <1>;
 		#address-cells = <1>;
 		#size-cells = <0>;
diff --git a/arch/arm/dts/tegra20-seaboard.dts b/arch/arm/dts/tegra20-seaboard.dts
index eada590..5893d2a 100644
--- a/arch/arm/dts/tegra20-seaboard.dts
+++ b/arch/arm/dts/tegra20-seaboard.dts
@@ -40,10 +40,6 @@
 				nvidia,panel = <&lcd_panel>;
 			};
 		};
-
-		dc@54240000 {
-			status = "disabled";
-		};
 	};
 
 	/* This is not used in U-Boot, but is expected to be in kernel .dts */
diff --git a/arch/arm/dts/zynq-7000.dtsi b/arch/arm/dts/zynq-7000.dtsi
index a327557..b618a3f 100644
--- a/arch/arm/dts/zynq-7000.dtsi
+++ b/arch/arm/dts/zynq-7000.dtsi
@@ -251,7 +251,7 @@
 		slcr: slcr@f8000000 {
 			#address-cells = <1>;
 			#size-cells = <1>;
-			compatible = "xlnx,zynq-slcr", "syscon", "simple-bus";
+			compatible = "xlnx,zynq-slcr", "syscon", "simple-mfd";
 			reg = <0xF8000000 0x1000>;
 			ranges;
 			clkc: clkc@100 {
diff --git a/arch/arm/dts/zynqmp.dtsi b/arch/arm/dts/zynqmp.dtsi
index fb95b48..619450e 100644
--- a/arch/arm/dts/zynqmp.dtsi
+++ b/arch/arm/dts/zynqmp.dtsi
@@ -253,9 +253,9 @@
 			compatible = "arm,gic-400", "arm,cortex-a15-gic";
 			#interrupt-cells = <3>;
 			reg = <0x0 0xf9010000 0x10000>,
-			      <0x0 0xf902f000 0x2000>,
+			      <0x0 0xf9020000 0x20000>,
 			      <0x0 0xf9040000 0x20000>,
-			      <0x0 0xf906f000 0x2000>;
+			      <0x0 0xf9060000 0x20000>;
 			interrupt-controller;
 			interrupt-parent = <&gic>;
 			interrupts = <1 9 0xf04>;
@@ -264,6 +264,7 @@
 
 	amba: amba {
 		compatible = "simple-bus";
+		u-boot,dm-pre-reloc;
 		#address-cells = <2>;
 		#size-cells = <1>;
 		ranges = <0 0 0 0 0xffffffff>;
@@ -674,6 +675,7 @@
 		};
 
 		sdhci0: sdhci@ff160000 {
+			u-boot,dm-pre-reloc;
 			compatible = "arasan,sdhci-8.9a";
 			status = "disabled";
 			interrupt-parent = <&gic>;
@@ -685,6 +687,7 @@
 		};
 
 		sdhci1: sdhci@ff170000 {
+			u-boot,dm-pre-reloc;
 			compatible = "arasan,sdhci-8.9a";
 			status = "disabled";
 			interrupt-parent = <&gic>;
@@ -776,6 +779,7 @@
 		};
 
 		uart0: serial@ff000000 {
+			u-boot,dm-pre-reloc;
 			compatible = "cdns,uart-r1p12", "xlnx,xuartps";
 			status = "disabled";
 			interrupt-parent = <&gic>;
@@ -786,6 +790,7 @@
 		};
 
 		uart1: serial@ff010000 {
+			u-boot,dm-pre-reloc;
 			compatible = "cdns,uart-r1p12", "xlnx,xuartps";
 			status = "disabled";
 			interrupt-parent = <&gic>;
diff --git a/arch/arm/imx-common/cpu.c b/arch/arm/imx-common/cpu.c
index 5fb3ed8..4223187 100644
--- a/arch/arm/imx-common/cpu.c
+++ b/arch/arm/imx-common/cpu.c
@@ -138,7 +138,7 @@
 {
 	switch (imxtype) {
 	case MXC_CPU_MX7S:
-		return "7SOLO";	/* Single-core version of the mx7 */
+		return "7S";	/* Single-core version of the mx7 */
 	case MXC_CPU_MX7D:
 		return "7D";	/* Dual-core version of the mx7 */
 	case MXC_CPU_MX6QP:
diff --git a/arch/arm/include/asm/arch-ls102xa/config.h b/arch/arm/include/asm/arch-ls102xa/config.h
index 139a623..04abec4 100644
--- a/arch/arm/include/asm/arch-ls102xa/config.h
+++ b/arch/arm/include/asm/arch-ls102xa/config.h
@@ -83,7 +83,7 @@
 /* SATA */
 #define AHCI_BASE_ADDR				(CONFIG_SYS_IMMR + 0x02200000)
 #define CONFIG_BOARD_LATE_INIT
-#define CONFIG_CMD_SCSI
+#define CONFIG_SCSI
 #define CONFIG_LIBATA
 #define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
diff --git a/arch/arm/include/asm/arch-mx6/mx6sl_pins.h b/arch/arm/include/asm/arch-mx6/mx6sl_pins.h
index 6ba1034..919d83d 100644
--- a/arch/arm/include/asm/arch-mx6/mx6sl_pins.h
+++ b/arch/arm/include/asm/arch-mx6/mx6sl_pins.h
@@ -22,6 +22,7 @@
 	MX6_PAD_SD1_DAT3__USDHC1_DAT3				= IOMUX_PAD(0x0548, 0x0240, 0, 0x0000, 0, 0),
 	MX6_PAD_SD1_DAT4__USDHC1_DAT4				= IOMUX_PAD(0x054C, 0x0244, 0, 0x0000, 0, 0),
 	MX6_PAD_SD1_DAT5__USDHC1_DAT5				= IOMUX_PAD(0x0550, 0x0248, 0, 0x0000, 0, 0),
+	MX6_PAD_SD1_DAT5__GPIO_5_9				= IOMUX_PAD(0x0550, 0x0248, 5, 0x0000, 0, 0),
 	MX6_PAD_SD1_DAT6__USDHC1_DAT6				= IOMUX_PAD(0x0554, 0x024C, 0, 0x0000, 0, 0),
 	MX6_PAD_SD1_DAT7__USDHC1_DAT7				= IOMUX_PAD(0x0558, 0x0250, 0, 0x0000, 0, 0),
 	MX6_PAD_KEY_ROW7__GPIO_4_7					= IOMUX_PAD(0x04B0, 0x01A8, 5, 0x0000, 0, 0),
diff --git a/arch/arm/include/asm/arch-mx7/mx7d_pins.h b/arch/arm/include/asm/arch-mx7/mx7d_pins.h
index d8b4097..0ab1246 100644
--- a/arch/arm/include/asm/arch-mx7/mx7d_pins.h
+++ b/arch/arm/include/asm/arch-mx7/mx7d_pins.h
@@ -635,7 +635,7 @@
 	MX7D_PAD_LCD_DATA23__GPIO3_IO28                          = IOMUX_PAD(0x0394, 0x0124, 5, 0x0000, 0, 0),
 	MX7D_PAD_LCD_DATA23__I2C4_SDA                            = IOMUX_PAD(0x0394, 0x0124, IOMUX_CONFIG_SION | 6, 0x05F0, 1, 0),
 
-	MX7D_PAD_UART1_RX_DATA__UART1_DCE_RX                     = IOMUX_PAD(0x0398, 0x0128, 0, 0x0000, 0, 0),
+	MX7D_PAD_UART1_RX_DATA__UART1_DCE_RX                     = IOMUX_PAD(0x0398, 0x0128, 0, 0x06F4, 0, 0),
 
 	MX7D_PAD_UART1_RX_DATA__UART1_DTE_TX                     = IOMUX_PAD(0x0398, 0x0128, 0, 0x0000, 0, 0),
 	MX7D_PAD_UART1_RX_DATA__I2C1_SCL                         = IOMUX_PAD(0x0398, 0x0128, IOMUX_CONFIG_SION | 1, 0x0000, 0, 0),
@@ -655,7 +655,7 @@
 	MX7D_PAD_UART1_TX_DATA__GPIO4_IO1                        = IOMUX_PAD(0x039C, 0x012C, 5, 0x0000, 0, 0),
 	MX7D_PAD_UART1_TX_DATA__ENET1_MDC                        = IOMUX_PAD(0x039C, 0x012C, 6, 0x0000, 0, 0),
 
-	MX7D_PAD_UART2_RX_DATA__UART2_DCE_RX                     = IOMUX_PAD(0x03A0, 0x0130, 0, 0x0000, 0, 0),
+	MX7D_PAD_UART2_RX_DATA__UART2_DCE_RX                     = IOMUX_PAD(0x03A0, 0x0130, 0, 0x06FC, 2, 0),
 
 	MX7D_PAD_UART2_RX_DATA__UART2_DTE_TX                     = IOMUX_PAD(0x03A0, 0x0130, 0, 0x0000, 0, 0),
 	MX7D_PAD_UART2_RX_DATA__I2C2_SCL                         = IOMUX_PAD(0x03A0, 0x0130, IOMUX_CONFIG_SION | 1, 0x0000, 0, 0),
@@ -667,7 +667,7 @@
 
 	MX7D_PAD_UART2_TX_DATA__UART2_DCE_TX                     = IOMUX_PAD(0x03A4, 0x0134, 0, 0x0000, 0, 0),
 
-	MX7D_PAD_UART2_TX_DATA__UART2_DTE_RX                     = IOMUX_PAD(0x03A4, 0x0134, 0, 0x0000, 0, 0),
+	MX7D_PAD_UART2_TX_DATA__UART2_DTE_RX                     = IOMUX_PAD(0x03A4, 0x0134, 0, 0x06FC, 3, 0),
 	MX7D_PAD_UART2_TX_DATA__I2C2_SDA                         = IOMUX_PAD(0x03A4, 0x0134, IOMUX_CONFIG_SION | 1, 0x05E0, 0, 0),
 	MX7D_PAD_UART2_TX_DATA__SAI3_RX_DATA0                    = IOMUX_PAD(0x03A4, 0x0134, 2, 0x06C8, 0, 0),
 	MX7D_PAD_UART2_TX_DATA__ECSPI1_RDY                       = IOMUX_PAD(0x03A4, 0x0134, 3, 0x0000, 0, 0),
@@ -695,7 +695,7 @@
 	MX7D_PAD_UART3_TX_DATA__GPIO4_IO5                        = IOMUX_PAD(0x03AC, 0x013C, 5, 0x0000, 0, 0),
 	MX7D_PAD_UART3_TX_DATA__SD2_LCTL                         = IOMUX_PAD(0x03AC, 0x013C, 6, 0x0000, 0, 0),
 
-	MX7D_PAD_UART3_RTS_B__UART3_DCE_RTS                      = IOMUX_PAD(0x03B0, 0x0140, 0, 0x0000, 0, 0),
+	MX7D_PAD_UART3_RTS_B__UART3_DCE_RTS                      = IOMUX_PAD(0x03B0, 0x0140, 0, 0x0700, 2, 0),
 
 	MX7D_PAD_UART3_RTS_B__UART3_DTE_CTS                      = IOMUX_PAD(0x03B0, 0x0140, 0, 0x0000, 0, 0),
 	MX7D_PAD_UART3_RTS_B__USB_OTG2_OC                        = IOMUX_PAD(0x03B0, 0x0140, 1, 0x0000, 0, 0),
diff --git a/arch/arm/include/asm/arch-omap5/cpu.h b/arch/arm/include/asm/arch-omap5/cpu.h
index b1513e9..683d905 100644
--- a/arch/arm/include/asm/arch-omap5/cpu.h
+++ b/arch/arm/include/asm/arch-omap5/cpu.h
@@ -116,4 +116,16 @@
 #define CPSW_BASE			0x48484000
 #define CPSW_MDIO_BASE			0x48485000
 
+/* gmii_sel register defines */
+#define GMII1_SEL_MII		0x0
+#define GMII1_SEL_RMII		0x1
+#define GMII1_SEL_RGMII		0x2
+#define GMII2_SEL_MII		(GMII1_SEL_MII << 4)
+#define GMII2_SEL_RMII		(GMII1_SEL_RMII << 4)
+#define GMII2_SEL_RGMII		(GMII1_SEL_RGMII << 4)
+
+#define MII_MODE_ENABLE		(GMII1_SEL_MII | GMII2_SEL_MII)
+#define RMII_MODE_ENABLE        (GMII1_SEL_RMII | GMII2_SEL_RMII)
+#define RGMII_MODE_ENABLE	(GMII1_SEL_RGMII | GMII2_SEL_RGMII)
+
 #endif /* _CPU_H */
diff --git a/arch/arm/include/asm/arch-zynqmp/sys_proto.h b/arch/arm/include/asm/arch-zynqmp/sys_proto.h
index 021626d..1db2bd6 100644
--- a/arch/arm/include/asm/arch-zynqmp/sys_proto.h
+++ b/arch/arm/include/asm/arch-zynqmp/sys_proto.h
@@ -17,4 +17,6 @@
 
 unsigned int zynqmp_get_silicon_version(void);
 
+void psu_init(void);
+
 #endif /* _ASM_ARCH_SYS_PROTO_H */
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 9ce775e..73a9c74 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -71,6 +71,11 @@
 	select CPU_ARM926EJS
 	select SUPPORT_SPL
 
+config TARGET_SAMA5D2_PTC
+	bool "SAMA5D2 PTC board"
+	select CPU_V7
+	select SUPPORT_SPL
+
 config TARGET_SAMA5D2_XPLAINED
 	bool "SAMA5D2 Xplained board"
 	select CPU_V7
@@ -138,6 +143,7 @@
 source "board/atmel/at91sam9n12ek/Kconfig"
 source "board/atmel/at91sam9rlek/Kconfig"
 source "board/atmel/at91sam9x5ek/Kconfig"
+source "board/atmel/sama5d2_ptc/Kconfig"
 source "board/atmel/sama5d2_xplained/Kconfig"
 source "board/atmel/sama5d3_xplained/Kconfig"
 source "board/atmel/sama5d3xek/Kconfig"
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index 4424523..d2abf31 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -9,7 +9,7 @@
 obj-$(CONFIG_AT91SAM9M10G45) += mpddrc.o spl_at91.o
 obj-$(CONFIG_AT91SAM9N12) += mpddrc.o spl_at91.o
 obj-$(CONFIG_AT91SAM9X5) += mpddrc.o spl_at91.o
-obj-$(CONFIG_SAMA5D2) += mpddrc.o spl_atmel.o matrix.o atmel_sfr.o
+obj-$(CONFIG_SAMA5D2) += bootparams_atmel.o mpddrc.o spl_atmel.o matrix.o atmel_sfr.o
 obj-$(CONFIG_SAMA5D3) += mpddrc.o spl_atmel.o
 obj-$(CONFIG_SAMA5D4) += mpddrc.o spl_atmel.o matrix.o atmel_sfr.o
 obj-y += spl.o
diff --git a/arch/arm/mach-at91/armv7/clock.c b/arch/arm/mach-at91/armv7/clock.c
index 81e9f69..76fcada 100644
--- a/arch/arm/mach-at91/armv7/clock.c
+++ b/arch/arm/mach-at91/armv7/clock.c
@@ -162,6 +162,11 @@
 	if (div > 0xff)
 		return -EINVAL;
 
+	if (clk_source == GCK_CSS_UPLL_CLK) {
+		if (at91_upll_clk_enable())
+			return -ENODEV;
+	}
+
 	writel(id, &pmc->pcr);
 	regval = readl(&pmc->pcr);
 	regval &= ~AT91_PMC_PCR_GCKCSS;
@@ -231,6 +236,12 @@
 	case AT91_PMC_PCR_GCKCSS_PLLA_CLK:
 		freq = gd->arch.plla_rate_hz;
 		break;
+	case AT91_PMC_PCR_GCKCSS_UPLL_CLK:
+		freq = AT91_UTMI_PLL_CLK_FREQ;
+		break;
+	case AT91_PMC_PCR_GCKCSS_MCK_CLK:
+		freq = gd->arch.mck_rate_hz;
+		break;
 	default:
 		printf("Improper GCK clock source selection!\n");
 		freq = 0;
diff --git a/arch/arm/mach-at91/bootparams_atmel.S b/arch/arm/mach-at91/bootparams_atmel.S
new file mode 100644
index 0000000..568094b
--- /dev/null
+++ b/arch/arm/mach-at91/bootparams_atmel.S
@@ -0,0 +1,18 @@
+/*
+ * Atmel SAMA5Dx boot parameter handling
+ *
+ * Copyright (c) 2016 Marek Vasut <marex@denx.de>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <asm-offsets.h>
+#include <config.h>
+#include <asm/system.h>
+#include <linux/linkage.h>
+
+ENTRY(save_boot_params)
+	ldr	r0, =bootrom_stash
+	str	r4, [r0, #0]
+	b	save_boot_params_ret
+ENDPROC(save_boot_params)
diff --git a/arch/arm/mach-at91/include/mach/clk.h b/arch/arm/mach-at91/include/mach/clk.h
index 8577c74..ca7d7d0 100644
--- a/arch/arm/mach-at91/include/mach/clk.h
+++ b/arch/arm/mach-at91/include/mach/clk.h
@@ -20,6 +20,8 @@
 #define GCK_CSS_MCK_CLK		4
 #define GCK_CSS_AUDIO_CLK	5
 
+#define AT91_UTMI_PLL_CLK_FREQ	480000000
+
 static inline unsigned long get_cpu_clk_rate(void)
 {
 	DECLARE_GLOBAL_DATA_PTR;
diff --git a/arch/arm/mach-at91/include/mach/sama5_sfr.h b/arch/arm/mach-at91/include/mach/sama5_sfr.h
index b040256..b805a2c 100644
--- a/arch/arm/mach-at91/include/mach/sama5_sfr.h
+++ b/arch/arm/mach-at91/include/mach/sama5_sfr.h
@@ -32,6 +32,30 @@
 #define ATMEL_SFR_DDRCFG_FDQIEN		0x00010000
 #define ATMEL_SFR_DDRCFG_FDQSIEN	0x00020000
 
+/* Bit field in EBICFG */
+#define AT91_SFR_EBICFG_DRIVE0		(0x3 << 0)
+#define AT91_SFR_EBICFG_DRIVE0_LOW		(0x0 << 0)
+#define AT91_SFR_EBICFG_DRIVE0_MEDIUM		(0x2 << 0)
+#define AT91_SFR_EBICFG_DRIVE0_HIGH		(0x3 << 0)
+#define AT91_SFR_EBICFG_PULL0		(0x3 << 2)
+#define AT91_SFR_EBICFG_PULL0_UP		(0x0 << 2)
+#define AT91_SFR_EBICFG_PULL0_NONE		(0x1 << 2)
+#define AT91_SFR_EBICFG_PULL0_DOWN		(0x3 << 2)
+#define AT91_SFR_EBICFG_SCH0		(0x1 << 4)
+#define AT91_SFR_EBICFG_SCH0_OFF		(0x0 << 4)
+#define AT91_SFR_EBICFG_SCH0_ON			(0x1 << 4)
+#define AT91_SFR_EBICFG_DRIVE1		(0x3 << 8)
+#define AT91_SFR_EBICFG_DRIVE1_LOW		(0x0 << 8)
+#define AT91_SFR_EBICFG_DRIVE1_MEDIUM		(0x2 << 8)
+#define AT91_SFR_EBICFG_DRIVE1_HIGH		(0x3 << 8)
+#define AT91_SFR_EBICFG_PULL1		(0x3 << 10)
+#define AT91_SFR_EBICFG_PULL1_UP		(0x0 << 10)
+#define AT91_SFR_EBICFG_PULL1_NONE		(0x1 << 10)
+#define AT91_SFR_EBICFG_PULL1_DOWN		(0x3 << 10)
+#define AT91_SFR_EBICFG_SCH1		(0x1 << 12)
+#define AT91_SFR_EBICFG_SCH1_OFF		(0x0 << 12)
+#define AT91_SFR_EBICFG_SCH1_ON			(0x1 << 12)
+
 /* Bit field in AICREDIR */
 #define ATMEL_SFR_AICREDIR_NSAIC	0x00000001
 
diff --git a/arch/arm/mach-at91/include/mach/sama5d2.h b/arch/arm/mach-at91/include/mach/sama5d2.h
index dd5a2a7..ee841da 100644
--- a/arch/arm/mach-at91/include/mach/sama5d2.h
+++ b/arch/arm/mach-at91/include/mach/sama5d2.h
@@ -135,7 +135,11 @@
 /*
  * Address Memory Space
  */
+#define ATMEL_BASE_CS0			0x10000000
 #define ATMEL_BASE_DDRCS		0x20000000
+#define ATMEL_BASE_CS1			0x60000000
+#define ATMEL_BASE_CS2			0x70000000
+#define ATMEL_BASE_CS3			0x80000000
 #define ATMEL_BASE_QSPI0_AES_MEM	0x90000000
 #define ATMEL_BASE_QSPI1_AES_MEM	0x98000000
 #define ATMEL_BASE_SDMMC0		0xa0000000
@@ -165,6 +169,7 @@
  */
 #define ATMEL_BASE_PMECC	(ATMEL_BASE_HSMC + 0x70)
 #define ATMEL_BASE_PMERRLOC	(ATMEL_BASE_HSMC + 0x500)
+#define ATMEL_BASE_SMC		(ATMEL_BASE_HSMC + 0x700)
 
 #define ATMEL_BASE_PIOB		(ATMEL_BASE_PIOA + 0x40)
 #define ATMEL_BASE_PIOC		(ATMEL_BASE_PIOB + 0x40)
@@ -225,6 +230,18 @@
 /* No PMECC Galois table in ROM */
 #define NO_GALOIS_TABLE_IN_ROM
 
+/* Boot modes stored by BootROM in r4 */
+#define ATMEL_SAMA5D2_BOOT_FROM_OFF	0
+#define ATMEL_SAMA5D2_BOOT_FROM_MASK	0xf
+#define ATMEL_SAMA5D2_BOOT_FROM_SPI	(0 << 0)
+#define ATMEL_SAMA5D2_BOOT_FROM_MCI	(1 << 0)
+#define ATMEL_SAMA5D2_BOOT_FROM_SMC	(2 << 0)
+#define ATMEL_SAMA5D2_BOOT_FROM_TWI	(3 << 0)
+#define ATMEL_SAMA5D2_BOOT_FROM_QSPI	(4 << 0)
+
+#define ATMEL_SAMA5D2_BOOT_DEV_ID_OFF	4
+#define ATMEL_SAMA5D2_BOOT_DEV_ID_MASK	0xf
+
 #ifndef __ASSEMBLY__
 unsigned int get_chip_id(void);
 unsigned int get_extension_chip_id(void);
diff --git a/arch/arm/mach-at91/spl.c b/arch/arm/mach-at91/spl.c
index 27a405a..c4ed224 100644
--- a/arch/arm/mach-at91/spl.c
+++ b/arch/arm/mach-at91/spl.c
@@ -23,6 +23,40 @@
 }
 #endif
 
+#if defined(CONFIG_SAMA5D2)
+struct {
+	u32	r4;
+} bootrom_stash __attribute__((section(".data")));
+
+u32 spl_boot_device(void)
+{
+	u32 dev = (bootrom_stash.r4 >> ATMEL_SAMA5D2_BOOT_FROM_OFF) &
+		  ATMEL_SAMA5D2_BOOT_FROM_MASK;
+	u32 off = (bootrom_stash.r4 >> ATMEL_SAMA5D2_BOOT_DEV_ID_OFF) &
+		  ATMEL_SAMA5D2_BOOT_DEV_ID_MASK;
+
+#if defined(CONFIG_SYS_USE_MMC)
+	if (dev == ATMEL_SAMA5D2_BOOT_FROM_MCI) {
+		if (off == 0)
+			return BOOT_DEVICE_MMC1;
+		if (off == 1)
+			return BOOT_DEVICE_MMC2;
+		printf("ERROR: MMC controller %i not present!\n", dev);
+		hang();
+	}
+#endif
+
+#if defined(CONFIG_SYS_USE_SERIALFLASH) || defined(CONFIG_SYS_USE_SPIFLASH)
+	if (dev == ATMEL_SAMA5D2_BOOT_FROM_SPI)
+		return BOOT_DEVICE_SPI;
+#endif
+
+	printf("ERROR: SMC/TWI/QSPI boot device not supported!\n"
+	       "       Boot device %i, controller number %i\n", dev, off);
+
+	return BOOT_DEVICE_NONE;
+}
+#else
 u32 spl_boot_device(void)
 {
 #ifdef CONFIG_SYS_USE_MMC
@@ -34,12 +68,14 @@
 #endif
 	return BOOT_DEVICE_NONE;
 }
+#endif
 
 u32 spl_boot_mode(void)
 {
 	switch (spl_boot_device()) {
 #ifdef CONFIG_SYS_USE_MMC
 	case BOOT_DEVICE_MMC1:
+	case BOOT_DEVICE_MMC2:
 		return MMCSD_MODE_FS;
 		break;
 #endif
diff --git a/arch/arm/mach-zynq/Kconfig b/arch/arm/mach-zynq/Kconfig
index d396a13..db3c579 100644
--- a/arch/arm/mach-zynq/Kconfig
+++ b/arch/arm/mach-zynq/Kconfig
@@ -1,41 +1,5 @@
 if ARCH_ZYNQ
 
-config ZYNQ_CUSTOM_INIT
-	bool "Use custom ps7_init provided by Xilinx tool"
-	help
-	  U-Boot includes ps7_init_gpl.[ch] for some Zynq board variants.
-	  If you want to override them with customized ones
-	  or ps7_init code for your board is missing, please say Y here
-	  and add ones into board/xilinx/zynq/custom_hw_platform/ directory.
-
-choice
-	prompt "Xilinx Zynq board select"
-	default TARGET_ZYNQ_ZC702
-
-config TARGET_ZYNQ_ZED
-	bool "Zynq ZedBoard"
-
-config TARGET_ZYNQ_MICROZED
-	bool "Zynq MicroZed"
-
-config TARGET_ZYNQ_PICOZED
-	bool "Zynq PicoZed"
-
-config TARGET_ZYNQ_ZC702
-	bool "Zynq ZC702 Board"
-
-config TARGET_ZYNQ_ZC706
-	bool "Zynq ZC706 Board"
-
-config TARGET_ZYNQ_ZC770
-	bool "Zynq ZC770 Board"
-	select ZYNQ_CUSTOM_INIT
-
-config TARGET_ZYNQ_ZYBO
-	bool "Zynq Zybo Board"
-
-endchoice
-
 config SYS_BOARD
 	default "zynq"
 
@@ -46,11 +10,11 @@
 	default "zynq"
 
 config SYS_CONFIG_NAME
-	default "zynq_zed" if TARGET_ZYNQ_ZED
-	default "zynq_microzed" if TARGET_ZYNQ_MICROZED
-	default "zynq_picozed" if TARGET_ZYNQ_PICOZED
-	default "zynq_zc70x" if TARGET_ZYNQ_ZC702 || TARGET_ZYNQ_ZC706
-	default "zynq_zc770" if TARGET_ZYNQ_ZC770
-	default "zynq_zybo" if TARGET_ZYNQ_ZYBO
+	string "Board configuration name"
+	default "zynq-common"
+	help
+	  This option contains information about board configuration name.
+	  Based on this option include/configs/<CONFIG_SYS_CONFIG_NAME>.h header
+	  will be used for board configuration.
 
 endif
diff --git a/arch/arm/mach-zynq/spl.c b/arch/arm/mach-zynq/spl.c
index 723019d..6c5415a 100644
--- a/arch/arm/mach-zynq/spl.c
+++ b/arch/arm/mach-zynq/spl.c
@@ -90,3 +90,28 @@
 	 * board/xilinx/zynq/(platform)/ps7_init_gpl.c, if it exists.
 	 */
 }
+
+__weak int ps7_post_config(void)
+{
+	/*
+	 * This function is overridden by the one in
+	 * board/xilinx/zynq/(platform)/ps7_init_gpl.c, if it exists.
+	 */
+	return 0;
+}
+
+void spl_board_prepare_for_boot(void)
+{
+	ps7_post_config();
+	debug("SPL bye\n");
+}
+
+#ifdef CONFIG_SPL_LOAD_FIT
+int board_fit_config_name_match(const char *name)
+{
+	/* Just empty function now - can't decide what to choose */
+	debug("%s: %s\n", __func__, name);
+
+	return 0;
+}
+#endif
diff --git a/arch/m68k/cpu/mcf5227x/start.S b/arch/m68k/cpu/mcf5227x/start.S
index 23024f9..13c036f 100644
--- a/arch/m68k/cpu/mcf5227x/start.S
+++ b/arch/m68k/cpu/mcf5227x/start.S
@@ -372,14 +372,29 @@
 	move.l %d0, (%a1)
 	move.l %d0, (%a2)
 
-	/* set stackpointer to end of internal ram to get some stackspace for
-	   the first c-code */
-	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
-	clr.l %sp@-
+	/* put relocation table address to a5 */
+	move.l #__got_start, %a5
 
-	move.l #__got_start, %a5	/* put relocation table address to a5 */
+	/* setup stack initially on top of internal static ram  */
+	move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE), %sp
+
+	/*
+	 * if configured, malloc_f arena will be reserved first,
+	 * then (and always) gd struct space will be reserved
+	 */
+	move.l	%sp, -(%sp)
+	bsr	board_init_f_alloc_reserve
+
+	/* update stack and frame-pointers */
+	move.l  %d0, %sp
+	move.l  %sp, %fp
+
+	/* initialize reserved area */
+	move.l  %d0, -(%sp)
+	bsr     board_init_f_init_reserve
 
 	bsr cpu_init_f			/* run low-level CPU init code (from flash) */
+	clr.l   %sp@-
 	bsr board_init_f		/* run low-level board init code (from flash) */
 
 	/* board_init_f() does not return */
diff --git a/arch/m68k/cpu/mcf523x/start.S b/arch/m68k/cpu/mcf523x/start.S
index 1702f98..3aa4dd6 100644
--- a/arch/m68k/cpu/mcf523x/start.S
+++ b/arch/m68k/cpu/mcf523x/start.S
@@ -134,17 +134,34 @@
 	move.l %d0, (%a1)
 	move.l %d0, (%a2)
 
-	/* set stackpointer to end of internal ram to get some stackspace for the
-	   first c-code */
-	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
-	clr.l %sp@-
+	/* put relocation table address to a5 */
+	move.l #__got_start, %a5
 
-	move.l #__got_start, %a5	/* put relocation table address to a5 */
+	/* setup stack initially on top of internal static ram  */
+	move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE), %sp
+
+	/*
+	 * if configured, malloc_f arena will be reserved first,
+	 * then (and always) gd struct space will be reserved
+	 */
+	move.l	%sp, -(%sp)
+	move.l	#board_init_f_alloc_reserve, %a1
+	jsr	(%a1)
+
+	/* update stack and frame-pointers */
+	move.l  %d0, %sp
+	move.l  %sp, %fp
+
+	/* initialize reserved area */
+	move.l  %d0, -(%sp)
+	move.l	#board_init_f_init_reserve, %a1
+	jsr	(%a1)
 
 	/* run low-level CPU init code (from flash) */
 	move.l #cpu_init_f, %a1
 	jsr (%a1)
 	/* run low-level board init code (from flash) */
+	clr.l   %sp@-
 	move.l #board_init_f, %a1
 	jsr (%a1)
 
diff --git a/arch/m68k/cpu/mcf52x2/start.S b/arch/m68k/cpu/mcf52x2/start.S
index 4af691f..a048884 100644
--- a/arch/m68k/cpu/mcf52x2/start.S
+++ b/arch/m68k/cpu/mcf52x2/start.S
@@ -192,16 +192,34 @@
 	move.l %d0, (%a1)
 	move.l %d0, (%a2)
 
-	/* set stackpointer to end of internal ram to get some stackspace for the first c-code */
-	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
-	clr.l %sp@-
+	/* put relocation table address to a5 */
+	move.l #__got_start, %a5
 
-	move.l #__got_start, %a5		/* put relocation table address to a5 */
+	/* setup stack initially on top of internal static ram  */
+	move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE), %sp
+
+	/*
+	 * if configured, malloc_f arena will be reserved first,
+	 * then (and always) gd struct space will be reserved
+	 */
+	move.l	%sp, -(%sp)
+	move.l	#board_init_f_alloc_reserve, %a1
+	jsr (%a1)
+
+	/* update stack and frame-pointers */
+	move.l  %d0, %sp
+	move.l  %sp, %fp
+
+	/* initialize reserved area */
+	move.l  %d0, -(%sp)
+	move.l	#board_init_f_init_reserve, %a1
+	jsr (%a1)
 
 	/* run low-level CPU init code (from flash) */
 	move.l #cpu_init_f, %a1
 	jsr (%a1)
 	/* run low-level board init code (from flash) */
+	clr.l   %sp@-
 	move.l #board_init_f, %a1
 	jsr (%a1)
 
diff --git a/arch/m68k/cpu/mcf530x/cpu_init.c b/arch/m68k/cpu/mcf530x/cpu_init.c
index 80dc239..b09eed8 100644
--- a/arch/m68k/cpu/mcf530x/cpu_init.c
+++ b/arch/m68k/cpu/mcf530x/cpu_init.c
@@ -142,7 +142,7 @@
 	return 0;
 }
 
-void uart_port_conf(void)
+void uart_port_conf(int port)
 {
 }
 
diff --git a/arch/m68k/cpu/mcf530x/start.S b/arch/m68k/cpu/mcf530x/start.S
index 097958a..ca8bb32 100644
--- a/arch/m68k/cpu/mcf530x/start.S
+++ b/arch/m68k/cpu/mcf530x/start.S
@@ -126,21 +126,32 @@
 	move.l	%d0, (%a1)
 	move.l	%d0, (%a2)
 
-	/*
-	 * set stackpointer to internal sram end - 80
-	 * (global data struct size + some bytes)
-	 * get some stackspace for the first c-code,
-	 */
-	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
-	clr.l   %sp@-
-
 	/* put relocation table address to a5 */
 	move.l #__got_start, %a5
 
+	/* setup stack initially on top of internal static ram  */
+	move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE), %sp
+
+	/*
+	 * if configured, malloc_f arena will be reserved first,
+	 * then (and always) gd struct space will be reserved
+	 */
+	move.l	%sp, -(%sp)
+	bsr	board_init_f_alloc_reserve
+
+	/* update stack and frame-pointers */
+	move.l  %d0, %sp
+	move.l  %sp, %fp
+
+	/* initialize reserved area */
+	move.l  %d0, -(%sp)
+	bsr     board_init_f_init_reserve
+
 	/* run low-level CPU init code (from flash) */
 	bsr cpu_init_f
 
 	/* run low-level board init code (from flash) */
+	clr.l   %sp@-
 	bsr board_init_f
 
 	/* board_init_f() does not return */
diff --git a/arch/m68k/cpu/mcf532x/start.S b/arch/m68k/cpu/mcf532x/start.S
index 131ad6e..f25bc54 100644
--- a/arch/m68k/cpu/mcf532x/start.S
+++ b/arch/m68k/cpu/mcf532x/start.S
@@ -148,17 +148,34 @@
 	move.l %d0, (%a1)
 	move.l %d0, (%a2)
 
-	/* set stackpointer to end of internal ram to get some stackspace for the
-	   first c-code */
-	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
-	clr.l %sp@-
+	/* put relocation table address to a5 */
+	move.l #__got_start, %a5
 
-	move.l #__got_start, %a5	/* put relocation table address to a5 */
+	/* setup stack initially on top of internal static ram  */
+	move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE), %sp
+
+	/*
+	 * if configured, malloc_f arena will be reserved first,
+	 * then (and always) gd struct space will be reserved
+	 */
+	move.l	%sp, -(%sp)
+	move.l	#board_init_f_alloc_reserve, %a1
+	jsr	(%a1)
+
+	/* update stack and frame-pointers */
+	move.l  %d0, %sp
+	move.l  %sp, %fp
+
+	/* initialize reserved area */
+	move.l  %d0, -(%sp)
+	move.l	#board_init_f_init_reserve, %a1
+	jsr	(%a1)
 
 	/* run low-level CPU init code (from flash) */
 	move.l #cpu_init_f, %a1
 	jsr (%a1)
 	/* run low-level board init code (from flash) */
+	clr.l   %sp@-
 	move.l #board_init_f, %a1
 	jsr (%a1)
 
diff --git a/arch/m68k/cpu/mcf5445x/start.S b/arch/m68k/cpu/mcf5445x/start.S
index f50f147..ba38678 100644
--- a/arch/m68k/cpu/mcf5445x/start.S
+++ b/arch/m68k/cpu/mcf5445x/start.S
@@ -657,17 +657,34 @@
 	movec	%d0, %RAMBAR1
 #endif
 
-	/* set stackpointer to end of internal ram to get some stackspace for
-	   the first c-code */
-	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
-	clr.l %sp@-
+	/* put relocation table address to a5 */
+	move.l #__got_start, %a5
 
-	move.l #__got_start, %a5	/* put relocation table address to a5 */
+	/* setup stack initially on top of internal static ram  */
+	move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE), %sp
+
+	/*
+	 * if configured, malloc_f arena will be reserved first,
+	 * then (and always) gd struct space will be reserved
+	 */
+	move.l	%sp, -(%sp)
+	move.l	#board_init_f_alloc_reserve, %a1
+	jsr	(%a1)
+
+	/* update stack and frame-pointers */
+	move.l  %d0, %sp
+	move.l  %sp, %fp
+
+	/* initialize reserved area */
+	move.l  %d0, -(%sp)
+	move.l	#board_init_f_init_reserve, %a1
+	jsr	(%a1)
 
 	/* run low-level CPU init code (from flash) */
 	move.l #cpu_init_f, %a1
 	jsr (%a1)
 	/* run low-level board init code (from flash) */
+	clr.l   %sp@-
 	move.l #board_init_f, %a1
 	jsr (%a1)
 
diff --git a/arch/m68k/cpu/mcf547x_8x/start.S b/arch/m68k/cpu/mcf547x_8x/start.S
index 75de22d..9a87a0d 100644
--- a/arch/m68k/cpu/mcf547x_8x/start.S
+++ b/arch/m68k/cpu/mcf547x_8x/start.S
@@ -141,14 +141,29 @@
 	move.l %d0, (%a1)
 	move.l %d0, (%a2)
 
-	/* set stackpointer to end of internal ram to get some stackspace for the
-	   first c-code */
-	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
-	clr.l %sp@-
+	/* put relocation table address to a5 */
+	move.l #__got_start, %a5
 
-	move.l #__got_start, %a5	/* put relocation table address to a5 */
+	/* setup stack initially on top of internal static ram  */
+	move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE), %sp
+
+	/*
+	 * if configured, malloc_f arena will be reserved first,
+	 * then (and always) gd struct space will be reserved
+	 */
+	move.l	%sp, -(%sp)
+	bsr	board_init_f_alloc_reserve
+
+	/* update stack and frame-pointers */
+	move.l  %d0, %sp
+	move.l  %sp, %fp
+
+	/* initialize reserved area */
+	move.l  %d0, -(%sp)
+	bsr     board_init_f_init_reserve
 
 	jbsr cpu_init_f			/* run low-level CPU init code (from flash) */
+	clr.l   %sp@-
 	jbsr board_init_f		/* run low-level board init code (from flash) */
 
 	/* board_init_f() does not return */
diff --git a/arch/m68k/include/asm/config.h b/arch/m68k/include/asm/config.h
index e1458ac..9c4d3fb 100644
--- a/arch/m68k/include/asm/config.h
+++ b/arch/m68k/include/asm/config.h
@@ -7,8 +7,6 @@
 #ifndef _ASM_CONFIG_H_
 #define _ASM_CONFIG_H_
 
-#define CONFIG_SYS_GENERIC_GLOBAL_DATA
-
 #define CONFIG_NEEDS_MANUAL_RELOC
 
 #define CONFIG_LMB
diff --git a/arch/m68k/include/asm/fsl_i2c.h b/arch/m68k/include/asm/fsl_i2c.h
index 1b1c25e..c7d2aa3 100644
--- a/arch/m68k/include/asm/fsl_i2c.h
+++ b/arch/m68k/include/asm/fsl_i2c.h
@@ -16,7 +16,7 @@
 
 #include <asm/types.h>
 
-typedef struct fsl_i2c {
+typedef struct fsl_i2c_base {
 
 	u8 adr;		/* I2C slave address */
 	u8 res0[3];
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index fe37d1f..dc34c18 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -5,8 +5,8 @@
 	default "mips"
 
 config SYS_CPU
-	default "mips32" if CPU_MIPS32_R1 || CPU_MIPS32_R2
-	default "mips64" if CPU_MIPS64_R1 || CPU_MIPS64_R2
+	default "mips32" if CPU_MIPS32
+	default "mips64" if CPU_MIPS64
 
 choice
 	prompt "Target select"
@@ -28,6 +28,7 @@
 	select SUPPORTS_LITTLE_ENDIAN
 	select SUPPORTS_CPU_MIPS32_R1
 	select SUPPORTS_CPU_MIPS32_R2
+	select SUPPORTS_CPU_MIPS32_R6
 	select SWAP_IO_SPACE
 	select MIPS_L1_CACHE_SHIFT_6
 
@@ -55,6 +56,11 @@
 	select SYS_MIPS_CACHE_INIT_RAM_LOAD
 	select MIPS_TUNE_4KC
 
+config ARCH_ATH79
+	bool "Support QCA/Atheros ath79"
+	select OF_CONTROL
+	select DM
+
 config MACH_PIC32
 	bool "Support Microchip PIC32"
 	select OF_CONTROL
@@ -67,6 +73,7 @@
 source "board/micronas/vct/Kconfig"
 source "board/pb1x00/Kconfig"
 source "board/qemu-mips/Kconfig"
+source "arch/mips/mach-ath79/Kconfig"
 source "arch/mips/mach-pic32/Kconfig"
 
 if MIPS
@@ -98,7 +105,7 @@
 	depends on SUPPORTS_CPU_MIPS32_R1
 	select 32BIT
 	help
-	  Choose this option to build an U-Boot for release 1 or later of the
+	  Choose this option to build an U-Boot for release 1 through 5 of the
 	  MIPS32 architecture.
 
 config CPU_MIPS32_R2
@@ -106,7 +113,15 @@
 	depends on SUPPORTS_CPU_MIPS32_R2
 	select 32BIT
 	help
-	  Choose this option to build an U-Boot for release 2 or later of the
+	  Choose this option to build an U-Boot for release 2 through 5 of the
+	  MIPS32 architecture.
+
+config CPU_MIPS32_R6
+	bool "MIPS32 Release 6"
+	depends on SUPPORTS_CPU_MIPS32_R6
+	select 32BIT
+	help
+	  Choose this option to build an U-Boot for release 6 or later of the
 	  MIPS32 architecture.
 
 config CPU_MIPS64_R1
@@ -114,7 +129,7 @@
 	depends on SUPPORTS_CPU_MIPS64_R1
 	select 64BIT
 	help
-	  Choose this option to build a kernel for release 1 or later of the
+	  Choose this option to build a kernel for release 1 through 5 of the
 	  MIPS64 architecture.
 
 config CPU_MIPS64_R2
@@ -122,7 +137,15 @@
 	depends on SUPPORTS_CPU_MIPS64_R2
 	select 64BIT
 	help
-	  Choose this option to build a kernel for release 2 or later of the
+	  Choose this option to build a kernel for release 2 through 5 of the
+	  MIPS64 architecture.
+
+config CPU_MIPS64_R6
+	bool "MIPS64 Release 6"
+	depends on SUPPORTS_CPU_MIPS64_R6
+	select 64BIT
+	help
+	  Choose this option to build a kernel for release 6 or later of the
 	  MIPS64 architecture.
 
 endchoice
@@ -169,19 +192,25 @@
 config SUPPORTS_CPU_MIPS32_R2
 	bool
 
+config SUPPORTS_CPU_MIPS32_R6
+	bool
+
 config SUPPORTS_CPU_MIPS64_R1
 	bool
 
 config SUPPORTS_CPU_MIPS64_R2
 	bool
 
+config SUPPORTS_CPU_MIPS64_R6
+	bool
+
 config CPU_MIPS32
 	bool
-	default y if CPU_MIPS32_R1 || CPU_MIPS32_R2
+	default y if CPU_MIPS32_R1 || CPU_MIPS32_R2 || CPU_MIPS32_R6
 
 config CPU_MIPS64
 	bool
-	default y if CPU_MIPS64_R1 || CPU_MIPS64_R2
+	default y if CPU_MIPS64_R1 || CPU_MIPS64_R2 || CPU_MIPS64_R6
 
 config MIPS_TUNE_4KC
 	bool
@@ -192,6 +221,9 @@
 config MIPS_TUNE_24KC
 	bool
 
+config MIPS_TUNE_74KC
+	bool
+
 config 32BIT
 	bool
 
diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index aec5a15..655a493 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -8,6 +8,7 @@
 libs-y += arch/mips/lib/
 
 machine-$(CONFIG_SOC_AU1X00) += au1x00
+machine-$(CONFIG_ARCH_ATH79) += ath79
 machine-$(CONFIG_MACH_PIC32) += pic32
 
 machdirs := $(patsubst %,arch/mips/mach-%/,$(machine-y))
@@ -18,13 +19,16 @@
 # Optimize for MIPS architectures
 arch-$(CONFIG_CPU_MIPS32_R1) += -march=mips32 -Wa,-mips32
 arch-$(CONFIG_CPU_MIPS32_R2) += -march=mips32r2 -Wa,-mips32r2
+arch-$(CONFIG_CPU_MIPS32_R6) += -march=mips32r6 -Wa,-mips32r6
 arch-$(CONFIG_CPU_MIPS64_R1) += -march=mips64 -Wa,-mips64
 arch-$(CONFIG_CPU_MIPS64_R2) += -march=mips64r2 -Wa,-mips64r2
+arch-$(CONFIG_CPU_MIPS64_R6) += -march=mips64r6 -Wa,-mips64r6
 
 # Allow extra optimization for specific CPUs/SoCs
 tune-$(CONFIG_MIPS_TUNE_4KC) += -mtune=4kc
 tune-$(CONFIG_MIPS_TUNE_14KC) += -mtune=14kc
 tune-$(CONFIG_MIPS_TUNE_24KC) += -mtune=24kc
+tune-$(CONFIG_MIPS_TUNE_74KC) += -mtune=74kc
 
 # Include default header files
 cflags-y += -I$(srctree)/arch/mips/include/asm/mach-generic
diff --git a/arch/mips/cpu/cpu.c b/arch/mips/cpu/cpu.c
index 8d3b2f5..391feb3 100644
--- a/arch/mips/cpu/cpu.c
+++ b/arch/mips/cpu/cpu.c
@@ -7,7 +7,6 @@
 
 #include <common.h>
 #include <command.h>
-#include <netdev.h>
 #include <linux/compiler.h>
 #include <asm/mipsregs.h>
 #include <asm/reboot.h>
diff --git a/arch/mips/cpu/start.S b/arch/mips/cpu/start.S
index 1b56ca3..fc6dd66 100644
--- a/arch/mips/cpu/start.S
+++ b/arch/mips/cpu/start.S
@@ -164,12 +164,14 @@
 	li	t0, -16
 	PTR_LI	t1, CONFIG_SYS_INIT_SP_ADDR
 	and	sp, t1, t0		# force 16 byte alignment
-	PTR_SUB	sp, sp, GD_SIZE		# reserve space for gd
+	PTR_SUBU \
+		sp, sp, GD_SIZE		# reserve space for gd
 	and	sp, sp, t0		# force 16 byte alignment
 	move	k0, sp			# save gd pointer
 #ifdef CONFIG_SYS_MALLOC_F_LEN
 	li	t2, CONFIG_SYS_MALLOC_F_LEN
-	PTR_SUB	sp, sp, t2		# reserve space for early malloc
+	PTR_SUBU \
+		sp, sp, t2		# reserve space for early malloc
 	and	sp, sp, t0		# force 16 byte alignment
 #endif
 	move	fp, sp
@@ -179,7 +181,7 @@
 1:
 	PTR_S	zero, 0(t0)
 	blt	t0, t1, 1b
-	 PTR_ADDI t0, PTRSIZE
+	 PTR_ADDIU t0, PTRSIZE
 
 #ifdef CONFIG_SYS_MALLOC_F_LEN
 	PTR_S	sp, GD_MALLOC_BASE(k0)	# gd->malloc_base offset
@@ -237,7 +239,7 @@
 	 move	a0, s2			# a0 <-- destination address
 
 	/* Jump to where we've relocated ourselves */
-	PTR_ADDI t0, s2, in_ram - _start
+	PTR_ADDIU t0, s2, in_ram - _start
 	jr	t0
 	 nop
 
@@ -257,7 +259,7 @@
 	PTR_L	t3, -(1 * PTRSIZE)(t0)	# t3 <-- num_got_entries
 	PTR_L	t8, -(2 * PTRSIZE)(t0)	# t8 <-- _GLOBAL_OFFSET_TABLE_
 	PTR_ADD	t8, s1			# t8 now holds relocated _G_O_T_
-	PTR_ADDI t8, t8, 2 * PTRSIZE	# skipping first two entries
+	PTR_ADDIU t8, t8, 2 * PTRSIZE	# skipping first two entries
 	PTR_LI	t2, 2
 1:
 	PTR_L	t1, 0(t8)
@@ -265,16 +267,16 @@
 	 PTR_ADD t1, s1
 	PTR_S	t1, 0(t8)
 2:
-	PTR_ADDI t2, 1
+	PTR_ADDIU t2, 1
 	blt	t2, t3, 1b
-	 PTR_ADDI t8, PTRSIZE
+	 PTR_ADDIU t8, PTRSIZE
 
 	/* Update dynamic relocations */
 	PTR_L	t1, -(4 * PTRSIZE)(t0)	# t1 <-- __rel_dyn_start
 	PTR_L	t2, -(5 * PTRSIZE)(t0)	# t2 <-- __rel_dyn_end
 
 	b	2f			# skip first reserved entry
-	 PTR_ADDI t1, 2 * PTRSIZE
+	 PTR_ADDIU t1, 2 * PTRSIZE
 
 1:
 	lw	t8, -4(t1)		# t8 <-- relocation info
@@ -293,7 +295,7 @@
 
 2:
 	blt	t1, t2, 1b
-	 PTR_ADDI t1, 2 * PTRSIZE	# each rel.dyn entry is 2*PTRSIZE bytes
+	 PTR_ADDIU t1, 2 * PTRSIZE	# each rel.dyn entry is 2*PTRSIZE bytes
 
 	/*
 	 * Clear BSS
@@ -307,7 +309,7 @@
 1:
 	PTR_S	zero, 0(t1)
 	blt	t1, t2, 1b
-	 PTR_ADDI t1, PTRSIZE
+	 PTR_ADDIU t1, PTRSIZE
 
 	move	a0, s0			# a0 <-- gd
 	move	a1, s2
diff --git a/arch/mips/dts/Makefile b/arch/mips/dts/Makefile
index b513918..a94b745 100644
--- a/arch/mips/dts/Makefile
+++ b/arch/mips/dts/Makefile
@@ -2,7 +2,10 @@
 # SPDX-License-Identifier:	GPL-2.0+
 #
 
+dtb-$(CONFIG_TARGET_AP121) += ap121.dtb
+dtb-$(CONFIG_TARGET_AP143) += ap143.dtb
 dtb-$(CONFIG_TARGET_PIC32MZDASK) += pic32mzda_sk.dtb
+dtb-$(CONFIG_BOARD_TPLINK_WDR4300) += tplink_wdr4300.dtb
 
 targets += $(dtb-y)
 
diff --git a/arch/mips/dts/ap121.dts b/arch/mips/dts/ap121.dts
new file mode 100644
index 0000000..e31f601
--- /dev/null
+++ b/arch/mips/dts/ap121.dts
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/dts-v1/;
+#include "ar933x.dtsi"
+
+/ {
+	model = "AP121 Reference Board";
+	compatible = "qca,ap121", "qca,ar933x";
+
+	aliases {
+		spi0 = &spi0;
+		serial0 = &uart0;
+	};
+
+	chosen {
+		stdout-path = "serial0:115200n8";
+	};
+};
+
+&xtal {
+	clock-frequency = <25000000>;
+};
+
+&uart0 {
+	status = "okay";
+};
+
+&spi0 {
+	spi-max-frequency = <25000000>;
+	status = "okay";
+	spi-flash@0 {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		compatible = "spi-flash";
+		memory-map = <0x9f000000 0x00800000>;
+		spi-max-frequency = <25000000>;
+		reg = <0>;
+	};
+};
diff --git a/arch/mips/dts/ap143.dts b/arch/mips/dts/ap143.dts
new file mode 100644
index 0000000..f53207e
--- /dev/null
+++ b/arch/mips/dts/ap143.dts
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/dts-v1/;
+#include "qca953x.dtsi"
+
+/ {
+	model = "AP143 Reference Board";
+	compatible = "qca,ap143", "qca,qca953x";
+
+	aliases {
+		spi0 = &spi0;
+		serial0 = &uart0;
+	};
+
+	chosen {
+		stdout-path = "serial0:115200n8";
+	};
+};
+
+&xtal {
+	clock-frequency = <25000000>;
+};
+
+&uart0 {
+	status = "okay";
+};
+
+&spi0 {
+	spi-max-frequency = <25000000>;
+	status = "okay";
+	spi-flash@0 {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		compatible = "spi-flash";
+		memory-map = <0x9f000000 0x00800000>;
+		spi-max-frequency = <25000000>;
+		reg = <0>;
+	};
+};
diff --git a/arch/mips/dts/ar933x.dtsi b/arch/mips/dts/ar933x.dtsi
new file mode 100644
index 0000000..00896b2
--- /dev/null
+++ b/arch/mips/dts/ar933x.dtsi
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <dt-bindings/interrupt-controller/irq.h>
+#include "skeleton.dtsi"
+
+/ {
+	compatible = "qca,ar933x";
+
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	cpus {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		cpu@0 {
+			device_type = "cpu";
+			compatible = "mips,mips24Kc";
+			reg = <0>;
+		};
+	};
+
+	clocks {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		ranges;
+
+		xtal: xtal {
+			#clock-cells = <0>;
+			compatible = "fixed-clock";
+			clock-output-names = "xtal";
+		};
+	};
+
+	pinctrl {
+		u-boot,dm-pre-reloc;
+		compatible = "qca,ar933x-pinctrl";
+		ranges;
+		#address-cells = <1>;
+		#size-cells = <1>;
+		reg = <0x18040000 0x100>;
+	};
+
+	ahb {
+		compatible = "simple-bus";
+		ranges;
+
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		apb {
+			compatible = "simple-bus";
+			ranges;
+
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			ehci0: ehci@1b000100 {
+				compatible = "generic-ehci";
+				reg = <0x1b000100 0x100>;
+
+				status = "disabled";
+			};
+
+			uart0: uart@18020000 {
+				compatible = "qca,ar9330-uart";
+				reg = <0x18020000 0x20>;
+				interrupts = <128 IRQ_TYPE_LEVEL_HIGH>;
+
+				status = "disabled";
+			};
+
+			gmac0: eth@0x19000000 {
+				compatible = "qca,ag7240-mac";
+				reg = <0x19000000 0x200>;
+				phy = <&phy0>;
+				phy-mode = "rmii";
+
+				status = "disabled";
+
+				mdio {
+					#address-cells = <1>;
+					#size-cells = <0>;
+					phy0: ethernet-phy@0 {
+						reg = <0>;
+					};
+				};
+			};
+
+			gmac1: eth@0x1a000000 {
+				compatible = "qca,ag7240-mac";
+				reg = <0x1a000000 0x200>;
+				phy = <&phy0>;
+				phy-mode = "rgmii";
+
+				status = "disabled";
+			};
+		};
+
+		spi0: spi@1f000000 {
+			compatible = "qca,ar7100-spi";
+			reg = <0x1f000000 0x10>;
+			interrupts = <129 IRQ_TYPE_LEVEL_HIGH>;
+
+			status = "disabled";
+
+			#address-cells = <1>;
+			#size-cells = <0>;
+		};
+	};
+};
diff --git a/arch/mips/dts/ar934x.dtsi b/arch/mips/dts/ar934x.dtsi
new file mode 100644
index 0000000..7a036a8
--- /dev/null
+++ b/arch/mips/dts/ar934x.dtsi
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2016 Marek Vasut <marex@denx.de>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "skeleton.dtsi"
+
+/ {
+	compatible = "qca,ar934x";
+
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	cpus {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		cpu@0 {
+			device_type = "cpu";
+			compatible = "mips,mips74Kc";
+			reg = <0>;
+		};
+	};
+
+	clocks {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		ranges;
+
+		xtal: xtal {
+			#clock-cells = <0>;
+			compatible = "fixed-clock";
+			clock-output-names = "xtal";
+		};
+	};
+
+	ahb {
+		compatible = "simple-bus";
+		ranges;
+
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		apb {
+			compatible = "simple-bus";
+			ranges;
+
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			ehci0: ehci@1b000100 {
+				compatible = "generic-ehci";
+				reg = <0x1b000100 0x100>;
+
+				status = "disabled";
+			};
+
+			uart0: uart@18020000 {
+				compatible = "ns16550";
+				reg = <0x18020000 0x20>;
+				reg-shift = <2>;
+
+				status = "disabled";
+			};
+
+			gmac0: eth@0x19000000 {
+				compatible = "qca,ag934x-mac";
+				reg = <0x19000000 0x200>;
+				phy = <&phy0>;
+				phy-mode = "rgmii";
+
+				status = "disabled";
+
+				mdio {
+					#address-cells = <1>;
+					#size-cells = <0>;
+					phy0: ethernet-phy@0 {
+						reg = <0>;
+					};
+				};
+			};
+
+			gmac1: eth@0x1a000000 {
+				compatible = "qca,ag934x-mac";
+				reg = <0x1a000000 0x200>;
+				phy = <&phy1>;
+				phy-mode = "rgmii";
+
+				status = "disabled";
+
+				mdio {
+					#address-cells = <1>;
+					#size-cells = <0>;
+					phy1: ethernet-phy@0 {
+						reg = <0>;
+					};
+				};
+			};
+		};
+
+		spi0: spi@1f000000 {
+			compatible = "qca,ar7100-spi";
+			reg = <0x1f000000 0x10>;
+
+			status = "disabled";
+
+			#address-cells = <1>;
+			#size-cells = <0>;
+		};
+	};
+};
diff --git a/arch/mips/dts/qca953x.dtsi b/arch/mips/dts/qca953x.dtsi
new file mode 100644
index 0000000..870010f
--- /dev/null
+++ b/arch/mips/dts/qca953x.dtsi
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <dt-bindings/interrupt-controller/irq.h>
+#include "skeleton.dtsi"
+
+/ {
+	compatible = "qca,qca953x";
+
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	cpus {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		cpu@0 {
+			device_type = "cpu";
+			compatible = "mips,mips24Kc";
+			reg = <0>;
+		};
+	};
+
+	clocks {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		ranges;
+
+		xtal: xtal {
+			#clock-cells = <0>;
+			compatible = "fixed-clock";
+			clock-output-names = "xtal";
+		};
+	};
+
+	pinctrl {
+		u-boot,dm-pre-reloc;
+		compatible = "qca,qca953x-pinctrl";
+		ranges;
+		#address-cells = <1>;
+		#size-cells = <1>;
+		reg = <0x18040000 0x100>;
+	};
+
+	ahb {
+		compatible = "simple-bus";
+		ranges;
+
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		apb {
+			compatible = "simple-bus";
+			ranges;
+
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			uart0: uart@18020000 {
+				compatible = "ns16550";
+				reg = <0x18020000 0x20>;
+				reg-shift = <2>;
+				clock-frequency = <25000000>;
+				interrupts = <128 IRQ_TYPE_LEVEL_HIGH>;
+
+				status = "disabled";
+			};
+		};
+
+		spi0: spi@1f000000 {
+			compatible = "qca,ar7100-spi";
+			reg = <0x1f000000 0x10>;
+			interrupts = <129 IRQ_TYPE_LEVEL_HIGH>;
+
+			status = "disabled";
+
+			#address-cells = <1>;
+			#size-cells = <0>;
+		};
+	};
+};
diff --git a/arch/mips/dts/tplink_wdr4300.dts b/arch/mips/dts/tplink_wdr4300.dts
new file mode 100644
index 0000000..cfda4df
--- /dev/null
+++ b/arch/mips/dts/tplink_wdr4300.dts
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2016 Marek Vasut <marex@denx.de>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/dts-v1/;
+#include "ar934x.dtsi"
+
+/ {
+	model = "TP-Link WDR4300 Board";
+	compatible = "tplink,wdr4300", "qca,ar934x";
+
+	aliases {
+		serial0 = &uart0;
+		spi0 = &spi0;
+	};
+
+	chosen {
+		stdout-path = "serial0:115200n8";
+	};
+};
+
+&ehci0 {
+	status = "okay";
+};
+
+&gmac0 {
+	phy-mode = "rgmii";
+	status = "okay";
+};
+
+&spi0 {
+	spi-max-frequency = <25000000>;
+	status = "okay";
+	spi-flash@0 {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		compatible = "spi-flash";
+		memory-map = <0x1e000000 0x00800000>;
+		spi-max-frequency = <25000000>;
+		reg = <0>;
+	};
+};
+
+&uart0 {
+	clock-frequency = <40000000>;
+	status = "okay";
+};
+
+&xtal {
+	clock-frequency = <40000000>;
+};
diff --git a/arch/mips/include/asm/global_data.h b/arch/mips/include/asm/global_data.h
index a1ca257..3f230b0 100644
--- a/arch/mips/include/asm/global_data.h
+++ b/arch/mips/include/asm/global_data.h
@@ -23,6 +23,12 @@
 	unsigned long tbl;
 	unsigned long lastinc;
 #endif
+#ifdef CONFIG_ARCH_ATH79
+	unsigned long id;
+	unsigned long soc;
+	unsigned long rev;
+	unsigned long ver;
+#endif
 };
 
 #include <asm-generic/global_data.h>
diff --git a/arch/mips/lib/cache_init.S b/arch/mips/lib/cache_init.S
index 14cc2c4..08b7c3a 100644
--- a/arch/mips/lib/cache_init.S
+++ b/arch/mips/lib/cache_init.S
@@ -64,7 +64,7 @@
 	/* detect associativity */
 	srl	\sz, $1, \off + MIPS_CONF1_DA_SHF - MIPS_CONF1_DA_SHF
 	andi	\sz, \sz, (MIPS_CONF1_DA >> MIPS_CONF1_DA_SHF)
-	addi	\sz, \sz, 1
+	addiu	\sz, \sz, 1
 
 	/* sz *= line_sz */
 	mul	\sz, \sz, \line_sz
diff --git a/arch/mips/mach-ath79/Kconfig b/arch/mips/mach-ath79/Kconfig
new file mode 100644
index 0000000..7d483aa
--- /dev/null
+++ b/arch/mips/mach-ath79/Kconfig
@@ -0,0 +1,55 @@
+menu "QCA/Atheros 7xxx/9xxx platforms"
+	depends on ARCH_ATH79
+
+config SYS_SOC
+	default "ath79"
+
+config SOC_AR933X
+	bool
+	select SUPPORTS_BIG_ENDIAN
+	select SUPPORTS_CPU_MIPS32_R1
+	select SUPPORTS_CPU_MIPS32_R2
+	select MIPS_TUNE_24KC
+	help
+	  This supports QCA/Atheros ar933x family SOCs.
+
+config SOC_AR934X
+	bool
+	select SUPPORTS_BIG_ENDIAN
+	select SUPPORTS_CPU_MIPS32_R1
+	select SUPPORTS_CPU_MIPS32_R2
+	select MIPS_TUNE_74KC
+	help
+	  This supports QCA/Atheros ar934x family SOCs.
+
+config SOC_QCA953X
+	bool
+	select SUPPORTS_BIG_ENDIAN
+	select SUPPORTS_CPU_MIPS32_R1
+	select SUPPORTS_CPU_MIPS32_R2
+	select MIPS_TUNE_24KC
+	help
+	  This supports QCA/Atheros qca953x family SOCs.
+
+choice
+	prompt "Board select"
+
+config TARGET_AP121
+	bool "AP121 Reference Board"
+	select SOC_AR933X
+
+config TARGET_AP143
+	bool "AP143 Reference Board"
+	select SOC_QCA953X
+
+config BOARD_TPLINK_WDR4300
+	bool "TP-Link WDR4300 Board"
+	select SOC_AR934X
+
+endchoice
+
+source "board/qca/ap121/Kconfig"
+source "board/qca/ap143/Kconfig"
+source "board/tplink/wdr4300/Kconfig"
+
+endmenu
diff --git a/arch/mips/mach-ath79/Makefile b/arch/mips/mach-ath79/Makefile
new file mode 100644
index 0000000..d7e2666
--- /dev/null
+++ b/arch/mips/mach-ath79/Makefile
@@ -0,0 +1,11 @@
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y += reset.o
+obj-y += cpu.o
+obj-y += dram.o
+
+obj-$(CONFIG_SOC_AR933X)	+= ar933x/
+obj-$(CONFIG_SOC_AR934X)	+= ar934x/
+obj-$(CONFIG_SOC_QCA953X)	+= qca953x/
diff --git a/arch/mips/mach-ath79/ar933x/Makefile b/arch/mips/mach-ath79/ar933x/Makefile
new file mode 100644
index 0000000..fd74f0c
--- /dev/null
+++ b/arch/mips/mach-ath79/ar933x/Makefile
@@ -0,0 +1,7 @@
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y += clk.o
+obj-y += ddr.o
+obj-y += lowlevel_init.o
diff --git a/arch/mips/mach-ath79/ar933x/clk.c b/arch/mips/mach-ath79/ar933x/clk.c
new file mode 100644
index 0000000..9fcd496
--- /dev/null
+++ b/arch/mips/mach-ath79/ar933x/clk.c
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/reset.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static u32 ar933x_get_xtal(void)
+{
+	u32 val;
+
+	val = get_bootstrap();
+	if (val & AR933X_BOOTSTRAP_REF_CLK_40)
+		return 40000000;
+	else
+		return 25000000;
+}
+
+int get_serial_clock(void)
+{
+	return ar933x_get_xtal();
+}
+
+int get_clocks(void)
+{
+	void __iomem *regs;
+	u32 val, xtal, pll, div;
+
+	regs = map_physmem(AR71XX_PLL_BASE, AR71XX_PLL_SIZE,
+			   MAP_NOCACHE);
+	xtal = ar933x_get_xtal();
+	val = readl(regs + AR933X_PLL_CPU_CONFIG_REG);
+
+	/* VCOOUT = XTAL * DIV_INT */
+	div = (val >> AR933X_PLL_CPU_CONFIG_REFDIV_SHIFT)
+			& AR933X_PLL_CPU_CONFIG_REFDIV_MASK;
+	pll = xtal / div;
+
+	/* PLLOUT = VCOOUT * (1/2^OUTDIV) */
+	div = (val >> AR933X_PLL_CPU_CONFIG_NINT_SHIFT)
+			& AR933X_PLL_CPU_CONFIG_NINT_MASK;
+	pll *= div;
+	div = (val >> AR933X_PLL_CPU_CONFIG_OUTDIV_SHIFT)
+			& AR933X_PLL_CPU_CONFIG_OUTDIV_MASK;
+	if (!div)
+		div = 1;
+	pll >>= div;
+
+	val = readl(regs + AR933X_PLL_CLK_CTRL_REG);
+
+	/* CPU_CLK = PLLOUT / CPU_POST_DIV */
+	div = ((val >> AR933X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT)
+			& AR933X_PLL_CLK_CTRL_CPU_POST_DIV_MASK) + 1;
+	gd->cpu_clk = pll / div;
+
+	/* DDR_CLK = PLLOUT / DDR_POST_DIV */
+	div = ((val >> AR933X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT)
+			& AR933X_PLL_CLK_CTRL_DDR_POST_DIV_MASK) + 1;
+	gd->mem_clk = pll / div;
+
+	/* AHB_CLK = PLLOUT / AHB_POST_DIV */
+	div = ((val >> AR933X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT)
+			& AR933X_PLL_CLK_CTRL_AHB_POST_DIV_MASK) + 1;
+	gd->bus_clk = pll / div;
+
+	return 0;
+}
+
+ulong get_bus_freq(ulong dummy)
+{
+	if (!gd->bus_clk)
+		get_clocks();
+	return gd->bus_clk;
+}
+
+ulong get_ddr_freq(ulong dummy)
+{
+	if (!gd->mem_clk)
+		get_clocks();
+	return gd->mem_clk;
+}
diff --git a/arch/mips/mach-ath79/ar933x/ddr.c b/arch/mips/mach-ath79/ar933x/ddr.c
new file mode 100644
index 0000000..91452bc
--- /dev/null
+++ b/arch/mips/mach-ath79/ar933x/ddr.c
@@ -0,0 +1,333 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ * Based on Atheros LSDK/QSDK
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/reset.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define DDR_CTRL_UPD_EMR3S      BIT(5)
+#define DDR_CTRL_UPD_EMR2S      BIT(4)
+#define DDR_CTRL_PRECHARGE      BIT(3)
+#define DDR_CTRL_AUTO_REFRESH   BIT(2)
+#define DDR_CTRL_UPD_EMRS       BIT(1)
+#define DDR_CTRL_UPD_MRS        BIT(0)
+
+#define DDR_REFRESH_EN          BIT(14)
+#define DDR_REFRESH_M           0x3ff
+#define DDR_REFRESH(x)          ((x) & 0x3ff)
+#define DDR_REFRESH_VAL_25M     (DDR_REFRESH_EN | DDR_REFRESH(390))
+#define DDR_REFRESH_VAL_40M     (DDR_REFRESH_EN | DDR_REFRESH(624))
+
+#define DDR_TRAS_S              0
+#define DDR_TRAS_M              0x1f
+#define DDR_TRAS(x)             ((x) << DDR_TRAS_S)
+#define DDR_TRCD_M              0xf
+#define DDR_TRCD_S              5
+#define DDR_TRCD(x)             ((x) << DDR_TRCD_S)
+#define DDR_TRP_M               0xf
+#define DDR_TRP_S               9
+#define DDR_TRP(x)              ((x) << DDR_TRP_S)
+#define DDR_TRRD_M              0xf
+#define DDR_TRRD_S              13
+#define DDR_TRRD(x)             ((x) << DDR_TRRD_S)
+#define DDR_TRFC_M              0x7f
+#define DDR_TRFC_S              17
+#define DDR_TRFC(x)             ((x) << DDR_TRFC_S)
+#define DDR_TMRD_M              0xf
+#define DDR_TMRD_S              23
+#define DDR_TMRD(x)             ((x) << DDR_TMRD_S)
+#define DDR_CAS_L_M             0x17
+#define DDR_CAS_L_S             27
+#define DDR_CAS_L(x)            (((x) & DDR_CAS_L_M) << DDR_CAS_L_S)
+#define DDR_OPEN                BIT(30)
+#define DDR_CONF_REG_VAL        (DDR_TRAS(16) | DDR_TRCD(6) | \
+				 DDR_TRP(6) | DDR_TRRD(4) | \
+				 DDR_TRFC(30) | DDR_TMRD(15) | \
+				 DDR_CAS_L(7) | DDR_OPEN)
+
+#define DDR_BURST_LEN_S         0
+#define DDR_BURST_LEN_M         0xf
+#define DDR_BURST_LEN(x)        ((x) << DDR_BURST_LEN_S)
+#define DDR_BURST_TYPE          BIT(4)
+#define DDR_CNTL_OE_EN          BIT(5)
+#define DDR_PHASE_SEL           BIT(6)
+#define DDR_CKE                 BIT(7)
+#define DDR_TWR_S               8
+#define DDR_TWR_M               0xf
+#define DDR_TWR(x)              ((x) << DDR_TWR_S)
+#define DDR_TRTW_S              12
+#define DDR_TRTW_M              0x1f
+#define DDR_TRTW(x)             ((x) << DDR_TRTW_S)
+#define DDR_TRTP_S              17
+#define DDR_TRTP_M              0xf
+#define DDR_TRTP(x)             ((x) << DDR_TRTP_S)
+#define DDR_TWTR_S              21
+#define DDR_TWTR_M              0x1f
+#define DDR_TWTR(x)             ((x) << DDR_TWTR_S)
+#define DDR_G_OPEN_L_S          26
+#define DDR_G_OPEN_L_M          0xf
+#define DDR_G_OPEN_L(x)         ((x) << DDR_G_OPEN_L_S)
+#define DDR_HALF_WIDTH_LOW      BIT(31)
+#define DDR_CONF2_REG_VAL       (DDR_BURST_LEN(8) | DDR_CNTL_OE_EN | \
+				 DDR_CKE | DDR_TWR(6) | DDR_TRTW(14) | \
+				 DDR_TRTP(8) | DDR_TWTR(14) | \
+				 DDR_G_OPEN_L(7) | DDR_HALF_WIDTH_LOW)
+
+#define DDR2_CONF_TWL_S         10
+#define DDR2_CONF_TWL_M         0xf
+#define DDR2_CONF_TWL(x)        (((x) & DDR2_CONF_TWL_M) << DDR2_CONF_TWL_S)
+#define DDR2_CONF_ODT           BIT(9)
+#define DDR2_CONF_TFAW_S        2
+#define DDR2_CONF_TFAW_M        0x3f
+#define DDR2_CONF_TFAW(x)       (((x) & DDR2_CONF_TFAW_M) << DDR2_CONF_TFAW_S)
+#define DDR2_CONF_EN            BIT(0)
+#define DDR2_CONF_VAL           (DDR2_CONF_TWL(2) | DDR2_CONF_ODT | \
+				 DDR2_CONF_TFAW(22) | DDR2_CONF_EN)
+
+#define DDR1_EXT_MODE_VAL       0x02
+#define DDR2_EXT_MODE_VAL       0x402
+#define DDR2_EXT_MODE_OCD_VAL   0x382
+#define DDR1_MODE_DLL_VAL       0x133
+#define DDR2_MODE_DLL_VAL       0x100
+#define DDR1_MODE_VAL           0x33
+#define DDR2_MODE_VAL           0xa33
+#define DDR_TAP_VAL0            0x08
+#define DDR_TAP_VAL1            0x09
+
+void ddr_init(void)
+{
+	void __iomem *regs;
+	u32 val;
+
+	regs = map_physmem(AR71XX_DDR_CTRL_BASE, AR71XX_DDR_CTRL_SIZE,
+			   MAP_NOCACHE);
+
+	writel(DDR_CONF_REG_VAL, regs + AR71XX_DDR_REG_CONFIG);
+	writel(DDR_CONF2_REG_VAL, regs + AR71XX_DDR_REG_CONFIG2);
+
+	val = get_bootstrap();
+	if (val & AR933X_BOOTSTRAP_DDR2) {
+		/* AHB maximum timeout */
+		writel(0xfffff, regs + AR933X_DDR_REG_TIMEOUT_MAX);
+
+		/* Enable DDR2 */
+		writel(DDR2_CONF_VAL, regs + AR933X_DDR_REG_DDR2_CONFIG);
+
+		/* Precharge All */
+		writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Disable High Temperature Self-Refresh, Full Array */
+		writel(0x00, regs + AR933X_DDR_REG_EMR2);
+
+		/* Extended Mode Register 2 Set (EMR2S) */
+		writel(DDR_CTRL_UPD_EMR2S, regs + AR71XX_DDR_REG_CONTROL);
+
+		writel(0x00, regs + AR933X_DDR_REG_EMR3);
+
+		/* Extended Mode Register 3 Set (EMR3S) */
+		writel(DDR_CTRL_UPD_EMR3S, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Enable DLL,  Full strength, ODT Disabled */
+		writel(0x00, regs + AR71XX_DDR_REG_EMR);
+
+		/* Extended Mode Register Set (EMRS) */
+		writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Reset DLL */
+		writel(DDR2_MODE_DLL_VAL, regs + AR71XX_DDR_REG_MODE);
+
+		/* Mode Register Set (MRS) */
+		writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Precharge All */
+		writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Auto Refresh */
+		writel(DDR_CTRL_AUTO_REFRESH, regs + AR71XX_DDR_REG_CONTROL);
+		writel(DDR_CTRL_AUTO_REFRESH, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Write recovery (WR) 6 clock, CAS Latency 3, Burst Length 8 */
+		writel(DDR2_MODE_VAL, regs + AR71XX_DDR_REG_MODE);
+		/* Mode Register Set (MRS) */
+		writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Enable OCD defaults, Enable DLL, Reduced Drive Strength */
+		writel(DDR2_EXT_MODE_OCD_VAL, regs + AR71XX_DDR_REG_EMR);
+
+		/* Extended Mode Register Set (EMRS) */
+		writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* OCD exit, Enable DLL, Enable /DQS, Reduced Drive Strength */
+		writel(DDR2_EXT_MODE_VAL, regs + AR71XX_DDR_REG_EMR);
+		/* Extended Mode Register Set (EMRS) */
+		writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Refresh time control */
+		if (val & AR933X_BOOTSTRAP_REF_CLK_40)
+			writel(DDR_REFRESH_VAL_40M, regs +
+			       AR71XX_DDR_REG_REFRESH);
+		else
+			writel(DDR_REFRESH_VAL_25M, regs +
+			       AR71XX_DDR_REG_REFRESH);
+
+		/* DQS 0 Tap Control */
+		writel(DDR_TAP_VAL0, regs + AR71XX_DDR_REG_TAP_CTRL0);
+
+		/* DQS 1 Tap Control */
+		writel(DDR_TAP_VAL1, regs + AR71XX_DDR_REG_TAP_CTRL1);
+
+		/* For 16-bit DDR */
+		writel(0xff, regs + AR71XX_DDR_REG_RD_CYCLE);
+	} else {
+		/* AHB maximum timeout */
+		writel(0xfffff, regs + AR933X_DDR_REG_TIMEOUT_MAX);
+
+		/* Precharge All */
+		writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Reset DLL, Burst Length 8, CAS Latency 3 */
+		writel(DDR1_MODE_DLL_VAL, regs + AR71XX_DDR_REG_MODE);
+
+		/* Forces an MRS update cycle in DDR */
+		writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Enable DLL, Full strength */
+		writel(DDR1_EXT_MODE_VAL, regs + AR71XX_DDR_REG_EMR);
+
+		/* Extended Mode Register Set (EMRS) */
+		writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Precharge All */
+		writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Normal DLL, Burst Length 8, CAS Latency 3 */
+		writel(DDR1_MODE_VAL, regs + AR71XX_DDR_REG_MODE);
+
+		/* Mode Register Set (MRS) */
+		writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Refresh time control */
+		if (val & AR933X_BOOTSTRAP_REF_CLK_40)
+			writel(DDR_REFRESH_VAL_40M, regs +
+			       AR71XX_DDR_REG_REFRESH);
+		else
+			writel(DDR_REFRESH_VAL_25M, regs +
+			       AR71XX_DDR_REG_REFRESH);
+
+		/* DQS 0 Tap Control */
+		writel(DDR_TAP_VAL0, regs + AR71XX_DDR_REG_TAP_CTRL0);
+
+		/* DQS 1 Tap Control */
+		writel(DDR_TAP_VAL1, regs + AR71XX_DDR_REG_TAP_CTRL1);
+
+		/* For 16-bit DDR */
+		writel(0xff, regs + AR71XX_DDR_REG_RD_CYCLE);
+	}
+}
+
+void ddr_tap_tuning(void)
+{
+	void __iomem *regs;
+	u32 *addr_k0, *addr_k1, *addr;
+	u32 val, tap, upper, lower;
+	int i, j, dir, err, done;
+
+	regs = map_physmem(AR71XX_DDR_CTRL_BASE, AR71XX_DDR_CTRL_SIZE,
+			   MAP_NOCACHE);
+
+	/* Init memory pattern */
+	addr = (void *)CKSEG0ADDR(0x2000);
+	for (i = 0; i < 256; i++) {
+		val = 0;
+		for (j = 0; j < 8; j++) {
+			if (i & (1 << j)) {
+				if (j % 2)
+					val |= 0xffff0000;
+				else
+					val |= 0x0000ffff;
+			}
+
+			if (j % 2) {
+				*addr++ = val;
+				val = 0;
+			}
+		}
+	}
+
+	err = 0;
+	done = 0;
+	dir = 1;
+	tap = readl(regs + AR71XX_DDR_REG_TAP_CTRL0);
+	val = tap;
+	while (!done) {
+		err = 0;
+
+		/* Update new DDR tap value */
+		writel(val, regs + AR71XX_DDR_REG_TAP_CTRL0);
+		writel(val, regs + AR71XX_DDR_REG_TAP_CTRL1);
+
+		/* Compare DDR with cache */
+		for (i = 0; i < 2; i++) {
+			addr_k1 = (void *)CKSEG1ADDR(0x2000);
+			addr_k0 = (void *)CKSEG0ADDR(0x2000);
+			addr = (void *)CKSEG0ADDR(0x3000);
+
+			while (addr_k0 < addr) {
+				if (*addr_k1++ != *addr_k0++) {
+					err = 1;
+					break;
+				}
+			}
+
+			if (err)
+				break;
+		}
+
+		if (err) {
+			/* Save upper/lower threshold if error  */
+			if (dir) {
+				dir = 0;
+				val--;
+				upper = val;
+				val = tap;
+			} else {
+				val++;
+				lower = val;
+				done = 1;
+			}
+		} else {
+			/* Try the next value until limitation */
+			if (dir) {
+				if (val < 0x20) {
+					val++;
+				} else {
+					dir = 0;
+					upper = val;
+					val = tap;
+				}
+			} else {
+				if (!val) {
+					lower = val;
+					done = 1;
+				} else {
+					val--;
+				}
+			}
+		}
+	}
+
+	/* compute an intermediate value and write back */
+	val = (upper + lower) / 2;
+	writel(val, regs + AR71XX_DDR_REG_TAP_CTRL0);
+	val++;
+	writel(val, regs + AR71XX_DDR_REG_TAP_CTRL1);
+}
diff --git a/arch/mips/mach-ath79/ar933x/lowlevel_init.S b/arch/mips/mach-ath79/ar933x/lowlevel_init.S
new file mode 100644
index 0000000..1b847f5
--- /dev/null
+++ b/arch/mips/mach-ath79/ar933x/lowlevel_init.S
@@ -0,0 +1,280 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ * Based on Atheros LSDK/QSDK and u-boot_mod project
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+#include <asm/asm.h>
+#include <asm/regdef.h>
+#include <asm/mipsregs.h>
+#include <asm/addrspace.h>
+#include <mach/ar71xx_regs.h>
+
+#define SET_BIT(val, bit)   ((val) | (1 << (bit)))
+#define SET_PLL_PD(val)     SET_BIT(val, 30)
+#define AHB_DIV_TO_4(val)   SET_BIT(SET_BIT(val, 15), 16)
+#define PLL_BYPASS(val)     SET_BIT(val, 2)
+
+#define MK_PLL_CONF(divint, refdiv, range, outdiv) \
+     (((0x3F & divint) << 10) | \
+     ((0x1F & refdiv) << 16) | \
+     ((0x1 & range)   << 21) | \
+     ((0x7 & outdiv)  << 23) )
+
+#define MK_CLK_CNTL(cpudiv, ddrdiv, ahbdiv) \
+    (((0x3 & (cpudiv - 1)) << 5)  | \
+    ((0x3 & (ddrdiv - 1)) << 10) | \
+    ((0x3 & (ahbdiv - 1)) << 15) )
+
+/*
+ * PLL_CPU_CONFIG_VAL
+ *
+ * Bit30 is set (CPU_PLLPWD = 1 -> power down control for CPU PLL)
+ * After PLL configuration we need to clear this bit
+ *
+ * Values written into CPU PLL Configuration (CPU_PLL_CONFIG)
+ *
+ * bits 10..15  (6bit)  DIV_INT (Integer part of the DIV to CPU PLL)
+ *                      =>  32  (0x20)  VCOOUT = XTAL * DIV_INT
+ * bits 16..20  (5bit)  REFDIV  (Reference clock divider)
+ *                      =>  1   (0x1)   [Must start at values 1]
+ * bits 21      (1bit)  RANGE   (VCO frequency range of the CPU PLL)
+ *                      =>  0   (0x0)   [Doesn't impact clock values]
+ * bits 23..25  (3bit)  OUTDIV  (Ratio between VCO and PLL output)
+ *                      =>  1   (0x1)   [0 is illegal!]
+ *                              PLLOUT = VCOOUT * (1/2^OUTDIV)
+ */
+/* DIV_INT=32 (25MHz*32/2=400MHz), REFDIV=1, RANGE=0, OUTDIV=1 */
+#define PLL_CPU_CONFIG_VAL_40M  MK_PLL_CONF(20, 1, 0, 1)
+/* DIV_INT=20 (40MHz*20/2=400MHz), REFDIV=1, RANGE=0, OUTDIV=1 */
+#define PLL_CPU_CONFIG_VAL_25M  MK_PLL_CONF(32, 1, 0, 1)
+
+/*
+ * PLL_CLK_CONTROL_VAL
+ *
+ * In PLL_CLK_CONTROL_VAL bit 2 is set (BYPASS = 1 -> bypass PLL)
+ * After PLL configuration we need to clear this bit
+ *
+ * Values written into CPU Clock Control Register CLOCK_CONTROL
+ *
+ * bits 2       (1bit)  BYPASS (Bypass PLL. This defaults to 1 for test.
+ *                      Software must enable the CPU PLL for normal and
+ *                      then set this bit to 0)
+ * bits 5..6    (2bit)  CPU_POST_DIV    =>  0   (DEFAULT, Ratio = 1)
+ *                      CPU_CLK = PLLOUT / CPU_POST_DIV
+ * bits 10..11  (2bit)  DDR_POST_DIV    =>  0   (DEFAULT, Ratio = 1)
+ *                      DDR_CLK = PLLOUT / DDR_POST_DIV
+ * bits 15..16  (2bit)  AHB_POST_DIV    =>  1   (DEFAULT, Ratio = 2)
+ *                      AHB_CLK = PLLOUT / AHB_POST_DIV
+ *
+ */
+#define PLL_CLK_CONTROL_VAL MK_CLK_CNTL(1, 1, 2)
+
+    .text
+    .set noreorder
+
+LEAF(lowlevel_init)
+	/* These three WLAN_RESET will avoid original issue */
+	li      t3, 0x03
+1:
+	li      t0, CKSEG1ADDR(AR71XX_RESET_BASE)
+	lw      t1, AR933X_RESET_REG_RESET_MODULE(t0)
+	ori     t1, t1, 0x0800
+	sw      t1, AR933X_RESET_REG_RESET_MODULE(t0)
+	nop
+	lw      t1, AR933X_RESET_REG_RESET_MODULE(t0)
+	li      t2, 0xfffff7ff
+	and     t1, t1, t2
+	sw      t1, AR933X_RESET_REG_RESET_MODULE(t0)
+	nop
+	addi    t3, t3, -1
+	bnez    t3, 1b
+	nop
+
+	li      t2, 0x20
+2:
+	beqz    t2, 1b
+	nop
+	addi    t2, t2, -1
+	lw      t5, AR933X_RESET_REG_BOOTSTRAP(t0)
+	andi    t1, t5, 0x10
+	bnez    t1, 2b
+	nop
+
+	li      t1, 0x02110E
+	sw      t1, AR933X_RESET_REG_BOOTSTRAP(t0)
+	nop
+
+	/* RTC Force Wake */
+	li      t0, CKSEG1ADDR(AR933X_RTC_BASE)
+	li      t1, 0x03
+	sw      t1, AR933X_RTC_REG_FORCE_WAKE(t0)
+	nop
+	nop
+
+	/* RTC Reset */
+	li      t1, 0x00
+	sw      t1, AR933X_RTC_REG_RESET(t0)
+	nop
+	nop
+
+	li      t1, 0x01
+	sw      t1, AR933X_RTC_REG_RESET(t0)
+	nop
+	nop
+
+	/* Wait for RTC in on state */
+1:
+	lw      t1, AR933X_RTC_REG_STATUS(t0)
+	andi    t1, t1, 0x02
+	beqz    t1, 1b
+	nop
+
+	/* Program ki/kd */
+	li      t0, CKSEG1ADDR(AR933X_SRIF_BASE)
+	andi    t1, t5, 0x01            # t5 BOOT_STRAP
+	bnez    t1, 1f
+	nop
+	li      t1, 0x19e82f01
+	b       2f
+	nop
+1:
+	li      t1, 0x18e82f01
+2:
+	sw      t1, AR933X_SRIF_DDR_DPLL2_REG(t0)
+
+	/* Program phase shift */
+	lw      t1, AR933X_SRIF_DDR_DPLL3_REG(t0)
+	li      t2, 0xc07fffff
+	and     t1, t1, t2
+	li      t2, 0x800000
+	or      t1, t1, t2
+	sw      t1, AR933X_SRIF_DDR_DPLL3_REG(t0)
+	nop
+
+	/* in some cases, the SoC doesn't start with higher clock on AHB */
+	li      t0, CKSEG1ADDR(AR71XX_PLL_BASE)
+	li      t1, AHB_DIV_TO_4(PLL_BYPASS(PLL_CLK_CONTROL_VAL))
+	sw      t1, AR933X_PLL_CLK_CTRL_REG(t0)
+	nop
+
+	/* Set SETTLE_TIME in CPU PLL */
+	andi    t1, t5, 0x01            # t5 BOOT_STRAP
+	bnez    t1, 1f
+	nop
+	li      t1, 0x0352
+	b       2f
+	nop
+1:
+	li      t1, 0x0550
+2:
+	sw      t1, AR71XX_PLL_REG_SEC_CONFIG(t0)
+	nop
+
+	/* Set nint, frac, refdiv, outdiv, range according to xtal */
+0:
+	andi    t1, t5, 0x01            # t5 BOOT_STRAP
+	bnez    t1, 1f
+	nop
+	li      t1, SET_PLL_PD(PLL_CPU_CONFIG_VAL_25M)
+	b       2f
+	nop
+1:
+	li      t1, SET_PLL_PD(PLL_CPU_CONFIG_VAL_40M)
+2:
+	sw      t1, AR933X_PLL_CPU_CONFIG_REG(t0)
+	nop
+1:
+	lw      t1, AR933X_PLL_CPU_CONFIG_REG(t0)
+	li      t2, 0x80000000
+	and     t1, t1, t2
+	bnez    t1, 1b
+	nop
+
+	/* Put frac bit19:10 configuration */
+	li      t1, 0x1003E8
+	sw      t1, AR933X_PLL_DITHER_FRAC_REG(t0)
+	nop
+
+	/* Clear PLL power down bit in CPU PLL configuration */
+	andi    t1, t5, 0x01            # t5 BOOT_STRAP
+	bnez    t1, 1f
+	nop
+	li      t1, PLL_CPU_CONFIG_VAL_25M
+	b       2f
+	nop
+1:
+	li      t1, PLL_CPU_CONFIG_VAL_40M
+2:
+	sw      t1, AR933X_PLL_CPU_CONFIG_REG(t0)
+	nop
+
+	/* Wait for PLL update -> bit 31 in CPU_PLL_CONFIG should be 0 */
+1:
+	lw      t1, AR933X_PLL_CPU_CONFIG_REG(t0)
+	li      t2, 0x80000000
+	and     t1, t1, t2
+	bnez    t1, 1b
+	nop
+
+	/* Confirm DDR PLL lock */
+	li      t3, 100
+	li      t4, 0
+
+2:
+	addi    t4, t4, 1
+	bgt     t4, t3, 0b
+	nop
+
+	li      t3, 5
+3:
+	/* Clear do_meas */
+	li      t0, CKSEG1ADDR(AR933X_SRIF_BASE)
+	lw      t1, AR933X_SRIF_DDR_DPLL3_REG(t0)
+	li      t2, 0xBFFFFFFF
+	and     t1, t1, t2
+	sw      t1, AR933X_SRIF_DDR_DPLL3_REG(t0)
+	nop
+
+	li      t2, 10
+1:
+	subu    t2, t2, 1
+	bnez    t2, 1b
+	nop
+
+	/* Set do_meas */
+	li      t2, 0x40000000
+	or      t1, t1, t2
+	sw      t1, AR933X_SRIF_DDR_DPLL3_REG(t0)
+	nop
+
+	/* Check meas_done */
+1:
+	lw      t1, AR933X_SRIF_DDR_DPLL4_REG(t0)
+	andi    t1, t1, 0x8
+	beqz    t1, 1b
+	nop
+
+	lw      t1, AR933X_SRIF_DDR_DPLL3_REG(t0)
+	li      t2, 0x007FFFF8
+	and     t1, t1, t2
+	srl     t1, t1, 3
+	li      t2, 0x4000
+	bgt     t1, t2, 2b
+	nop
+	addi    t3, t3, -1
+	bnez    t3, 3b
+	nop
+
+	/* clear PLL bypass (bit 2) in CPU CLOCK CONTROL register */
+	li      t0, CKSEG1ADDR(AR71XX_PLL_BASE)
+	li      t1, PLL_CLK_CONTROL_VAL
+	sw      t1, AR933X_PLL_CLK_CTRL_REG(t0)
+	nop
+
+	nop
+	jr ra
+	nop
+    END(lowlevel_init)
diff --git a/arch/mips/mach-ath79/ar934x/Makefile b/arch/mips/mach-ath79/ar934x/Makefile
new file mode 100644
index 0000000..348c65b
--- /dev/null
+++ b/arch/mips/mach-ath79/ar934x/Makefile
@@ -0,0 +1,7 @@
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y += cpu.o
+obj-y += clk.o
+obj-y += ddr.o
diff --git a/arch/mips/mach-ath79/ar934x/clk.c b/arch/mips/mach-ath79/ar934x/clk.c
new file mode 100644
index 0000000..9c65184
--- /dev/null
+++ b/arch/mips/mach-ath79/ar934x/clk.c
@@ -0,0 +1,334 @@
+/*
+ * Copyright (C) 2016 Marek Vasut <marex@denx.de>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/reset.h>
+#include <wait_bit.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * The math for calculating PLL:
+ *                                       NFRAC * 2^8
+ *                               NINT + -------------
+ *                XTAL [MHz]              2^(18 - 1)
+ *   PLL [MHz] = ------------ * ----------------------
+ *                  REFDIV              2^OUTDIV
+ *
+ * Unfortunatelly, there is no way to reliably compute the variables.
+ * The vendor U-Boot port contains macros for various combinations of
+ * CPU PLL / DDR PLL / AHB bus speed and there is no obvious pattern
+ * in those numbers.
+ */
+struct ar934x_pll_config {
+	u8	range;
+	u8	refdiv;
+	u8	outdiv;
+	/* Index 0 is for XTAL=25MHz , Index 1 is for XTAL=40MHz */
+	u8	nint[2];
+};
+
+struct ar934x_clock_config {
+	u16				cpu_freq;
+	u16				ddr_freq;
+	u16				ahb_freq;
+
+	struct ar934x_pll_config	cpu_pll;
+	struct ar934x_pll_config	ddr_pll;
+};
+
+static const struct ar934x_clock_config ar934x_clock_config[] = {
+	{ 300, 300, 150, { 1, 1, 1, { 24, 15 } }, { 1, 1, 1, { 24, 15 } } },
+	{ 400, 200, 200, { 1, 1, 1, { 32, 20 } }, { 1, 1, 2, { 32, 20 } } },
+	{ 400, 400, 200, { 0, 1, 1, { 32, 20 } }, { 0, 1, 1, { 32, 20 } } },
+	{ 500, 400, 200, { 1, 1, 0, { 20, 12 } }, { 0, 1, 1, { 32, 20 } } },
+	{ 533, 400, 200, { 1, 1, 0, { 21, 13 } }, { 0, 1, 1, { 32, 20 } } },
+	{ 533, 500, 250, { 1, 1, 0, { 21, 13 } }, { 0, 1, 0, { 20, 12 } } },
+	{ 560, 480, 240, { 1, 1, 0, { 22, 14 } }, { 1, 1, 0, { 19, 12 } } },
+	{ 566, 400, 200, { 1, 1, 0, { 22, 14 } }, { 1, 1, 0, { 16, 10 } } },
+	{ 566, 450, 225, { 1, 1, 0, { 22, 14 } }, { 0, 1, 1, { 36, 22 } } },
+	{ 566, 475, 237, { 1, 1, 0, { 22, 14 } }, { 1, 1, 0, { 19, 11 } } },
+	{ 566, 500, 250, { 1, 1, 0, { 22, 14 } }, { 1, 1, 0, { 20, 12 } } },
+	{ 566, 525, 262, { 1, 1, 0, { 22, 14 } }, { 1, 1, 0, { 21, 13 } } },
+	{ 566, 550, 275, { 1, 1, 0, { 22, 14 } }, { 1, 1, 0, { 22, 13 } } },
+	{ 600, 266, 133, { 0, 1, 0, { 24, 15 } }, { 1, 1, 1, { 21, 16 } } },
+	{ 600, 266, 200, { 0, 1, 0, { 24, 15 } }, { 1, 1, 1, { 21, 16 } } },
+	{ 600, 300, 150, { 0, 1, 0, { 24, 15 } }, { 0, 1, 1, { 24, 15 } } },
+	{ 600, 332, 166, { 0, 1, 0, { 24, 15 } }, { 1, 1, 1, { 26, 16 } } },
+	{ 600, 332, 200, { 0, 1, 0, { 24, 15 } }, { 1, 1, 1, { 26, 16 } } },
+	{ 600, 400, 200, { 0, 1, 0, { 24, 15 } }, { 0, 1, 1, { 32, 20 } } },
+	{ 600, 450, 200, { 0, 1, 0, { 24, 15 } }, { 0, 1, 0, { 18, 20 } } },
+	{ 600, 500, 250, { 0, 1, 0, { 24, 15 } }, { 1, 1, 0, { 20, 12 } } },
+	{ 600, 525, 262, { 0, 1, 0, { 24, 15 } }, { 0, 1, 0, { 21, 20 } } },
+	{ 600, 550, 275, { 0, 1, 0, { 24, 15 } }, { 0, 1, 0, { 22, 20 } } },
+	{ 600, 575, 287, { 0, 1, 0, { 24, 15 } }, { 0, 1, 0, { 23, 14 } } },
+	{ 600, 600, 300, { 0, 1, 0, { 24, 15 } }, { 0, 1, 0, { 24, 20 } } },
+	{ 600, 650, 325, { 0, 1, 0, { 24, 15 } }, { 0, 1, 0, { 26, 20 } } },
+	{ 650, 600, 300, { 0, 1, 0, { 26, 15 } }, { 0, 1, 0, { 24, 20 } } },
+	{ 700, 400, 200, { 3, 1, 0, { 28, 17 } }, { 0, 1, 1, { 32, 20 } } },
+};
+
+static void ar934x_srif_pll_cfg(void __iomem *pll_reg_base, const u32 srif_val)
+{
+	u32 reg;
+	do {
+		writel(0x10810f00, pll_reg_base + 0x4);
+		writel(srif_val, pll_reg_base + 0x0);
+		writel(0xd0810f00, pll_reg_base + 0x4);
+		writel(0x03000000, pll_reg_base + 0x8);
+		writel(0xd0800f00, pll_reg_base + 0x4);
+
+		clrbits_be32(pll_reg_base + 0x8, BIT(30));
+		udelay(5);
+		setbits_be32(pll_reg_base + 0x8, BIT(30));
+		udelay(5);
+
+		wait_for_bit("clk", pll_reg_base + 0xc, BIT(3), 1, 10, 0);
+
+		clrbits_be32(pll_reg_base + 0x8, BIT(30));
+		udelay(5);
+
+		/* Check if CPU SRIF PLL locked. */
+		reg = readl(pll_reg_base + 0x8);
+		reg = (reg & 0x7ffff8) >> 3;
+	} while (reg >= 0x40000);
+}
+
+void ar934x_pll_init(const u16 cpu_mhz, const u16 ddr_mhz, const u16 ahb_mhz)
+{
+	void __iomem *srif_regs = map_physmem(AR934X_SRIF_BASE,
+					      AR934X_SRIF_SIZE, MAP_NOCACHE);
+	void __iomem *pll_regs = map_physmem(AR71XX_PLL_BASE,
+					     AR71XX_PLL_SIZE, MAP_NOCACHE);
+	const struct ar934x_pll_config *pll_cfg;
+	int i, pll_nint, pll_refdiv, xtal_40 = 0;
+	u32 reg, cpu_pll, cpu_srif, ddr_pll, ddr_srif;
+
+	/* Configure SRIF PLL with initial values. */
+	writel(0x13210f00, srif_regs + AR934X_SRIF_CPU_DPLL2_REG);
+	writel(0x03000000, srif_regs + AR934X_SRIF_CPU_DPLL3_REG);
+	writel(0x13210f00, srif_regs + AR934X_SRIF_DDR_DPLL2_REG);
+	writel(0x03000000, srif_regs + AR934X_SRIF_DDR_DPLL3_REG);
+	writel(0x03000000, srif_regs + 0x188); /* Undocumented reg :-) */
+
+	/* Test for 40MHz XTAL */
+	reg = get_bootstrap();
+	if (reg & AR934X_BOOTSTRAP_REF_CLK_40) {
+		xtal_40 = 1;
+		cpu_srif = 0x41c00000;
+		ddr_srif = 0x41680000;
+	} else {
+		xtal_40 = 0;
+		cpu_srif = 0x29c00000;
+		ddr_srif = 0x29680000;
+	}
+
+	/* Locate CPU/DDR PLL configuration */
+	for (i = 0; i < ARRAY_SIZE(ar934x_clock_config); i++) {
+		if (cpu_mhz != ar934x_clock_config[i].cpu_freq)
+			continue;
+		if (ddr_mhz != ar934x_clock_config[i].ddr_freq)
+			continue;
+		if (ahb_mhz != ar934x_clock_config[i].ahb_freq)
+			continue;
+
+		/* Entry found */
+		pll_cfg = &ar934x_clock_config[i].cpu_pll;
+		pll_nint = pll_cfg->nint[xtal_40];
+		pll_refdiv = pll_cfg->refdiv;
+		cpu_pll =
+			(pll_nint << AR934X_PLL_CPU_CONFIG_NINT_SHIFT) |
+			(pll_refdiv << AR934X_PLL_CPU_CONFIG_REFDIV_SHIFT) |
+			(pll_cfg->range << AR934X_PLL_CPU_CONFIG_RANGE_SHIFT) |
+			(pll_cfg->outdiv << AR934X_PLL_CPU_CONFIG_OUTDIV_SHIFT);
+
+		pll_cfg = &ar934x_clock_config[i].ddr_pll;
+		pll_nint = pll_cfg->nint[xtal_40];
+		pll_refdiv = pll_cfg->refdiv;
+		ddr_pll =
+			(pll_nint << AR934X_PLL_DDR_CONFIG_NINT_SHIFT) |
+			(pll_refdiv << AR934X_PLL_DDR_CONFIG_REFDIV_SHIFT) |
+			(pll_cfg->range << AR934X_PLL_DDR_CONFIG_RANGE_SHIFT) |
+			(pll_cfg->outdiv << AR934X_PLL_DDR_CONFIG_OUTDIV_SHIFT);
+		break;
+	}
+
+	/* PLL configuration not found, hang. */
+	if (i == ARRAY_SIZE(ar934x_clock_config))
+		hang();
+
+	/* Set PLL Bypass */
+	setbits_be32(pll_regs + AR934X_PLL_CPU_DDR_CLK_CTRL_REG,
+		     AR934X_PLL_CLK_CTRL_CPU_PLL_BYPASS);
+	setbits_be32(pll_regs + AR934X_PLL_CPU_DDR_CLK_CTRL_REG,
+		     AR934X_PLL_CLK_CTRL_DDR_PLL_BYPASS);
+	setbits_be32(pll_regs + AR934X_PLL_CPU_DDR_CLK_CTRL_REG,
+		     AR934X_PLL_CLK_CTRL_AHB_PLL_BYPASS);
+
+	/* Configure CPU PLL */
+	writel(cpu_pll | AR934X_PLL_CPU_CONFIG_PLLPWD,
+	       pll_regs + AR934X_PLL_CPU_CONFIG_REG);
+	/* Configure DDR PLL */
+	writel(ddr_pll | AR934X_PLL_DDR_CONFIG_PLLPWD,
+	       pll_regs + AR934X_PLL_DDR_CONFIG_REG);
+	/* Configure PLL routing */
+	writel(AR934X_PLL_CLK_CTRL_CPU_PLL_BYPASS |
+	       AR934X_PLL_CLK_CTRL_DDR_PLL_BYPASS |
+	       AR934X_PLL_CLK_CTRL_AHB_PLL_BYPASS |
+	       (0 << AR934X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT) |
+	       (0 << AR934X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT) |
+	       (1 << AR934X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT) |
+	       AR934X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL |
+	       AR934X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL |
+	       AR934X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL,
+	       pll_regs + AR934X_PLL_CPU_DDR_CLK_CTRL_REG);
+
+	/* Configure SRIF PLLs, which is completely undocumented :-) */
+	ar934x_srif_pll_cfg(srif_regs + AR934X_SRIF_CPU_DPLL1_REG, cpu_srif);
+	ar934x_srif_pll_cfg(srif_regs + AR934X_SRIF_DDR_DPLL1_REG, ddr_srif);
+
+	/* Unset PLL Bypass */
+	clrbits_be32(pll_regs + AR934X_PLL_CPU_DDR_CLK_CTRL_REG,
+		     AR934X_PLL_CLK_CTRL_CPU_PLL_BYPASS);
+	clrbits_be32(pll_regs + AR934X_PLL_CPU_DDR_CLK_CTRL_REG,
+		     AR934X_PLL_CLK_CTRL_DDR_PLL_BYPASS);
+	clrbits_be32(pll_regs + AR934X_PLL_CPU_DDR_CLK_CTRL_REG,
+		     AR934X_PLL_CLK_CTRL_AHB_PLL_BYPASS);
+
+	/* Enable PLL dithering */
+	writel((1 << AR934X_PLL_DDR_DIT_FRAC_STEP_SHIFT) |
+	       (0xf << AR934X_PLL_DDR_DIT_UPD_CNT_SHIFT),
+	       pll_regs + AR934X_PLL_DDR_DIT_FRAC_REG);
+	writel(48 << AR934X_PLL_CPU_DIT_UPD_CNT_SHIFT,
+	       pll_regs + AR934X_PLL_CPU_DIT_FRAC_REG);
+}
+
+static u32 ar934x_get_xtal(void)
+{
+	u32 val;
+
+	val = get_bootstrap();
+	if (val & AR934X_BOOTSTRAP_REF_CLK_40)
+		return 40000000;
+	else
+		return 25000000;
+}
+
+int get_serial_clock(void)
+{
+	return ar934x_get_xtal();
+}
+
+static u32 ar934x_cpupll_to_hz(const u32 regval)
+{
+	const u32 outdiv = (regval >> AR934X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
+			   AR934X_PLL_CPU_CONFIG_OUTDIV_MASK;
+	const u32 refdiv = (regval >> AR934X_PLL_CPU_CONFIG_REFDIV_SHIFT) &
+			   AR934X_PLL_CPU_CONFIG_REFDIV_MASK;
+	const u32 nint = (regval >> AR934X_PLL_CPU_CONFIG_NINT_SHIFT) &
+			   AR934X_PLL_CPU_CONFIG_NINT_MASK;
+	const u32 nfrac = (regval >> AR934X_PLL_CPU_CONFIG_NFRAC_SHIFT) &
+			   AR934X_PLL_CPU_CONFIG_NFRAC_MASK;
+	const u32 xtal = ar934x_get_xtal();
+
+	return (xtal * (nint + (nfrac >> 9))) / (refdiv * (1 << outdiv));
+}
+
+static u32 ar934x_ddrpll_to_hz(const u32 regval)
+{
+	const u32 outdiv = (regval >> AR934X_PLL_DDR_CONFIG_OUTDIV_SHIFT) &
+			   AR934X_PLL_DDR_CONFIG_OUTDIV_MASK;
+	const u32 refdiv = (regval >> AR934X_PLL_DDR_CONFIG_REFDIV_SHIFT) &
+			   AR934X_PLL_DDR_CONFIG_REFDIV_MASK;
+	const u32 nint = (regval >> AR934X_PLL_DDR_CONFIG_NINT_SHIFT) &
+			   AR934X_PLL_DDR_CONFIG_NINT_MASK;
+	const u32 nfrac = (regval >> AR934X_PLL_DDR_CONFIG_NFRAC_SHIFT) &
+			   AR934X_PLL_DDR_CONFIG_NFRAC_MASK;
+	const u32 xtal = ar934x_get_xtal();
+
+	return (xtal * (nint + (nfrac >> 9))) / (refdiv * (1 << outdiv));
+}
+
+static void ar934x_update_clock(void)
+{
+	void __iomem *regs;
+	u32 ctrl, cpu, cpupll, ddr, ddrpll;
+	u32 cpudiv, ddrdiv, busdiv;
+	u32 cpuclk, ddrclk, busclk;
+
+	regs = map_physmem(AR71XX_PLL_BASE, AR71XX_PLL_SIZE,
+			   MAP_NOCACHE);
+
+	cpu = readl(regs + AR934X_PLL_CPU_CONFIG_REG);
+	ddr = readl(regs + AR934X_PLL_DDR_CONFIG_REG);
+	ctrl = readl(regs + AR934X_PLL_CPU_DDR_CLK_CTRL_REG);
+
+	cpupll = ar934x_cpupll_to_hz(cpu);
+	ddrpll = ar934x_ddrpll_to_hz(ddr);
+
+	if (ctrl & AR934X_PLL_CLK_CTRL_CPU_PLL_BYPASS)
+		cpuclk = ar934x_get_xtal();
+	else if (ctrl & AR934X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL)
+		cpuclk = cpupll;
+	else
+		cpuclk = ddrpll;
+
+	if (ctrl & AR934X_PLL_CLK_CTRL_DDR_PLL_BYPASS)
+		ddrclk = ar934x_get_xtal();
+	else if (ctrl & AR934X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL)
+		ddrclk = ddrpll;
+	else
+		ddrclk = cpupll;
+
+	if (ctrl & AR934X_PLL_CLK_CTRL_AHB_PLL_BYPASS)
+		busclk = ar934x_get_xtal();
+	else if (ctrl & AR934X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL)
+		busclk = ddrpll;
+	else
+		busclk = cpupll;
+
+	cpudiv = (ctrl >> AR934X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT) &
+		 AR934X_PLL_CLK_CTRL_CPU_POST_DIV_MASK;
+	ddrdiv = (ctrl >> AR934X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT) &
+		 AR934X_PLL_CLK_CTRL_DDR_POST_DIV_MASK;
+	busdiv = (ctrl >> AR934X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT) &
+		 AR934X_PLL_CLK_CTRL_AHB_POST_DIV_MASK;
+
+	gd->cpu_clk = cpuclk / (cpudiv + 1);
+	gd->mem_clk = ddrclk / (ddrdiv + 1);
+	gd->bus_clk = busclk / (busdiv + 1);
+}
+
+ulong get_bus_freq(ulong dummy)
+{
+	ar934x_update_clock();
+	return gd->bus_clk;
+}
+
+ulong get_ddr_freq(ulong dummy)
+{
+	ar934x_update_clock();
+	return gd->mem_clk;
+}
+
+int do_ar934x_showclk(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	ar934x_update_clock();
+	printf("CPU:       %8ld MHz\n", gd->cpu_clk / 1000000);
+	printf("Memory:    %8ld MHz\n", gd->mem_clk / 1000000);
+	printf("AHB:       %8ld MHz\n", gd->bus_clk / 1000000);
+	return 0;
+}
+
+U_BOOT_CMD(
+	clocks,	CONFIG_SYS_MAXARGS, 1, do_ar934x_showclk,
+	"display clocks",
+	""
+);
diff --git a/arch/mips/mach-ath79/ar934x/cpu.c b/arch/mips/mach-ath79/ar934x/cpu.c
new file mode 100644
index 0000000..8fcdf65
--- /dev/null
+++ b/arch/mips/mach-ath79/ar934x/cpu.c
@@ -0,0 +1,10 @@
+/*
+ * Copyright (C) 2016 Marek Vasut <marex@denx.de>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+
+/* The lowlevel_init() is not needed on AR934x */
+void lowlevel_init(void) {}
diff --git a/arch/mips/mach-ath79/ar934x/ddr.c b/arch/mips/mach-ath79/ar934x/ddr.c
new file mode 100644
index 0000000..4621d58
--- /dev/null
+++ b/arch/mips/mach-ath79/ar934x/ddr.c
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2016 Marek Vasut <marex@denx.de>
+ *
+ * Based on RAM init sequence by Piotr Dymacz <pepe2k@gmail.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/reset.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+enum {
+	AR934X_SDRAM = 0,
+	AR934X_DDR1,
+	AR934X_DDR2,
+};
+
+struct ar934x_mem_config {
+	u32	config1;
+	u32	config2;
+	u32	mode;
+	u32	extmode;
+	u32	tap;
+};
+
+static const struct ar934x_mem_config ar934x_mem_config[] = {
+	[AR934X_SDRAM] = { 0x7fbe8cd0, 0x959f66a8, 0x33, 0, 0x1f1f },
+	[AR934X_DDR1]  = { 0x7fd48cd0, 0x99d0e6a8, 0x33, 0, 0x14 },
+	[AR934X_DDR2]  = { 0xc7d48cd0, 0x9dd0e6a8, 0x33, 0, 0x10012 },
+};
+
+void ar934x_ddr_init(const u16 cpu_mhz, const u16 ddr_mhz, const u16 ahb_mhz)
+{
+	void __iomem *ddr_regs;
+	const struct ar934x_mem_config *memcfg;
+	int memtype;
+	u32 reg, cycle, ctl;
+
+	ddr_regs = map_physmem(AR71XX_DDR_CTRL_BASE, AR71XX_DDR_CTRL_SIZE,
+			       MAP_NOCACHE);
+
+	reg = get_bootstrap();
+	if (reg & AR934X_BOOTSTRAP_SDRAM_DISABLED) {	/* DDR */
+		if (reg & AR934X_BOOTSTRAP_DDR1) {	/* DDR 1 */
+			memtype = AR934X_DDR1;
+			cycle = 0xffff;
+		} else {				/* DDR 2 */
+			memtype = AR934X_DDR2;
+			if (gd->arch.rev) {
+				ctl = BIT(6);	/* Undocumented bit :-( */
+				if (reg & BIT(3))
+					cycle = 0xff;
+				else
+					cycle = 0xffff;
+			} else {
+				/* Force DDR2/x16 configuratio on old chips. */
+				ctl = 0;
+				cycle = 0xffff;		/* DDR2 16bit */
+			}
+
+			writel(0xe59, ddr_regs + AR934X_DDR_REG_DDR2_CONFIG);
+			udelay(100);
+
+			writel(0x10, ddr_regs + AR71XX_DDR_REG_CONTROL);
+			udelay(10);
+
+			writel(0x20, ddr_regs + AR71XX_DDR_REG_CONTROL);
+			udelay(10);
+
+			writel(ctl, ddr_regs + AR934X_DDR_REG_CTL_CONF);
+			udelay(10);
+		}
+	} else {					/* SDRAM */
+		memtype = AR934X_SDRAM;
+		cycle = 0xffffffff;
+
+		writel(0x13b, ddr_regs + AR934X_DDR_REG_CTL_CONF);
+		udelay(100);
+
+		/* Undocumented register */
+		writel(0x13b, ddr_regs + 0x118);
+		udelay(100);
+	}
+
+	memcfg = &ar934x_mem_config[memtype];
+
+	writel(memcfg->config1, ddr_regs + AR71XX_DDR_REG_CONFIG);
+	udelay(100);
+
+	writel(memcfg->config2, ddr_regs + AR71XX_DDR_REG_CONFIG2);
+	udelay(100);
+
+	writel(0x8, ddr_regs + AR71XX_DDR_REG_CONTROL);
+	udelay(10);
+
+	writel(memcfg->mode | 0x100, ddr_regs + AR71XX_DDR_REG_MODE);
+	mdelay(1);
+
+	writel(0x1, ddr_regs + AR71XX_DDR_REG_CONTROL);
+	udelay(10);
+
+	if (memtype == AR934X_DDR2) {
+		writel(memcfg->mode | 0x100, ddr_regs + AR71XX_DDR_REG_EMR);
+		udelay(100);
+
+		writel(0x2, ddr_regs + AR71XX_DDR_REG_CONTROL);
+		udelay(10);
+	}
+
+	if (memtype != AR934X_SDRAM)
+		writel(0x402, ddr_regs + AR71XX_DDR_REG_EMR);
+
+	udelay(100);
+
+	writel(0x2, ddr_regs + AR71XX_DDR_REG_CONTROL);
+	udelay(10);
+
+	writel(0x8, ddr_regs + AR71XX_DDR_REG_CONTROL);
+	udelay(10);
+
+	writel(memcfg->mode, ddr_regs + AR71XX_DDR_REG_MODE);
+	udelay(100);
+
+	writel(0x1, ddr_regs + AR71XX_DDR_REG_CONTROL);
+	udelay(10);
+
+	writel(0x412c /* FIXME */, ddr_regs + AR71XX_DDR_REG_REFRESH);
+	udelay(100);
+
+	writel(memcfg->tap, ddr_regs + AR71XX_DDR_REG_TAP_CTRL0);
+	writel(memcfg->tap, ddr_regs + AR71XX_DDR_REG_TAP_CTRL1);
+
+	if (memtype != AR934X_SDRAM) {
+		if ((gd->arch.rev && (reg & BIT(3))) || !gd->arch.rev) {
+			writel(memcfg->tap,
+			       ddr_regs + AR934X_DDR_REG_TAP_CTRL2);
+			writel(memcfg->tap,
+			       ddr_regs + AR934X_DDR_REG_TAP_CTRL3);
+		}
+	}
+
+	writel(cycle, ddr_regs + AR71XX_DDR_REG_RD_CYCLE);
+	udelay(100);
+
+	writel(0x74444444, ddr_regs + AR934X_DDR_REG_BURST);
+	udelay(100);
+
+	writel(0x222, ddr_regs + AR934X_DDR_REG_BURST2);
+	udelay(100);
+
+	writel(0xfffff, ddr_regs + AR934X_DDR_REG_TIMEOUT_MAX);
+	udelay(100);
+}
+
+void ddr_tap_tuning(void)
+{
+}
diff --git a/arch/mips/mach-ath79/cpu.c b/arch/mips/mach-ath79/cpu.c
new file mode 100644
index 0000000..5756a06
--- /dev/null
+++ b/arch/mips/mach-ath79/cpu.c
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ath79.h>
+#include <mach/ar71xx_regs.h>
+
+struct ath79_soc_desc {
+	const enum ath79_soc_type soc;
+	const char *chip;
+	const int major;
+	const int minor;
+};
+
+static const struct ath79_soc_desc desc[] = {
+	{ATH79_SOC_AR7130,      "7130",
+	 REV_ID_MAJOR_AR71XX,   AR71XX_REV_ID_MINOR_AR7130},
+	{ATH79_SOC_AR7141,      "7141",
+	 REV_ID_MAJOR_AR71XX,   AR71XX_REV_ID_MINOR_AR7141},
+	{ATH79_SOC_AR7161,      "7161",
+	 REV_ID_MAJOR_AR71XX,   AR71XX_REV_ID_MINOR_AR7161},
+	{ATH79_SOC_AR7240,      "7240", REV_ID_MAJOR_AR7240,    0},
+	{ATH79_SOC_AR7241,      "7241", REV_ID_MAJOR_AR7241,    0},
+	{ATH79_SOC_AR7242,      "7242", REV_ID_MAJOR_AR7242,    0},
+	{ATH79_SOC_AR9130,      "9130",
+	 REV_ID_MAJOR_AR913X,   AR913X_REV_ID_MINOR_AR9130},
+	{ATH79_SOC_AR9132,      "9132",
+	 REV_ID_MAJOR_AR913X,   AR913X_REV_ID_MINOR_AR9132},
+	{ATH79_SOC_AR9330,      "9330", REV_ID_MAJOR_AR9330,    0},
+	{ATH79_SOC_AR9331,      "9331", REV_ID_MAJOR_AR9331,    0},
+	{ATH79_SOC_AR9341,      "9341", REV_ID_MAJOR_AR9341,    0},
+	{ATH79_SOC_AR9342,      "9342", REV_ID_MAJOR_AR9342,    0},
+	{ATH79_SOC_AR9344,      "9344", REV_ID_MAJOR_AR9344,    0},
+	{ATH79_SOC_QCA9533,     "9533", REV_ID_MAJOR_QCA9533,   0},
+	{ATH79_SOC_QCA9533,     "9533",
+	 REV_ID_MAJOR_QCA9533_V2,       0},
+	{ATH79_SOC_QCA9556,     "9556", REV_ID_MAJOR_QCA9556,   0},
+	{ATH79_SOC_QCA9558,     "9558", REV_ID_MAJOR_QCA9558,   0},
+	{ATH79_SOC_TP9343,      "9343", REV_ID_MAJOR_TP9343,    0},
+	{ATH79_SOC_QCA9561,     "9561", REV_ID_MAJOR_QCA9561,   0},
+};
+
+int arch_cpu_init(void)
+{
+	void __iomem *base;
+	enum ath79_soc_type soc = ATH79_SOC_UNKNOWN;
+	u32 id, major, minor = 0;
+	u32 rev = 0, ver = 1;
+	int i;
+
+	base = map_physmem(AR71XX_RESET_BASE, AR71XX_RESET_SIZE,
+			   MAP_NOCACHE);
+
+	id = readl(base + AR71XX_RESET_REG_REV_ID);
+	major = id & REV_ID_MAJOR_MASK;
+	switch (major) {
+	case REV_ID_MAJOR_AR71XX:
+	case REV_ID_MAJOR_AR913X:
+		minor = id & AR71XX_REV_ID_MINOR_MASK;
+		rev = id >> AR71XX_REV_ID_REVISION_SHIFT;
+		rev &= AR71XX_REV_ID_REVISION_MASK;
+		break;
+
+	case REV_ID_MAJOR_QCA9533_V2:
+		ver = 2;
+		/* drop through */
+
+	case REV_ID_MAJOR_AR9341:
+	case REV_ID_MAJOR_AR9342:
+	case REV_ID_MAJOR_AR9344:
+	case REV_ID_MAJOR_QCA9533:
+	case REV_ID_MAJOR_QCA9556:
+	case REV_ID_MAJOR_QCA9558:
+	case REV_ID_MAJOR_TP9343:
+	case REV_ID_MAJOR_QCA9561:
+		rev = id & AR71XX_REV_ID_REVISION2_MASK;
+		break;
+	default:
+		rev = id & AR71XX_REV_ID_REVISION_MASK;
+		break;
+	}
+
+	for (i = 0; i < ARRAY_SIZE(desc); i++) {
+		if ((desc[i].major == major) &&
+		    (desc[i].minor == minor)) {
+			soc = desc[i].soc;
+			break;
+		}
+	}
+
+	gd->arch.id = id;
+	gd->arch.soc = soc;
+	gd->arch.rev = rev;
+	gd->arch.ver = ver;
+	return 0;
+}
+
+int print_cpuinfo(void)
+{
+	enum ath79_soc_type soc = ATH79_SOC_UNKNOWN;
+	const char *chip = "????";
+	u32 id, rev, ver;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(desc); i++) {
+		if (desc[i].soc == gd->arch.soc) {
+			chip = desc[i].chip;
+			soc = desc[i].soc;
+			break;
+		}
+	}
+
+	id = gd->arch.id;
+	rev = gd->arch.rev;
+	ver = gd->arch.ver;
+
+	switch (soc) {
+	case ATH79_SOC_QCA9533:
+	case ATH79_SOC_QCA9556:
+	case ATH79_SOC_QCA9558:
+	case ATH79_SOC_QCA9561:
+		printf("Qualcomm Atheros QCA%s ver %u rev %u\n", chip,
+		       ver, rev);
+		break;
+	case ATH79_SOC_TP9343:
+		printf("Qualcomm Atheros TP%s rev %u\n", chip, rev);
+		break;
+	case ATH79_SOC_UNKNOWN:
+		printf("ATH79: unknown SoC, id:0x%08x", id);
+		break;
+	default:
+		printf("Atheros AR%s rev %u\n", chip, rev);
+	}
+
+	return 0;
+}
diff --git a/arch/mips/mach-ath79/dram.c b/arch/mips/mach-ath79/dram.c
new file mode 100644
index 0000000..c29e98c
--- /dev/null
+++ b/arch/mips/mach-ath79/dram.c
@@ -0,0 +1,16 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <linux/sizes.h>
+#include <asm/addrspace.h>
+#include <mach/ddr.h>
+
+phys_size_t initdram(int board_type)
+{
+	ddr_tap_tuning();
+	return get_ram_size((void *)KSEG1, SZ_256M);
+}
diff --git a/arch/mips/mach-ath79/include/mach/ar71xx_regs.h b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
new file mode 100644
index 0000000..a8e51cb
--- /dev/null
+++ b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
@@ -0,0 +1,1263 @@
+/*
+ * Atheros AR71XX/AR724X/AR913X SoC register definitions
+ *
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ * Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com>
+ * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
+ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#ifndef __ASM_MACH_AR71XX_REGS_H
+#define __ASM_MACH_AR71XX_REGS_H
+
+#ifndef __ASSEMBLY__
+#include <linux/bitops.h>
+#else
+#ifndef BIT
+#define BIT(nr)		(1 << (nr))
+#endif
+#endif
+
+#define AR71XX_APB_BASE					0x18000000
+#define AR71XX_GE0_BASE					0x19000000
+#define AR71XX_GE0_SIZE					0x10000
+#define AR71XX_GE1_BASE					0x1a000000
+#define AR71XX_GE1_SIZE					0x10000
+#define AR71XX_EHCI_BASE				0x1b000000
+#define AR71XX_EHCI_SIZE				0x1000
+#define AR71XX_OHCI_BASE				0x1c000000
+#define AR71XX_OHCI_SIZE				0x1000
+#define AR71XX_SPI_BASE					0x1f000000
+#define AR71XX_SPI_SIZE					0x01000000
+
+#define AR71XX_DDR_CTRL_BASE \
+	(AR71XX_APB_BASE + 0x00000000)
+#define AR71XX_DDR_CTRL_SIZE				0x100
+#define AR71XX_UART_BASE \
+	(AR71XX_APB_BASE + 0x00020000)
+#define AR71XX_UART_SIZE				0x100
+#define AR71XX_USB_CTRL_BASE \
+	(AR71XX_APB_BASE + 0x00030000)
+#define AR71XX_USB_CTRL_SIZE				0x100
+#define AR71XX_GPIO_BASE \
+	(AR71XX_APB_BASE + 0x00040000)
+#define AR71XX_GPIO_SIZE				0x100
+#define AR71XX_PLL_BASE \
+	(AR71XX_APB_BASE + 0x00050000)
+#define AR71XX_PLL_SIZE					0x100
+#define AR71XX_RESET_BASE \
+	(AR71XX_APB_BASE + 0x00060000)
+#define AR71XX_RESET_SIZE				0x100
+#define AR71XX_MII_BASE \
+	(AR71XX_APB_BASE + 0x00070000)
+#define AR71XX_MII_SIZE					0x100
+
+#define AR71XX_PCI_MEM_BASE				0x10000000
+#define AR71XX_PCI_MEM_SIZE				0x07000000
+
+#define AR71XX_PCI_WIN0_OFFS				0x10000000
+#define AR71XX_PCI_WIN1_OFFS				0x11000000
+#define AR71XX_PCI_WIN2_OFFS				0x12000000
+#define AR71XX_PCI_WIN3_OFFS				0x13000000
+#define AR71XX_PCI_WIN4_OFFS				0x14000000
+#define AR71XX_PCI_WIN5_OFFS				0x15000000
+#define AR71XX_PCI_WIN6_OFFS				0x16000000
+#define AR71XX_PCI_WIN7_OFFS				0x07000000
+
+#define AR71XX_PCI_CFG_BASE \
+	(AR71XX_PCI_MEM_BASE + AR71XX_PCI_WIN7_OFFS + 0x10000)
+#define AR71XX_PCI_CFG_SIZE				0x100
+
+#define AR7240_USB_CTRL_BASE \
+	(AR71XX_APB_BASE + 0x00030000)
+#define AR7240_USB_CTRL_SIZE				0x100
+#define AR7240_OHCI_BASE				0x1b000000
+#define AR7240_OHCI_SIZE				0x1000
+
+#define AR724X_PCI_MEM_BASE				0x10000000
+#define AR724X_PCI_MEM_SIZE				0x04000000
+
+#define AR724X_PCI_CFG_BASE				0x14000000
+#define AR724X_PCI_CFG_SIZE				0x1000
+#define AR724X_PCI_CRP_BASE \
+	(AR71XX_APB_BASE + 0x000c0000)
+#define AR724X_PCI_CRP_SIZE				0x1000
+#define AR724X_PCI_CTRL_BASE \
+	(AR71XX_APB_BASE + 0x000f0000)
+#define AR724X_PCI_CTRL_SIZE				0x100
+
+#define AR724X_EHCI_BASE				0x1b000000
+#define AR724X_EHCI_SIZE				0x1000
+
+#define AR913X_EHCI_BASE				0x1b000000
+#define AR913X_EHCI_SIZE				0x1000
+#define AR913X_WMAC_BASE \
+	(AR71XX_APB_BASE + 0x000C0000)
+#define AR913X_WMAC_SIZE				0x30000
+
+#define AR933X_UART_BASE \
+	(AR71XX_APB_BASE + 0x00020000)
+#define AR933X_UART_SIZE				0x14
+#define AR933X_GMAC_BASE \
+	(AR71XX_APB_BASE + 0x00070000)
+#define AR933X_GMAC_SIZE				0x04
+#define AR933X_WMAC_BASE \
+	(AR71XX_APB_BASE + 0x00100000)
+#define AR933X_WMAC_SIZE				0x20000
+#define AR933X_RTC_BASE \
+	(AR71XX_APB_BASE + 0x00107000)
+#define AR933X_RTC_SIZE					0x1000
+#define AR933X_EHCI_BASE				0x1b000000
+#define AR933X_EHCI_SIZE				0x1000
+#define AR933X_SRIF_BASE \
+	(AR71XX_APB_BASE + 0x00116000)
+#define AR933X_SRIF_SIZE				0x1000
+
+#define AR934X_GMAC_BASE \
+	(AR71XX_APB_BASE + 0x00070000)
+#define AR934X_GMAC_SIZE				0x14
+#define AR934X_WMAC_BASE \
+	(AR71XX_APB_BASE + 0x00100000)
+#define AR934X_WMAC_SIZE				0x20000
+#define AR934X_EHCI_BASE				0x1b000000
+#define AR934X_EHCI_SIZE				0x200
+#define AR934X_NFC_BASE					0x1b000200
+#define AR934X_NFC_SIZE					0xb8
+#define AR934X_SRIF_BASE \
+	(AR71XX_APB_BASE + 0x00116000)
+#define AR934X_SRIF_SIZE				0x1000
+
+#define QCA953X_GMAC_BASE \
+	(AR71XX_APB_BASE + 0x00070000)
+#define QCA953X_GMAC_SIZE				0x14
+#define QCA953X_WMAC_BASE \
+	(AR71XX_APB_BASE + 0x00100000)
+#define QCA953X_WMAC_SIZE				0x20000
+#define QCA953X_RTC_BASE \
+	(AR71XX_APB_BASE + 0x00107000)
+#define QCA953X_RTC_SIZE				0x1000
+#define QCA953X_EHCI_BASE				0x1b000000
+#define QCA953X_EHCI_SIZE				0x200
+#define QCA953X_SRIF_BASE \
+	(AR71XX_APB_BASE + 0x00116000)
+#define QCA953X_SRIF_SIZE				0x1000
+
+#define QCA953X_PCI_CFG_BASE0				0x14000000
+#define QCA953X_PCI_CTRL_BASE0 \
+	(AR71XX_APB_BASE + 0x000f0000)
+#define QCA953X_PCI_CRP_BASE0 \
+	(AR71XX_APB_BASE + 0x000c0000)
+#define QCA953X_PCI_MEM_BASE0				0x10000000
+#define QCA953X_PCI_MEM_SIZE				0x02000000
+
+#define QCA955X_PCI_MEM_BASE0				0x10000000
+#define QCA955X_PCI_MEM_BASE1				0x12000000
+#define QCA955X_PCI_MEM_SIZE				0x02000000
+#define QCA955X_PCI_CFG_BASE0				0x14000000
+#define QCA955X_PCI_CFG_BASE1				0x16000000
+#define QCA955X_PCI_CFG_SIZE				0x1000
+#define QCA955X_PCI_CRP_BASE0 \
+	(AR71XX_APB_BASE + 0x000c0000)
+#define QCA955X_PCI_CRP_BASE1 \
+	(AR71XX_APB_BASE + 0x00250000)
+#define QCA955X_PCI_CRP_SIZE				0x1000
+#define QCA955X_PCI_CTRL_BASE0 \
+	(AR71XX_APB_BASE + 0x000f0000)
+#define QCA955X_PCI_CTRL_BASE1 \
+	(AR71XX_APB_BASE + 0x00280000)
+#define QCA955X_PCI_CTRL_SIZE				0x100
+
+#define QCA955X_GMAC_BASE \
+	(AR71XX_APB_BASE + 0x00070000)
+#define QCA955X_GMAC_SIZE				0x40
+#define QCA955X_WMAC_BASE \
+	(AR71XX_APB_BASE + 0x00100000)
+#define QCA955X_WMAC_SIZE				0x20000
+#define QCA955X_EHCI0_BASE				0x1b000000
+#define QCA955X_EHCI1_BASE				0x1b400000
+#define QCA955X_EHCI_SIZE				0x1000
+#define QCA955X_NFC_BASE				0x1b800200
+#define QCA955X_NFC_SIZE				0xb8
+
+#define QCA956X_PCI_MEM_BASE1				0x12000000
+#define QCA956X_PCI_MEM_SIZE				0x02000000
+#define QCA956X_PCI_CFG_BASE1				0x16000000
+#define QCA956X_PCI_CFG_SIZE				0x1000
+#define QCA956X_PCI_CRP_BASE1 \
+	(AR71XX_APB_BASE + 0x00250000)
+#define QCA956X_PCI_CRP_SIZE				0x1000
+#define QCA956X_PCI_CTRL_BASE1 \
+	(AR71XX_APB_BASE + 0x00280000)
+#define QCA956X_PCI_CTRL_SIZE				0x100
+
+#define QCA956X_WMAC_BASE \
+	(AR71XX_APB_BASE + 0x00100000)
+#define QCA956X_WMAC_SIZE				0x20000
+#define QCA956X_EHCI0_BASE				0x1b000000
+#define QCA956X_EHCI1_BASE				0x1b400000
+#define QCA956X_EHCI_SIZE				0x200
+#define QCA956X_GMAC_BASE \
+	(AR71XX_APB_BASE + 0x00070000)
+#define QCA956X_GMAC_SIZE				0x64
+
+/*
+ * DDR_CTRL block
+ */
+#define AR71XX_DDR_REG_CONFIG				0x00
+#define AR71XX_DDR_REG_CONFIG2				0x04
+#define AR71XX_DDR_REG_MODE				0x08
+#define AR71XX_DDR_REG_EMR				0x0c
+#define AR71XX_DDR_REG_CONTROL				0x10
+#define AR71XX_DDR_REG_REFRESH				0x14
+#define AR71XX_DDR_REG_RD_CYCLE				0x18
+#define AR71XX_DDR_REG_TAP_CTRL0			0x1c
+#define AR71XX_DDR_REG_TAP_CTRL1			0x20
+
+#define AR71XX_DDR_REG_PCI_WIN0				0x7c
+#define AR71XX_DDR_REG_PCI_WIN1				0x80
+#define AR71XX_DDR_REG_PCI_WIN2				0x84
+#define AR71XX_DDR_REG_PCI_WIN3				0x88
+#define AR71XX_DDR_REG_PCI_WIN4				0x8c
+#define AR71XX_DDR_REG_PCI_WIN5				0x90
+#define AR71XX_DDR_REG_PCI_WIN6				0x94
+#define AR71XX_DDR_REG_PCI_WIN7				0x98
+#define AR71XX_DDR_REG_FLUSH_GE0			0x9c
+#define AR71XX_DDR_REG_FLUSH_GE1			0xa0
+#define AR71XX_DDR_REG_FLUSH_USB			0xa4
+#define AR71XX_DDR_REG_FLUSH_PCI			0xa8
+
+#define AR724X_DDR_REG_FLUSH_GE0			0x7c
+#define AR724X_DDR_REG_FLUSH_GE1			0x80
+#define AR724X_DDR_REG_FLUSH_USB			0x84
+#define AR724X_DDR_REG_FLUSH_PCIE			0x88
+
+#define AR913X_DDR_REG_FLUSH_GE0			0x7c
+#define AR913X_DDR_REG_FLUSH_GE1			0x80
+#define AR913X_DDR_REG_FLUSH_USB			0x84
+#define AR913X_DDR_REG_FLUSH_WMAC			0x88
+
+#define AR933X_DDR_REG_FLUSH_GE0			0x7c
+#define AR933X_DDR_REG_FLUSH_GE1			0x80
+#define AR933X_DDR_REG_FLUSH_USB			0x84
+#define AR933X_DDR_REG_FLUSH_WMAC			0x88
+#define AR933X_DDR_REG_DDR2_CONFIG			0x8c
+#define AR933X_DDR_REG_EMR2				0x90
+#define AR933X_DDR_REG_EMR3				0x94
+#define AR933X_DDR_REG_BURST				0x98
+#define AR933X_DDR_REG_TIMEOUT_MAX			0x9c
+#define AR933X_DDR_REG_TIMEOUT_CNT			0x9c
+#define AR933X_DDR_REG_TIMEOUT_ADDR			0x9c
+
+#define AR934X_DDR_REG_TAP_CTRL2			0x24
+#define AR934X_DDR_REG_TAP_CTRL3			0x28
+#define AR934X_DDR_REG_FLUSH_GE0			0x9c
+#define AR934X_DDR_REG_FLUSH_GE1			0xa0
+#define AR934X_DDR_REG_FLUSH_USB			0xa4
+#define AR934X_DDR_REG_FLUSH_PCIE			0xa8
+#define AR934X_DDR_REG_FLUSH_WMAC			0xac
+#define AR934X_DDR_REG_FLUSH_SRC1			0xb0
+#define AR934X_DDR_REG_FLUSH_SRC2			0xb4
+#define AR934X_DDR_REG_DDR2_CONFIG			0xb8
+#define AR934X_DDR_REG_EMR2				0xbc
+#define AR934X_DDR_REG_EMR3				0xc0
+#define AR934X_DDR_REG_BURST				0xc4
+#define AR934X_DDR_REG_BURST2				0xc8
+#define AR934X_DDR_REG_TIMEOUT_MAX			0xcc
+#define AR934X_DDR_REG_CTL_CONF				0x108
+
+#define QCA953X_DDR_REG_FLUSH_GE0			0x9c
+#define QCA953X_DDR_REG_FLUSH_GE1			0xa0
+#define QCA953X_DDR_REG_FLUSH_USB			0xa4
+#define QCA953X_DDR_REG_FLUSH_PCIE			0xa8
+#define QCA953X_DDR_REG_FLUSH_WMAC			0xac
+#define QCA953X_DDR_REG_DDR2_CONFIG			0xb8
+#define QCA953X_DDR_REG_BURST				0xc4
+#define QCA953X_DDR_REG_BURST2				0xc8
+#define QCA953X_DDR_REG_TIMEOUT_MAX			0xcc
+#define QCA953X_DDR_REG_CTL_CONF			0x108
+#define QCA953X_DDR_REG_CONFIG3				0x15c
+
+/*
+ * PLL block
+ */
+#define AR71XX_PLL_REG_CPU_CONFIG			0x00
+#define AR71XX_PLL_REG_SEC_CONFIG			0x04
+#define AR71XX_PLL_REG_ETH0_INT_CLOCK			0x10
+#define AR71XX_PLL_REG_ETH1_INT_CLOCK			0x14
+
+#define AR71XX_PLL_DIV_SHIFT				3
+#define AR71XX_PLL_DIV_MASK				0x1f
+#define AR71XX_CPU_DIV_SHIFT				16
+#define AR71XX_CPU_DIV_MASK				0x3
+#define AR71XX_DDR_DIV_SHIFT				18
+#define AR71XX_DDR_DIV_MASK				0x3
+#define AR71XX_AHB_DIV_SHIFT				20
+#define AR71XX_AHB_DIV_MASK				0x7
+
+#define AR71XX_ETH0_PLL_SHIFT				17
+#define AR71XX_ETH1_PLL_SHIFT				19
+
+#define AR724X_PLL_REG_CPU_CONFIG			0x00
+#define AR724X_PLL_REG_PCIE_CONFIG			0x18
+
+#define AR724X_PLL_DIV_SHIFT				0
+#define AR724X_PLL_DIV_MASK				0x3ff
+#define AR724X_PLL_REF_DIV_SHIFT			10
+#define AR724X_PLL_REF_DIV_MASK				0xf
+#define AR724X_AHB_DIV_SHIFT				19
+#define AR724X_AHB_DIV_MASK				0x1
+#define AR724X_DDR_DIV_SHIFT				22
+#define AR724X_DDR_DIV_MASK				0x3
+
+#define AR7242_PLL_REG_ETH0_INT_CLOCK			0x2c
+
+#define AR913X_PLL_REG_CPU_CONFIG			0x00
+#define AR913X_PLL_REG_ETH_CONFIG			0x04
+#define AR913X_PLL_REG_ETH0_INT_CLOCK			0x14
+#define AR913X_PLL_REG_ETH1_INT_CLOCK			0x18
+
+#define AR913X_PLL_DIV_SHIFT				0
+#define AR913X_PLL_DIV_MASK				0x3ff
+#define AR913X_DDR_DIV_SHIFT				22
+#define AR913X_DDR_DIV_MASK				0x3
+#define AR913X_AHB_DIV_SHIFT				19
+#define AR913X_AHB_DIV_MASK				0x1
+
+#define AR913X_ETH0_PLL_SHIFT				20
+#define AR913X_ETH1_PLL_SHIFT				22
+
+#define AR933X_PLL_CPU_CONFIG_REG			0x00
+#define AR933X_PLL_CLK_CTRL_REG				0x08
+#define AR933X_PLL_DITHER_FRAC_REG			0x10
+
+#define AR933X_PLL_CPU_CONFIG_NINT_SHIFT		10
+#define AR933X_PLL_CPU_CONFIG_NINT_MASK			0x3f
+#define AR933X_PLL_CPU_CONFIG_REFDIV_SHIFT		16
+#define AR933X_PLL_CPU_CONFIG_REFDIV_MASK		0x1f
+#define AR933X_PLL_CPU_CONFIG_OUTDIV_SHIFT		23
+#define AR933X_PLL_CPU_CONFIG_OUTDIV_MASK		0x7
+
+#define AR933X_PLL_CLK_CTRL_BYPASS			BIT(2)
+#define AR933X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT		5
+#define AR933X_PLL_CLK_CTRL_CPU_POST_DIV_MASK		0x3
+#define AR933X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT		10
+#define AR933X_PLL_CLK_CTRL_DDR_POST_DIV_MASK		0x3
+#define AR933X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT		15
+#define AR933X_PLL_CLK_CTRL_AHB_POST_DIV_MASK		0x7
+
+#define AR934X_PLL_CPU_CONFIG_REG			0x00
+#define AR934X_PLL_DDR_CONFIG_REG			0x04
+#define AR934X_PLL_CPU_DDR_CLK_CTRL_REG			0x08
+#define AR934X_PLL_SWITCH_CLOCK_CONTROL_REG		0x24
+#define AR934X_PLL_ETH_XMII_CONTROL_REG			0x2c
+#define AR934X_PLL_DDR_DIT_FRAC_REG			0x44
+#define AR934X_PLL_CPU_DIT_FRAC_REG			0x48
+
+#define AR934X_PLL_CPU_CONFIG_NFRAC_SHIFT		0
+#define AR934X_PLL_CPU_CONFIG_NFRAC_MASK		0x3f
+#define AR934X_PLL_CPU_CONFIG_NINT_SHIFT		6
+#define AR934X_PLL_CPU_CONFIG_NINT_MASK			0x3f
+#define AR934X_PLL_CPU_CONFIG_REFDIV_SHIFT		12
+#define AR934X_PLL_CPU_CONFIG_REFDIV_MASK		0x1f
+#define AR934X_PLL_CPU_CONFIG_RANGE_SHIFT		17
+#define AR934X_PLL_CPU_CONFIG_RANGE_MASK		0x3
+#define AR934X_PLL_CPU_CONFIG_OUTDIV_SHIFT		19
+#define AR934X_PLL_CPU_CONFIG_OUTDIV_MASK		0x3
+#define AR934X_PLL_CPU_CONFIG_PLLPWD			BIT(30)
+#define AR934X_PLL_CPU_CONFIG_UPDATING			BIT(31)
+
+#define AR934X_PLL_DDR_CONFIG_NFRAC_SHIFT		0
+#define AR934X_PLL_DDR_CONFIG_NFRAC_MASK		0x3ff
+#define AR934X_PLL_DDR_CONFIG_NINT_SHIFT		10
+#define AR934X_PLL_DDR_CONFIG_NINT_MASK			0x3f
+#define AR934X_PLL_DDR_CONFIG_REFDIV_SHIFT		16
+#define AR934X_PLL_DDR_CONFIG_REFDIV_MASK		0x1f
+#define AR934X_PLL_DDR_CONFIG_RANGE_SHIFT		21
+#define AR934X_PLL_DDR_CONFIG_RANGE_MASK		0x3
+#define AR934X_PLL_DDR_CONFIG_OUTDIV_SHIFT		23
+#define AR934X_PLL_DDR_CONFIG_OUTDIV_MASK		0x7
+#define AR934X_PLL_DDR_CONFIG_PLLPWD			BIT(30)
+#define AR934X_PLL_DDR_CONFIG_UPDATING			BIT(31)
+
+#define AR934X_PLL_CLK_CTRL_CPU_PLL_BYPASS		BIT(2)
+#define AR934X_PLL_CLK_CTRL_DDR_PLL_BYPASS		BIT(3)
+#define AR934X_PLL_CLK_CTRL_AHB_PLL_BYPASS		BIT(4)
+#define AR934X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT		5
+#define AR934X_PLL_CLK_CTRL_CPU_POST_DIV_MASK		0x1f
+#define AR934X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT		10
+#define AR934X_PLL_CLK_CTRL_DDR_POST_DIV_MASK		0x1f
+#define AR934X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT		15
+#define AR934X_PLL_CLK_CTRL_AHB_POST_DIV_MASK		0x1f
+#define AR934X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL		BIT(20)
+#define AR934X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL		BIT(21)
+#define AR934X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL		BIT(24)
+
+#define AR934X_PLL_SWITCH_CLK_CTRL_MDIO_CLK_SEL		BIT(6)
+
+#define AR934X_PLL_DDR_DIT_FRAC_MAX_SHIFT		0
+#define AR934X_PLL_DDR_DIT_FRAC_MAX_MASK		0x3ff
+#define AR934X_PLL_DDR_DIT_FRAC_MIN_SHIFT		10
+#define AR934X_PLL_DDR_DIT_FRAC_MIN_MASK		0x3ff
+#define AR934X_PLL_DDR_DIT_FRAC_STEP_SHIFT		20
+#define AR934X_PLL_DDR_DIT_FRAC_STEP_MASK		0x3f
+#define AR934X_PLL_DDR_DIT_UPD_CNT_SHIFT		27
+#define AR934X_PLL_DDR_DIT_UPD_CNT_MASK			0x3f
+#define AR934X_PLL_DDR_DIT_DITHER_EN			BIT(31)
+
+#define AR934X_PLL_CPU_DIT_FRAC_MAX_SHIFT		0
+#define AR934X_PLL_CPU_DIT_FRAC_MAX_MASK		0x3f
+#define AR934X_PLL_CPU_DIT_FRAC_MIN_SHIFT		6
+#define AR934X_PLL_CPU_DIT_FRAC_MIN_MASK		0x3f
+#define AR934X_PLL_CPU_DIT_FRAC_STEP_SHIFT		12
+#define AR934X_PLL_CPU_DIT_FRAC_STEP_MASK		0x3f
+#define AR934X_PLL_CPU_DIT_UPD_CNT_SHIFT		18
+#define AR934X_PLL_CPU_DIT_UPD_CNT_MASK			0x3f
+#define AR934X_PLL_CPU_DIT_DITHER_EN			BIT(31)
+
+#define QCA953X_PLL_CPU_CONFIG_REG			0x00
+#define QCA953X_PLL_DDR_CONFIG_REG			0x04
+#define QCA953X_PLL_CLK_CTRL_REG			0x08
+#define QCA953X_PLL_SWITCH_CLOCK_CONTROL_REG		0x24
+#define QCA953X_PLL_ETH_XMII_CONTROL_REG		0x2c
+#define QCA953X_PLL_DDR_DIT_FRAC_REG			0x44
+#define QCA953X_PLL_CPU_DIT_FRAC_REG			0x48
+
+#define QCA953X_PLL_CPU_CONFIG_NFRAC_SHIFT		0
+#define QCA953X_PLL_CPU_CONFIG_NFRAC_MASK		0x3f
+#define QCA953X_PLL_CPU_CONFIG_NINT_SHIFT		6
+#define QCA953X_PLL_CPU_CONFIG_NINT_MASK		0x3f
+#define QCA953X_PLL_CPU_CONFIG_REFDIV_SHIFT		12
+#define QCA953X_PLL_CPU_CONFIG_REFDIV_MASK		0x1f
+#define QCA953X_PLL_CPU_CONFIG_OUTDIV_SHIFT		19
+#define QCA953X_PLL_CPU_CONFIG_OUTDIV_MASK		0x7
+
+#define QCA953X_PLL_DDR_CONFIG_NFRAC_SHIFT		0
+#define QCA953X_PLL_DDR_CONFIG_NFRAC_MASK		0x3ff
+#define QCA953X_PLL_DDR_CONFIG_NINT_SHIFT		10
+#define QCA953X_PLL_DDR_CONFIG_NINT_MASK		0x3f
+#define QCA953X_PLL_DDR_CONFIG_REFDIV_SHIFT		16
+#define QCA953X_PLL_DDR_CONFIG_REFDIV_MASK		0x1f
+#define QCA953X_PLL_DDR_CONFIG_OUTDIV_SHIFT		23
+#define QCA953X_PLL_DDR_CONFIG_OUTDIV_MASK		0x7
+
+#define QCA953X_PLL_CONFIG_PWD		BIT(30)
+
+#define QCA953X_PLL_CLK_CTRL_CPU_PLL_BYPASS		BIT(2)
+#define QCA953X_PLL_CLK_CTRL_DDR_PLL_BYPASS		BIT(3)
+#define QCA953X_PLL_CLK_CTRL_AHB_PLL_BYPASS		BIT(4)
+#define QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT		5
+#define QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_MASK		0x1f
+#define QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT		10
+#define QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_MASK		0x1f
+#define QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT		15
+#define QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_MASK		0x1f
+#define QCA953X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL		BIT(20)
+#define QCA953X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL		BIT(21)
+#define QCA953X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL		BIT(24)
+
+#define QCA953X_PLL_CPU_DIT_FRAC_MAX_SHIFT		0
+#define QCA953X_PLL_CPU_DIT_FRAC_MAX_MASK		0x3f
+#define QCA953X_PLL_CPU_DIT_FRAC_MIN_SHIFT		6
+#define QCA953X_PLL_CPU_DIT_FRAC_MIN_MASK		0x3f
+#define QCA953X_PLL_CPU_DIT_FRAC_STEP_SHIFT		12
+#define QCA953X_PLL_CPU_DIT_FRAC_STEP_MASK		0x3f
+#define QCA953X_PLL_CPU_DIT_UPD_CNT_SHIFT		18
+#define QCA953X_PLL_CPU_DIT_UPD_CNT_MASK		0x3f
+
+#define QCA953X_PLL_DDR_DIT_FRAC_MAX_SHIFT		0
+#define QCA953X_PLL_DDR_DIT_FRAC_MAX_MASK		0x3ff
+#define QCA953X_PLL_DDR_DIT_FRAC_MIN_SHIFT		9
+#define QCA953X_PLL_DDR_DIT_FRAC_MIN_MASK		0x3ff
+#define QCA953X_PLL_DDR_DIT_FRAC_STEP_SHIFT		20
+#define QCA953X_PLL_DDR_DIT_FRAC_STEP_MASK		0x3f
+#define QCA953X_PLL_DDR_DIT_UPD_CNT_SHIFT		27
+#define QCA953X_PLL_DDR_DIT_UPD_CNT_MASK		0x3f
+
+#define QCA953X_PLL_DIT_FRAC_EN				BIT(31)
+
+#define QCA955X_PLL_CPU_CONFIG_REG			0x00
+#define QCA955X_PLL_DDR_CONFIG_REG			0x04
+#define QCA955X_PLL_CLK_CTRL_REG			0x08
+#define QCA955X_PLL_ETH_XMII_CONTROL_REG		0x28
+#define QCA955X_PLL_ETH_SGMII_CONTROL_REG		0x48
+
+#define QCA955X_PLL_CPU_CONFIG_NFRAC_SHIFT		0
+#define QCA955X_PLL_CPU_CONFIG_NFRAC_MASK		0x3f
+#define QCA955X_PLL_CPU_CONFIG_NINT_SHIFT		6
+#define QCA955X_PLL_CPU_CONFIG_NINT_MASK		0x3f
+#define QCA955X_PLL_CPU_CONFIG_REFDIV_SHIFT		12
+#define QCA955X_PLL_CPU_CONFIG_REFDIV_MASK		0x1f
+#define QCA955X_PLL_CPU_CONFIG_OUTDIV_SHIFT		19
+#define QCA955X_PLL_CPU_CONFIG_OUTDIV_MASK		0x3
+
+#define QCA955X_PLL_DDR_CONFIG_NFRAC_SHIFT		0
+#define QCA955X_PLL_DDR_CONFIG_NFRAC_MASK		0x3ff
+#define QCA955X_PLL_DDR_CONFIG_NINT_SHIFT		10
+#define QCA955X_PLL_DDR_CONFIG_NINT_MASK		0x3f
+#define QCA955X_PLL_DDR_CONFIG_REFDIV_SHIFT		16
+#define QCA955X_PLL_DDR_CONFIG_REFDIV_MASK		0x1f
+#define QCA955X_PLL_DDR_CONFIG_OUTDIV_SHIFT		23
+#define QCA955X_PLL_DDR_CONFIG_OUTDIV_MASK		0x7
+
+#define QCA955X_PLL_CLK_CTRL_CPU_PLL_BYPASS		BIT(2)
+#define QCA955X_PLL_CLK_CTRL_DDR_PLL_BYPASS		BIT(3)
+#define QCA955X_PLL_CLK_CTRL_AHB_PLL_BYPASS		BIT(4)
+#define QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT		5
+#define QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_MASK		0x1f
+#define QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT		10
+#define QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_MASK		0x1f
+#define QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT		15
+#define QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_MASK		0x1f
+#define QCA955X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL		BIT(20)
+#define QCA955X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL		BIT(21)
+#define QCA955X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL		BIT(24)
+
+#define QCA956X_PLL_CPU_CONFIG_REG			0x00
+#define QCA956X_PLL_CPU_CONFIG1_REG			0x04
+#define QCA956X_PLL_DDR_CONFIG_REG			0x08
+#define QCA956X_PLL_DDR_CONFIG1_REG			0x0c
+#define QCA956X_PLL_CLK_CTRL_REG			0x10
+
+#define QCA956X_PLL_CPU_CONFIG_REFDIV_SHIFT		12
+#define QCA956X_PLL_CPU_CONFIG_REFDIV_MASK		0x1f
+#define QCA956X_PLL_CPU_CONFIG_OUTDIV_SHIFT		19
+#define QCA956X_PLL_CPU_CONFIG_OUTDIV_MASK		0x7
+
+#define QCA956X_PLL_CPU_CONFIG1_NFRAC_L_SHIFT		0
+#define QCA956X_PLL_CPU_CONFIG1_NFRAC_L_MASK		0x1f
+#define QCA956X_PLL_CPU_CONFIG1_NFRAC_H_SHIFT		5
+#define QCA956X_PLL_CPU_CONFIG1_NFRAC_H_MASK		0x3fff
+#define QCA956X_PLL_CPU_CONFIG1_NINT_SHIFT		18
+#define QCA956X_PLL_CPU_CONFIG1_NINT_MASK		0x1ff
+
+#define QCA956X_PLL_DDR_CONFIG_REFDIV_SHIFT		16
+#define QCA956X_PLL_DDR_CONFIG_REFDIV_MASK		0x1f
+#define QCA956X_PLL_DDR_CONFIG_OUTDIV_SHIFT		23
+#define QCA956X_PLL_DDR_CONFIG_OUTDIV_MASK		0x7
+
+#define QCA956X_PLL_DDR_CONFIG1_NFRAC_L_SHIFT		0
+#define QCA956X_PLL_DDR_CONFIG1_NFRAC_L_MASK		0x1f
+#define QCA956X_PLL_DDR_CONFIG1_NFRAC_H_SHIFT		5
+#define QCA956X_PLL_DDR_CONFIG1_NFRAC_H_MASK		0x3fff
+#define QCA956X_PLL_DDR_CONFIG1_NINT_SHIFT		18
+#define QCA956X_PLL_DDR_CONFIG1_NINT_MASK		0x1ff
+
+#define QCA956X_PLL_CLK_CTRL_CPU_PLL_BYPASS		BIT(2)
+#define QCA956X_PLL_CLK_CTRL_DDR_PLL_BYPASS		BIT(3)
+#define QCA956X_PLL_CLK_CTRL_AHB_PLL_BYPASS		BIT(4)
+#define QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT		5
+#define QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_MASK		0x1f
+#define QCA956X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT		10
+#define QCA956X_PLL_CLK_CTRL_DDR_POST_DIV_MASK		0x1f
+#define QCA956X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT		15
+#define QCA956X_PLL_CLK_CTRL_AHB_POST_DIV_MASK		0x1f
+#define QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_DDRPLL	BIT(20)
+#define QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_CPUPLL	BIT(21)
+#define QCA956X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL		BIT(24)
+
+/*
+ * USB_CONFIG block
+ */
+#define AR71XX_USB_CTRL_REG_FLADJ			0x00
+#define AR71XX_USB_CTRL_REG_CONFIG			0x04
+
+/*
+ * RESET block
+ */
+#define AR71XX_RESET_REG_TIMER				0x00
+#define AR71XX_RESET_REG_TIMER_RELOAD			0x04
+#define AR71XX_RESET_REG_WDOG_CTRL			0x08
+#define AR71XX_RESET_REG_WDOG				0x0c
+#define AR71XX_RESET_REG_MISC_INT_STATUS		0x10
+#define AR71XX_RESET_REG_MISC_INT_ENABLE		0x14
+#define AR71XX_RESET_REG_PCI_INT_STATUS			0x18
+#define AR71XX_RESET_REG_PCI_INT_ENABLE			0x1c
+#define AR71XX_RESET_REG_GLOBAL_INT_STATUS		0x20
+#define AR71XX_RESET_REG_RESET_MODULE			0x24
+#define AR71XX_RESET_REG_PERFC_CTRL			0x2c
+#define AR71XX_RESET_REG_PERFC0				0x30
+#define AR71XX_RESET_REG_PERFC1				0x34
+#define AR71XX_RESET_REG_REV_ID				0x90
+
+#define AR913X_RESET_REG_GLOBAL_INT_STATUS		0x18
+#define AR913X_RESET_REG_RESET_MODULE			0x1c
+#define AR913X_RESET_REG_PERF_CTRL			0x20
+#define AR913X_RESET_REG_PERFC0				0x24
+#define AR913X_RESET_REG_PERFC1				0x28
+
+#define AR724X_RESET_REG_RESET_MODULE			0x1c
+
+#define AR933X_RESET_REG_RESET_MODULE			0x1c
+#define AR933X_RESET_REG_BOOTSTRAP			0xac
+
+#define AR934X_RESET_REG_RESET_MODULE			0x1c
+#define AR934X_RESET_REG_BOOTSTRAP			0xb0
+#define AR934X_RESET_REG_PCIE_WMAC_INT_STATUS		0xac
+
+#define QCA953X_RESET_REG_RESET_MODULE			0x1c
+#define QCA953X_RESET_REG_BOOTSTRAP			0xb0
+#define QCA953X_RESET_REG_PCIE_WMAC_INT_STATUS		0xac
+
+#define QCA955X_RESET_REG_RESET_MODULE			0x1c
+#define QCA955X_RESET_REG_BOOTSTRAP			0xb0
+#define QCA955X_RESET_REG_EXT_INT_STATUS		0xac
+
+#define QCA956X_RESET_REG_RESET_MODULE			0x1c
+#define QCA956X_RESET_REG_BOOTSTRAP			0xb0
+#define QCA956X_RESET_REG_EXT_INT_STATUS		0xac
+
+#define MISC_INT_MIPS_SI_TIMERINT_MASK			BIT(28)
+#define MISC_INT_ETHSW					BIT(12)
+#define MISC_INT_TIMER4					BIT(10)
+#define MISC_INT_TIMER3					BIT(9)
+#define MISC_INT_TIMER2					BIT(8)
+#define MISC_INT_DMA					BIT(7)
+#define MISC_INT_OHCI					BIT(6)
+#define MISC_INT_PERFC					BIT(5)
+#define MISC_INT_WDOG					BIT(4)
+#define MISC_INT_UART					BIT(3)
+#define MISC_INT_GPIO					BIT(2)
+#define MISC_INT_ERROR					BIT(1)
+#define MISC_INT_TIMER					BIT(0)
+
+#define AR71XX_RESET_EXTERNAL				BIT(28)
+#define AR71XX_RESET_FULL_CHIP				BIT(24)
+#define AR71XX_RESET_CPU_NMI				BIT(21)
+#define AR71XX_RESET_CPU_COLD				BIT(20)
+#define AR71XX_RESET_DMA				BIT(19)
+#define AR71XX_RESET_SLIC				BIT(18)
+#define AR71XX_RESET_STEREO				BIT(17)
+#define AR71XX_RESET_DDR				BIT(16)
+#define AR71XX_RESET_GE1_MAC				BIT(13)
+#define AR71XX_RESET_GE1_PHY				BIT(12)
+#define AR71XX_RESET_USBSUS_OVERRIDE			BIT(10)
+#define AR71XX_RESET_GE0_MAC				BIT(9)
+#define AR71XX_RESET_GE0_PHY				BIT(8)
+#define AR71XX_RESET_USB_OHCI_DLL			BIT(6)
+#define AR71XX_RESET_USB_HOST				BIT(5)
+#define AR71XX_RESET_USB_PHY				BIT(4)
+#define AR71XX_RESET_PCI_BUS				BIT(1)
+#define AR71XX_RESET_PCI_CORE				BIT(0)
+
+#define AR7240_RESET_USB_HOST				BIT(5)
+#define AR7240_RESET_OHCI_DLL				BIT(3)
+
+#define AR724X_RESET_GE1_MDIO				BIT(23)
+#define AR724X_RESET_GE0_MDIO				BIT(22)
+#define AR724X_RESET_PCIE_PHY_SERIAL			BIT(10)
+#define AR724X_RESET_PCIE_PHY				BIT(7)
+#define AR724X_RESET_PCIE				BIT(6)
+#define AR724X_RESET_USB_HOST				BIT(5)
+#define AR724X_RESET_USB_PHY				BIT(4)
+#define AR724X_RESET_USBSUS_OVERRIDE			BIT(3)
+
+#define AR913X_RESET_AMBA2WMAC				BIT(22)
+#define AR913X_RESET_USBSUS_OVERRIDE			BIT(10)
+#define AR913X_RESET_USB_HOST				BIT(5)
+#define AR913X_RESET_USB_PHY				BIT(4)
+
+#define AR933X_RESET_GE1_MDIO				BIT(23)
+#define AR933X_RESET_GE0_MDIO				BIT(22)
+#define AR933X_RESET_GE1_MAC				BIT(13)
+#define AR933X_RESET_WMAC				BIT(11)
+#define AR933X_RESET_GE0_MAC				BIT(9)
+#define AR933X_RESET_ETH_SWITCH				BIT(8)
+#define AR933X_RESET_USB_HOST				BIT(5)
+#define AR933X_RESET_USB_PHY				BIT(4)
+#define AR933X_RESET_USBSUS_OVERRIDE			BIT(3)
+
+#define AR934X_RESET_HOST				BIT(31)
+#define AR934X_RESET_SLIC				BIT(30)
+#define AR934X_RESET_HDMA				BIT(29)
+#define AR934X_RESET_EXTERNAL				BIT(28)
+#define AR934X_RESET_RTC				BIT(27)
+#define AR934X_RESET_PCIE_EP_INT			BIT(26)
+#define AR934X_RESET_CHKSUM_ACC				BIT(25)
+#define AR934X_RESET_FULL_CHIP				BIT(24)
+#define AR934X_RESET_GE1_MDIO				BIT(23)
+#define AR934X_RESET_GE0_MDIO				BIT(22)
+#define AR934X_RESET_CPU_NMI				BIT(21)
+#define AR934X_RESET_CPU_COLD				BIT(20)
+#define AR934X_RESET_HOST_RESET_INT			BIT(19)
+#define AR934X_RESET_PCIE_EP				BIT(18)
+#define AR934X_RESET_UART1				BIT(17)
+#define AR934X_RESET_DDR				BIT(16)
+#define AR934X_RESET_USB_PHY_PLL_PWD_EXT		BIT(15)
+#define AR934X_RESET_NANDF				BIT(14)
+#define AR934X_RESET_GE1_MAC				BIT(13)
+#define AR934X_RESET_ETH_SWITCH_ANALOG			BIT(12)
+#define AR934X_RESET_USB_PHY_ANALOG			BIT(11)
+#define AR934X_RESET_HOST_DMA_INT			BIT(10)
+#define AR934X_RESET_GE0_MAC				BIT(9)
+#define AR934X_RESET_ETH_SWITCH				BIT(8)
+#define AR934X_RESET_PCIE_PHY				BIT(7)
+#define AR934X_RESET_PCIE				BIT(6)
+#define AR934X_RESET_USB_HOST				BIT(5)
+#define AR934X_RESET_USB_PHY				BIT(4)
+#define AR934X_RESET_USBSUS_OVERRIDE			BIT(3)
+#define AR934X_RESET_LUT				BIT(2)
+#define AR934X_RESET_MBOX				BIT(1)
+#define AR934X_RESET_I2S				BIT(0)
+
+#define QCA953X_RESET_USB_EXT_PWR			BIT(29)
+#define QCA953X_RESET_EXTERNAL				BIT(28)
+#define QCA953X_RESET_RTC				BIT(27)
+#define QCA953X_RESET_FULL_CHIP				BIT(24)
+#define QCA953X_RESET_GE1_MDIO				BIT(23)
+#define QCA953X_RESET_GE0_MDIO				BIT(22)
+#define QCA953X_RESET_CPU_NMI				BIT(21)
+#define QCA953X_RESET_CPU_COLD				BIT(20)
+#define QCA953X_RESET_DDR				BIT(16)
+#define QCA953X_RESET_USB_PHY_PLL_PWD_EXT		BIT(15)
+#define QCA953X_RESET_GE1_MAC				BIT(13)
+#define QCA953X_RESET_ETH_SWITCH_ANALOG			BIT(12)
+#define QCA953X_RESET_USB_PHY_ANALOG			BIT(11)
+#define QCA953X_RESET_GE0_MAC				BIT(9)
+#define QCA953X_RESET_ETH_SWITCH			BIT(8)
+#define QCA953X_RESET_PCIE_PHY				BIT(7)
+#define QCA953X_RESET_PCIE				BIT(6)
+#define QCA953X_RESET_USB_HOST				BIT(5)
+#define QCA953X_RESET_USB_PHY				BIT(4)
+#define QCA953X_RESET_USBSUS_OVERRIDE			BIT(3)
+
+#define QCA955X_RESET_HOST				BIT(31)
+#define QCA955X_RESET_SLIC				BIT(30)
+#define QCA955X_RESET_HDMA				BIT(29)
+#define QCA955X_RESET_EXTERNAL				BIT(28)
+#define QCA955X_RESET_RTC				BIT(27)
+#define QCA955X_RESET_PCIE_EP_INT			BIT(26)
+#define QCA955X_RESET_CHKSUM_ACC			BIT(25)
+#define QCA955X_RESET_FULL_CHIP				BIT(24)
+#define QCA955X_RESET_GE1_MDIO				BIT(23)
+#define QCA955X_RESET_GE0_MDIO				BIT(22)
+#define QCA955X_RESET_CPU_NMI				BIT(21)
+#define QCA955X_RESET_CPU_COLD				BIT(20)
+#define QCA955X_RESET_HOST_RESET_INT			BIT(19)
+#define QCA955X_RESET_PCIE_EP				BIT(18)
+#define QCA955X_RESET_UART1				BIT(17)
+#define QCA955X_RESET_DDR				BIT(16)
+#define QCA955X_RESET_USB_PHY_PLL_PWD_EXT		BIT(15)
+#define QCA955X_RESET_NANDF				BIT(14)
+#define QCA955X_RESET_GE1_MAC				BIT(13)
+#define QCA955X_RESET_SGMII_ANALOG			BIT(12)
+#define QCA955X_RESET_USB_PHY_ANALOG			BIT(11)
+#define QCA955X_RESET_HOST_DMA_INT			BIT(10)
+#define QCA955X_RESET_GE0_MAC				BIT(9)
+#define QCA955X_RESET_SGMII				BIT(8)
+#define QCA955X_RESET_PCIE_PHY				BIT(7)
+#define QCA955X_RESET_PCIE				BIT(6)
+#define QCA955X_RESET_USB_HOST				BIT(5)
+#define QCA955X_RESET_USB_PHY				BIT(4)
+#define QCA955X_RESET_USBSUS_OVERRIDE			BIT(3)
+#define QCA955X_RESET_LUT				BIT(2)
+#define QCA955X_RESET_MBOX				BIT(1)
+#define QCA955X_RESET_I2S				BIT(0)
+
+#define AR933X_BOOTSTRAP_MDIO_GPIO_EN			BIT(18)
+#define AR933X_BOOTSTRAP_DDR2				BIT(13)
+#define AR933X_BOOTSTRAP_EEPBUSY			BIT(4)
+#define AR933X_BOOTSTRAP_REF_CLK_40			BIT(0)
+
+#define AR934X_BOOTSTRAP_SW_OPTION8			BIT(23)
+#define AR934X_BOOTSTRAP_SW_OPTION7			BIT(22)
+#define AR934X_BOOTSTRAP_SW_OPTION6			BIT(21)
+#define AR934X_BOOTSTRAP_SW_OPTION5			BIT(20)
+#define AR934X_BOOTSTRAP_SW_OPTION4			BIT(19)
+#define AR934X_BOOTSTRAP_SW_OPTION3			BIT(18)
+#define AR934X_BOOTSTRAP_SW_OPTION2			BIT(17)
+#define AR934X_BOOTSTRAP_SW_OPTION1			BIT(16)
+#define AR934X_BOOTSTRAP_USB_MODE_DEVICE		BIT(7)
+#define AR934X_BOOTSTRAP_PCIE_RC			BIT(6)
+#define AR934X_BOOTSTRAP_EJTAG_MODE			BIT(5)
+#define AR934X_BOOTSTRAP_REF_CLK_40			BIT(4)
+#define AR934X_BOOTSTRAP_BOOT_FROM_SPI			BIT(2)
+#define AR934X_BOOTSTRAP_SDRAM_DISABLED			BIT(1)
+#define AR934X_BOOTSTRAP_DDR1				BIT(0)
+
+#define QCA953X_BOOTSTRAP_SW_OPTION2			BIT(12)
+#define QCA953X_BOOTSTRAP_SW_OPTION1			BIT(11)
+#define QCA953X_BOOTSTRAP_EJTAG_MODE			BIT(5)
+#define QCA953X_BOOTSTRAP_REF_CLK_40			BIT(4)
+#define QCA953X_BOOTSTRAP_SDRAM_DISABLED		BIT(1)
+#define QCA953X_BOOTSTRAP_DDR1				BIT(0)
+
+#define QCA955X_BOOTSTRAP_REF_CLK_40			BIT(4)
+
+#define QCA956X_BOOTSTRAP_REF_CLK_40			BIT(2)
+
+#define AR934X_PCIE_WMAC_INT_WMAC_MISC			BIT(0)
+#define AR934X_PCIE_WMAC_INT_WMAC_TX			BIT(1)
+#define AR934X_PCIE_WMAC_INT_WMAC_RXLP			BIT(2)
+#define AR934X_PCIE_WMAC_INT_WMAC_RXHP			BIT(3)
+#define AR934X_PCIE_WMAC_INT_PCIE_RC			BIT(4)
+#define AR934X_PCIE_WMAC_INT_PCIE_RC0			BIT(5)
+#define AR934X_PCIE_WMAC_INT_PCIE_RC1			BIT(6)
+#define AR934X_PCIE_WMAC_INT_PCIE_RC2			BIT(7)
+#define AR934X_PCIE_WMAC_INT_PCIE_RC3			BIT(8)
+#define AR934X_PCIE_WMAC_INT_WMAC_ALL \
+	(AR934X_PCIE_WMAC_INT_WMAC_MISC | AR934X_PCIE_WMAC_INT_WMAC_TX | \
+	 AR934X_PCIE_WMAC_INT_WMAC_RXLP | AR934X_PCIE_WMAC_INT_WMAC_RXHP)
+
+#define AR934X_PCIE_WMAC_INT_PCIE_ALL \
+	(AR934X_PCIE_WMAC_INT_PCIE_RC | AR934X_PCIE_WMAC_INT_PCIE_RC0 | \
+	 AR934X_PCIE_WMAC_INT_PCIE_RC1 | AR934X_PCIE_WMAC_INT_PCIE_RC2 | \
+	 AR934X_PCIE_WMAC_INT_PCIE_RC3)
+
+#define QCA953X_PCIE_WMAC_INT_WMAC_MISC			BIT(0)
+#define QCA953X_PCIE_WMAC_INT_WMAC_TX			BIT(1)
+#define QCA953X_PCIE_WMAC_INT_WMAC_RXLP			BIT(2)
+#define QCA953X_PCIE_WMAC_INT_WMAC_RXHP			BIT(3)
+#define QCA953X_PCIE_WMAC_INT_PCIE_RC			BIT(4)
+#define QCA953X_PCIE_WMAC_INT_PCIE_RC0			BIT(5)
+#define QCA953X_PCIE_WMAC_INT_PCIE_RC1			BIT(6)
+#define QCA953X_PCIE_WMAC_INT_PCIE_RC2			BIT(7)
+#define QCA953X_PCIE_WMAC_INT_PCIE_RC3			BIT(8)
+#define QCA953X_PCIE_WMAC_INT_WMAC_ALL \
+	(QCA953X_PCIE_WMAC_INT_WMAC_MISC | QCA953X_PCIE_WMAC_INT_WMAC_TX | \
+	 QCA953X_PCIE_WMAC_INT_WMAC_RXLP | QCA953X_PCIE_WMAC_INT_WMAC_RXHP)
+
+#define QCA953X_PCIE_WMAC_INT_PCIE_ALL \
+	(QCA953X_PCIE_WMAC_INT_PCIE_RC | QCA953X_PCIE_WMAC_INT_PCIE_RC0 | \
+	 QCA953X_PCIE_WMAC_INT_PCIE_RC1 | QCA953X_PCIE_WMAC_INT_PCIE_RC2 | \
+	 QCA953X_PCIE_WMAC_INT_PCIE_RC3)
+
+#define QCA955X_EXT_INT_WMAC_MISC			BIT(0)
+#define QCA955X_EXT_INT_WMAC_TX				BIT(1)
+#define QCA955X_EXT_INT_WMAC_RXLP			BIT(2)
+#define QCA955X_EXT_INT_WMAC_RXHP			BIT(3)
+#define QCA955X_EXT_INT_PCIE_RC1			BIT(4)
+#define QCA955X_EXT_INT_PCIE_RC1_INT0			BIT(5)
+#define QCA955X_EXT_INT_PCIE_RC1_INT1			BIT(6)
+#define QCA955X_EXT_INT_PCIE_RC1_INT2			BIT(7)
+#define QCA955X_EXT_INT_PCIE_RC1_INT3			BIT(8)
+#define QCA955X_EXT_INT_PCIE_RC2			BIT(12)
+#define QCA955X_EXT_INT_PCIE_RC2_INT0			BIT(13)
+#define QCA955X_EXT_INT_PCIE_RC2_INT1			BIT(14)
+#define QCA955X_EXT_INT_PCIE_RC2_INT2			BIT(15)
+#define QCA955X_EXT_INT_PCIE_RC2_INT3			BIT(16)
+#define QCA955X_EXT_INT_USB1				BIT(24)
+#define QCA955X_EXT_INT_USB2				BIT(28)
+
+#define QCA955X_EXT_INT_WMAC_ALL \
+	(QCA955X_EXT_INT_WMAC_MISC | QCA955X_EXT_INT_WMAC_TX | \
+	 QCA955X_EXT_INT_WMAC_RXLP | QCA955X_EXT_INT_WMAC_RXHP)
+
+#define QCA955X_EXT_INT_PCIE_RC1_ALL \
+	(QCA955X_EXT_INT_PCIE_RC1 | QCA955X_EXT_INT_PCIE_RC1_INT0 | \
+	 QCA955X_EXT_INT_PCIE_RC1_INT1 | QCA955X_EXT_INT_PCIE_RC1_INT2 | \
+	 QCA955X_EXT_INT_PCIE_RC1_INT3)
+
+#define QCA955X_EXT_INT_PCIE_RC2_ALL \
+	(QCA955X_EXT_INT_PCIE_RC2 | QCA955X_EXT_INT_PCIE_RC2_INT0 | \
+	 QCA955X_EXT_INT_PCIE_RC2_INT1 | QCA955X_EXT_INT_PCIE_RC2_INT2 | \
+	 QCA955X_EXT_INT_PCIE_RC2_INT3)
+
+#define QCA956X_EXT_INT_WMAC_MISC			BIT(0)
+#define QCA956X_EXT_INT_WMAC_TX				BIT(1)
+#define QCA956X_EXT_INT_WMAC_RXLP			BIT(2)
+#define QCA956X_EXT_INT_WMAC_RXHP			BIT(3)
+#define QCA956X_EXT_INT_PCIE_RC1			BIT(4)
+#define QCA956X_EXT_INT_PCIE_RC1_INT0			BIT(5)
+#define QCA956X_EXT_INT_PCIE_RC1_INT1			BIT(6)
+#define QCA956X_EXT_INT_PCIE_RC1_INT2			BIT(7)
+#define QCA956X_EXT_INT_PCIE_RC1_INT3			BIT(8)
+#define QCA956X_EXT_INT_PCIE_RC2			BIT(12)
+#define QCA956X_EXT_INT_PCIE_RC2_INT0			BIT(13)
+#define QCA956X_EXT_INT_PCIE_RC2_INT1			BIT(14)
+#define QCA956X_EXT_INT_PCIE_RC2_INT2			BIT(15)
+#define QCA956X_EXT_INT_PCIE_RC2_INT3			BIT(16)
+#define QCA956X_EXT_INT_USB1				BIT(24)
+#define QCA956X_EXT_INT_USB2				BIT(28)
+
+#define QCA956X_EXT_INT_WMAC_ALL \
+	(QCA956X_EXT_INT_WMAC_MISC | QCA956X_EXT_INT_WMAC_TX | \
+	 QCA956X_EXT_INT_WMAC_RXLP | QCA956X_EXT_INT_WMAC_RXHP)
+
+#define QCA956X_EXT_INT_PCIE_RC1_ALL \
+	(QCA956X_EXT_INT_PCIE_RC1 | QCA956X_EXT_INT_PCIE_RC1_INT0 | \
+	 QCA956X_EXT_INT_PCIE_RC1_INT1 | QCA956X_EXT_INT_PCIE_RC1_INT2 | \
+	 QCA956X_EXT_INT_PCIE_RC1_INT3)
+
+#define QCA956X_EXT_INT_PCIE_RC2_ALL \
+	(QCA956X_EXT_INT_PCIE_RC2 | QCA956X_EXT_INT_PCIE_RC2_INT0 | \
+	 QCA956X_EXT_INT_PCIE_RC2_INT1 | QCA956X_EXT_INT_PCIE_RC2_INT2 | \
+	 QCA956X_EXT_INT_PCIE_RC2_INT3)
+
+#define REV_ID_MAJOR_MASK				0xfff0
+#define REV_ID_MAJOR_AR71XX				0x00a0
+#define REV_ID_MAJOR_AR913X				0x00b0
+#define REV_ID_MAJOR_AR7240				0x00c0
+#define REV_ID_MAJOR_AR7241				0x0100
+#define REV_ID_MAJOR_AR7242				0x1100
+#define REV_ID_MAJOR_AR9330				0x0110
+#define REV_ID_MAJOR_AR9331				0x1110
+#define REV_ID_MAJOR_AR9341				0x0120
+#define REV_ID_MAJOR_AR9342				0x1120
+#define REV_ID_MAJOR_AR9344				0x2120
+#define REV_ID_MAJOR_QCA9533				0x0140
+#define REV_ID_MAJOR_QCA9533_V2				0x0160
+#define REV_ID_MAJOR_QCA9556				0x0130
+#define REV_ID_MAJOR_QCA9558				0x1130
+#define REV_ID_MAJOR_TP9343				0x0150
+#define REV_ID_MAJOR_QCA9561				0x1150
+
+#define AR71XX_REV_ID_MINOR_MASK			0x3
+#define AR71XX_REV_ID_MINOR_AR7130			0x0
+#define AR71XX_REV_ID_MINOR_AR7141			0x1
+#define AR71XX_REV_ID_MINOR_AR7161			0x2
+#define AR913X_REV_ID_MINOR_AR9130			0x0
+#define AR913X_REV_ID_MINOR_AR9132			0x1
+
+#define AR71XX_REV_ID_REVISION_MASK			0x3
+#define AR71XX_REV_ID_REVISION_SHIFT			2
+#define AR71XX_REV_ID_REVISION2_MASK			0xf
+
+/*
+ * RTC block
+ */
+#define AR933X_RTC_REG_RESET				0x40
+#define AR933X_RTC_REG_STATUS				0x44
+#define AR933X_RTC_REG_DERIVED				0x48
+#define AR933X_RTC_REG_FORCE_WAKE			0x4c
+#define AR933X_RTC_REG_INT_CAUSE			0x50
+#define AR933X_RTC_REG_CAUSE_CLR			0x50
+#define AR933X_RTC_REG_INT_ENABLE			0x54
+#define AR933X_RTC_REG_INT_MASKE			0x58
+
+#define QCA953X_RTC_REG_SYNC_RESET			0x40
+#define QCA953X_RTC_REG_SYNC_STATUS			0x44
+
+/*
+ * SPI block
+ */
+#define AR71XX_SPI_REG_FS				0x00
+#define AR71XX_SPI_REG_CTRL				0x04
+#define AR71XX_SPI_REG_IOC				0x08
+#define AR71XX_SPI_REG_RDS				0x0c
+
+#define AR71XX_SPI_FS_GPIO				BIT(0)
+
+#define AR71XX_SPI_CTRL_RD				BIT(6)
+#define AR71XX_SPI_CTRL_DIV_MASK			0x3f
+
+#define AR71XX_SPI_IOC_DO				BIT(0)
+#define AR71XX_SPI_IOC_CLK				BIT(8)
+#define AR71XX_SPI_IOC_CS(n)				BIT(16 + (n))
+#define AR71XX_SPI_IOC_CS0				AR71XX_SPI_IOC_CS(0)
+#define AR71XX_SPI_IOC_CS1				AR71XX_SPI_IOC_CS(1)
+#define AR71XX_SPI_IOC_CS2				AR71XX_SPI_IOC_CS(2)
+#define AR71XX_SPI_IOC_CS_ALL \
+	(AR71XX_SPI_IOC_CS0 | AR71XX_SPI_IOC_CS1 | AR71XX_SPI_IOC_CS2)
+
+/*
+ * GPIO block
+ */
+#define AR71XX_GPIO_REG_OE				0x00
+#define AR71XX_GPIO_REG_IN				0x04
+#define AR71XX_GPIO_REG_OUT				0x08
+#define AR71XX_GPIO_REG_SET				0x0c
+#define AR71XX_GPIO_REG_CLEAR				0x10
+#define AR71XX_GPIO_REG_INT_MODE			0x14
+#define AR71XX_GPIO_REG_INT_TYPE			0x18
+#define AR71XX_GPIO_REG_INT_POLARITY			0x1c
+#define AR71XX_GPIO_REG_INT_PENDING			0x20
+#define AR71XX_GPIO_REG_INT_ENABLE			0x24
+#define AR71XX_GPIO_REG_FUNC				0x28
+#define AR933X_GPIO_REG_FUNC				0x30
+
+#define AR934X_GPIO_REG_OUT_FUNC0			0x2c
+#define AR934X_GPIO_REG_OUT_FUNC1			0x30
+#define AR934X_GPIO_REG_OUT_FUNC2			0x34
+#define AR934X_GPIO_REG_OUT_FUNC3			0x38
+#define AR934X_GPIO_REG_OUT_FUNC4			0x3c
+#define AR934X_GPIO_REG_OUT_FUNC5			0x40
+#define AR934X_GPIO_REG_FUNC				0x6c
+
+#define QCA953X_GPIO_REG_OUT_FUNC0			0x2c
+#define QCA953X_GPIO_REG_OUT_FUNC1			0x30
+#define QCA953X_GPIO_REG_OUT_FUNC2			0x34
+#define QCA953X_GPIO_REG_OUT_FUNC3			0x38
+#define QCA953X_GPIO_REG_OUT_FUNC4			0x3c
+#define QCA953X_GPIO_REG_IN_ENABLE0			0x44
+#define QCA953X_GPIO_REG_FUNC				0x6c
+
+#define QCA955X_GPIO_REG_OUT_FUNC0			0x2c
+#define QCA955X_GPIO_REG_OUT_FUNC1			0x30
+#define QCA955X_GPIO_REG_OUT_FUNC2			0x34
+#define QCA955X_GPIO_REG_OUT_FUNC3			0x38
+#define QCA955X_GPIO_REG_OUT_FUNC4			0x3c
+#define QCA955X_GPIO_REG_OUT_FUNC5			0x40
+#define QCA955X_GPIO_REG_FUNC				0x6c
+
+#define QCA956X_GPIO_REG_OUT_FUNC0			0x2c
+#define QCA956X_GPIO_REG_OUT_FUNC1			0x30
+#define QCA956X_GPIO_REG_OUT_FUNC2			0x34
+#define QCA956X_GPIO_REG_OUT_FUNC3			0x38
+#define QCA956X_GPIO_REG_OUT_FUNC4			0x3c
+#define QCA956X_GPIO_REG_OUT_FUNC5			0x40
+#define QCA956X_GPIO_REG_IN_ENABLE0			0x44
+#define QCA956X_GPIO_REG_IN_ENABLE3			0x50
+#define QCA956X_GPIO_REG_FUNC				0x6c
+
+#define AR71XX_GPIO_FUNC_STEREO_EN			BIT(17)
+#define AR71XX_GPIO_FUNC_SLIC_EN			BIT(16)
+#define AR71XX_GPIO_FUNC_SPI_CS2_EN			BIT(13)
+#define AR71XX_GPIO_FUNC_SPI_CS1_EN			BIT(12)
+#define AR71XX_GPIO_FUNC_UART_EN			BIT(8)
+#define AR71XX_GPIO_FUNC_USB_OC_EN			BIT(4)
+#define AR71XX_GPIO_FUNC_USB_CLK_EN			BIT(0)
+
+#define AR724X_GPIO_FUNC_GE0_MII_CLK_EN			BIT(19)
+#define AR724X_GPIO_FUNC_SPI_EN				BIT(18)
+#define AR724X_GPIO_FUNC_SPI_CS_EN2			BIT(14)
+#define AR724X_GPIO_FUNC_SPI_CS_EN1			BIT(13)
+#define AR724X_GPIO_FUNC_CLK_OBS5_EN			BIT(12)
+#define AR724X_GPIO_FUNC_CLK_OBS4_EN			BIT(11)
+#define AR724X_GPIO_FUNC_CLK_OBS3_EN			BIT(10)
+#define AR724X_GPIO_FUNC_CLK_OBS2_EN			BIT(9)
+#define AR724X_GPIO_FUNC_CLK_OBS1_EN			BIT(8)
+#define AR724X_GPIO_FUNC_ETH_SWITCH_LED4_EN		BIT(7)
+#define AR724X_GPIO_FUNC_ETH_SWITCH_LED3_EN		BIT(6)
+#define AR724X_GPIO_FUNC_ETH_SWITCH_LED2_EN		BIT(5)
+#define AR724X_GPIO_FUNC_ETH_SWITCH_LED1_EN		BIT(4)
+#define AR724X_GPIO_FUNC_ETH_SWITCH_LED0_EN		BIT(3)
+#define AR724X_GPIO_FUNC_UART_RTS_CTS_EN		BIT(2)
+#define AR724X_GPIO_FUNC_UART_EN			BIT(1)
+#define AR724X_GPIO_FUNC_JTAG_DISABLE			BIT(0)
+
+#define AR913X_GPIO_FUNC_WMAC_LED_EN			BIT(22)
+#define AR913X_GPIO_FUNC_EXP_PORT_CS_EN			BIT(21)
+#define AR913X_GPIO_FUNC_I2S_REFCLKEN			BIT(20)
+#define AR913X_GPIO_FUNC_I2S_MCKEN			BIT(19)
+#define AR913X_GPIO_FUNC_I2S1_EN			BIT(18)
+#define AR913X_GPIO_FUNC_I2S0_EN			BIT(17)
+#define AR913X_GPIO_FUNC_SLIC_EN			BIT(16)
+#define AR913X_GPIO_FUNC_UART_RTSCTS_EN			BIT(9)
+#define AR913X_GPIO_FUNC_UART_EN			BIT(8)
+#define AR913X_GPIO_FUNC_USB_CLK_EN			BIT(4)
+
+#define AR933X_GPIO(x)					BIT(x)
+#define AR933X_GPIO_FUNC_SPDIF2TCK			BIT(31)
+#define AR933X_GPIO_FUNC_SPDIF_EN			BIT(30)
+#define AR933X_GPIO_FUNC_I2SO_22_18_EN			BIT(29)
+#define AR933X_GPIO_FUNC_I2S_MCK_EN			BIT(27)
+#define AR933X_GPIO_FUNC_I2SO_EN			BIT(26)
+#define AR933X_GPIO_FUNC_ETH_SWITCH_LED_DUPL		BIT(25)
+#define AR933X_GPIO_FUNC_ETH_SWITCH_LED_COLL		BIT(24)
+#define AR933X_GPIO_FUNC_ETH_SWITCH_LED_ACT		BIT(23)
+#define AR933X_GPIO_FUNC_SPI_EN				BIT(18)
+#define AR933X_GPIO_FUNC_RES_TRUE			BIT(15)
+#define AR933X_GPIO_FUNC_SPI_CS_EN2			BIT(14)
+#define AR933X_GPIO_FUNC_SPI_CS_EN1			BIT(13)
+#define AR933X_GPIO_FUNC_XLNA_EN			BIT(12)
+#define AR933X_GPIO_FUNC_ETH_SWITCH_LED4_EN		BIT(7)
+#define AR933X_GPIO_FUNC_ETH_SWITCH_LED3_EN		BIT(6)
+#define AR933X_GPIO_FUNC_ETH_SWITCH_LED2_EN		BIT(5)
+#define AR933X_GPIO_FUNC_ETH_SWITCH_LED1_EN		BIT(4)
+#define AR933X_GPIO_FUNC_ETH_SWITCH_LED0_EN		BIT(3)
+#define AR933X_GPIO_FUNC_UART_RTS_CTS_EN		BIT(2)
+#define AR933X_GPIO_FUNC_UART_EN			BIT(1)
+#define AR933X_GPIO_FUNC_JTAG_DISABLE			BIT(0)
+
+#define AR934X_GPIO_FUNC_CLK_OBS7_EN			BIT(9)
+#define AR934X_GPIO_FUNC_CLK_OBS6_EN			BIT(8)
+#define AR934X_GPIO_FUNC_CLK_OBS5_EN			BIT(7)
+#define AR934X_GPIO_FUNC_CLK_OBS4_EN			BIT(6)
+#define AR934X_GPIO_FUNC_CLK_OBS3_EN			BIT(5)
+#define AR934X_GPIO_FUNC_CLK_OBS2_EN			BIT(4)
+#define AR934X_GPIO_FUNC_CLK_OBS1_EN			BIT(3)
+#define AR934X_GPIO_FUNC_CLK_OBS0_EN			BIT(2)
+#define AR934X_GPIO_FUNC_JTAG_DISABLE			BIT(1)
+
+#define AR934X_GPIO_OUT_GPIO				0
+#define AR934X_GPIO_OUT_SPI_CS1				7
+#define AR934X_GPIO_OUT_LED_LINK0			41
+#define AR934X_GPIO_OUT_LED_LINK1			42
+#define AR934X_GPIO_OUT_LED_LINK2			43
+#define AR934X_GPIO_OUT_LED_LINK3			44
+#define AR934X_GPIO_OUT_LED_LINK4			45
+#define AR934X_GPIO_OUT_EXT_LNA0			46
+#define AR934X_GPIO_OUT_EXT_LNA1			47
+
+#define QCA953X_GPIO(x)					BIT(x)
+#define QCA953X_GPIO_MUX_MASK(x)			(0xff << (x))
+#define QCA953X_GPIO_OUT_MUX_SPI_CS1			10
+#define QCA953X_GPIO_OUT_MUX_SPI_CS2			11
+#define QCA953X_GPIO_OUT_MUX_SPI_CS0			9
+#define QCA953X_GPIO_OUT_MUX_SPI_CLK			8
+#define QCA953X_GPIO_OUT_MUX_SPI_MOSI			12
+#define QCA953X_GPIO_OUT_MUX_UART0_SOUT			22
+#define QCA953X_GPIO_OUT_MUX_LED_LINK1			41
+#define QCA953X_GPIO_OUT_MUX_LED_LINK2			42
+#define QCA953X_GPIO_OUT_MUX_LED_LINK3			43
+#define QCA953X_GPIO_OUT_MUX_LED_LINK4			44
+#define QCA953X_GPIO_OUT_MUX_LED_LINK5			45
+
+#define QCA953X_GPIO_IN_MUX_UART0_SIN			9
+#define QCA953X_GPIO_IN_MUX_SPI_DATA_IN			8
+
+#define QCA956X_GPIO_OUT_MUX_GE0_MDO			32
+#define QCA956X_GPIO_OUT_MUX_GE0_MDC			33
+
+#define AR71XX_GPIO_COUNT				16
+#define AR7240_GPIO_COUNT				18
+#define AR7241_GPIO_COUNT				20
+#define AR913X_GPIO_COUNT				22
+#define AR933X_GPIO_COUNT				30
+#define AR934X_GPIO_COUNT				23
+#define QCA953X_GPIO_COUNT				18
+#define QCA955X_GPIO_COUNT				24
+#define QCA956X_GPIO_COUNT				23
+
+/*
+ * SRIF block
+ */
+#define AR933X_SRIF_DDR_DPLL1_REG			0x240
+#define AR933X_SRIF_DDR_DPLL2_REG			0x244
+#define AR933X_SRIF_DDR_DPLL3_REG			0x248
+#define AR933X_SRIF_DDR_DPLL4_REG			0x24c
+
+#define AR934X_SRIF_CPU_DPLL1_REG			0x1c0
+#define AR934X_SRIF_CPU_DPLL2_REG			0x1c4
+#define AR934X_SRIF_CPU_DPLL3_REG			0x1c8
+#define AR934X_SRIF_CPU_DPLL4_REG			0x1cc
+
+#define AR934X_SRIF_DDR_DPLL1_REG			0x240
+#define AR934X_SRIF_DDR_DPLL2_REG			0x244
+#define AR934X_SRIF_DDR_DPLL3_REG			0x248
+#define AR934X_SRIF_DDR_DPLL4_REG			0x24c
+
+#define AR934X_SRIF_DPLL1_REFDIV_SHIFT			27
+#define AR934X_SRIF_DPLL1_REFDIV_MASK			0x1f
+#define AR934X_SRIF_DPLL1_NINT_SHIFT			18
+#define AR934X_SRIF_DPLL1_NINT_MASK			0x1ff
+#define AR934X_SRIF_DPLL1_NFRAC_MASK			0x0003ffff
+
+#define AR934X_SRIF_DPLL2_LOCAL_PLL			BIT(30)
+#define AR934X_SRIF_DPLL2_OUTDIV_SHIFT			13
+#define AR934X_SRIF_DPLL2_OUTDIV_MASK			0x7
+
+#define QCA953X_SRIF_BB_DPLL1_REG			0x180
+#define QCA953X_SRIF_BB_DPLL2_REG			0x184
+#define QCA953X_SRIF_BB_DPLL3_REG			0x188
+
+#define QCA953X_SRIF_CPU_DPLL1_REG			0x1c0
+#define QCA953X_SRIF_CPU_DPLL2_REG			0x1c4
+#define QCA953X_SRIF_CPU_DPLL3_REG			0x1c8
+
+#define QCA953X_SRIF_DDR_DPLL1_REG			0x240
+#define QCA953X_SRIF_DDR_DPLL2_REG			0x244
+#define QCA953X_SRIF_DDR_DPLL3_REG			0x248
+
+#define QCA953X_SRIF_PCIE_DPLL1_REG			0xc00
+#define QCA953X_SRIF_PCIE_DPLL2_REG			0xc04
+#define QCA953X_SRIF_PCIE_DPLL3_REG			0xc08
+
+#define QCA953X_SRIF_PMU1_REG				0xc40
+#define QCA953X_SRIF_PMU2_REG				0xc44
+
+#define QCA953X_SRIF_DPLL1_REFDIV_SHIFT			27
+#define QCA953X_SRIF_DPLL1_REFDIV_MASK			0x1f
+
+#define QCA953X_SRIF_DPLL1_NINT_SHIFT			18
+#define QCA953X_SRIF_DPLL1_NINT_MASK			0x1ff
+#define QCA953X_SRIF_DPLL1_NFRAC_MASK			0x0003ffff
+
+#define QCA953X_SRIF_DPLL2_LOCAL_PLL			BIT(30)
+
+#define QCA953X_SRIF_DPLL2_KI_SHIFT			29
+#define QCA953X_SRIF_DPLL2_KI_MASK			0x3
+
+#define QCA953X_SRIF_DPLL2_KD_SHIFT			25
+#define QCA953X_SRIF_DPLL2_KD_MASK			0xf
+
+#define QCA953X_SRIF_DPLL2_PWD				BIT(22)
+
+#define QCA953X_SRIF_DPLL2_OUTDIV_SHIFT			13
+#define QCA953X_SRIF_DPLL2_OUTDIV_MASK			0x7
+
+/*
+ * MII_CTRL block
+ */
+#define AR71XX_MII_REG_MII0_CTRL			0x00
+#define AR71XX_MII_REG_MII1_CTRL			0x04
+
+#define AR71XX_MII_CTRL_IF_MASK				3
+#define AR71XX_MII_CTRL_SPEED_SHIFT			4
+#define AR71XX_MII_CTRL_SPEED_MASK			3
+#define AR71XX_MII_CTRL_SPEED_10			0
+#define AR71XX_MII_CTRL_SPEED_100			1
+#define AR71XX_MII_CTRL_SPEED_1000			2
+
+#define AR71XX_MII0_CTRL_IF_GMII			0
+#define AR71XX_MII0_CTRL_IF_MII				1
+#define AR71XX_MII0_CTRL_IF_RGMII			2
+#define AR71XX_MII0_CTRL_IF_RMII			3
+
+#define AR71XX_MII1_CTRL_IF_RGMII			0
+#define AR71XX_MII1_CTRL_IF_RMII			1
+
+/*
+ * AR933X GMAC interface
+ */
+#define AR933X_GMAC_REG_ETH_CFG				0x00
+
+#define AR933X_ETH_CFG_RGMII_GE0			BIT(0)
+#define AR933X_ETH_CFG_MII_GE0				BIT(1)
+#define AR933X_ETH_CFG_GMII_GE0				BIT(2)
+#define AR933X_ETH_CFG_MII_GE0_MASTER			BIT(3)
+#define AR933X_ETH_CFG_MII_GE0_SLAVE			BIT(4)
+#define AR933X_ETH_CFG_MII_GE0_ERR_EN			BIT(5)
+#define AR933X_ETH_CFG_SW_PHY_SWAP			BIT(7)
+#define AR933X_ETH_CFG_SW_PHY_ADDR_SWAP			BIT(8)
+#define AR933X_ETH_CFG_RMII_GE0				BIT(9)
+#define AR933X_ETH_CFG_RMII_GE0_SPD_10			0
+#define AR933X_ETH_CFG_RMII_GE0_SPD_100			BIT(10)
+
+/*
+ * AR934X GMAC Interface
+ */
+#define AR934X_GMAC_REG_ETH_CFG				0x00
+
+#define AR934X_ETH_CFG_RGMII_GMAC0			BIT(0)
+#define AR934X_ETH_CFG_MII_GMAC0			BIT(1)
+#define AR934X_ETH_CFG_GMII_GMAC0			BIT(2)
+#define AR934X_ETH_CFG_MII_GMAC0_MASTER			BIT(3)
+#define AR934X_ETH_CFG_MII_GMAC0_SLAVE			BIT(4)
+#define AR934X_ETH_CFG_MII_GMAC0_ERR_EN			BIT(5)
+#define AR934X_ETH_CFG_SW_ONLY_MODE			BIT(6)
+#define AR934X_ETH_CFG_SW_PHY_SWAP			BIT(7)
+#define AR934X_ETH_CFG_SW_APB_ACCESS			BIT(9)
+#define AR934X_ETH_CFG_RMII_GMAC0			BIT(10)
+#define AR933X_ETH_CFG_MII_CNTL_SPEED			BIT(11)
+#define AR934X_ETH_CFG_RMII_GMAC0_MASTER			BIT(12)
+#define AR933X_ETH_CFG_SW_ACC_MSB_FIRST			BIT(13)
+#define AR934X_ETH_CFG_RXD_DELAY			BIT(14)
+#define AR934X_ETH_CFG_RXD_DELAY_MASK			0x3
+#define AR934X_ETH_CFG_RXD_DELAY_SHIFT			14
+#define AR934X_ETH_CFG_RDV_DELAY			BIT(16)
+#define AR934X_ETH_CFG_RDV_DELAY_MASK			0x3
+#define AR934X_ETH_CFG_RDV_DELAY_SHIFT			16
+
+/*
+ * QCA953X GMAC Interface
+ */
+#define QCA953X_GMAC_REG_ETH_CFG			0x00
+
+#define QCA953X_ETH_CFG_SW_ONLY_MODE			BIT(6)
+#define QCA953X_ETH_CFG_SW_PHY_SWAP			BIT(7)
+#define QCA953X_ETH_CFG_SW_APB_ACCESS			BIT(9)
+#define QCA953X_ETH_CFG_SW_ACC_MSB_FIRST		BIT(13)
+
+/*
+ * QCA955X GMAC Interface
+ */
+
+#define QCA955X_GMAC_REG_ETH_CFG			0x00
+
+#define QCA955X_ETH_CFG_RGMII_EN			BIT(0)
+#define QCA955X_ETH_CFG_GE0_SGMII			BIT(6)
+
+#endif /* __ASM_AR71XX_H */
diff --git a/arch/mips/mach-ath79/include/mach/ath79.h b/arch/mips/mach-ath79/include/mach/ath79.h
new file mode 100644
index 0000000..17af082
--- /dev/null
+++ b/arch/mips/mach-ath79/include/mach/ath79.h
@@ -0,0 +1,149 @@
+/*
+ * Atheros AR71XX/AR724X/AR913X common definitions
+ *
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
+ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef __ASM_MACH_ATH79_H
+#define __ASM_MACH_ATH79_H
+
+#include <linux/types.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+enum ath79_soc_type {
+	ATH79_SOC_UNKNOWN,
+	ATH79_SOC_AR7130,
+	ATH79_SOC_AR7141,
+	ATH79_SOC_AR7161,
+	ATH79_SOC_AR7240,
+	ATH79_SOC_AR7241,
+	ATH79_SOC_AR7242,
+	ATH79_SOC_AR9130,
+	ATH79_SOC_AR9132,
+	ATH79_SOC_AR9330,
+	ATH79_SOC_AR9331,
+	ATH79_SOC_AR9341,
+	ATH79_SOC_AR9342,
+	ATH79_SOC_AR9344,
+	ATH79_SOC_QCA9533,
+	ATH79_SOC_QCA9556,
+	ATH79_SOC_QCA9558,
+	ATH79_SOC_TP9343,
+	ATH79_SOC_QCA9561,
+};
+
+static inline int soc_is_ar71xx(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR7130 ||
+		gd->arch.soc == ATH79_SOC_AR7141 ||
+		gd->arch.soc == ATH79_SOC_AR7161;
+}
+
+static inline int soc_is_ar724x(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR7240 ||
+		gd->arch.soc == ATH79_SOC_AR7241 ||
+		gd->arch.soc == ATH79_SOC_AR7242;
+}
+
+static inline int soc_is_ar7240(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR7240;
+}
+
+static inline int soc_is_ar7241(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR7241;
+}
+
+static inline int soc_is_ar7242(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR7242;
+}
+
+static inline int soc_is_ar913x(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR9130 ||
+		gd->arch.soc == ATH79_SOC_AR9132;
+}
+
+static inline int soc_is_ar933x(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR9330 ||
+		gd->arch.soc == ATH79_SOC_AR9331;
+}
+
+static inline int soc_is_ar9341(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR9341;
+}
+
+static inline int soc_is_ar9342(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR9342;
+}
+
+static inline int soc_is_ar9344(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR9344;
+}
+
+static inline int soc_is_ar934x(void)
+{
+	return soc_is_ar9341() ||
+		soc_is_ar9342() ||
+		soc_is_ar9344();
+}
+
+static inline int soc_is_qca9533(void)
+{
+	return gd->arch.soc == ATH79_SOC_QCA9533;
+}
+
+static inline int soc_is_qca953x(void)
+{
+	return soc_is_qca9533();
+}
+
+static inline int soc_is_qca9556(void)
+{
+	return gd->arch.soc == ATH79_SOC_QCA9556;
+}
+
+static inline int soc_is_qca9558(void)
+{
+	return gd->arch.soc == ATH79_SOC_QCA9558;
+}
+
+static inline int soc_is_qca955x(void)
+{
+	return soc_is_qca9556() || soc_is_qca9558();
+}
+
+static inline int soc_is_tp9343(void)
+{
+	return gd->arch.soc == ATH79_SOC_TP9343;
+}
+
+static inline int soc_is_qca9561(void)
+{
+	return gd->arch.soc == ATH79_SOC_QCA9561;
+}
+
+static inline int soc_is_qca956x(void)
+{
+	return soc_is_tp9343() || soc_is_qca9561();
+}
+
+int ath79_eth_reset(void);
+int ath79_usb_reset(void);
+
+void ar934x_pll_init(const u16 cpu_mhz, const u16 ddr_mhz, const u16 ahb_mhz);
+void ar934x_ddr_init(const u16 cpu_mhz, const u16 ddr_mhz, const u16 ahb_mhz);
+
+#endif /* __ASM_MACH_ATH79_H */
diff --git a/arch/mips/mach-ath79/include/mach/ddr.h b/arch/mips/mach-ath79/include/mach/ddr.h
new file mode 100644
index 0000000..181179a
--- /dev/null
+++ b/arch/mips/mach-ath79/include/mach/ddr.h
@@ -0,0 +1,13 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef __ASM_MACH_DDR_H
+#define __ASM_MACH_DDR_H
+
+void ddr_init(void);
+void ddr_tap_tuning(void);
+
+#endif /* __ASM_MACH_DDR_H */
diff --git a/arch/mips/mach-ath79/include/mach/reset.h b/arch/mips/mach-ath79/include/mach/reset.h
new file mode 100644
index 0000000..c383bfe
--- /dev/null
+++ b/arch/mips/mach-ath79/include/mach/reset.h
@@ -0,0 +1,14 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef __ASM_MACH_RESET_H
+#define __ASM_MACH_RESET_H
+
+#include <linux/types.h>
+
+u32 get_bootstrap(void);
+
+#endif /* __ASM_MACH_RESET_H */
diff --git a/arch/mips/mach-ath79/qca953x/Makefile b/arch/mips/mach-ath79/qca953x/Makefile
new file mode 100644
index 0000000..fd74f0c
--- /dev/null
+++ b/arch/mips/mach-ath79/qca953x/Makefile
@@ -0,0 +1,7 @@
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y += clk.o
+obj-y += ddr.o
+obj-y += lowlevel_init.o
diff --git a/arch/mips/mach-ath79/qca953x/clk.c b/arch/mips/mach-ath79/qca953x/clk.c
new file mode 100644
index 0000000..ef0a28e
--- /dev/null
+++ b/arch/mips/mach-ath79/qca953x/clk.c
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/reset.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static u32 qca953x_get_xtal(void)
+{
+	u32 val;
+
+	val = get_bootstrap();
+	if (val & QCA953X_BOOTSTRAP_REF_CLK_40)
+		return 40000000;
+	else
+		return 25000000;
+}
+
+int get_serial_clock(void)
+{
+	return qca953x_get_xtal();
+}
+
+int get_clocks(void)
+{
+	void __iomem *regs;
+	u32 val, ctrl, xtal, pll, div;
+
+	regs = map_physmem(AR71XX_PLL_BASE, AR71XX_PLL_SIZE,
+			   MAP_NOCACHE);
+
+	xtal = qca953x_get_xtal();
+	ctrl = readl(regs + QCA953X_PLL_CLK_CTRL_REG);
+	val = readl(regs + QCA953X_PLL_CPU_CONFIG_REG);
+
+	/* VCOOUT = XTAL * DIV_INT */
+	div = (val >> QCA953X_PLL_CPU_CONFIG_REFDIV_SHIFT)
+			& QCA953X_PLL_CPU_CONFIG_REFDIV_MASK;
+	pll = xtal / div;
+
+	/* PLLOUT = VCOOUT * (1/2^OUTDIV) */
+	div = (val >> QCA953X_PLL_CPU_CONFIG_NINT_SHIFT)
+			& QCA953X_PLL_CPU_CONFIG_NINT_MASK;
+	pll *= div;
+	div = (val >> QCA953X_PLL_CPU_CONFIG_OUTDIV_SHIFT)
+			& QCA953X_PLL_CPU_CONFIG_OUTDIV_MASK;
+	if (!div)
+		div = 1;
+	pll >>= div;
+
+	/* CPU_CLK = PLLOUT / CPU_POST_DIV */
+	div = ((ctrl >> QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT)
+			& QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_MASK) + 1;
+	gd->cpu_clk = pll / div;
+
+
+	val = readl(regs + QCA953X_PLL_DDR_CONFIG_REG);
+	/* VCOOUT = XTAL * DIV_INT */
+	div = (val >> QCA953X_PLL_DDR_CONFIG_REFDIV_SHIFT)
+			& QCA953X_PLL_DDR_CONFIG_REFDIV_MASK;
+	pll = xtal / div;
+
+	/* PLLOUT = VCOOUT * (1/2^OUTDIV) */
+	div = (val >> QCA953X_PLL_DDR_CONFIG_NINT_SHIFT)
+			& QCA953X_PLL_DDR_CONFIG_NINT_MASK;
+	pll *= div;
+	div = (val >> QCA953X_PLL_DDR_CONFIG_OUTDIV_SHIFT)
+			& QCA953X_PLL_DDR_CONFIG_OUTDIV_MASK;
+	if (!div)
+		div = 1;
+	pll >>= div;
+
+	/* DDR_CLK = PLLOUT / DDR_POST_DIV */
+	div = ((ctrl >> QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT)
+			& QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_MASK) + 1;
+	gd->mem_clk = pll / div;
+
+	div = ((ctrl >> QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT)
+			& QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_MASK) + 1;
+	if (ctrl & QCA953X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL) {
+		/* AHB_CLK = DDR_CLK / AHB_POST_DIV */
+		gd->bus_clk = gd->mem_clk / (div + 1);
+	} else {
+		/* AHB_CLK = CPU_CLK / AHB_POST_DIV */
+		gd->bus_clk = gd->cpu_clk / (div + 1);
+	}
+
+	return 0;
+}
+
+ulong get_bus_freq(ulong dummy)
+{
+	if (!gd->bus_clk)
+		get_clocks();
+	return gd->bus_clk;
+}
+
+ulong get_ddr_freq(ulong dummy)
+{
+	if (!gd->mem_clk)
+		get_clocks();
+	return gd->mem_clk;
+}
diff --git a/arch/mips/mach-ath79/qca953x/ddr.c b/arch/mips/mach-ath79/qca953x/ddr.c
new file mode 100644
index 0000000..ac0130c
--- /dev/null
+++ b/arch/mips/mach-ath79/qca953x/ddr.c
@@ -0,0 +1,472 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ * Based on Atheros LSDK/QSDK
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/reset.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define DDR_CTRL_UPD_EMR3S      BIT(5)
+#define DDR_CTRL_UPD_EMR2S      BIT(4)
+#define DDR_CTRL_PRECHARGE      BIT(3)
+#define DDR_CTRL_AUTO_REFRESH   BIT(2)
+#define DDR_CTRL_UPD_EMRS       BIT(1)
+#define DDR_CTRL_UPD_MRS        BIT(0)
+
+#define DDR_REFRESH_EN          BIT(14)
+#define DDR_REFRESH_M           0x3ff
+#define DDR_REFRESH(x)          ((x) & DDR_REFRESH_M)
+#define DDR_REFRESH_VAL         (DDR_REFRESH_EN | DDR_REFRESH(312))
+
+#define DDR_TRAS_S              0
+#define DDR_TRAS_M              0x1f
+#define DDR_TRAS(x)             (((x) & DDR_TRAS_M) << DDR_TRAS_S)
+#define DDR_TRCD_M              0xf
+#define DDR_TRCD_S              5
+#define DDR_TRCD(x)             (((x) & DDR_TRCD_M) << DDR_TRCD_S)
+#define DDR_TRP_M               0xf
+#define DDR_TRP_S               9
+#define DDR_TRP(x)              (((x) & DDR_TRP_M) << DDR_TRP_S)
+#define DDR_TRRD_M              0xf
+#define DDR_TRRD_S              13
+#define DDR_TRRD(x)             (((x) & DDR_TRRD_M) << DDR_TRRD_S)
+#define DDR_TRFC_M              0x7f
+#define DDR_TRFC_S              17
+#define DDR_TRFC(x)             (((x) & DDR_TRFC_M) << DDR_TRFC_S)
+#define DDR_TMRD_M              0xf
+#define DDR_TMRD_S              23
+#define DDR_TMRD(x)             (((x) & DDR_TMRD_M) << DDR_TMRD_S)
+#define DDR_CAS_L_M             0x17
+#define DDR_CAS_L_S             27
+#define DDR_CAS_L(x)            (((x) & DDR_CAS_L_M) << DDR_CAS_L_S)
+#define DDR_OPEN                BIT(30)
+#define DDR1_CONF_REG_VAL       (DDR_TRAS(16) | DDR_TRCD(6) | \
+				 DDR_TRP(6) | DDR_TRRD(4) | \
+				 DDR_TRFC(7) | DDR_TMRD(5) | \
+				 DDR_CAS_L(7) | DDR_OPEN)
+#define DDR2_CONF_REG_VAL       (DDR_TRAS(27) | DDR_TRCD(9) | \
+				 DDR_TRP(9) | DDR_TRRD(7) | \
+				 DDR_TRFC(21) | DDR_TMRD(15) | \
+				 DDR_CAS_L(17) | DDR_OPEN)
+
+#define DDR_BURST_LEN_S         0
+#define DDR_BURST_LEN_M         0xf
+#define DDR_BURST_LEN(x)        ((x) << DDR_BURST_LEN_S)
+#define DDR_BURST_TYPE          BIT(4)
+#define DDR_CNTL_OE_EN          BIT(5)
+#define DDR_PHASE_SEL           BIT(6)
+#define DDR_CKE                 BIT(7)
+#define DDR_TWR_S               8
+#define DDR_TWR_M               0xf
+#define DDR_TWR(x)              (((x) & DDR_TWR_M) << DDR_TWR_S)
+#define DDR_TRTW_S              12
+#define DDR_TRTW_M              0x1f
+#define DDR_TRTW(x)             (((x) & DDR_TRTW_M) << DDR_TRTW_S)
+#define DDR_TRTP_S              17
+#define DDR_TRTP_M              0xf
+#define DDR_TRTP(x)             (((x) & DDR_TRTP_M) << DDR_TRTP_S)
+#define DDR_TWTR_S              21
+#define DDR_TWTR_M              0x1f
+#define DDR_TWTR(x)             (((x) & DDR_TWTR_M) << DDR_TWTR_S)
+#define DDR_G_OPEN_L_S          26
+#define DDR_G_OPEN_L_M          0xf
+#define DDR_G_OPEN_L(x)         ((x) << DDR_G_OPEN_L_S)
+#define DDR_HALF_WIDTH_LOW      BIT(31)
+#define DDR1_CONF2_REG_VAL      (DDR_BURST_LEN(8) | DDR_CNTL_OE_EN | \
+				 DDR_CKE | DDR_TWR(13) | DDR_TRTW(14) | \
+				 DDR_TRTP(8) | DDR_TWTR(14) | \
+				 DDR_G_OPEN_L(6) | DDR_HALF_WIDTH_LOW)
+#define DDR2_CONF2_REG_VAL      (DDR_BURST_LEN(8) | DDR_CNTL_OE_EN | \
+				 DDR_CKE | DDR_TWR(1) | DDR_TRTW(14) | \
+				 DDR_TRTP(9) | DDR_TWTR(21) | \
+				 DDR_G_OPEN_L(8) | DDR_HALF_WIDTH_LOW)
+
+#define DDR_TWR_MSB             BIT(3)
+#define DDR_TRAS_MSB            BIT(2)
+#define DDR_TRFC_MSB_M          0x3
+#define DDR_TRFC_MSB(x)         (x)
+#define DDR1_CONF3_REG_VAL      0
+#define DDR2_CONF3_REG_VAL      (DDR_TWR_MSB | DDR_TRFC_MSB(2))
+
+#define DDR_CTL_SRAM_TSEL       BIT(30)
+#define DDR_CTL_SRAM_GE0_SYNC   BIT(20)
+#define DDR_CTL_SRAM_GE1_SYNC   BIT(19)
+#define DDR_CTL_SRAM_USB_SYNC   BIT(18)
+#define DDR_CTL_SRAM_PCIE_SYNC  BIT(17)
+#define DDR_CTL_SRAM_WMAC_SYNC  BIT(16)
+#define DDR_CTL_SRAM_MISC1_SYNC BIT(15)
+#define DDR_CTL_SRAM_MISC2_SYNC BIT(14)
+#define DDR_CTL_PAD_DDR2_SEL    BIT(6)
+#define DDR_CTL_HALF_WIDTH      BIT(1)
+#define DDR_CTL_CONFIG_VAL      (DDR_CTL_SRAM_TSEL | \
+				 DDR_CTL_SRAM_GE0_SYNC | \
+				 DDR_CTL_SRAM_GE1_SYNC | \
+				 DDR_CTL_SRAM_USB_SYNC | \
+				 DDR_CTL_SRAM_PCIE_SYNC | \
+				 DDR_CTL_SRAM_WMAC_SYNC | \
+				 DDR_CTL_HALF_WIDTH)
+
+#define DDR_BURST_GE0_MAX_BL_S  0
+#define DDR_BURST_GE0_MAX_BL_M  0xf
+#define DDR_BURST_GE0_MAX_BL(x) \
+	(((x) & DDR_BURST_GE0_MAX_BL_M) << DDR_BURST_GE0_MAX_BL_S)
+#define DDR_BURST_GE1_MAX_BL_S  4
+#define DDR_BURST_GE1_MAX_BL_M  0xf
+#define DDR_BURST_GE1_MAX_BL(x) \
+	(((x) & DDR_BURST_GE1_MAX_BL_M) << DDR_BURST_GE1_MAX_BL_S)
+#define DDR_BURST_PCIE_MAX_BL_S 8
+#define DDR_BURST_PCIE_MAX_BL_M 0xf
+#define DDR_BURST_PCIE_MAX_BL(x) \
+	(((x) & DDR_BURST_PCIE_MAX_BL_M) << DDR_BURST_PCIE_MAX_BL_S)
+#define DDR_BURST_USB_MAX_BL_S  12
+#define DDR_BURST_USB_MAX_BL_M  0xf
+#define DDR_BURST_USB_MAX_BL(x) \
+	(((x) & DDR_BURST_USB_MAX_BL_M) << DDR_BURST_USB_MAX_BL_S)
+#define DDR_BURST_CPU_MAX_BL_S  16
+#define DDR_BURST_CPU_MAX_BL_M  0xf
+#define DDR_BURST_CPU_MAX_BL(x) \
+	(((x) & DDR_BURST_CPU_MAX_BL_M) << DDR_BURST_CPU_MAX_BL_S)
+#define DDR_BURST_RD_MAX_BL_S   20
+#define DDR_BURST_RD_MAX_BL_M   0xf
+#define DDR_BURST_RD_MAX_BL(x) \
+	(((x) & DDR_BURST_RD_MAX_BL_M) << DDR_BURST_RD_MAX_BL_S)
+#define DDR_BURST_WR_MAX_BL_S   24
+#define DDR_BURST_WR_MAX_BL_M   0xf
+#define DDR_BURST_WR_MAX_BL(x) \
+	(((x) & DDR_BURST_WR_MAX_BL_M) << DDR_BURST_WR_MAX_BL_S)
+#define DDR_BURST_RWP_MASK_EN_S 28
+#define DDR_BURST_RWP_MASK_EN_M 0x3
+#define DDR_BURST_RWP_MASK_EN(x) \
+	(((x) & DDR_BURST_RWP_MASK_EN_M) << DDR_BURST_RWP_MASK_EN_S)
+#define DDR_BURST_CPU_PRI_BE    BIT(30)
+#define DDR_BURST_CPU_PRI       BIT(31)
+#define DDR_BURST_VAL           (DDR_BURST_CPU_PRI_BE | \
+				 DDR_BURST_RWP_MASK_EN(3) | \
+				 DDR_BURST_WR_MAX_BL(4) | \
+				 DDR_BURST_RD_MAX_BL(4) | \
+				 DDR_BURST_CPU_MAX_BL(4) | \
+				 DDR_BURST_USB_MAX_BL(4) | \
+				 DDR_BURST_PCIE_MAX_BL(4) | \
+				 DDR_BURST_GE1_MAX_BL(4) | \
+				 DDR_BURST_GE0_MAX_BL(4))
+
+#define DDR_BURST_WMAC_MAX_BL_S 0
+#define DDR_BURST_WMAC_MAX_BL_M 0xf
+#define DDR_BURST_WMAC_MAX_BL(x) \
+	(((x) & DDR_BURST_WMAC_MAX_BL_M) << DDR_BURST_WMAC_MAX_BL_S)
+#define DDR_BURST2_VAL          DDR_BURST_WMAC_MAX_BL(4)
+
+#define DDR2_CONF_TWL_S         10
+#define DDR2_CONF_TWL_M         0xf
+#define DDR2_CONF_TWL(x) \
+	(((x) & DDR2_CONF_TWL_M) << DDR2_CONF_TWL_S)
+#define DDR2_CONF_ODT           BIT(9)
+#define DDR2_CONF_TFAW_S        2
+#define DDR2_CONF_TFAW_M        0x3f
+#define DDR2_CONF_TFAW(x) \
+	(((x) & DDR2_CONF_TFAW_M) << DDR2_CONF_TFAW_S)
+#define DDR2_CONF_EN            BIT(0)
+#define DDR2_CONF_VAL           (DDR2_CONF_TWL(5) | \
+				 DDR2_CONF_TFAW(31) | \
+				 DDR2_CONF_ODT | \
+				 DDR2_CONF_EN)
+
+#define DDR1_EXT_MODE_VAL       0
+#define DDR2_EXT_MODE_VAL       0x402
+#define DDR2_EXT_MODE_OCD_VAL   0x782
+#define DDR1_MODE_DLL_VAL       0x133
+#define DDR2_MODE_DLL_VAL       0x143
+#define DDR1_MODE_VAL           0x33
+#define DDR2_MODE_VAL           0x43
+#define DDR1_TAP_VAL            0x20
+#define DDR2_TAP_VAL            0x10
+
+#define DDR_REG_BIST_MASK_ADDR_0        0x2c
+#define DDR_REG_BIST_MASK_ADDR_1        0x30
+#define DDR_REG_BIST_MASK_AHB_GE0_0     0x34
+#define DDR_REG_BIST_COMP_AHB_GE0_0     0x38
+#define DDR_REG_BIST_MASK_AHB_GE1_0     0x3c
+#define DDR_REG_BIST_COMP_AHB_GE1_0     0x40
+#define DDR_REG_BIST_COMP_ADDR_0        0x64
+#define DDR_REG_BIST_COMP_ADDR_1        0x68
+#define DDR_REG_BIST_MASK_AHB_GE0_1     0x6c
+#define DDR_REG_BIST_COMP_AHB_GE0_1     0x70
+#define DDR_REG_BIST_MASK_AHB_GE1_1     0x74
+#define DDR_REG_BIST_COMP_AHB_GE1_1     0x78
+#define DDR_REG_BIST                    0x11c
+#define DDR_REG_BIST_STATUS             0x120
+
+#define DDR_BIST_COMP_CNT_S     1
+#define DDR_BIST_COMP_CNT_M     0xff
+#define DDR_BIST_COMP_CNT(x) \
+	(((x) & DDR_BIST_COMP_CNT_M) << DDR_BIST_COMP_CNT_S)
+#define DDR_BIST_COMP_CNT_MASK \
+	(DDR_BIST_COMP_CNT_M << DDR_BIST_COMP_CNT_S)
+#define DDR_BIST_TEST_START     BIT(0)
+#define DDR_BIST_STATUS_DONE    BIT(0)
+
+/* 4 Row Address Bits, 4 Column Address Bits, 2 BA bits */
+#define DDR_BIST_MASK_ADDR_VAL  0xfa5de83f
+
+#define DDR_TAP_MAGIC_VAL       0xaa55aa55
+#define DDR_TAP_MAX_VAL         0x40
+
+void ddr_init(void)
+{
+	void __iomem *regs;
+	u32 val;
+
+	regs = map_physmem(AR71XX_DDR_CTRL_BASE, AR71XX_DDR_CTRL_SIZE,
+			   MAP_NOCACHE);
+	val = get_bootstrap();
+	if (val & QCA953X_BOOTSTRAP_DDR1) {
+		writel(DDR_CTL_CONFIG_VAL, regs + QCA953X_DDR_REG_CTL_CONF);
+		udelay(10);
+
+		/* For 16-bit DDR */
+		writel(0xffff, regs + AR71XX_DDR_REG_RD_CYCLE);
+		udelay(100);
+
+		/* Burst size */
+		writel(DDR_BURST_VAL, regs + QCA953X_DDR_REG_BURST);
+		udelay(100);
+		writel(DDR_BURST2_VAL, regs + QCA953X_DDR_REG_BURST2);
+		udelay(100);
+
+		/* AHB maximum timeout */
+		writel(0xfffff, regs + QCA953X_DDR_REG_TIMEOUT_MAX);
+		udelay(100);
+
+		/* DRAM timing */
+		writel(DDR1_CONF_REG_VAL, regs + AR71XX_DDR_REG_CONFIG);
+		udelay(100);
+		writel(DDR1_CONF2_REG_VAL, regs + AR71XX_DDR_REG_CONFIG2);
+		udelay(100);
+		writel(DDR1_CONF3_REG_VAL, regs + QCA953X_DDR_REG_CONFIG3);
+		udelay(100);
+
+		/* Precharge All */
+		writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* ODT disable, Full strength, Enable DLL */
+		writel(DDR1_EXT_MODE_VAL, regs + AR71XX_DDR_REG_EMR);
+		udelay(100);
+
+		/* Update Extended Mode Register Set (EMRS) */
+		writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Reset DLL, CAS Latency 3, Burst Length 8 */
+		writel(DDR1_MODE_DLL_VAL, regs + AR71XX_DDR_REG_MODE);
+		udelay(100);
+
+		/* Update Mode Register Set (MRS) */
+		writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Precharge All */
+		writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Auto Refresh */
+		writel(DDR_CTRL_AUTO_REFRESH, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+		writel(DDR_CTRL_AUTO_REFRESH, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Normal DLL, CAS Latency 3, Burst Length 8 */
+		writel(DDR1_MODE_VAL, regs + AR71XX_DDR_REG_MODE);
+		udelay(100);
+
+		/* Update Mode Register Set (MRS) */
+		writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Refresh time control */
+		writel(DDR_REFRESH_VAL, regs + AR71XX_DDR_REG_REFRESH);
+		udelay(100);
+
+		/* DQS 0 Tap Control */
+		writel(DDR1_TAP_VAL, regs + AR71XX_DDR_REG_TAP_CTRL0);
+
+		/* DQS 1 Tap Control */
+		writel(DDR1_TAP_VAL, regs + AR71XX_DDR_REG_TAP_CTRL1);
+	} else {
+		writel(DDR_CTRL_UPD_EMR2S, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(10);
+		writel(DDR_CTRL_UPD_EMR3S, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(10);
+		writel(DDR_CTL_CONFIG_VAL | DDR_CTL_PAD_DDR2_SEL,
+		       regs + QCA953X_DDR_REG_CTL_CONF);
+		udelay(10);
+
+		/* For 16-bit DDR */
+		writel(0xffff, regs + AR71XX_DDR_REG_RD_CYCLE);
+		udelay(100);
+
+		/* Burst size */
+		writel(DDR_BURST_VAL, regs + QCA953X_DDR_REG_BURST);
+		udelay(100);
+		writel(DDR_BURST2_VAL, regs + QCA953X_DDR_REG_BURST2);
+		udelay(100);
+
+		/* AHB maximum timeout */
+		writel(0xfffff, regs + QCA953X_DDR_REG_TIMEOUT_MAX);
+		udelay(100);
+
+		/* DRAM timing */
+		writel(DDR2_CONF_REG_VAL, regs + AR71XX_DDR_REG_CONFIG);
+		udelay(100);
+		writel(DDR2_CONF2_REG_VAL, regs + AR71XX_DDR_REG_CONFIG2);
+		udelay(100);
+		writel(DDR2_CONF3_REG_VAL, regs + QCA953X_DDR_REG_CONFIG3);
+		udelay(100);
+
+		/* Enable DDR2 */
+		writel(DDR2_CONF_VAL, regs + QCA953X_DDR_REG_DDR2_CONFIG);
+		udelay(100);
+
+		/* Precharge All */
+		writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Update Extended Mode Register 2 Set (EMR2S) */
+		writel(DDR_CTRL_UPD_EMR2S, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Update Extended Mode Register 3 Set (EMR3S) */
+		writel(DDR_CTRL_UPD_EMR3S, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* 150 ohm, Reduced strength, Enable DLL */
+		writel(DDR2_EXT_MODE_VAL, regs + AR71XX_DDR_REG_EMR);
+		udelay(100);
+
+		/* Update Extended Mode Register Set (EMRS) */
+		writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Reset DLL, CAS Latency 4, Burst Length 8 */
+		writel(DDR2_MODE_DLL_VAL, regs + AR71XX_DDR_REG_MODE);
+		udelay(100);
+
+		/* Update Mode Register Set (MRS) */
+		writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Precharge All */
+		writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Auto Refresh */
+		writel(DDR_CTRL_AUTO_REFRESH, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+		writel(DDR_CTRL_AUTO_REFRESH, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Normal DLL, CAS Latency 4, Burst Length 8 */
+		writel(DDR2_MODE_VAL, regs + AR71XX_DDR_REG_MODE);
+		udelay(100);
+
+		/* Mode Register Set (MRS) */
+		writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Enable OCD, Enable DLL, Reduced Drive Strength */
+		writel(DDR2_EXT_MODE_OCD_VAL, regs + AR71XX_DDR_REG_EMR);
+		udelay(100);
+
+		/* Update Extended Mode Register Set (EMRS) */
+		writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* OCD diable, Enable DLL, Reduced Drive Strength */
+		writel(DDR2_EXT_MODE_VAL, regs + AR71XX_DDR_REG_EMR);
+		udelay(100);
+
+		/* Update Extended Mode Register Set (EMRS) */
+		writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Refresh time control */
+		writel(DDR_REFRESH_VAL, regs + AR71XX_DDR_REG_REFRESH);
+		udelay(100);
+
+		/* DQS 0 Tap Control */
+		writel(DDR2_TAP_VAL, regs + AR71XX_DDR_REG_TAP_CTRL0);
+
+		/* DQS 1 Tap Control */
+		writel(DDR2_TAP_VAL, regs + AR71XX_DDR_REG_TAP_CTRL1);
+	}
+}
+
+void ddr_tap_tuning(void)
+{
+	void __iomem *regs;
+	u32 val, pass, tap, cnt, tap_val, last, first;
+
+	regs = map_physmem(AR71XX_DDR_CTRL_BASE, AR71XX_DDR_CTRL_SIZE,
+			   MAP_NOCACHE);
+
+	tap_val = readl(regs + AR71XX_DDR_REG_TAP_CTRL0);
+	first = DDR_TAP_MAGIC_VAL;
+	last = 0;
+	cnt = 0;
+	tap = 0;
+
+	do {
+		writel(tap, regs + AR71XX_DDR_REG_TAP_CTRL0);
+		writel(tap, regs + AR71XX_DDR_REG_TAP_CTRL1);
+
+		writel(DDR_BIST_COMP_CNT(8), regs + DDR_REG_BIST_COMP_ADDR_1);
+		writel(DDR_BIST_MASK_ADDR_VAL, regs + DDR_REG_BIST_MASK_ADDR_0);
+		writel(0xffff, regs + DDR_REG_BIST_COMP_AHB_GE0_1);
+		writel(0xffff, regs + DDR_REG_BIST_COMP_AHB_GE1_0);
+		writel(0xffff, regs + DDR_REG_BIST_COMP_AHB_GE1_1);
+		writel(0xffff, regs + DDR_REG_BIST_MASK_AHB_GE0_0);
+		writel(0xffff, regs + DDR_REG_BIST_MASK_AHB_GE0_1);
+		writel(0xffff, regs + DDR_REG_BIST_MASK_AHB_GE1_0);
+		writel(0xffff, regs + DDR_REG_BIST_MASK_AHB_GE1_1);
+		writel(0xffff, regs + DDR_REG_BIST_COMP_AHB_GE0_0);
+
+		/* Start BIST test */
+		writel(DDR_BIST_TEST_START, regs + DDR_REG_BIST);
+
+		do {
+			val = readl(regs + DDR_REG_BIST_STATUS);
+		} while (!(val & DDR_BIST_STATUS_DONE));
+
+		/* Stop BIST test */
+		writel(0, regs + DDR_REG_BIST);
+
+		pass = val & DDR_BIST_COMP_CNT_MASK;
+		pass ^= DDR_BIST_COMP_CNT(8);
+		if (!pass) {
+			if (first != DDR_TAP_MAGIC_VAL) {
+				last = tap;
+			} else  {
+				first = tap;
+				last = tap;
+			}
+			cnt++;
+		}
+		tap++;
+	} while (tap < DDR_TAP_MAX_VAL);
+
+	if (cnt) {
+		tap_val = (first + last) / 2;
+		tap_val %= DDR_TAP_MAX_VAL;
+	}
+
+	writel(tap_val, regs + AR71XX_DDR_REG_TAP_CTRL0);
+	writel(tap_val, regs + AR71XX_DDR_REG_TAP_CTRL1);
+}
diff --git a/arch/mips/mach-ath79/qca953x/lowlevel_init.S b/arch/mips/mach-ath79/qca953x/lowlevel_init.S
new file mode 100644
index 0000000..d7038fa
--- /dev/null
+++ b/arch/mips/mach-ath79/qca953x/lowlevel_init.S
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ * Based on Atheros LSDK/QSDK
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+#include <asm/asm.h>
+#include <asm/regdef.h>
+#include <asm/mipsregs.h>
+#include <asm/addrspace.h>
+#include <mach/ar71xx_regs.h>
+
+#define MK_PLL_CONF(divint, refdiv, range, outdiv) \
+     (((0x3F & divint) << 10) | \
+     ((0x1F & refdiv) << 16) | \
+     ((0x1 & range)   << 21) | \
+     ((0x7 & outdiv)  << 23) )
+
+#define MK_CLK_CNTL(cpudiv, ddrdiv, ahbdiv) \
+    (((0x3 & (cpudiv - 1)) << 5)  | \
+    ((0x3 & (ddrdiv - 1)) << 10) | \
+    ((0x3 & (ahbdiv - 1)) << 15) )
+
+#define SET_FIELD(name, v)      (((v) & QCA953X_##name##_MASK) << \
+				 QCA953X_##name##_SHIFT)
+
+#define DPLL2_KI(v)             SET_FIELD(SRIF_DPLL2_KI, v)
+#define DPLL2_KD(v)             SET_FIELD(SRIF_DPLL2_KD, v)
+#define DPLL2_PWD               QCA953X_SRIF_DPLL2_PWD
+#define MK_DPLL2(ki, kd)        (DPLL2_KI(ki) | DPLL2_KD(kd) | DPLL2_PWD)
+
+#define PLL_CPU_NFRAC(v)        SET_FIELD(PLL_CPU_CONFIG_NFRAC, v)
+#define PLL_CPU_NINT(v)         SET_FIELD(PLL_CPU_CONFIG_NINT, v)
+#define PLL_CPU_REFDIV(v)       SET_FIELD(PLL_CPU_CONFIG_REFDIV, v)
+#define PLL_CPU_OUTDIV(v)       SET_FIELD(PLL_CPU_CONFIG_OUTDIV, v)
+#define MK_PLL_CPU_CONF(frac, nint, ref, outdiv) \
+				(PLL_CPU_NFRAC(frac) | \
+				 PLL_CPU_NINT(nint) | \
+				 PLL_CPU_REFDIV(ref) | \
+				 PLL_CPU_OUTDIV(outdiv))
+
+#define PLL_DDR_NFRAC(v)        SET_FIELD(PLL_DDR_CONFIG_NFRAC, v)
+#define PLL_DDR_NINT(v)         SET_FIELD(PLL_DDR_CONFIG_NINT, v)
+#define PLL_DDR_REFDIV(v)       SET_FIELD(PLL_DDR_CONFIG_REFDIV, v)
+#define PLL_DDR_OUTDIV(v)       SET_FIELD(PLL_DDR_CONFIG_OUTDIV, v)
+#define MK_PLL_DDR_CONF(frac, nint, ref, outdiv) \
+				(PLL_DDR_NFRAC(frac) | \
+				 PLL_DDR_REFDIV(ref) | \
+				 PLL_DDR_NINT(nint) | \
+				 PLL_DDR_OUTDIV(outdiv) | \
+				 QCA953X_PLL_CONFIG_PWD)
+
+#define PLL_CPU_CONF_VAL        MK_PLL_CPU_CONF(0, 26, 1, 0)
+#define PLL_DDR_CONF_VAL        MK_PLL_DDR_CONF(0, 15, 1, 0)
+
+#define PLL_CLK_CTRL_PLL_BYPASS (QCA953X_PLL_CLK_CTRL_CPU_PLL_BYPASS | \
+				 QCA953X_PLL_CLK_CTRL_DDR_PLL_BYPASS | \
+				 QCA953X_PLL_CLK_CTRL_AHB_PLL_BYPASS)
+
+#define PLL_CLK_CTRL_CPU_DIV(v) SET_FIELD(PLL_CLK_CTRL_CPU_POST_DIV, v)
+#define PLL_CLK_CTRL_DDR_DIV(v) SET_FIELD(PLL_CLK_CTRL_DDR_POST_DIV, v)
+#define PLL_CLK_CTRL_AHB_DIV(v) SET_FIELD(PLL_CLK_CTRL_AHB_POST_DIV, v)
+#define MK_PLL_CLK_CTRL(cpu, ddr, ahb) \
+				(PLL_CLK_CTRL_CPU_DIV(cpu) | \
+				 PLL_CLK_CTRL_DDR_DIV(ddr) | \
+				 PLL_CLK_CTRL_AHB_DIV(ahb))
+#define PLL_CLK_CTRL_VAL    (MK_PLL_CLK_CTRL(0, 0, 2) | \
+			     PLL_CLK_CTRL_PLL_BYPASS | \
+			     QCA953X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL | \
+			     QCA953X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL)
+
+#define PLL_DDR_DIT_FRAC_MAX(v)     SET_FIELD(PLL_DDR_DIT_FRAC_MAX, v)
+#define PLL_DDR_DIT_FRAC_MIN(v)     SET_FIELD(PLL_DDR_DIT_FRAC_MIN, v)
+#define PLL_DDR_DIT_FRAC_STEP(v)    SET_FIELD(PLL_DDR_DIT_FRAC_STEP, v)
+#define PLL_DDR_DIT_UPD_CNT(v)      SET_FIELD(PLL_DDR_DIT_UPD_CNT, v)
+#define PLL_CPU_DIT_FRAC_MAX(v)     SET_FIELD(PLL_CPU_DIT_FRAC_MAX, v)
+#define PLL_CPU_DIT_FRAC_MIN(v)     SET_FIELD(PLL_CPU_DIT_FRAC_MIN, v)
+#define PLL_CPU_DIT_FRAC_STEP(v)    SET_FIELD(PLL_CPU_DIT_FRAC_STEP, v)
+#define PLL_CPU_DIT_UPD_CNT(v)      SET_FIELD(PLL_CPU_DIT_UPD_CNT, v)
+#define MK_PLL_DDR_DIT_FRAC(max, min, step, cnt) \
+				(QCA953X_PLL_DIT_FRAC_EN | \
+				 PLL_DDR_DIT_FRAC_MAX(max) | \
+				 PLL_DDR_DIT_FRAC_MIN(min) | \
+				 PLL_DDR_DIT_FRAC_STEP(step) | \
+				 PLL_DDR_DIT_UPD_CNT(cnt))
+#define MK_PLL_CPU_DIT_FRAC(max, min, step, cnt) \
+				(QCA953X_PLL_DIT_FRAC_EN | \
+				 PLL_CPU_DIT_FRAC_MAX(max) | \
+				 PLL_CPU_DIT_FRAC_MIN(min) | \
+				 PLL_CPU_DIT_FRAC_STEP(step) | \
+				 PLL_CPU_DIT_UPD_CNT(cnt))
+#define PLL_CPU_DIT_FRAC_VAL    MK_PLL_CPU_DIT_FRAC(63, 0, 1, 15)
+#define PLL_DDR_DIT_FRAC_VAL    MK_PLL_DDR_DIT_FRAC(763, 635, 1, 15)
+
+    .text
+    .set noreorder
+
+LEAF(lowlevel_init)
+	/* RTC Reset */
+	li      t0, CKSEG1ADDR(AR71XX_RESET_BASE)
+	lw      t1, QCA953X_RESET_REG_RESET_MODULE(t0)
+	li      t2, 0x08000000
+	or      t1, t1, t2
+	sw      t1, QCA953X_RESET_REG_RESET_MODULE(t0)
+	nop
+	lw      t1, QCA953X_RESET_REG_RESET_MODULE(t0)
+	li      t2, 0xf7ffffff
+	and     t1, t1, t2
+	sw      t1, QCA953X_RESET_REG_RESET_MODULE(t0)
+	nop
+
+	/* RTC Force Wake */
+	li      t0, CKSEG1ADDR(QCA953X_RTC_BASE)
+	li      t1, 0x01
+	sw      t1, QCA953X_RTC_REG_SYNC_RESET(t0)
+	nop
+	nop
+
+	/* Wait for RTC in on state */
+1:
+	lw      t1, QCA953X_RTC_REG_SYNC_STATUS(t0)
+	andi    t1, t1, 0x02
+	beqz    t1, 1b
+	nop
+
+	li      t0, CKSEG1ADDR(QCA953X_SRIF_BASE)
+	li      t1, MK_DPLL2(2, 16)
+	sw      t1, QCA953X_SRIF_BB_DPLL2_REG(t0)
+	sw      t1, QCA953X_SRIF_PCIE_DPLL2_REG(t0)
+	sw      t1, QCA953X_SRIF_DDR_DPLL2_REG(t0)
+	sw      t1, QCA953X_SRIF_CPU_DPLL2_REG(t0)
+
+	li      t0, CKSEG1ADDR(AR71XX_PLL_BASE)
+	lw      t1, QCA953X_PLL_CLK_CTRL_REG(t0)
+	ori     t1, PLL_CLK_CTRL_PLL_BYPASS
+	sw      t1, QCA953X_PLL_CLK_CTRL_REG(t0)
+	nop
+
+	li      t1, PLL_CPU_CONF_VAL
+	sw      t1, QCA953X_PLL_CPU_CONFIG_REG(t0)
+	nop
+
+	li      t1, PLL_DDR_CONF_VAL
+	sw      t1, QCA953X_PLL_DDR_CONFIG_REG(t0)
+	nop
+
+	li      t1, PLL_CLK_CTRL_VAL
+	sw      t1, QCA953X_PLL_CLK_CTRL_REG(t0)
+	nop
+
+	lw      t1, QCA953X_PLL_CPU_CONFIG_REG(t0)
+	li      t2, ~QCA953X_PLL_CONFIG_PWD
+	and     t1, t1, t2
+	sw      t1, QCA953X_PLL_CPU_CONFIG_REG(t0)
+	nop
+
+	lw      t1, QCA953X_PLL_DDR_CONFIG_REG(t0)
+	li      t2, ~QCA953X_PLL_CONFIG_PWD
+	and     t1, t1, t2
+	sw      t1, QCA953X_PLL_DDR_CONFIG_REG(t0)
+	nop
+
+	lw      t1, QCA953X_PLL_CLK_CTRL_REG(t0)
+	li      t2, ~PLL_CLK_CTRL_PLL_BYPASS
+	and     t1, t1, t2
+	sw      t1, QCA953X_PLL_CLK_CTRL_REG(t0)
+	nop
+
+	li      t1, PLL_DDR_DIT_FRAC_VAL
+	sw      t1, QCA953X_PLL_DDR_DIT_FRAC_REG(t0)
+	nop
+
+	li      t1, PLL_CPU_DIT_FRAC_VAL
+	sw      t1, QCA953X_PLL_CPU_DIT_FRAC_REG(t0)
+	nop
+
+	li      t0, CKSEG1ADDR(AR71XX_RESET_BASE)
+	lui     t1, 0x03fc
+	sw      t1, 0xb4(t0)
+
+	nop
+	jr ra
+	 nop
+    END(lowlevel_init)
diff --git a/arch/mips/mach-ath79/reset.c b/arch/mips/mach-ath79/reset.c
new file mode 100644
index 0000000..188eccb
--- /dev/null
+++ b/arch/mips/mach-ath79/reset.c
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/errno.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ath79.h>
+#include <mach/ar71xx_regs.h>
+
+void _machine_restart(void)
+{
+	void __iomem *base;
+	u32 reg = 0;
+
+	base = map_physmem(AR71XX_RESET_BASE, AR71XX_RESET_SIZE,
+			   MAP_NOCACHE);
+	if (soc_is_ar71xx())
+		reg = AR71XX_RESET_REG_RESET_MODULE;
+	else if (soc_is_ar724x())
+		reg = AR724X_RESET_REG_RESET_MODULE;
+	else if (soc_is_ar913x())
+		reg = AR913X_RESET_REG_RESET_MODULE;
+	else if (soc_is_ar933x())
+		reg = AR933X_RESET_REG_RESET_MODULE;
+	else if (soc_is_ar934x())
+		reg = AR934X_RESET_REG_RESET_MODULE;
+	else if (soc_is_qca953x())
+		reg = QCA953X_RESET_REG_RESET_MODULE;
+	else if (soc_is_qca955x())
+		reg = QCA955X_RESET_REG_RESET_MODULE;
+	else if (soc_is_qca956x())
+		reg = QCA956X_RESET_REG_RESET_MODULE;
+	else
+		puts("Reset register not defined for this SOC\n");
+
+	if (reg)
+		setbits_be32(base + reg, AR71XX_RESET_FULL_CHIP);
+
+	while (1)
+		/* NOP */;
+}
+
+u32 get_bootstrap(void)
+{
+	void __iomem *base;
+	u32 reg = 0;
+
+	base = map_physmem(AR71XX_RESET_BASE, AR71XX_RESET_SIZE,
+			   MAP_NOCACHE);
+	if (soc_is_ar933x())
+		reg = AR933X_RESET_REG_BOOTSTRAP;
+	else if (soc_is_ar934x())
+		reg = AR934X_RESET_REG_BOOTSTRAP;
+	else if (soc_is_qca953x())
+		reg = QCA953X_RESET_REG_BOOTSTRAP;
+	else if (soc_is_qca955x())
+		reg = QCA955X_RESET_REG_BOOTSTRAP;
+	else if (soc_is_qca956x())
+		reg = QCA956X_RESET_REG_BOOTSTRAP;
+	else
+		puts("Bootstrap register not defined for this SOC\n");
+
+	if (reg)
+		return readl(base + reg);
+
+	return 0;
+}
+
+static int eth_init_ar933x(void)
+{
+	void __iomem *rregs = map_physmem(AR71XX_RESET_BASE, AR71XX_RESET_SIZE,
+					  MAP_NOCACHE);
+	void __iomem *pregs = map_physmem(AR71XX_PLL_BASE, AR71XX_PLL_SIZE,
+					  MAP_NOCACHE);
+	void __iomem *gregs = map_physmem(AR933X_GMAC_BASE, AR933X_GMAC_SIZE,
+					  MAP_NOCACHE);
+	const u32 mask = AR933X_RESET_GE0_MAC | AR933X_RESET_GE0_MDIO |
+			 AR933X_RESET_GE1_MAC | AR933X_RESET_GE1_MDIO |
+			 AR933X_RESET_ETH_SWITCH;
+
+	/* Clear MDIO slave EN bit. */
+	clrbits_be32(rregs + AR933X_RESET_REG_BOOTSTRAP, BIT(17));
+	mdelay(10);
+
+	/* Get Atheros S26 PHY out of reset. */
+	clrsetbits_be32(pregs + AR934X_PLL_SWITCH_CLOCK_CONTROL_REG,
+			0x1f, 0x10);
+	mdelay(10);
+
+	setbits_be32(rregs + AR933X_RESET_REG_RESET_MODULE, mask);
+	mdelay(10);
+	clrbits_be32(rregs + AR933X_RESET_REG_RESET_MODULE, mask);
+	mdelay(10);
+
+	/* Configure AR93xx GMAC register. */
+	clrsetbits_be32(gregs + AR933X_GMAC_REG_ETH_CFG,
+			AR933X_ETH_CFG_MII_GE0_MASTER |
+			AR933X_ETH_CFG_MII_GE0_SLAVE,
+			AR933X_ETH_CFG_MII_GE0_SLAVE);
+	return 0;
+}
+
+static int eth_init_ar934x(void)
+{
+	void __iomem *rregs = map_physmem(AR71XX_RESET_BASE, AR71XX_RESET_SIZE,
+					  MAP_NOCACHE);
+	void __iomem *pregs = map_physmem(AR71XX_PLL_BASE, AR71XX_PLL_SIZE,
+					  MAP_NOCACHE);
+	void __iomem *gregs = map_physmem(AR934X_GMAC_BASE, AR934X_GMAC_SIZE,
+					  MAP_NOCACHE);
+	const u32 mask = AR934X_RESET_GE0_MAC | AR934X_RESET_GE0_MDIO |
+			 AR934X_RESET_GE1_MAC | AR934X_RESET_GE1_MDIO |
+			 AR934X_RESET_ETH_SWITCH_ANALOG;
+	u32 reg;
+
+	reg = readl(rregs + AR934X_RESET_REG_BOOTSTRAP);
+	if (reg & AR934X_BOOTSTRAP_REF_CLK_40)
+		writel(0x570, pregs + AR934X_PLL_SWITCH_CLOCK_CONTROL_REG);
+	else
+		writel(0x271, pregs + AR934X_PLL_SWITCH_CLOCK_CONTROL_REG);
+	writel(BIT(26) | BIT(25), pregs + AR934X_PLL_ETH_XMII_CONTROL_REG);
+
+	setbits_be32(rregs + AR934X_RESET_REG_RESET_MODULE, mask);
+	mdelay(1);
+	clrbits_be32(rregs + AR934X_RESET_REG_RESET_MODULE, mask);
+	mdelay(1);
+
+	/* Configure AR934x GMAC register. */
+	writel(AR934X_ETH_CFG_RGMII_GMAC0, gregs + AR934X_GMAC_REG_ETH_CFG);
+	return 0;
+}
+
+int ath79_eth_reset(void)
+{
+	/*
+	 * Un-reset ethernet. DM still doesn't have any notion of reset
+	 * framework, so we do it by hand here.
+	 */
+	if (soc_is_ar933x())
+		return eth_init_ar933x();
+	if (soc_is_ar934x())
+		return eth_init_ar934x();
+
+	return -EINVAL;
+}
+
+static int usb_reset_ar933x(void __iomem *reset_regs)
+{
+	/* Ungate the USB block */
+	setbits_be32(reset_regs + AR933X_RESET_REG_RESET_MODULE,
+		     AR933X_RESET_USBSUS_OVERRIDE);
+	mdelay(1);
+	clrbits_be32(reset_regs + AR933X_RESET_REG_RESET_MODULE,
+		     AR933X_RESET_USB_HOST);
+	mdelay(1);
+	clrbits_be32(reset_regs + AR933X_RESET_REG_RESET_MODULE,
+		     AR933X_RESET_USB_PHY);
+	mdelay(1);
+
+	return 0;
+}
+
+static int usb_reset_ar934x(void __iomem *reset_regs)
+{
+	/* Ungate the USB block */
+	setbits_be32(reset_regs + AR934X_RESET_REG_RESET_MODULE,
+		     AR934X_RESET_USBSUS_OVERRIDE);
+	mdelay(1);
+	clrbits_be32(reset_regs + AR934X_RESET_REG_RESET_MODULE,
+		     AR934X_RESET_USB_PHY);
+	mdelay(1);
+	clrbits_be32(reset_regs + AR934X_RESET_REG_RESET_MODULE,
+		     AR934X_RESET_USB_PHY_ANALOG);
+	mdelay(1);
+	clrbits_be32(reset_regs + AR934X_RESET_REG_RESET_MODULE,
+		     AR934X_RESET_USB_HOST);
+	mdelay(1);
+
+	return 0;
+}
+
+int ath79_usb_reset(void)
+{
+	void __iomem *usbc_regs = map_physmem(AR71XX_USB_CTRL_BASE,
+					      AR71XX_USB_CTRL_SIZE,
+					      MAP_NOCACHE);
+	void __iomem *reset_regs = map_physmem(AR71XX_RESET_BASE,
+					       AR71XX_RESET_SIZE,
+					       MAP_NOCACHE);
+	/*
+	 * Turn on the Buff and Desc swap bits.
+	 * NOTE: This write into an undocumented register in mandatory to
+	 *       get the USB controller operational in BigEndian mode.
+	 */
+	writel(0xf0000, usbc_regs + AR71XX_USB_CTRL_REG_CONFIG);
+
+	if (soc_is_ar933x())
+		return usb_reset_ar933x(reset_regs);
+	if (soc_is_ar934x())
+		return usb_reset_ar934x(reset_regs);
+
+	return -EINVAL;
+}
diff --git a/arch/powerpc/include/asm/fsl_i2c.h b/arch/powerpc/include/asm/fsl_i2c.h
index cbbc834..d2586f9 100644
--- a/arch/powerpc/include/asm/fsl_i2c.h
+++ b/arch/powerpc/include/asm/fsl_i2c.h
@@ -16,7 +16,7 @@
 
 #include <asm/types.h>
 
-typedef struct fsl_i2c {
+typedef struct fsl_i2c_base {
 
 	u8 adr;		/* I2C slave address */
 	u8 res0[3];
@@ -68,4 +68,14 @@
 	u8 res6[0xE8];
 } fsl_i2c_t;
 
+#ifdef CONFIG_DM_I2C
+struct fsl_i2c_dev {
+	struct fsl_i2c_base __iomem *base;      /* register base */
+	u32 i2c_clk;
+	u32 index;
+	u8 slaveadd;
+	uint speed;
+};
+#endif
+
 #endif	/* _ASM_I2C_H_ */
diff --git a/arch/powerpc/include/asm/immap_85xx.h b/arch/powerpc/include/asm/immap_85xx.h
index 53ca6d9..07d2adf 100644
--- a/arch/powerpc/include/asm/immap_85xx.h
+++ b/arch/powerpc/include/asm/immap_85xx.h
@@ -120,8 +120,8 @@
 
 /* I2C Registers */
 typedef struct ccsr_i2c {
-	struct fsl_i2c	i2c[1];
-	u8	res[4096 - 1 * sizeof(struct fsl_i2c)];
+	struct fsl_i2c_base	i2c[1];
+	u8	res[4096 - 1 * sizeof(struct fsl_i2c_base)];
 } ccsr_i2c_t;
 
 #if defined(CONFIG_MPC8540) \
diff --git a/arch/powerpc/include/asm/immap_86xx.h b/arch/powerpc/include/asm/immap_86xx.h
index 177918b..b078569 100644
--- a/arch/powerpc/include/asm/immap_86xx.h
+++ b/arch/powerpc/include/asm/immap_86xx.h
@@ -92,8 +92,8 @@
 
 /* Daul I2C Registers(0x3000-0x4000) */
 typedef struct ccsr_i2c {
-	struct fsl_i2c	i2c[2];
-	u8	res[4096 - 2 * sizeof(struct fsl_i2c)];
+	struct fsl_i2c_base	i2c[2];
+	u8	res[4096 - 2 * sizeof(struct fsl_i2c_base)];
 } ccsr_i2c_t;
 
 /* DUART Registers(0x4000-0x5000) */
diff --git a/arch/sandbox/include/asm/io.h b/arch/sandbox/include/asm/io.h
index b87ee19..6919632 100644
--- a/arch/sandbox/include/asm/io.h
+++ b/arch/sandbox/include/asm/io.h
@@ -56,6 +56,21 @@
 void outw(unsigned int value, unsigned int addr);
 void outb(unsigned int value, unsigned int addr);
 
+static inline void _insw(volatile u16 *port, void *buf, int ns)
+{
+}
+
+static inline void _outsw(volatile u16 *port, const void *buf, int ns)
+{
+}
+
+#define insw(port, buf, ns)		_insw((u16 *)port, buf, ns)
+#define outsw(port, buf, ns)		_outsw((u16 *)port, buf, ns)
+
+/* For systemace.c */
+#define out16(addr, val)
+#define in16(addr)		0
+
 #include <iotrace.h>
 #include <asm/types.h>
 
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 4ef27dc..29d2307 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -47,6 +47,9 @@
 
 # architecture-specific options below
 
+config AHCI
+	default y
+
 config SYS_MALLOC_F_LEN
 	default 0x800
 
@@ -271,6 +274,13 @@
 	  to be used for speeding up boot time on future reboots and/or
 	  power cycles.
 
+	  For platforms that use Intel FSP for the memory initialization,
+	  please check FSP output HOB via U-Boot command 'fsp hob' to see
+	  if there is FSP_NON_VOLATILE_STORAGE_HOB_GUID (asm/fsp/fsp_hob.h).
+	  If such GUID does not exist, MRC cache is not avaiable on such
+	  platform (eg: Intel Queensbay), which means selecting this option
+	  here does not make any difference.
+
 config HAVE_MRC
 	bool "Add a System Agent binary"
 	depends on !HAVE_FSP
@@ -436,21 +446,13 @@
 config GENERATE_ACPI_TABLE
 	bool "Generate an ACPI (Advanced Configuration and Power Interface) table"
 	default n
+	select QFW if QEMU
 	help
 	  The Advanced Configuration and Power Interface (ACPI) specification
 	  provides an open standard for device configuration and management
 	  by the operating system. It defines platform-independent interfaces
 	  for configuration and power management monitoring.
 
-config QEMU_ACPI_TABLE
-	bool "Load ACPI table from QEMU fw_cfg interface"
-	depends on GENERATE_ACPI_TABLE && QEMU
-	default y
-	help
-	  By default, U-Boot generates its own ACPI tables. This option, if
-	  enabled, disables U-Boot's version and loads ACPI tables generated
-	  by QEMU.
-
 config GENERATE_SMBIOS_TABLE
 	bool "Generate an SMBIOS (System Management BIOS) table"
 	default y
@@ -462,6 +464,22 @@
 
 	  Check http://www.dmtf.org/standards/smbios for details.
 
+config SMBIOS_MANUFACTURER
+	string "SMBIOS Manufacturer"
+	depends on GENERATE_SMBIOS_TABLE
+	default SYS_VENDOR
+	help
+	  The board manufacturer to store in SMBIOS structures.
+	  Change this to override the default one (CONFIG_SYS_VENDOR).
+
+config SMBIOS_PRODUCT_NAME
+	string "SMBIOS Product Name"
+	depends on GENERATE_SMBIOS_TABLE
+	default SYS_BOARD
+	help
+	  The product name to store in SMBIOS structures.
+	  Change this to override the default one (CONFIG_SYS_BOARD).
+
 endmenu
 
 config MAX_PIRQ_LINKS
@@ -536,6 +554,20 @@
 
 	  Check http://www.seabios.org/SeaBIOS for details.
 
+config HIGH_TABLE_SIZE
+	hex "Size of configuration tables which reside in high memory"
+	default 0x10000
+	depends on SEABIOS
+	help
+	  SeaBIOS itself resides in E seg and F seg, where U-Boot puts all
+	  configuration tables like PIRQ/MP/ACPI. To avoid conflicts, U-Boot
+	  puts a copy of configuration tables in high memory region which
+	  is reserved on the stack before relocation. The region size is
+	  determined by this option.
+
+	  Increse it if the default size does not fit the board's needs.
+	  This is most likely due to a large ACPI DSDT table is used.
+
 source "arch/x86/lib/efi/Kconfig"
 
 endmenu
diff --git a/arch/x86/cpu/baytrail/Makefile b/arch/x86/cpu/baytrail/Makefile
index 5be5491..a0216f3 100644
--- a/arch/x86/cpu/baytrail/Makefile
+++ b/arch/x86/cpu/baytrail/Makefile
@@ -8,3 +8,4 @@
 obj-y += early_uart.o
 obj-y += fsp_configs.o
 obj-y += valleyview.o
+obj-$(CONFIG_GENERATE_ACPI_TABLE) += acpi.o
diff --git a/arch/x86/cpu/baytrail/acpi.c b/arch/x86/cpu/baytrail/acpi.c
new file mode 100644
index 0000000..1d54f7d
--- /dev/null
+++ b/arch/x86/cpu/baytrail/acpi.c
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2016, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/acpi_table.h>
+#include <asm/ioapic.h>
+#include <asm/mpspec.h>
+#include <asm/tables.h>
+#include <asm/arch/iomap.h>
+
+void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
+		      void *dsdt)
+{
+	struct acpi_table_header *header = &(fadt->header);
+	u16 pmbase = ACPI_BASE_ADDRESS;
+
+	memset((void *)fadt, 0, sizeof(struct acpi_fadt));
+
+	acpi_fill_header(header, "FACP");
+	header->length = sizeof(struct acpi_fadt);
+	header->revision = 4;
+
+	fadt->firmware_ctrl = (u32)facs;
+	fadt->dsdt = (u32)dsdt;
+	fadt->preferred_pm_profile = ACPI_PM_MOBILE;
+	fadt->sci_int = 9;
+	fadt->smi_cmd = 0;
+	fadt->acpi_enable = 0;
+	fadt->acpi_disable = 0;
+	fadt->s4bios_req = 0;
+	fadt->pstate_cnt = 0;
+	fadt->pm1a_evt_blk = pmbase;
+	fadt->pm1b_evt_blk = 0x0;
+	fadt->pm1a_cnt_blk = pmbase + 0x4;
+	fadt->pm1b_cnt_blk = 0x0;
+	fadt->pm2_cnt_blk = pmbase + 0x50;
+	fadt->pm_tmr_blk = pmbase + 0x8;
+	fadt->gpe0_blk = pmbase + 0x20;
+	fadt->gpe1_blk = 0;
+	fadt->pm1_evt_len = 4;
+	fadt->pm1_cnt_len = 2;
+	fadt->pm2_cnt_len = 1;
+	fadt->pm_tmr_len = 4;
+	fadt->gpe0_blk_len = 8;
+	fadt->gpe1_blk_len = 0;
+	fadt->gpe1_base = 0;
+	fadt->cst_cnt = 0;
+	fadt->p_lvl2_lat = ACPI_FADT_C2_NOT_SUPPORTED;
+	fadt->p_lvl3_lat = ACPI_FADT_C3_NOT_SUPPORTED;
+	fadt->flush_size = 0;
+	fadt->flush_stride = 0;
+	fadt->duty_offset = 1;
+	fadt->duty_width = 0;
+	fadt->day_alrm = 0x0d;
+	fadt->mon_alrm = 0x00;
+	fadt->century = 0x00;
+	fadt->iapc_boot_arch = ACPI_FADT_LEGACY_DEVICES | ACPI_FADT_8042;
+	fadt->flags = ACPI_FADT_WBINVD | ACPI_FADT_C1_SUPPORTED |
+		ACPI_FADT_C2_MP_SUPPORTED | ACPI_FADT_SLEEP_BUTTON |
+		ACPI_FADT_S4_RTC_WAKE | ACPI_FADT_RESET_REGISTER |
+		ACPI_FADT_PLATFORM_CLOCK;
+
+	fadt->reset_reg.space_id = ACPI_ADDRESS_SPACE_IO;
+	fadt->reset_reg.bit_width = 8;
+	fadt->reset_reg.bit_offset = 0;
+	fadt->reset_reg.access_size = ACPI_ACCESS_SIZE_BYTE_ACCESS;
+	fadt->reset_reg.addrl = IO_PORT_RESET;
+	fadt->reset_reg.addrh = 0;
+	fadt->reset_value = SYS_RST | RST_CPU;
+
+	fadt->x_firmware_ctl_l = (u32)facs;
+	fadt->x_firmware_ctl_h = 0;
+	fadt->x_dsdt_l = (u32)dsdt;
+	fadt->x_dsdt_h = 0;
+
+	fadt->x_pm1a_evt_blk.space_id = ACPI_ADDRESS_SPACE_IO;
+	fadt->x_pm1a_evt_blk.bit_width = fadt->pm1_evt_len * 8;
+	fadt->x_pm1a_evt_blk.bit_offset = 0;
+	fadt->x_pm1a_evt_blk.access_size = ACPI_ACCESS_SIZE_DWORD_ACCESS;
+	fadt->x_pm1a_evt_blk.addrl = fadt->pm1a_evt_blk;
+	fadt->x_pm1a_evt_blk.addrh = 0x0;
+
+	fadt->x_pm1b_evt_blk.space_id = ACPI_ADDRESS_SPACE_IO;
+	fadt->x_pm1b_evt_blk.bit_width = 0;
+	fadt->x_pm1b_evt_blk.bit_offset = 0;
+	fadt->x_pm1b_evt_blk.access_size = 0;
+	fadt->x_pm1b_evt_blk.addrl = 0x0;
+	fadt->x_pm1b_evt_blk.addrh = 0x0;
+
+	fadt->x_pm1a_cnt_blk.space_id = ACPI_ADDRESS_SPACE_IO;
+	fadt->x_pm1a_cnt_blk.bit_width = fadt->pm1_cnt_len * 8;
+	fadt->x_pm1a_cnt_blk.bit_offset = 0;
+	fadt->x_pm1a_cnt_blk.access_size = ACPI_ACCESS_SIZE_WORD_ACCESS;
+	fadt->x_pm1a_cnt_blk.addrl = fadt->pm1a_cnt_blk;
+	fadt->x_pm1a_cnt_blk.addrh = 0x0;
+
+	fadt->x_pm1b_cnt_blk.space_id = ACPI_ADDRESS_SPACE_IO;
+	fadt->x_pm1b_cnt_blk.bit_width = 0;
+	fadt->x_pm1b_cnt_blk.bit_offset = 0;
+	fadt->x_pm1b_cnt_blk.access_size = 0;
+	fadt->x_pm1b_cnt_blk.addrl = 0x0;
+	fadt->x_pm1b_cnt_blk.addrh = 0x0;
+
+	fadt->x_pm2_cnt_blk.space_id = ACPI_ADDRESS_SPACE_IO;
+	fadt->x_pm2_cnt_blk.bit_width = fadt->pm2_cnt_len * 8;
+	fadt->x_pm2_cnt_blk.bit_offset = 0;
+	fadt->x_pm2_cnt_blk.access_size = ACPI_ACCESS_SIZE_BYTE_ACCESS;
+	fadt->x_pm2_cnt_blk.addrl = fadt->pm2_cnt_blk;
+	fadt->x_pm2_cnt_blk.addrh = 0x0;
+
+	fadt->x_pm_tmr_blk.space_id = ACPI_ADDRESS_SPACE_IO;
+	fadt->x_pm_tmr_blk.bit_width = fadt->pm_tmr_len * 8;
+	fadt->x_pm_tmr_blk.bit_offset = 0;
+	fadt->x_pm_tmr_blk.access_size = ACPI_ACCESS_SIZE_DWORD_ACCESS;
+	fadt->x_pm_tmr_blk.addrl = fadt->pm_tmr_blk;
+	fadt->x_pm_tmr_blk.addrh = 0x0;
+
+	fadt->x_gpe0_blk.space_id = ACPI_ADDRESS_SPACE_IO;
+	fadt->x_gpe0_blk.bit_width = fadt->gpe0_blk_len * 8;
+	fadt->x_gpe0_blk.bit_offset = 0;
+	fadt->x_gpe0_blk.access_size = ACPI_ACCESS_SIZE_DWORD_ACCESS;
+	fadt->x_gpe0_blk.addrl = fadt->gpe0_blk;
+	fadt->x_gpe0_blk.addrh = 0x0;
+
+	fadt->x_gpe1_blk.space_id = ACPI_ADDRESS_SPACE_IO;
+	fadt->x_gpe1_blk.bit_width = 0;
+	fadt->x_gpe1_blk.bit_offset = 0;
+	fadt->x_gpe1_blk.access_size = 0;
+	fadt->x_gpe1_blk.addrl = 0x0;
+	fadt->x_gpe1_blk.addrh = 0x0;
+
+	header->checksum = table_compute_checksum(fadt, header->length);
+}
+
+static int acpi_create_madt_irq_overrides(u32 current)
+{
+	struct acpi_madt_irqoverride *irqovr;
+	u16 sci_flags = MP_IRQ_TRIGGER_LEVEL | MP_IRQ_POLARITY_HIGH;
+	int length = 0;
+
+	irqovr = (void *)current;
+	length += acpi_create_madt_irqoverride(irqovr, 0, 0, 2, 0);
+
+	irqovr = (void *)(current + length);
+	length += acpi_create_madt_irqoverride(irqovr, 0, 9, 9, sci_flags);
+
+	return length;
+}
+
+u32 acpi_fill_madt(u32 current)
+{
+	current += acpi_create_madt_lapics(current);
+
+	current += acpi_create_madt_ioapic((struct acpi_madt_ioapic *)current,
+			2, IO_APIC_ADDR, 0);
+
+	current += acpi_create_madt_irq_overrides(current);
+
+	return current;
+}
diff --git a/arch/x86/cpu/baytrail/valleyview.c b/arch/x86/cpu/baytrail/valleyview.c
index 25382f9..b31f24e 100644
--- a/arch/x86/cpu/baytrail/valleyview.c
+++ b/arch/x86/cpu/baytrail/valleyview.c
@@ -53,14 +53,6 @@
 	return 0;
 }
 
-int reserve_arch(void)
-{
-#ifdef CONFIG_ENABLE_MRC_CACHE
-	return mrccache_reserve();
-#else
-	return 0;
-#endif
-}
 #endif
 
 void reset_cpu(ulong addr)
diff --git a/arch/x86/cpu/broadwell/pch.c b/arch/x86/cpu/broadwell/pch.c
index f0798a7..317f57d 100644
--- a/arch/x86/cpu/broadwell/pch.c
+++ b/arch/x86/cpu/broadwell/pch.c
@@ -109,7 +109,8 @@
 {
 	u32 reg32;
 
-	io_apic_set_id(0x02);
+	/* Make sure this is a unique ID within system */
+	io_apic_set_id(0x04);
 
 	/* affirm full set of redirection table entries ("write once") */
 	reg32 = io_apic_read(0x01);
diff --git a/arch/x86/cpu/broadwell/sata.c b/arch/x86/cpu/broadwell/sata.c
index dfb8486..2e47082 100644
--- a/arch/x86/cpu/broadwell/sata.c
+++ b/arch/x86/cpu/broadwell/sata.c
@@ -261,7 +261,7 @@
 
 U_BOOT_DRIVER(ahci_broadwell_drv) = {
 	.name		= "ahci_broadwell",
-	.id		= UCLASS_DISK,
+	.id		= UCLASS_AHCI,
 	.of_match	= broadwell_ahci_ids,
 	.ofdata_to_platdata	= broadwell_sata_ofdata_to_platdata,
 	.probe		= broadwell_sata_probe,
diff --git a/arch/x86/cpu/broadwell/sdram.c b/arch/x86/cpu/broadwell/sdram.c
index 4bf5d15..e7befde 100644
--- a/arch/x86/cpu/broadwell/sdram.c
+++ b/arch/x86/cpu/broadwell/sdram.c
@@ -190,11 +190,6 @@
 	return 0;
 }
 
-int reserve_arch(void)
-{
-	return mrccache_reserve();
-}
-
 int dram_init(void)
 {
 	struct pei_data _pei_data __aligned(8);
diff --git a/arch/x86/cpu/coreboot/coreboot.c b/arch/x86/cpu/coreboot/coreboot.c
index 845f86a..1b04203 100644
--- a/arch/x86/cpu/coreboot/coreboot.c
+++ b/arch/x86/cpu/coreboot/coreboot.c
@@ -39,15 +39,7 @@
 	return default_print_cpuinfo();
 }
 
-int last_stage_init(void)
-{
-	if (gd->flags & GD_FLG_COLD_BOOT)
-		timestamp_add_to_bootstage();
-
-	return 0;
-}
-
-void board_final_cleanup(void)
+static void board_final_cleanup(void)
 {
 	/*
 	 * Un-cache the ROM so the kernel has one
@@ -79,6 +71,16 @@
 	}
 }
 
+int last_stage_init(void)
+{
+	if (gd->flags & GD_FLG_COLD_BOOT)
+		timestamp_add_to_bootstage();
+
+	board_final_cleanup();
+
+	return 0;
+}
+
 int misc_init_r(void)
 {
 	return 0;
diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
index 233a6c8..e522ff3 100644
--- a/arch/x86/cpu/cpu.c
+++ b/arch/x86/cpu/cpu.c
@@ -25,10 +25,12 @@
 #include <errno.h>
 #include <malloc.h>
 #include <asm/control_regs.h>
+#include <asm/coreboot_tables.h>
 #include <asm/cpu.h>
 #include <asm/lapic.h>
 #include <asm/microcode.h>
 #include <asm/mp.h>
+#include <asm/mrccache.h>
 #include <asm/msr.h>
 #include <asm/mtrr.h>
 #include <asm/post.h>
@@ -661,10 +663,20 @@
 }
 
 #ifndef CONFIG_SYS_COREBOOT
+/*
+ * Implement a weak default function for boards that optionally
+ * need to clean up the system before jumping to the kernel.
+ */
+__weak void board_final_cleanup(void)
+{
+}
+
 int last_stage_init(void)
 {
 	write_tables();
 
+	board_final_cleanup();
+
 	return 0;
 }
 #endif
@@ -741,3 +753,18 @@
 
 	return 0;
 }
+
+#ifndef CONFIG_EFI_STUB
+int reserve_arch(void)
+{
+#ifdef CONFIG_ENABLE_MRC_CACHE
+	mrccache_reserve();
+#endif
+
+#ifdef CONFIG_SEABIOS
+	high_table_reserve();
+#endif
+
+	return 0;
+}
+#endif
diff --git a/arch/x86/cpu/intel_common/cpu.c b/arch/x86/cpu/intel_common/cpu.c
index 93e4505..0fdef6f 100644
--- a/arch/x86/cpu/intel_common/cpu.c
+++ b/arch/x86/cpu/intel_common/cpu.c
@@ -58,7 +58,7 @@
 		return -ENODEV;
 
 	/* Cause the SATA device to do its early init */
-	uclass_first_device(UCLASS_DISK, &dev);
+	uclass_first_device(UCLASS_AHCI, &dev);
 
 	return 0;
 }
diff --git a/arch/x86/cpu/interrupts.c b/arch/x86/cpu/interrupts.c
index 10dc4d4..dd2819a 100644
--- a/arch/x86/cpu/interrupts.c
+++ b/arch/x86/cpu/interrupts.c
@@ -15,14 +15,14 @@
 #include <dm.h>
 #include <asm/cache.h>
 #include <asm/control_regs.h>
+#include <asm/i8259.h>
 #include <asm/interrupt.h>
 #include <asm/io.h>
-#include <asm/processor-flags.h>
-#include <linux/compiler.h>
+#include <asm/lapic.h>
 #include <asm/msr.h>
+#include <asm/processor-flags.h>
 #include <asm/processor.h>
 #include <asm/u-boot-x86.h>
-#include <asm/i8259.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -266,6 +266,8 @@
 	i8259_init();
 #endif
 
+	lapic_setup();
+
 	/* Initialize core interrupt and exception functionality of CPU */
 	cpu_init_interrupts();
 
diff --git a/arch/x86/cpu/irq.c b/arch/x86/cpu/irq.c
index 295078305..df3cd0a 100644
--- a/arch/x86/cpu/irq.c
+++ b/arch/x86/cpu/irq.c
@@ -13,6 +13,7 @@
 #include <asm/irq.h>
 #include <asm/pci.h>
 #include <asm/pirq_routing.h>
+#include <asm/tables.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -121,6 +122,11 @@
 	priv->irq_mask = fdtdec_get_int(blob, node,
 					"intel,pirq-mask", PIRQ_BITMAP);
 
+	if (IS_ENABLED(CONFIG_GENERATE_ACPI_TABLE)) {
+		/* Reserve IRQ9 for SCI */
+		priv->irq_mask &= ~(1 << 9);
+	}
+
 	if (priv->config == PIRQ_VIA_IBASE) {
 		int ibase_off;
 
@@ -142,6 +148,9 @@
 		priv->ibase &= ~0xf;
 	}
 
+	priv->actl_8bit = fdtdec_get_bool(blob, node, "intel,actl-8bit");
+	priv->actl_addr = fdtdec_get_int(blob, node, "intel,actl-addr", 0);
+
 	cell = fdt_getprop(blob, node, "intel,pirq-routing", &len);
 	if (!cell || len % sizeof(struct pirq_routing))
 		return -EINVAL;
@@ -206,11 +215,30 @@
 
 	rt->size = irq_entries * sizeof(struct irq_info) + 32;
 
+	/* Fix up the table checksum */
+	rt->checksum = table_compute_checksum(rt, rt->size);
+
 	pirq_routing_table = rt;
 
 	return 0;
 }
 
+static void irq_enable_sci(struct udevice *dev)
+{
+	struct irq_router *priv = dev_get_priv(dev);
+
+	if (priv->actl_8bit) {
+		/* Bit7 must be turned on to enable ACPI */
+		dm_pci_write_config8(dev->parent, priv->actl_addr, 0x80);
+	} else {
+		/* Write 0 to enable SCI on IRQ9 */
+		if (priv->config == PIRQ_VIA_PCI)
+			dm_pci_write_config32(dev->parent, priv->actl_addr, 0);
+		else
+			writel(0, priv->ibase + priv->actl_addr);
+	}
+}
+
 int irq_router_common_init(struct udevice *dev)
 {
 	int ret;
@@ -224,6 +252,9 @@
 	pirq_route_irqs(dev, pirq_routing_table->slots,
 			get_irq_slot_count(pirq_routing_table));
 
+	if (IS_ENABLED(CONFIG_GENERATE_ACPI_TABLE))
+		irq_enable_sci(dev);
+
 	return 0;
 }
 
diff --git a/arch/x86/cpu/ivybridge/bd82x6x.c b/arch/x86/cpu/ivybridge/bd82x6x.c
index 4c039ac..5b58d6c 100644
--- a/arch/x86/cpu/ivybridge/bd82x6x.c
+++ b/arch/x86/cpu/ivybridge/bd82x6x.c
@@ -162,7 +162,7 @@
 		return 0;
 
 	/* Cause the SATA device to do its init */
-	uclass_first_device(UCLASS_DISK, &dev);
+	uclass_first_device(UCLASS_AHCI, &dev);
 
 	ret = syscon_get_by_driver_data(X86_SYSCON_GMA, &gma_dev);
 	if (ret)
diff --git a/arch/x86/cpu/ivybridge/lpc.c b/arch/x86/cpu/ivybridge/lpc.c
index 88ab797..ff1faa5 100644
--- a/arch/x86/cpu/ivybridge/lpc.c
+++ b/arch/x86/cpu/ivybridge/lpc.c
@@ -12,7 +12,6 @@
 #include <fdtdec.h>
 #include <rtc.h>
 #include <pci.h>
-#include <asm/acpi.h>
 #include <asm/intel_regs.h>
 #include <asm/interrupt.h>
 #include <asm/io.h>
diff --git a/arch/x86/cpu/ivybridge/model_206ax.c b/arch/x86/cpu/ivybridge/model_206ax.c
index cef4256..38e244b 100644
--- a/arch/x86/cpu/ivybridge/model_206ax.c
+++ b/arch/x86/cpu/ivybridge/model_206ax.c
@@ -12,10 +12,8 @@
 #include <dm.h>
 #include <fdtdec.h>
 #include <malloc.h>
-#include <asm/acpi.h>
 #include <asm/cpu.h>
 #include <asm/cpu_x86.h>
-#include <asm/lapic.h>
 #include <asm/msr.h>
 #include <asm/msr-index.h>
 #include <asm/mtrr.h>
@@ -419,7 +417,6 @@
 
 	/* Enable the local cpu apics */
 	enable_lapic_tpr();
-	lapic_setup();
 
 	/* Enable virtualization if enabled in CMOS */
 	enable_vmx();
diff --git a/arch/x86/cpu/ivybridge/northbridge.c b/arch/x86/cpu/ivybridge/northbridge.c
index f7e0bc3..491f289 100644
--- a/arch/x86/cpu/ivybridge/northbridge.c
+++ b/arch/x86/cpu/ivybridge/northbridge.c
@@ -10,7 +10,6 @@
 #include <common.h>
 #include <dm.h>
 #include <asm/msr.h>
-#include <asm/acpi.h>
 #include <asm/cpu.h>
 #include <asm/intel_regs.h>
 #include <asm/io.h>
diff --git a/arch/x86/cpu/ivybridge/sata.c b/arch/x86/cpu/ivybridge/sata.c
index c3d1057..1ce8195 100644
--- a/arch/x86/cpu/ivybridge/sata.c
+++ b/arch/x86/cpu/ivybridge/sata.c
@@ -233,7 +233,7 @@
 
 U_BOOT_DRIVER(ahci_ivybridge_drv) = {
 	.name		= "ahci_ivybridge",
-	.id		= UCLASS_DISK,
+	.id		= UCLASS_AHCI,
 	.of_match	= bd82x6x_ahci_ids,
 	.probe		= bd82x6x_sata_probe,
 };
diff --git a/arch/x86/cpu/ivybridge/sdram.c b/arch/x86/cpu/ivybridge/sdram.c
index e35e543..9d9f63d 100644
--- a/arch/x86/cpu/ivybridge/sdram.c
+++ b/arch/x86/cpu/ivybridge/sdram.c
@@ -201,11 +201,6 @@
 	return false;
 }
 
-int reserve_arch(void)
-{
-	return mrccache_reserve();
-}
-
 static int copy_spd(struct udevice *dev, struct pei_data *peid)
 {
 	const void *data;
diff --git a/arch/x86/cpu/lapic.c b/arch/x86/cpu/lapic.c
index 30d2313..fbea2d1 100644
--- a/arch/x86/cpu/lapic.c
+++ b/arch/x86/cpu/lapic.c
@@ -65,23 +65,27 @@
 
 void enable_lapic(void)
 {
-	msr_t msr;
+	if (!IS_ENABLED(CONFIG_INTEL_QUARK)) {
+		msr_t msr;
 
-	msr = msr_read(MSR_IA32_APICBASE);
-	msr.hi &= 0xffffff00;
-	msr.lo |= MSR_IA32_APICBASE_ENABLE;
-	msr.lo &= ~MSR_IA32_APICBASE_BASE;
-	msr.lo |= LAPIC_DEFAULT_BASE;
-	msr_write(MSR_IA32_APICBASE, msr);
+		msr = msr_read(MSR_IA32_APICBASE);
+		msr.hi &= 0xffffff00;
+		msr.lo |= MSR_IA32_APICBASE_ENABLE;
+		msr.lo &= ~MSR_IA32_APICBASE_BASE;
+		msr.lo |= LAPIC_DEFAULT_BASE;
+		msr_write(MSR_IA32_APICBASE, msr);
+	}
 }
 
 void disable_lapic(void)
 {
-	msr_t msr;
+	if (!IS_ENABLED(CONFIG_INTEL_QUARK)) {
+		msr_t msr;
 
-	msr = msr_read(MSR_IA32_APICBASE);
-	msr.lo &= ~MSR_IA32_APICBASE_ENABLE;
-	msr_write(MSR_IA32_APICBASE, msr);
+		msr = msr_read(MSR_IA32_APICBASE);
+		msr.lo &= ~MSR_IA32_APICBASE_ENABLE;
+		msr_write(MSR_IA32_APICBASE, msr);
+	}
 }
 
 unsigned long lapicid(void)
@@ -120,7 +124,6 @@
 
 void lapic_setup(void)
 {
-#ifdef CONFIG_SMP
 	/* Only Pentium Pro and later have those MSR stuff */
 	debug("Setting up local apic: ");
 
@@ -150,11 +153,7 @@
 		    LAPIC_DELIVERY_MODE_NMI));
 
 	debug("apic_id: 0x%02lx, ", lapicid());
-#else /* !CONFIG_SMP */
-	/* Only Pentium Pro and later have those MSR stuff */
-	debug("Disabling local apic: ");
-	disable_lapic();
-#endif /* CONFIG_SMP */
+
 	debug("done.\n");
 	post_code(POST_LAPIC);
 }
diff --git a/arch/x86/cpu/mp_init.c b/arch/x86/cpu/mp_init.c
index 2604a68..2b6b3bd 100644
--- a/arch/x86/cpu/mp_init.c
+++ b/arch/x86/cpu/mp_init.c
@@ -11,6 +11,7 @@
 #include <dm.h>
 #include <errno.h>
 #include <malloc.h>
+#include <qfw.h>
 #include <asm/atomic.h>
 #include <asm/cpu.h>
 #include <asm/interrupt.h>
@@ -21,7 +22,6 @@
 #include <asm/mtrr.h>
 #include <asm/processor.h>
 #include <asm/sipi.h>
-#include <asm/fw_cfg.h>
 #include <dm/device-internal.h>
 #include <dm/uclass-internal.h>
 #include <dm/lists.h>
@@ -408,8 +408,6 @@
 	cpu_get_name(processor_name);
 	debug("CPU: %s\n", processor_name);
 
-	lapic_setup();
-
 	apic_id = lapicid();
 	ret = find_cpu_by_apic_id(apic_id, devp);
 	if (ret) {
@@ -420,7 +418,7 @@
 	return 0;
 }
 
-#ifdef CONFIG_QEMU
+#ifdef CONFIG_QFW
 static int qemu_cpu_fixup(void)
 {
 	int ret;
@@ -496,7 +494,7 @@
 	if (ret)
 		return ret;
 
-#ifdef CONFIG_QEMU
+#ifdef CONFIG_QFW
 	ret = qemu_cpu_fixup();
 	if (ret)
 		return ret;
diff --git a/arch/x86/cpu/qemu/Makefile b/arch/x86/cpu/qemu/Makefile
index 6eeddf1..a080c5e 100644
--- a/arch/x86/cpu/qemu/Makefile
+++ b/arch/x86/cpu/qemu/Makefile
@@ -7,4 +7,5 @@
 ifndef CONFIG_EFI_STUB
 obj-y += car.o dram.o
 endif
-obj-y += cpu.o fw_cfg.o qemu.o
+obj-y += qemu.o
+obj-$(CONFIG_QFW) += cpu.o e820.o
diff --git a/arch/x86/cpu/qemu/cpu.c b/arch/x86/cpu/qemu/cpu.c
index a1b70c6..b1a965e 100644
--- a/arch/x86/cpu/qemu/cpu.c
+++ b/arch/x86/cpu/qemu/cpu.c
@@ -8,8 +8,8 @@
 #include <cpu.h>
 #include <dm.h>
 #include <errno.h>
+#include <qfw.h>
 #include <asm/cpu.h>
-#include <asm/fw_cfg.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
diff --git a/arch/x86/cpu/qemu/e820.c b/arch/x86/cpu/qemu/e820.c
new file mode 100644
index 0000000..63853e4
--- /dev/null
+++ b/arch/x86/cpu/qemu/e820.c
@@ -0,0 +1,43 @@
+/*
+ * (C) Copyright 2015 Miao Yan <yanmiaobest@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/e820.h>
+
+unsigned install_e820_map(unsigned max_entries, struct e820entry *entries)
+{
+	entries[0].addr = 0;
+	entries[0].size = ISA_START_ADDRESS;
+	entries[0].type = E820_RAM;
+
+	entries[1].addr = ISA_START_ADDRESS;
+	entries[1].size = ISA_END_ADDRESS - ISA_START_ADDRESS;
+	entries[1].type = E820_RESERVED;
+
+	/*
+	 * since we use memalign(malloc) to allocate high memory for
+	 * storing ACPI tables, we need to reserve them in e820 tables,
+	 * otherwise kernel will reclaim them and data will be corrupted
+	 */
+	entries[2].addr = ISA_END_ADDRESS;
+	entries[2].size = gd->relocaddr - TOTAL_MALLOC_LEN - ISA_END_ADDRESS;
+	entries[2].type = E820_RAM;
+
+	/* for simplicity, reserve entire malloc space */
+	entries[3].addr = gd->relocaddr - TOTAL_MALLOC_LEN;
+	entries[3].size = TOTAL_MALLOC_LEN;
+	entries[3].type = E820_RESERVED;
+
+	entries[4].addr = gd->relocaddr;
+	entries[4].size = gd->ram_size - gd->relocaddr;
+	entries[4].type = E820_RESERVED;
+
+	entries[5].addr = CONFIG_PCIE_ECAM_BASE;
+	entries[5].size = CONFIG_PCIE_ECAM_SIZE;
+	entries[5].type = E820_RESERVED;
+
+	return 6;
+}
diff --git a/arch/x86/cpu/qemu/fw_cfg.c b/arch/x86/cpu/qemu/fw_cfg.c
deleted file mode 100644
index 2e2794e..0000000
--- a/arch/x86/cpu/qemu/fw_cfg.c
+++ /dev/null
@@ -1,570 +0,0 @@
-/*
- * (C) Copyright 2015 Miao Yan <yanmiaobest@gmail.com>
- *
- * SPDX-License-Identifier:	GPL-2.0+
- */
-
-#include <common.h>
-#include <command.h>
-#include <errno.h>
-#include <malloc.h>
-#include <asm/io.h>
-#include <asm/fw_cfg.h>
-#include <asm/tables.h>
-#include <asm/e820.h>
-#include <linux/list.h>
-#include <memalign.h>
-
-static bool fwcfg_present;
-static bool fwcfg_dma_present;
-
-static LIST_HEAD(fw_list);
-
-/* Read configuration item using fw_cfg PIO interface */
-static void qemu_fwcfg_read_entry_pio(uint16_t entry,
-		uint32_t size, void *address)
-{
-	uint32_t i = 0;
-	uint8_t *data = address;
-
-	/*
-	 * writting FW_CFG_INVALID will cause read operation to resume at
-	 * last offset, otherwise read will start at offset 0
-	 */
-	if (entry != FW_CFG_INVALID)
-		outw(entry, FW_CONTROL_PORT);
-	while (size--)
-		data[i++] = inb(FW_DATA_PORT);
-}
-
-/* Read configuration item using fw_cfg DMA interface */
-static void qemu_fwcfg_read_entry_dma(uint16_t entry,
-		uint32_t size, void *address)
-{
-	struct fw_cfg_dma_access dma;
-
-	dma.length = cpu_to_be32(size);
-	dma.address = cpu_to_be64((uintptr_t)address);
-	dma.control = cpu_to_be32(FW_CFG_DMA_READ);
-
-	/*
-	 * writting FW_CFG_INVALID will cause read operation to resume at
-	 * last offset, otherwise read will start at offset 0
-	 */
-	if (entry != FW_CFG_INVALID)
-		dma.control |= cpu_to_be32(FW_CFG_DMA_SELECT | (entry << 16));
-
-	barrier();
-
-	debug("qemu_fwcfg_dma_read_entry: addr %p, length %u control 0x%x\n",
-	      address, size, be32_to_cpu(dma.control));
-
-	outl(cpu_to_be32((uint32_t)&dma), FW_DMA_PORT_HIGH);
-
-	while (be32_to_cpu(dma.control) & ~FW_CFG_DMA_ERROR)
-		__asm__ __volatile__ ("pause");
-}
-
-static bool qemu_fwcfg_present(void)
-{
-	uint32_t qemu;
-
-	qemu_fwcfg_read_entry_pio(FW_CFG_SIGNATURE, 4, &qemu);
-	return be32_to_cpu(qemu) == QEMU_FW_CFG_SIGNATURE;
-}
-
-static bool qemu_fwcfg_dma_present(void)
-{
-	uint8_t dma_enabled;
-
-	qemu_fwcfg_read_entry_pio(FW_CFG_ID, 1, &dma_enabled);
-	if (dma_enabled & FW_CFG_DMA_ENABLED)
-		return true;
-
-	return false;
-}
-
-static void qemu_fwcfg_read_entry(uint16_t entry,
-		uint32_t length, void *address)
-{
-	if (fwcfg_dma_present)
-		qemu_fwcfg_read_entry_dma(entry, length, address);
-	else
-		qemu_fwcfg_read_entry_pio(entry, length, address);
-}
-
-int qemu_fwcfg_online_cpus(void)
-{
-	uint16_t nb_cpus;
-
-	if (!fwcfg_present)
-		return -ENODEV;
-
-	qemu_fwcfg_read_entry(FW_CFG_NB_CPUS, 2, &nb_cpus);
-
-	return le16_to_cpu(nb_cpus);
-}
-
-/*
- * This function prepares kernel for zboot. It loads kernel data
- * to 'load_addr', initrd to 'initrd_addr' and kernel command
- * line using qemu fw_cfg interface.
- */
-static int qemu_fwcfg_setup_kernel(void *load_addr, void *initrd_addr)
-{
-	char *data_addr;
-	uint32_t setup_size, kernel_size, cmdline_size, initrd_size;
-
-	qemu_fwcfg_read_entry(FW_CFG_SETUP_SIZE, 4, &setup_size);
-	qemu_fwcfg_read_entry(FW_CFG_KERNEL_SIZE, 4, &kernel_size);
-
-	if (setup_size == 0 || kernel_size == 0) {
-		printf("warning: no kernel available\n");
-		return -1;
-	}
-
-	data_addr = load_addr;
-	qemu_fwcfg_read_entry(FW_CFG_SETUP_DATA,
-			      le32_to_cpu(setup_size), data_addr);
-	data_addr += le32_to_cpu(setup_size);
-
-	qemu_fwcfg_read_entry(FW_CFG_KERNEL_DATA,
-			      le32_to_cpu(kernel_size), data_addr);
-	data_addr += le32_to_cpu(kernel_size);
-
-	data_addr = initrd_addr;
-	qemu_fwcfg_read_entry(FW_CFG_INITRD_SIZE, 4, &initrd_size);
-	if (initrd_size == 0) {
-		printf("warning: no initrd available\n");
-	} else {
-		qemu_fwcfg_read_entry(FW_CFG_INITRD_DATA,
-				      le32_to_cpu(initrd_size), data_addr);
-		data_addr += le32_to_cpu(initrd_size);
-	}
-
-	qemu_fwcfg_read_entry(FW_CFG_CMDLINE_SIZE, 4, &cmdline_size);
-	if (cmdline_size) {
-		qemu_fwcfg_read_entry(FW_CFG_CMDLINE_DATA,
-				      le32_to_cpu(cmdline_size), data_addr);
-		/*
-		 * if kernel cmdline only contains '\0', (e.g. no -append
-		 * when invoking qemu), do not update bootargs
-		 */
-		if (*data_addr != '\0') {
-			if (setenv("bootargs", data_addr) < 0)
-				printf("warning: unable to change bootargs\n");
-		}
-	}
-
-	printf("loading kernel to address %p size %x", load_addr,
-	       le32_to_cpu(kernel_size));
-	if (initrd_size)
-		printf(" initrd %p size %x\n",
-		       initrd_addr,
-		       le32_to_cpu(initrd_size));
-	else
-		printf("\n");
-
-	return 0;
-}
-
-static int qemu_fwcfg_read_firmware_list(void)
-{
-	int i;
-	uint32_t count;
-	struct fw_file *file;
-	struct list_head *entry;
-
-	/* don't read it twice */
-	if (!list_empty(&fw_list))
-		return 0;
-
-	qemu_fwcfg_read_entry(FW_CFG_FILE_DIR, 4, &count);
-	if (!count)
-		return 0;
-
-	count = be32_to_cpu(count);
-	for (i = 0; i < count; i++) {
-		file = malloc(sizeof(*file));
-		if (!file) {
-			printf("error: allocating resource\n");
-			goto err;
-		}
-		qemu_fwcfg_read_entry(FW_CFG_INVALID,
-				      sizeof(struct fw_cfg_file), &file->cfg);
-		file->addr = 0;
-		list_add_tail(&file->list, &fw_list);
-	}
-
-	return 0;
-
-err:
-	list_for_each(entry, &fw_list) {
-		file = list_entry(entry, struct fw_file, list);
-		free(file);
-	}
-
-	return -ENOMEM;
-}
-
-#ifdef CONFIG_QEMU_ACPI_TABLE
-static struct fw_file *qemu_fwcfg_find_file(const char *name)
-{
-	struct list_head *entry;
-	struct fw_file *file;
-
-	list_for_each(entry, &fw_list) {
-		file = list_entry(entry, struct fw_file, list);
-		if (!strcmp(file->cfg.name, name))
-			return file;
-	}
-
-	return NULL;
-}
-
-/*
- * This function allocates memory for ACPI tables
- *
- * @entry : BIOS linker command entry which tells where to allocate memory
- *          (either high memory or low memory)
- * @addr  : The address that should be used for low memory allcation. If the
- *          memory allocation request is 'ZONE_HIGH' then this parameter will
- *          be ignored.
- * @return: 0 on success, or negative value on failure
- */
-static int bios_linker_allocate(struct bios_linker_entry *entry, u32 *addr)
-{
-	uint32_t size, align;
-	struct fw_file *file;
-	unsigned long aligned_addr;
-
-	align = le32_to_cpu(entry->alloc.align);
-	/* align must be power of 2 */
-	if (align & (align - 1)) {
-		printf("error: wrong alignment %u\n", align);
-		return -EINVAL;
-	}
-
-	file = qemu_fwcfg_find_file(entry->alloc.file);
-	if (!file) {
-		printf("error: can't find file %s\n", entry->alloc.file);
-		return -ENOENT;
-	}
-
-	size = be32_to_cpu(file->cfg.size);
-
-	/*
-	 * ZONE_HIGH means we need to allocate from high memory, since
-	 * malloc space is already at the end of RAM, so we directly use it.
-	 * If allocation zone is ZONE_FSEG, then we use the 'addr' passed
-	 * in which is low memory
-	 */
-	if (entry->alloc.zone == BIOS_LINKER_LOADER_ALLOC_ZONE_HIGH) {
-		aligned_addr = (unsigned long)memalign(align, size);
-		if (!aligned_addr) {
-			printf("error: allocating resource\n");
-			return -ENOMEM;
-		}
-	} else if (entry->alloc.zone == BIOS_LINKER_LOADER_ALLOC_ZONE_FSEG) {
-		aligned_addr = ALIGN(*addr, align);
-	} else {
-		printf("error: invalid allocation zone\n");
-		return -EINVAL;
-	}
-
-	debug("bios_linker_allocate: allocate file %s, size %u, zone %d, align %u, addr 0x%lx\n",
-	      file->cfg.name, size, entry->alloc.zone, align, aligned_addr);
-
-	qemu_fwcfg_read_entry(be16_to_cpu(file->cfg.select),
-			      size, (void *)aligned_addr);
-	file->addr = aligned_addr;
-
-	/* adjust address for low memory allocation */
-	if (entry->alloc.zone == BIOS_LINKER_LOADER_ALLOC_ZONE_FSEG)
-		*addr = (aligned_addr + size);
-
-	return 0;
-}
-
-/*
- * This function patches ACPI tables previously loaded
- * by bios_linker_allocate()
- *
- * @entry : BIOS linker command entry which tells how to patch
- *          ACPI tables
- * @return: 0 on success, or negative value on failure
- */
-static int bios_linker_add_pointer(struct bios_linker_entry *entry)
-{
-	struct fw_file *dest, *src;
-	uint32_t offset = le32_to_cpu(entry->pointer.offset);
-	uint64_t pointer = 0;
-
-	dest = qemu_fwcfg_find_file(entry->pointer.dest_file);
-	if (!dest || !dest->addr)
-		return -ENOENT;
-	src = qemu_fwcfg_find_file(entry->pointer.src_file);
-	if (!src || !src->addr)
-		return -ENOENT;
-
-	debug("bios_linker_add_pointer: dest->addr 0x%lx, src->addr 0x%lx, offset 0x%x size %u, 0x%llx\n",
-	      dest->addr, src->addr, offset, entry->pointer.size, pointer);
-
-	memcpy(&pointer, (char *)dest->addr + offset, entry->pointer.size);
-	pointer	= le64_to_cpu(pointer);
-	pointer += (unsigned long)src->addr;
-	pointer	= cpu_to_le64(pointer);
-	memcpy((char *)dest->addr + offset, &pointer, entry->pointer.size);
-
-	return 0;
-}
-
-/*
- * This function updates checksum fields of ACPI tables previously loaded
- * by bios_linker_allocate()
- *
- * @entry : BIOS linker command entry which tells where to update ACPI table
- *          checksums
- * @return: 0 on success, or negative value on failure
- */
-static int bios_linker_add_checksum(struct bios_linker_entry *entry)
-{
-	struct fw_file *file;
-	uint8_t *data, cksum = 0;
-	uint8_t *cksum_start;
-
-	file = qemu_fwcfg_find_file(entry->cksum.file);
-	if (!file || !file->addr)
-		return -ENOENT;
-
-	data = (uint8_t *)(file->addr + le32_to_cpu(entry->cksum.offset));
-	cksum_start = (uint8_t *)(file->addr + le32_to_cpu(entry->cksum.start));
-	cksum = table_compute_checksum(cksum_start,
-				       le32_to_cpu(entry->cksum.length));
-	*data = cksum;
-
-	return 0;
-}
-
-unsigned install_e820_map(unsigned max_entries, struct e820entry *entries)
-{
-	entries[0].addr = 0;
-	entries[0].size = ISA_START_ADDRESS;
-	entries[0].type = E820_RAM;
-
-	entries[1].addr = ISA_START_ADDRESS;
-	entries[1].size = ISA_END_ADDRESS - ISA_START_ADDRESS;
-	entries[1].type = E820_RESERVED;
-
-	/*
-	 * since we use memalign(malloc) to allocate high memory for
-	 * storing ACPI tables, we need to reserve them in e820 tables,
-	 * otherwise kernel will reclaim them and data will be corrupted
-	 */
-	entries[2].addr = ISA_END_ADDRESS;
-	entries[2].size = gd->relocaddr - TOTAL_MALLOC_LEN - ISA_END_ADDRESS;
-	entries[2].type = E820_RAM;
-
-	/* for simplicity, reserve entire malloc space */
-	entries[3].addr = gd->relocaddr - TOTAL_MALLOC_LEN;
-	entries[3].size = TOTAL_MALLOC_LEN;
-	entries[3].type = E820_RESERVED;
-
-	entries[4].addr = gd->relocaddr;
-	entries[4].size = gd->ram_size - gd->relocaddr;
-	entries[4].type = E820_RESERVED;
-
-	entries[5].addr = CONFIG_PCIE_ECAM_BASE;
-	entries[5].size = CONFIG_PCIE_ECAM_SIZE;
-	entries[5].type = E820_RESERVED;
-
-	return 6;
-}
-
-/* This function loads and patches ACPI tables provided by QEMU */
-u32 write_acpi_tables(u32 addr)
-{
-	int i, ret = 0;
-	struct fw_file *file;
-	struct bios_linker_entry *table_loader;
-	struct bios_linker_entry *entry;
-	uint32_t size;
-	struct list_head *list;
-
-	/* make sure fw_list is loaded */
-	ret = qemu_fwcfg_read_firmware_list();
-	if (ret) {
-		printf("error: can't read firmware file list\n");
-		return addr;
-	}
-
-	file = qemu_fwcfg_find_file("etc/table-loader");
-	if (!file) {
-		printf("error: can't find etc/table-loader\n");
-		return addr;
-	}
-
-	size = be32_to_cpu(file->cfg.size);
-	if ((size % sizeof(*entry)) != 0) {
-		printf("error: table-loader maybe corrupted\n");
-		return addr;
-	}
-
-	table_loader = malloc(size);
-	if (!table_loader) {
-		printf("error: no memory for table-loader\n");
-		return addr;
-	}
-
-	qemu_fwcfg_read_entry(be16_to_cpu(file->cfg.select),
-			      size, table_loader);
-
-	for (i = 0; i < (size / sizeof(*entry)); i++) {
-		entry = table_loader + i;
-		switch (le32_to_cpu(entry->command)) {
-		case BIOS_LINKER_LOADER_COMMAND_ALLOCATE:
-			ret = bios_linker_allocate(entry, &addr);
-			if (ret)
-				goto out;
-			break;
-		case BIOS_LINKER_LOADER_COMMAND_ADD_POINTER:
-			ret = bios_linker_add_pointer(entry);
-			if (ret)
-				goto out;
-			break;
-		case BIOS_LINKER_LOADER_COMMAND_ADD_CHECKSUM:
-			ret = bios_linker_add_checksum(entry);
-			if (ret)
-				goto out;
-			break;
-		default:
-			break;
-		}
-	}
-
-out:
-	if (ret) {
-		list_for_each(list, &fw_list) {
-			file = list_entry(list, struct fw_file, list);
-			if (file->addr)
-				free((void *)file->addr);
-		}
-	}
-
-	free(table_loader);
-	return addr;
-}
-#endif
-
-static int qemu_fwcfg_list_firmware(void)
-{
-	int ret;
-	struct list_head *entry;
-	struct fw_file *file;
-
-	/* make sure fw_list is loaded */
-	ret = qemu_fwcfg_read_firmware_list();
-	if (ret)
-		return ret;
-
-	list_for_each(entry, &fw_list) {
-		file = list_entry(entry, struct fw_file, list);
-		printf("%-56s\n", file->cfg.name);
-	}
-
-	return 0;
-}
-
-void qemu_fwcfg_init(void)
-{
-	fwcfg_present = qemu_fwcfg_present();
-	if (fwcfg_present)
-		fwcfg_dma_present = qemu_fwcfg_dma_present();
-}
-
-static int qemu_fwcfg_do_list(cmd_tbl_t *cmdtp, int flag,
-		int argc, char * const argv[])
-{
-	if (qemu_fwcfg_list_firmware() < 0)
-		return CMD_RET_FAILURE;
-
-	return 0;
-}
-
-static int qemu_fwcfg_do_cpus(cmd_tbl_t *cmdtp, int flag,
-		int argc, char * const argv[])
-{
-	int ret = qemu_fwcfg_online_cpus();
-	if (ret < 0) {
-		printf("QEMU fw_cfg interface not found\n");
-		return CMD_RET_FAILURE;
-	}
-
-	printf("%d cpu(s) online\n", qemu_fwcfg_online_cpus());
-
-	return 0;
-}
-
-static int qemu_fwcfg_do_load(cmd_tbl_t *cmdtp, int flag,
-		int argc, char * const argv[])
-{
-	char *env;
-	void *load_addr;
-	void *initrd_addr;
-
-	env = getenv("loadaddr");
-	load_addr = env ?
-		(void *)simple_strtoul(env, NULL, 16) :
-		(void *)CONFIG_LOADADDR;
-
-	env = getenv("ramdiskaddr");
-	initrd_addr = env ?
-		(void *)simple_strtoul(env, NULL, 16) :
-		(void *)CONFIG_RAMDISK_ADDR;
-
-	if (argc == 2) {
-		load_addr = (void *)simple_strtoul(argv[0], NULL, 16);
-		initrd_addr = (void *)simple_strtoul(argv[1], NULL, 16);
-	} else if (argc == 1) {
-		load_addr = (void *)simple_strtoul(argv[0], NULL, 16);
-	}
-
-	return qemu_fwcfg_setup_kernel(load_addr, initrd_addr);
-}
-
-static cmd_tbl_t fwcfg_commands[] = {
-	U_BOOT_CMD_MKENT(list, 0, 1, qemu_fwcfg_do_list, "", ""),
-	U_BOOT_CMD_MKENT(cpus, 0, 1, qemu_fwcfg_do_cpus, "", ""),
-	U_BOOT_CMD_MKENT(load, 2, 1, qemu_fwcfg_do_load, "", ""),
-};
-
-static int do_qemu_fw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
-{
-	int ret;
-	cmd_tbl_t *fwcfg_cmd;
-
-	if (!fwcfg_present) {
-		printf("QEMU fw_cfg interface not found\n");
-		return CMD_RET_USAGE;
-	}
-
-	fwcfg_cmd = find_cmd_tbl(argv[1], fwcfg_commands,
-				 ARRAY_SIZE(fwcfg_commands));
-	argc -= 2;
-	argv += 2;
-	if (!fwcfg_cmd || argc > fwcfg_cmd->maxargs)
-		return CMD_RET_USAGE;
-
-	ret = fwcfg_cmd->cmd(fwcfg_cmd, flag, argc, argv);
-
-	return cmd_process_error(fwcfg_cmd, ret);
-}
-
-U_BOOT_CMD(
-	qfw,	4,	1,	do_qemu_fw,
-	"QEMU firmware interface",
-	"<command>\n"
-	"    - list                             : print firmware(s) currently loaded\n"
-	"    - cpus                             : print online cpu number\n"
-	"    - load <kernel addr> <initrd addr> : load kernel and initrd (if any), and setup for zboot\n"
-)
diff --git a/arch/x86/cpu/qemu/qemu.c b/arch/x86/cpu/qemu/qemu.c
index 7ad0ee4..680e558 100644
--- a/arch/x86/cpu/qemu/qemu.c
+++ b/arch/x86/cpu/qemu/qemu.c
@@ -6,15 +6,59 @@
 
 #include <common.h>
 #include <pci.h>
+#include <qfw.h>
 #include <asm/irq.h>
 #include <asm/post.h>
 #include <asm/processor.h>
 #include <asm/arch/device.h>
 #include <asm/arch/qemu.h>
-#include <asm/fw_cfg.h>
 
 static bool i440fx;
 
+#ifdef CONFIG_QFW
+
+/* on x86, the qfw registers are all IO ports */
+#define FW_CONTROL_PORT	0x510
+#define FW_DATA_PORT		0x511
+#define FW_DMA_PORT_LOW	0x514
+#define FW_DMA_PORT_HIGH	0x518
+
+static void qemu_x86_fwcfg_read_entry_pio(uint16_t entry,
+		uint32_t size, void *address)
+{
+	uint32_t i = 0;
+	uint8_t *data = address;
+
+	/*
+	 * writting FW_CFG_INVALID will cause read operation to resume at
+	 * last offset, otherwise read will start at offset 0
+	 *
+	 * Note: on platform where the control register is IO port, the
+	 * endianness is little endian.
+	 */
+	if (entry != FW_CFG_INVALID)
+		outw(cpu_to_le16(entry), FW_CONTROL_PORT);
+
+	/* the endianness of data register is string-preserving */
+	while (size--)
+		data[i++] = inb(FW_DATA_PORT);
+}
+
+static void qemu_x86_fwcfg_read_entry_dma(struct fw_cfg_dma_access *dma)
+{
+	/* the DMA address register is big endian */
+	outl(cpu_to_be32((uint32_t)dma), FW_DMA_PORT_HIGH);
+
+	while (be32_to_cpu(dma->control) & ~FW_CFG_DMA_ERROR)
+		__asm__ __volatile__ ("pause");
+}
+
+static struct fw_cfg_arch_ops fwcfg_x86_ops = {
+	.arch_read_pio = qemu_x86_fwcfg_read_entry_pio,
+	.arch_read_dma = qemu_x86_fwcfg_read_entry_dma
+};
+#endif
+
 static void enable_pm_piix(void)
 {
 	u8 en;
@@ -88,7 +132,9 @@
 		enable_pm_ich9();
 	}
 
-	qemu_fwcfg_init();
+#ifdef CONFIG_QFW
+	qemu_fwcfg_init(&fwcfg_x86_ops);
+#endif
 }
 
 int arch_cpu_init(void)
diff --git a/arch/x86/cpu/quark/quark.c b/arch/x86/cpu/quark/quark.c
index afb3463..bdd360a 100644
--- a/arch/x86/cpu/quark/quark.c
+++ b/arch/x86/cpu/quark/quark.c
@@ -7,6 +7,7 @@
 #include <common.h>
 #include <mmc.h>
 #include <asm/io.h>
+#include <asm/ioapic.h>
 #include <asm/mrccache.h>
 #include <asm/mtrr.h>
 #include <asm/pci.h>
@@ -338,6 +339,9 @@
 	mrccache_save();
 #endif
 
+	/* Assign a unique I/O APIC ID */
+	io_apic_set_id(1);
+
 	return 0;
 }
 
@@ -360,12 +364,3 @@
 
 	return;
 }
-
-int reserve_arch(void)
-{
-#ifdef CONFIG_ENABLE_MRC_CACHE
-	return mrccache_reserve();
-#else
-	return 0;
-#endif
-}
diff --git a/arch/x86/dts/bayleybay.dts b/arch/x86/dts/bayleybay.dts
index 4ea9262..4a50d86 100644
--- a/arch/x86/dts/bayleybay.dts
+++ b/arch/x86/dts/bayleybay.dts
@@ -84,6 +84,7 @@
 				compatible = "intel,irq-router";
 				intel,pirq-config = "ibase";
 				intel,ibase-offset = <0x50>;
+				intel,actl-addr = <0>;
 				intel,pirq-link = <8 8>;
 				intel,pirq-mask = <0xdee0>;
 				intel,pirq-routing = <
@@ -249,10 +250,10 @@
 #include "microcode/m0230671117.dtsi"
 		};
 		update@1 {
-#include "microcode/m0130673322.dtsi"
+#include "microcode/m0130673325.dtsi"
 		};
 		update@2 {
-#include "microcode/m0130679901.dtsi"
+#include "microcode/m0130679907.dtsi"
 		};
 	};
 
diff --git a/arch/x86/dts/conga-qeval20-qa3-e3845.dts b/arch/x86/dts/conga-qeval20-qa3-e3845.dts
index 478dece..1a4ecaa 100644
--- a/arch/x86/dts/conga-qeval20-qa3-e3845.dts
+++ b/arch/x86/dts/conga-qeval20-qa3-e3845.dts
@@ -88,6 +88,7 @@
 				compatible = "intel,irq-router";
 				intel,pirq-config = "ibase";
 				intel,ibase-offset = <0x50>;
+				intel,actl-addr = <0>;
 				intel,pirq-link = <8 8>;
 				intel,pirq-mask = <0xdee0>;
 				intel,pirq-routing = <
@@ -269,10 +270,10 @@
 
 	microcode {
 		update@0 {
-#include "microcode/m0130673322.dtsi"
+#include "microcode/m0130673325.dtsi"
 		};
 		update@1 {
-#include "microcode/m0130679901.dtsi"
+#include "microcode/m0130679907.dtsi"
 		};
 	};
 };
diff --git a/arch/x86/dts/crownbay.dts b/arch/x86/dts/crownbay.dts
index 337513b..78a1ef4 100644
--- a/arch/x86/dts/crownbay.dts
+++ b/arch/x86/dts/crownbay.dts
@@ -154,6 +154,7 @@
 			irq-router {
 				compatible = "intel,queensbay-irq-router";
 				intel,pirq-config = "pci";
+				intel,actl-addr = <0x58>;
 				intel,pirq-link = <0x60 8>;
 				intel,pirq-mask = <0xcee0>;
 				intel,pirq-routing = <
diff --git a/arch/x86/dts/galileo.dts b/arch/x86/dts/galileo.dts
index 21c3641..da3cbff 100644
--- a/arch/x86/dts/galileo.dts
+++ b/arch/x86/dts/galileo.dts
@@ -29,6 +29,18 @@
 		stdout-path = &pciuart0;
 	};
 
+	cpus {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		cpu@0 {
+			device_type = "cpu";
+			compatible = "cpu-x86";
+			reg = <0>;
+			intel,apic-id = <0>;
+		};
+	};
+
 	tsc-timer {
 		clock-frequency = <400000000>;
 	};
@@ -88,6 +100,7 @@
 			irq-router {
 				compatible = "intel,quark-irq-router";
 				intel,pirq-config = "pci";
+				intel,actl-addr = <0x58>;
 				intel,pirq-link = <0x60 8>;
 				intel,pirq-mask = <0xdef8>;
 				intel,pirq-routing = <
diff --git a/arch/x86/dts/microcode/m0130673322.dtsi b/arch/x86/dts/microcode/m0130673322.dtsi
deleted file mode 100644
index 90bf2fb..0000000
--- a/arch/x86/dts/microcode/m0130673322.dtsi
+++ /dev/null
@@ -1,3284 +0,0 @@
-/*
- * ---
- * This is a device tree fragment. Use #include to add these properties to a
- * node.
- *
- * Date:
- */
-
-compatible = "intel,microcode";
-intel,header-version = <1>;
-intel,update-revision = <0x322>;
-intel,date-code = <0x4012014>;
-intel,processor-signature = <0x30673>;
-intel,checksum = <0x17b0d914>;
-intel,loader-revision = <1>;
-intel,processor-flags = <0x1>;
-
-/* The first 48-bytes are the public header which repeats the above data */
-data = <
-	0x01000000	0x22030000	0x14200104	0x73060300
-	0x14d9b017	0x01000000	0x01000000	0xd0cb0000
-	0x00cc0000	0x00000000	0x00000000	0x00000000
-	0x00000000	0xa1000000	0x01000200	0x22030000
-	0x00000000	0x00000000	0x31031420	0x11320000
-	0x01000000	0x73060300	0x00000000	0x00000000
-	0x00000000	0x00000000	0x00000000	0x00000000
-	0x00000000	0xf4320000	0x00000000	0x00000000
-	0x00000000	0x00000000	0x00000000	0x00000000
-	0x0ae10178	0x7c98f9d1	0x41962d85	0x19391270
-	0xcf3c0336	0xc1f13d6f	0xe46abaf6	0x3b65ca6b
-	0xdb666815	0x5a17bfc4	0x4fca009d	0x099ae8b3
-	0x198e2c7d	0x7c665bbf	0xc07a1a7a	0x7dbcee26
-	0x867296b2	0xc885b6ce	0xe602baff	0x68544b14
-	0xc928c400	0x3add156d	0x531946f9	0x92a03216
-	0xda352322	0xd967ee1f	0x3c5170a7	0xf6de834e
-	0x5a2ed8b3	0x9fb8f050	0x450de17f	0xfd5ef070
-	0x4954575f	0xa3a071ab	0xb56e2afb	0xe2b48302
-	0x6655a958	0x57c9a438	0x1b2f688a	0x09309bc4
-	0x0be95612	0x529c1633	0xc48515d9	0x29eb78df
-	0x9933409f	0xda58dea9	0x58c805fd	0xbc110f5a
-	0x40780ec0	0x6ad59bb3	0xc7387fb8	0x591c1490
-	0xf9335932	0x32130e0b	0xef4b3c96	0xacd903f2
-	0x5b362539	0xe7f85529	0xcb17c41f	0xe7e440d8
-	0xfaf7e925	0x969b76fb	0x5edab8c7	0xf00012e8
-	0x121c2971	0xe5b18959	0xadfd07c0	0x1f09c9d7
-	0x9781006a	0x39550073	0x6c438b6d	0x436f60bc
-	0x11000000	0x8514b971	0x40df7b4a	0x6a6b7285
-	0x7978ef59	0x319bddf5	0x04c68e5a	0xe1c28b10
-	0x172f63dc	0x306fb95d	0x31d881e8	0x69f8e08d
-	0x617a99e1	0x1ab6b574	0x2951fa5b	0xcc7e3e94
-	0xff379d19	0x5c035dec	0xe28ed726	0x22b8a5ac
-	0xd08b3ac5	0x45c03b9e	0xcea4083c	0xc26758aa
-	0xbe7cf81e	0x43d898f3	0x5c45a635	0xc9cac095
-	0xb89aea20	0x2c02b40e	0xe3a8b48d	0xeabfb60e
-	0x776ed2a9	0x080ae6d5	0x7f64b1df	0x00e40ee6
-	0x0f1c10f4	0x792e5423	0x787f5459	0x63a8b02c
-	0x3fd6a255	0x049cae26	0x0949f5ff	0x9aebb236
-	0xecc01775	0x91b57b84	0xe0e45ea3	0x5a8bf79e
-	0x356a843a	0x2406795f	0x8aaae5d8	0x6a8c877c
-	0xa8b2b8f4	0x04cf8f49	0x422d9e2c	0xf09f9896
-	0xe9b92215	0x9c98fb44	0x88556b7f	0x519d6f4c
-	0x9e8a016b	0xcb18d16c	0x419b4ee7	0x080b49c8
-	0xc51b875e	0x46aabc9c	0x262d27eb	0x93ea189d
-	0xdd0da69d	0x3e5b17e8	0xcc78509a	0x00b07e6e
-	0x363d5a70	0x64572070	0x8a84abc4	0x1cb03838
-	0x965fd76a	0x540aafc9	0x83a91654	0x1a722e67
-	0x4bf98ce1	0x2b3c2ff9	0x972cebd4	0xf3a68395
-	0x2613e422	0xf8d031d7	0xb1c79a0f	0xfd44f65b
-	0xa7012a9b	0xd9a15a60	0xc311fc0c	0x6f52f878
-	0x3d68381d	0xd2a035d7	0xb790c50e	0x9f1e5010
-	0x41877064	0xa9d1e4ae	0xfe9abbd5	0x60c2c748
-	0x8167e5ad	0x022dbfb3	0x75abe483	0x51c37170
-	0x09b8590d	0xc1bb323d	0x2c7336b1	0xd4d0d49b
-	0xc7f6152b	0x7919d596	0x1e1ff62e	0xc49604a0
-	0x33857369	0xeaa3f382	0x98b8cd86	0x176e1bf3
-	0x1a68867b	0x6af0a11c	0x69a82b25	0x48c72525
-	0xa00aae2d	0xb09f67f4	0x1a99f83d	0x7266cca3
-	0x8d03a7da	0x2e1d7c49	0x01ac68ae	0x93188770
-	0x0609e769	0x982ed28d	0xe40999e0	0x8932ebab
-	0x5637ad5a	0x2725e8ad	0x56d7caaf	0xc351faa2
-	0x09dbd737	0x0d2f3bf0	0x0623330d	0xdd547489
-	0xcca7e722	0xa9096d13	0x95b17818	0xc092cb81
-	0x72c6eefc	0x1811c37e	0x78161497	0x8be0c4c6
-	0xd63aeb19	0x91ab68df	0x8f2e5e4d	0xf4c74566
-	0x7677a553	0x19698ac3	0xedca0620	0x77f32470
-	0x031e011b	0x751f6696	0xb277d06e	0x3eae2742
-	0x133e621a	0x38fa3172	0x9398cc1c	0xf42a507b
-	0x4547d933	0x63a91eb0	0xf5bcf6a4	0x926ba056
-	0x0adf5bce	0x140f53e4	0x7ff6bb5c	0x87dd79ba
-	0xbba240ac	0x694f743d	0x709cdb20	0x5b4d4401
-	0xc9693610	0x55f9f268	0x1142bc3f	0xf8fe3689
-	0x04a93c4c	0x33dedc46	0xdc73c725	0x2f5ba264
-	0x5b7a6a69	0x024b64f5	0x6e8bfa12	0x62bf2aa7
-	0x520f5a07	0x3c7c4292	0xb7ad2613	0x1f78fc87
-	0xd5284e4e	0x2c730f33	0x8861e947	0x8bacef7d
-	0xbafa2608	0x14ed0b5b	0x3b9bfb02	0x24ced271
-	0x002b2941	0x22d4431c	0x855f4248	0x5ec46e29
-	0x6f1f42fb	0x5dd24fe0	0x290961f6	0xf392dbaf
-	0xa1a8d9c2	0x61e18f4e	0xfda59a70	0x5498daa5
-	0x5ae7ea6f	0xf058c635	0x6817ebee	0x8e30dc8b
-	0x7c8d79be	0x5fb15b9b	0xeed64741	0xe2642a94
-	0x680d7e6e	0x3cbad7aa	0x808c415f	0xe9323aa2
-	0xaadf5b25	0xf60abf13	0xd5c47967	0xc248d0b3
-	0x0f232cbd	0x84092449	0x5744384b	0x5e153ded
-	0x8bb19817	0x34430271	0x917d2315	0x1fc790c7
-	0xc21b5db6	0xec578b1f	0x903a286e	0xca0c59bc
-	0x03e95c7a	0x8c659e99	0x7b09da0a	0xd61e7517
-	0x90b1c519	0x8deac92c	0xf99c7bec	0xb6257d92
-	0x3d61c16e	0xebd58be0	0xb470e655	0xa44bbf4f
-	0xfebe5313	0x4662110a	0x5d42ccd9	0x140845ec
-	0xc80329a9	0x915ca966	0x71e33828	0xe46c870a
-	0x7da9a490	0x255544da	0xa20fb8df	0xf94062b3
-	0xb2df5870	0xebf31e88	0x6e723e2f	0xe6ba9cf1
-	0x7e7084c2	0x1782ac71	0x0a0b0127	0xe9234e38
-	0x881356d6	0xb27a54b6	0x5594730e	0x9a14bd8f
-	0x6dba7da9	0x1069e285	0x02a52798	0x61ea7d86
-	0x665b2572	0x29d41eb5	0x1d211169	0x1218b345
-	0xbfbd264c	0x5b8b0625	0xbbfdcf39	0x6768dfce
-	0x0b5f10cb	0xe159414c	0x74356ed6	0x70077f49
-	0x672107e8	0x11616856	0x824e6f2f	0x99614958
-	0x5857305d	0x416a193f	0x010d266c	0xe5194f03
-	0x152d6516	0xeb83872e	0x4923cc1f	0x1191d1ca
-	0x23feb738	0x6817c1d7	0xe49129ed	0x4a53132a
-	0xdb46b95b	0x3f970366	0x93f1a518	0xae8d72ae
-	0xb689d915	0x0bdfda17	0x2ac7238d	0x1c4291e7
-	0xc5b11085	0x3c51c1ba	0x9fd63edd	0xe464d740
-	0xc17f2789	0x0adef6b9	0xf9aaf83e	0xfb2a9798
-	0x7f16268b	0x4c8ca6c5	0x2b17be52	0x00c91157
-	0xb69eb5db	0xe55ed94a	0xdf13b5a5	0xbb52d1e3
-	0x651bb017	0xc7795724	0x0dfd4711	0x02d2d6e0
-	0xc835e771	0x8ab5dd50	0x7caca109	0xd5c18d6e
-	0xbef0e727	0xaff2dd07	0xf1062a32	0x26d14796
-	0x97f6e36c	0xf845278e	0x185eb5b3	0xcde4e201
-	0x13166ab7	0xcdcebcdc	0x143ef0c7	0x2349893f
-	0x9dfcb70e	0x7ef72725	0x141c5b71	0x7da0f5d3
-	0x76bebb67	0x28bc0a83	0xb67ecf0f	0xd60a1303
-	0x9391b279	0x6ad41154	0x317896b0	0x1237efa6
-	0x7b2a2e6c	0x3ad9a110	0xb44357d4	0xb32e39fe
-	0x2358d28e	0x76e847d9	0x3e85db01	0x6c74e466
-	0x9e4e6b32	0x13072a53	0x5972132e	0xd97cb04d
-	0x55ee6a0b	0xc1434b92	0x772f6a1d	0x0f81f7a6
-	0x072aa8f7	0x179da0e0	0x976bd78c	0x2e43c16b
-	0x4f4a6b51	0x92d9c61b	0xa9c15fe4	0x3f8a527a
-	0x3a232408	0x543d7957	0x21cbd682	0x896de3b0
-	0xba6b3df6	0x2ec86e51	0x2be889e3	0xae764ff0
-	0x3a2f0003	0x7a5f7949	0x577fb5ce	0xb5cbd1a6
-	0xc910ffe2	0x7fd76712	0xfc1e93ff	0xbee7b15c
-	0x5db2356d	0x9721a3fd	0x0d408aed	0x4df4c922
-	0x45d5be91	0x6c79b1fc	0xf0bf73bd	0x3f6a73b6
-	0xdcc1b51e	0x2049fe2d	0xf2b2ad4b	0xd0484d3a
-	0x1f097d3f	0xced1bf3d	0x10f4416b	0x73cb307c
-	0x4b4d94b4	0x2918ece0	0x0cfe69f3	0xb7e86cfb
-	0xa6c373b4	0x0d862b62	0x1735cd72	0xef23c127
-	0x09809c16	0x86cfb70b	0xe67c6903	0x743223a7
-	0x13c7d27f	0xb70a58cc	0x82c57566	0x2ead3c65
-	0xf9409863	0xf2b578ef	0x1622a34d	0x5ae8e861
-	0xf4384016	0x443ff5f4	0x088b8510	0xd738d1c5
-	0x577d624b	0x5adf3973	0x5f79add3	0xed7e7145
-	0x29008fc0	0xd5b278cf	0x5b4c08c2	0xb063af5c
-	0x67d41bd9	0x2d11424a	0x727924de	0x8903a86f
-	0xb122d314	0xd9675c8b	0xc2eb1382	0x4c4185da
-	0x257a0fe1	0xc3fd536b	0xadbfc223	0xc940dab4
-	0x2e83d4b0	0xf1135ad4	0xfeb1cc1a	0x9178ae04
-	0x996d72ba	0x07f6bf0f	0x6588f833	0x44f95205
-	0xee4e6897	0xa9006735	0xa5f5502c	0xeb61aca6
-	0xf2ceddb5	0x40ef9001	0xf862c3d7	0x73deaad3
-	0x7b1d8b1d	0x467bcbcf	0x7f76f969	0x6c8e7f8c
-	0xfb8e27c3	0x5075ce65	0x1c8628a8	0x7b6e3e32
-	0x4885fc9f	0xa9fa768c	0x15426120	0x1df9d006
-	0x31c52df4	0x1457f5c6	0xde5f2daa	0xfa250108
-	0xbcf7e460	0x565d4679	0x82c94142	0xae76342a
-	0x85aca7c7	0x8bc49e03	0x73f03da3	0x1e500b4c
-	0x250288a2	0x25a39951	0x66087700	0x6317754b
-	0x6ff62bdc	0xa519ad4f	0xa537b8ac	0xea6292ab
-	0xb5d66b68	0x15997d1f	0x0fdbf04a	0xaa2b1a25
-	0x74b72321	0xf8b1753a	0x33658d1e	0xb1cc5d96
-	0x5b0da6af	0x48f24997	0xb031146e	0xfe98e8d1
-	0x9bd75bf0	0x0ae088fe	0xb8fce721	0x964bc398
-	0xe82daef6	0x393884b5	0xa814f792	0xb3667bde
-	0x1d1cf32d	0xce862720	0x7b69e921	0xabd26f33
-	0x61fad35f	0xd7144eeb	0x74016bce	0x1d56277b
-	0x7f934eed	0xb1a3396a	0xd5090c7a	0x4ea94d12
-	0x1455ac10	0x7c37294c	0x06c60a9a	0xa735ab29
-	0xbffb880f	0x59e2cb48	0x54cca9d7	0xb569da05
-	0x595e72ec	0x7c82f204	0x7690420d	0xe02fbb37
-	0x4dbf4e68	0x221eda99	0x31868046	0xda435487
-	0xb4c0dcc4	0x37610096	0x35569b02	0xefcd4ecf
-	0x7b6917bf	0x45946a25	0x5d42a84a	0x8c3801b7
-	0x5ac838fa	0x7a7f252d	0xbccf3cb5	0x99a54c4c
-	0x39145831	0xfd5c1af3	0xcabb180c	0x8f0fe9dd
-	0xabd42357	0x3b6d9aa9	0x0e87ede1	0x65ea46ae
-	0xd89b618e	0x1e5cc772	0xfb43c9b4	0xdad3fdb2
-	0x96be6600	0x4887696e	0x82a4e73a	0xb2ca2cf0
-	0xc6840738	0x397d27a9	0xce971271	0x067e4de6
-	0xb593f079	0x6a77de2f	0xf9a92497	0xdc3e94aa
-	0x03239a80	0x7f38430a	0xf7f87908	0x682a8425
-	0x2d491962	0xb5737b4b	0xa26434e5	0x238ced20
-	0x1ed9fcbe	0x283a8f7b	0x18f33cf6	0x29f27cd5
-	0xd95018aa	0x883dbd25	0xfb216723	0xe939d42c
-	0xf4b1207d	0x54f5e102	0xbe2e46eb	0xb2ca8219
-	0xab181ad4	0x3a7dc3e6	0xf3713256	0x53f081ab
-	0xd630a7a3	0x07c40bc3	0x7a1fde0c	0xb368bab8
-	0xc0baaad3	0xf070baac	0xe4ab7a4f	0x82a8cf5e
-	0x9c3d7bb5	0xfe5f74a3	0x02548e86	0x2710ff5d
-	0x1b42a8c4	0x34d4f5d8	0x8dfde8f2	0xf2949298
-	0xe9d711bf	0x44d91e17	0x51ba8b32	0xbc3f60cc
-	0xa0d6c440	0xf71959b4	0x3b5f0603	0x02465794
-	0xff5d9b8a	0xd4a4abcf	0x8123626c	0x883ed4e4
-	0x9eaeaa09	0x91c38865	0xa0aaeebf	0xc48983ab
-	0x1df7a001	0x7519a65e	0x5ef3cd1d	0x8348225d
-	0x0f318b0b	0xbab1d51b	0x15ba9b84	0xef8c57bf
-	0x15d0a8c1	0x0b542fb4	0x1d51ccc8	0x6c297041
-	0xf3bee946	0x6a8c3d64	0x6e16361d	0xed50ca69
-	0x8c1f66ba	0xff7220e0	0x84a87cba	0x15d75922
-	0x77546d82	0x7bd456e3	0x10166195	0x55604f1f
-	0x894280d2	0x0ed406c4	0xc1b4058e	0x645252e5
-	0x670ea74e	0xd5b07337	0x9944e2cf	0xf2ac2579
-	0xd00c3ae8	0x2df3146d	0x4ee1c72a	0x3a3621cf
-	0x8c099145	0xf5f530e6	0x210da136	0x7908cec6
-	0xc6e47e22	0xe9bcbe4e	0x94cbcb12	0xb81f0792
-	0x1111f81e	0x4df4ac93	0x335c69be	0x9e3546b9
-	0x06c046b4	0x6f29a99c	0xbcd48ee7	0xeb011efe
-	0x41e80474	0xcee30bf4	0xad4e2ae0	0x6929a359
-	0xbdaa88e3	0x9e68a38e	0x16bbdac7	0x020d8d61
-	0x7bab6738	0x559cddbd	0xa6ae3d0c	0xe032c355
-	0xcb45a045	0x9f7680b2	0xc1cb73da	0x466052f7
-	0x488cb929	0xd93f0307	0xb2c9d81c	0xe25fdcd9
-	0xfe8b08c4	0xae6230bd	0x5238b335	0x3474b2a5
-	0x480ce0b7	0xd9a2942f	0xe830fa5b	0x3efa774f
-	0x84e53e93	0xf49e7d79	0x59897b26	0x75b1080f
-	0xc2212b0f	0xe5fe56bd	0x4556e908	0x1bd0bb17
-	0x2f159d20	0x866477e5	0x4e95a374	0xbdc9fd65
-	0x2ff87073	0x5d7dceea	0x69ada0c7	0x89f16ad0
-	0x97da55d8	0xe4457728	0x5ab7613e	0xf6bbe6ec
-	0x56b83617	0x9119b521	0x4fabf948	0x2e1ab994
-	0xd16363f0	0xaee14b3f	0x5461ea55	0x55d95d02
-	0xf72c902c	0x1ede6c56	0x697006d9	0x4d15007f
-	0x0c1cb5e5	0x55d3d5d5	0x1f18d76f	0x55c9f017
-	0x3e1d3b5b	0x8f775636	0x97e6bf8f	0x360a9fb5
-	0x1e080721	0xf9825356	0x30e900f3	0x55453bfe
-	0xbd8f1df0	0x35b43ba8	0x45db013f	0x20484d34
-	0x944ca654	0x79c2c151	0xd4e9b39b	0x1b2e79b6
-	0x554314d6	0xce4ee44d	0xd0394232	0x9da4db20
-	0xa70beed6	0x4ae4ed10	0x4c244770	0x4b91208c
-	0x39a01e0b	0x5eea0a55	0x4b36ffbe	0x6fd18df2
-	0x43fd13e3	0xa99302bc	0x63762b5d	0xd014d6b4
-	0xbf0e53d2	0x0f5b5aa5	0x3c23f5b7	0x16335036
-	0xe011bd10	0x66e596a3	0xf463e3ad	0x9670c0a3
-	0x4004e177	0xbd2b3260	0x01967017	0x1159a682
-	0x62931eb8	0xc581df9e	0x6710932f	0xfb2bb0b2
-	0xb8a0339c	0xc66f0fff	0x333f5ee3	0xc06f8586
-	0x7b9f47f1	0x9aaedaa3	0x6044562a	0x26c73565
-	0x82c6e5b2	0x39d4eed0	0x83b7432e	0x0c4f0e4a
-	0x4d9df788	0x989e7f41	0x61cacc3b	0xdc34efeb
-	0x240b22a8	0x70a508b0	0x7554f517	0x7269f02b
-	0xd27ffcf6	0x96a5879f	0x0650f7e4	0xdc1fc1ac
-	0x80781334	0x04ab3381	0x8bad17c1	0x18311833
-	0x65f06ee9	0xfaac30e1	0xe39b8b54	0x20b988ce
-	0xa6a818f3	0x75ac753b	0x66f815a4	0x224d7121
-	0x63dc6031	0xcfeed2c7	0x3ccd07d7	0x9df44157
-	0xb9dcca97	0xcf5178f1	0x10e8fb28	0xa1faa527
-	0x8851846e	0x01f56075	0x2dd4fff2	0x40786960
-	0x41aa9e6c	0xf7c85573	0x64a36432	0x4449e726
-	0x7aa7bb0d	0x08f596cc	0x248e1eb3	0x5c5567cb
-	0x62ffd012	0x2d79ce59	0xf9ed4239	0xe98e107a
-	0x4da25561	0xc6f83333	0x1ca0482d	0xcc3f3b69
-	0xa9f48711	0x99139510	0xc5777d2b	0x9c80814d
-	0xab47fbe4	0xf302d145	0x20aecccc	0x3be9e431
-	0x7dc34793	0x4d38171c	0xaa34e505	0xc32e492b
-	0x4f31bd0b	0xb7549889	0xdb3da9cf	0x084d0791
-	0xa4c63c9f	0x62e770e9	0x862fdb93	0x52c45b9e
-	0xf21019a5	0xdde6aa07	0xcb46386e	0x830693a8
-	0x651510c8	0xf3af66a4	0x78775e07	0xc9f22414
-	0x5769f089	0xac2ae873	0x044357d8	0x9fdc76f8
-	0xea16ade5	0x144e9211	0x181ade72	0xba50ce80
-	0x4573571a	0x5437c668	0x39c3b81d	0x013d766d
-	0xc1754b48	0xa611fa3b	0x725eae72	0x04b02ca9
-	0x186a2541	0xa2784e47	0x8b7601bb	0x7f9132e3
-	0x3295d5b5	0x4b470dee	0xaf5ec559	0xc4c442d6
-	0x5b07293d	0x9a68b079	0xc1408c0c	0xc2371025
-	0x4af99e8c	0x332c416a	0xec04321b	0xb8493ffb
-	0x51eab7de	0x26d7e9db	0x7880126e	0x439be5e3
-	0x7e8910f0	0xa8ba727b	0x88cb04df	0x70750495
-	0xc13413f6	0x684312db	0x0579d5b1	0x05fe44f7
-	0x627e04f3	0xe85b47da	0xbf646f0b	0x2ddf4932
-	0x1bcb6fc0	0x611de27d	0xb3ee1bed	0x247dad06
-	0xa7107d34	0xba434b88	0x6eb90466	0x45a65871
-	0xa9a67088	0x6af3b796	0xf5b73689	0xcab03ca4
-	0xca1f25e6	0xd4b7c32b	0x5908c88d	0xac6c1fa3
-	0x653184a5	0x062bc0bf	0x383de594	0x17064fc6
-	0x0650dbad	0xaec15153	0xab0572ff	0xab8c6f3c
-	0x37a93f91	0xbe51b8c5	0xabcd8573	0x05b3ad78
-	0xad6c9ecc	0xf302c7ab	0x4b3b88f7	0x805a0107
-	0xa5821ddd	0xc36f10ad	0x374b1056	0x79e69f8c
-	0x8368b6cf	0xf69458a7	0x9fad691d	0xb937724e
-	0xc542bfb1	0x37c0178d	0xc4707414	0xd6c7fa86
-	0xb3933710	0x227800f4	0x6dca3e39	0xd88bdb91
-	0x03755bda	0xa7f2d11d	0x4ab40803	0xf353e7ed
-	0xf2464ee4	0x8e58cea4	0xd05807fd	0xd8d8da5f
-	0x1a461333	0x5e84830d	0xb94ea4bc	0x5bf3506f
-	0x76461ba7	0xabe88c54	0x124c2e39	0xc3b01867
-	0xc6b0d4d1	0x9cc3c7be	0x8039ce38	0xfceb0e88
-	0xa965c5ce	0x9ff3811a	0x1af1c60e	0xae9c5f9b
-	0xee28bd50	0x202cbd2e	0x340a1312	0xa8f7115e
-	0xb000cf3a	0x21ff4052	0xa555f08f	0x1bead4d7
-	0xac14e135	0x449e208c	0x05ef8d94	0xb555a613
-	0x9d65a902	0x3ad8cc2a	0x55170533	0x75782927
-	0xefd4b5e5	0x6127ef1e	0x23fb5114	0x7ca3e1bc
-	0xc08957ba	0x44c4e2cd	0xc0b97ef9	0xea99db5a
-	0x53fdeb31	0x61721ee2	0xe41ef3c1	0x5f4788f5
-	0xa8543eca	0x3f36d642	0xda6eccef	0x0341c756
-	0xbfe7d2b9	0x66bb5cef	0xbfb43507	0xbd9c878e
-	0x94f307bc	0x7cd56198	0xf98596ba	0x21e9c50b
-	0xb9c9d725	0xf16211c2	0xe594b398	0x7e01aefc
-	0x745e5ddb	0x00bae556	0xc317ed35	0x4269b4c6
-	0x02f6b67d	0xccb4aa57	0x8a3fa0fa	0xcc660149
-	0x57cf5e87	0x4ed03819	0x77286134	0x631cc0a5
-	0x877fe8e0	0xa48856dc	0xe1c57e93	0xef04482a
-	0x40cd9ac8	0xc7f43528	0x473306c8	0x01eb339e
-	0x52612a88	0x65c3212f	0x7cc5f5e6	0xd3efbc2a
-	0xf2537dbc	0xa9428ffd	0x76ff40f9	0x0ad4a8e6
-	0x2020fbab	0xf8c5bbe4	0xb409e5a0	0x358d7b37
-	0x08220bd3	0xd3707d96	0x5e2f5edc	0x638feed5
-	0x045afa36	0x4f1604b4	0xd4dc85c7	0x37f97cef
-	0xe1c8f5a6	0xd16fdbbc	0x986137fd	0x25b3e84c
-	0x7f73be76	0xe25dbdcb	0x1f13d28a	0x7a31215b
-	0x241967d2	0x2c5b4063	0xe8339988	0x13689262
-	0x0b6d2b79	0x58773464	0xe822e560	0x77d6ba8e
-	0x6ae6c07f	0x105e1e88	0x0045bc6d	0x88ad198e
-	0xa350b9de	0xd5d0b3e6	0xc4e1cd14	0x47ca431a
-	0x2ee94476	0xa2aae1f9	0xfa2042a7	0x37b0cf82
-	0xb1aca28e	0x9a019883	0xbfb11afb	0x754ffff9
-	0xf065a9b5	0x916e14f2	0x93fba80f	0x1dd82da0
-	0xe41c950a	0x12b374bb	0x0f4d533f	0xbef539e2
-	0x1eb5c86a	0x577dd484	0x98900e2f	0xcaec8695
-	0x6a6ab336	0x135e9e68	0xc9b62a35	0xb8982b6c
-	0x5bcdb533	0x389b1517	0xbb106e40	0xd402a301
-	0x7446687b	0x35eda3ec	0xd44ceb2a	0xcfa4e441
-	0x29664690	0x598a273e	0xf2a144b1	0x68f81403
-	0xca53e666	0x064e69a4	0x87bb8ca8	0x58193c68
-	0x9b34b17a	0xde2bffc7	0xf72594dc	0x388d3f3f
-	0x638a1273	0x5ccf3567	0xcf1017a9	0xe616a6fd
-	0x64cab73c	0xd209b022	0x6f08cd26	0xc30f57b1
-	0xac2295b2	0x0c05b1c8	0xf7915ad8	0x9bcf836f
-	0x56d8b57a	0xc8b65a2c	0x11868dd3	0xea4764f8
-	0xa7bd30e8	0x8c895321	0xd276a894	0x86042daa
-	0xaf6cd261	0x18cc4ea4	0x2c2185f6	0x2bf3ae70
-	0xf3023c31	0x49f4b0e2	0x1e00afc3	0x2053b3c6
-	0xb188c9cc	0x7437a27a	0x1b29925e	0xbc488906
-	0x81cd9003	0x332fcf9b	0xeb20987a	0x831f912a
-	0x857387da	0xaf1edccb	0xfe01d809	0x05351b4a
-	0x31ec96ac	0x4f064e52	0x10ec8119	0x96c2d29f
-	0xc6e1f3fe	0x15b0d45f	0xdca23bc6	0x7b672563
-	0xa94fdc1b	0x7dd22f4f	0xd4d2260f	0xc9e055ff
-	0x89e066cc	0x98200d25	0xcba82cf7	0xffb8475b
-	0x26550a20	0xf5b4f84a	0x506cb84b	0x00d92997
-	0x7a5c5535	0xe11194eb	0x1ff21f4b	0x725d2be5
-	0xbe89242f	0x0b18afa7	0x6f5b1433	0x829bdaf9
-	0x42db07b9	0x479493cb	0xabd2ead3	0xea6afa58
-	0xf994c740	0x4cb77f7e	0xb946cbdc	0xfe558e82
-	0xa2ed5c20	0x7012b99c	0x72a41e08	0x2058815b
-	0x0528d06d	0xe6dbd7e1	0x3d1f6f9e	0xca78b63c
-	0x91fa57a2	0xb6d524a7	0x1a61863d	0x89c25c5f
-	0x16960596	0x6ebed63e	0xfcd617d1	0x0a927121
-	0x887fdc75	0xec27c8de	0x8c91a821	0xd6bb116d
-	0x51fe2c18	0x4af774d9	0x7aa13fdb	0xfc6ff59d
-	0x27dd287b	0xe7e3151c	0x835552ea	0xe628aa1c
-	0xe0edda2a	0x1957ade4	0x52336fae	0x9cecef28
-	0x2be84cbf	0xa5959450	0x65299682	0x8151d4f8
-	0x716a5209	0x0a8ca663	0x2187bc46	0x000767f5
-	0xe7295b8d	0xa8bc7a6c	0x2b4d2f10	0xf251372f
-	0x92ff27ff	0x9bfd83e8	0x8e2b593e	0x8915fd15
-	0x1e44eed0	0x4a3a4679	0xce135f45	0xf996ec1b
-	0xfd86c8ac	0x25b008fa	0x8973cf58	0x481512ae
-	0xf2bc46f1	0x8b3a92bf	0xbf2a7b24	0xb19e88be
-	0x1823f658	0xa8486c11	0x237771c0	0x6f5f0da2
-	0xb05a42e3	0xb562583c	0xa13d37f7	0xe8eede16
-	0xc5154af2	0xfdf7f9b9	0x0b907685	0x1f567e56
-	0x19987b40	0xc82974ab	0xf02ae429	0x9c356634
-	0xb85ba9e9	0xda2141b7	0xd44e331f	0x1dd722d3
-	0x68fd2f4e	0x4e7f88a2	0xab7314b3	0x3dd05c4e
-	0x1bb4093f	0xff73db9b	0xf917c6e0	0xae822501
-	0x05cab9fe	0x67c91c76	0x1ebd2575	0x1ae193fd
-	0x6f154ae6	0x13780ac7	0x6ff5bf0c	0x6b664594
-	0x494a71d1	0x9bc35a0f	0xb34f175b	0x0069468c
-	0x9b125042	0x7df22e49	0xf39cf8ed	0xbe020df1
-	0xe206848b	0x8c428e75	0xc76c05d4	0x0089e2c4
-	0x5bf9a75a	0x30677869	0x544797ed	0x68456dbd
-	0x45b8f0aa	0xac5c82d1	0x05aefb75	0x6d5c28bf
-	0x009ddb3b	0x551ff144	0xd19127ea	0xfc860071
-	0x30c93457	0xa4c4b56a	0x6928a07c	0x9f63e6a7
-	0x9fa2b174	0x7c1b2fa4	0x4a5a1f25	0x24acb022
-	0x0c3c11f4	0xc7d4cec8	0x4484a031	0x6d3cc1c7
-	0x2eb86733	0x8cd4f77d	0x7b551519	0x124b6805
-	0x57385eef	0x3efd3da9	0xea300d5d	0xe64fc82d
-	0x7d33386b	0x3933c4d3	0xe3cb61f8	0xc6fe8846
-	0xbe0df669	0x8646e4cf	0x194a444a	0x404c81af
-	0x9448791e	0x586f2132	0x3def508a	0xa3edebe5
-	0x2f3b0b5c	0xc974f91f	0x400ec25b	0xf1513ffb
-	0xc13b8859	0x32ac4d39	0xf8f334b2	0xab53ba5d
-	0x9e196996	0xf14d8046	0x22fcb441	0xf27ac4c8
-	0xbbdf5623	0x255df428	0xd95a2352	0x8d26f0dd
-	0x60a301d1	0x4a2e3e49	0x4654b081	0xf775e35f
-	0x592b5eba	0x6a3f9583	0x6ec3d395	0xc8ab02e8
-	0xf343f806	0x62745498	0xb499dbf3	0xd427334a
-	0xdf0b61e7	0xda67999e	0x14f9be12	0xf164898a
-	0xd6347aa7	0x079a537e	0x294542e1	0x687b7b6b
-	0x8478cffc	0xf335963f	0x6c1b9ac2	0x68ff2779
-	0xe3d3f8a8	0x5453c548	0xd968189b	0x13ad95b4
-	0xd71bee24	0x3939f36e	0xb19b3595	0x001961aa
-	0x5f2f001a	0x77137eea	0x477698a0	0x1c07c440
-	0x9606b6d3	0x6ce95229	0x25445629	0x5a935f13
-	0x3e2154aa	0x6876442c	0xd9175c78	0xc94d2535
-	0xf2070dd4	0xd4d1f50b	0xa04d18e5	0x3456cfa4
-	0xc7610f62	0xb705a1a8	0xb8766e3e	0x225642de
-	0x4be5b1b5	0x44d32453	0x80b8a9d4	0x7297d633
-	0x09e8aa04	0x540929ec	0xbcc58c41	0x6dcf7b61
-	0x6992928c	0xcd40ff22	0x13e4a724	0xd331d5f3
-	0xa512aeb5	0x1c1c4ae8	0x5f0fe5d2	0x3d539538
-	0x383c214c	0xd0a983e9	0x977e8682	0xf38a571d
-	0xdb92de78	0x04ba543f	0xb531e880	0xfea55473
-	0xd6d17b05	0xbdd676ed	0xfc7d4f68	0x8b5170ed
-	0xa738734f	0x8a25fff2	0xb1b0239f	0x60545acb
-	0xcfb00725	0x35f58585	0xcce4ed42	0x05da1c3f
-	0x29428b1b	0x099680c9	0xb4608916	0xa9f177b7
-	0x3b393c9d	0x92d19426	0x472dfe73	0x7b12de81
-	0x557ec0f2	0x166fa28f	0xfb6855da	0x592d3e69
-	0x373a1dba	0x9c76abae	0x13c7f717	0xbc53e796
-	0xb2d39602	0xf1efa3b2	0x00046c93	0x1faf82fa
-	0x55dec395	0x22a034c8	0x576bd5f2	0x97c36a45
-	0x08a1a923	0x9ac2f22c	0xb029e4bf	0x6c4ca958
-	0xed7276cb	0xa0924918	0x1894c9d8	0xdb993c42
-	0xc31c6e18	0xbadc738b	0x57f95d64	0x4d766a25
-	0xea41493b	0x60c19727	0xe7c63d8a	0xcbc52763
-	0x7882b244	0xe2da61e5	0xd19111df	0x526d01d2
-	0x4e7021db	0xa13fb9fb	0x23e082cd	0xb426b603
-	0x9cac0cdc	0x44a94870	0xd0adbbe2	0x9b77a80b
-	0xe1845f75	0xa1704da3	0x2d1c6207	0xba3ee883
-	0x0c3089d8	0x0cba7fdb	0xcb069fb0	0x38738df4
-	0x89971c2a	0xfbaeb7e6	0x459e1365	0x45fba877
-	0x02046ea3	0xd9d0bdb7	0x83c74383	0xc248e9d5
-	0xaae85a56	0x33092ec7	0x6bece02b	0x3b7af1d3
-	0xc92b6e83	0xba032588	0x70e61198	0xa5eb1239
-	0x4d9a6456	0x7d3fe964	0xdb3eb780	0x7e188648
-	0x511a6402	0x48c4ade9	0xba7e9153	0x09490df7
-	0x11b5ea7c	0x4e63145f	0x07ca7947	0xc337360a
-	0x2b399632	0x5d1fef78	0x9b1e439e	0x8daa70b7
-	0xf55a59bb	0xc3a8c84c	0x4d18eb22	0x74568737
-	0xf0419b6a	0xbab459a5	0x0cb07a0a	0xeeb8e086
-	0x0a9241a7	0x419c5ce5	0xec841275	0x3ec13615
-	0x49e42b6f	0x2dae6c7d	0x3fc35088	0x1b92ff9e
-	0x573b1cda	0x54381503	0x29a5b7b6	0x82994130
-	0xffb93c4c	0xc0a66aa1	0x68889181	0x0826e555
-	0xe81cdf31	0x740109a6	0xb8835558	0xaa5d9aac
-	0x0d97ea3b	0x89f744c6	0x2b702162	0x992fe0ea
-	0xab3a585a	0x3e7554db	0x9d97ebdc	0x9939bce8
-	0x486a5f50	0x804ccd06	0xff2e15cc	0x67bf77cb
-	0xf9beadd4	0x2da33477	0x18adbaf0	0xdb00dae4
-	0xe727033c	0xd10ce1ac	0x4f8c4a29	0x281bf150
-	0x764e1387	0x8c65a901	0x841521e3	0x31d9dfd7
-	0x1e7ba122	0xe8fd6d3b	0x4bfe880b	0xd2c1c20f
-	0x9a07169f	0xedbb94b8	0xe9cbcd9e	0x33cac378
-	0xa42fef1e	0xf0e5ff32	0xa86b9038	0x7dbec0cd
-	0x7ad1abe8	0x5e3e4e8f	0xc4dfe8cd	0x86630ba1
-	0x02003c6f	0xbcb50d9c	0x65d874b1	0x01a09ddd
-	0xc97d3d65	0x2d02bedf	0x6fc63309	0x214b421b
-	0x72e0a28d	0xd9c8a577	0x1c8665a1	0xd33b4583
-	0xfa004d9b	0x5c2470b7	0xc671fed3	0xe033617a
-	0x5a86c333	0x13388e4e	0x3bccdcda	0xc62fd60b
-	0xcae17379	0xf6d84d27	0xaaa52422	0x5771e380
-	0xeb1feaf3	0x3c28e7fe	0xa0fded4c	0x5f63a3c7
-	0x3b42ed09	0x1748d617	0xbc2d4fd6	0x3416fabc
-	0xc1e60e41	0x48ffe41d	0x4ea5532b	0xba7dba76
-	0x21378ac1	0x7425d0f3	0x426b3153	0xdc57d14a
-	0x54997f9a	0xeda2a56a	0xfcec5ef5	0x6fd7acb3
-	0xf2691009	0xc1a219e3	0x09a82589	0xc6e1792c
-	0xb4674578	0x0aaf55d2	0x23c7e9dc	0x7607d612
-	0x580fc695	0xd24b2629	0x0a8726a1	0x3544e0a2
-	0xc1de7011	0x30982b80	0x9cf4f328	0x02b22d26
-	0x78e33c10	0x2ce6bb5a	0x92280ed7	0x2ce5b007
-	0x64552836	0xda4a7b51	0xa6122870	0x00b28bb1
-	0xb98cda46	0x84cbe910	0xeccb62a8	0xe13c3645
-	0x2f4494e4	0xed0da7b1	0xb8aa8a1a	0x1adcbc0a
-	0xdab03e90	0x904d9041	0xaa8fe377	0x087cf59e
-	0xa123b5aa	0x633c29c0	0x36d915d6	0x8f5cacbb
-	0x8834d1b5	0xa2c12731	0xfab5176b	0xe1888d76
-	0x4875b9d7	0x5747b32c	0x73fc6d36	0x202ffb90
-	0x62900e06	0xa5f2a41f	0x497589c6	0x7ec701fd
-	0x45801f09	0x1833e8fd	0x734acfc5	0x2f65bdb8
-	0xe6add84d	0x4ad6dfaa	0xf59dd63b	0xb2150e00
-	0xed32ddd6	0x370ce8d7	0x5fec9315	0xb8e6ba73
-	0xccb15a6b	0x302a0084	0x9e49e2ce	0x7af3bc8b
-	0x488e6ee3	0xcdbf0b31	0x762ce0d4	0xc50a111c
-	0xd07d6e3e	0x18c391a2	0x1a7a559d	0x10b4b3bd
-	0xd0703a3d	0x4e431eb9	0xf78edbe3	0x896604ba
-	0xc0e8d4c9	0xd42f2292	0x5414ea6f	0x0ce7d429
-	0xbb659e0d	0x46fa830f	0xdad39c12	0x0f65fa5b
-	0xa002e598	0x5408cfcf	0xc1c3a5e0	0x28ca35fc
-	0x52b2b588	0xb76e1f54	0xb6c355c7	0x08e3ba79
-	0xfd89c1f8	0x6ebf03a9	0x51ebb756	0x729e1c5c
-	0x1ed0cce2	0x29733f1c	0x42b76fcc	0xd94022b4
-	0x3efc8ac9	0x3f23eae1	0xa0ccf230	0x9da59cf1
-	0x5f6db360	0x922686e1	0xc9138d5d	0xda43fd20
-	0xe0757988	0xa315c62f	0xe3642291	0xc45d9701
-	0x2c394ee3	0xab92e7bf	0xf6037b8e	0x1f523243
-	0xe91791d1	0x19961c4d	0x35d3b069	0x1596143c
-	0x203bca40	0xd26d72c1	0x94c059c2	0xae0df468
-	0x3b0909a4	0x34aa916f	0xe0c254e6	0xd0969c55
-	0xa9b0b923	0x80a9dd5c	0xe79b8d8a	0x3599f269
-	0x623c20dd	0x41e11b9c	0x40fcee5d	0x65dfa8f5
-	0xbffa7357	0xa5b8f59e	0x2bb8191f	0x226a1b43
-	0x910b6d4f	0x73837092	0xd666f5da	0x14fd4426
-	0xd41a8547	0x6f4e928d	0x8096c2f2	0x525ba180
-	0xc6a28d43	0x960b7cb0	0xb76dacbc	0x024de046
-	0xc8e3c937	0x0217493b	0x1516dc22	0xe19e70d0
-	0x655321c8	0xa46a9105	0x61ec2a61	0x1400405b
-	0xcd0a758d	0xdc792982	0xbd994932	0x6565c8b2
-	0x187be349	0x0afa44ad	0x714870fc	0xede1b8dc
-	0x2c4ac6b5	0x7d9793ea	0xe0bc3c0d	0xaa56f23a
-	0x7fd4e2ec	0x2131ad26	0x2cd34428	0x45e9dec0
-	0xc15b692a	0xae73e713	0x37c5c3d4	0x70ff213c
-	0x4d6322fe	0xa29a9b4a	0xca7d3c65	0x1024df74
-	0x308f4a3f	0x4f48c7d9	0x0c71a17b	0x540441ed
-	0xbc2f36a8	0x2592d7d4	0xbb643dd3	0xb8fb607b
-	0x6b2b339b	0x9a40ecc7	0x59226bdc	0x42a5c04c
-	0x6a1dc320	0x14e3c7c4	0x39cb912c	0xcf5eb477
-	0xa3a43975	0x79f92cc3	0xe9d4cdfd	0x02dc8fb3
-	0x240b6842	0xe9ff7bed	0x8f5269b3	0xc4f44baa
-	0x1f1c74b8	0xb5c39051	0x291cce82	0xfc129a8b
-	0x0fae02cf	0x31b4d4cc	0x1dfe9722	0x093cd430
-	0x96c2a838	0x19b3a068	0xa7ead8c3	0xa2b3b92c
-	0x2e1dc49f	0xe2f84217	0x670e73d3	0xd7c3710e
-	0x94e4a7c9	0x33e063ab	0x35176206	0x910504bf
-	0xb04b61d3	0xbed9c702	0x5d6c4cc3	0x63276a86
-	0x0bfe5143	0x7ed925a1	0xc455934b	0x402a8b04
-	0x01c03292	0x5de0933c	0xd932d260	0xb5b3b5ce
-	0xde53664e	0xeaec4fc0	0x506030ac	0x6fbd8304
-	0x0b0e4881	0x99c16b3a	0x6fc976ad	0xeae57df9
-	0xc53a953c	0xca681bc7	0x905e49e1	0x405d42c5
-	0xef39b878	0x57ded0df	0x56b98e32	0x392ce7d0
-	0xaa7fbfb5	0x6ff550e8	0xf346ae82	0x2b25a8dc
-	0x3ff980eb	0x302aff14	0x1a43c7ae	0x23f8ec16
-	0xf774024b	0x1c4e163d	0x6b6f9408	0x0646b4e5
-	0x2e55bfcb	0x14e3f7bf	0x86fec07a	0xda898470
-	0xd99a274a	0x8630e98f	0x8c843f0e	0xa840c028
-	0x950d7fb1	0xeca930fd	0xd281c9e3	0x29b3aed6
-	0xc419314d	0xa6147b28	0xb504311a	0x91c07531
-	0xe19ac720	0xfa8cfb5c	0xf8158bcd	0x42202a1d
-	0xfff43b87	0xdc6fa0d9	0x8a599eeb	0xac3a8df2
-	0x83ffa50f	0x346a8ff1	0x0947d1ca	0x318a8949
-	0xe409dd30	0xf73ac9cd	0x9504c972	0xa2392b4c
-	0x5594ac9f	0x7a45c3e8	0x181d42db	0x085e24a9
-	0x6cb3e60b	0x3568d771	0xfa96b628	0x945817e8
-	0xca9d28da	0xcd3a174b	0x7f84ca3d	0x90381d0e
-	0x09a6f9d7	0x11396376	0x4d158586	0xcc451745
-	0x9844225c	0xa45b8a9c	0x0c64efde	0x7429ee29
-	0x308c39b5	0xa3454fb6	0xf949f709	0x09391206
-	0x0168257e	0x94e10cb6	0x48e49996	0x92928443
-	0x4a826036	0x9a777b3f	0xf77adfdf	0xc111b354
-	0xa7ece533	0x050706ac	0x91ed3fd2	0xca15baf6
-	0xd1714105	0xb564c842	0x886800cc	0xd57309e1
-	0x38e4fa43	0xb74fe550	0x26f300bc	0x6349cbe6
-	0x4bc132ae	0x310c1d40	0x3353100c	0x0a308892
-	0xea6ab62d	0x0a438e7c	0xb000cf51	0xa21aadb3
-	0xd3628343	0xee7f1a6f	0x3ee28d91	0xa846f25a
-	0xc898e7c0	0x1198f67e	0x2401caf3	0x78d7acfc
-	0xbc592220	0x1efd847f	0x1e3e935d	0xdb9025f6
-	0x41ab6bb6	0x08a10f85	0x160dc5b4	0x4f0ed74e
-	0x8c3db59d	0x34034397	0xe26017c3	0x03fe3b41
-	0xc4480582	0x7c0c85de	0x4957c26d	0x9eb32143
-	0x28676ce2	0xe3627f34	0x71e3afb1	0x7e978fbe
-	0x3b3ee0f9	0xb5ae1bcf	0x474dc4cc	0x470e2114
-	0x2490e60c	0xbb534e7c	0x7a8ad252	0x7cc08810
-	0x9ea23718	0x04ecf4e1	0x732a9f10	0x62c69e22
-	0x5a94fb4e	0xc1da497b	0x3ab3f2b9	0x09ff7310
-	0xd7749df9	0x170471dd	0xaa551e91	0x2d605856
-	0x66a13f75	0x0be4b8a2	0xe64a0c3f	0x288e5671
-	0x5ee690c8	0x9e1c4b10	0x9f055568	0x8c6ff177
-	0xa7229231	0x19e678db	0xd90be83f	0x0cf70d67
-	0x47462463	0x327fdd91	0x51986170	0x3ad883b2
-	0xa32fa5f2	0x82167691	0x74b6c59e	0x3eae0a3a
-	0x569386dc	0x6d67fc33	0xa0943958	0x40b2939f
-	0x334acedf	0x91b6a866	0x5debd880	0xa6f3712d
-	0xbe8ca5c8	0x4b43fa68	0x72b677d7	0xa42b4d60
-	0xc719163c	0xa469fbb9	0xb484def6	0x508ddfd1
-	0x23bf14bd	0x857a13ad	0xf7a47090	0xe6816794
-	0xbf6d3db3	0xd19fe091	0xb9421e39	0x35b184c2
-	0xa5c94a6c	0x13b2b25c	0x5c7b45cf	0x648fdd47
-	0x8832d949	0x0e2380c2	0x2f8e4f88	0xc01022aa
-	0x4dec89bb	0x0a2c5bff	0xa97e58f8	0x304dddd1
-	0x468828ac	0x603da881	0x646ddc90	0x1afa151b
-	0x985bf8ad	0x6e3635d5	0x181268c6	0x420e1647
-	0x913af569	0x14075a17	0x803aba15	0x2a2562b7
-	0x2f0627db	0x52785b48	0x36ce7fc3	0x6057349e
-	0x4affb11c	0x84e82be9	0xa0f60f66	0x1d176256
-	0x9f1dba85	0x2852129f	0x4592540a	0xae083e7e
-	0x744edf82	0x75a1e1b7	0x518fbebc	0xf1828d15
-	0xfa1e31b7	0x88ebf51e	0x0a648385	0x956c002d
-	0xc8b660cd	0xa82eeb58	0x0754bcf9	0xc4873df1
-	0xf06c843b	0x7e5ac181	0x59661ea5	0xef2ae542
-	0x0fea9691	0x9493a352	0xb401f705	0x85573914
-	0x4e1eefc9	0x45e51c5f	0xd713688c	0x97efca3f
-	0x292d0e73	0x8db44fd8	0x9f4479e0	0xc049ff9a
-	0xfac5ddbb	0x4d610fdf	0xa9e01cdf	0x93b4dafd
-	0x925004b9	0xb0796ea4	0x7e166ac1	0xd030c4ea
-	0xa9f34c73	0x276cbadb	0xf3b9c282	0xa5bd6a69
-	0x53df3f11	0xded46173	0x70bff329	0x0ddd0e77
-	0x52e4a782	0xf01b024c	0xda90618a	0x34a2dd05
-	0xc144d1fe	0xbaca12a5	0xbbd28cf1	0xc54d84f5
-	0x0e7cb67b	0xe009e900	0x23657441	0x2214b4fe
-	0x37693ee7	0x62e093d0	0xf79ca670	0xf1bc6cec
-	0x1b91f787	0xc9d234c4	0x2a193a4c	0x8c2bfaf4
-	0x75f4514b	0x03501d9a	0x5554de35	0x5ff35a26
-	0x670ad976	0xbc8151eb	0x725fb971	0x5768e86f
-	0x7fdcf5ad	0xe814f3ce	0xe8b9510a	0x55bf074a
-	0x415fc288	0xa1a360c5	0xf5fef671	0x2d6253fd
-	0x7fa09b81	0x2bb2e018	0x7159e648	0x10d5d59d
-	0x462047cd	0x77583e64	0x47f1074c	0xc3c0e0d3
-	0x023a55b5	0x4ad55057	0xe6d4b9d2	0x9cdd844f
-	0x87eff8f4	0xd95c1e55	0x7499004e	0x2a43a598
-	0x0c1472b4	0x33c90a5c	0xc4703c62	0xf293e2d9
-	0xc3153c7e	0x6eeffef9	0x115e14ec	0x4ad27157
-	0x888d87c3	0x33edc70f	0x7c38ce66	0x61c10a52
-	0x5db41c48	0x8e309060	0x7b847b63	0x6b619cd1
-	0x12855e03	0x52c3281e	0x704f969e	0xf9ab7862
-	0xb143fc54	0x1ac23fd5	0x89dcd807	0x40a7ffc7
-	0xc84245b8	0x0248d94d	0x29aca158	0x92d7b241
-	0x751588ff	0xe8203587	0xc5bd7cdc	0x9de82608
-	0xb075493c	0x5d43c228	0xff6a5345	0xa64cae5c
-	0x4a1a9a26	0x08c60b16	0x9399ba46	0x3f535d1c
-	0x3b9a6ab1	0xa446115c	0xa77bd99c	0x2431dc72
-	0x729a637f	0x13f960d4	0x230d4e9f	0x0c608153
-	0x9b9670fc	0x72494838	0x14832ade	0x65aba892
-	0xd6434455	0x17697982	0x68b9bb34	0x1d700b3f
-	0x6d0dda39	0x30e0d15e	0x87de41fa	0x9fc55b16
-	0x0f5730d3	0xc3ea8127	0xeee64f5f	0xa02c5baf
-	0x64e18d74	0x31de5660	0x5cf8d724	0x6c07ceca
-	0x409e862a	0xd4ee7999	0x90c22c99	0x59cd395f
-	0x09c36563	0x1993b09f	0xb0c4e064	0x8d6870a5
-	0xe2e8e337	0xe8bef0cd	0x708d869e	0xdf808519
-	0x6fa61e32	0x27161ea8	0x063c783c	0x2aa55c1a
-	0xa6fcc8a3	0x918b284d	0xbb7870b9	0x788102c3
-	0x3e49edfa	0x6c5eae4e	0x1c9fc361	0x554ca60b
-	0xa08364d3	0xa7bd4442	0x204822a5	0x000b71a2
-	0xd4dff005	0x43265901	0xbdb99200	0xc438e254
-	0xa4982e58	0x02812101	0xfacbff1d	0xeec56aaa
-	0xa5525774	0x21ada574	0xffe2f703	0x15d30ea7
-	0x600696f9	0xc7ff3f59	0xdb57c175	0xa16f78df
-	0x54a15622	0xe3742dcf	0x06d32994	0xd48463a2
-	0x44c7c25a	0x41d6ded1	0x3b314de0	0x09992482
-	0xbeb183c5	0xa0a65c27	0x842075b7	0x9b97e3c6
-	0xd9545fc7	0x16d00629	0xd85640df	0xe79e694a
-	0xe818d277	0x1c3d4623	0x23a9a926	0x83ac1b3d
-	0x39e890c8	0xb3738b84	0x54b772ef	0x74518f0c
-	0x7190098e	0xe26aff75	0xf6237011	0xbd3400fe
-	0xda1b8fa6	0xdbf5566b	0x5155cef3	0xddbf1973
-	0x34e2cb2e	0x535fd6b8	0xbfd337aa	0x6dd1fb0e
-	0x52b04fbb	0xab5eca05	0xdb740dc1	0x104e6131
-	0xbf4dcb75	0xaeff3524	0x4257c6b9	0xbf1c8cbb
-	0x0a69ed82	0x90d991c7	0xea075cba	0x5e3c8330
-	0x823116f8	0xba8f8a2d	0xcb98a1e9	0x8b2655c6
-	0xd2f11133	0x3422f3ba	0x3e3a5742	0xdb9714fd
-	0x91701f60	0xeba19983	0x8bf9f157	0xec87cd03
-	0xb63260fa	0x207c345c	0x0c838d5a	0x736415ba
-	0x9638ab07	0xb32c72bc	0x304d191b	0x7775adc8
-	0x57ece662	0x0467bb66	0xb7cf80e8	0x4c635024
-	0x176946c3	0x29cba0ae	0xf214b3f2	0x6e727126
-	0x87b3747c	0x4c19b86b	0xfcc66fce	0x86681713
-	0x636387f1	0x589e78f3	0x2e8abf1c	0x22c828f7
-	0x99653c62	0x8e3bd31c	0x79187a73	0xc6d0e5e2
-	0x8005a045	0x78a38c60	0xe1e8ff4b	0x1102d320
-	0xaaf4ba7a	0x7223d041	0x45f73e81	0xaf7168af
-	0x218ab3ae	0x8b1956a7	0x4db00173	0x482c3bc2
-	0xd982b945	0x4bd7757d	0x0c5ef18e	0x74e66de3
-	0xcf421ae1	0xf2ddc098	0xcec27e0c	0xe79e711c
-	0x6f76e136	0xa8d72245	0x196390a6	0xbf56633d
-	0xd1156298	0x5712cd8b	0xaed801ae	0xa345fab5
-	0xfde1ba97	0x437a0b29	0xfc5628a4	0x93acf698
-	0x83ce0bff	0x212f15c3	0x723ef016	0xe793bd50
-	0x8bc51b39	0x42f17ad2	0x1df73878	0x19af3c24
-	0xf55b6f93	0x506138d0	0x164c542a	0x8d4e1a26
-	0x6c606f83	0x6fbebdf5	0x0e4ad76e	0xabd88e6b
-	0x0e0d74e6	0xd139e08d	0x8b6cf03b	0x04a527b1
-	0xe619c7a8	0xbf0d57f6	0xb38a5f5f	0x3f328013
-	0x374c0a9d	0xff36910c	0xe950a494	0xfc477720
-	0x37bd9390	0x4667497e	0x724eb66b	0x86bda8f7
-	0x52efc959	0x32d5c2bd	0xddbb49ca	0x9c1eef2c
-	0x508d8b81	0xc33d7001	0x360ae3c7	0x1197f6c2
-	0x25efc933	0x4ad234a5	0x9e9c8658	0xc16d4aff
-	0xbc428573	0x30e8b4c0	0x728c2c48	0xf34e1e70
-	0xd62187c5	0xca869f89	0x34685a33	0x85d9b877
-	0x9f77605f	0x93724d34	0x5fc8e8d1	0x70dd81a6
-	0x643e543b	0xe4ad6c73	0xd6b4e5cd	0x387519c3
-	0x719d8c6a	0xb2e0565f	0x02235c90	0x230c9b5e
-	0xe76841a3	0xc2833be0	0x4dab4a72	0x0ae6c0a9
-	0x0b5e12e2	0x4cda3610	0x954b6ff8	0x6d89a683
-	0x3583e633	0xdc540da7	0xe2955deb	0x0f290d9d
-	0xb01e57c4	0x977f4588	0x24b95f0c	0x45529128
-	0x4528b5ee	0x27511439	0xd088d9bc	0x7c471853
-	0xf03b8455	0xbda4a828	0xf49736df	0x50eb17c3
-	0x2affe0e6	0x6727858c	0x6500b8f0	0x0483aa89
-	0x0e1f6a41	0x72666733	0x85617ce8	0xa0c86838
-	0xbccd2eed	0x06e8462d	0xc947bf5c	0x4d2d0a53
-	0x02e70008	0x5039a596	0xb0118cc1	0x690ba325
-	0x057ca95e	0x032cc1ba	0x3dae2c88	0x4eaa740e
-	0xf07b09b5	0x6b2c2135	0xeca746b7	0x76019533
-	0x4cf477b7	0x31848299	0x6b5c7df9	0xc0db5ff1
-	0x7cd3e08d	0xe25fa562	0x260d66a4	0xda30cf2c
-	0x14ab6c70	0x029a8dd5	0x7cd5fe2d	0x98ea5852
-	0x555cf635	0x6c72ccbd	0x64120bef	0xd9e19613
-	0xf26ac6e8	0xafea03a4	0xc14a11d7	0xb2f8420e
-	0xe319634a	0x8a8fedd9	0x6ce0da89	0x74269f31
-	0xd7e0d776	0x86ae9513	0x48bdea80	0xb2e4c581
-	0xab25566e	0x9ccb71a5	0x7cedb09f	0xd2bdade6
-	0x39c96ad5	0xe8ebbeec	0xac8a2e2a	0x915be930
-	0x95e7c98b	0xd00e1d3b	0xdacd08ac	0xd9f515fd
-	0x45cd3946	0x828a2cc3	0xfbe1bd9a	0xc5e1ebcd
-	0xac69128c	0xcd6423ba	0xd8653b60	0x48f0614f
-	0x0c1ebbbe	0x7ab89792	0x9a4b0097	0x2bda854d
-	0xf17ab2c9	0xcde54eb9	0x4b53a030	0xe2399c4c
-	0x19454a2f	0x473fe390	0x3a42c16c	0xc4c106a9
-	0xf5d96e73	0x2ab4078c	0x5d20e7ba	0x47880aab
-	0xff5e0d78	0xa374bdc2	0xc17109ea	0x39fce648
-	0x00821cbe	0xc54a60ee	0xd753386e	0x7b28fc16
-	0xb6309bbe	0xaefd0548	0x41168500	0xee5989a3
-	0xe0177f09	0xc9fc9eb6	0x09a6e188	0x45776a0d
-	0xf19a4830	0xc6774893	0x814b2e43	0xf8be5e3c
-	0x22fa8237	0x75c98f46	0xb1c52edc	0x443d54f8
-	0x6a1a886e	0xc7f33598	0xaa794644	0x685e5ca2
-	0x97a735ba	0x3c1a391c	0x13f6f89a	0x660d7041
-	0x333c3eef	0x40541bb9	0x5c3724d5	0xc348023e
-	0x89791dd9	0xe72fba89	0x5af98b2c	0xb534fd29
-	0x64d0e6b1	0xa578e77f	0xf311215e	0x634cc8cb
-	0xbc534e51	0xdfce3ac7	0x90f88f51	0xb3f7dd48
-	0x20b3e0ae	0xf4456e85	0xacb3925b	0x2eb3ce78
-	0x37e61d82	0x724b9cbc	0x1462d9c1	0xd3f49dc4
-	0xc1ffcc00	0x7c3e3f86	0x6f283bf8	0xf43671ab
-	0x90cbfb35	0x55390829	0xc8fd0d31	0xc687c45d
-	0x724ee656	0xfc1eab3c	0x3c8c2f04	0x3caa3af4
-	0xbe220358	0x4d5b49a2	0x12cf4893	0x867173fb
-	0xccd4b513	0x7c94a1bb	0x86c42c18	0x2b2070f3
-	0xd2a70638	0x9d7c07e3	0xd02ed59e	0xd349488f
-	0x1e85754d	0x333db889	0x0d0defdf	0xef282e45
-	0xac3f6c29	0xd65a68d1	0x5d0914e4	0x395ec78a
-	0xb056aa6b	0x4d98d059	0x7ae08f88	0x25c923d2
-	0x79670f38	0xa881d62f	0x89cd5015	0xfb01da43
-	0x5861244c	0x05e201eb	0x41d71eda	0xb2babb53
-	0xc3845fb3	0x1f3b5c56	0xde6c10ac	0x73adb998
-	0x714aac3f	0x4ad9fc65	0x3acdd014	0xeb319d58
-	0x48842806	0x47ec1040	0xbfdf0052	0x3c478ec6
-	0x83b43a0f	0x9e727e69	0x9f4d5925	0x9f45c13e
-	0x30b8572b	0x26edf8cb	0x577e8b9d	0x9b98d7b3
-	0xa44a9bbb	0x903e39eb	0x51226dbc	0x933a52b7
-	0x14c6dc86	0xbc24db59	0x21054454	0x98fc5fa6
-	0x2c9d8606	0x19178173	0xeda24205	0x90dfaca4
-	0x21d562ad	0x7e3ad05e	0x2b3a40a4	0x46513f35
-	0x0d13a598	0x8bf71ca2	0x6a36c430	0xe66f5587
-	0xc9f13bd6	0xb6534a8b	0x8a3fbfd6	0x38cdfe6c
-	0x1a1c89f8	0x6d782709	0x7919c451	0x6ccc96fa
-	0x334029b2	0xa638356e	0x001e709f	0xb2132b06
-	0x483f1933	0x189ab8f9	0x4ba0ec13	0x490aee0a
-	0xda63f1fc	0x5679d38a	0xcf1e92f3	0xe7257fbe
-	0xfeb733d7	0x0704860a	0x34ce2032	0x663b948f
-	0x544cc928	0x8c23d5aa	0x67986469	0x93f9ac08
-	0x4fa9a13f	0x9eb311d4	0x41a64161	0x29d1050a
-	0xa5285c24	0xb53d03a6	0xc5de26f3	0x7876d1c5
-	0xbdcdcb4b	0x79d1196c	0xe9890732	0x3e58a8c0
-	0x874f03c7	0xfdfc9cac	0x5d57fa57	0xa3ef01df
-	0x47bcff48	0x8beb1aae	0xf4bb4f9b	0xa5c83b64
-	0xd69ab0ce	0x40f6691d	0x2eb8fb7d	0x22640f8d
-	0xac1ba157	0x3687d705	0x7fac8727	0x4ad75cd8
-	0x7016d2e9	0x25c36c08	0x7e4248ea	0x292bda19
-	0x2acf589d	0x0ef7726d	0x835f9e62	0x3f9a1973
-	0xbb6d2588	0x078ff6b4	0xaec22b5d	0xc740501e
-	0xa2ab115a	0xea993e64	0xa0cc3ed1	0x934e4e0e
-	0xd732b66d	0x5fd28c47	0xe4ccb898	0xc6a101c0
-	0x78274bae	0x625df6a1	0xaf774052	0x3b7c08d2
-	0x6180ac39	0x3e5aa769	0x6ec74578	0x6b5d27b9
-	0x98e58a17	0x119dd7d4	0x39429c5a	0xe3d5b391
-	0xbb8fddb8	0x5929801c	0x68cef71c	0xc36fa301
-	0xeace4850	0x29f4f97d	0xa58bad79	0x2823998f
-	0x0fe1352b	0x5960ded0	0x69308816	0x0d7e33c8
-	0x2fb13bfa	0xff6a326f	0x69cb631a	0x839ea2a1
-	0x528a8065	0x34cbebfa	0xd4432cc4	0xe13b550b
-	0xe046569f	0x87b41fb1	0x7751107c	0x0ef6e60b
-	0x856ffc50	0x11995683	0x77c2ebf1	0x4dec97f9
-	0x3a28ebc0	0xb7bfa04a	0x40cdceb0	0xd559dd06
-	0x61c2cd6a	0x8a906fa2	0xd55f43d6	0x7fb3ac35
-	0x8cea4e81	0x1d359c2e	0xec447c57	0x3414f7f1
-	0x18243b84	0xdf76849f	0xd753044a	0x7af2d51e
-	0xaee26ecc	0xae6946b2	0x7478c675	0x88b22f49
-	0x4de13fc9	0xd35c5956	0xeebb60b6	0xa15b1736
-	0xa6e78d78	0xfd5e30b3	0xb4fade2d	0x964eb418
-	0xe9035f51	0x22ab8242	0xfaa64053	0xdfe03834
-	0x47beb588	0xb82a0887	0x11182e85	0x2f2f9a67
-	0x4b612f11	0xae04077e	0x7f783c25	0x883a34e1
-	0x32d43beb	0x6f0536f7	0x85c1537e	0xfb26199a
-	0x45417e88	0x4af2c8cf	0x0a334486	0x2a3e6838
-	0x31b8725b	0x63d64541	0x7e516a0e	0x7e42e766
-	0x4cf30198	0x68abecff	0x7fb49c43	0x8f5b558b
-	0x32b99abe	0x67337248	0x224c3411	0x4e7c41b7
-	0xd3aee3a2	0xca19e704	0x2a430b7d	0xe9aee453
-	0xf4ce492d	0x48fab2a9	0x42ec2076	0x0182cea5
-	0x8a6373c7	0x18f41b5d	0xdd062fd5	0xb1db44a7
-	0x285ad917	0xeaaabbd1	0x359b1b23	0xcc123c8e
-	0x38b70cb9	0xb01ae722	0xa6e72010	0xb647530e
-	0xf9651d41	0x366d6d0f	0x4b656a6d	0xd36637f0
-	0x4b5ab8bf	0xc22fdb1e	0xc57c8250	0x799f4e60
-	0xb55bd50b	0xe8a3432b	0xe752e4e0	0xd0c86482
-	0x122991f1	0x5bec598e	0xbcb89abd	0x739f61d0
-	0xd230ae2a	0xd0b99c05	0x2a998a6d	0xab715831
-	0xb7dd1939	0x57db0ea7	0xed1f4952	0x49274caa
-	0x35e319b0	0xed2c9cb3	0x601caa20	0xfe782688
-	0x64b6d30b	0xcd5c325c	0x2c836157	0xa3552f79
-	0x188094db	0xa42dd7e8	0xc09c2dda	0x02d98d8d
-	0xed270d28	0xb0f38ada	0x5d7b4261	0xb41df8d8
-	0x7341b6ae	0x024ce90a	0x0727ae4c	0xa8dd3a0d
-	0x390f84d5	0x43f5bd12	0xd11fb61f	0x6fc330e1
-	0x7f2d7fa6	0xf758a4e0	0xceb1f3c3	0x2f341836
-	0x98fb470f	0x5bf68e58	0x1917a5b2	0x75f33be6
-	0x16e22316	0x8aa810a0	0x1fc6c9b2	0x22179249
-	0x3de701e9	0xec48d8b6	0xe85248c1	0x314ce9c1
-	0xddeb2f47	0x0187909e	0xaa755f62	0xb2019460
-	0xb2016a9c	0x91f789be	0xe5925997	0xe4864300
-	0x1fd13759	0x0ad97c1d	0x7cf08c01	0x7eac2dd6
-	0xcf61a7f3	0xaf9e108f	0x939a2fd9	0x0cb48e78
-	0xe6ea1a8b	0x0b968273	0xef1c9310	0xf60e82b7
-	0xe76e9bed	0xb8fa9668	0xf889765b	0x0e51eed6
-	0x6b6566ea	0xa8f7e2c5	0x9d8c283a	0x879afdcf
-	0x944873c5	0x58afcfa2	0x2e60600e	0x59666667
-	0xc812b833	0x5842d0be	0xdbdc0829	0x786bcff9
-	0x5857ba06	0x6968c729	0xf5447949	0xdb1ceeb0
-	0xaf04d1f5	0x30614f7f	0x3e80fdc9	0x8a6e1ce0
-	0xa267d7d5	0x8896143e	0x24e59072	0x68122e1d
-	0x3ce24add	0xda677bdc	0x8c3f74ef	0xfa60e825
-	0xf5c136cc	0x2cc5f249	0xa1c6b642	0x47a2305f
-	0x52cadbc8	0x4d0c32f6	0x07f4d344	0x1f496d59
-	0x5699b970	0xb8cbe564	0x707f7a2e	0x818bfd45
-	0x800a8be0	0xd3de4f1f	0x62de0a3a	0x6b342869
-	0x054daa7c	0xc72b945f	0x1612f126	0xdb4ad492
-	0xa28c467b	0x78542799	0x61607353	0x39f1c142
-	0xebf30ad6	0xabe076d0	0x5125cce4	0x5584149c
-	0x65fa33f4	0x878a918f	0x8c7e5c37	0x334c4284
-	0xbfd816e1	0x0f0f3460	0xd54519fd	0x03701ca9
-	0x64885229	0x00e841d0	0x756a9472	0x0c16c5f6
-	0x65560e81	0x129b6995	0x91c9dd1e	0xe9730dae
-	0xce47f2a2	0xead8a0ee	0xcd58078f	0x7ca2df31
-	0x0ebbf13d	0x3c74e061	0xb7f3980a	0x0d354b88
-	0xfd8db90c	0xec6726d0	0x6bfce0f5	0xea98b7a0
-	0xac5ddde2	0xb372a14c	0x47b09ed5	0x531bd5c3
-	0xcfaf5a0a	0x51d6394f	0xe9efdfa8	0x37c79445
-	0xb13ebf62	0x46715efb	0x31e6a0d7	0xfa48ab48
-	0xc6552f2c	0x3067b978	0x0afa4ab7	0xc2c17055
-	0x68dd427d	0xeac01e43	0xe90f12d8	0x6d97c3b1
-	0xe0d339b0	0x2f3c84cd	0xca3eb3b1	0xbc0d86e1
-	0x3566f657	0x083374b0	0x199c677f	0xa4a8a4d3
-	0x224dd5a8	0x8f304abf	0xe1019878	0x9b290d4c
-	0x5cef7341	0x59ff7e48	0xc91663ac	0xb0b1bede
-	0xe9d8a9a5	0x8f34cb70	0x588d00d6	0xb7fe69b6
-	0x29036caa	0xd21d7998	0x4edc3ee9	0xdbd94f37
-	0x99c63455	0xac94efda	0x545635dc	0xb787b5e1
-	0x8228666b	0xc7cd8170	0x4f1924a5	0x437884c1
-	0xfa9236fb	0x1f0f949c	0xd1dc0597	0x56082a24
-	0x04e51919	0x05dd926f	0x06d264ac	0xaa672d38
-	0x5a3e396b	0xab48a57c	0x53489bd1	0xb36b3ba2
-	0x55164db6	0x5b52c5f9	0x68aa8b7f	0x922ce829
-	0x09e6e5bd	0xbc488a86	0xc0fb6dab	0x98e7754b
-	0x4c9ad717	0xe3ae7045	0x0b498742	0x80a4384b
-	0x0dfe0b99	0x70eab3b9	0xbee30b9f	0x4237ca85
-	0xe67662b1	0xdae3dce5	0x47c84a45	0xf72febf2
-	0xa58dfdc8	0x77ae88d4	0x038c76b7	0xae699990
-	0xf5f10de7	0x65d4c59a	0x004a8b4b	0x67c788ec
-	0x71c918d7	0x0ec70171	0x7041de53	0x43591e1c
-	0x807242f8	0xa27fe146	0x0055fc7e	0x2f08467e
-	0x5e04a068	0x54dab094	0x4f6e8c7a	0x20ac2825
-	0x47949a42	0x9181486c	0x038e3132	0x7c1c51be
-	0x97544f38	0xe2d27588	0x64889c21	0xdad9a1a9
-	0xf1d328a4	0x7d47991f	0x2faa1b85	0x2430cab0
-	0x0e849f91	0x213686c1	0xa2635f37	0xee7983ae
-	0x87871273	0x6867d60f	0x04cb29ae	0x4e0ee4ee
-	0xfbd2666a	0xfd7fe017	0x870b26ee	0xc42e104b
-	0x78919117	0x19590e66	0x9e1a5039	0x9609471b
-	0x4057fde6	0xc1f27544	0x30af8a8b	0x2ea267a6
-	0xcfd886b6	0xe632b1f3	0x3f10bc50	0xf38a1bd8
-	0x7ae1e284	0xe3876d7a	0xb4ce64f8	0xf74b4100
-	0xa97686da	0x17ebacde	0x2ab068e8	0xcebd1076
-	0xee8f81d8	0x0d394301	0x6f32c277	0xa926dc1c
-	0xd5d2ea55	0xdc016b6b	0x6a96022f	0x0143e314
-	0x23836eed	0xa3e18369	0xd2a155bd	0x8022cef6
-	0x080b32a8	0x74ba38f0	0xd1ca2089	0x7c80219e
-	0xf536af16	0xd7a337e3	0xa33600a6	0x39c7754d
-	0x7d215312	0x1dd65026	0x8cb496c7	0x89dfd508
-	0x9f945a1c	0x45caec32	0x020a1edc	0x5917baa3
-	0x296b4b1a	0xcfaa2023	0x63e7a0e5	0xc48b19ae
-	0x78d98b1e	0xc5d6be01	0xfe4ef13d	0xea6c9915
-	0xb8190f09	0xf1793822	0x9acf1593	0xc7710fa0
-	0x6b9a9f3d	0x0220ee2a	0x5d63043d	0x7292a0d5
-	0xba9a1682	0x6f1e7c19	0xed7cc52e	0x6bb89645
-	0x4370269c	0x9cb2c1a1	0xa7135973	0xfd1f3bbb
-	0x50e6eb67	0xf2b9bd22	0xd891f6a7	0x4e0a7449
-	0xc3dc0005	0x878e3333	0x3b4b8686	0xb215c65c
-	0x5d8d24c0	0x8d203496	0xff20d243	0x0a6c1253
-	0x2385c79f	0x52e8d6dc	0xda4bb8b7	0xfab66d97
-	0x05a4a795	0x6876e856	0x9dabedc2	0x53550c20
-	0xb3bba16e	0x853bf1cf	0xb85b906d	0x3f374468
-	0x62e07c2c	0x6903a495	0xdb119586	0x07e91546
-	0xa8388945	0x5a4e1dda	0xf054cdad	0x4b052880
-	0xe9bbc9ec	0xe3555e11	0xd4d6479a	0xcad6a986
-	0x31d9c4ae	0x510ff951	0xcb2f3164	0xbe283401
-	0x0c390b9e	0x0c9cb487	0xe64e8ffe	0x611a63c0
-	0xa1d700a5	0x3f864335	0xd1fdf32d	0x7a3aeb09
-	0xabbc8c4d	0x4d703604	0x6532c8e7	0xccebc529
-	0xf3c0f514	0x1567f19d	0x591abf6c	0x6c7fc459
-	0x0858b061	0x092b2489	0x33c1a9cd	0xd6cc8e2e
-	0x7c1ffeb3	0x3f45cf40	0x1fbcbd39	0xc6f0e628
-	0xb88bab4d	0xc699de42	0xb62d850c	0xf71a6768
-	0x2866b891	0x13093fcc	0xc730c502	0x2deaeff4
-	0xb1bc8535	0x4303997b	0xb31ebd2f	0x82debe94
-	0x843fa02d	0xba29f80d	0x03cb58c1	0xef1d2017
-	0x0b5aadf0	0x6c5c3286	0xf084faeb	0x8b96a39b
-	0x67cb38f8	0xf686ee62	0xbfdc22a1	0xee3f779c
-	0x8ec73c8c	0xb448536d	0x67bb5d68	0x4369ea8d
-	0x4b5367cd	0x2dbbc0be	0x8f5986e7	0x798c8392
-	0xd3aac078	0x0081c0bd	0x94d9d70b	0x40bdeae8
-	0x6b528e89	0xb0713745	0x063e535f	0x7d696463
-	0x64f0666b	0x68a82e8c	0xc749dd19	0x875883cc
-	0x3d35728d	0x4c0e5d8d	0x135f11b3	0xb649b37f
-	0x8aead5cb	0xdfbd573e	0x563bf917	0xcdb75f08
-	0x024b93fb	0xc6477eea	0xd88ce51d	0x95f7d77f
-	0x0b561446	0x2fb6992c	0x4b48c8b1	0x940da60f
-	0xf1be60b9	0x66d8641b	0x17a0ce15	0x49d22f40
-	0xb8c494da	0x91930bb1	0xcd317991	0x4c5b4c23
-	0xafda60eb	0x212c9f04	0xe4732f4e	0xf731ae57
-	0x19165943	0x2d9288c3	0xc9c45dd3	0x2e05b148
-	0x225a256a	0xc0249ea2	0xe96733d1	0x56a6803f
-	0x20458549	0x28210fd6	0x13da740e	0xf0f0be41
-	0x029c1fa9	0xb1daf3f7	0x1bf0c9aa	0x6f0d5221
-	0x998b3616	0xa02212a3	0xe76b39b1	0xba0823e6
-	0x146da6a4	0x858a3e0e	0x58e75b32	0x732f75ed
-	0x8d88385e	0xe0e7ed55	0xc08ca86d	0x97e2ef67
-	0xbb048208	0xd384c40b	0x8595bc69	0x65581977
-	0x7b091c4c	0x60bfbbb5	0x23bcf38f	0x32e4621a
-	0x7f790d95	0x72c3267c	0x34dd0c12	0x27438915
-	0x5619893a	0x09d55159	0xdba7eef9	0x7413634f
-	0xf4883417	0x59a2f28e	0x491f5779	0x0c138f9c
-	0xc52a03de	0xcb1f92d0	0xb6cfcd21	0xbba95c83
-	0x5302f12d	0xfc4c030f	0x18722dde	0x131cd3b1
-	0xa19a1cdb	0x103d9216	0x403e45db	0x5cab72f3
-	0x17e18f5c	0xbad9d0d9	0xd0d2e010	0x798106fc
-	0x3abace6c	0x2c3131c6	0xf9529b61	0x27cfa158
-	0x8890951f	0x87ccf0f3	0xa112b1e8	0x3e0eb033
-	0xd7469e14	0xb6ccd2ca	0x3d238069	0xb32f057e
-	0x8d2c939b	0x18d8aa3d	0xdb3cdb2b	0x861ba258
-	0x46e7b170	0x4830d004	0xeea1b8b2	0x44e29b51
-	0x0cdd8591	0xf93ad973	0x9383c44d	0x24e323be
-	0xaaac87a1	0x84eb09d7	0x1f66b641	0x303f92b4
-	0x81a63a86	0x516321e4	0xe33dfe2e	0x371a4624
-	0x8f936425	0x596976ca	0x7b1947ef	0x83a9db29
-	0xc5f337b0	0xe4d51b73	0xb35b56ce	0xb9cac5ba
-	0x51705ecf	0x93e7d63f	0x5ee7d916	0x479f25b9
-	0xe90bb406	0xfcd6e78d	0xbd8ed9b7	0xbca7c8b7
-	0xdf95f4cb	0xc28baeba	0xb4534bbb	0x98b4f840
-	0xf2218357	0x726e4f81	0x7591ebc4	0xc0523d15
-	0x6bc82550	0xedfbcfa0	0x57280f50	0xbe7e420c
-	0xd1152012	0xbf3ee0a2	0x11825710	0x18e728d1
-	0xb8af00b5	0x2d1e940d	0x1c9ade8f	0x923ed269
-	0xfd8c2580	0xf6477ff7	0x476a486e	0xd09c18dd
-	0xaede7959	0x55fb68fc	0xe5692f7f	0x0bf4bd18
-	0xf5fede2b	0x07bb05e7	0x1bb8ec54	0xa46bba84
-	0x15051826	0x762ce6ae	0xa0246225	0x35c38cab
-	0xbbd00a24	0x8205d3f4	0x4cb33ba4	0x293013fd
-	0xd4f67965	0xe9c1951b	0xff108efa	0xb8e68197
-	0x36d51e4c	0x2959f7f9	0xf2e4206f	0xc9973e09
-	0xb61ce3fa	0x9543be90	0x63642668	0xcaaf02be
-	0x7346a8eb	0x4111f5b5	0xa453cc2b	0xdb524b49
-	0x4d528cfa	0x71e5fc4d	0x62cbbab2	0x8423f40b
-	0x1a4db908	0x560c41c2	0x03982d88	0xa49c553a
-	0x529f6acc	0x82dae294	0x6c5dbaa4	0xfb4ae1f2
-	0x36e31345	0xb5cba88e	0x3704c623	0xe35245ea
-	0xa412107c	0x35faf59c	0x08ceb649	0xbd67a6b9
-	0xe37ddfdf	0x21303abc	0xb7de5e8e	0x88d9366f
-	0x49bdd73c	0xeca0cd02	0xfe1e01eb	0x30a56c2d
-	0x0cae1f5b	0xe77521c7	0x5ca59eaf	0x1288aa13
-	0xc60bc96f	0xf7292504	0x2b037e4d	0xf34757b4
-	0xedcdc492	0x39044092	0x5d710fbb	0xb8658511
-	0xe23e4d57	0x595d4d3f	0xc0f80105	0xfe952879
-	0xe81e2cb6	0x4f5a8fed	0x3bd0d700	0x211887d3
-	0x6ea6e78a	0xe066640c	0x0d29c725	0xdabbeedd
-	0xd2aca4d4	0x65c4a06a	0x6645b62f	0xb1de0cd7
-	0x022e07ea	0xe9f9248b	0x0a2251da	0xdf34159c
-	0x7894bab3	0x72e465eb	0x37448fca	0xbfbc1911
-	0xa79e4938	0x48b83ec3	0xb9c6833f	0x19d24abb
-	0xa434e777	0x77947277	0x2309612e	0x546a6ebb
-	0x4c96447e	0xab918dce	0x5075ba1d	0x0aa55a7c
-	0xadcce25b	0x837819d4	0x90d62a9d	0xf116ede5
-	0xb056cc7f	0xb036353e	0xb7c1af8d	0x014c2cd1
-	0x356f1593	0x008c2634	0xf7cd0cb0	0x02b0576c
-	0x5364c954	0x5b40800b	0x60054bd7	0xef31bb60
-	0x1a85370a	0x458c4348	0x435b8da2	0xd8df0e06
-	0xde0cf1b8	0xd3c6171c	0x0bc14938	0xdc874128
-	0x694f96cc	0x7b6687e0	0x9ca59f25	0x617aea60
-	0x63ebcc8d	0x4bb44d00	0xce46d01c	0x4ab07a75
-	0x64757638	0xe5903811	0x3562895b	0x760627ce
-	0x8939cc7f	0x225db9b1	0x730062d9	0x7a5a7a15
-	0x49678fc3	0x8620cb95	0x9439dee1	0x501f2cae
-	0x3d08a33c	0x352de5c1	0xe7b24442	0x6ec76b79
-	0xc575a1e8	0xb7024b20	0xc9dbb9f0	0xfe2303c0
-	0xba3716ae	0x0cf37bdc	0x1c68a4a7	0x7ba0d609
-	0x43003a93	0x17dd96c3	0xb884aa37	0x15b2d65f
-	0xf6016133	0xd1fd7e04	0xc0a22822	0xf8c26247
-	0x818c35fa	0x4e2b3605	0x83923c44	0x4ddd4397
-	0x6faf6a11	0x50438703	0x67796dac	0x3443b780
-	0x484f5bb9	0x8ead98ea	0x472ae543	0x94b0b17b
-	0x1307833e	0xcb0e8286	0xb02e1ab1	0x36a89f9a
-	0x372e82f0	0x84741303	0x111ad8ae	0xb1eeacb7
-	0xd7d8ccd6	0x5f779f32	0x0d65184c	0x0a398467
-	0xc07c099f	0x0704ffdc	0xa10b2f17	0x4c926dc9
-	0xd80829ee	0x0821015a	0x512e6d0e	0x57b514dd
-	0x509cdfd6	0x7e08ef24	0xf536c381	0x65483797
-	0x439311fd	0xabed0f15	0x51a372c2	0xdd24c506
-	0x839cdd63	0x0c21c8dd	0x513d9eb4	0x43c6a95e
-	0x5d543848	0x64843a49	0x687bbf41	0x93d3bce3
-	0xcf85eea3	0x5f3a6fc4	0xe7b45979	0x4c5848ce
-	0x924188e3	0xbcbded12	0x0cc18c86	0xf3fd5723
-	0x148dddb6	0x77cb388f	0x30afd47c	0xa306c453
-	0x1da0b234	0x0f206f46	0xf25975bb	0x9c75d28f
-	0xc60ad2fe	0x0067c5b0	0x497a1617	0x81d330e6
-	0x2c5362ef	0x86a54b1e	0x80ad976e	0x0a86ed37
-	0x1183b84e	0x2e2ce6e5	0x10b02598	0xd56fb0b7
-	0xe3e0bca5	0x755d2333	0xe0be1b85	0x6c976f4a
-	0x555a1465	0x8ab38399	0x51d4a5c8	0xec3d86e1
-	0x2a85d0dd	0x0d31c16f	0x603f2d48	0x274d5d68
-	0x292e7df9	0xe444f292	0x329946f1	0x132c3230
-	0xb2c3ec05	0x88362f92	0x763dc2fa	0x7ee6f3ab
-	0x7ca649e8	0xafee8a8b	0xeef65517	0x4789c1e3
-	0x85bd4cb3	0xc87762d3	0xfa528ba7	0xa8e20dde
-	0xd369c227	0x97e7f300	0x8256f4ce	0xdd5d2901
-	0x1e37c55e	0xbb6e22fa	0xd9424392	0x8798d9a5
-	0xc118ddb2	0xc3c91c40	0xe68ead77	0x8cf3655b
-	0x4381e8fc	0xc94f312a	0x0b372483	0x70b620df
-	0x53820813	0xb50d6f0c	0x64a53e9e	0x6f7f19f3
-	0x6315f718	0x9aafff2e	0xf3b5a338	0xf1f3293c
-	0x750ac26c	0xefe3ddf9	0xdc7369eb	0x024dafe0
-	0xf56354fe	0xf0afaf86	0x7da1df00	0x7447ffa2
-	0x4afd091f	0x24f39c82	0x3b3c8aa3	0xd90fc65d
-	0x10d90b8a	0xf05d49fd	0x281320fe	0x75f62523
-	0x0537b558	0xf52ae61c	0x77961852	0xbd0db386
-	0xcb650cb6	0x7387ec69	0x320764c4	0xf5013b3f
-	0x4f4239c8	0x4983a307	0xf510f405	0x7e355790
-	0x4f8480d2	0x50dd84ca	0x66947bed	0x56efdfe0
-	0xa593407d	0xdac216de	0x642a5f74	0x92bb9c2f
-	0xf37abdd9	0xa24b1b64	0xca1f722c	0xaa5de969
-	0xb6cb128a	0x697f787b	0x5bd74fb3	0x6de74e39
-	0x2bc9a4aa	0x634455ab	0xa82aecc4	0x69647f0d
-	0x4be06592	0x0c220c92	0xb08adf1f	0xd4571d2a
-	0x0fadece6	0x297c124f	0x2830a499	0x3cc8363f
-	0x44e34d3a	0x27b4d820	0x98be7f08	0x43417964
-	0x8a3af8ac	0x89c42336	0xe55d19dd	0x00ee1f6e
-	0x47d48658	0x55986f58	0x11ccb046	0xf3b97a07
-	0x7ed364a3	0x106cfcd0	0xc1533857	0x3add2c15
-	0x143852c7	0x55b38512	0x49a85ce8	0xd61a285d
-	0x513bd0b9	0x21bde48e	0x4f231482	0x93aa6dde
-	0x88035659	0xa83e3d2b	0x542513f8	0xe6e74a1c
-	0x06092343	0xd37c8770	0x41553ead	0x09980a79
-	0xb0e45895	0x80db4662	0xa6ce0960	0x965cfa7e
-	0xfea96644	0x2a79157e	0xf020e115	0x61823e96
-	0xf14f63d7	0xd753d1bd	0xd24a060d	0xfd2691b9
-	0x18da9d0e	0x9f3c93c4	0x2730e0f2	0xb47e2afa
-	0x920fda38	0xb5d89646	0xfb4728e5	0x7e78c2cb
-	0xe46f812c	0xe51cc5c0	0x9d2957fc	0x548798a1
-	0x240c2103	0xd650ff70	0x15c49ff6	0x99587c0a
-	0x1bb4a5ca	0xd6db66e7	0xec2d3ac5	0x54164690
-	0xe61bd6f8	0xc7a45cf8	0xee25f4f4	0xd1eb3ae7
-	0x90085a1b	0x46a7a74b	0x829717f2	0x7f0769cd
-	0x3ef72792	0x0c8617a7	0xa86becad	0x9dfe5329
-	0x1a33c5a6	0x47d4c75b	0x2e10b45f	0xbd11762e
-	0x15b72a9b	0x015c7f84	0x379c6bd2	0x27525345
-	0xff3ac5a6	0xac916082	0xf5c24317	0xcc43fc64
-	0x7f092c8d	0x931d9a0c	0x5a07f13e	0x3e1aa46b
-	0x717a343f	0xd51221c4	0xc9422fcd	0x63f7af00
-	0xde81a497	0x0322d271	0x972a4065	0xd75df029
-	0x343a94a0	0x8c225f7d	0xb4abe87e	0x3cb8ba1b
-	0x0babab14	0xf29704e7	0xd7134233	0x391f1a35
-	0x33aca565	0xe6ae586b	0x0470a42c	0x570efddf
-	0xfea26a3b	0xcee8d934	0x99ece522	0xb8af1375
-	0xfe4dea4b	0xb96a32c2	0x3469ef9c	0x029fade7
-	0xc4e77d55	0xc0449b95	0x63336e95	0x8d46c2e0
-	0xd86d6e23	0xd365b781	0xe73ba0fe	0x10a354c5
-	0x2d4511a0	0x077206cf	0x1c0dbd55	0x03396771
-	0x8bce27af	0x70355b4b	0xc2275e58	0x3cfa4df5
-	0xc8b3b9b8	0xf3fd510f	0x6b055de5	0xb3fef295
-	0x42b95a20	0x5b5e75e7	0x0aaaa734	0x636d50ae
-	0x8329283e	0x446e76f3	0x6adc320d	0x69a3e9df
-	0x1da68939	0x6f071783	0x498dfee5	0xaece51ed
-	0x4f8a72a8	0x4f2f2f65	0xdac3ba47	0xcbab0287
-	0xf966cb4d	0xba27861f	0x54c79a21	0x44e2359a
-	0x6e6b0e7f	0xceae84fb	0xb1530a59	0xecb8cd96
-	0xff60633e	0xed748fe3	0xf1ab0d95	0x59997216
-	0x6894cf41	0x948fc7bc	0xfb162ae5	0xeb9951a1
-	0x99d0a7a3	0x9234587f	0xcd42615b	0x6f9ad0e8
-	0xeb936dbe	0xbe72b62c	0x44ab5e9f	0xed736b08
-	0xffaedca9	0x103b89bb	0x7896b40e	0x13a5a924
-	0x56786357	0x02ab80ec	0x72ef47fd	0x81bf0fd7
-	0x6661b300	0xaefadc79	0x9968433a	0x16f3718b
-	0xe997a663	0xbbb55a49	0xf9b9a710	0x5727271f
-	0x20e9bf55	0x358e3986	0xd1214e1f	0x4d42c46f
-	0xa6bf8194	0x0c14a853	0x7b51aeb0	0x2f3d4de4
-	0x3d6ffef6	0x4e94ba19	0x71a9c861	0xcade2398
-	0xe0b3eb18	0xc9f028b0	0x7d29d2d0	0x372ec60a
-	0x288a5bfd	0x4fc2bab3	0xc01dd045	0x8222e147
-	0xe06676de	0x750bbfea	0x586ffb3d	0x2addb655
-	0x767a6528	0x78abceec	0x1646cb38	0x21e26890
-	0xd2a7937b	0x2463457c	0x764103fb	0xd540867f
-	0x3566875f	0x007449ba	0xf9c0c523	0x2c51c86c
-	0x437e1196	0x69fc0059	0xe0103408	0x19f23997
-	0x23fdf335	0x7262eef4	0xcbe09390	0x583d0099
-	0xe862084d	0x19fffbab	0xd2958a5a	0xcb165416
-	0x32f3a97c	0xe502303a	0x16c4eda5	0xa1bcfd1d
-	0xc4f35053	0xfd037f66	0xdeac9fee	0xbfb167b1
-	0x39804db6	0x0bc2011d	0xf56bcd68	0x368cb345
-	0x52fcb352	0xc306c535	0xf6bff09c	0xa429cbf7
-	0x7e504be4	0xd2240214	0xf09ee41f	0xcbcf1fe4
-	0x70f96a85	0x8394bf28	0x3cc19a50	0x49581f96
-	0x58da5ae0	0x94708c48	0x63febeaa	0x4f656940
-	0xa7fd6879	0x65524f66	0x5f7ee0df	0x11d487f9
-	0xb494641e	0x7eb57255	0x5aa208c0	0x5666243a
-	0x7d5970b5	0x71ea69a1	0x67059c9d	0xd3bde5bc
-	0xe952b3fe	0x27bbf258	0x197504f4	0x5da6649d
-	0xecddf4de	0x2d040d3d	0xbc9d3ab6	0xd8cdfb81
-	0xb36ab627	0x7a548111	0xaaeefa4c	0x0e55b263
-	0x4f9da6e6	0x26a137dd	0xdea03395	0x23b87267
-	0x5b3cc98a	0x206de858	0x8d2e5cd2	0xb60f14e6
-	0xfc10356f	0xeecae1d5	0x39783cbe	0x1a1c9a70
-	0xb52c6f05	0x64adf10b	0xe12d9f3b	0xb3fb7cf1
-	0x9051fdea	0xc16ed3bc	0x697199b0	0x08f34342
-	0x2fb2bab6	0x729ed2b8	0x7691088b	0x82bc9cc1
-	0xafce7ac3	0xe167bbb9	0x362e5d43	0x945510ec
-	0xf32dce5e	0x4aec9a82	0xb80520d3	0xd8fcbe40
-	0xf4877350	0xcfdd487e	0x8c9ff8b5	0x84ce70df
-	0xffa6abd3	0xf9d2f273	0x342dbff8	0xa72580e3
-	0x6ffccdc3	0x0c7ccc0f	0x6b24afd4	0x82b71a25
-	0x1ba361f2	0x6ed8a67d	0x243ce000	0xd16b2e19
-	0x86d3c3e6	0xca209063	0xaff0b983	0xf411f71f
-	0x0f2ca724	0xa6fb0fb6	0xfa663640	0xe40fe20e
-	0xf8e2a5cc	0x1a0e8862	0x11de13a4	0xc811e4a7
-	0xfe6fa8e6	0xfefce644	0x8f7fcde9	0x94477c62
-	0xec9b942f	0xfda6b166	0x91330c4d	0xd059d679
-	0x96b0f7a1	0x22df13ce	0x3f36c3e9	0xc814e342
-	0x7b7dce7c	0x1000640a	0x8cbe7a56	0x622fa655
-	0x209d82d7	0x55668514	0x1534f8af	0xc2b7dc1f
-	0xd89da0dc	0x3ddfe751	0x0532dfe4	0xd39c360c
-	0x090f91d6	0x48587117	0x8ee383fe	0xf5ffdee4
-	0xd8bca448	0xd26d6d82	0xe8adcc12	0x8b14b8c1
-	0x7f872f36	0xb8cb0e16	0x76d60c06	0xf62ddbec
-	0x3ec7c151	0xe418a789	0x920a3bf8	0xc5b62e09
-	0x4974ea7e	0x0d8d7962	0x5bbb246a	0x37183d1c
-	0xf25c63dd	0xb15730a5	0x903e3400	0xdab426eb
-	0x0323289f	0x9bc16f49	0x2dfd02a1	0x3ab916a1
-	0xcb6f770a	0x342021b2	0xf9f5c9c0	0x9c8d53a5
-	0x3d53f39b	0x8e693c58	0xebecc732	0xbf30c538
-	0x96648d11	0x60f62751	0x29745559	0x8e365fb3
-	0x7d0b1179	0xea5abbb2	0xe45c4af0	0x53056b1d
-	0xac7b03dd	0x7015c355	0xf17f8dfd	0xe1ace271
-	0x9abacdc0	0x5ccedc75	0x478c717d	0xc01dfdad
-	0x26fb551f	0x73e61f00	0x8bc0b111	0xb6855743
-	0x28690dc2	0xf13b6766	0xc098861c	0x5c0ffa55
-	0x271e7d0c	0x66b47b80	0x9921a158	0xd9c560d0
-	0xb29b6ee7	0x50a9bc97	0xbec4d91e	0xdb2c1fcc
-	0xdf215786	0x1541e380	0x59cae516	0x2342b2ee
-	0x8088cd9b	0x7312579d	0xb17be14a	0xa1638c41
-	0x805c6b18	0xb8a56151	0x56f0a6da	0x96b114d2
-	0x0845ea7c	0x23e8f7eb	0x4e88e7ce	0x84640f2c
-	0xacf8eebe	0x4039725a	0x49bf9982	0xfbcfcbd9
-	0xfbbfb1c1	0x8041659b	0x5b8ee4f3	0x1b6d7a38
-	0xeb634fc4	0xbf818ab6	0x8076c921	0xc50be762
-	0x24c43f4b	0x3252acca	0xa7528630	0x9885b151
-	0x9154b37f	0xfd9d3ab1	0x4f93c117	0x578fba44
-	0xa56851fc	0x9d8083de	0x769f6fb4	0xd89fec27
-	0x747c8071	0xe6b2b747	0x8196e2a8	0x3ed6c699
-	0x8716f1df	0x65325e96	0xfbc715d5	0xb06f9171
-	0x7aa9cbdd	0x84bda56b	0xdeab06ee	0x80432d8b
-	0xd76f0a57	0xe0ed5f9a	0x70f991a2	0xf1a9e557
-	0xcbecbcdd	0xcf0d91fc	0x6751fd67	0x590f206a
-	0xa26d8130	0x1df02179	0x826303ce	0x6cd58190
-	0x1219d005	0x4bb2f3b2	0x0dbd8193	0xd8d8f582
-	0xa5867eed	0x2d6b8ec9	0x5f85ec18	0x7983775a
-	0x214ca0c1	0x9af3febb	0x213d6568	0x2f8e8c43
-	0x92add018	0x6e33e00f	0x6fa6834f	0xc3c2cbbc
-	0x1c65c8c5	0x1827f812	0x868d3a09	0xdac83ade
-	0x57623da5	0x5ff83257	0x0992e621	0x25cc9ca9
-	0x10580130	0xff2ae8fe	0x40a58253	0xffdc24d5
-	0x3e4dbe68	0x291b11f7	0xb3594b9a	0x570c7b6d
-	0x38d31bd4	0x7155ba24	0x84d56490	0xd98842d5
-	0xe037d2f6	0xdd2ba821	0xbeb861d5	0x0fda5758
-	0x5921c665	0x98c7676d	0x8eee487b	0xac0f2411
-	0xb332d321	0xa0816c65	0x76edde5c	0xab868b36
-	0x3f8da4fd	0x516af4e7	0xabf748a8	0xbe7820fc
-	0xbf763827	0xa03a3566	0x8a63e804	0xb4f8f901
-	0x5d262ee9	0xaf905cf5	0x896d0c94	0x5f992cab
-	0x81c2faf9	0xda3c686a	0xb01a06dc	0x45ef0c90
-	0xf2ca525f	0x0e74fe18	0x36ecdb11	0x494125d2
-	0x226b4aab	0x3e92ae29	0x5bb48774	0xc2c2ef90
-	0xa9e77d5a	0x409db546	0x7728f003	0x72229503
-	0x2e8febab	0x8322cfbc	0x5eaf74e9	0x621837f8
-	0xc70668d1	0xb25c1325	0xd741c010	0xf52e3166
-	0x71ef7a87	0x74cc93a4	0x7c25ecf4	0xb8b8e20f
-	0x3658c239	0xbc58fba7	0xf13ec858	0x9271b2a1
-	0x37084dd5	0x6fc92e82	0x44a6abe6	0x92b9238a
-	0x9ad3a57e	0xd75daf92	0x8ea573d6	0x69ce1fb6
-	0xe80df5f2	0xcc1c6ae7	0x6d565a77	0x6981ae63
-	0x18af1922	0x6e8a7af8	0x10716aa0	0xa7da9970
-	0x1abbc7cd	0x114f814a	0x4ebb0c07	0xc8fe6a69
-	0x93d7bc2e	0x0a16181c	0x0379c950	0x4b2e8c18
-	0x670b83f8	0x82a75eda	0x6eb772dd	0x42cfe197
-	0xd91ec29c	0x29fb4812	0xab693ead	0xb2f25a1c
-	0x0b9df6cf	0xb7a1aba2	0x1d7d90bf	0x7de14655
-	0x649965f6	0x11fbe065	0xa54ac5a3	0x418bd3df
-	0x4223c00f	0x7bfcf9ae	0xbd979739	0x6a2ee697
-	0x54e7d9c8	0x73803bdb	0x06654716	0x72225136
-	0xfaef3873	0x0b4b40dd	0xd3b98b57	0xc56cbab5
-	0x32174c47	0x4d4d8c32	0xd6f1bf93	0xeefb6950
-	0xb84ed0da	0x590723d4	0x2d006f09	0xc4bc139c
-	0x55434982	0x8734189f	0x0e314a50	0x94340d09
-	0x021c24a4	0x0b0f022d	0xa61f9025	0x71eb72b6
-	0x744ccea1	0x2030b859	0x78203d74	0x0b8a8389
-	0xd5211777	0x2609edfc	0x6134eede	0xec74584f
-	0x0bdb2d06	0xb1768f76	0x56221895	0xfc49bdae
-	0xbcc6e6ed	0xfeb19c0c	0x18652996	0xaa1a0164
-	0x3ffdcb94	0x2dc1b090	0xb68bf220	0xc33b967d
-	0xc907a1aa	0xa3968cb1	0xb3cc65e5	0x33e2b077
-	0x2bb22904	0xe0fe8fc2	0x4affcc46	0x6b0f0bbc
-	0x5d1bef41	0x2de11c7f	0xb0d864ee	0x6e96d8dd
-	0x59c1c108	0xb2544572	0xab3400af	0x604aefcd
-	0x81be22c3	0x6741e6ca	0x3a93dc1c	0x7b10e639
-	0x0add7a92	0x39fc1df3	0x884f150b	0xd666a96d
-	0x87da0c1a	0xf0f73c15	0xc0c00957	0x011ba61d
-	0xa77e9463	0x96020e4e	0x92416e99	0x881e89c4
-	0x46981327	0x3bc624f4	0x57f226f5	0xac340cd8
-	0x3ce239b2	0xec6b33bc	0xa9123e11	0x70640b6b
-	0xc30f59f0	0x411576fe	0x5ab12c3b	0x3cc20b85
-	0x924b3be2	0xd1fc7a28	0xa4b0cf7a	0x88098404
-	0xbbd331e3	0xff2b6047	0x2a1ab042	0xdf220849
-	0xaf774ae3	0x5a8da79d	0xf18450c8	0x8e6e235f
-	0x1dd3c039	0x1a867ae2	0xe4ccd1f4	0x50dd3f39
-	0x8be186ba	0xc7e30fe2	0x17552d4d	0xffac16e4
-	0x4094bbc4	0xc18a2513	0x650e707f	0x8ecdbba2
-	0xf53e8e7d	0x047dbce2	0x7fc2a89f	0x07628f94
-	0x2a8bfc67	0x0d738727	0x7b5c2fd4	0x2c89d27f
-	0x47f37a64	0xc63debc9	0x15d6c414	0x242c300a
-	0x645d95ab	0x29e1a49d	0xaf77fab1	0x643b4cd5
-	0x3e0f63db	0x4f7cc43a	0x33d6797b	0x497d4332
-	0x7160786f	0xe0c5b75d	0xfb08ecb2	0x26063065
-	0x9835bf7c	0xf5465591	0x63155d2d	0x14babba1
-	0x384a0879	0x460db3b1	0xcd37760b	0xad675a77
-	0xf1dceded	0x69df690a	0x44c6f456	0x87d6a7a4
-	0x4e0d6504	0xf967f55f	0xca9bb20d	0xd5eb41f6
-	0xa9aa9b2a	0xa907387b	0x965b6f23	0xdcd47eb5
-	0x43b5b1a0	0xec876728	0xee7339e8	0x10c5ee16
-	0x1bd8c0bb	0x7235ae07	0x063e3564	0x388d0bb5
-	0x80f9a9f6	0xaf96f714	0x6895c899	0x00ad21bd
-	0xee67961b	0x873781a9	0x22cf435a	0xee90cf3e
-	0xc9a4fadd	0x9bc1af4c	0x35c0e803	0x211ce71a
-	0xb9af86bb	0x97828ab5	0x9dbd002a	0x1cc981c7
-	0xefb36876	0xea739a75	0x5d5abcc1	0xd42260f2
-	0x95083e0a	0x31fb0b51	0xf243ab8f	0x628b1913
-	0xe74eb210	0x620b7d9f	0xc81666d2	0xc8fd1ce1
-	0xf054bd9e	0x78ba7618	0xe1df4e38	0x5e381b3a
-	0xcc68da1b	0xb3ce70ac	0x7ecda229	0xf8778140
-	0xae823fa1	0x12af1708	0xc9373879	0x1e687d29
-	0x96062069	0xf1bfde2b	0x999ff6c0	0x8cbeddf0
-	0xc825a2bb	0x78106bbb	0x87a964fc	0xb358ec2f
-	0x4d959300	0x0fe9706a	0xabb1d003	0x72b65294
-	0x43816b1f	0x6c83b958	0x5549567c	0xb474aa55
-	0x98851640	0x751a670f	0x25900026	0x2ab174e3
-	0x1952c3dd	0x38b47c29	0x32c0af52	0x460c8fad
-	0x85a1004e	0x8cbddcd7	0x66578310	0x4904dcfb
-	0x04b7a746	0x00c91fb7	0xb1ab2edb	0xd0178ae2
-	0xc4b8b57e	0x981d4753	0xfdd8939a	0xa8a05055
-	0x47c8c30e	0x0fab4f6b	0x6ea54079	0x23dc4151
-	0xc23e83aa	0x2ed2ce8a	0xff95b763	0x08df1d51
-	0xd16d104e	0x0fa3ee3b	0xdcfe8541	0xa0622490
-	0x085e5c0f	0xd9bc007b	0x24794e89	0xce341d16
-	0xf090a98c	0x317150a2	0xcc036257	0x3296722d
-	0x9c8d4f58	0x7ca5f53b	0xb0e4f9d4	0x1f178bbe
-	0xc0dcde7c	0x18551596	0x0507b8e2	0x3c40a8ca
-	0xc632f82b	0x5d1965f9	0x92a00465	0x13a8ca32
-	0xc0b6756f	0x669d706c	0x58056b22	0xaa25fd37
-	0x128b731c	0xb141ed31	0x0a8d3ddf	0x48b63bd1
-	0xd24c5c4e	0x0ccd96b8	0x4b1ff726	0x309be62b
-	0x26002e68	0x436f2bd0	0xacb62068	0xce098f50
-	0x330e6160	0x434da66d	0xce14054a	0x0a877e41
-	0x705eb2fb	0x8433fc7e	0xc1bd475b	0xb550de6d
-	0xf4faf808	0x9f9b6ebe	0x0ff98ef7	0xace2766f
-	0x01cc9606	0xd9654327	0x3544cf5b	0xbffbcd80
-	0xb4a5948f	0xcded4d04	0x69ef5a24	0xf5ae46de
-	0xe2139499	0x549f82bf	0x2cdfc6b7	0x5fdd2462
-	0x63c68a37	0x8bce0d04	0x9c66ae30	0x9fd94951
-	0x5774366d	0xd671675a	0x5582f253	0x436c5b6b
-	0xfc151e77	0x1974df45	0x5ea9eac2	0x30689b8a
-	0x9806681a	0xb74d3ec8	0x4f207181	0x668b4951
-	0xb06514b2	0xeccffed1	0x16188ff2	0x5914d385
-	0xed4b7023	0xfb0640e8	0x179adcda	0x6e806687
-	0xb4f0ac07	0x35813615	0x143e66b4	0x1b012a50
-	0x384f31c5	0x1500dbca	0x06e47afe	0xa8a17374
-	0x9d0f5c57	0x4574db82	0x91b3680e	0x794683a7
-	0x30c25d5d	0xf8748c08	0x2e601dfc	0x553152f7
-	0xec5d489a	0x4bd37616	0xdc04dc7b	0xf0a35ba2
-	0xb36975db	0xbfe6f98a	0x6d744996	0x5507380b
-	0x4191e01a	0x0092c384	0xcf3a4388	0x6b0e89c7
-	0xded7b820	0x1fbd6bba	0x3af210b1	0xfc4a608e
-	0xa920eb22	0x22db2d65	0x7d6f0447	0x090f3679
-	0xc4c759cd	0x9758aac6	0xa63251a9	0x47b7a974
-	0x65421071	0xdca8495e	0x96f879d7	0x1d22ea6f
-	0x46dd72ba	0xe0c59ccc	0x15737309	0x6d945f11
-	0xbcb15c8a	0xb11ef0b9	0xe2072633	0xccbd61dc
-	0xfcb51c44	0xd2315c65	0x3087a6f8	0x5609ee34
-	0x94c7f951	0x0a057b31	0x6e6f2733	0x179facec
-	0x36c005b9	0x60184919	0x50b3db1f	0x7a827d7f
-	0x88755ecc	0x3fb0d6c3	0x63b150d4	0xe2ec3004
-	0xe0ee30f1	0x118d7040	0x2f4689e7	0xa78be0be
-	0x3c9bb853	0x75c326cc	0x84097407	0xb0107b5e
-	0x83a56a91	0x14e60445	0x0fa72553	0x1385e6ce
-	0x9b8bbdcd	0xe6aa6a9b	0xc2072ccc	0xee916592
-	0xe44082e1	0x43dbf6d8	0x09f821fc	0xdc84b023
-	0x0e6a518b	0x945fb180	0x185d0841	0x9ece88f8
-	0x844558c2	0xed85f422	0xeceb983c	0x6db16826
-	0x7612b243	0xee3bf226	0xb8eebb7b	0x22e16615
-	0xc892bb7a	0xdc475a47	0xae390e93	0xe00baa1b
-	0x725fca23	0xbb868b3a	0x17c62a69	0xeccd3731
-	0xbe1a4223	0x05c8fd7e	0xa8354afa	0xbbb09f8c
-	0x31a77e83	0x01f17a68	0x5f37c847	0xa0fdd7db
-	0x9f8da870	0x98f02167	0x1e966884	0x00e19b81
-	0x50c91add	0x6aba2a55	0x60be9575	0x3da40b37
-	0xde13ff4d	0x5b7a79ec	0x4700ffd9	0xfee5ea61
-	0xaf4d1d1e	0xfccb6f04	0xcf5076d2	0x48c4c98a
-	0xd6a8915e	0xe4a58522	0x6bf3a6a9	0x4e7c2f15
-	0xcd7e8d2f	0x843b56b1	0xa35f1a5d	0x1ca226dc
-	0x917fb163	0x44751f0a	0xd96fa8aa	0x5028dccc
-	0x7792dd96	0x2a9d749d	0xe48385fb	0xde111e91
-	0x805e6581	0x3d9b9fad	0x5b750544	0x03785b71
-	0x9b583214	0x80022658	0xcf1f3730	0xa1be7be7
-	0x6c1e26f2	0x26de584b	0xb4fc8e35	0x072b520b
-	0x55db3ac9	0x81e9d490	0x4b5ea53e	0xd5628e00
-	0x71bfcac3	0x79956bbf	0x275fab80	0x2ad497ed
-	0x423854b2	0x686451ad	0xfd59d64e	0x9f2049d7
-	0xcb0f8f32	0x74d7545d	0x4f9c1df8	0x6fbf0afa
-	0x7ef06915	0xc5117549	0xf20088b4	0x731a5ccf
-	0xe78bbe74	0xdcb4996e	0x7062a6f1	0xa624b59a
-	0x7b2d5e41	0xc1065234	0xa7c32078	0x367e7134
-	0x86f55f58	0x3084ee83	0x0c599d1f	0x69380e2e
-	0xe59482b3	0x7096432e	0x81124388	0x5be8d01e
-	0xeb25ec24	0x8b47e9ad	0x432216fd	0xdc496dea
-	0xcb05fefe	0xe76eb9ab	0x8ed568d2	0xfa963d68
-	0x70ed6f4e	0xb2b88d58	0x15fc42bb	0xe992ec48
-	0x359856b3	0x4a0f7741	0x3f0b6eca	0x07c16950
-	0xcb9dae59	0x209570c2	0xf196555d	0xbf7c0a0f
-	0x4a814210	0xf8f206c7	0x8bbb0763	0x360fa596
-	0x13d46195	0x901170e8	0x6dc2e376	0xbfa00989
-	0xd12cab90	0xf4f4699d	0xbc88b362	0x4827dbd5
-	0x7cde5cf5	0xe45dff5e	0x2d661b05	0x8902d99e
-	0x6c9f3584	0x0db3f864	0x1132773f	0x3e944120
-	0x27058ae1	0xef978864	0xe58eff42	0x020ae503
-	0x77fe075b	0x9c577e08	0x210b42b9	0xcb8160c0
-	0x09f99f36	0x6a0b6bee	0x6f18b0ef	0x5452ee3f
-	0x6c8c4a4d	0x480cb803	0x892f3973	0x066dbb63
-	0xf7f845c8	0x7ceeee7e	0x7c26c5ce	0xec89119a
-	0xc64bdc20	0xf46e4324	0xff34c833	0x555b4b3c
-	0x23ff2701	0x52360759	0xf60acad8	0x241ccb7b
-	0x29e14901	0xcc068e2b	0xedd0ee02	0xc33a425d
-	0x7d889b28	0x88577f8d	0xaaf614b1	0x8e8c8eb5
-	0x81a363f8	0x29f5bcc6	0x08aeb8e9	0x6f9ee222
-	0x1c50045b	0x792c9434	0x62bc2601	0xc9289175
-	0x374fc38c	0xbae91a86	0x3268e89b	0x5b008f10
-	0x0ea6b759	0x9d43ce10	0x09b30dd2	0x643e2b94
-	0x5c19bafb	0x29515176	0x56a81f95	0x60a80534
-	0x22fa0a73	0x1259cf8d	0x323fa5b3	0x6322f1d0
-	0x30581c47	0x50458048	0xd711c1b6	0x4a34236e
-	0xb60a2e40	0x58df96c9	0x947b90d7	0xd327d664
-	0x5fe528db	0xf6d9c575	0xb0a251b9	0xed961301
-	0x2fee3cf9	0xb687e226	0x78fc46c2	0x29e9fef4
-	0x84bff086	0xd0482ed1	0x018996f1	0xb8b9cdf8
-	0x20885e68	0xa6f848e2	0xfddabc3e	0x5c9a7f67
-	0x7cbc3e40	0x5197ebe2	0x41a15775	0x8024fd2a
-	0x7864106f	0x7cfaf482	0x27798720	0x4956355f
-	0x30f7195e	0x6ea09dd6	0x6f2b5f3c	0xf38df38e
-	0xcae7e8cb	0xf8a80b0b	0xbeb227ba	0xbbfa2428
-	0xbbba3ab6	0xbf83edbc	0x2cdcaa9b	0x2b0841a7
-	0x79d52e5e	0x40260460	0xb27709be	0x07e3bf6a
-	0xbdccc2b9	0x369d0069	0x9d745e50	0xff251486
-	0x1e14957f	0xf7253467	0x9a31eeb9	0x4d77108a
-	0x44fefc47	0xd02d4082	0x232e3fc1	0xce39396b
-	0xd7a13714	0x2bd57e7e	0x00876803	0xee73377e
-	0x78bb6240	0x2ae63c46	0x11e009d2	0x922539cd
-	0xf3bef05a	0xf0c664c3	0x6e132a0b	0xb0c5bddd
-	0x40c66494	0xd7d0d02a	0xa73110d0	0x4b409d78
-	0x6f49bf88	0xcfc9d22e	0x4836da89	0xde5a80be
-	0xb9c8bdb3	0xe99b2e9d	0xf1b05e68	0x8ab599fc
-	0x22675035	0x3c8480c0	0xfa3cd457	0xba617098
-	0x422eca1c	0x0cdc0d01	0x4779b95e	0xccfa0bfa
-	0xd22674a4	0x76462be6	0x3015ab3b	0x7891688e
-	0x1c83bf8b	0xaa55839a	0x7a71a83f	0xad451c1b
-	0xf8b8bf06	0xc75a91be	0xcac50366	0x87e365ae
-	0x9013ac11	0xe9cec5a5	0xef4d88f5	0x15c27162
-	0x3dcaf8ae	0xe023891b	0x7b6f1706	0x2f1198e4
-	0x048e34ba	0xb647b5e8	0xa1826caa	0xed3bc134
-	0x43b14d28	0xf0c49b54	0x1a6362d4	0xc77fa378
-	0x3bb12e79	0xcba4cd2b	0x620f2476	0x7729add6
-	0x9876c439	0x5f7d8795	0x858f7ac8	0x68b94589
-	0x1321d70b	0x5353a2fc	0x912a5ea4	0x390cf0f5
-	0x37320473	0x51b3cacf	0xe45046d2	0x9188dcc5
-	0xb3713b54	0xc9b936e3	0xe9f24574	0x5977a68c
-	0xc23c56bd	0xcfc39ca9	0xc891b8d0	0x3683ef22
-	0xc1ce304a	0x3ebf1ce1	0x52cd1cc0	0x3777d973
-	0xde614072	0xf2efe226	0xbe1f9f9b	0x92a1896b
-	0x9ca62763	0xcf5703be	0xa6d9c56a	0x185260d6
-	0xd9e3b86f	0x5c47180b	0x71a7a219	0xe9974375
-	0xf22af4d3	0xfbc92962	0x968c3fe4	0xc584b60e
-	0xb9abee26	0x7e9737d8	0x5947da83	0x2f8ccad0
-	0x7b4ee942	0x51ad62dc	0xf517400c	0xe2bf9e37
-	0x63057e05	0xe1bfabf8	0xbf118805	0xc038de9c
-	0x7aa57b7b	0x05584eff	0xb15ea286	0x26c6a6c0
-	0x8e1392e8	0x7dbf22e1	0x3546f5bd	0x0f84ed9b
-	0x0b01da4d	0x6dc47417	0xadc6f687	0x4160c045
-	0xdc26765f	0x63b70c6e	0x8f177107	0x6a5f13cd
-	0xb56fce56	0x5d1f5ed1	0x62f6a18e	0xf7235691
-	0x222fa999	0xd48b1435	0xe597d406	0x8dacf828
-	0x694ecd8c	0xe5283c02	0x60bcdcd3	0xfb9eb384
-	0x9895492c	0xd38172dd	0xe7b6dff6	0x0ead5894
-	0x910e2675	0x97d9ee09	0x270b2d8a	0xd03e25e0
-	0x9e7bbb69	0x57ab1d31	0xf2e7a13d	0x9c8e5baf
-	0x65fa03f4	0xc66bcbfc	0xf2d8bfe1	0x23059412
-	0xa3ae7654	0x3a4734a3	0x32c0a8d3	0x4e007b8a
-	0x5ce30660	0xbd10c57c	0x5365f540	0xeaed3002
-	0xc377d84d	0x87097a59	0x929edec9	0x5878368b
-	0xbd450478	0xc3fab275	0x128fdced	0xb706fbb5
-	0x146f1d41	0x86782651	0xa530ca29	0xa3e1b6be
-	0x25390048	0x572b4a05	0x8c9b4c90	0xb05428cd
-	0x33fabab5	0xd16e513e	0x1d6cc812	0x4d80a6ed
-	0xd6a5a07e	0xc0ee4c19	0x544b75d1	0x3f887360
-	0xb2f46d1d	0x21609cbd	0xe340211d	0xe9202fb6
-	0x3023b005	0x3341ead9	0x76c99537	0xc9d76547
-	0xfb736c3f	0xf6385346	0x93fe2a05	0x92de6df5
-	0x7793acd1	0x68249b3e	0xc22cae3b	0x668988e0
-	0xdc1ea28c	0x7ef72b95	0x974098f9	0xb214701c
-	0xc2de7d98	0xeb1d443e	0x5975f0ec	0x21d67037
-	0x721e8e99	0x42105562	0x74b1e821	0x20193b2c
-	0x743a7bb3	0x24643c9c	0x240b331c	0xdf125e2e
-	0xcb4b0205	0x19edb174	0x505eb85c	0x1830bf22
-	0x6bf7a528	0x86a7281d	0xfee3488d	0x6c26f4ab
-	0xbff4ce7a	0xff7cfaf1	0x5df6fd66	0x523f0802
-	0xf8a87595	0x463b5c19	0x72c564fd	0x2e4797d6
-	0x1f04a1af	0x0be96baf	0x44552094	0x2a158f50
-	0x83dac587	0xad4c881d	0x3178e710	0xe938d1be
-	0xab715a65	0xc34b451e	0x1942832e	0x91557ecb
-	0xdaf0606d	0xa64623d9	0x84e11fbb	0xa9c9d11b
-	0x577a15b1	0xd49a2f23	0x6f204e0b	0x0a6e6a2f
-	0xdaf13637	0x6b4ef557	0xdcaac9a3	0xad97c404
-	0x8471691a	0x50ca3cf5	0xde57c446	0x70aa02f1
-	0x84baa6de	0x0232bc79	0xa06427af	0xd2ce56be
-	0x5da13949	0x254f5f4c	0x3fc3fd02	0x00b5f8eb
-	0x54a0d4b8	0x5e3ec3b1	0xc6718376	0x5acce6d8
-	0x614c56e0	0x89a6b00e	0x6cb4e087	0xa9822fe9
-	0xdea290c6	0xb294582f	0x36f9640e	0x30d0afc4
-	0xef7d75b9	0xfd9aae2d	0xd6729573	0xac442321
-	0x158224fc	0xfd6632df	0x10cebf98	0xc3864dd8
-	0x31577c58	0x49e71f9c	0xb96d876c	0xd867604e
-	0xba74c3f0	0xad69752f	0x716eb51a	0x469d9d03
-	0xda4b2e16	0x9e80a908	0x9bcb18e8	0x2f1c595a
-	0xe823ecfa	0xdfd5badc	0xe460e9e0	0xae418438
-	0x457811b4	0x29df713a	0xd90b0d29	0x415ba2de
-	0xa0af6489	0x4922a50e	0x2efa0b0b	0x9394e4cc
-	0x0ef8f59b	0x0f851711	0xa4670f3b	0xcc6bbfc6
-	0xae194dfe	0x78e51752	0x4c65a2d2	0x1b0741cd
-	0xc9f401c0	0x4a678062	0x290d2bc5	0x1a4279c4
-	0xb5f9160f	0x40ef7c77	0xa9bcfba9	0xaec75f21
-	0x53d6258e	0x8587eb74	0x0721d492	0x2c6a6e2d
-	0x8e6cb70e	0xa6bee309	0x6faf5706	0xf8eee239
-	0x52c85943	0x8c198893	0x3db37858	0x557fbf2e
-	0x92f1a0e5	0xbd279594	0x46d65132	0x90a2c32a
-	0xd11db660	0xc73b3922	0x9d1075ff	0xdb80a1cb
-	0x54158743	0x39694d0a	0x4a0ddc7c	0x721f9dc9
-	0x04b1b044	0x3bb40aed	0x6be7a88a	0x429a3b09
-	0xa6e9dfa8	0xba412f0c	0x354f08d2	0xa4569516
-	0x928cca34	0x398b1a99	0xb7e80291	0xe67d7b71
-	0xa6582bf0	0x556ebb23	0xdc6d9f6a	0x11b3b753
-	0xbdf31ae5	0xd3399560	0x6148cec8	0x5188689e
-	0xde18f46b	0x3da414ad	0x4c44ad29	0x68582541
-	0x75c8b1e6	0x7ba572de	0xd753ed20	0x4a9c4578
-	0xf1c9159d	0xcfd9da31	0x46799fbe	0x1aee4426
-	0xdcdf7b57	0x327db61b	0xa160ea1c	0x84a01fc2
-	0xbe0aa020	0x5963688b	0x24f32751	0x885b4177
-	0x26cde88c	0x39e6df90	0x1c7fee90	0x882a5c0c
-	0x56f1f2e0	0x10bb9f52	0x4f0502aa	0xeae6e5b9
-	0x65e7ee25	0x8ed230ac	0x38b5e02c	0x5f5311f7
-	0x929491c0	0xdd923e62	0x5bc6166e	0xa3c89f4e
-	0x5844fb12	0x0c40f02f	0xdda07582	0x8ca1b803
-	0x9398b0d0	0x4dba17f9	0xb9879c85	0x26956147
-	0x3c26a130	0x58cdc52b	0x21fa4801	0x9d965ce6
-	0xb9942dac	0xd83d1518	0x36e630dc	0x50bb2822
-	0xcd472a65	0x6feee2f4	0x4853b680	0x7f54945f
-	0xa522c561	0x28134f6a	0x89b46cb2	0x4fe0047e
-	0xad602b28	0x4942494f	0x1536ea37	0x40ea6278
-	0x5020bdb1	0xad3c9f7e	0x1356d0ce	0x411700c8
-	0x1ba61954	0x65dece8c	0xb788efb9	0x26efcd5e
-	0x9833fa21	0xea0052b8	0x119a994f	0xa71b168b
-	0x164a96e0	0x0bd1b4e9	0xaae1e562	0xb550f48c
-	0x3a3b55e1	0x4d921246	0xcb28af65	0xdd2388ff
-	0xa63988c3	0x7dfa5a8b	0xc7c44102	0xc75e9f3a
-	0x5e4305db	0xacb34d1c	0x9b50976b	0xad3f6379
-	0x6cd20ee3	0xba806f21	0xcd0fcf4a	0x18a55973
-	0xbafe5266	0x03ee9b8c	0xa35fbfde	0x7f2eb71b
-	0x23d9aa11	0x0e183c35	0xefb0ae3e	0xc6093786
-	0x5b380af5	0x64838229	0x3bd69926	0xe9758e1d
-	0xde439e4a	0x0cbc4bdd	0xda5858e8	0xbe8afc07
-	0x676379e1	0xccc4c628	0x763e3b38	0xb4823c67
-	0x9f4aa538	0xd8d33f50	0x41291e48	0xaed28ade
-	0x6c72eea8	0xa751f4e8	0x3a75dba2	0x5073e3bd
-	0xf10b4756	0xdf46ab98	0x9ad689f1	0xc2ba74a4
-	0xf2ce9419	0x4cf9732e	0x75cf58ca	0x249e3c52
-	0x95d10a93	0x51120008	0x7438d467	0x0a5e7f2d
-	0xb7a44e46	0xe31e5dee	0x26e2ed14	0x8f16a7d2
-	0xfcda431c	0xab32ada3	0x3a863c94	0x5fe91346
-	0x2a92c590	0xb8c17e6b	0xcaf753fe	0x50283647
-	0x533c8f3c	0x1233e1c1	0x7a5b2eb0	0x79b4ba22
-	0x3164670c	0x201c500d	0xafeac6bf	0x2fbb0884
-	0x915de3b0	0xbf733b7f	0xc45d1a42	0xa3b86d4a
-	0x333ef605	0x6348522a	0xd28d1d19	0xa2cad790
-	0xf8ad449c	0x05aacdcf	0x64500018	0xb1d8cb18
-	0x9e4a2ecc	0x091282c7	0xfd64bcf8	0xe1e7c24d
-	0xfcd0f386	0x0c9faa0e	0xa82f265c	0x83cafc3e
-	0xcad43563	0xc110837c	0x2a2da74f	0xbd98e00b
-	0x5c24553d	0x41c75caa	0xe75cb110	0xa004b946
-	0xd4daa77c	0x88d07273	0x0c75c7eb	0xaf05657a
-	0xbe1f8336	0x122a7acc	0xe0e5c29d	0xd5896217
-	0xfb2f909a	0xa74b6458	0xb33a1a38	0x815f7832
-	0x9584b271	0x9a3bb26e	0x39aa6d36	0x2fba41db
-	0x133797be	0x9993699e	0xdb50268d	0xccd54ff0
-	0xb7a33011	0x71db612b	0xef9a4429	0x7217f1d0
-	0x0ee420ba	0x1f7eb025	0x26572853	0x72712e17
-	0x5bd7be37	0x74b2288e	0x3ffd1f1f	0xed566562
-	0x744f4159	0xdbedb36b	0x69e25131	0x604ccb70
-	0x50d83542	0xe4704ddb	0xdc5144aa	0x33467434
-	0x1c7c4f2b	0xac774e8e	0xce9c4d1b	0xa0e3c7f7
-	0xffbecc1c	0xa1c25fb2	0x0e9f6039	0xbe9ed6d0
-	0xf958fb6a	0xaec3fba8	0x2944e767	0x77dc717e
-	0x06e9fe1d	0xaf3a4928	0x7d4f3f29	0xead3972b
-	0x65670bc4	0xd058cc70	0x9fb58c45	0xf5f08926
-	0x9aed1955	0xb1a5d161	0x14b5aa11	0x66e14cee
-	0x28d7aae3	0xae45fcec	0x92dc7dc3	0xe9eda97f
-	0xbee84f22	0xea6f71ac	0x6347c2b8	0xe919afff
-	0x2c409d7c	0xa9800c52	0xd8033a17	0xc3794565
-	0xb5311fe8	0x80d8a030	0xf9cf179a	0x508ea242
-	0x4464cd33	0x91da91a8	0x6c0806cd	0xb5473d09
-	0x0a0b99b3	0xdaf528eb	0xca1e99e7	0x064055ef
-	0xc2dce623	0x0b4c15ac	0x23c13327	0x3f9fc266
-	0x335d9c40	0xaca940c2	0xc18c0797	0xd5027a07
-	0xb0a4d322	0x2e601275	0x6cc88888	0x658eaf8d
-	0x509e2247	0xbae254d6	0xf097f138	0xa163751e
-	0x19558f7c	0xb66f0cd4	0x87b1d966	0x81dd2cad
-	0xf0c25e6d	0xb8e72dd1	0x00f15f42	0x6d2c1c68
-	0x43c7e436	0x68eedad4	0xc2686b38	0x6ff30211
-	0x197c7734	0x905b8602	0x6ab9d204	0x0d16385c
-	0xb1cb5e16	0x8249a5c4	0x29d1ce0e	0x779f7b63
-	0x63042725	0x12ce98e3	0x11282058	0xca3a9eb2
-	0xdb8294e7	0x423e41ac	0xc3ab2774	0xca658d6d
-	0x519f8896	0xaf6010f0	0xd57a94aa	0xcc17df91
-	0x7d25cf8b	0x041e6835	0xa056d9e0	0xf90f3964
-	0x7f99ae59	0xd80125d7	0x9961d6e5	0x41b3da06
-	0x65c254e4	0x787d2c61	0x16aafb02	0x157ab4a8
-	0xdee3674a	0x1ed1b601	0x2e36dae9	0xad57ad38
-	0xaaf25b15	0xd3c37a01	0x68ca9eba	0x2a1bc480
-	0xba157917	0xc00017c0	0x190bd74a	0xd6c6c1cd
-	0x4efd4f71	0x388ed702	0xc8812950	0xd0019ca4
-	0xd44cc835	0xd838fd6a	0x1432ce88	0xce98d932
-	0xaea21cf4	0x54a44cdf	0xdb4dc5ad	0x1d23a7ae
-	0x5ae126ad	0x100dcb50	0xa9727413	0xcf1c61cc
-	0x72f9d2f8	0x4d32d201	0xe27586a8	0x0a1cc932
-	0x21858469	0xf1cda3f2	0x59703f35	0xbd81f9f4
-	0xad6ac9cc	0x25665703	0x1212d5cc	0x98a243d3
-	0x8f47e113	0xd98feef4	0x3c93e832	0xfd67097a
-	0x0c73fea5	0x6132ec59	0x1dc9bdb7	0x791f79eb
-	0x84d83574	0xbd5817e6	0x7d5a0f8d	0x18482a08
-	0x53ac8e4f	0xadd3378f	0xd48540ac	0x4082f5d2
-	0x3ff5badc	0x24855b3d	0x7bb948f8	0x72637822
-	0x0687e93b	0x61290b4b	0xd9f20b3f	0xcc0e5beb
-	0x141ca01f	0xecd1337b	0x8576ec65	0xb6f825a2
-	0x8b84e8b6	0x5bac53f1	0xd4edd06a	0x76ae712b
-	0xdc00a887	0x798c2ee1	0xe74a5ab5	0x1539fa68
-	0xa30817da	0x06f7c53a	0x1930c59d	0xd4232359
-	0x0dfb1427	0x58d7180b	0x53bf57f9	0x5f001d08
-	0xd08128ed	0x3208b7be	0x5c2aba8c	0x0abbd0d0
-	0x424f2041	0x7982f731	0x010ec811	0xa3489c82
-	0x71ffdfa7	0xda0ed41f	0x8a9e806b	0xfa9bddcb
-	0x7a9e1a41	0x53c7603f	0x9e3df28d	0xd06dd100
-	0x2cc64f4a	0x0dfdccf2	0xb4eb9101	0xf56d506d
-	0xdaeed218	0x45523a16	0x4d6d68ba	0xff9a8f72
-	0x5358b2f1	0x2511a591	0x9ea2c2fb	0x08cafc7d
-	0x7ed34bb1	0x0cf2301e	0x62b6c05d	0xc05095ec
-	0x52128c55	0x030576af	0xef5f37a5	0xdf5ae47a
-	0x39e55496	0xb2c2129e	0xb2d67d77	0xc5adf049
-	0x15a1cb4f	0x981948e5	0x7d18acc0	0xec7abb43
-	0x23f7e366	0xa919a355	0x23872683	0xb7b6d84b
-	0x4767dab1	0xd133feb1	0x2e5536cd	0x587683d4
-	0xa181575c	0x4329e640	0x1244ae40	0x5be82f66
-	0x4b28dc4b	0x4106c9a9	0x517fad7e	0x9e334ca8
-	0x3c3ba741	0xe902a475	0x91d046a8	0x31361f96
-	0x911b83bc	0x6607fac7	0xdfbc6390	0x7213aab0
-	0x8ca8a47a	0x4f3d1f3a	0x3ee76c84	0x22bac3f0
-	0x475f3cab	0x05d05569	0x92b3f912	0xc632a733
-	0xd79b7448	0x595b82fa	0x6013b96e	0x6d03b5eb
-	0xe37045fb	0x6e4add26	0x11f116da	0x4ac8bd3b
-	0xacb5f8a9	0x8fb943d6	0xa9ac31c7	0xf1ba9752
-	0x43a6b29a	0xf123766f	0x536fcc32	0xcf8168ad
-	0xd8fb1e4d	0xb9562fa5	0xfe6d8dea	0xd31ab16c
-	0xf7dfc381	0xb70f11cb	0x371c6688	0xac3fccee
-	0xf130a51b	0xc5b8cad7	0x0cb13762	0x64ae00f2
-	0x45cfad12	0x753d6a4a	0xc6f69472	0x695fba60
-	0x49d1f754	0x9db947f2	0x2364ae20	0x197492e4
-	0xc5b9562e	0x34963cec	0xdc26402a	0xa1c88d01
-	0x58e27195	0x9d60f5c4	0x3e200a43	0x7e9827f2
-	0x0a4feee5	0xd401e139	0x17352152	0xd509564a
-	0x4b3142ed	0xef7567fd	0x9a619dbf	0x56ec2cb7
-	0xc64bb290	0x3d69fd89	0x897325a1	0x74e2cb7c
-	0xf270fdac	0x2beb6a4f	0x5b60de30	0x49df7517
-	0x294966cf	0x87f5f667	0x4a9e1f6a	0xabc332c3
-	0xfaf358aa	0x5baa6cfb	0x36b99bfa	0x40259687
-	0x584539e2	0x2710ce99	0xec1959aa	0x642c8413
-	0xfc005d36	0x2b2e6245	0x0012d041	0x09f6b626
-	0x70fe9e2b	0x3cf30c5c	0x69d0a3ed	0xfe621601
-	0xb6fa9267	0xe9b507dc	0x49f35866	0x4b97647a
-	0x9e721adb	0x89e6e8d6	0x407a2f49	0xd977cbaa
-	0xd9359f5d	0x7b69702d	0x22d6e818	0x57eaa5a3
-	0xdd5063b0	0x4d7d2312	0x7a865203	0xb7f0905f
-	0xdd2c2b87	0x7215803c	0x1abe5307	0x2926f38b
-	0xf6b0cacc	0x96f50647	0xb612feb7	0x6915bfcc
-	0x058b5cb0	0xc39e47d5	0x7513abdd	0x9e43972a
-	0x1e55f640	0x896db1c5	0xd9382d2c	0xa52c1f99
-	0x8afaf5cf	0x36500aa3	0x2e65fa1a	0xbb40d668
-	0x81188e3f	0x143fba69	0x3f61fc90	0x438d759c
-	0x893bb96a	0x069f349f	0xffdc43c7	0x6ebfa943
-	0x671b4751	0x629cec23	0xe717fb9c	0x53fadc0a
-	0xddc1e212	0xb99788ba	0x78378cf8	0x2ed91106
-	0xec1de376	0x98d86b3a	0x312a190f	0x0208a0da
-	0x6dcb469f	0xe6407c6b	0x1c7fea86	0x83841afa
-	0xa9caaffe	0x86e3fd0a	0x918af9b0	0x0fabdf39
-	0xdd9fc8f7	0xf9ddd98f	0x3dd0acce	0x2064360b
-	0x29006620	0x5d7733c2	0x682c4093	0xf038a8b4
-	0x3a688845	0xf9d0b9d2	0x27f51a57	0xb63b063c
-	0x533b082b	0x7f0d0dd1	0x7abdb018	0xea6f6176
-	0x13394ac6	0x825339bb	0x1835fd8d	0xaa46df84
-	0x0751fe4b	0xbc9fb7c7	0x233873ff	0xca200e1c
-	0x668fd5a5	0xda059135	0x2baf8828	0x7a2efc0e
-	0x7c63d98c	0xe71ea373	0x0f218e88	0xa031f88f
-	0xf32bccf3	0xf15eadad	0x6df44be6	0xb2536e4b
-	0x2903a9aa	0x42ef8689	0x444432f2	0xd27a6c4c
-	0x0992a32e	0xaf6e65d2	0xcbefdf23	0xe602151e
-	0x21beace6	0xd9b992b2	0xe43286cb	0xdb315c09
-	0x0de7672d	0x9d518ff0	0x75c4e9a0	0x64b2f70a
-	0x9deb697d	0x5bcf59b8	0x2e4b9a8a	0xd9294b49
-	0x3fee760e	0xfba8fec6	0x1c140305	0xe400487f
-	0xc4cd4a38	0x14e6f1c6	0xdf98e7f8	0xfa6c4992
-	0x62908c82	0x37393196	0xc02464b8	0x4b119742
-	0x83e5e79d	0x15ddd908	0xf75d1820	0x363025b9
-	0xd9e1a04b	0x9e110da7	0xd8caf954	0x30f62bc6
-	0x875fd2b7	0x8b67bc8e	0xd5c77d4c	0x1a8ce00a
-	0x7cfb14dd	0x3a39fd65	0xaecc2b5f	0xb017dbb5
-	0x6a57b4f3	0xa27b6509	0xcdb06076	0x000d6366
-	0x66e4f311	0xf22e25d7	0xf91d9bc5	0x5f9d3a05
-	0x3b37c96c	0xb0596f50	0x53c24ede	0xb620106a
-	0x5e675314	0xd98d5b02	0x75261f6e	0x5610c20f
-	0xedcbe43f	0xbe85b8c2	0x16f7ffb4	0x55eb91fc
-	0x2605ab1b	0x5ad3b426	0x3658d764	0x639c0560
-	0x987249ed	0xdc470fa2	0x0d112f6e	0xd8ab77f7
-	0xaed9455f	0xd9f6a341	0xb9b21249	0x3ff2b69f
-	0x37ad61d4	0xdd6a089f	0x609233f7	0x46a923f4
-	0xe5c23e8b	0x6aff8687	0x5e8ece1e	0xc65e1e4f
-	0xfb96cf51	0x9b697cce	0xb08e02e2	0xf874e0e9
-	0xbc983fa6	0x870375e3	0xc88bcd2b	0xc6bb19ae
-	0xaa0c99e3	0xb301ab7f	0x024ba529	0x4449828a
-	0xd226454a	0x0a610f3a	0xf302a0f4	0x021a3cc2
-	0xa9e4b6ea	0x0b690b92	0x3379c01c	0x36265ea4
-	0x29fbc8a3	0xe6279573	0x3cdb8a1e	0x005b5332
-	0xbab71a8e	0x9677db73	0xa8a6d6ea	0xf0afbd3d
-	0x576fbee6	0x49a54473	0xfa7c6e95	0xcb914daf
-	0x58266856	0xa6b53a63	0x7136515a	0x2a3da411
-	0xb1c994e0	0xbdaecd7b	0x5b436ff8	0x6334ec5f
-	0x0172b5d2	0x57acd652	0xca4efacd	0x87e7d313
-	0x78ac87c8	0xaf7602aa	0x3769ff6e	0x86d39747
-	0xd32a7aa7	0x840cb30c	0x3e7da9b1	0x3c905b44
-	0x90290dd7	0xebc85f3e	0x32693a53	0xc7140058
-	0x6ca5cf6c	0xdabfbc3b	0x3d559486	0xe5ce93b9
-	0x8d3c428a	0x9d18b8ee	0x404f58d3	0x151b4a78
-	0x2f393e9e	0x69c59344	0x7879e974	0xc32217f5
-	0xb946562f	0x1d1b8745	0x3666cd1a	0xc6a1e2ef
-	0xe22d2e5e	0x9e7ed504	0xe6c32118	0xb2919117
-	0xb2bad34c	0xe7177e87	0x47b68328	0xe579fe7b
-	0xd0d33f00	0x96923c90	0x5ff2bf45	0xff074961
-	0x4dce1092	0xe8a89464	0xc0b1ea51	0xd65f0f12
-	0x6b2389bb	0x48fa0960	0x82722b27	0x62625540
-	0xd4ff4985	0x768b7c26	0xb36a4ec6	0xf6a66375
-	0x1c89e246	0xb629fce9	0x6aa72399	0xd783733f
-	0x6478b123	0xa374412c	0x11b5cfc8	0x73cf2286
-	0x443f5601	0xd817fca7	0xb2ce2d63	0xf6c63479
-	0xd16b0550	0xf2a52ac4	0x7843803c	0x1ac3b58b
-	0x7f96b915	0x732403a1	0x64634349	0xd2ec0bf9
-	0x10410c08	0xe95d8dfa	0xaaeb33a5	0x57893eaa
-	0xb59afac2	0xe9fd6dd2	0x50d11a7f	0xde479c58
-	0x9dac27dc	0xebba7d8b	0x17fa1420	0x74a1678c
-	0x71ccdaa3	0x5e44b0bb	0x5927a75a	0x7b7580a8
-	0x33330c9a	0x40192652	0xba6308de	0xecc81fbe
-	0x41d48824	0x6ce4e0c7	0x145e9225	0xf8484bee
-	0xc8675611	0x750ec207	0xfa5f5b85	0x618b9f8a
-	0x007cdb05	0x67f98d4b	0x1035f305	0x8d700e9b
-	0x9857a0bf	0x4b774ad8	0x8960c81e	0x344a9462
-	0xee2680d0	0xebb5f6cf	0x7397c9f2	0xcafa01ec
-	0xaf69f3f4	0x0a1699cb	0x90ed82f8	0xc5c8ac04
-	0xe50bd06d	0xf75741c6	0xea52365c	0xd0c03f33
-	0xb5e4e95c	0xebf55379	0x0aae6e4a	0x29f8b91b
-	0xef8ad2b9	0x7bebf2ca	0xb194b728	0x7df7b083
-	0x0ea527c4	0x6d55939f	0xb9242c58	0xb3e1f570
-	0x4fba0507	0x82d7259b	0xb5be7b54	0x0aff6ff9
-	0x88391023	0xfe352956	0x4a6bfb30	0xa00c9644
-	0xc478d534	0x0cdb509d	0x9611713c	0xd7c442be
-	0x8d16889f	0x93abfefe	0x435fa757	0x40d95d3d
-	0x11b7bdce	0xd074874b	0xdce6add2	0x0b652a4e
-	0x595a88e6	0x307a223d	0xb624b9bd	0x855ba51f
-	0xad43c800	0x1fcf6afd	0x4bdd921a	0xd6777384
-	0x8da9f15f	0x5fb03ee2	0x5e6d04e2	0xb33751cf
-	0x55d9d38e	0x41589fad	0x6d311b4a	0x43046a7a
-	0x8d9c7304	0xe25f9788	0x8b459e1b	0xc9a3cfe2
-	0xe6ab721e	0x4de3c89c	0x5c2d2398	0x085d8d69
-	0x4e27ce73	0x1cc1f44e	0x05aeaebe	0x8cedb916
-	0x370b4d46	0x1bc29579	0x33d08b75	0x06b77cff
-	0x155693d7	0x125d3f0b	0xd8714e15	0x3b7427ba
-	0x13f6684d	0x834ee449	0xc5a45189	0xb2ad214c
-	0xa61be586	0x4e4727cd	0x563d1c31	0xd4ba1cc3
-	0xdb08cd16	0x4940a42c	0x43dfd0cc	0x9d43222c
-	0x638a0d11	0xc33d3992	0x98bf11f0	0x1aebf6b5
-	0x1e206582	0x5647f772	0x9255ad74	0x75915665
-	0x0fe7dd12	0x9def740a	0x9361bdf1	0xc1409fc0
-	0xd3bac631	0x7492ee87	0xe1e99dde	0x2fbaf552
-	0xfc24f52c	0xc080882a	0x0a2417c8	0xcea3da70
-	0x4fe34fad	0xb4e55427	0xd5d54d76	0xf36686ba
-	0xd6ab1798	0x1868e364	0xa380f948	0x0eaee02a
-	0xad5a44e8	0xb6d119f4	0x82a43444	0xafad0e68
-	0x595c3ab7	0x385746b3	0x32df6d2a	0x0b01b2de
-	0x51d3d6bc	0x107d8620	0x6d215143	0x29d0e901
-	0xbc57a3ec	0xd584ba34	0x8c244547	0x23d396fa
-	0xffb03cb4	0x8396c1a7	0x3f251905	0x8bc769b3
-	0x68f4696c	0xfc297895	0x9ec65e40	0x22deb20b
-	0x5d1def76	0xa7a095b1	0x3aa6a458	0x6ca11880
-	0xcde44ece	0x62b59f4c	0x067f272d	0x9a5aae97
-	0xc60a8d62	0xeb0f40c9	0x83ebae30	0x07dc9cb0
-	0x05dbdc76	0x0c108eb1	0x314f9247	0x7bfd6072
-	0xf648e1c0	0xae70bd5e	0x7c27b4d1	0xb0cff1c3
-	0x8c2dd93c	0x580a4b19	0xfaa1ee8b	0x4173a23f
-	0x838fa15b	0x2b0fe3c5	0x8059250d	0x659a445d
-	0x2a1c1968	0xbf13412b	0x1a9f915e	0xaf80263d
-	0x24508a66	0xe381d252	0x4e0f55a2	0x7ce1f4fb
-	0xc145da4d	0xbd4b29c3	0x27540ac2	0x23ad4b42
-	0x8e6bcda5	0x20061c20	0x1d3cb3fd	0x5c5498f3
-	0xc468681d	0x4c28ef55	0xf0165c1d	0x2dd6d032
-	0x7e347ccc	0xe04db59c	0x7caa883b	0x1f43df4f
-	0xc300031c	0x85f19e9b	0x22811fa7	0x2622940e
-	0x6299f57b	0x5c106568	0xd7da296e	0xccd36b39
-	0xe349afc0	0xd2c2463e	0xf7f55aef	0x0e0a7e3d
-	0x6b6fc6d1	0x8854098e	0xc87edace	0x8190c437
-	0x333b8ec6	0xe49b3a5b	0x4aecd4e3	0x14cc5f22
-	0xa11faf96	0x3d1cd023	0xae614c70	0x0ab662b4
-	0x908d8082	0x76316cd0	0x3068ec32	0x829b047d
-	0xf08d1b94	0x3b2b33f6	0x03df9ae8	0x40f632d0
-	0x3590085b	0xa33aad24	0x39597da2	0x99415f4e
-	0x7aed6e11	0x61a920ab	0xca851d8b	0x2606f821
-	0xeb7c0e8b	0x8bd6edb1	0x725b39f6	0x3afa6248
-	0x03540044	0xfb118ecf	0x8e18bd5a	0x2a85cc05
-	0x4ecac12f	0xf53a4d25	0x8e3fc6fe	0x32233799
-	0xc7ebb5e6	0x058fdcaa	0xe6db17ed	0x2751405c
-	0xa195a515	0x34410c51	0x4517154e	0xbbb5674f
-	0x28050e40	0x8fd71724	0xbe78711c	0xc1b18693
-	0xd202b9d2	0xdf4e0b62	0x460349da	0x71463aef
-	0xb2fb55d3	0x54a972dd	0x49379f09	0x7a7fdff3
-	0xbd82d4f8	0xd2894393	0xa82bca57	0xe61ca9b4
-	0x9e08e6a0	0x53dffe9d	0xe7ae1c5c	0x65bff365
-	0x7564aef8	0xd94abd3b	0x18d1ba52	0x64a759f0
-	0x65c5dd4f	0x6f9d433a	0x57cb5a25	0xc1862d25
-	0xcf50223f	0x90c2724d	0xf5527605	0xb085f18a
-	0x41e2b17d	0xfb1cabc4	0xd8ab04cc	0x761c2166
-	0x8365afd4	0xc3276657	0x14f64be6	0x5dd779b7
-	0x3b3f1faa	0x358d01e8	0x4c821ddd	0x7ada9f95
-	0x2970bad5	0x3b54a4bd	0x3ca7f039	0xcb67aabc
-	0x3b264655	0x96401a5e	0xa3990376	0x90834685
-	0x8ba56352	0xee98c564	0x4a0534ed	0x7d70fad6
-	0x5d73a1e7	0x23fd8de5	0x39c52296	0xefef1540
-	0x7bc934dc	0xeed157b4	0x898d8bfa	0x5761e88f
-	0x73af2674	0x2fb88d9e	0x28de1281	0x9aa76119
-	0xa3ac21ea	0x28ce635c	0x7596d79a	0xd3295e0b
-	0x7826630d	0xd815ef01	0x27cf2899	0xf3de6a01
-	0xcbb32e58	0x6c57be3c	0x292f819f	0xaa4623d6
-	0xb96ab772	0x90a6f778	0x44b9933b	0xa43e7543
-	0xb9f417b7	0x7a6537a5	0xf36a6da2	0x0a9bb3fb
-	0x177c1f28	0x0512c07f	0xdda55932	0x060dda31
-	0x14465771	0xf3f96780	0xb459e5e3	0x49aaefbd
-	0xb07db15d	0x2ac82807	0x8404060d	0x417d036b
-	0x70946fb1	0xe39e68f5	0x5f9b3035	0xf0335e7f
-	0x2ba457c6	0x2d97ba3a	0xc05156e7	0xbbc9afb2
-	0xd25981ea	0xe70d060b	0x805c231d	0xae471b34
-	0x31964d8d	0x3f34e35a	0x8355ee21	0x73822024
-	0x9ce5f2d6	0xdff19812	0xae55cbaa	0x55f5ecbd
-	0xfe558210	0x09b95751	0x41ee7cb8	0xd2b9fa15
-	0x342c07e5	0x7ee50e8e	0xb6154e01	0xdbf4df3a
-	0xd43e2c77	0xc3ff0498	0xd8106f33	0x9bdb25bd
-	0x40cb843e	0x106b08a9	0x3227ce7b	0x58bb7cb6
-	0xb84e3244	0x3f1d0e20	0x76dcbcfd	0xb750bce7
-	0xa8c11f3f	0x161a8610	0xdc1ef5bd	0x14270b6e
-	0x285e7898	0x68375db6	0x01d23b44	0x35a17fb0
-	0x7c9ad882	0x7bda2e0b	0xca67bfcf	0x6e2dd9ab
-	0x227a6aba	0x5d295397	0x5061f96e	0x47a20c68
-	0xf5427e3d	0x3a0a3165	0x2438fd9c	0x2dc91147
-	0xeabab62a	0xdc358e4d	0x7e1fcc9b	0xdc2a328e
-	0x6e6bf75c	0x68c45517	0x594fe5a7	0x2feac658
-	0x1f0a4d49	0x97575e83	0xcccbdab8	0xc13f3b64
-	0x8bfe659f	0xa4ebf545	0x2c3cf874	0x7d78ceba
-	0x46ac5d6e	0x09309533	0x78ffb6e3	0x7336541e
-	0x3d270f70	0xd71e72b4	0x9772402a	0x4ed185b7
-	0x213da698	0x78a54587	0x18054eb4	0x99179a25
-	0xf758337b	0x94629a30	0xec6bf4e0	0x255ac299
-	0xe56f52b1	0x1c2a6136	0xfb7cc1f6	0x87b53b53
-	0x079ca1f7	0x3a8c340f	0xeb70ef48	0xfd1caae4
-	0x564445e7	0xc1d5c663	0x658fb5fa	0x62d2debe
-	0xc0907042	0xb5402269	0x16965193	0xc038c21f
-	0x780f8b76	0x33ffeb3d	0x03ad9602	0x4a7b6432
-	0x93c2b2f5	0x40720fcd	0xf44c164f	0xcbd43d01
-	0xcf7098cd	0xc43242fa	0xc530a6b3	0xcc33c1f7
-	0xde3d648c	0xf1def13d	0x2a22f5d1	0x77704fc6
-	0x08ed5552	0x3e2295d0	0x00584764	0x6af8585e
-	0x43f845da	0xa92e38df	0xd98c12b4	0xb4fac901
-	0x0b05a079	0xa05f215a	0x27d635c6	0x9fc897e5
-	0x0eb91a30	0x43bdad4c	0x705df05f	0x6b7864b7
-	0x1b6380ba	0x4a64e8ec	0x517b7b68	0x67336d4b
-	0xc6d51eab	0xfac40c57	0xb977cbcd	0x0674e5dc
-	0x74ce2339	0x891cc5f5	0x3230ca78	0xa8a653a0
-	0xa8d4b370	0x496d2f7f	0x6ca677c5	0x54260ac2
-	0x630e1143	0xcbf6f819	0x546b2874	0x02267559
-	0xa2e23914	0x7c9a0393	0x1704bcb3	0x6d680415
-	0x91da300d	0xe2ce21d2	0xc38faf3e	0xcc8be7cb
-	0x14496036	0xc98e253a	0x05ca6582	0x8c566616
-	0xd26204dc	0x3335bd81	0xa94e5af0	0x76fbb455
-	0x23b27f08	0xc4db6f93	0x5cb5401c	0x7cb2ed29
-	0x7cbbad8b	0xfc1e8f5e	0x2bc79e28	0xf69228fe
-	0xbde16357	0xc9ac3b53	0xa6afbc74	0x984bb3f4
-	0x98a8b9d6	0xdd21c848	0x33e65c3a	0xc53c772c
-	0x633022f8	0xa324bd5a	0xd260a77a	0x668ca5d3
-	0x4b79a6b3	0xbfd19bbe	0xca2eb497	0x8e7eb5c9
-	0x169b2184	0x0503d4f6	0x24f35c00	0x0ac930ab
-	0xf694120f	0xcee12db4	0x9305757c	0x798a2db2
-	0xed27ebec	0x2f35829b	0x4294e805	0xa7994ad7
-	0x49fd229c	0x5d63fe52	0xb7cd7641	0x1a68af3b
-	0x6f952e97	0x1c02f4de	0xca3a1515	0xed5bf092
-	0x123c32ea	0x602030aa	0x7811cd1f	0x1b6c38dc
-	0xeb7712b4	0x4aa767e1	0x6b49d384	0x7ba4ee1a
-	0x87f02cd2	0xb8e6b0b1	0x090e9f89	0x95f8b90e
-	0x8d76892c	0x0be06870	0x9ec963c1	0x75d67c9d
-	0xdde23799	0xf9e3be20	0x549442fc	0x09cb0906
-	0x95ee6c4b	0x25a2d9b7	0x98154023	0xdda91829
-	0x0c46879b	0xfbf0e362	0xb7223786	0x7cfbc839
-	0x3b251e5c	0x8be187a6	0xa24f9da6	0xc3192693
-	0x7a8ac8b9	0xc493ca03	0xc736b974	0x369db725
-	0x85a6e92f	0x26dbef75	0xa61a71e9	0x38a08fb9
-	0x4a214ed6	0x57fc6f4b	0x9cf91617	0x322e13fe
-	0x5ac816a3	0x748a9728	0xdc777bd6	0x69fb5335
-	0x258439e8	0xf171a221	0xfa7a07af	0x26447b9f
-	0xadcf3734	0x5af34b97	0xf8b4b0dd	0x08c79517
-	0x28861618	0x64692555	0x19fe9897	0xe3bda02c
-	0x77df51ff	0x93dedf7a	0xc7cb57c4	0x02ee5928
-	0xd4aeb644	0x01d511e6	0x6512bd02	0x5d8f90f8
-	0xe77ccfe0	0xe6ee3ecd	0x5403139e	0x6f7075e5
-	0xb6484511	0x3bd42a35	0x5dcea90c	0x5bb1c6e1
-	0xb69b5847	0xfe106914	0x74442ce9	0x10997c57
-	0x1595af7f	0x9f04a8bb	0xa7d2870e	0x19e57681
-	0x54b276be	0x11c3e3f9	0xc5401783	0x9c413cda
-	0xa6aa9e8d	0x23ff8569	0xf1797ea7	0x86ce3e8e
-	0x9ef0a776	0x56a1c30d	0xf5e18916	0xb11464d1
-	0x7f313c1e	0x49c15cff	0xe2dcfb73	0x637819d8
-	0x2d6ce0e2	0x2170cd43	0xb750902d	0x5eb02cd2
-	0x6cadb7d4	0x89b96f3b	0x8d749ca2	0x8ac7abb7
-	0x31fbdb51	0x7a6df774	0xfb9139f0	0x56f3d9c3
-	0x0f104f2f	0xfaba3c49	0xe53aefff	0x932237d0
-	0x8ee10e80	0xadad6e20	0x19883a1a	0xf45a543b
-	0xd560ff0a	0x8c7b4e03	0xe35696d6	0x9e0ec159
-	0xfc2cbae5	0x6ce2cddc	0x14a72474	0x89757fe3
-	0x6b788e7b	0xc16fa200	0xad36bdf7	0x57bdc4d1
-	0x55146f2b	0xa57db4c5	0x313952e1	0x2c55d0d2
-	0x32ab0208	0x10f846bc	0xdcba1674	0x436485bb
-	0x932704de	0xcd7e2e1c	0x59f78879	0x7ca21395
-	0xbcc07be6	0x2b101e5b	0x38924c37	0xb90928f4
-	0x8f824214	0x55699b67	0x54cba493	0xe71c27a3
-	0xdde01c05	0x48d822fd	0x734ed8fe	0x29dbf298
-	0x9ef3a499	0xfb517934	0x19c8ce8b	0x38b8bf00
-	0x75da50eb	0x237f3b1d	0xa8940707	0xa98a4149
-	0x35ec2d39	0xee862d31	0x36659949	0x8f3dffc2
-	0x70afb227	0x94f443c1	0xb6f9308e	0x0e8ebd54
-	0x92b8960f	0x56d21560	0x8453d1ca	0x74c680c0
-	0x2d706dfc	0xd0b81c18	0xbac65445	0x40a34988
-	0x498145a9	0xf436ae10	0x9b72fec6	0xb4100aed
-	0xe305983c	0x349fe379	0xbf31cfa7	0xba624703
-	0x4a491754	0xf973a686	0xa2ba725c	0xd0a23615
-	0x31903086	0x4ae46e45	0x0f705e05	0x4ea6bbc8
-	0xbf299e43	0x0689709c	0x9fc93571	0x07cbc14f
-	0x542ef992	0x80ce91f1	0xf86014aa	0x17d533d1
-	0xb55e63e2	0xe02e0e4c	0x88a5ed22	0x6302126a
-	0x56b32e90	0x5fec4381	0xe2e98b3f	0x30693509
-	0x862e1d75	0x2da30e3c	0xad992d90	0xc62cae4b
-	0x379c77ba	0x467ea8f1	0x8a820048	0x74cc474e
-	0x6bca3803	0x18aaa3f3	0x1fafd26a	0x0865f360
-	0xe3479d10	0x6cefb2b9	0xf6612730	0x2e0f222a
-	0x749a89e0	0x75b1fa05	0xe2ea0874	0x5d422c20
-	0x24707d46	0x6d475835	0xed1e556e	0x6aa4543e
-	0x28b36c16	0x22d83c4a	0x8c3e6d51	0x42a94c9f
-	0x0c603d0e	0xa8c7f417	0x845997ff	0xdc79494e
-	0xa130d628	0xc2df082a	0xa3a2c27e	0x3f93b00f
-	0x1521a7e5	0xca15bae4	0x57e4e836	0xb915a471
-	0xd9147115	0xad52f80e	0x5fd2a2be	0x15972ed7
-	0xb69ec21c	0x502f2627	0xfb46a1ca	0xea685d34
-	0x9226f7f2	0x4b41927d	0x7965eaa0	0xb702e76f
-	0x79a54721	0x5b8e984a	0x37efcd59	0xfeabf30a
-	0xd4ad7db5	0xbb2282ab	0x8a5c840b	0x2ba370c5
-	0xdef5758d	0xa69a9aa1	0x46082250	0x6e8e8477
-	0xf6280c61	0xf99e4a14	0xcf3c5cbd	0xcce657f0
-	0xca635eae	0x0be182b5	0x58e8b43a	0x5c717ce5
-	0xaa7aaff7	0xc329c6b6	0xf1cc91ef	0x8d7cc520
-	0xda155783	0xd5e2e54c	0xf466f010	0xc5dfac4a
-	0x606ad5de	0xf4992f1a	0x1344c9ce	0x4aea9020
-	0xa30447c7	0x0a99ad18	0xd3caa96c	0xfe5b0b4e
-	0x7b50bbd1	0x33e50575	0xa22d1d06	0x73a1820d
-	0xce4c4c8c	0x2cde7764	0x511d1c26	0xad0cf826
-	0x086dc311	0x3060ef7d	0xe6fdc617	0x3050b179
-	0x1dbb5316	0x4145fcb7	0x2eb62505	0x2e1359e2
-	0x79cab612	0xaa9282c9	0x7eede562	0xb016f7ed
-	0x1445fefb	0x809b2e00	0xfafaa754	0x69ac113c
-	0x548a6e3a	0x6d444c14	0xb3d355d8	0xbbadcd2b
-	0x3032d634	0x7df39948	0x4c1f9098	0xa9d138ce
-	0x42823bbe	0x2ef39e3f	0xaaf9ef1d	0x63369afb
-	0x2bb76c9d	0xb7d38558	0x354160ce	0xc04c6378
-	0x6c71ab10	0x7914af1a	0x1c1a4694	0x2f9fce8a
-	0xe28f18d3	0x3acaa573	0x2503b236	0x90ca20e1
-	0xd2c77ccc	0xc3005311	0x836d9430	0xe91d8463
-	0xb53e4cb7	0x4e373c67	0xd06ef659	0x27e1a21c
-	0x285c0391	0x32046fa9	0x8b1b9c92	0x49a22f4e
-	0x81411430	0x050110e3	0x56144e6a	0x47fb824a
-	0xdb2e9a6a	0xb5fe97a9	0xabd37259	0x93da3055
-	0x19fb35e6	0x66661115	0xa27149a2	0xfb7d94b5
-	0xa315f9af	0xd7d97596	0x134d7d09	0xd5cde0e9
-	0xbc3f143a	0x1b2061ea	0xd7b15227	0xe8f506e3
-	0x0aa17e92	0xc8565276	0xc7d90586	0x22a26c8e
-	0x6d462029	0xe7b1ad73	0xd11fa609	0x67643f2c
-	0x64f1ef34	0xa0e7e0b6	0x9687611d	0x09c2d32b
-	0xb494937a	0xcc36510c	0x70555bfd	0xfa25e917
-	0x7d88b6da	0x30f3b531	0xd19b224a	0x999d0f7a
-	0x9fe0da18	0x45947b87	0x536dbf3b	0xa6f5182d
-	0xdf11f95d	0xa5abcdbf	0x7528110b	0xf54fe792
-	0x71a97619	0x680bd3ff	0x6981ea39	0x683ff854
-	0x302fbbe4	0x12129f84	0xf63cd448	0x69fe289b
-	0x568da933	0x2f1e1146	0xe7404e52	0xcd329394
-	0x02e41762	0x94456d4d	0xe9416a20	0x4e5920e7
-	0xe8db71fe	0x527a5313	0xe42c7d9e	0x58c8c1fb
-	0x28949bc1	0x312fdf97	0x3569f41f	0x3ed5f092
-	0x44baef39	0x5c11d5ad	0xb5d172cf	0xa9e4cfa3
-	0xbc5ed197	0x2f290ead	0x747f53ed	0xadf1b698
-	0x1b90440a	0x4cdfe154	0x9b24b832	0xeb97d794
-	0xc90fe91e	0x4fef1271	0x8bf96025	0xbdb49f79
-	0x63910640	0x26a05cce	0x3318e422	0xb2fc61de
-	0xf14cedd1	0x4bd7687a	0x8c4c91dc	0x48a857a2
-	0xb47aac94	0x787526e2	0x99349c7a	0x0bd6ba75
-	0xbfbc4b0b	0x040fbec9	0xd00de44b	0xc4c7f0f5
-	0x74a8653b	0xbd3cc036	0xa601a4f3	0xb82c0da0
-	0x2709b674	0x73065351	0xaf4cd23f	0x3481ea0f
-	0x6a1fa77c	0x26a9d280	0x95f4a170	0x393e7590
-	0x015b3d73	0x36d91e55	0x61a7f3f5	0xf6d39c21
-	0xd9ee4701	0xe57af451	0x5e141761	0xf6b6e472
-	0xa6efc965	0x9606aa1b	0xfb8ce005	0x831ab2d1
-	0xfe7a1af6	0x5e326881	0xa0ad32ae	0x15f86ecc
-	0xa1a634d2	0x3a40c4a9	0x88e10130	0x2e6c4556
-	0x8526aa32	0xa81b0d30	0x19c83936	0xdcaa556b
-	0x6dc8064e	0x5709ad31	0x1b6fba18	0x9ebe34b1
-	0x28abc3e6	0xd76c3908	0x4374657e	0x6f0fc085
-	0x4f19a108	0xb774421d	0x405228d5	0x123dbbab
-	0x18535471	0xfc6bde41	0xd4b2d82e	0x65b85772
-	0x64731e41	0x29e886f6	0x4c2c7eda	0x91586a5f
-	0x15b2407b	0x5fa08a72	0x56898e51	0x5424e976
-	0x19ce4a36	0x0ada4656	0xe634446a	0x478da533
-	0x36f1c763	0x01ec46c3	0x5e1d1040	0xf6da1918
-	0x831f8f94	0x43ddb630	0x80b5d4e5	0xfc403ba5
-	0x40dcdd4e	0xa19d0aa9	0x6c32fad7	0x7cdd6f3d
-	0x8e9c123a	0x42c4edd0	0xc8247030	0xf0e6cebb
-	0xf8d1425f	0xcfa8e403	0x67646391	0x9dee9f9b
-	0x5683c4f6	0xd958ae1c	0xc62eedfa	0xbd67ea10
-	0x253398d4	0x18b7f92a	0xf101a7de	0x60066732
-	0x4ca1e3dc	0x6e1eb0a0	0x115aa9e1	0x8370aae0
-	0xe46756d8	0xa02eb1aa	0x854dbb8a	0x6334873e
-	0x87613a81	0xb5bd56df	0x491371d1	0x02bbace8
-	0x2a2e45f9	0x91bdc460	0x2bcf90b6	0x81df2f07
-	0x34aa2dd5	0x5b54a117	0xb7a5bd42	0x713e2287
-	0x1ea184d6	0x176bdda0	0xa19c0d86	0x4180fd5c
-	0xd018a4cc	0x60120a37	0x8f6e094b	0xfebe1b15
-	0x42866bb7	0x4a9f772e	0x0bcf9cad	0xd936a924
-	0xec6cf0a1	0x1f9ccf16	0x81f8229f	0xdcef1733
-	0xb4a31fca	0xefbf0a0a	0x057e0b4b	0x59491c96
-	0x70ce99bb	0x908ce274	0x637ae09c	0x479fdd52
-	0x11ea6250	0x7778cdf6	0xd0ffe2ca	0x539b18dc
-	0xbcdab649	0x3066399b	0xd685edc0	0x79d8d588
-	0x32942aa1	0xd03531f7	0x5d024d56	0x4dc99729
-	0xd1efff53	0xdf3ce9a1	0x31462a0e	0xe5427113
-	0x395e2980	0xcf5c9d4e	0x91e11088	0x7e4d31e2
-	0x5ff91ae8	0x9340e815	0xfcb89789	0xcb1b2f58
-	0x655aa934	0x2eb022da	0x419104a9	0x6b648411
-	0x582048e2	0xa0db392a	0x1e1d6443	0xf3c7a401
-	0x1e737591	0x452af94c	0xfcb74331	0x2da70f75
-	0xa8b59eb9	0x736224c8	0x5ba81657	0xfb36eac0
-	0x4e0336b4	0x8925a32c	0xa4d60fde	0x8a95ff27
-	0x57a7e536	0x7e6a2f58	0xd9e9751e	0x817cc66a
-	0xca4bd134	0x627382fe	0x00e56736	0x74844fbc
-	0xab1f8265	0xa32955e3	0x41cd361a	0xb3ae6366
-	0x1f77ea37	0x2200c6ef	0x81854e76	0x49ed4e92
-	0xb57a7fbd	0x7b9de6d2	0x128feedf	0x57bb65fd
-	0x20ccd650	0xdcde5458	0xd5461b27	0x465147f4
-	0x70719068	0x2cb48f5d	0x6edc0d43	0x83dbda97
-	0xf077ea64	0xf61423e2	0x39a55177	0xb23ff07c
-	0xa02e4ca4	0x9e6250d3	0x77f1df9c	0x238c632e
-	0xce253a6a	0x096327c5	0x87f1db29	0xd75ac0de
-	0x456704b5	0x9ee7046e	0xd693dfe0	0xf995c6b9
-	0xa354d140	0xf16bf090	0xaf511cdd	0xdc56d21e
-	0xd7cc4d4c	0x5398cc1e	0xe5444b3b	0xe192f473
-	0xd09ae67d	0x8af2775e	0xc1af44a9	0x57bc4586
-	0xa6ff5419	0xdd4ba49d	0xec4864fa	0xda9d0357
-	0x84dfbe33	0xf41ba9c4	0x99e2bda8	0x9fba720b
-	0xa7dd9e92	0xa0d43386	0x3e0f9ef2	0x6e388282
-	0x8f47ea95	0xac920523	0xa98ae8a5	0xf6a6a4d4
-	0xc3fa2e55	0x74a21b36	0x9c0b14b2	0xc6b8a79a
-	0x367b7036	0x24b9f255	0x0b543b75	0xb630fa41
-	0x1b260452	0x7daf6714	0xdb8a13d9	0xede8f6bc
-	0x47a21d0c	0x01d9ca54	0x4a8e5cd4	0x257cd217
-	0x7504cecc	0x973bbf11	0x992b731e	0xaab55b65
-	0x77e2f058	0xf580b58e	0xb10419fe	0x679aa4df
-	0x296c1d64	0x751380f0	0x8f70f0de	0x3f78bdb8
-	0x1ee68ad6	0x7d5d50e4	0x823710a4	0x18b98d13
-	0x86bdf798	0x953b8131	0xb5da3d24	0x2eccd3b1
-	0x828a154c	0xed51b913	0x566e58ef	0xab8ff1b4
-	0xc744d227	0xe705bbc6	0x6032eb64	0x5495e4a5
-	0xe83add11	0x08429de8	0xa2e397dc	0x4f00c90b
-	0xcb7672e8	0xa1d55607	0x0741ca2a	0x323d64f2
-	0xa700ef1e	0x6ccb2967	0x07c29e41	0x018440a9
-	0xbb1880cc	0x35502720	0x8a13a96e	0xe2bfcd29
-	0xa76ad3aa	0xd95be915	0x6dd66033	0x41d655f3
-	0x02009028	0xb44ec634	0x82e61d87	0x216e624a
-	0x7fc79105	0xac0307cb	0xd22fa331	0x63746b2f
-	0xe51ab72d	0x9b550c82	0xb28dbc01	0xd569d017
-	0xd168d372	0x8d6bfe6b	0x5820751c	0x820a4e23
-	0x13cfd07a	0x678c8319	0xd1e65476	0x752967ee
-	0xafb28392	0x390d5488	0x53668098	0xa0c92673
-	0xaf0549c2	0x644f51c3	0xd59df083	0x7cb37a42
-	0x12261017	0x038c15b3	0xccc30b03	0x85ee24ce
-	0x1e029b23	0xb6bb2845	0xb62a305e	0x2d0cf4e9
-	0x182b887f	0xec423ce7	0x8c1c0b25	0xc83b4737
-	0x71fb9023	0x63d639f6	0x16c1ce44	0x66ac8331
-	0xd9aa0975	0xba3d445c	0x5d097729	0xb353a034
-	0x23811786	0xb81394b5	0x5323f1b3	0x7a3e1576
-	0x3f2867ad	0x0bc88c8e	0x74b60d63	0xd56335de
-	0x0d40f71c	0x55ec2524	0xea3a2c78	0x19e5e0ae
-	0x9bf3d033	0xf57bbc94	0x05b6ac55	0x4c368744
-	0xae8c68f2	0xf23aad06	0xcf94d185	0x2360ff3d
-	0x0e8a87f9	0xb97c8d33	0xa7122e6e	0x5ad4dc50
-	0x6145ff8e	0x617389df	0xe8a0e09b	0x4d40ce6f
-	0xee2b65fa	0x4104d368	0xf4bc9d85	0x0b67abbc
-	0x7bbad9ff	0x26b293a2	0x06055372	0xbbb05665
-	0x0560311d	0x421dc535	0x9c451ac7	0x38c83a74
-	0xc8921ff8	0x634d52c5	0x6e66dae7	0x1c86fae3
-	0x5a0645bd	0x6e5fddc9	0x86852d55	0x76207d9a
-	0x6a4b7990	0x661c00eb	0xb268e55b	0x17daec24
-	0xa2854da4	0x9b1f3f63	0xdd200bc5	0x0b50aecf
-	0x8242f913	0xc7ab6eea	0xaa977c22	0x748d0d1b
-	0x4490aae4	0xaa293e18	0x69aa0720	0x6115eb81
-	0xa5b187fe	0x828bfe34	0x5fb6d155	0xe764d755
-	0x08833186	0x8475cce3	0x718bfb48	0x063b287b
-	0x7ea71b59	0xbedbfd29	0x3736aa07	0xe2dfd533
-	0xf2ea49a3	0x96b0983a	0xc1f60b14	0x511bed9e
-	0xac976686	0x9c60ce3d	0xfffd0b07	0x59d7cf79
-	0x477942b4	0xff2f43cf	0xeb4b899b	0x37a47783
-	0x8e6602a7	0xb6bfc410	0x7685c6e4	0xb7ec103a
-	0xd54fdb01	0x3933d261	0x725982d1	0x86ada0a9
-	0x83788370	0xbafb1498	0x13972979	0x2157be41
-	0x5e976c80	0x05501107	0xb3b66da9	0xeebcb8fb
-	0x42ac1fee	0x1dba34a9	0x3f5a7582	0x362e7ed7
-	0xaa69be91	0x419f4d18	0xb09a9967	0x31aba127
-	0xaa247bff	0xb31f4958	0xe79562af	0xfb73878c
-	0x47dc697a	0x5d08fa9b	0x91dcd3c2	0x53e52d33
-	0xc84ddc84	0xdb5f8e17	0xe51889e2	0xb1aff523
-	0x4ffa0702	0x2c72b35a	0x9a4246fc	0x62420517
-	0xaad11acc	0x18190bf9	0x11e140de	0xacc99086
-	0x39347992	0x191a53d7	0xbe92c4ef	0x9a934b5d
-	0x64cf7353	0xe30a3e8d	0x0aa6db52	0xb0a7e26d
-	0xc8fe2f52	0x2e274a07	0x0c94b6ba	0xf80eaf3c
-	0x1ba3e94e	0x5853ffe3	0x11652833	0xce7b0839
-	0xd1893c23	0xd06d2078	0xa65f020e	0x281e6a7d
-	0xdf1da5a2	0xcdf69d20	0x74fa9b92	0xd98d6000
-	0xb732496c	0xbd12f87e	0x561dc55a	0x651d42ff
-	0x5736b74a	0x2c48a906	0xfdcbaf15	0xf76606e1
-	0x80dd0254	0x8105e60b	0x143200b2	0x0f02f524
-	0x1580d2c6	0x7281c6fc	0xc971cd31	0xd4a57180
-	0x5051e5ec	0x193c72eb	0x930332c4	0x488d7403
-	0xa93e425c	0x93e8ca97	0xa0a55070	0xafd8f8fc
-	0xc424f1bf	0x11050ed2	0x855d0923	0xa0fcef35
-	0x61f9e84a	0xc2196706	0x7221d5f7	0x96d036a5
-	0x137ca3fb	0xfd632623	0x30b10850	0xdda390eb
-	0x270fc9af	0xe6a8d748	0xf55bc288	0x8cc912d1
-	0xf2d9cd15	0x5ded2f07	0x2de9b076	0xf5088354
-	0x885becf4	0x959ef88a	0x0d9ea589	0x2ceb0a27
-	0x8925270e	0xca5ecd99	0x8ba9265c	0x209eb0b7
-	0x2e8b51d8	0xc598e096	0x23c17aa7	0xf600bcae
-	0x7b33f831	0x223e1501	0x361c9f12	0xe6aeea94
-	0xa5c6948f	0xd1daf8cc	0x0b0e0b54	0xb0cea6c7
-	0xa437fbc8	0xdb4139ab	0xcbbad47a	0x124e2117
-	0xfb80c5dd	0xef085f4a	0xd24c5fa8	0x2548a1db
-	0x5e6cdeb2	0x8e4f0290	0x78cd8245	0x1ebb5eb6
-	0xd9bf1208	0xf20eaf0a	0x544df94d	0xebc9c742
-	0xbc5b4bbe	0x33f6fcaf	0x32efb07a	0x55d91b59
-	0x2c0ed1bf	0x39985cb7	0x4cab882f	0x530cdaca
-	0xccc78cfd	0xdd834c48	0x7ce7898d	0xf7458891
-	0x933c2ae8	0xa06c5762	0x2eb03e35	0x8e938b71
-	0x3636f142	0x0026efb8	0x183d71c4	0x7e8ff92a
-	0x63265ea6	0x0f1352b8	0x73f8a8fa	0x6594e921
-	0x401f88db	0x64abd8e6	0x994140c7	0xb2258b0c
-	0x9bd6e6a1	0x92bab589	0x5919a943	0x29ab4d8e
-	0x33cbb8d4	0x57084d92	0x006c4d50	0x57c49e54
-	0xec1ecfe6	0xeaa8109a	0x269d94a5	0x4a664f84
-	0x2bda2944	0xdafb85c7	0x2a7b4b8c	0xd8f124d6
-	0xbbac0e70	0xeac5a129	0x308d7e39	0x99a023a9
-	0xf616fc22	0x76fcc40f	0x7f745409	0x83872303
-	0x0b067846	0xdf90a414	0xb6d9b6e1	0x8d0f93d8
-	0x6f76a627	0x02f89060	0x392cb9e0	0x6acf19a9
-	0x7cffe4d1	0x9928b4a0	0x87a031bf	0xecff42d5
-	0xa376e023	0x69d2e1e3	0x1fb67afd	0x5396049a
-	0x45538549	0xec0e6f60	0xf1ab27e5	0xc679e764
-	0xee430c38	0xa6b0c2dc	0x92824db1	0x65d5ffe7
-	0x448b17d7	0x9c67c8e0	0x14b36e2a	0x283de0a8
-	0xc59bb35d	0x8faf1ca7	0x4265db7f	0xb0e74749
-	0x0924d389	0xc22bf3fa	0x017c143d	0x93b4e0d4
-	0xf8aa8e07	0x07e0293d	0x5b40bba8	0x619c8946
-	0xc817ee7a	0x82fd526b	0x3e5b0f9a	0x5b352d98
-	0xc786d63a	0xcbec5c0d	0xd05e9640	0x7cab758e
-	0xaa9bd61d	0x205ff53f	0x2f093865	0x55ef390d
-	0x4b008d12	0x0344c52d	0x64820f87	0x8e9c5202
-	0xdd3f2276	0xf3b46630	0x80e85ea0	0x9aea428f
-	0xa205b11f	0xa8506b8f	0x2c89f419	0xb0b9694b
-	0x21029e6a	0x5e05869b	0x3baf3c6f	0xde680ae1
-	0xd65b5eb0	0x99a6937c	0x52a78fe0	0x6f577b06
-	0x8dea8d63	0x2417d49c	0x1a0ecb5d	0x91f22002
-	0xc540298f	0xea9f8f6d	0x01ccfdb5	0x287138c1
-	0xef206774	0x9d5deed8	0xba844833	0xf612317d
-	0xe0bd4bb4	0x595d0440	0x73643204	0x2c21370c
-	0xf9d5df6e	0x05614527	0x73c4edee	0x33f45ded
-	0xbc47170a	0x24b94b30	0xff304e54	0x4e0c3b53
-	0x658af390	0x402418bf	0x9db7318c	0x058721ed
-	0x896bdd56	0xa956c5cd	0x3f928400	0x94c93146
-	0x56600758	0xf46f4f66	0xa5bf66d5	0x0e8b5870
-	0x8ba7e755	0x4177fee6	0x32cc8824	0x90b677d8
-	0x307e9dd3	0x853a7e3b	0xa2f064a4	0xa42dbd46
-	0x243ed6a9	0x7164eb1f	0x9e97212a	0x9757d142
-	0xde296a05	0x8699a74a	0xeb02fa7d	0xf80b41fa
-	0xd9dd2198	0xd7ffbd00	0x21b15853	0x11b78093
-	0xbb329142	0x5260fb1f	0x22fb24fe	0x7a5e7e71
-	0x71434197	0xc5ddca32	0x930c8cb9	0x65192958
-	0xad1a41f1	0xc77442ca	0x72b64ff7	0xa90bcde5
-	0x184a19de	0x71df036e	0x1b69b0ed	0x023c391f
-	0xd9847da5	0xca57d383	0x0d21255d	0x2ea68d9b
-	0x0189eeb5	0x1ea62386	0x4c8d42f0	0xac20dd55
-	0xacceef1d	0x972f56e3	0x0bc40455	0x3853c5a7
-	0xcab0d1f5	0x0d2a990b	0x525be1ba	0x5cc6daf5
-	0x4d564f06	0x834d8f94	0xc0c055e1	0xef34557b
-	0x354537de	0x7207e6b8	0x659c9298	0xa88ac04e
-	0x80d8014a	0x7f4f6e7b	0x1136e621	0xb1b62f79
-	0x8d4613ec	0x673699ee	0xdd6d7741	0xdba1ffa9
-	0xe219e1b3	0x8bf64c21	0x14aadc3b	0xc4dc4e19
-	0x47ae1e52	0xc5409e4b	0xce8d29d8	0xe0b1cf25
-	0xcaf06411	0xd5450dcc	0xf14f29ee	0xf3611dd5
-	0x52bc02f3	0x886b68aa	0x3b2853ef	0x110aafb0
-	0x6b6d765a	0x87fbaa12	0xc79f134e	0x88b910fb
-	0xe04aa148	0x33feeccf	0x3be43d3b	0x067854eb
-	0xf22561e5	0x56c3abc3	0xcf0ff408	0x6291d940
-	0xe26819d9	0xcfd04da7	0x94ab2808	0x156dcd0a
-	0xb6d1c47b	0xdca4aa76	0x877f870d	0x4e06ec17
-	0xbb560b01	0xbe1b62e7	0xd98b51b2	0x7083e3d5
-	0x427ab621	0xe5fce36f	0x606dc14a	0xe4b70b49
-	0x982d2446	0xf2d2e82a	0x60836061	0x681317fe
-	0x1667e3c8	0xf6eef490	0x1ad768d2	0xbc86ae5c
-	0xfbb392de	0x868caaaf	0x8429b5ff	0x266b6d5b
-	0x372e8f2e	0x6e875cce	0x3a972f08	0xabddef20
-	0xc777c559	0xd8f924a4	0xad39137e	0x4c16a4f0
-	0x91d51877	0xae645599	0x4d09feb1	0x0cdededf
-	0x5749b5b8	0x513c9745	0xf4da62f7	0x6583b20d
-	0xb599bb89	0xaf6bea53	0x7275f6b3	0xdefc5092
-	0x01a3734f	0xd95f4c5f	0x37bce97c	0x63610b99
-	0x30555fe4	0x20af2f26	0xf84b2652	0x67ef6d87
-	0x2119805a	0xcc79747f	0xaa479405	0x63a02857
-	0x1953fc39	0x4f952879	0x886bfe97	0xf0067752
-	0xa08b5005	0xcd9a5ebb	0xb04486e6	0x560c79ae
-	0xe8faf52c	0x64a9a961	0xae9a5f1b	0x74cb5ef7
-	0xf8d0269d	0x2fb63c57	0xd78a9a90	0x99cc0a42
-	0x46bb0252	0xe56b026b	0xfb5ff703	0xdc8e0588
-	0xe5d9e280	0xa73ec2b3	0xe21bccb0	0xe22ee743
-	0xd1bb3217	0x5d4b3f92	0x0a627d8b	0xf2fd974a
-	0xad0a57c4	0x261ba12e	0x1670f842	0x996ab25d
-	0xf6f8043d	0xa6cbb362	0xcac3044e	0x6fe01268
-	0xa54ab676	0x54d7444a	0xf3be5437	0x6b2b737c
-	0xbe10300c	0xea505599	0xd60a15f6	0xd971ecc0
-	0x9c480c46	0x2233038d	0x66d38df9	0xcb566912
-	0x63cffade	0x75811ca6	0x8dbfa4cc	0xee5fc07b
-	0x23329e49	0x39ee07e5	0x5de33ff1	0x601f8348
-	0xb60a8bc3	0x832d3660	0xd1bee11b	0x1a38d12c
-	0xaf00744f	0x21c2639b	0x0fd34252	0xcd63a9f1
-	0x60f34993	0xf8728afe	0x75f8bb5c	0x74a250ca
-	0xb9f51490	0x6ac643a6	0x4011a0e5	0x77288317
-	0x57f772b9	0x92c0715c	0xd5d0e030	0xde335025
-	0x669f6b14	0x55c74853	0xf3ac7cd5	0x38284e8c
-	0xb0fda481	0xf9b7f045	0x839293cc	0xdf91a0a0
-	0x18d20454	0xf73214fc	0x09577b9d	0xb5febd00
-	0xd9b96c88	0xb454ea2c	0x6204a932	0x736edf8a
-	0x9724f56e	0x3092f58d	0xac17cced	0x5ae87e39
-	0x28dd2a0d	0x3806d96f	0x5e7c8c68	0x72df4471
-	0x0207de38	0xf026ecac	0x13258e9a	0x34a8e8ce
-	0xdd7d7286	0x8d7553af	0x11ebac36	0xfb9965ff
-	0x9beda82d	0x1cd898cf	0x1b791830	0xe96ca8f0
-	0xa0d274d6	0xdd6fea3a	0x7537177f	0xdd93627c
-	0x60b64e47	0x10f30724	0x12489cf7	0x4587e1ac
-	0xe7835522	0x61d48d9d	0x6afd081d	0xafbbcf2c
-	0xe31d79cd	0x49ae4218	0x7c2c4a33	0x4fdf949d
-	0x52ccd576	0xef2c3d62	0xfd5b75db	0xe6a5c2e9
-	0x04fc9c6e	0x47fde414	0x8a87ebfa	0x850904e4
-	0x2f49b552	0xb5f186fd	0x772a4ba3	0x48d0be3c
-	0x846c7d78	0xc1c2a1d7	0xb9375f9d	0x302ed828
-	0xf79208f1	0x8fdc4f71	0xc749ed51	0x1cd0c28c
-	0xee5a5f7e	0x7f02b7ca	0xdc3b531f	0x99c0119d
-	0x428e5474	0x10515459	0x8d804d27	0xb7c00220
-	0x264c2695	0x7aa6e5af	0xef807715	0xa444f446
-	0xe51c7755	0xcd825b6c	0x39afa440	0x88638e46
-	0x4ea4366d	0xddfc9854	0x99696f2d	0x210592ea
-	0xf4763dcf	0x7358acdb	0xedfc8523	0xe46031c8
-	0xc9762414	0xa71a348b	0x084b6c82	0x9162e0d7
-	0xda6a5b8a	0x68ca14d5	0x6385741f	0xb103d4c2
-	0x44299ef8	0x9aba89fa	0x2c87dcfd	0x476865df
-	0x1189dbb2	0xdcd9d19c	0xac2bbd51	0xa71526f5
-	0x745222d7	0x4813ca98	0xcfa5802c	0x5d2b3907
-	0x8a17d1b8	0xea56f907	0x3ea58d71	0x933fa242
-	0x021f46a7	0xab8d4e86	0xfa4eb33e	0xaecbd5c3
-	0xb3258e74	0xaac9f193	0x415a5518	0x28b13031
-	0xbae39e53	0x1072fd5a	0x4e0fbf55	0xb02c5d77
-	0x5949c780	0xbecf72df	0x15e52c72	0x3ffeb165
-	0xa8e73d50	0xa52fd918	0x2b3c4d7c	0xa1e9e021
-	0xd8e91949	0x63bf63ed	0x8f2e150a	0x9cbceca9
-	0x33b10a97	0x4d2c69f7	0xf26371bf	0x0b5214ec
-	0x10eb7fca	0x1958b429	0x25f190be	0xafcfb396
-	0x7aec0c45	0xf9a0f163	0x9c966818	0x28f83619
-	0xe35c61d4	0x1ad8a656	0x576dba63	0x7aa44804
-	0xf941b7b8	0xc5faf3cc	0xdf1fd628	0xc009417b
-	0x366ea78d	0xd3cb7030	0xf3f12e97	0x5298cc89
-	0xbb43c8ef	0xd0a8ef96	0x564bced6	0xbcbd865c
-	0x5c80b1d7	0x131ccb04	0x7502d06e	0x465f5cb0
-	0x93320c4c	0x9df42986	0xbdb1fe26	0x48ae8bdd
-	0xaf44e912	0x6aa468a5	0x67ecbb05	0x30b7c0a5
-	0x3ad75711	0xa2d5f63c	0x30150058	0x4d748121
-	0x70804875	0xf46b6ea6	0xa3fcbb7b	0x1af6b4c4
-	0x48496de1	0xdb1a2321	0x758eb79a	0xf35f697f
-	0xb4ff9dfa	0x38ab5b31	0xc918f6f1	0xb3a259fb
-	0x3610afe7	0xdfcaaa0b	0x00c747dc	0x96c40b4a
-	0x5c815168	0x29198fee	0xc94eeea9	0x70432b55
-	0x5de7bbd4	0x0995652d	0x4b3e846c	0x7e4c9ca1
-	0x7c0e91e6	0x401a820e	0x3ca3429a	0xd3812f44
-	0x9cb6a5eb	0xf03ce395	0xefca548b	0x8943bc10
-	0x472b2108	0x82d4a386	0x1d0ef931	0x94cd70ef
-	0x2d00d619	0x40d36f80	0x238ccc47	0xe0856568
-	0x9f06ad8b	0x95a4052f	0x287a57fb	0x9e9f9891
-	0x62bc3a31	0x24c3c1f8	0xbabdc3c4	0xfa40629d
-	0xd16f1f33	0xa9f7600d	0xbcbdb2d9	0x214f24be
-	0x623ea3b0	0x8d650418	0xe86635b7	0xb834745f
-	0x20771340	0x3c69a0b2	0x8b7c84cc	0x740e475c
-	0xe5a540eb	0x9e216852	0x1383201e	0xfbf1f572
-	0x9680d736	0x3d7f8d69	0x615ea313	0x87bc1297
-	0xe552725c	0x9bfee104	0xf2e87d90	0xde9188b4
-	0x028d268b	0x51c75c60	0xed93377f	0xc380d9d9
-	0xe858bf8c	0x5d0b4a40	0x05a3171f	0x76ae3ec0
-	0xf86e3fe6	0xc3d78254	0x7cd640c5	0x6835dacb
-	0x983bd9a8	0x05d1e564	0xc5d5e9b3	0xf81c6560
-	0x8ecba474	0x071daa33	0xf5010276	0x5432ba59
-	0x10f2dbc1	0xbe892680	0x7e92d3d7	0x8d2f0113
-	0x37fa8034	0xb13058f4	0x44684553	0x2bd0e36a
-	0x67ea83ef	0x815e7115	0x3cd123af	0xd9aec852
-	0x67c61c95	0x861d068a	0x60c7797e	0xd9733b31
-	0x9ed29f37	0x1ccc8e08	0x34bcfa7f	0x1c66914d
-	0xc64dc834	0xad884c08	0x2b22b8de	0x53d6fd78
-	0x0355dcc8	0xfd363485	0x62370358	0x0dcb046d
-	0x22fe7d2f	0x5fdd1117	0xccd6d8d1	0xe97925a4
-	0x309aca3d	0x56c31fb9	0xe6f81e08	0x24fc0560
-	0xa78d459b	0x4940b35b	0x9a4a2fdb	0x203eafb8
-	0x91e5fcab	0xfb9be08e	0x9cb903ac	0x31598d89
-	0x4f41986c	0x77206f4e	0x61811c9d	0xff51d95b
-	0x2d7b4c66	0x84ceb768	0xfb135597	0x58087b13
-	0xa1681cc2	0x14009e31	0x778c3fec	0xe3faf2fb
-	0x5092b2c9	0x8919c362	0x34e2b174	0x7bb04f44
-	0x63c39b5e	0x8ef696ff	0x2e4c612d	0x77d390e2
-	0x5dc958a1	0x528bb31a	0x1cb07e7a	0xe37c9c53
-	0x002856d7	0x6a10b962	0x423a7b39	0xc6da9227
-	0x207800e9	0xe200c119	0x0e5af6f3	0xfb580459
-	0x71dc40a0	0x70434cd9	0x13f7f455	0xdf3fd7ca
-	0x37cbc698	0xf5a5808d	0xa7bfdf32	0x8a0774c7
-	0x75b67d50	0x5a6908c9	0x23611a6d	0x8b50c483
-	0xfe1e2eba	0x7ee1c732	0x2191e47f	0x9e63eb3a
-	0x379cd875	0x4df7258d	0x166a8aa8	0x1c94586a
-	0x2456c4d3	0x000185fa	0x7a196b46	0x914e789c
-	0xf562c939	0xb3bad5db	0xc2c19b89	0x8a621ffd
-	0x0c807ce0	0x701a938f	0x69234cdd	0x36a00f09
-	0x964c43f7	0xcf71cd85	0x5f504e16	0x446c6388
-	0x25742397	0xf1a375c8	0x6bcf822c	0x1b175fd7
-	0x0fe78e56	0xfe7817d6	0x66da0366	0x904e8327
-	0x5a0749fa	0xef3ede57	0xd0fa2ac8	0x89791771
-	0xa5cd616f	0xe9ef2860	0x9b533bc3	0x1d746f03
-	0xf4bb82b5	0xacae0438	0x840b3e34	0x30371a0d
-	0x8590acf3	0xeb4ff7e4	0x40437052	0xba847bf6
-	0x24059538	0x44daca63	0x23b32e28	0x091386e0
-	0xc480e66a	0xe4a839f5	0x34929bcc	0xb9051207
-	0xd21252f9	0xc6524769	0x8c422851	0x36280aad
-	0xbf00b1a1	0x4e36c85d	0x7949e8ef	0xf76be57e
-	0x373a0ab9	0x1b7555a0	0x0c2caf56	0xc9241f75
-	0xbe5b0ee8	0x5a486f75	0xfb2c050d	0x6aeda464
-	0x3fa744ee	0xf6e055a1	0x0a7324ab	0xfab58776
-	0x09baaf66	0x459ce186	0xc6eb1894	0x56a4ce4a
-	0x58ce1069	0xf4debf5e	0x04a145b9	0x1a246583
-	0x9b07fe23	0xd4d37068	0x7321e0bf	0x2dfe17f3
-	0x426dd8a7	0xc561a2d5	0x7f515a47	0xe57d37fa
-	0xa85f0aa5	0xffb78cd7	0xf30c4551	0x3572c02b
-	0x6f4a4cbd	0x7322ecc7	0x170a7b9a	0xa1e80d28
-	0x5a366af2	0x4f24a3a7	0xfefd29ca	0x0d7b02dc
-	0x1adde2e1	0x5c426cc5	0xb1e53b76	0x5dba2c5c
-	0x1458b6ca	0x73cea912	0x39626c25	0x7547e76d
-	0xfcddbb97	0xf03d59ee	0x3cfdab3d	0x309db86e
-	0x3de8df47	0x4a570e6d	0x09c9579a	0x19ac033e
-	0x0a7a9a86	0x3662d261	0x048fa67f	0x4aa4009e
-	0xc7660654	0x524d81f1	0x3157ec52	0x857d1f10
-	0x3770162e	0x3d1ff919	0x732d2b13	0x84187da0
-	0x95722d45	0x362cada5	0x5d67637f	0xdaae8465
-	0x9f5c0699	0xab9aba98	0x6f97d3fa	0xf9cc4120
-	0x0ca1872c	0x1a832c9e	0x7b74d6ae	0x98dca967
-	0x03eb7699	0x5fd02b54	0x962c6224	0xde1ab807
-	0x800af435	0x2458a4ca	0x717de910	0x31648afc
-	0x871527de	0x3cb93892	0x45237e37	0x446b1315
-	0xecd807e8	0x70f38e30	0x140dc60e	0xaef7b7c1
-	0xadec312e	0x94d45820	0xb8960073	0xe8dd5bac
-	0x7616ab11	0x0c3cc190	0x516003e3	0x323cdb39
-	0xd679f9f4	0xd7c179d2	0xdfbc5e24	0xaa1226df
-	0x3cd41b0e	0x88f436f0	0xbd5b6cb1	0xb78c69aa
-	0x982e0ca0	0x91f852a3	0xb331636a	0x28df67ee
-	0x81b029a1	0x9e7375e3	0x56e874c0	0x8b93a735
-	0xa47eaa4e	0x772ad825	0xfb83ba8b	0xc08db79a
-	0xcb7a34be	0x14214d72	0x7d6fa82e	0xe75c7002
-	0xa6290902	0x716d04c1	0xc75f0a97	0xb68e0912
-	0x08b5ef1b	0x507ecac3	0x2d740b08	0x43b6c7bf
-	0x3965675a	0xf56dc4fd	0x1ba44239	0x36753f70
-	0x0b2452fc	0xe36bafe9	0xfc3134c3	0x2ac78286
-	0x69ba53b8	0x225b9bd9	0xaf426f79	0x99bd2d3e
-	0x0bcb8e18	0x28c87047	0x2045b3b9	0x730ec870
-	0xe6558839	0x9ca3de82	0x263a41e7	0x1c8ea255
-	0x334eb3ad	0xc36d6793	0x66add8ee	0x652c8548
-	0x79dca1a8	0xc2526972	0xd10f03e2	0xdbae6f42
-	0xe223bf69	0x10082495	0x74ba4cf9	0xeb71ef5f
-	0xafae5d4e	0x7b3663e9	0x9339468c	0x31edca72
-	0x65a07876	0xf336fc1a	0xaa505397	0x011d5253
-	0x99b88ade	0xa688f0fa	0xedac589d	0xab4d8f45
-	0x0ff866a1	0x61280e9b	0x65c5a63f	0x8b372073
-	0x7a4c88df	0xc74f7959	0x19597c51	0x97c8a27f
-	0x33eb652a	0xffd40c86	0x57a2ca0c	0xaabc6cc8
-	0x54fd2280	0xd5b59006	0x2e00f009	0x72bd86c4
-	0x24936e04	0x877188de	0x91b60401	0xb949b337
-	0xdab93e69	0xdffeab2e	0xb3aa7c79	0xb8612f31
-	0xf0c53b58	0x8896833f	0xda35944a	0x1867027a
-	0xef6bfce9	0x8213f320	0xac477eb2	0x92368362
-	0x606cfdc4	0x27c98907	0x50673ac5	0xec48f5f4
-	0x39e879f8	0x80d050c8	0x9febddbe	0x5d797725
-	0x06d8b755	0x0319d93d	0x7eae3ce5	0x8963ed64
-	0xc91772c9	0x4e031095	0x2fd03d3e	0xe774ea89
-	0x7dbc97ab	0xe8d8f361	0x6e167fa1	0xd1520c5a
-	0xb3278325	0x8acaf913	0x6ea81dd4	0x9e3b2a97
-	0x0a5b8a09	0x84000db1	0x59a30fa9	0xf0b6868d
-	0xfb62b0ed	0x8953057f	0xdbbca3c0	0xc103b876
-	0x47420e14	0x1eb22bed	0x58c8f65e	0x3a689da6
-	0x8ed1a99c	0x869ddc49	0x60015d09	0x2264c797
-	0xdc10c6ac	0x7275327e	0x8d47d2ab	0x87a75624
-	0x3dd8fcb6	0x40e67a31	0x98114b1f	0x7e3a5976
-	0x1d9e62a6	0x988c0398	0x0c7c0d8d	0x0aad4954
-	0x3c40a234	0x7b752b7b	0x79f94813	0xa0b86dec
-	0xe3f646ac	0xa993f76a	0x6f9d1f99	0xe883dabf
-	0xb8ab1b2d	0x6766ac8d	0x6b9a793a	0x02f55fa5
-	0x351a96ad	0xd190f768	0x35667fe0	0x6a85c938
-	0x72444e33	0x5140a848	0xd3062250	0xe4ce902a
-	0x44e7d9d3	0x7c8d48fe	0x4d26a61d	0xbd013c4b
-	0x540d32bb	0x9152cafd	0x09840a30	0xd7a8663a
-	0xd5a3ca17	0xfd5dbe65	0x655b226f	0x7cb9debc
-	0x59d300dd	0x13737132	0xdf0d004f	0xe98bbd9e
-	0x5626fb54	0xb6d66fbd	0x273087a8	0x032969ea
-	0xbd69c191	0x010cdfff	0xb2a9cea5	0xb8778e4c
-	0x8f0dd084	0xc75b4ce6	0x9c027c6f	0x36c58105
-	0xac424eb8	0xa15d2883	0x9e73b7b8	0x54e9aade
-	0xb9500a5a	0x97505e35	0x4c59b36c	0xb3ad1302
-	0x31e21ed1	0x78bcd74e	0x2d9fc122	0x49bae35e
-	0x5c8f01c0	0x8d29829c	0x0c672566	0x37938db5
-	0x4959e71f	0x0d2365bf	0xaab666b9	0x52b2cffc
-	0x200ee1f5	0x5dbb262b	0x9aae28df	0x3223780a
-	0xb65218cd	0x633b797d	0x93f42423	0x3268b3ae
-	0x141e506e	0xb1ed94b2	0x497b7973	0x9f2db9f6
-	0x5260bf9d	0xb30e4310	0x4a3539ec	0x275d2ae2
-	0xff43e500	0x645e30e5	0xf1527598	0xb76ec4cf
-	0x88fc44e9	0xde68932c	0xe61aff6b	0x19d042b6
-	0x11981ff8	0xb0d595d9	0x52764f82	0x7e0ca214
-	0x8cc51237	0x581f2a1a	0x482420b3	0xd47ff971
-	0xcff78344	0xc019eca7	0x3146ab02	0x107a3ee4
-	0x16dc120d	0x33a239ec	0x0ea84236	0xebc7a1f4
-	0xd1f2fa2a	0x9464c008	0x2b76a4fd	0x9b4acb99
-	0x00f6a92a	0xd68b8d15	0x25e1e58d	0xe1fe3cd1
-	0x6fbce2cd	0xf78be2dd	0x09b9c08d	0x6b32d210
-	0xd06e7c95	0xd62f47f4	0x92c717ca	0x44fe3d2d
-	0xaa13cc08	0x3d411f94	0xc2eba262	0x7521c9e4
-	0x77d6cdc7	0x22d76158	0xca2efacf	0x3e51004c
-	0xef9a82d6	0x1508d20c	0x923f18ff	0x3eaa88e6
-	0xf2f32bc7	0xe74b8483	0x82529884	0x58b38ad8
-	0xdd9f2a5f	0xdf54adc3	0xd4497667	0x789c000b
-	0x935d1743	0xa52d5f1a	0x4e27adf6	0x5c3334af
-	0x6cf71ba0	0x501f8353	0x031fd6cd	0x4831ec4f
-	0x08c847db	0x6a6e0657	0x0bd803d4	0xd7c48cfe
-	0x94b7e25f	0xc6516ebe	0x1001c08a	0x0e165da9
-	0x4e39605f	0xe3f3637a	0x013daae9	0x217168b0
-	0x6013ab5f	0xd5b7eb97	0x8ce6b6ef	0xc4259f29
-	0x470e90a9	0x7a254ff5	0x8dcbf841	0xa2541a7f
-	0x4880c5ea	0x28c750ea	0x043a0200	0xbeb9653c
-	0x46e354d1	0x64f7104e	0x05a64bf3	0x7db42752
-	0xbbd38c7b	0xca7da1d9	0x916c7ebf	0x1df5e3e1
-	0xef0897f5	0xd0456a5c	0x629b50a3	0x8caefdc3
-	0xddbf8b94	0xf6e6b341	0xd8ce3e02	0x27c96419
-	0xb2659ab5	0xe8d576df	0x9f136353	0x6f5230f5
-	0x68417adc	0x39b65378	0x4b742f21	0x96d071b1
-	0xeb046da9	0x245ecb46	0xc17eeec3	0xd7c56615
-	0x07df9b8c	0x647ee4f4	0xf15f7e7b	0x825b87eb
-	0xdc67dd20	0x43c38867	0x977868ca	0x3a299ef2
-	0xa75073f7	0x2dcd59e6	0xc6c78c75	0x63a00767
-	0x74dfba2d	0x7880c7da	0x83f72bc6	0xa9750166
-	0x716b3abe	0xc949a1ea	0x7e5fc036	0x574ee475
-	0x39c3cae9	0x8c1dacdb	0x640fcc41	0xc69437e8
-	0x5d33a950	0xa28e483a	0x4031cf9b	0x0007e3be
-	0x6e3f277f	0xe25d3025	0xdcbc4a0a	0x7451a537
-	0xb372169f	0x21ff0e91	0x1978aa74	0x6471624e
-	0x01a03f20	0xeb391a3c	0x70d18ad5	0x47c9ddcf
-	0xd9415b2f	0xd9ea29ce	0xffa0677e	0xeff7a04d
-	0x1d384ff4	0x66195704	0x22736810	0xad754f27
-	0x782ae9bb	0xffed05b6	0x5ae3f21d	0x5eb2c577
-	0x0101cf91	0xed0322ad	0x56ac50c8	0xc513b1c6
-	0x4f62ba8b	0xbaffd6b6	0x6649baa2	0x8702464e
-	0x78947007	0xd6e97d6e	0xde7c6abf	0x2bdee498
-	0xcee1db1a	0xb98149de	0x47f32f5c	0xc6c354fc
-	0x6e148fad	0xb343cf2f	0xeac6a9f0	0x33dd1560
-	0x923403bb	0x87d6e292	0x0b1cf653	0xe8b76402
-	0x5f21a955	0x236dec28	0x214663fd	0x1917539e
-	0x3f11ce80	0x1bb35a2c	0x38a358f1	0x15f67224
-	0xc65394f9	0x63cd4887	0xe8e73d2b	0x51b6204a
-	0x8eeae8f5	0x6e071c8f	0x55c23dca	0x4862eaee
-	0x0afa0037	0xc98446f3	0x09181a1c	0x41e46e02
-	0xcf13d6b9	0x85907776	0x30116b18	0x27b8c7b1
-	0xd153a5ce	0xc95c90b2	0x34392718	0x8103dbe4
-	0xe012a7be	0x6aeb8c6a	0x5bbaddbe	0x221eab21
-	0xaf769239	0x2621a689	0xe8c41061	0x5890f76b
-	0x2c4dadd4	0x2ad2e669	0x394209b5	0xb272b2ef
-	0x560031cb	0x4ab7be9c	0xcc5e92e4	0xc0de0667
-	0x7a39cf63	0x03482c6e	0xd653de11	0xe14466e1
-	0xf2dbaf25	0xc34d1c0c	0x03eeb3e3	0x8260874f
-	0xf6e2ef37	0x13626fba	0x15b7efe4	0x069cd153
-	0xbf631788	0x797668a9	0x724d831a	0x0ceeb589
-	0x9559cd31	0xb995d2d2	0x7564c4ef	0xfc45a3dc
-	0x1cd999e3	0xbe090229	0xab4f9383	0x879156a0
-	0x06e1d37b	0x3796487a	0xaf1e3884	0x1f9a59ef
-	0x6c2d8a7b	0x0a8a5ffc	0x4cd60f03	0xa60bfc63
-	0xf67c6872	0xf19b75cf	0x041cc864	0xc563566f
-	0x58ae88a0	0x3747b0c1	0x64cd86fa	0xed185c5a
-	0xb71533c9	0xf15672fa	0x2722d209	0xb71ec7d7
-	0x3143a8a5	0x61c18934	0x3a899ec5	0x4274f336
-	0xea7c52a9	0x9193cd11	0x44c471e7	0x57fff360
-	0x53923783	0x76d57ce6	0xbff32513	0x4dbe0d39
-	0xb9f80483	0x62ce4d25	0x5941e9fb	0x7dfedfe1
-	0xa33f9130	0x336e6539	0x1de31e79	0xb6855a41
-	0x4db2db67	0x02a9f1ed	0x019bcf20	0x53ad0ce3
-	0x4d049f95	0xa9de2c6f	0xa26f6997	0x28eafacb
-	0xa5220548	0xb4675e1b	0xe776ee88	0xc93e6c37
-	0x7868630d	0x1690625e	0x6eba0fd4	0x78f598ff
-	0x113fa1b7	0xcb025590	0x2ee34123	0x92241df5
-	0x6edbf0b2	0x3bc2e0a7	0x710ce59f	0x656f0eb7
-	0xa598424e	0xeca53268	0xb6a44542	0x5bf6674f
-	0xad483960	0x35290b93	0xfba74c81	0x78141ea2
-	0xd6baf9e7	0x8e5a08e6	0x4910c5b0	0x7b140d21
-	0x1958c79e	0x0dbed125	0xcfbe41dc	0x089fc4ab
-	0xbf014fa7	0xff961610	0x7a2ae6c3	0x560d3a9c
-	0x2cd77620	0x3a7c15cb	0x9464d8f1	0x249a93ff
-	0x96fe6c56	0x7231a31c	0x4bcdadd7	0x62edd9f4
-	0x8ad1916c	0x3a5fbc8d	0x2a2ccd7a	0x558980b1
-	0xb0137cfa	0x3cae6929	0x587c349c	0xbcfee701
-	0xbddd49df	0xa0da6dbe	0x4cb03dac	0x5f84ba2d
-	0x7fb3063c	0x66de2150	0xbf7dbcf2	0x1c0892aa
-	0x4be8b0ae	0x5d9845ab	0xa21455af	0xc42f2e68
-	0x9b6f438f	0x5eaf4941	0xabbf9079	0x94984a47
-	0x542bdea4	0x34cf3d67	0x854010a4	0xf39a9b19
-	0xd25ffb6a	0x04364e75	0x0af97ef8	0xe10e3620
-	0x2184d002	0x0c0ca683	0xc19963c6	0x4c428d15
-	0x47ae4151	0xd11ea57c	0x437a9ed6	0x50a6b8a2
-	0x141b16e9	0xeb4ae873	0xb51180fa	0xe3dc318d
-	0x7744a06f	0x64d297d2	0x845fac66	0x5854d172
-	0xc14dbe9d	0xccba053f	0x4620a715	0x405d728f
-	0x28b86cec	0xcba09cdc	0x92823f94	0xeae2664c
-	0x48eda6ae	0x4b60f5f6	0x1772f309	0x8af285bf
-	0x9c3ae474	0x13149ebf	0x2bc835c2	0xafcaa560
-	0xc11b6f91	0x94861d9a	0x089c0d82	0x1e04d66d
-	0xf0e497fb	0x6b2d8b6a	0x9d7f0cae	0x4a93ba71
-	0x1c006123	0xed4b5f75	0x76e7826d	0x4f884ba9
-	0xbba28011	0x1e275278	0xfa72461d	0x7e70e215
-	0x1427ba3c	0x467e4f3c	0x781c5f92	0x357b7951
-	0x9de2cce4	0x524a0de6	0x12e15f95	0x7b64fae0
-	0xf27e93cf	0xc6f48158	0x9b71dbd6	0x081dc1b3
-	0x47c9c2c8	0xf110add7	0x7881b556	0x0404bf1c
-	0x58e7d936	0x04442173	0xe1e7f0cc	0x128ce897
-	0x169c0a11	0xf30b5575	0xf2ac0bab	0x91515620
-	0xe8b809b0	0x2a73d5a0	0x9ed32dae	0xcf943a47
-	0xfc157bf9	0x1a53054d	0xf0657e2f	0xf39f6ea7
-	0x92a5834a	0xcdca0c13	0x40a7b40e	0xba0e0cdd
-	0x72f595c3	0x6b7eeaf3	0x4d0fd8ed	0x9a856082
-	0xd75402c8	0xe0f8d3b9	0xee57a2a5	0xe1ccf4a7
-	0xa4fc4fa6	0x9f2407c7	0x75f94c0e	0xbf2361de
-	0x2d3b4782	0x72c35e50	0xb97f7d4e	0xbc880223
-	0xb0b24073	0x08931201	0x40e0d18b	0x559db40c
-	0x6216a921	0x031a379c	0x29bff1ac	0x1c522c12
-	0x583bfe94	0x2519ba2a	0xd691d08e	0x905dc62f
-	0x43b421b0	0xd45caaa0	0x5f099da2	0x012fc4a5
-	0x509712b3	0x67e5d441	0xc843de50	0x7e1c756f
-	0x91368900	0xc6ec0dd4	0xa41e838f	0x58eabda5
-	0xd6ad78a9	0xa037b655	0x8af4e767	0xa9b95900
-	0xdcf1780e	0x64e28d82	0x215ad981	0x292dfcc3
-	0x708d8557	0x0a507562	0x486022ad	0x8165bc7e
-	0xabffce1d	0x78fbe480	0x77b916f6	0x88f8167d
-	0xae8b8edb	0x62698ab6	0xdbc6bbbd	0x001819a6
-	0x8c096fb3	0x40a121e9	0x7b96a718	0xf6d256ed
-	0xe5c0a484	0xa09bd764	0x6552b5a2	0x1847ae3f
-	0x0669a650	0xccabc209	0x85246d20	0x61158f3c
-	0x379d8086	0x02135988	0x1eccc6db	0xf8f38c67
-	0x8e1b0f3d	0x0f6e87e5	0x936bbb84	0xe04839eb
-	0xe26b3e5c	0x3f35ffda	0x4920e752	0x014c876a
-	0x25189061	0xbe2bc4ec	0xbb2ca0f2	0xe2c1c9b0
-	0x747df643	0x26da8dbd	0xdacc3c8a	0x7d93b22a
-	0x922d9a0a	0xf82d65b6	0xd56e5f35	0x7aea7534
-	0xf1808648	0xdfa7ec9a	0xff00f8c6	0x69091da7
-	0xbb478c83	0x64e24ae6	0xf2371faf	0xcff5732a
-	0x4da88e73	0x9c8494df	0x4c0da767	0x3e22bd67
-	0x059298eb	0x9d7611ce	0x74b4a198	0xbcbe440c
-	0xe2bb1a9f	0x0ba3e5f7	0x65a5cf9c	0x8b24b6f4
-	0x7784ca5c	0x24ffc234	0xece71bbd	0x36f8e876
-	0x1b55d68b	0x2b9163a5	0xaf8be424	0x958eeaef
-	0x5d711c41	0x66d11cbe	0xfce42868	0x4a3c819c
-	0xf66d295c	0x629402f7	0x64b2ee3d	0xc0b74538
-	0xe93a735d	0x3b9e807f	0xd1d0d7c8	0x69588f34
-	0xae92b6fe	0xf5508d03	0x45b6ccd6	0xf85a18c6
-	0xe1a28a53	0x438f9a35	0xf4fe84dd	0xe3f95791
-	0x16860340	0xefe72aee	0xb13575c6	0x3d730481
-	0x3cf2a43e	0xa6ed239e	0xd7529176	0x8ad63f3f
-	0x5efe8f4d	0xe9cad7df	0x44fefef4	0xc7198f50
-	0x85aabf5c	0x15c175c2	0x26f7a0cf	0xf06782f0
-	0x4dfadfa7	0xbc57a087	0x21406f0b	0x692a8f18
-	0xd17a358b	0x19d1b2a6	0x6c35022e	0x87d8c987
-	0xe7f2d06c	0x91c4daa6	0x4a132822	0x1e864671
-	0x5cbf0c4d	0x6a34f073	0x1c87a8e5	0xb38f1717
-	0x1cac430b	0xf733ee6e	0xdf73201f	0x71026328
-	0xee976531	0x661c9d28	0xdeefcd7f	0xdefb4607
-	0xfca9ef3a	0x3e1b9b38	0xd204c892	0x6b059f5f
-	0xd5b8665f	0x4eec24fd	0x09b21b40	0x364c708c
-	0xebe0d543	0xc3d64eed	0x8facb895	0x8f415f31
-	0x3dd25b0b	0x95f4072e	0x85e6f4c1	0x3345e2a5
-	0xa56e8dcf	0x3ed8df67	0xa8194a81	0xafe613c7
-	0x384b25b9	0xe7661836	0x5ad6476d	0xeb0ae982
-	0x19afdf2f	0x4efb8658	0xff07e358	0x96c469d2
-	0xf3030add	0xf5bf5b51	0xba03b24c	0xcb77143f
-	0x134fba20	0xa126558a	0x193cd220	0x48f43727
-	0x156f2b18	0x4e599917	0xc3ac4eac	0xcc460648
-	0x67974a2a	0xe2917a7a	0x02998a74	0x470c60d1
-	0xbacbc868	0xfef38d84	0x3e4597a9	0xa1723ab7
-	0x8ffed7b2	0xe489b151	0x34b982fa	0xf67bf8ce
-	0x043cbb33	0xe3927c98	0x3c8fb221	0xbff0644a
-	0x886d333c	0x1f4cd6b7	0xe9b744f0	0x443ef364
-	0x04847d65	0xf3c2ba04	0x60a8e656	0xab4dca06
-	0x620dbf22	0x5b0221e5	0x877973ab	0x128b5a6a
-	0x4696b5d7	0x8f034e85	0x18796215	0x8579ec7c
-	0xf8917eae	0xa98bffce	0xfc67e9de	0xa897445e
-	0x2f115777	0x990bfb90	0x1de53f71	0xfa2e5c1f
-	0x24a5b882	0x0f871a5b	0xe7fc33a0	0x6927a106
-	0xb210bc90	0x2ef851de	0x09629147	0x2553882d
-	0x77393353	0xeacf977e	0x470198f7	0xb7564a05
-	0x4d575fb4	0x1d980371	0x0feeebba	0x26ba3c12
-	0x17b21567	0xfb664d1d	0xcee1a603	0xa8881580
-	0x8a47e853	0x6511027f	0x734f6fd7	0x2977b345
-	0x7465e47c	0x0e3c4c8c	0x3185ac04	0x2450ea5d
-	0xa6e97dba	0xf52b2f4b	0x328ac24f	0x5a507ad2
-	0xac05d4f7	0xca332e1e	0x44b6cdd5	0xe22b049b
-	0x55b885d1	0x71144ba1	0xf57284d9	0x76cb0900
-	0x8266cfae	0x82bb0271	0xfe547080	0x53e4dac9
-	0x0546dcb9	0xa09a8de0	0xd55d15a9	0x7a3a96ad
-	0xd23c33ed	0x7a8fa769	0xa0542b10	0xdaf92f2c
-	0xd6433b0e	0xad7cf7b9	0x72c54814	0x38ff5c07
-	0xddee72d7	0x6c29582d	0xa1574da8	0x418272ea
-	0x0a9e21f3	0xa34bb5ea	0x1e78630b	0x9238d5d2
-	0x7cfa682f	0x6e8e841b	0xa4b3d17d	0x70b6d075
-	0x704db3f8	0x76aa7d19	0x1cd3e85b	0x2ae7fa63
-	0x5ff0dad0	0xdd92c129	0xce7d884a	0xa7ba03ab
-	0x3b366560	0xfeaf75c5	0xd08856c3	0x01ffbced
-	0x089aa8a3	0x2e4b36f1	0x03955648	0x882468ba
-	0x534abc87	0x28c08402	0xa7512f6a	0x1fab044e
-	0x6595e159	0x92fdef27	0xa0b6093a	0x5fdb5f3e
-	0xd0facb7d	0x512a8b83	0xd7f31adc	0x82166318
-	0xf9ad7f02	0x9120b349	0xab744947	0x2787d6bf
-	0x489e3546	0x02a7ce3b	0xd3812409	0x819a092d
-	0x94a48db8	0x49d8dff3	0xdd4e9b5f	0x330d32d0
-	0x203cad0d	0xace20075	0xfd019f42	0x1cc56871
-	0xe53e452b	0x51e7c9e6	0x1d6732c7	0x03694ca7
-	0x900ecdb4	0x3251d119	0x2c4a0669	0x3243bb5e
-	0xb434326f	0xd6eb26b8	0x8ceb7328	0xff30d7e3
-	0x861fa43d	0x15386557	0x3fa11d24	0x86590299
-	0xc3cbd319	0x8d1031a5	0x80db9f63	0x9d957321
-	0xdec927f4	0x1468a2a1	0xff1b8842	0x4c403eed
-	0x62140459	0x912ddd25	0x36252404	0x49052d26
-	0x22205558	0x53773ca0	0x3428d400	0x51002834
-	0x6b5baa18	0x838bcf14	0x30d09ce0	0xf1c456bd
-	0xb1fc90c1	0x525dbb0f	0x64a9105e	0xe0a5cc89
-	0x293f2441	0x335b1c7d	0x55842eff	0x6c7f60dc
-	0x903fd793	0x868589ef	0x50a596a6	0x337c6988
-	0xb7a670a9	0xa46b1a8d	0xdf8c013c	0x3dcdfd02
-	0x01075847	0x06c3a7e6	0xc8f22594	0xfcd94f04
-	0x8b6ddbbb	0x5a138f6a	0xf43d2cca	0xcf4df232
-	0x088cddf4	0x9adce26d	0xee803f2c	0xedf042d5
-	0x7d738c39	0x8f02cc34	0x3f964043	0xbfae17d7
-	0x5f2dd670	0x177a9f36	0xf0e1dc28	0x07082ed9
-	0x90534419	0xf03db66a	0xb8ccbbbf	0x739d2ae4
-	0x3509b32d	0xf0105125	0x2d603572	0xbd1a6b64
-	0x50959fe9	0x26100668	0x758e250c	0x9b372d1b
-	0x0f1e1bde	0xd53edd46	0x0187d6e6	0xd0158da6
-	0x05dd0922	0x3fc0a182	0xd7f70ebd	0xeeda22e1
-	0x1c7f99ad	0x9b39bee9	0xf101d67c	0x1ffea21d
-	0x5494b799	0x787a77ca	0xe8908c34	0xdd00d1db
-	0x25e21bcc	0x30bf0b70	0xd8cd0350	0x96f2d414
-	0xa9a4cb6d	0xa3f3c207	0x2db5c7bf	0x88e8837b
-	0xb157189a	0xb9fb869e	0x48c2a7b3	0xf5e0c692
-	0xf9103c12	0x6c590e9a	0x7e0aac34	0x97392b87
-	0x8e6c201b	0xc6d68ddb	0xb5fbaf0a	0x1f8e411f
-	0x6355e9d9	0x05fcca55	0x9b0250dc	0xec9c5d7d
-	0x668075bd	0xb93078f1	0xcefa1755	0x216c5e0c
-	0xa83ae6b5	0x748bff79	0xfee9e797	0xc6acb230
-	0x1243bc06	0xfee350e0	0x3ee5f8e0	0x0508fb60
-	0x87d9d24d	0x0b54ac94	0xfc37c8fc	0xe9958f2f
-	0x3a927f73	0x04933b6a	0xa195a6dd	0xda96dca3
-	0x9c1799c4	0xd055fc63	0x05deebbd	0x2b5400fb
-	0xf157f110	0x80b1e79a	0xd7f1e4b7	0x5a1fab0d
-	0xbaaa81c3	0xa42489e8	0x594a791a	0x29f18382
-	0xe86f0358	0x5aa5f4b0	0xa682993b	0xedbfc5b7
-	0xf1eac55d	0x9b1716bc	0x907d9d1e	0xb2205254
-	0x4fbba0f3	0xacea63a4	0xc518d83b	0x8449fef8
-	0x80b4f69b	0x95dc7429	0x16c22c9b	0x6e116239
-	0x4c4bfd11	0x56f159fa	0x60cbb0a5	0xa2f4721f
-	0xa829cf9b	0x5ddbb3af	0x2db824cf	0xe82f3fd1
-	0xe5dcb2db	0x185fe7af	0x0775003d	0x38669aba
-	0x7b540eea	0x94ce3d10	0xba77f357	0x63507853
-	0xb50ebb0c	0xb614739b	0xea3a3c47	0xf2b6176a
-	0xf805b28d	0xdd0819b7	0x9f4b2799	0x18bdadb8
-	0x7d58d588	0xc4f0994a	0xef834870	0xef2d6ce4
-	0x97a36a52	0xb6e581e6	0xddd9aa9b	0x6437d4e8
-	0x43f74dc5	0x8cbbd744	0xf394a2a0	0x4a1e7f75
-	0x395bd36f	0x27a8f9e9	0xed62f4a5	0x7c2f0484
-	0xf394f837	0x5f69d50e	0x86ef57af	0x7af052f0
-	0x85dee180	0x125f56fa	0x87291494	0x141931ac
-	0xabca9ae0	0xbc1e4e4d	0x541e2edf	0xa3551bb4
-	0xed2766fd	0xf6e778c2	0x3a82644f	0x67c47659
-	0xb81b826c	0xb11603ee	0xba6cc507	0x691fdb74
-	0x06507f6e	0x64ef2a0f	0xebd9b51d	0xee620487
-	0x82991d7c	0x1493fed5	0x08af819e	0x7066de45
-	0xdeee1600	0xde12b903	0xe572ced5	0x81b897be
-	0x458d0db8	0xc9970232	0x7402dd05	0x44e1c70c
-	0x1619441f	0x9ea0c392	0x1d13c3dc	0x34737cbb
-	0xe1d726e1	0xbe7d749d	0x304892a5	0x71c7bb33
-	0x608bb696	0xd334cfd7	0x862e360e	0x868757ad
-	0xb7d8aa70	0x81031f5e	0xdb64b80c	0x954ff4c1
-	0x5c66d432	0x08c77a67	0xd5e298af	0xb6074be1
-	0xd687a163	0xac2fd525	0x14e6ab5a	0x6ca4232d
-	0x8a921092	0x0a19e936	0xd4464ee4	0x0da28777
-	0x6b6d4131	0x975111bc	0x3f26afae	0x5a6faf38
-	0x867d7956	0x554aa8be	0xf9898211	0x3afcde65
-	0x493dac6c	0x61d901b2	0xbaf3e9fe	0x2a3758fa
-	0xc2ad3ee4	0x97d13dad	0xe84b02f9	0xaaf5ca63
-	0x41a94864	0x6d7b71be	0xd843e866	0x83c3193b
-	0x972d4bbf	0x55c3a234	0x0d03b540	0x53396a64
-	0x98b5c0f3	0x36708484	0x38363c7a	0x0076dbf8
-	0x5edbd01a	0xf6e835d6	0xccb95e4f	0x2bd2907e
-	0x210f9312	0xf4ec9221	0x343697d6	0x3913cd41
-	0xb02ced20	0xba991ee5	0x09c7893c	0x749da3c0
-	0x46e5ad3b	0x871b685d	0x02358659	0xca76706d
-	0xe61524a2	0xf46ac4a9	0x4f6c9e19	0x68a86d0c
-	0x9d16bc4f	0xa9157a1f	0x830993b8	0x3738896c
-	0x7c821db5	0x02de8542	0xb17e3767	0x455a0b40
-	0x19b707eb	0xed81e63d	0x568e1e36	0xbf5cee00
-	0xaa12957f	0x67f65ecd	0xb940789c	0x0ab3bab8
-	0xd7e3a789	0x777b64ba	0x4e00d3be	0x46887a34
-	0x08f0127f	0xf5027e8f	0x9cdb4671	0xb7a7eac4
-	0x9be5cfb5	0xb1f57dbd	0xbce97b11	0x41525f56
-	0x5e847d16	0xf71585b3	0x1ce5047b	0x1bc2fa00
-	0x860aa4ca	0xf97ee77d	0xe7843ee6	0xf07bd865
-	0xfa059452	0x58a59ce9	0x24f03b1b	0xd18a52c2
-	0x180426ab	0x2ced0003	0x399234cd	0xe43f91e9
-	0xa0516a92	0x8088d598	0xc3a41365	0xd1f044ef
-	0xfb3808f9	0x1770e594	0xf96c4185	0xc6b67b9f
-	0x5c01c703	0x65c6ef8d	0xd49310f3	0x0f962bd1
-	0xfb3c96f1	0x4d501516	0xa09beeb5	0xce9df639
-	0xf792c71f	0x392b420d	0xc03c9099	0xcab5dc42
-	0xbdfea308	0x84c80c32	0xcd66ec3f	0x68932191
-	0x62b69b08	0xcacb4a8b	0x0415feff	0x84673edf
-	0xe61b5ff3	0x6107a18e	0x6a7a206b	0xed64aa34
-	0x1bbaef36	0x22a3f0fa	0xb0945c72	0xd1a7f7f8
-	0x65fd1b29	0xa34d99a9	0xb6f2ea53	0x055ab055
-	0x433c3eb2	0xe591d68b	0xcabb8a71	0xfb055c2e
-	0x37e1efec	0x558fd45e	0xa5358766	0xe0c450f3
-	0x78ed3061	0x8713e084	0x4b0d2ec4	0x24feb10e
-	0x6689fc4e	0x0c83f1c9	0x7490df57	0x00d618bc
-	0x2c510caa	0xc5e2838a	0xcfae6669	0xdc2fa4b0
-	0xa4569e3e	0xcee095c4	0xcb5f42ee	0xdc11393f
-	0x69f1c5aa	0xa495fae6	0x64c53ea4	0x4477aeb8
-	0x2ff43cef	0x660aa186	0x5dec9e67	0xa59f6aab
-	0x51504061	0x28279b5a	0x4e245278	0xdbf53c73
-	0x01a77ff9	0x7d771730	0xa8d19fc6	0xce3697dd
-	0xecc405d8	0x22f1872a	0x683afa3f	0x725f7e03
-	0x14c7acb2	0x845efb20	0xf3e03095	0x8c9a7d04
-	0xa9f115d3	0xb93fa8ef	0xd2e78a32	0x91e3cc61
-	0x805d48de	0xc9fcc672	0x225d36f0	0xb32e7627
-	0x11b7a585	0xa7321798	0x9b40640f	0x0c3a6b7f
-	0x3337c762	0xbbe54bb3	0xc8316a84	0x0d487a67
-	0xa6d6b86b	0xd1fb2b92	0x15805dfe	0x5cd49b21
-	0x9855f2c2	0x74e2a195	0xbdc0729f	0x29f680a9
-	0x092f47ad	0x0e7091d1	0x6e7d2020	0x0a7b5d47
-	0xc9c4065b	0xc4cacd97	0xcd7b4071	0x7986cc7a
-	0xb1c29ef5	0x47ced57d	0xc08a8b40	0x12102685
-	0x685caae1	0x1ebf3635	0xdfe6af15	0x8a0496f4
-	0xb9c07f19	0x1f62a68f	0x0133de0a	0x993017d9
-	0xd0553b5c	0x0c8f1311	0x7d979028	0x6001db26
-	0x1caf7ffd	0x76ced0cf	0xc33d3f23	0x9fc27423
-	0x235fc137	0xf85a079b	0x78174474	0x1d15b725
-	0x20162abf	0x62e0712d	0xa03f9cf0	0x0f4ff140
-	0xaa389d0d	0xd58e1171	0x8f5d21f4	0x3ad5b3c4
-	0x03003b51	0x49b29d4f	0xa3d82796	0x9c7f3391
-	0xe34de3a8	0xab75e6f4	0x3f06b52d	0xb8092f83
-	0x01f14341	0x929a3b8a	0xa630aa03	0x4b7e055e
-	0x90b06e58	0xeaf2ad79	0xe8c5b756	0xf46f44e3
-	0x6693ff09	0x499d2790	0xd0d81c69	0x72d7a2bd
-	0x794d242b	0x9be19084	0xddd51a72	0xf4f60698
-	0xd1747d6a	0x24dc87dd	0x78ba7af6	0x548b43d0
-	0xa2b03ee8	0x100ef53b	0xe836488a	0xf4b9a443
-	0x41d61bdc	0xee4bedb1	0x8f0ec0b0	0xc0125983
-	0xaa919a7f	0x6677db37	0x78e7d366	0xc7bef834
-	0x967a54e7	0x5f78951a	0xc0fddf1f	0xbd5cf29a
-	0x3fa13be8	0xca67a695	0xc13e8c23	0xaff54342
-	0x94f4bc22	0x85512c06	0x1439cd71	0x7d13b7b5
-	0x76f8bd59	0xffe02871	0xbd88ccb1	0x2597d721
-	0x80a52e2e	0x1f696120	0x689e73aa	0x7d085fa0
-	0x0e183650	0xe041d3fb	0x5a340dd0	0x26a6c10c
-	0xe6fef6d0	0xdb18b3b8	0x2fc6df63	0xfa695c57
-	0xfb3e6a3a	0x64fb412f	0xc1cf1e32	0x6edd945f
-	0xcee44d66	0xdfb2ec8c	0x5eb84515	0x177f031b
-	0x56a9db8a	0x0e247577	0x99004862	0xa5805854
-	0x04b1afc9	0x9c649998	0x908a1424	0xb595099b
-	0xb91fb0ce	0x8c4bdd8a	0x78de806e	0x65ff3cba
-	0xb66aeda0	0xe22d3592	0x7c0cdebf	0xc15c0853
-	0x80f31d27	0x84dfc7ed	0xc96a5992	0x939b3d6c
-	0xf0ffac53	0xe4be269e	0x4d56d528	0xb0477318
-	0x40a4b528	0xd938f1bb	0x2b25a6c2	0xc93b3c9f
-	0x179c9571	0x999c2e91	0xe7280616	0xee6e0481
-	0xc30eae2a	0x7d6f0458	0x0b7a52ff	0xd44e0a23
-	0x81d661ee	0x9d0f857b	0xe7fa9d18	0xd499cb85
-	0x4e27e30a	0xd51d1f9a	0x14195d32	0xccca7d6e
-	0xc1703a6e	0x15664170	0x7f51c821	0xf1363619
-	0x37dc27f5	0x6aea6223	0xd574e44c	0x4b683223
-	0x4135ad1a	0x7694390a	0x0bf4bddf	0x9522f11b
-	0xc20797be	0x45fb151e	0x96f2a952	0xedfd5f2c
-	0xdfbcac7f	0x58f5dba6	0x68204d0d	0x52eeb34a
-	0x8313fd8b	0xda2f1243	0x195a1479	0x19bb2970
-	0x1c2131e5	0x6841c28c	0x1ec33cfd	0xd3e489de
-	0xd9b70b18	0x81503d32	0x9642a53e	0x02470015
-	0xb8d1087f	0x4b629e77	0xd7ec9ee0	0x795ffd91
-	0xcfa71aeb	0x4bae649a	0x7f768123	0x69f501d5
-	0x56c19a0c	0x4bfaac57	0x90ea664a	0x4d428e1a
-	0xaee71c90	0x198fc316	0x549f5572	0x07a22e58
-	0xe8f444e3	0xedc7fc23	0xe96c1595	0xc4bdad06
-	0x751a3df5	0x3bc4fba4	0x58cd19b3	0x3665000a
-	0xe4371d96	0x6c50d4e6	0x5d1d6a57	0xf130eabf
-	0x48fd82ad	0x42a8bee8	0x71f89c32	0x95fba6dc
-	0x9150b601	0x72c361b0	0x71a3c317	0x149614f9
-	0x224e67fa	0xf6a3fea9	0x5461cefa	0x367bc566
-	0x2226ee83	0xaa13e83f	0x8d7dc705	0x417c7afd
-	0x8a0f2e17	0xbb4003df	0xd1c27124	0xaaaede8d
-	0xd4ed5bcd	0xd0102aa8	0x3b519bfa	0xb82d6932
-	0x50b8f966	0xec685a1d	0xffb18b64	0x538955b2
-	0xac4b6cf1	0x0a86d32f	0x34e4cc05	0x02adcf17
-	0x7c80379f	0xcfb5bcb5	0x842190e7	0x8348cd1f
-	0xabf77742	0x3332866f	0xa56fb2e6	0x6c1fec47
-	0xf2fbb22c	0x7230d805	0xed17d8f5	0x3426e157
-	0x1d045cb2	0x6c1e349f	0x3a6116ca	0x4baf0bdb
-	0xab68daad	0xc4867466	0x7bb15fd9	0x707a6a1a
-	0x83157678	0x277cffd1	0x8d48e5d2	0xf829bd6d
-	0x1fd2750e	0xb6bb8854	0x66d0a20a	0x38f47b92
-	0xa3568b90	0x0d091e16	0x65a8245b	0x238e4299
-	0xd0bc6bbe	0x8ef67730	0xf976b632	0x326d9d24
-	0x96833335	0x1d475e95	0x1f8f41b6	0x65c9dabe
-	0x2133b931	0x43be592d	0xb887160c	0xf21fbfce
-	0xd83ca306	0xa0fb3fe7	0x7da09bf9	0x3f464aa6
-	0x37a7e40a	0xbb0c85bc	0xb172ff01	0xee62de6f
-	0x59d2d646	0x4262e938	0xcd96f5e3	0x0c1862cc
-	0x438388c7	0x9f45d4b2	0xc65ab0b0	0xd24a381c
-	0x1d6c6767	0xedaa1ae2	0xa93eaec0	0x662d776b
-	0x192a88c9	0x6c9d860d	0x61106181	0x30027db0
-	0xa5ae7b76	0x73fc43da	0xd77472b0	0xf4ceba3d
-	0x7cd642c6	0x903dd266	0xe33f58e9	0xbd088621
-	0x8e4c2c12	0xd8c4288e	0x24fdbb22	0xf72ee1f9
-	0xf291bd7e	0x94e68382	0xbbdd9240	0xb59602de
-	0x1b59afd0	0xe5417cf5	0x20bbb538	0xe28fdee3
-	0x0bb16920	0x77d6712a	0x1a0ae5f6	0x0156c43e
-	0x976b53c4	0xef856d7b	0x5a974cfe	0xec53404b
-	0xc627c557	0x3318542a	0x8fd883e6	0x508562b3
-	0xe0ab7501	0x9ae57262	0x95611b5e	0x50c699fd
-	0x984bb8ab	0x5983ed68	0x9947a7c5	0xc0d2374a
-	0xe0845ab6	0x9ffec0fe	0x41873bf5	0xc85c1a4c
-	0x7ef2b12d	0x9e1a3857	0x444da53d	0xb8947919
-	0x84c8588c	0x268f34e3	0x1974cf3d	0xfa67e03f
-	0xc4478570	0xc1896f5c	0xf86de14a	0x9d27ddb7
-	0x5da1c695	0x73c74ab7	0x9123a47b	0x1c9d9563
-	0x7b96bb9f	0x98d20464	0x1f46fd8d	0x4bc35857
-	0xc221a75f	0x04b24c86	0xbe1c7271	0x21a7b19a
-	0x9e050b54	0x8d93d0fb	0x98d7b55b	0xe5fe9502
-	0x9471bff8	0xb3825934	0x5f22d5b2	0x47f4ae9c
-	0x62d7623f	0xfdeef9b6	0x38c64ff3	0x9268fd7b
-	0xa7cfd22e	0x80eeed4c	0xf80a4a3e	0xc9a7e4f4
-	0x6f334b52	0x48e932a5	0xef8720eb	0xb9e86512
-	0xc4183682	0x08142405	0x0a32902d	0x34503fb5
-	0x4c7f132b	0x8db9be38	0x82c20236	0x80a79fa5
-	0x9a31e682	0xca61dd2c	0x2e354b63	0x8d5a4750
-	0x7a838960	0x24dffeb5	0xc7d19837	0xebfbc508
-	0x82e8dbdb	0xe732eaf4	0x109470c1	0xb012af6e
-	0xe2ce17be	0x79db33be	0x281184f3	0xc813df9d
-	0x9e6a771f	0x4a81882c	0xda5baf2c	0xfecbbb6b
-	0x4621a151	0xf4cece92	0xfc230416	0x8d4e758e
-	0xf69c296c	0x9fa2490a	0xeaa56785	0x3075ed95
-	0x4c2ffe06	0x817caf32	0x5a72f33a	0xc6d99da3
-	0x2bbc3dde	0xade463f7	0xb74af1a3	0x738d809d
-	0xd244aeaa	0x7302a2db	0xcb6e9b1d	0xe297c027
-	0x15dbaff6	0xce99c273	0x2810eb0e	0xafbe1f09
-	0xd316d8ba	0x27b8af19	0xb66bdf45	0x3e3b5fbe
-	0x318a4f05	0x2ea7807b	0xed6d40a0	0x58ba8267
-	0x1d1c9d15	0x29af51cd	0x04a46683	0x4b759694
-	0x20ce21e6	0x19ef8036	0x141a8064	0xca36f583
-	0x6d47da5f	0x3a8f6b9a	0x70a99a79	0x03677150
-	0x0feb8c70	0xf3509842	0xf33b5dde	0xbef320a3
-	0x932f9512	0x87497bf0	0xf521a0c8	0xa813483b
-	0xcd6fae43	0xbb7e4dce	0xc7d039b3	0x2d1e6f8b
-	0x1b19cb9e	0x8341c193	0xeffde49d	0x4c40621b
-	0x19d60210	0x8846c540	0xea735ec0	0x0c995dbd
-	0x9aefe2f3	0xbd46f954	0x9b315f98	0x2819307e
-	0xebe2c1f5	0x05919533	0xa52921ee	0xa0bd6746
-	0xd754f5d1	0x39eb2ce6	0x8442d51e	0xb1f75159
-	0x1b617cd1	0x046fc90a	0x6452daca	0xe8d3e3e1
-	0x77406387	0xe3ffbfca	0x89387e91	0x7e348a53
-	0xa5bd3b60	0xc113e95f	0x2ad5a7c4	0x45c1f445
-	0x2a683930	0x3428246c	0x4b89cf6b	0x05e66b1a
-	0x571737eb	0x6e55a8e1	0xbc96ce28	0x24d501f3
-	0x242c8191	0xde8c9472	0xbff946e4	0x551b5759
-	0x411e3420	0x0f0b9299	0x44aaaf70	0xacf2f3df
-	0xe9c44a27	0x781ffdce	0xa39651a5	0xdb7b44a5
-	0xed0ec4d9	0xec17fca2	0xd3ccb15f	0x2b9bd010
-	0x0446a9ef	0x18df586c	0xe227ae08	0xbbaff527
-	0x7958fb15	0x03bfc823	0xc09b7b6b	0xce07b0b3
-	0x0161a359	0x8e21f733	0x8f8168bf	0xc1e2207e
-	0xf9f65e93	0x831b4ba8	0x4b3677f9	0xf8342d03
-	0x03c10268	0xd07233c1	0x0df67d97	0x72434732
-	0x059c7679	0x96526a88	0xb54f9440	0x19e7327f
-	0x6f7f52c1	0xb4b8d069	0xcc4681eb	0x26ea581b
-	0xc26fe16e	0x4073cc56	0x6d252a42	0x689fd0fd
-	0x5d93f1b3	0x070ad283	0xa07cb95b	0x6effe0d1
-	0xe303ed01	0xb8e9b3f4	0x0721647a	0x31f877c6
-	0x134518e5	0x08694d5a	0xb0e6ef3b	0xc7fdc67e
-	0x6111276e	0x45185e0a	0xe13cb5c7	0x7c6ec9e9
-	0xfdee9721	0xc1fb8bcc	0xe25a2bc1	0x075f717e
-	0xd37b7698	0xa9cbfeae	0x6b7d0a28	0x1f1c8bdf
-	0x35d0e6b2	0x8b988b79	0x54f02ea3	0x3426ae01
-	0x5e402b08	0x840d3b8e	0x221527ff	0x906a86f8
-	0x411ce6dc	0xe4b3056e	0x26c9ed04	0xf3d8bc97
-	0x3b02cf67	0x11309c45	0x06ea08bd	0x1c698922
-	0x04e1e492	0x06e0c39d	0xed2937ab	0x83f1911b
-	0x25a94599	0x75d365f0	0x98f191e9	0x845f5e0f
-	0x49547aa4	0x42a0ae2e	0xb7e77fb7	0xe132bfb9
-	0x1cc087a2	0xb0435a85	0x4818ee36	0x4cd90b16
-	0xf56d5e22	0xdc49137b	0xb5f16e70	0x8f8ac784
-	0x84b020c7	0x83c26ace	0x090b3489	0xde14f529
-	0x6ee716ba	0x9deabba1	0x2c230ded	0xd6a68037
-	0xe626043f	0x33431885	0xd26423e7	0xcf259f47
-	0x335dfa6d	0xf052f836	0xcadf2fa5	0x6f2125d9
-	0xafbb23bf	0x19ec69ba	0x84d10bad	0x8cd3ebd5
-	0x36f0fbb1	0xbc1cbfbe	0x96c56812	0x0b05c939
-	0xbd79989d	0xffe74b98	0x6f99405a	0x9f10b14c
-	0x9d8efef4	0x299d21b5	0x9dd2df5a	0xc7ea511b
-	0xbdde106f	0xe5dc7d17	0xee136bc7	0xc4521b6b
-	0x823d31d0	0xcc3c32eb	0xb35ffb33	0x84dd8acd
-	0xe8ddf3d6	0x4611888c	0xfe469f52	0xf8e18215
-	0x768747f0	0x86379e46	0xd3cf9eb7	0x86f1e47d
-	0x30e68652	0x740203fe	0x1031b14e	0x96ce6827
-	0x45f57455	0xe41b7656	0xaa8496d3	0xb99701d0
-	0x485f88ed	0x1d064ef7	0xc7e3348e	0x110d938f
-	0x0c3c9604	0x786b0b35	0x2b2aa6ad	0xdcc45e0b
-	0xe9b29146	0xdbb00ed2	0x0527d574	0xc8029ff1
-	0x5699dfd0	0xd627ff70	0x285fb3d8	0xcf2e6b75
-	0xefad87da	0x4fa21893	0xa391388c	0x5760b28e
-	0x41a95b55	0x82001638	0x6f0e2d45	0xd30f70aa
-	0x5eca612f	0x946317f4	0x24c44ef7	0x470d26f2
-	0xf7e65ef4	0x3a831857	0x53c5699e	0x1af6ff3f
-	0x675b46c3	0x1bd5cfbb	0x03ab61be	0xa67a2b7b
-	0xbae16286	0xe1522d53	0x076d8ec2	0x3a603daa
-	0x0dbacfd9	0xd32acae8	0xe8a23399	0xdf3330bf
-	0xe990c05d	0xfe56bcc3	0x165f868a	0xdf42a220
-	0x6587e194	0x0a31eb94	0xa72a98fb	0x5512801d
-	0xc5fd9c69	0xf7210367	0xcc80f30c	0xc08755bc
-	0x3afe8202	0xc47d603e	0xd17d2990	0xa4addd73
-	0xce89fcc5	0x55726cbd	0xeeb77a64	0x628b3d1c
-	0x2297e332	0x6ecab8e4	0x9739c0d1	0xd53d619c
-	0xbf1a3371	0xe29ea297	0x140436d5	0xfa4802f8
-	0x1b277664	0x4f101407	0xde441685	0x1d36bbf4
-	0x057d9f25	0x7949dbc2	0x57686ffc	0x12984cb7
-	0x0721d76b	0x81ac7aac	0xeb40577c	0x43aaa8d4
-	0xb4e06e63	0x7054a526	0x18bced57	0xa37d26a0
-	0xac039a34	0x156e6d9f	0x07ae4487	0x0e59f4db
-	0x28aeb416	0xc1c4dafd	0xe0357fef	0x683adca7
-	0x93f2d62b	0x8f1f6ec6	0xd42fcbd8	0xfc4e3fad
-	0x082e4bbe	0x578bdbee	0x42dcda04	0x7684e947
-	0x20853da1	0x207dd044	0x56e372bb	0x5ef4c033
-	0x83353865	0xb3b42465	0xb80c9c79	0xffedbed0
-	0x09e45d5b	0x794fe5c7	0x498d4fbd	0xb1cd7a48
-	0xfc89b057	0xc1d19df8	0x9654d056	0xc94cd085
-	0xd7cb03b5	0x13a52c5b	0x52471fd3	0x990aaebe
-	0xe8bed6a7	0xa6960d01	0x68011da1	0x021bf151
-	0xaaa196f2	0x9e3b6188	0xbb28f2c5	0x559d3dd2
-	0xc38861b2	0xfd7242b1	0x716c29e2	0x270236a9
-	0xaaf33479	0x610a7d76	0xc0d564fc	0xf0bb1bd8
-	0x31fb232b	0xf19ebb3f	0xd62acd99	0x5e45578e
-	0x467c587f	0x0ac00140	0x9c7c1705	0x61a8a1ea
-	0x4c5e4e5d	0x0e0d846c	0xd199939c	0xb4c615ae
-	0x4cfe60cd	0x6b4e5cf4	0xe97ad9ec	0xf325a456
-	0x6ca45a64	0xb88b4506	0x9f751f49	0x1d66e330
-	0x59b40444	0x00f530b0	0x9242124d	0xac6de2f9
-	0x7b7e7a67	0x64962ed3	0xfd0825bc	0xbdbcc113
-	0x38d8d589	0x3cedb53e	0x17d95495	0x020b8ac2
-	0xe9aa9bdf	0x0a5a2820	0x64670635	0x91a2a89e
-	0x91bec6be	0xe9b4f902	0x1ef88ee7	0xec6e1208
-	0x149e39ca	0xb140ce3b	0x3210a2a7	0x8e489c45
-	0x59d3ebad	0x30275658	0xc20708d2	0xffdc3e00
-	0x96c700b8	0x3d03aea6	0xf0ce7ad3	0x232a5585
-	0xb0dc6620	0x1c1357b3	0xfb4c6d29	0xe5c5b7b7
-	0xc4bfe2aa	0x37f7ce13	0x433eb884	0x3dde220f
-	0xc1c34602	0xea700f6f	0x37b79490	0xad5761a3
-	0xfc5917b1	0x22f7e1be	0xa90566d8	0x89e9db15
-	0xf91bfa1f	0xdad2260c	0x93eba86f	0x2d94c130
-	0x777290f1	0x2e656559	0x9be4a490	0x377a6ea0
-	0x1b4523e4	0xdca0c8a5	0xb00eed31	0x6baeb803
-	0x9601ee69	0x13d53e86	0xba8d6d8f	0xed6203ce
-	0xc844f9c7	0x91e8a556	0x39974676	0x3b81329b
-	0xdd7f10e1	0xbccb6558	0xb20de25c	0x448c44ee
-	0x8932398a	0x76717b57	0xb20a667a	0x14e2df4a
-	0xa57107f6	0x701b6c36	0x4b83a1ac	0xb39a1c9e
-	0x2cc7e9fe	0xf5ae4a62	0x620687b6	0x2d6aef9d
-	0x6672612c	0x168cdc7e	0x8b09abea	0x522692da
-	0x6461676d	0x34ab3a9c	0x0d61a2ba	0x0590fef1
-	0xe9b4b475	0x2dfb6081	0xbcdafb25	0xdae642aa
-	0x9a9230fd	0xfd67f346	0xdb9d66e1	0x5b307b61
-	0x9d4f1869	0x21133d6f	0x5157502f	0xcc8ccbc5
-	0xb6631100	0xa33f48db	0xc0172774	0x5cb276ac
-	0xe6e5c560	0x07e126dd	0x42bcf23a	0x8064fd70
-	0x567ece78	0xbbc2fe32	0x9d5ee1bb	0x175b24be
-	0xf0feac7a	0x57322618	0xfe9e893f	0xa9b2d67b
-	0x36d03f5a	0xdf178831	0x4da346c5	0x843b1b10
-	0x0d688dca	0x41a475c6	0x4b7adf33	0x145a00dc
-	0xcd226a4d	0x4c40cf2c	0xd4972929	0xbad5ea65
-	0xa96987fa	0xbe247d1c	0x49f2ce89	0xe09bbe72
-	0xee48486e	0x34b41435	0xb41dbb86	0xe58866c9
-	0xe848e228	0x18880947	0xd03cd275	0xca285915
-	0x53dd0097	0xff9069f9	0xaff6a8cd	0xbfe16ac5
-	0x5e88e076	0xac629a26	0x5a99bee9	0xea892a43
-	0x8d1d5ce8	0x806a38e3	0xc4d99fcd	0x331a4a01
-	0x0e586310	0xdd2dfabb	0xe7e6ad37	0x31d67fb1
-	0xbb985560	0xc969ce24	0x3a424634	0x20a2080e
-	0xeb1b587c	0x5cf7da4b	0xdaec0133	0xc99abb17
-	0x63ab9c8f	0xef7e4042	0xca513c8a	0x4e15f5d9
-	0x7cf8fc96	0x464cea5a	0x2363577d	0xd21bb7db
-	0x1d977a0f	0xb02f4878	0x4fd1a03b	0x435b9149
-	0xdfba062e	0xa2f7fc23	0x5ebde93c	0x28e9ed7a
-	0x4023b147	0x9cac0cf9	0x7c5d5ca1	0xb7453148
-	0xa52197d9	0xb85dd94b	0x72ee7e51	0xb81f4f5c
-	0x97a4b485	0x13d8858a	0xa0aabd28	0x9d381125
-	0x4960d2a7	0xa62787b2	0x865231c2	0xd637cc90
-	0x6d58f3b7	0xe2759f6e	0xa28af8da	0x5a005f20
-	0xc11c495b	0x85ecc413	0x657e7b91	0x10b39f7e
-	0x3fcc394a	0x94b3fc3a	0xb359d60e	0x2e6c1555
-	0x67d6d21d	0xb0457bc4	0x004f329a	0x2e131d8b
-	0xfbfbff2a	0x2c1bcbef	0x181f26b6	0x32ebda60
-	0xa0839e5a	0x241097df	0xb3f070a7	0xefbbd9f0
-	0x7c3669c7	0x265f2dbc	0x0bd00e42	0x80d6c4c2
-	0x44874336	0x0b6e7e0a	0xec590889	0xef865c09
-	0x1a02ac8a	0xfbf78784	0xaaf89d75	0xa86c9caa
-	0xc626528d	0xfbcec50f	0x2955f18e	0xb5e9a833
-	0xae60f6bb	0xb3f4c51e	0x21bd6a6e	0x092a6861
-	0x162d73dd	0xacfa4f0e	0x4efed2bd	0x88980089
-	0xa2cee6d9	0xdf0953b8	0x6bf5208d	0x4364ed53
-	0x1a5f19ad	0x2ec7711e	0x7d18832b	0x0f1b28a6
-	0x0e127845	0x278a6a61	0x9e236436	0xf4646e82
-	0x07fff0f3	0x34ae92f9	0xec3e71af	0xf7ec7c67
-	0xdb9ddd62	0xe664e712	0xbb48a158	0x30a14ae6
-	0x0d93b021	0x83082cc8	0x68952311	0x001b0003
-	0xf0688e25	0x6c3b5161	0xfff18a53	0xbd1fb0c9
-	0xe3cc9013	0x1d1e553e	0xa85cdfb0	0x358afc14
-	0x61749007	0x6fad59bd	0xe85f4500	0x26a5ffa1
-	0xedd69e21	0x4c1db8ce	0xaf3be18f	0xcd75c259
-	0xd05f62ee	0x2f0ff1b7	0x717d9bd3	0x62e13392
-	0x159ce5ce	0xcd9e9bff	0x8964600e	0x57d85abb
-	0x3f5ead09	0x2d5d4a55	0x87da8369	0xc7944933
-	0xcde9a717	0x55fa318d	0x112e1607	0x2ca832cb
-	0xb1181bd5	0x7541a7d4	0xac1a1e20	0x6ad024c8
-	0x119378ec	0x60b6cbfb	0x068e2f24	0x83acecb1
-	0x87fd0df3	0x94c9552f	0x08c3d8dc	0x56f1b514
-	0x717d50e9	0x9680fc39	0xa1bdb28a	0x3dfa1c7c
-	0x8fc84774	0xb72e06d7	0x42b7ad1e	0x93646393
-	0xd3632e4a	0x368d78f2	0x36a5ac5b	0x6576a4d8
-	0x8bc6856c	0xd447936a	0xbec6fb22	0xab285e59
-	0x3db2c781	0x72eda32a	0x9d654f18	0xdbd78e99
-	0xbba310ad	0x938ecfc6	0x72d5079a	0x49e2fad4
-	0x4b44dc75	0x81e82165	0xbe269c9c	0x2558ae80
-	0xa3bb693e	0x107d10fd	0x8e4fd977	0x22926b4f
-	0x68c9a7f8	0x6b7439e0	0x5c71c127	0xff5d88b3
-	0x9d8cce8e	0x02982a71	0xf8fe1ceb	0x3ed3996b
-	0x1e4f9957	0x63aca642	0xcc9db51b	0xbcb5af80
-	0x7b2bf393	0x2915079f	0x87f531c5	0xfb06b13a
-	0x550b261c	0xf01fa342	0xcdf4dd86	0x76718f50
-	0x717c6bde	0xf460ef23	0x7f912022	0x54fe5b9b
-	0xc7a5261b	0x073ea6e7	0x71504d55	0x91dd9b8e
-	0x6d259452	0x2dc96e43	0x289959ca	0x128176a5
-	0x8d004371	0x835c494e	0x0efa1879	0xddc02e95
-	0xf0f4618e	0xc67656e2	0xd2bde6b1	0xccaa5e84
-	0xc6592f19	0x91d01db8	0x2b697d22	0x8adfa55f
-	0x5a49e4e7	0x897d5c43	0xd326d94f	0xf5ff0c5b
-	0x57976ca6	0xeff0db4e	0x6d49d466	0x7c054970
-	0xd3eb0f9f	0x0cbdce79	0x1beaf714	0xfe2df967
-	0x6a50895e	0x013167bf	0x6139e59c	0x0662ecee
-	0x9a8d6b53	0xfffb8649	0xce0e685f	0xea5b2a7a
-	0x8819a629	0x5f96afb4	0x8891acfe	0x545f1097
-	0x9f314e1b	0x248a5272	0xa40b8424	0xe42af07a
-	0xa180f331	0x904f3c05	0x98455bc5	0x46198ed7
-	0x03e208e5	0xcf670099	0x7a85b08c	0xba921ae2
-	0x1e6947d0	0xddffa6ec	0xea6330d3	0xcda6957e
-	0x19525cd3	0x311fb407	0x796c1ff4	0x3a2760fb
-	0xde4bdd71	0xdb289b69	0x9811773c	0xa72cd839
-	0x03da90de	0xd42912e8	0x8da1fb0a	0x985d4132
-	0x5890ae40	0x1f7724d0	0xa336824f	0xca19df32
-	0xf8ac73d1	0x61c370a9	0xe152b073	0xdafc6461
-	0x23672042	0x9e6982b6	0x1256c6b4	0xe6bf2c9c
-	0x9dae123e	0x30896b8f	0x99acf3a3	0xaa05d384
-	0xea3b7bb7	0xe711d473	0xa9053351	0x71a85cb4
-	0x3a0f5d25	0x2db3cb48	0x86314a6e	0xf7a2265b
-	0xf7dc1cc3	0x548f56cf	0x4028a1ee	0x7d2e25d5
-	0x68c87e37	0xbced6b8c	0x536cc252	0x68bab5ca
-	0x1158c6c5	0xae0e9509	0x66fa6885	0x22bf2b9a
-	0xa7a60a97	0x18f4f609	0x348623eb	0x773e705f
-	0xb3d6622f	0x8f348186	0x81cb9856	0x64bf21ba
-	0x47e1f96d	0xc95a5843	0xeff6cfce	0x08cb092c
-	0xf214e48d	0xce272fec	0x57bf90df	0x3c425ea8
-	0x856e1f5e	0x5c21d1b6	0x105488a3	0x553971eb
-	0xde614ee5	0xdfa3ac81	0xc5eca5b1	0x69d02d23
-	0x2a0fefb7	0xf9a01854	0xdd99f277	0x75014d7d
-	0x3830e3dd	0x7dd8f1e7	0xdac5ac92	0xbf57c03a
-	0xa5e6a6c7	0xb7c1b7a9	0xc8c8405e	0xfd1977da
-	0x1e6a7ca4	0x299e1025	0x651a0e55	0x53d624a7
-	0xccc9e861	0x901bce45	0x1de5a1ab	0x6140dcef
-	0x3e09eafb	0x20c63cd0	0xff642faa	0xbc91a0a7
-	0xe373e111	0x857236e7	0xe3e61037	0x0b6cc497
-	0xca1da7e6	0x60e53803	0xb68663db	0x42e9956a
-	0xbf4a1650	0xb43f25ec	0xc1232a3a	0x283c2ff3
-	0xcd233183	0x17ccdfc0	0x03ac3e6d	0xa68ced48
-	0xe38217d5	0x03c6472d	0x6a623afc	0xfce0d117
-	0x448ee829	0x0909efd4	0x843a3b4a	0x9ad07683
-	0x2250af2a	0x01ecc053	0x29684919	0x4ee0c62e
-	0xa326a904	0x3ec83943	0xc42b0663	0x966379b2
-	0xc672ece4	0x39391ad3	0x689a10f9	0xd3e9cbd6
-	0x4bfa8446	0xd1ef6375	0xfe01b6a9	0xbda7d01a
-	0x1e6879bf	0x05bdf46e	0x14ccab04	0xb02ae668
-	0x58b51752	0x5eb8e83c	0x753d99de	0x87e4235b
-	0x80b2afe7	0x127439fe	0x127a98a4	0xe5934c92
-	0x86044bc0	0xa9664abb	0x91365b53	0x35b14bda
-	0x67755842	0x7239651a	0x49e0b2e6	0xbb1d25fe
-	0x51ca7213	0xaff2fd82	0xc1223aba	0x02941bcf
-	0xb6ec2cfe	0xaa817dc0	0xe0475250	0x78098112
-	0x750ae102	0x0b3135fa	0x23b648d4	0xbc9d78bd
-	0xc5d7e046	0xe90ef47c	0x7f21eb75	0xdb304b0b
-	0xa2c12ee2	0xb45e62ed	0x9f50feb6	0xe036ff55
-	0x422f410b	0x2385de45	0xb37df6a5	0x4c2abf10
-	0x6a2c7370	0xf35197ac	0x381face9	0x694761c6
-	0xb2275097	0x208824c7	0x945300a0	0x4ad3f83d
-	0x38a7aa12	0x00daaf41	0xcd4b2c19	0x25b2e8f7
-	0x60d3e39b	0xb3dd8220	0x152f86ab	0xd1ec4233
-	0x1c3df78a	0x5aeac74e	0xdeea2fe3	0xcfcf9b2e
-	0x6efc8b2a	0x12a8c5c3	0xb56384e4	0x1b1fe549
-	0xc55acb4d	0x78e7306a	0x733b0f70	0xf4afe6be
-	0x6d904b03	0x7ddd7862	0x4da02602	0xfce1e904
-	0x78773a4b	0x9083e908	0xda8a7593	0xafd8776e
-	0x9e5ae37a	0xd6e7c557	0xad27adaa	0xd0f1a995
-	0x1c84e046	0x3319b21a	0xd24c0d03	0x1789df77
-	0x0f02b9ff	0xdb911f76	0xb2df7654	0x2e75a7bd
-	0x8acc6fd3	0x3c16ec0b	0xe0d7ac22	0x3ddd1ce1
-	0xfa9ec67a	0x48f2c409	0xf8099606	0xd73a459d
-	0x9b2b3fa5	0x8e3c3e9c	0x8b99286a	0x006c0e07
-	0xc299ded3	0x8a2bd400	0x74508dd4	0x609b4afc
-	0x1a532838	0xb352a629	0xd390d8af	0x440a5798
-	0xd31f6ad5	0x161aa48e	0x24a4359f	0xf39f49f7
-	0xff160d2a	0x27a24637	0x84c46d40	0x988d026a
-	0x5697a68f	0xeae970a0	0x42689e3d	0xc84ee62f
-	0x764aabd5	0xb6d74ba5	0x8efc05a6	0xf2d0eccb
-	0x2b4fa41c	0xad24799f	0xf73b8353	0x76bcd448
-	0x08172d5e	0x5c6be301	0x926ffdd6	0xfa31009f
-	0x8339c5f9	0x9dde2840	0x00c2d730	0x6402335f
-	0xf6f84eda	0x5b0e628a	0x140dbafb	0x0533ee67
-	0xa7523e60	0x20ca14b3	0x1145d280	0xb0c0ba41
-	0x81f174d1	0xb80fc64e	0xe8321cfe	0x5762e501
-	0x9e266b75	0x2695a738	0xe3104779	0x1d1ea19e
-	0x15fd1d53	0xf0fbd4ee	0xc82f4552	0x4ea98e23
-	0xec892d69	0x66ccadeb	0x2fdf99b4	0xafffec15
-	0x2de5ee13	0x5e6ead7f	0x20b111cd	0x752254d1
-	0xc0126f43	0xe2695fd8	0x38651d40	0x15b708ce
-	0xf2c2ffdc	0xec24c68c	0x04351ddc	0xceac029b
-	0x0525fc89	0x90e28526	0x0a23a4c2	0xbb33a5c4
-	0x13f1fc38	0x66d79cd9	0x0acabe80	0x8d4ef5d8
-	0x4091808e	0x02f7150b	0xf550597e	0x52703c3f
-	0xfc954b68	0xe9ebaccb	0xd4f35b2a	0x93793446
-	0xc40799e6	0xa963fc0c	0x92c8d8f1	0xbc8218dc
-	0x9ec5c30a	0x8a6a2217	0x63d13dfe	0xea664e1e
-	0x487192a7	0x1c8f8610	0x88e20f93	0xc54a6de3
-	0x0111ae79	0x1335f02e	0xa2e2d37d	0xc2563697
-	0x5fffcdec	0x233919ab	0x3bab1329	0x61943e99
-	0xea7940f7	0x3cc62cf4	0xaedc5bc4	0x41b63f2c
-	0x6dbf285f	0xb4793534	0x0e1013f2	0xc54d8c2d
-	0x23c587f7	0x75df0092	0xc055254a	0x55db2c71
-	0x518eaa5b	0x55c810d6	0x9c44ca37	0x034287ea
-	0xe06a0567	0x221a0d8c	0x037a9164	0x36693ef9
-	0xb7d270a6	0xa8d84a63	0xe8862970	0x484077b7
-	0xab426cb7	0x37db7c9e	0xb34e1752	0x35444958
-	0x00d48e90	0x8142602d	0x8ca28e2c	0x714598c9
-	0xb1cce1be	0xbb98db74	0x400e1029	0x330cb2b6
-	0x1fd3f8ce	0x2abf7516	0xc2d07e5c	0x2b1d2b80
-	0xf06bd895	0x2fa7bc09	0xbdbdf893	0xd8466f85
-	0x61e551b0	0x5b99bfb8	0x86ea5ee7	0xfd82ff9a
-	0xd7c6344a	0x1fa144d8	0x650f0f02	0x71bd73cf
-	0x2825177d	0x56c76399	0x2e0b873e	0xc3bf939d
-	0xf8bc3c1b	0x468482e7	0x33cb98a7	0xa679eaf4
-	0x32ba9b49	0xde86d50c	0x9eeeeee5	0x94a306e5
-	0x432e1c9c	0x37997d0c	0xa84d981f	0xbe07b56d
-	0x4ab6d465	0xa3cd92c4	0x5dea82ab	0xf771249d
-	0x78f87ba5	0x8105df1c	0x3d74e1c1	0xf48cd4c1
-	0x8ad010e1	0x9e9a2758	0x509c8953	0xeaaed79a
-	0x97a4ecb7	0x23ffceb0	0xb3e42e61	0x5f41b4eb
-	0x14d2804c	0x2d635ad3	0xe1314781	0x3921ec18
-	0x3dbebec3	0x94e0df22	0xb0b4724e	0x0e7f986b
-	0x83dd7694	0x7041a22e	0x3c942757	0xd6ff5cbb
-	0x048b0426	0xa5d6c4cb	0x1f4e3bbd	0x78d5924e
-	0x6a857d77	0x1d115ecc	0x73c6a888	0xefb934ee
-	0xa7d1702b	0x6794a668	0x03715b90	0xfbab19f9
-	0xd5a433df	0x12f4d421	0x40519650	0x636a093e
-	0x1601be15	0xe0fbef6f	0x79d775bc	0x789c3a30
-	0x4d9fa618	0xedf8fa70	0xb0fa402d	0x692ee91b
-	0x5a593e5c	0x0fa3667f	0x3f51a636	0x935e28c7
-	0x230b725a	0x4929bc83	0x76de40ad	0x2d9a5f7f
-	0x8799e033	0xbf2700b0	0x5220159d	0x1ed71ca5
-	0xcc66f114	0x15fd868d	0x4236645a	0xded2558e
-	0xa561cc0d	0x02822e5b	0xd0177f80	0xf09badd9
-	0xd5380ae3	0xcfc11a46	0x36713416	0x7f3d60cc
-	0x4018797e	0xc6b23941	0xcb5a4861	0x614ce6df
-	0xabfc0629	0xa519bcfc	0x911f04f0	0xe509b546
-	0xbb411eb9	0x9e6b921c	0xbf0b1c70	0x80c2901c
-	0x85786713	0xad2aafec	0x62711ba7	0x6edb4971
-	0x214eb137	0x45b1b313	0x6742d5e9	0x7daf37a6
-	0x21d6a27a	0x059424f7	0x2c8c3dfb	0xe7a06c77
-	0x10815625	0xb4dc69e8	0x52767f66	0x44d48738
-	0x84d26c93	0x09008893	0xfc21394a	0x82155a72
-	0xc4fd7512	0x6d43cd2f	0xcae99e08	0x453175ae
-	0xc6ee93a3	0x2fed0eac	0xe48fb73d	0x0afe2d2a
-	0x5966735e	0xdc7e5fb6	0xed1ef13d	0x7e08a106
-	0xd3ca0e6b	0x4ce5ca02	0xa0beebed	0xe982c609
-	0x1ee9e5a2	0x24ae26cb	0xfd4c08d4	0x5e85e850
-	0x11b54b3b	0x87209692	0x4a5b0c35	0xcd25dd6f
-	0xd9570253	0xaad0b9fe	0xaf984fee	0x6cf7ae2d
-	0x45d9926c	0x07a66ac6	0x8e7aacdc	0xaf587d66
-	0x53972a4e	0x8da4a6c9	0x2bc311e5	0x36938ae8
-	0x179b965d	0x515743f7	0xb5bbbdcd	0xd8602715
-	0x9e43049f	0x4e78a080	0xba3f1750	0x68635cf0
-	0x85823047	0xbb03b5fd	0xb0d747c8	0x58d214af
-	0x94b1ba85	0x6d2cf8ac	0x2bc1faeb	0x6bd7c1e3
-	0x127658e9	0x8b499020	0xab8f0f62	0xee665a6a
-	0x89240e4d	0x8a95342b	0x00b38ccc	0xe6b14d9d
-	0x32a2af71	0x4c9ecb69	0xc8de2685	0xd7385184
-	0x8e943872	0x809b2c79	0x108511da	0x08b4f54d
-	0x95f52442	0x26fe296f	0xf7e037c0	0xa1aecdd3
-	0x89774a91	0xde67c55f	0x1f9816dc	0x1469a4c2
-	0x28240be2	0x5fd0ad14	0x0949db3a	0x451b94d3
-	0x637e6d49	0x8a4771c8	0xf65104b7	0xc3058c40
-	0x592fe4d0	0xe26129f0	0xe66e6ce9	0x26ab39b8
-	0x308da532	0x205afe77	0x6dc78664	0x84d4890f
-	0x9d49fcb0	0xcac8f2ed	0xe713d798	0xfed7c75b
-	0xe441a0d4	0xdf60df37	0xc2eed2f5	0x2d68b20e
-	0x7827c89a	0x9d4cb9f2	0xb8912cce	0x07516335
-	0x976ffbb6	0x5cd0de48	0xed716f54	0x6f3c9f7f
-	0x34cf42d1	0xc1027cbb	0xde67c065	0xe0a229af
-	0xfc8bd2e8	0xd62ca176	0x8bfb76b2	0x54a1388f
-	0xe0650bb6	0x6d60682b	0xe16cf130	0xbd7c3ca2
-	0xea642814	0xa25f4d44	0x27013786	0x7316aa38
-	0x571511c8	0xf1b6b789	0xb7bfe72b	0x8fd2652c
-	0xbfc7771a	0x51a2e551	0x3bd738c2	0x2698b495
-	0xec69a196	0xd5ecb5c4	0x9bd3224c	0x6d9ab4cf
-	0x326c9942	0x4d711191	0xde9be50a	0xa980ca0b
-	0xe8e59dd0	0x4439e4ae	0x35de914d	0xee499a84
-	0xd1ca0c9d	0xfe6ee96d	0x5b1f4fd0	0xabf0621a
-	0x0c8220c7	0xcb6dbb1e	0xa5116036	0xe858d3c3
-	0x728e3a56	0x3b33e818	0xbe2643c1	0x497bbcc7
-	0xeb369828	0x9a4a01be	0x8c7e72a6	0xaf052f25
-	0x8d3ca85b	0x4703e55e	0x45647d4c	0x86d1e3e8
-	0x40ab59f9	0x3259b195	0xf979a147	0xb8961870
-	0x88b024f9	0x366e26bc	0xd6811525	0x252910c2
-	0x4223a20e	0x7fc971a3	0x4a639bf3	0xb6550c3b
-	0xfe05e552	0xbdc98897	0x509923ff	0xf51a5abc
-	0xc6cc0891	0x61cdac05	0x03a68664	0x1b80cc76
-	0xe18d8ee1	0x798bb4d2	0xd7769bf9	0x9ab4c02d
-	0x7484774b	0xa9ee2c8b	0x87d34c85	0x15697682
-	0x9f6a4a55	0x9d7a731c	0x10014d6a	0xb9798070
-	0xd42f79cb	0x89db59b3	0xd5b0a0b6	0xf60864a5
-	0x2d6fb084	0x1cb607b2	0x48232701	0x9310cbc6
-	0x5bc81c98	0x6b25016c	0x2014b99d	0x0836e60b
-	0x0addbc4c	0x3b8bac7c	0x8d95ac77	0x1d56c3c7
-	0x58333104	0x3d6eb719	0x676eb951	0xd5c2d1a3
-	0x239dae86	0x92181ab8	0xbdde9741	0x7995d452
-	0xe0020661	0x2f80c8b7	0xeedcd4fc	0xe4bde175
-	0xb98fdf78	0x84b9228f	0x78ecb4f3	0xe99e5d46
-	0xa33b9b96	0xe2cbc71c	0xc19e2146	0xdc0ee758
-	0x2d8f8767	0x2036685b	0x149df155	0x2e7ab376
-	0xb13b4266	0xf5c8a3b0	0x02ca1e19	0x1badd81b
-	0xb9c1832a	0x73b31f75	0x69979b55	0x567070a2
-	0x2edeb3dc	0x26b55921	0x461df49f	0xc1aba883
-	0x25d6faec	0x5260e9bf	0xa8ccdd4c	0x04291961
-	0xfaf7a1b8	0xbc2d36e3	0xd6c86385	0x2757fbb9
-	0x62c7107c	0x87dac461	0x0c006454	0x0e971e49
-	0x4749afca	0x7f1fb389	0xdc0b69d3	0xc69fab09
-	0x12c372c9	0x78480a51	0x8ab03a94	0xb37022ca
-	0x1d00e893	0x0989de45	0x8c819503	0x8e0e1c06
-	0x11cfef86	0x3c2386a6	0x66c0e6c8	0x1befa478
-	0xd2e7a4a7	0x9a8b5917	0x2cfa1816	0xaf7e6c7a
-	0xd6c9f0ff	0x1aada3e0	0xbe36a471	0x5a91f3c7
-	0x6c61ea95	0x5246ef7c	0x20bc86c4	0xcfd87abd
-	0xdc61f595	0x8310a684	0x0477e35c	0xe59e776f
-	0xfa403863	0xdaf7bcb1	0xd6084825	0xb90bb047
-	0xeb9ff684	0x7223fbca	0x6b4af987	0x6b2553f8
-	0xdaabc6d2	0x82e2ebc3	0xa7c1c054	0x667eb0a7
-	0x53a0c7d4	0x3fcba743	0x38170187	0x2a2e5830
-	0xee134608	0xcd6e0112	0xac0831f9	0x9537d532
-	0x1e176b9c	0xe3fcb69f	0x17a2eee9	0xa9e6467f
-	0xbf6b0246	0x6a08c0fb	0x7fb943b6	0xb8f67c0e
-	0x2b3b4ffc	0xb155d20c	0x4eb5de53	0xf078715b
-	>;
diff --git a/arch/x86/dts/microcode/m0130673325.dtsi b/arch/x86/dts/microcode/m0130673325.dtsi
new file mode 100644
index 0000000..8063a75
--- /dev/null
+++ b/arch/x86/dts/microcode/m0130673325.dtsi
@@ -0,0 +1,3284 @@
+/*
+ * ---
+ * This is a device tree fragment. Use #include to add these properties to a
+ * node.
+ *
+ * Date:
+ */
+
+compatible = "intel,microcode";
+intel,header-version = <1>;
+intel,update-revision = <0x325>;
+intel,date-code = <0x11192014>;
+intel,processor-signature = <0x30673>;
+intel,checksum = <0x5edcd570>;
+intel,loader-revision = <1>;
+intel,processor-flags = <0x1>;
+
+/* The first 48-bytes are the public header which repeats the above data */
+data = <
+	0x01000000	0x25030000	0x14201911	0x73060300
+	0x70d5dc5e	0x01000000	0x01000000	0xd0cb0000
+	0x00cc0000	0x00000000	0x00000000	0x00000000
+	0x00000000	0xa1000000	0x01000200	0x25030000
+	0x00000000	0x00000000	0x19111420	0x11320000
+	0x01000000	0x73060300	0x00000000	0x00000000
+	0x00000000	0x00000000	0x00000000	0x00000000
+	0x00000000	0xf4320000	0x00000000	0x00000000
+	0x00000000	0x00000000	0x00000000	0x00000000
+	0xfff634fa	0x937ca2ab	0xb28d19b6	0xdefc54a7
+	0xd8df0b32	0x13e9a2a8	0x7b7cb24d	0xd588d3a7
+	0xdb666815	0x5a17bfc4	0x4fca009d	0x099ae8b3
+	0x198e2c7d	0x7c665bbf	0xc07a1a7a	0x7dbcee26
+	0x867296b2	0xc885b6ce	0xe602baff	0x68544b14
+	0xc928c400	0x3add156d	0x531946f9	0x92a03216
+	0xda352322	0xd967ee1f	0x3c5170a7	0xf6de834e
+	0x5a2ed8b3	0x9fb8f050	0x450de17f	0xfd5ef070
+	0x4954575f	0xa3a071ab	0xb56e2afb	0xe2b48302
+	0x6655a958	0x57c9a438	0x1b2f688a	0x09309bc4
+	0x0be95612	0x529c1633	0xc48515d9	0x29eb78df
+	0x9933409f	0xda58dea9	0x58c805fd	0xbc110f5a
+	0x40780ec0	0x6ad59bb3	0xc7387fb8	0x591c1490
+	0xf9335932	0x32130e0b	0xef4b3c96	0xacd903f2
+	0x5b362539	0xe7f85529	0xcb17c41f	0xe7e440d8
+	0xfaf7e925	0x969b76fb	0x5edab8c7	0xf00012e8
+	0x121c2971	0xe5b18959	0xadfd07c0	0x1f09c9d7
+	0x9781006a	0x39550073	0x6c438b6d	0x436f60bc
+	0x11000000	0x1f504653	0xe21b5652	0xe97686b4
+	0x5f67c59f	0xa9b26fd4	0x9dc84f1a	0x0f02451e
+	0x0a821675	0x12547714	0xefe1084e	0x91260f23
+	0x17e46cf5	0x3dad6dd8	0x4e16210b	0x0472bd56
+	0xd3fca8a6	0xfa3f5184	0x87d91976	0xa7b008eb
+	0x17bad553	0x89835b41	0x32e7d87c	0xdfcf298a
+	0x6a740196	0x0405a296	0x4f830df5	0xfcf047f1
+	0xca0e7a10	0x8d0afa7b	0x08facdae	0xcf7bbe22
+	0x8e08e283	0x6b51333b	0x452cf734	0x03da5390
+	0x7075365b	0x402e71ba	0x4a8d4547	0x0da62d39
+	0x3fcae342	0xe8cb1437	0x6ddc21bd	0xe22b5edb
+	0x319decc1	0x6c558ad3	0x3b44648a	0x8cdf8642
+	0x5a3a8cdf	0x6aae06b2	0x7360d1a5	0x774351c9
+	0x88681d42	0x466d3573	0x6d8538cb	0xa3350f1e
+	0x7b431d3c	0x21074f32	0x6955a68f	0xa3988611
+	0xad1c79d3	0xe00884c6	0x12e5baa8	0x7dad4109
+	0x61d16a48	0xd2074a23	0x58611da6	0xad7b774e
+	0x90a80987	0x05aca95d	0x482b51ca	0xbb8fe27d
+	0x2abe5e48	0x590c8b98	0xef745dbf	0xce17a591
+	0x6607216b	0xbefec476	0x7a8b08a9	0xb281bfc4
+	0x76f7dc81	0xaacd78a8	0x38cd6888	0x9636aa2e
+	0x7035053d	0x069305f5	0x0da92823	0x46d344df
+	0xce46f308	0x1fcca5d0	0xf4b0daa0	0xed8ecd8e
+	0xdae9e33d	0x69be5bef	0xc545c95b	0xadeaeeb8
+	0xdd903783	0x5a2f3287	0x73865fd0	0x865d709d
+	0x1ed58537	0xe44c821a	0xc9ad0d97	0xe81b9851
+	0x552cf1e7	0x03a3b2dc	0x219194a0	0xd8875c82
+	0xe39b25b7	0x61149b84	0x79a99812	0x287eada3
+	0x057cc940	0x0ed85405	0xf4cbb20d	0x8d87a099
+	0x2018b6ae	0xd14f3646	0x35bf5bd8	0x82931be1
+	0x52234bd1	0x9143a967	0xd9d1a3d4	0x869c266c
+	0xcaff55f0	0x64ad39c2	0x02435da4	0x32e2907c
+	0xbc2682a9	0x60863cea	0x163028c0	0x007fc9fd
+	0x6553eb56	0xab00c11c	0x3aa77e22	0x87f722d4
+	0x004850a6	0x5460e040	0x9e91042c	0x46dd43c7
+	0x3b05c92f	0x060ce074	0x62730a12	0xc6d47872
+	0x03d26f06	0xf7b3d04f	0x92adc672	0xc31d8130
+	0xd40eab22	0x616b7f8f	0x56b2c742	0xde6015c3
+	0xc10c0d02	0x3ab28f97	0xa091494f	0x1fa0c28b
+	0xc76c5661	0x27effd8f	0x3de80c1e	0x5713a42c
+	0xd9114db2	0x17ab3314	0x0e3aea42	0x60712f1f
+	0x4a7d4389	0x9db1857c	0x1103baa8	0x579462a6
+	0x82ac5a7e	0xda8d9f67	0x835bed5a	0x08705479
+	0xbf4bd494	0x082d8b22	0x408878b0	0xa698e9d8
+	0x27fba6da	0x2308fb71	0xcc1b9c9c	0x5200bd18
+	0xf1baf601	0xe67b1d1b	0xf3c95153	0xf8fb4f22
+	0x2859e330	0x3e7bc864	0x02c88201	0xf835c5f7
+	0xcefd31e1	0x4c430b43	0xce13d99c	0xf9aa01ab
+	0x9f5c0d3a	0xbf06696f	0xc834c22c	0x145cf026
+	0xb45e1f1b	0x97302dd5	0x5b5d108a	0xffde5401
+	0xffbd2caf	0x8eb5c823	0x3f113711	0x144ec354
+	0xab3864a7	0xeee70354	0x208ea79c	0x1b2c7364
+	0xc3cb82d0	0x21d9b3bc	0x27846121	0x50bd8910
+	0x43a2616a	0xface9686	0xe12195b9	0xde4639d9
+	0x0b88b493	0x32b1685e	0xbd782bea	0xc674188e
+	0x23425d26	0x9d2d3c81	0x33b3a260	0x4ebebf2f
+	0x6a634d1f	0xb977b1c1	0x476223c5	0x654c5461
+	0xbeaa9c98	0x75242b30	0x26061148	0x69889154
+	0x910a2132	0x07df3136	0x372a7cf0	0x58541d8f
+	0x65ce78aa	0x0c6e4ff7	0xab8c31b6	0xbe39960d
+	0x63bc072d	0x53872b7c	0x959f3049	0xc13ba7a0
+	0xd7111cd7	0x5e68763f	0x923dc674	0xdb2e8a4d
+	0x5c2cd5e0	0xd93be0e2	0x1bccff32	0xbbdffc8a
+	0x1641ff1b	0xeab24fc7	0x70aff37e	0xc87fe4f8
+	0x32afd630	0x060dbdf9	0x6e119a8c	0x987e51c5
+	0x57abb8f6	0x15b3755b	0x938f709a	0x7c4b5522
+	0xfd376691	0xd909457d	0x58656778	0x3bdee518
+	0xaf65afd2	0xe1cd74ec	0xd2bc8a3a	0x9aa30f8b
+	0x6e1f183f	0xc2fa7bf8	0xa60385fd	0xe0320d46
+	0x2e5bc0df	0xf95b8c37	0xfa760bc7	0xc8960509
+	0xdebed2f2	0x560ac9de	0xb3ac0e62	0xefe328dc
+	0x358d5330	0x72c31526	0x5932780a	0xb3b824b4
+	0xda37daae	0x69dd74c1	0x41c91b5c	0x8180b956
+	0xc69574b5	0x1830993b	0x0d5ef14b	0xa8dec45f
+	0x5c4019ed	0x559e7b51	0xd07a3c14	0x49208a2b
+	0x5265dad8	0x1b9826c0	0xb8cc3edf	0x63ccaf33
+	0xdfdfb78b	0x3292f976	0x9f1ddbc1	0x2e3bfa8f
+	0xc4b5a941	0xd8b1fcea	0x68764a2c	0xbec828e1
+	0x07db4118	0x2022cfd1	0x6be82389	0x7ecb046a
+	0xd31a639f	0xa0f50a18	0xbb4dc035	0x765a6e5f
+	0x59fe51c8	0xd2138643	0xccfeebae	0x234c0440
+	0x49bcdabd	0x88e86cb6	0x48760e88	0xcc34f20c
+	0x0977dead	0xf3f0d324	0x736f4df6	0x0a94f658
+	0x0bbb01cb	0xe962549c	0x6a1c39c6	0xbec25a26
+	0x4cb71dd7	0xf1043105	0xba0f3726	0xc97645e3
+	0x23d4b508	0x7c0827ae	0x097f96f0	0x0a054e0a
+	0x79e7a543	0xbedbd7d1	0x52d2b51f	0xebabfee4
+	0x1f0e76e2	0xa07922a8	0x3a630243	0x41b8b460
+	0x11f8e1be	0x97ab45cf	0xd952588f	0x70461a90
+	0xdf62afd8	0x169cd499	0xc9a38028	0xe2d36ebf
+	0xa86477c5	0x1890d4fb	0xb78c189e	0x6002b07d
+	0x346599a1	0x998b8687	0xa073f3ff	0x561c2a62
+	0xc4904bcd	0x59a5194c	0x6b2d285d	0x3c7208dd
+	0x1a2e9b5e	0x7a7732a8	0x2c803c45	0xb307e8fe
+	0x9a402093	0x521740de	0xb25a372e	0x1abeec65
+	0xd9f84a17	0xed465fd4	0xfcc2e034	0xdc9bc727
+	0x9607ab7b	0xe0bd62d8	0x8630873a	0x361b3b75
+	0x603255fa	0xd815876b	0x32d0e705	0x5f99a520
+	0xf15a63b3	0x83f3009f	0x7ad4b916	0x1ba9093c
+	0x824dc86d	0xcd792af9	0x8d1e623d	0xad4877c1
+	0x2c09f508	0xab062540	0x242c5f5e	0xb46796bd
+	0x0bbc1a5d	0x02be8545	0x4ad68f23	0x370b4b1b
+	0xc16c7ebf	0x8b65ef74	0x11b64ded	0xc00f5586
+	0x41d6033a	0x0f79c8e9	0x356094c0	0xff3ec289
+	0x11a0d26f	0x347ebbef	0x23f2b11a	0xb6b15aca
+	0xe6856320	0xacecde47	0x513fbdea	0x7d7ac026
+	0xb72b0011	0x7d8cac25	0x222704f3	0xabc6b166
+	0x60995d26	0x95ccf438	0xce21d44f	0x27e15e98
+	0x9e229da5	0x929009b0	0xe79afdb0	0xf91bcab4
+	0xe5894312	0xe98d7607	0xb2bd2408	0x5abc5003
+	0x532b2c0a	0xb41dbdf7	0x248d6b00	0x7b811187
+	0xff7afcb3	0x818c2c38	0xacc7a704	0xaa14713a
+	0xeed076d3	0xcca8d4aa	0xd90177c0	0x9fcc01ae
+	0x8edd4189	0x1c896cfe	0xc4856a25	0xbeeb2217
+	0x52249b24	0xad45ff42	0xb43ae3a7	0x4bf0df57
+	0x91e369cf	0xcfafc488	0x6c218f44	0x0aab7b09
+	0x5f9c2410	0x87cdac03	0x986e83cd	0x56a7bba7
+	0xc7d2270b	0x467b995a	0x4b398fc4	0x64f04f87
+	0x30334708	0x8d0c7e49	0x69c792c2	0x725eba77
+	0x6870df0c	0x84d8a30c	0x0c5c6ac2	0xd9bc43cb
+	0xc52ab350	0x64878641	0xef306551	0xcfe54739
+	0x1aa176e8	0x6f1a7e1a	0x965be809	0x21e345f9
+	0x9ad41590	0x5e5de630	0x82cc1207	0x6120734f
+	0x846449fb	0x9d822218	0x2c8e025f	0x747f180c
+	0x90a64365	0xec79c646	0xaf2a29b0	0xb5a4cfa3
+	0x4f5b82de	0x0b7ad494	0x3b02b3e0	0xe5d96463
+	0x241aa4f3	0xefeeed3d	0x6e6d49ff	0x2d45821c
+	0x4598f881	0x7de00efb	0x25509321	0xc64ceb14
+	0x218dde9d	0x59c3cf6b	0xf8f702e6	0x3e0cf0c0
+	0x178f8a4a	0xc8aa3338	0xdcb7989d	0x297f30a0
+	0x270b7ea6	0xceff00a3	0x22ec287d	0x50673360
+	0x1fccbc8f	0x66c3805a	0x8a327234	0x52e1978f
+	0x538b121c	0x1f2fa957	0xeada2b4e	0x29423125
+	0x81d3a179	0x968b4097	0x3522324d	0x5cccf20c
+	0xa6adfc16	0x3d1cb3b9	0xbaefea60	0x57978720
+	0xf5eb4b9c	0x5a8b3acf	0x4f3ac467	0x94a7e4ca
+	0xb4100044	0x54fc2e4c	0x16ec9a22	0x3aecc34a
+	0x6df7f52a	0xe1279f5c	0xaa25ad1a	0x907baa13
+	0x51c19956	0x35987a2e	0x1adbb651	0xaf0a5285
+	0x83ce12f0	0xcbabf9e6	0xfaa1cbff	0x73139922
+	0xc6f5b18a	0x9f91c4fd	0x6583a1bf	0xa144eed0
+	0xc9f2b43b	0x249407d3	0xe3520b2c	0x60dc9aba
+	0x53ff14c4	0x24133ac0	0x4b6a4452	0xe0aea55c
+	0x884302dc	0x24d8ced4	0x3db6976b	0x48aad95a
+	0x7e4defba	0x80215bbf	0x62241272	0x0747edc0
+	0x32206c16	0xffebdcc1	0xdd1662c9	0x1bd3eb01
+	0x785d4a0f	0x4b37087b	0xce5142e8	0x1262ef36
+	0xb04665e5	0x84491927	0x9df53726	0x8d175409
+	0x79fcc87b	0x647f1da3	0x68c89316	0x14926e0b
+	0xf7ca65bb	0x20634f45	0xbd13da4c	0x683991d5
+	0x81cab56c	0xeb840c6a	0x8954031e	0x06deeb42
+	0x92f26c77	0x6b2de0c6	0x80a23d71	0xd11b9d58
+	0x703498a0	0xacade451	0x797bf69b	0x0f6b0db2
+	0x92430faa	0x1756940d	0x99aa9ef0	0xcee8c383
+	0x8bc70735	0x19b263e3	0x36a5345d	0x271c893d
+	0xa32a1999	0x0345759b	0x3f89c616	0x52132086
+	0x10d16c86	0xd7425739	0x961a376a	0x3c4f62a9
+	0x64c0bbe2	0xbf9fcf69	0x3b9055a6	0x88ce084f
+	0x12d088cc	0x2ca9dba5	0x01e2d480	0x7510c47a
+	0x48439c10	0xb82ea353	0xc749c7e4	0x9a768665
+	0xb4233311	0xd62cc354	0x978f7fb4	0x24598a22
+	0x559f80e1	0x18038c96	0xf4a8607a	0x9b45454a
+	0x966c8058	0xbad65e97	0x3247c4c1	0xf402cdb6
+	0x9210a715	0xa4f007f1	0x99154ab2	0x65fbcbfe
+	0x9f80323c	0x34699431	0x01676213	0x30a1e6fa
+	0xd25522c1	0x379c77d4	0x1871da5e	0xce5e5496
+	0x3d6b8be4	0x1dca1d1a	0xa00a2d5c	0x87e10ca3
+	0xe693d866	0x460474d3	0x3f63c391	0xe7ea29d1
+	0x2cec6e1e	0x14d4984b	0xc5d6b60b	0x6d6e0837
+	0x3d4c924c	0x90489257	0xfc8d6a83	0x925c8cb2
+	0xbfe92b1c	0x49242696	0x2e61cd01	0x2257e796
+	0x05a1a9bf	0x3cf1f59c	0x8dbca249	0x224abfe4
+	0xd03b80f2	0x69958e27	0x2ab3a3cd	0x12c385a2
+	0x009f8225	0xfdd732be	0x008ab069	0xf3c83e93
+	0xaeb24747	0xc589db37	0xcde6618d	0x20bd0207
+	0x385e9501	0x0fd9495c	0x5b2e2ed8	0x1078f265
+	0xc90dbe7a	0x1a41d9c9	0x8f9874d3	0xafddd25a
+	0x6c06f499	0x30fbfec6	0xd7c880a7	0x88707b30
+	0xa6dbcb05	0x952fbc2c	0x634e6259	0xe6b40847
+	0x6461bd47	0xae4d5763	0x2b2bba28	0xb80d9555
+	0x2ec5ca1e	0x29d9df5f	0x41cc03d9	0x2235582b
+	0x23835179	0x21d0ccf1	0x804ba9b0	0x57b9b8d7
+	0x1497654c	0xf1e54c96	0x9049e9bf	0xec7a7398
+	0xcfe60cef	0xd8a41f9e	0x924e41e8	0xd4310360
+	0x0bc22c8e	0x8e9949f5	0x1de2e407	0x83cb7e67
+	0x43eadc46	0x428a67b1	0xc3be2567	0x2e64f02d
+	0x416bb222	0xbc70ec3a	0x582bb3ed	0xcda0b133
+	0xb906e982	0xcaa44950	0xf9c503a3	0xe83283a1
+	0x5126b967	0x525d3279	0x0ac69ff9	0xcd705322
+	0x2d8429a9	0x6e76fe2e	0x81794602	0x666ab1bc
+	0x3f31b894	0xcffd21c4	0xf5cd3705	0x114db9a9
+	0x4ab6f993	0xc413712b	0x4d3e7649	0xd167da79
+	0x33c9f1ce	0x1d7c81f4	0x06f9b423	0x747aff7d
+	0x0d52f157	0x839b8075	0x0a853d42	0x6203b11e
+	0x4677d3af	0x38abf342	0x3623c79f	0xbca55b66
+	0x8bc84201	0x4bc018ea	0x03233c7c	0x615f7eb2
+	0x0c60cef9	0xe0308dbf	0x12031915	0xb29fbfb7
+	0x78434066	0x4ee2c89a	0x184f0327	0x47f9d7be
+	0xcce175a6	0x6b3e0b3c	0xdc5b8812	0xc4a0678b
+	0x4023109a	0x152b2c76	0x363fc158	0x8c3e2f21
+	0xa064aed6	0xeb042d45	0x23c24cc2	0x1a8af60b
+	0x07b9b84b	0x29d990b4	0x2609d654	0xddb12106
+	0x23cb29bb	0xfd7be4d6	0x458e378f	0x3435ef60
+	0xf4c5a257	0xfe2b302b	0xa44c6fca	0x9594eb9c
+	0x42562735	0xdcd2ae0f	0x6b121b2b	0x955db8b2
+	0x99324409	0xf9040b5a	0xd4ee06a6	0xe02dde19
+	0x1d689a66	0x01c5034b	0xe16762ff	0x404c08a4
+	0xb797f9f9	0x409e15c8	0x7f8a86d5	0x8c097dc3
+	0x88853010	0x7870d226	0xd9684129	0x5b1f1ff5
+	0xcf0f9327	0x5631fdd0	0x85ad0d39	0x9a7a3da0
+	0x2f196f96	0x98f80f57	0xc2f5bc2b	0xf3c89a99
+	0x5167b4e8	0x38a5b8da	0x31274e92	0x316736b3
+	0x0ba380a6	0x4cdab635	0x55c10afd	0x0aa42f67
+	0x5cb9233d	0xefbea208	0x614caf1e	0xa7b51e52
+	0xbca0669b	0x3e82e113	0x8437d9ea	0xed52af57
+	0x90c58450	0xd58d0939	0x6065bacb	0xa0f03557
+	0x28dacf55	0x95616db9	0xe22c6304	0xf95f1451
+	0x68a017d1	0x744940a8	0x29656d46	0xb462a093
+	0xda67e118	0x9beae14d	0x41295fc2	0xf4832210
+	0xd546e11c	0x9a6fbd36	0x1fa63a12	0x080dd512
+	0x142445a8	0xd7924445	0x7e81a85d	0x0fe2facb
+	0xaea25515	0xdadd52ac	0xd4d4c9d1	0xe53a1391
+	0xf23efc0e	0xae8d8a11	0xe4a18294	0x7897206d
+	0x882f7598	0xcfba1c50	0xd2ab7795	0xabce7dd4
+	0xf953ec47	0xe61d6306	0xd16895b7	0x8754c3fe
+	0x71b45033	0xa13c4375	0x12eeaccb	0x982003cc
+	0x207896e1	0x49d067a4	0x5f302283	0xe4df36fd
+	0xb00cfa4d	0x9ae60753	0xd7bac02a	0x994f4996
+	0xfe146dae	0x97626cf2	0x9e42c940	0x6e337e36
+	0xb6afed1a	0xeb2fd381	0x934baf9a	0xf832addc
+	0x6f979a6f	0x99487a6c	0x57544e74	0x0c66d838
+	0xa061f71b	0x0ddcd233	0x1848e2c7	0xd4c88955
+	0x6c64fe17	0x9bd44131	0xe582e3d4	0xa005bd26
+	0x703b0eea	0x21bd18c1	0x664a9e98	0xe0590718
+	0xd3e4736d	0x0ff91923	0x5dc8871d	0x31699e80
+	0x61a37893	0x1ae82483	0xe45118a2	0xfecea103
+	0xf41828d5	0x4ed049d7	0xdfbade95	0xd238ccf9
+	0x992a8e55	0xa09b38ba	0xcfbd44d9	0x91504f56
+	0xdaa43955	0x1b33f9f3	0xa78246cd	0xa8fd012c
+	0x45af83b9	0xaac19610	0xd89f53b1	0xffd31eeb
+	0x6197b65d	0x7f47d34b	0x6e93fdfb	0x595a289f
+	0x385174bf	0x6f3496b9	0xe49b3f1a	0xfe745cd6
+	0xfdb24e8e	0x6269a7ac	0xa8deb024	0x959a4ca3
+	0xfb164ad5	0x0a74d852	0xc022a450	0x7c46bbb4
+	0xb2cb2e2d	0x1fc8d084	0xd1cd2aa7	0xf301e029
+	0xd0d8bb65	0x89968da9	0x05409da8	0x24134907
+	0x48c6a151	0x390da0bc	0x32816da9	0x6fdda0f8
+	0x7a5e60ca	0xc500eb10	0xdbd2126f	0x22dc1c8c
+	0x165efc8e	0xc52f4553	0xe4488f60	0xbbbd961c
+	0xa965f0db	0x256cafb8	0x35b82b80	0x1b9bbf5d
+	0x69aa3130	0x2f5402f1	0xb7db92c6	0xcdda626d
+	0x9d50e8f8	0xd75b2b43	0x23869cbb	0x18f1fc43
+	0xc4500abc	0x7b22b871	0x93d281b7	0xe72b7f91
+	0xb8a3d2f7	0x40de9703	0xfde8a07c	0xff614acf
+	0x14ba7173	0x4c9d758d	0x67ba546f	0x6edc57de
+	0xe3397593	0x6076ad6f	0x54bbf0fb	0xc7aa004a
+	0x9099bac2	0x43001c2e	0xef39dc79	0xfbf16c39
+	0x43d3b4d9	0x4e1ccb60	0x0a5770ee	0xfeb0bb21
+	0x8f5ef605	0xd69a2259	0x5ae00282	0x81422a35
+	0x537fcf9a	0x740907f9	0x1e980cf1	0xfaf41103
+	0x8554081f	0x9044d4fa	0x9349fecb	0x2e12081a
+	0x9c63d3ad	0xb02fc0e9	0xb9f71ff1	0x7ffc123b
+	0x221be745	0x6b1378b4	0x283d86e2	0x24fbdd88
+	0xecaa1214	0x0e2a05b0	0x49256317	0xe1efbdd1
+	0x2b40232e	0x8a44c71e	0xe5ab10ac	0x55baf697
+	0x57c9cb8c	0xef2cdf39	0x9e28e29c	0x82fa8623
+	0x85090ab9	0x4bf3c17f	0xeb34b5e7	0xbbffc965
+	0x9be897b7	0x7a54a66a	0x0182c5b7	0xfbe04efa
+	0x79a3aedf	0xb04bdde6	0x12396b09	0x7f2eea54
+	0x139fced2	0x2ed4e710	0x8e587a3e	0xc1150171
+	0x3d4475eb	0x3bd4dcbc	0xd15a4ee5	0xf6a03e6d
+	0xd6946d8b	0xc7f12861	0xb46f2665	0x4778aaaa
+	0x90fd4944	0x91b58ad9	0xce88f970	0x6b002000
+	0x3942bf93	0x58560cb2	0x555f27b8	0x51e7e2cb
+	0xe8d32c0a	0x76979f1c	0x0fbbef02	0x784ee6f6
+	0x72e1f85a	0xd2006d22	0xe142e64c	0x0e821726
+	0x0204234c	0x76aff6dd	0x72c02389	0x79674b40
+	0x48c827a4	0xd60a816e	0x4361e2a7	0x20575b11
+	0xc0a15faa	0x1bd24f4f	0xde97121a	0x886610d9
+	0x3c1488dd	0x74331a2c	0xb80b075b	0x1cbaab02
+	0x310e08f5	0xe7e63832	0xf5559bc2	0x5939166c
+	0xfb966138	0x2c192ef1	0x3022c840	0x4760139f
+	0xfc9e25c7	0xa40b3af5	0xf960ef95	0x4bd0fe44
+	0xf951e214	0x320d1105	0x3886b597	0x90be3da2
+	0x16b5e7ee	0x81b43af0	0x4a83b571	0xea294a6f
+	0xe879058d	0xb80d4a36	0x4f3807d6	0xee2a3d4f
+	0x90fd7abf	0x76a13008	0x3a31e37a	0x60cbe826
+	0xfddf43df	0xeb00f98e	0xb22c6cf8	0xc17d7ca7
+	0x82c1b9d2	0xd8408d4c	0x349a8c22	0x55273d19
+	0xc841f4f1	0x6d54d550	0xcc41b69b	0xc7365812
+	0x85f41eea	0x432850c3	0xc27c009d	0xe397479c
+	0x86fe387b	0x578837d7	0xbe61890c	0xdbb0ccd7
+	0x7be07b26	0xeb6f962d	0x02e3e226	0x490c78fa
+	0xba8357ca	0xe0e28646	0x098fdd96	0xaf92d911
+	0xb94371e8	0x2f172a39	0x548d45d0	0x30fad17f
+	0xfb74d606	0x2f5cbfa2	0x25f720a7	0x9bb55ff9
+	0x95af7efd	0xbd078a82	0x67acecf6	0x5890b891
+	0xadb4266b	0x4de99f69	0xa6f5513d	0xc639cde0
+	0xadf8f9db	0xe49c0753	0xf7abf355	0xccbc3ef2
+	0x4da3b1b0	0x6b4930ae	0x0e4dcc32	0x44d27988
+	0xd8a0742a	0x85f9141e	0x4af69334	0x3b02912d
+	0x8d90147b	0xecdeb8e5	0x8c5c76c7	0xf64f4537
+	0x4c2e07c6	0x6caa89b2	0x22fbb640	0x75540372
+	0x07c538a5	0xe3dd71f7	0xd54e1233	0x2bff75b2
+	0x1b65ed38	0x5d5ee6d6	0xf3d99db4	0xe535f17d
+	0xe9b355d0	0xfb27c862	0x2418a7e9	0x83020f9b
+	0x17c850b5	0xc7a49afd	0xfa7cc598	0x4caa65b0
+	0xe35d78ab	0x5fbe5a68	0xb8b23c84	0xdd30c3c7
+	0x166d9c71	0xce9512ca	0x8ff12b46	0xc4f5a4e1
+	0x772f87cb	0x9910eba8	0xd8f966e7	0x1e7a1029
+	0xbdb95937	0xe8745fd3	0x97bd0c23	0xf08d29cb
+	0x3e144fc2	0x4ea5c2d2	0x4dbb3579	0xb2d6d1fb
+	0x59a9499a	0x07de7cf3	0xe5093e74	0x9620e2ba
+	0x98db53bf	0x0088a257	0x81575927	0x1572a999
+	0x85014396	0xf252e4c7	0x935494a7	0xba6777de
+	0xf0cbee95	0x89224156	0x726f5f9c	0xc6a97741
+	0x438936dd	0x02982457	0x69e0b7aa	0x6b2cfa7a
+	0xd920fc79	0x088f473f	0xbdc049ad	0x26fe03eb
+	0x51ce0c14	0xd4ee50da	0xefba7a8d	0x41d48c15
+	0x2fc64c16	0xb910ee77	0x8fd3c6cc	0xf2ea6eae
+	0x799585ed	0x78bb8529	0xf5e8dafe	0xc4d2e7ec
+	0xacb82780	0xc366cc65	0x786dfbe0	0xf6858178
+	0xc0737f16	0xcd7ac719	0xfc1d25f9	0x9bac062a
+	0xf861f2c3	0x534306a2	0xc885076c	0x228b59be
+	0xb5a03917	0xa49ee2e1	0xd7e3f947	0x2993430b
+	0x936b3a69	0xfddd2df8	0x409bcbfc	0x9a49ea67
+	0xda19b129	0x52d00d43	0x594b5373	0xb3ec4e85
+	0x99ba948e	0xd5a139e7	0x0e309bcb	0x824bdac4
+	0xe846138e	0x8e867ec9	0x3b3b3de0	0xb193c1c3
+	0x1d972fb9	0x37e7c572	0x2312fe3f	0x233675c4
+	0xccbe653e	0x7f33fdcf	0x6dbb5b33	0xa1482994
+	0xb053851f	0xa136a22b	0xab83000c	0x8baa7f8c
+	0xf63ce4d1	0x0add4950	0x1e2118a1	0x778b55d9
+	0x11283afb	0xa0ece7a4	0xd5cf4afb	0xaa425954
+	0x735e7cdf	0x915f28bb	0x9f257f4c	0x35f60425
+	0x428317aa	0xde7e7394	0x903cd466	0xd3b76f46
+	0x440cb5c7	0x926ead8a	0x4ad0bc01	0x589d2503
+	0x36c6dbe2	0xae3cb112	0x8af34336	0x98086144
+	0x998764a3	0xf18c15fa	0x4c6b1e80	0xdbea3a77
+	0xdbca504d	0x48e922eb	0xe7d2efd1	0xb2a55650
+	0xd40359eb	0xd669304f	0x3e0d1323	0x8fdbf002
+	0xb8cd2146	0x4f70e597	0xadb80b28	0x6968f1aa
+	0x5785cb7b	0x09d452e1	0x2a24c269	0xeda3c6e0
+	0x3d3c6920	0xb635c806	0xcc205fd1	0xcc273f90
+	0x92f36850	0xc094ef55	0x99e33eee	0x775ea554
+	0xea124752	0x8b006562	0x38bbcb67	0xd2008955
+	0x14ee116b	0x964f634c	0x5bcf34e0	0x58c28331
+	0x01cbb9c6	0x56df247b	0x8fe03e91	0x9646fe0f
+	0x650d96fa	0xe8c99df2	0x7458f4fa	0x76491d87
+	0xaa84a44a	0x48b0ad6a	0xc0d8c6d1	0xd8ad81e9
+	0x65b48f71	0xd254bde2	0x2f34f225	0x4eccf8b9
+	0x25fa9135	0x3662dd06	0x17c9a780	0x1996ed2e
+	0xadfd4c99	0x613f14c0	0xd80c9926	0x2ef5e5f5
+	0xb06ec784	0xf7e430e8	0x19e9ef08	0xe3ac3c51
+	0x78cb1177	0xaf255850	0xcaa6fb41	0x735550b7
+	0x67eb076e	0xf17b3cb4	0xaa8edd18	0x4aa229c7
+	0x74492140	0x11d71f59	0x8c275a99	0xcb217ed7
+	0xa4273190	0x7d9dab3c	0x934381c2	0xdd6176e6
+	0xdece7df1	0x7ab6bea8	0x303bd86b	0xa9170bfd
+	0xc8412491	0x84da3ea1	0xd57e97f7	0xbe0bb91f
+	0x9efc9c8a	0x1c09a4a5	0x83cf52a3	0xd342460d
+	0xd302163d	0xd05c637b	0x1ebb7326	0x79ba20d9
+	0xc944f204	0x18a78657	0x89542294	0xf7bd975d
+	0x5fd7140b	0xbfc96910	0xdc339353	0x952f97d7
+	0x253d4006	0x99fdff85	0x8116afcc	0x328ac2a3
+	0x4410871b	0x2dfe8e51	0xf45c01a6	0x40217a8a
+	0x0c0d19c1	0xd96351fb	0x3bb0b96e	0x287d0ad7
+	0x5a63c6ea	0x037477b9	0x33ead7f1	0x0183222e
+	0xbd1242cf	0xbce09c86	0xa9efc50a	0xe388da86
+	0xabffd93a	0xcadb61fb	0x94320786	0x36731cf5
+	0x4169fb6c	0x60a3e64d	0x22881d97	0x7eed6b34
+	0xe3e6b7cf	0x011047ef	0x514a380d	0x1063defb
+	0xb5c55e9b	0xf548dcfc	0xaa1d300e	0x5aba83f5
+	0xc02e41b6	0x44925671	0xd7d2129f	0x917539db
+	0x9f5d234c	0x6122338f	0x3f8a847c	0x9e65ba6b
+	0xd28e9f70	0x04e78d83	0xad696012	0x471c8f88
+	0xf42ce5db	0x9f0b9849	0x5db38a8a	0x7fd7d4ca
+	0x244ea3e2	0xf352a9d7	0xa670c8c9	0xab7fca55
+	0xec9c1042	0x625ed8e7	0x31f4ff8b	0xa3a8a576
+	0xec645cff	0x3c971f8c	0x527fdc5d	0x77e4d1cd
+	0xa8746a1d	0xc4b9af0c	0x41d2e8fc	0x62456003
+	0x792138ed	0xe672d51b	0x119befb9	0xfd2b4348
+	0x3b14d25d	0xd36edca6	0xd2f74bdb	0x9ec52dfe
+	0x97b55659	0xee80103c	0x12555012	0x6d4a8def
+	0xf1454d26	0xf5c41569	0x4b6e604f	0x92c0851d
+	0x9f4618c7	0x4e5ad7c9	0x41c7cd36	0xe50a1a4c
+	0x74c5b18a	0x721bddb3	0x8d67f6fe	0x7afdca7e
+	0x0a545134	0x137f4344	0x9e5f2d92	0xafc74bda
+	0x0a18eb99	0xb2718bd1	0x1d9b8d07	0x80232c83
+	0xe962d93a	0xabc0f007	0x204f0def	0xb292a3d5
+	0xdfca18f9	0x34fe2939	0xccb61664	0x419dee6d
+	0x4070f1b7	0x334975c6	0x283a9bd6	0x3dc4a721
+	0xea8bd79c	0xa4401e2e	0xa378d378	0xf03ebd34
+	0x5cd39e42	0x0a4ba860	0x34b26a87	0x9979e96f
+	0x8e872a1d	0xaae3cfc2	0x25876b90	0x8bf1b190
+	0x6864856d	0x4965cab9	0x9c49f4a8	0x7d9efd8d
+	0x313413d0	0x52905c5b	0xd43b4f40	0xb3a1cfe8
+	0xb09d2a80	0x6655a633	0xaee4a3b0	0xdbad5f59
+	0xffa56b65	0xa0bec51f	0x10e511f1	0x3091be0e
+	0xb4899296	0xb6640c3e	0x4b0bfd96	0xbb4c2d9f
+	0x7d6ba4ca	0xe0de7fa7	0x3a7c39c2	0x03d52694
+	0x9af37318	0x0f1f28e1	0x629c5821	0xfb78261e
+	0x34c74091	0xab92d7a7	0x226a753c	0xbdb6aafb
+	0x76c9434c	0xfa167b4d	0x640e7dc7	0x1070355b
+	0x2264b655	0x03ded64e	0x100ff664	0x38d25b67
+	0x6715611f	0xef479b2f	0x8f52b055	0x0789f609
+	0xc84baeec	0x16021597	0xc6d924ee	0x32913130
+	0x8e86b7c9	0x8532fc4b	0x27c9b92c	0xfd9c38f2
+	0x63e8c76b	0x9ba845fa	0xad507144	0x7c1eca93
+	0xaec2e059	0xadf30a5b	0xe9133d92	0x7ef687e7
+	0x5c89bfc9	0x58d8f8a1	0xcd70ad24	0x316ea0a7
+	0x5d0957ef	0x8b630a27	0x2c43bd03	0x7925f21e
+	0x42bb7aa2	0x08bc5d8f	0xcdcb9090	0x417ea6c0
+	0xce5c5f86	0x10112aa8	0x19674618	0x3e3809da
+	0x40c7caf6	0xa0753b11	0x7e718c19	0x50bccb67
+	0xd08e448f	0x5f7cf11a	0xc4fa6c6d	0x9aabb2f8
+	0xdda811c3	0x37b24fd5	0x31fbd13b	0x954355ff
+	0x0a3f8036	0x3cc96699	0xc1d0f52d	0x4e976ed4
+	0xe24ee785	0x3ea3647b	0xc2486a7f	0xe24b8488
+	0xa23f433a	0xd0ec2901	0x079da6cc	0x617282e7
+	0xa65c81dd	0x0651acd5	0x14adbf87	0xb62a352b
+	0x33c9a353	0xbb74a62d	0x97fe7ac7	0x2709dd2f
+	0x1bd03373	0x5fdb088a	0x94b8675a	0xdb3edd44
+	0x378021b1	0xafa448c9	0xedad3e93	0x68bc71c1
+	0xe32f7e72	0x28ad6d83	0x97670184	0x2dfbc275
+	0xc238281f	0xd07c0e6a	0xc3b12738	0xd0af1b0d
+	0xfa161509	0x6af28479	0x6350ddcf	0x5de28d1d
+	0xa2504310	0x1fa39c51	0x41c24f45	0x588cc066
+	0xcc1f3a6d	0x6231cbac	0x2b60a3b7	0xfe35561e
+	0xcf92322f	0x412dce5f	0xf7d5628a	0x4eb7aa88
+	0xd832c865	0x6a97e393	0x1ca8f5aa	0x0fb9d833
+	0x52a134d6	0x11ede00d	0x091040d6	0xbcee0e8e
+	0x3065f06e	0xfed5b966	0x5a304bfa	0xecaba5a4
+	0x71142b74	0x44a849d0	0x7334c493	0xdb5ee797
+	0xe537a453	0x849f4cf0	0x435923ac	0xad3a754d
+	0xa78c3e5b	0xdb062ce7	0x874d85ad	0xc80e3955
+	0x3db9ad97	0xbe5ee26c	0x4627c40b	0x095ffa45
+	0xc2affd98	0x5f4d1325	0x7e4e1cd0	0xf87f1a1d
+	0x5ee40ff9	0x87b4a4db	0x32d4d331	0xc75f8a6b
+	0x79cdb281	0xf7b41e82	0x6e38397a	0x9af320c4
+	0x57da9320	0x154f9f49	0x3451d8b8	0xe3520cd1
+	0xd8df7d66	0x15d80b8a	0xfedf9cd0	0xa86675fc
+	0x7fc8e941	0xf7f21238	0x8966e9a8	0x416da7bd
+	0xc44d7d8f	0xecf21ce0	0x801b2813	0x16545fa6
+	0x3c438b30	0x37200a5f	0xeb8ebb3b	0x6d90077b
+	0x123c3d29	0xef11bccb	0x7b107fd9	0xa4fb179d
+	0x7abc5dfb	0xe4817640	0xd3788477	0xd954d092
+	0xa8b16c03	0x694941a7	0xf499fc7d	0x8d65681c
+	0x8c6016b5	0xce3a995f	0x15ce39df	0x9bd26a97
+	0xfa6c7a38	0xa66670e3	0x0932cac5	0x9a4ebbd3
+	0x4c06bc72	0xb0dcb9c0	0x3598f7cd	0x7557e021
+	0xba16f52e	0x32cd1c62	0x12cfc28d	0x544b3d77
+	0xd780755e	0x340fea59	0xefb9b1ae	0xeada06ae
+	0xaafbc431	0x275071ef	0xe8d19426	0x714a2ba3
+	0x81a7c4a5	0xb5599e4c	0x9637445c	0x4af7df96
+	0x5ffb2f87	0xc0aefa6a	0x30a00ede	0xf8ec4413
+	0x2fb53e35	0x1084dd22	0xc04e8437	0x25197744
+	0xb68a5330	0x1fd2f46b	0xda66de26	0xd0db8e5f
+	0xb782db5a	0x34f4a30a	0x9b249d48	0xb0d081fb
+	0xcc18d9bc	0xe7f0f327	0xd651dee6	0xfa7603b6
+	0x3df72308	0xb6e0bbe3	0x0cea0072	0x2895be61
+	0x30e976de	0x3201e40a	0x9e7421c4	0x7df47822
+	0x82a04ba5	0xf9a16c26	0xd76b42ae	0x5b7f7455
+	0xeda1add5	0x60189560	0x875db6fa	0x1315b3cc
+	0x40c629c9	0xf5033d8b	0x10338d35	0x00f5e8c9
+	0xc15acd41	0xe952cb8e	0xfbf03648	0xfab3a0c6
+	0x3c23ac72	0x8206fe5e	0x831da221	0x67d3676e
+	0x4a64ac61	0x98dc0ccd	0x68ffdd6a	0xa2a0edfe
+	0x534d47a3	0xf79b6154	0x3d2bc073	0x50c2b839
+	0x03932319	0x64342c82	0x92d92fd6	0x9a9ba8db
+	0xefb42d33	0x28d07ff0	0x5db4fdfd	0x39225ab4
+	0x37f24ea5	0xa82e9e1a	0x26c4bd1c	0xcb365ab6
+	0x60553456	0x03efa3b9	0xd7b8d40b	0x4858269c
+	0x0eef7011	0x19d7f85b	0x938e59bd	0x24f33de1
+	0x2d466d05	0x3ac7c2b4	0xbb7af230	0x3ec5069c
+	0x2abe2941	0xf5db8b3f	0x902f1251	0x9a6e0bb7
+	0x1d2cc0cf	0xf65d6e88	0x03365f91	0x3a2ecb53
+	0x4a59e1e9	0x0b252007	0xddd6c5b8	0x1c4d54a2
+	0xc1edf67c	0xb066e206	0x6c8c9894	0xe8426c70
+	0xc9f6ec2b	0x425c161a	0xc585a39a	0x064e4452
+	0x5294148a	0x36c0a919	0xc84d33e9	0x1a5fbdb9
+	0xfaec593d	0xd8d248f3	0x2fb18459	0xcbe7a0ce
+	0xd70e9e1c	0x1afed776	0xecd2959a	0x7d8a5f35
+	0xf1c70be6	0x2650b3c7	0xf0c46fa6	0xbf6bb842
+	0xbf279282	0x4120728c	0x7f6b506a	0x87064748
+	0x0bcbd2a6	0x2757fe8a	0x1db17cec	0x7517ef49
+	0xbec921f1	0x804cb1d9	0xb9217e2e	0xb9ec624c
+	0xcdc5e715	0x30bc1f23	0xaca1b3c0	0xf88bf420
+	0xb5a8ac78	0xe93a9e75	0x0d15ac6c	0x12547703
+	0x57a4e428	0xd1404e52	0x03f6e562	0x168cf122
+	0x08da568d	0xdb96b84f	0x533c183c	0xa9dad7f0
+	0xe2cd7e2b	0xc4162c32	0xbff6345e	0x69307759
+	0x98b07a47	0x08f8219d	0x0d604427	0xc4305cac
+	0x294162b6	0xa15a6c1c	0x04f692ad	0xb8da5cb7
+	0x4839cc8a	0x91488ef3	0x08061887	0xebb839ba
+	0x322ad7d6	0x490ac9ad	0x90ce1d35	0x83bf44d1
+	0x1f988e2b	0x7acf6511	0xfc46e340	0xdb66656f
+	0x9fc8938a	0xbe5afc17	0x7349bf91	0x1c36730c
+	0x3b7f643f	0x06a42553	0x6142e212	0x8fb07289
+	0xc9b53580	0xe927620d	0x0e966437	0x60a4867c
+	0xc93e5e14	0xb5d54cac	0xd1c63103	0x30bbcbec
+	0xbd22bce2	0xf48e5a20	0xab393f90	0x0a265db2
+	0xe4805f5a	0x2d0941ba	0x8a877e27	0x141d94bd
+	0x30ef8a0c	0xfd82b15a	0x36c3c125	0x402c1a1a
+	0x0fa86d0e	0xa195b994	0x4c309653	0xbea4fdd4
+	0xfad010e5	0xb7e3cb7e	0xd5bce9ec	0x0e366de0
+	0xc6515a96	0x68ca6f82	0x73720af2	0x5d9a3be5
+	0x16ea24de	0xeac200df	0x7ebb1e44	0x486bba64
+	0xa8c68872	0x53008115	0x968633d8	0x7b9b000c
+	0x0c1aff43	0xd83875a2	0xcc3e1339	0xf1cf9b3f
+	0x5da5f6d7	0xfd5570be	0x649ee5c3	0x0ad7de54
+	0xe4d4c568	0x04d8521d	0x322df607	0x5d0f20df
+	0xf4a8d682	0xed3275eb	0xf8159013	0x3a7ee2d7
+	0x706bb51e	0xac4fa1d1	0xf7245344	0xb5a352f5
+	0xaf84a731	0x073beb18	0x05679002	0x414a0323
+	0x9eb69396	0x9e57bbb4	0xf5765947	0xcf85bf53
+	0x90cb7bff	0x9aca4c64	0xd87c65dd	0x717cb65a
+	0x6598389e	0x75938c29	0x3a73f234	0x265cb77a
+	0x9fdf49f2	0xf6c60084	0x175963d1	0x27f213af
+	0x0d5a9f2d	0x22593c74	0xce596562	0xb41196c7
+	0x707d6606	0x8d953238	0x61481d28	0x2fe1e9c1
+	0x5dd2d437	0x65f8fa05	0x56732403	0xb989d4f7
+	0x917ea769	0xd4bebdbc	0x13d39d92	0xfecf7388
+	0x6f3597d2	0x76147a5d	0x01c51f65	0x0ad769e0
+	0xd96c281d	0x9983cce8	0x4d2bde45	0x151ea741
+	0x99d61b62	0x0d603ea8	0xfc85937d	0x427d7b10
+	0xe8d15c97	0x13ef1e0b	0xf4f79fef	0x62b76eb7
+	0x21d65b86	0x6a72263c	0x166b02b1	0x36b13710
+	0x2ff6fbac	0x1b853cad	0xbdc93294	0x6f5f6b9d
+	0x06ce7ded	0x49120f04	0xc9e09c7b	0x3d049a07
+	0xb606d45b	0x12dcecb4	0xb50b3b8a	0x7c198d4d
+	0xfa0f1618	0xac7968b2	0x33eb7dcb	0x07dee874
+	0xcb4d9d96	0x66eeb30b	0xef1ebf3a	0x06c281b9
+	0x44bfdd0b	0xbe4936c8	0xff238c39	0xc87beaf2
+	0x7b3b032b	0x87e37014	0x09a4a1c5	0x2a60e1c8
+	0x1bd67945	0xbec8a12e	0xf1837ea6	0x7a9a4aff
+	0x7b0a9211	0x00e8551a	0x1f2b699d	0x9b38fdea
+	0x43c58686	0x1d98737d	0x0f772a4d	0x7660c66c
+	0x3bbda6b4	0x42df1fb1	0xc1c5aeec	0xe5f13157
+	0x2926d26c	0x57ab1234	0x47626eb8	0x8b55b251
+	0xf0a4dccd	0x6dc4e449	0x1573d97f	0x26f463c7
+	0x9a87f877	0x19b07943	0xeafc72a2	0x9723ada4
+	0xab30aacc	0x1d6df35c	0xd1c891ba	0xe93769c8
+	0xa58ba86a	0x5d13eca7	0x29d0280e	0x1fb8c99e
+	0x5caaff2c	0x7cbcbdc9	0x64d2cfe7	0x7586ca1b
+	0xdb371ead	0xc5c037b8	0x80bf52bf	0x3d3c3ad2
+	0x6b7e425c	0x113409d4	0xa5e1aa77	0x521317f1
+	0xcc3b148e	0x7b99be8e	0x8362b991	0xc7bf1ee7
+	0xdfbb5ddd	0x94edb425	0xf0ae4ea6	0x846a026b
+	0xeb8befdc	0x54090284	0xdbb22f07	0x8aa40ce0
+	0x23fe1e1c	0x47f383c6	0x3e7e8fce	0x0e533a25
+	0x8a31b356	0x6dfc7274	0x2de64ecf	0x941161f9
+	0x85e6296d	0x25d0f616	0x0a818f46	0x8ba2e331
+	0x3193d742	0x4aad0883	0xa97e4d89	0x6c380aa3
+	0x7cf9f824	0xf4b0880d	0x2105a500	0x4b21aa24
+	0x85a37c7a	0x8b6e6ee0	0xc6907e75	0xd289dd04
+	0x97859658	0x056e5df8	0xbc67be96	0xaf5b7d8d
+	0x70426841	0xe8910781	0x3a2a84cc	0x029a8b16
+	0x4a01f9fc	0x56fc8172	0xa406a272	0x86c6995e
+	0x902a269c	0x3e2f46c8	0xdf628cad	0xe9c917ca
+	0xb2fc0fcb	0x1433c09f	0x720db1ee	0x66372abc
+	0x29e7b946	0xa8f8ae57	0x94a75fb4	0xc5b89188
+	0x46aff2c6	0xcaef0590	0x5c3c8f11	0x1f89b174
+	0x1536e302	0x456b8947	0xc7449e60	0xabbf6bbd
+	0xd7dfa543	0x243a10c0	0x58f4ec8b	0x0bd3f346
+	0x6a7f8d3d	0x9615e391	0x63810f52	0x4679abe7
+	0x35060bdb	0x90518f32	0xef673aec	0x3b119149
+	0xe61749bf	0x105aae24	0x134e5f31	0x7773bf1e
+	0xa317a8d3	0x136a9ed5	0x18d9b8c5	0x2d9ef922
+	0xc09d3a82	0x2fd65aec	0x3c9c867c	0xe13d79f4
+	0xe8f10d6d	0x367416b9	0x08cad24c	0x634ded9c
+	0xff5e5041	0xb95a0220	0x90941112	0xad6a6fae
+	0xabbd6a68	0xda8df1bf	0x64ecab3e	0xad163a7a
+	0x4bbf0be2	0x92dd3c4d	0x14e405c7	0x7259c058
+	0xa925a2f9	0xbe6343c3	0xde477a54	0xbe622353
+	0x68e87028	0xa0e7bef2	0x907c2d70	0x0717cb56
+	0x60162a22	0x9279454f	0xb4bc4db0	0x1444a062
+	0x46ff359c	0x7ef881b2	0x882bc1b5	0x5a5547f9
+	0x9d288801	0xe5e9be86	0x8c22d3fe	0x2c9cfd0a
+	0x1fad5fda	0x23ba1388	0xd0af08a0	0x4f218b5d
+	0x372a023f	0x498a3301	0x37d89270	0xc7f3f2d0
+	0x5bcd1b11	0x3cae2643	0xdb8a3acf	0x760b973d
+	0xea3476ac	0x09795d63	0x3a926c84	0xf668f08f
+	0x962aa19b	0x4a9d8ba5	0x852ec947	0xe742453a
+	0x86436cda	0x12632bd6	0xffd300d7	0xce3e66c0
+	0x1d8fbfa7	0x74dabeee	0x629376c8	0x8dde3458
+	0xbe7f9e18	0x1eef9cec	0x7f026424	0x919e5361
+	0x009daea3	0x66d9ac59	0xbfa09c85	0x86f78426
+	0xd82a9ca9	0x94cec335	0xdbef6b65	0x0507c651
+	0xbb34d330	0x17bc84e0	0xaee42b53	0xcb41b21a
+	0x25b45399	0xea54d11c	0x57e7b13a	0xaec71577
+	0x18fa957c	0xda47937a	0x7d0c72a6	0x2ce6856f
+	0x5d513cd1	0x48560d4b	0xd0505c7e	0x75060791
+	0x8ad85f16	0x8ee29517	0x029144f3	0xe811ce82
+	0x49790987	0x890a38a8	0x4959350d	0x85120232
+	0xc40d93f6	0x8419b3f7	0x3d1938d1	0xa0fb7571
+	0xf2a22104	0xa8eb4259	0xe6b69491	0x6367059c
+	0xc5f4d067	0xfbb99b36	0xe22a7fac	0x1aa67168
+	0x4e352bcd	0xc02b9339	0x4dcbef0e	0xe72cb674
+	0xe91e6e6a	0x6ded5223	0xe8520b54	0x842d4e80
+	0x4caf72dd	0x40eeb737	0x7c213234	0xa169be4b
+	0x6a88b02a	0xce540994	0x280cb749	0xa5c13190
+	0x0067bae1	0x26254839	0xcab1fc69	0x630b961c
+	0x8275487d	0xbb8b20f3	0x757de8f1	0xb652de6e
+	0xfa845694	0x4aeb9f77	0xf477f13b	0x18f42a8c
+	0xfd6a12f9	0xa97f9a78	0x8b56105c	0x765f4381
+	0x1ac648d9	0xea0b5b90	0x526bf787	0xe975c883
+	0x8cf8c115	0xa9d20628	0x3f663ddc	0x6e1bb3f6
+	0xf3852873	0xb8296270	0x7e3c9e91	0x45e48c69
+	0xb1a875b1	0xe4a210ed	0xe2552d56	0xa78fad94
+	0x970ff726	0x95a4beea	0xf9d5505d	0xfc87ac3c
+	0x179da815	0xee295504	0xecccdf4e	0xfe9786a2
+	0x9536ae1a	0xc130fc4e	0x10e2738e	0x27aa298e
+	0x96613a99	0xcd92fe53	0x8e7b1cb7	0xd708df30
+	0xd45c95eb	0x34d09a74	0xa746f62d	0xbfcbceb3
+	0x925da8da	0x0da0aa75	0xe44f0e36	0x06982962
+	0xe5471959	0x56a37f36	0x7a5c58f5	0x82386903
+	0xa7e18350	0x3c00ad76	0x33affdea	0xa179837a
+	0xfcafe757	0xd0b14701	0x7f9ec58a	0x878407f0
+	0x229afe49	0x2d6345bf	0xe3399a6f	0xf01376fe
+	0x689f49eb	0x816b6543	0x4c6735cc	0xe596f327
+	0xca2604df	0xf089bd37	0x2b554507	0xb830a463
+	0x2fef8d6c	0x9b70f1dd	0xae54c418	0x899e40a5
+	0x85ecfe99	0x8016eb0a	0xefd1150b	0x2e3b2e2b
+	0x8d9a2ce2	0x94af20ef	0x96d16f0e	0xa1644c8f
+	0x7181fca0	0x79eab0b8	0x10c0e6ff	0xfef780c8
+	0x54202790	0x470e8daa	0x2e63a9b4	0xd3e91716
+	0xd435d270	0xe63f7af3	0x2eb78830	0xf4c6f669
+	0x27240ae4	0xe6206d76	0xae9639c5	0x9299d54b
+	0xb8bcbf88	0xa2b90455	0xc94aeb91	0x5b23387a
+	0x18434a0d	0xcd8562b4	0x787d88c1	0xa00161e5
+	0xc5a526e2	0xa4ac9832	0x377cdd34	0x7bd3e6b5
+	0x9b19c204	0x208d76d4	0xc22dba4d	0x7c72c839
+	0x4aa16eba	0x1dfbcdfd	0x824f3395	0x560b6ffb
+	0x9cdce848	0x925b6be9	0x37649256	0xe1e06b14
+	0x34ba53b1	0xa81b7478	0x9ae2578a	0xab07c5ef
+	0x496f97f1	0x40ba5c08	0xd34fb442	0xdbccf108
+	0x24211f41	0x9a3c6829	0x1ea2c1c3	0xb3545a48
+	0x967a5e54	0xaf506484	0x6cec3593	0xc1bc8d22
+	0x35142a18	0x8352db87	0x18a9c31d	0x900c54e3
+	0x0e07f4e7	0x8fa7248f	0x80c2af22	0x115c188d
+	0x14d68800	0xcfac8e36	0x777cb6a5	0xc1f2879d
+	0x23fc81b6	0x2c864c6c	0x0e8dfe68	0x451fd26a
+	0x4b65b016	0xe3a5141f	0x8323b451	0x62e5cdba
+	0xec14db6f	0xc8de546a	0xe29e8674	0x187681a4
+	0x31d91dd6	0xbf21549f	0xb670f1f9	0x2accef94
+	0xd9255c53	0x1ff2b607	0x69dcef61	0x5806864f
+	0x736d774f	0x44701bb2	0x6007ce5f	0xcbcc4c13
+	0xfb7ef6bb	0x6f2ea43d	0x791bad8d	0x6c0e4c02
+	0x600853e7	0x95258757	0x4aaf3143	0x4ffbee3a
+	0x166847a5	0x1b5b21e8	0x3d56cf37	0xc11e2fa8
+	0x7df56f7d	0x4f193858	0x36da7870	0xe29ae1ab
+	0x2571f278	0x7d81f452	0x37ed737d	0xe4d109d5
+	0x8b0d7bf5	0xdd8fae7c	0x1691cb26	0x94bf321f
+	0x8aad839c	0xafe85792	0x694eb2c8	0x8a256274
+	0x48dd295a	0xd07e2d18	0x031b5e4c	0xe9059897
+	0xf98cfd9a	0xe46dd735	0x1185fea1	0xa4123e79
+	0x5f123825	0x54b6b92c	0x32cf6a3e	0x3ab5bb75
+	0x18cb657c	0x0971a1bd	0x70aefd2b	0xfa48beae
+	0xd6a57c5b	0x289ffd4f	0x9feb0a93	0x3e19add2
+	0xe99862e3	0xf0db195a	0xa28af96f	0x9a22b6d1
+	0x077800de	0x74687d2f	0x77bf648b	0xb0e6b32b
+	0xfc91951c	0x0b30916f	0x6bb88661	0x7e99e24e
+	0xb35ab07f	0xdcb43d79	0x578ff682	0x5d8e242b
+	0xe5643628	0x3b84abc9	0xeac7cd6d	0xe811eb8b
+	0xae728ed5	0x0235b55f	0xa0b6d2e5	0xca735341
+	0x4bb6eed1	0x3a0336f5	0xdc365965	0xe159015d
+	0x89e52c09	0xc3d9429e	0x4638e951	0xdfad21b8
+	0x0650f1cb	0x61b2df08	0x0bca3a7b	0x58def8bf
+	0xf9be3645	0x475c2308	0x4f3808f9	0x472a95d5
+	0x9f557c1e	0xb6427b22	0xa5edbb0a	0x8a0787b1
+	0xda40c48d	0x445e50ac	0x8c01527b	0x21dc6254
+	0x14bfaee0	0xeca3a219	0x0e2dbdf6	0x6ab66c33
+	0xbd20d715	0xb65e8e67	0xec888c3e	0x5023fbeb
+	0xad4c82c4	0x5f793ba6	0x28d79a02	0x23948e5b
+	0x6f1503e1	0x37604f55	0xa6bcdbd2	0x998bc834
+	0x8f372c52	0xdfe4110f	0xad098b4d	0x3d49720e
+	0xa229229e	0xc2c0cf38	0xbe32eafe	0xe992cae8
+	0xe19c55ff	0xfb38fc31	0xcaf2c5be	0x3a61f1aa
+	0xea316472	0x3973d416	0xd047814d	0x5f86de99
+	0x09f5d09c	0x220c0773	0x93c04b91	0x99f3099f
+	0x5fd0948c	0x8abc9565	0x70818172	0x7dab758a
+	0x50415032	0x77bb8a97	0x527c0cfe	0xb9c3b837
+	0x105822e9	0xe286154b	0x1c00f912	0xfe7825c8
+	0x9b76bd3c	0x0af6a65b	0x23215707	0x8836d3c4
+	0xf44ce91d	0x417b6212	0x8f28ec23	0x3f0f597f
+	0x2caaa865	0xd7ff95c7	0x4d4d4458	0x732a75b7
+	0x1d3031c4	0xf8ad5064	0xda73dc99	0x431864af
+	0x38d7bbd5	0x332a2d0c	0x347e68ea	0xbfe2ecf2
+	0x74f6ee17	0x7cdf983a	0xef7dd066	0x1262bdc0
+	0xa7efbccd	0xf3ba76b8	0x3815f62f	0xa1fe8170
+	0x52897deb	0x20f8dc2e	0x5a8953f4	0x8fcc182b
+	0xf6d4dad0	0xfe7fa13a	0x1778ee2f	0x2f289b50
+	0xd9f69db2	0x32d125b0	0xa3ca42a3	0x3075c1d2
+	0x59e7b61c	0xa734845b	0xf183a080	0x9530fa32
+	0x6c59a39e	0x420410e1	0x9f76df13	0xdda0a047
+	0x0073a389	0xe55e57bf	0x926c3ba1	0xa9a94122
+	0xa1283d02	0x74f1e874	0x332b8e81	0x812f3e9e
+	0x81577778	0x30d86799	0xec4960ff	0xd446557a
+	0x49f05905	0xb9fef70a	0x30d403dc	0x6a4498d4
+	0xdc1a7e15	0x445bb9a5	0x1455ba4c	0x9d4a37a4
+	0xeec57bb1	0x34ac00e0	0x7127c2f7	0x44b5a260
+	0x9c71f1f8	0xada2be3d	0xe1cec205	0xc163f099
+	0xe0dca849	0x86ab7f72	0x5c6f4c92	0x93b0eb07
+	0x7ec203f2	0xcc399989	0x75bb2533	0x89ec7a1c
+	0x118371b3	0x7497d553	0x03f2d03b	0x7e7b4d81
+	0x478b1cb4	0xe4801e36	0x808d7527	0xbc1d3ea0
+	0xb297b06f	0xa579d810	0xf07aea4f	0x9e6dd0ef
+	0xad0240bb	0xfd5b94d1	0x0f8037fa	0x944d3fff
+	0xc6fc7d3b	0x4c9761f3	0x68440387	0xc0496074
+	0x32cd1609	0xd67b2de6	0x700adfc9	0x2d284f80
+	0xcc5393b6	0x32d83e64	0x2ac02cc4	0xb759a6bd
+	0x9d8a2f64	0x2ef1b8d8	0x0f574410	0x4cb81db6
+	0x922af2e1	0x56231889	0xf4353d11	0x6d6e9050
+	0x4523c317	0x229d9291	0xbc16016d	0xf1381dff
+	0x84f6e1b7	0xc7378275	0x7045561c	0xd4736ef9
+	0xb863b8bf	0x902bfe68	0xb0811fda	0x9df8d9b8
+	0x6ad9c691	0x4cdf381d	0x68be4e7d	0xd03f2cec
+	0x8166ecf6	0xdcf45f29	0xfbbc6dd0	0x791cf886
+	0x3639c902	0x1f1dab00	0x1abb48ce	0x9f2f4d79
+	0x992b2df2	0x44e8ae22	0x7fa777d4	0x62f1a754
+	0x57448154	0x662948e3	0xe50c5f0f	0x83adfbc2
+	0x669f3fd4	0xf4bf4a87	0x0a1b01ce	0xef6471b2
+	0x49778a6e	0xe470e785	0x5fb3cb5a	0x9767dad7
+	0x04c4f262	0x9cc1944a	0x8bf5062a	0xd316b454
+	0xbed231df	0x9f9e1984	0x915c06ce	0xbfee9689
+	0x6d1b7d27	0xeadc62e0	0x85fe6b06	0x97a92ce4
+	0x879344a7	0x8ce19261	0x48508a42	0x7f63ec53
+	0x05de4fea	0xef725c06	0x23c17065	0xa8c4ab97
+	0x8e304029	0xf25c4857	0x3ddbaa04	0xfd325479
+	0xd6eb3fd0	0x25f8ed38	0x67e70d61	0xe894d72a
+	0x5fc7779a	0xa862b7e4	0x27a93aee	0xa3c8807f
+	0x1dcd0622	0xb90b336c	0x7b89617c	0x300bea80
+	0xbbfb1898	0xd61dee74	0x80ce1142	0x4829c4e9
+	0xbe50282b	0x41a5ed8e	0x27150e7e	0x86f18198
+	0xa9bf6e31	0xe4f36079	0xa5c241ab	0x61ab2326
+	0xbf7be24b	0x4c87e8a8	0x170a4d05	0x05941c41
+	0xd0ea7712	0x505b8ad5	0x33ab4e89	0x334ea7de
+	0x32119057	0xfbaeb5e7	0xd00a75b6	0x8e467276
+	0x8260a778	0xbf2d6a39	0x139ef440	0xa7b44a0b
+	0xca0a2442	0xbfd7790e	0x353f6026	0xa418156a
+	0xabc15fad	0x365ca72a	0xb9c5f379	0xeeb91216
+	0xae8a7e67	0xff621bc6	0x5f6767b4	0x703e08f5
+	0xa91b4d87	0xcbbeed4d	0x0f7aeb4f	0x7d7b88a8
+	0x3144ff32	0xbbde4be4	0x1a9af3b1	0x218b80f4
+	0x000342ef	0x0752f7e6	0x98ccb7bc	0x58fb806f
+	0x32b3a302	0x67435abd	0x7462e773	0x3cbbb910
+	0x391c6346	0x939e79b3	0x28cde352	0xbfa8866b
+	0x8a4dba83	0x14dcb04c	0xf2f9f462	0x5fdf6d07
+	0xf0a8de85	0x63046ef4	0xbc007be0	0xa5014d97
+	0xb966e6e8	0x31308a90	0xd5fc5756	0xdd21483d
+	0x4ab980b8	0x48b8708b	0xdcdb9363	0x9188fcc3
+	0x790c58d6	0x2c1e2cc3	0xcc621f2a	0x4c36fbc2
+	0x739f934e	0xf666cf77	0x5082421a	0xbe98a7d6
+	0x722fb2d0	0xb8bd4af7	0x371c6eb4	0x13141930
+	0x73320cd1	0x2085f28f	0x49dafcb8	0xe5627dce
+	0xcf40e9f5	0x279fb8b1	0x61775564	0xf9751e18
+	0xc9a50230	0x54aead9c	0xf295e9c1	0x5edfcc4a
+	0x965eee7d	0xd4a0fb0f	0xbc1c32bc	0xd63bb4aa
+	0x9f5e3cfd	0xf0f1f047	0x1a1bb313	0x762a6e08
+	0xd1e112fc	0xd07737cc	0xeb85de60	0xa81adb27
+	0xf56a8804	0x927e4a07	0xa03f4c55	0xa75c038c
+	0x4aa72639	0x856b7a63	0x8e0b5b09	0x0b650c8e
+	0xdce67a0a	0xb093aaa4	0xee9c495a	0x397c9b72
+	0x00201e9a	0x0f3654d1	0x44303f3e	0xdc708b39
+	0xab8bd5d9	0x1ed28dbb	0x1e91ab78	0x9357e946
+	0x0591f394	0x3f174806	0x7e5363e2	0x10d73f05
+	0xb18094b7	0x5c0cd26b	0xffa4c529	0x914ded6b
+	0x247a68f8	0xec8a2133	0xe368fe87	0xf18c26fb
+	0x8e442fff	0x39ea6ecc	0x9743be65	0xcac5d694
+	0x24c4bcbe	0x2edee596	0xbd052bd1	0x70adaca0
+	0x30c241a2	0x62b3f644	0x061f6b48	0x2fb91a6f
+	0xc92df68d	0x73d41f19	0x3c18cae5	0xa04fbf36
+	0x0ee5c645	0xee7973d9	0x7eee5dec	0xf11a3fc3
+	0x06acd8c5	0x8ea5b050	0x652b3270	0x0f1e47fd
+	0x82ba02c9	0xba7622be	0x9031734e	0x29e08f94
+	0xe204f41c	0x95d57dde	0xc178791d	0xb4af2e68
+	0xaf7e788a	0x17925d4b	0xdf417ecf	0x9193b6b0
+	0x1ca32a5a	0x767d122a	0x0718eea6	0x1da6aaa8
+	0x30497c08	0x32a6b264	0x7e0d781c	0x040010c3
+	0xda2d6754	0xa3f9bb71	0x40ca8c26	0xea70e76a
+	0xc90365e0	0xe6102f4b	0x728b93fa	0x8c9b288e
+	0x9acf17a7	0xe1164350	0xf0103d84	0x3201abfd
+	0x28e96191	0xa85a975f	0xfd89e4c5	0x33b397e3
+	0x688bf58e	0x69d4bfc9	0x38d9d38d	0x395c61c4
+	0x46b33a28	0x59d8b30d	0x5fcd406a	0x36dcf494
+	0x3e6e1d45	0xdad47f30	0xe23d6c85	0x05c0f5da
+	0xb2eb2523	0x617f5209	0xc4bd50ef	0x9a40d446
+	0xf6706e43	0x8a41211b	0x141e5cdd	0xe5f4763d
+	0xaadf5d59	0x34ecff99	0x4ebc45d5	0xdb4b1578
+	0x33ec85da	0x67ee6b0f	0xc5789628	0xf67e6663
+	0x1b19bab3	0x58620745	0x3e1929b3	0xa3ef35c1
+	0x6233b038	0x928c9bde	0xfc1a74d9	0xe290e8e8
+	0x2dc2b3ce	0x13533357	0x865397bf	0x551b56cb
+	0xce7a7ef5	0xa3788428	0x7eeb6f73	0x7537f3ea
+	0xfdd77af1	0x35343358	0xca248bee	0xf3726d8b
+	0xbd027aff	0x43cbbd5d	0x4627b904	0xdcaed70a
+	0x3f17a9df	0xbf2158fa	0x6953f389	0xb2bb4bcc
+	0xfd56ff25	0x482cb729	0xa7c7d9cf	0x029c2e69
+	0x4f3605c6	0x4f148ef9	0x29b6c0a4	0x2f556532
+	0x6a298f9e	0x25945e4b	0x0a464d76	0x1fabd60a
+	0x7f4c7d56	0x3b138677	0xa4d89ab4	0x5ccd85fb
+	0x8c39f4e2	0xe77261b0	0xc3f3e6e5	0xdbf298ac
+	0xe18fa767	0x89b19fed	0x65f32b00	0x042d50cf
+	0x769900d8	0xf2c8dcdc	0xcddd6fa8	0x125af4db
+	0xff808661	0xfd607112	0xcd9b7d51	0x65189811
+	0x125c6011	0xec46f0b4	0xabbaa61a	0x35e5ab40
+	0x0b66213e	0x8f0b1471	0x54a54816	0xfd70f393
+	0x8efe0bcd	0x9727c46b	0x3f91f2b7	0x60d13926
+	0xbf074154	0x5ff54e1b	0x9b7aace3	0x5507beb8
+	0xb54dd8b3	0x4bd21318	0xc16e8f89	0x75aef7e7
+	0x42520647	0x71cc3319	0xe9bcb41a	0xd0b016fd
+	0x98fbdf6d	0xb124aff6	0x81b21f00	0xf5025987
+	0x629e381b	0x3d971a74	0x2d20c3e7	0x1f990330
+	0x9798ef1a	0xab4c06cd	0x9bcdbde3	0xf58187f1
+	0x5349ee2d	0x9befe269	0x92512cb4	0x7a90a7fa
+	0xc8bcb803	0x7213b43d	0xc54b82ec	0x57395c83
+	0x80483b13	0x9d9e3384	0xfe9e19f5	0xbd75b346
+	0x445ecce5	0xf549df86	0x43abdfdb	0x579c16ea
+	0x2d838513	0xd8c030a2	0x0f26f21f	0x86dd65c7
+	0xa56f5587	0xaae5e6eb	0xff6cae9a	0x2b6a5082
+	0xe8cfea92	0x426e5b12	0xeb6b5e11	0xef748b88
+	0xa7c52873	0x884b93ae	0xeec07e07	0x7f822b08
+	0xc88c1c51	0x2fdfbfcb	0xde46bd4f	0xc0f72284
+	0xe5afdd1e	0xc831d473	0xf3b02b32	0x610530cb
+	0xdc57ebbe	0x0789b8b2	0xb1e004fb	0x98954e9f
+	0x56e27413	0x840b2e16	0x53af5141	0x05cc609c
+	0xa5652e91	0x982ae5ed	0x757c75a6	0xd31d253f
+	0xbff9ff00	0xf7dedf5d	0xb7a15617	0x514aff52
+	0x4c04184b	0x9e7a31e9	0x31485a41	0xead3407e
+	0x50e1cecf	0x601f296f	0x85d903dd	0x54308603
+	0x877a8cb0	0xa0f0949a	0x3cd9dc5e	0xa62b3ca1
+	0x79db50f1	0xa49b5ffc	0x7afa975c	0x1007d484
+	0x7700bc31	0x2b8431ed	0x8f1c2ccb	0xd26b396d
+	0xe6a2abb7	0x64f78fa3	0xace8788a	0x8ba6f357
+	0x01cb3b57	0x60ea304f	0x44bc28f1	0x2e16fa08
+	0x4e9a2b65	0x89c2a14c	0xc521051c	0x2bee04b1
+	0x10c0bb27	0x1ab75887	0xd819df0d	0x0b21368b
+	0xe924da32	0x628af541	0x6d6eb08c	0x0a418b53
+	0xac19e5cc	0xb2704fba	0x759df88a	0x76df6bdd
+	0xb2ed3a34	0xf52af31a	0x44f6fb45	0x8885764b
+	0x6397d609	0xa5803b66	0xbd3c3ee9	0xfd91fc62
+	0xa92ad0e7	0x4075feea	0x1b73b846	0x1840a431
+	0xc23ea4d5	0xf4be4c2e	0xe45fb99d	0xbc96c887
+	0xa707bacf	0x40adabb9	0x2b1a8d08	0x05d5f8e2
+	0x94578102	0xd032c431	0xe633de5d	0x9fa46925
+	0xe4f78f93	0x09b5a508	0x68797087	0x75a4cf41
+	0x68f34d2c	0xbc9d676a	0x939c00ec	0xdba51b90
+	0x9bdab841	0x96c079a3	0x4c926224	0x046417a3
+	0xa3090fe1	0xe2395840	0xff85d732	0x16eb0672
+	0x1f2b4c36	0x10432695	0xea175319	0xac6b4fec
+	0x22abeca3	0xaf42dfef	0xed67fef5	0x556b9185
+	0x79318868	0x013082bf	0x882b4c74	0x17232518
+	0x5ab0b8a9	0x565064e0	0x61bde558	0xc2f9f27d
+	0x08d57cec	0xe02dd914	0x7e9a5972	0x856d0859
+	0xe5488341	0xa0dd98de	0xa3c88a46	0x22c7bbce
+	0x5924efc2	0xd15e2a36	0xfbabdd34	0x19e4838e
+	0x1510c1f3	0x70f94986	0xde0505a6	0xe34df2cd
+	0x39bc87ba	0xb0b6a36a	0x35bfd415	0x8b71c8e8
+	0x074bf788	0xc7322d81	0xdfe4c9d3	0x14e4a913
+	0x1d559696	0xc539cac3	0x91b6dd2b	0xc198e564
+	0xc762ea2b	0x8b7f7f5e	0x3928468f	0xbf5e5a5a
+	0xe5151ed4	0xf7abecf6	0x379c3bde	0x81ca5b6f
+	0x6da09c5a	0x361d2f8e	0x7b38f326	0x0906a7ab
+	0x1afafd4d	0x24fbcb5f	0xf02ed4a9	0xad2f8a2c
+	0xccac956a	0x9a906a0d	0x55742842	0x08a7d782
+	0x250e3581	0xd2328a15	0xcf943410	0x0c90aabb
+	0x158fb11b	0xfb4c7ec3	0x51784a26	0x00b63b38
+	0xfa9d20fe	0x6c3f5841	0x91204efe	0x70471fcb
+	0xd7158a2c	0x09dc4685	0xefa8ef7e	0xd9e5c6b1
+	0xfcc7c7f8	0x8f6fc8c1	0x4217f7a4	0x41e6d387
+	0x26b12c91	0xe547e92f	0xe0a03d8d	0xe37b6003
+	0xccd60f64	0x43a58a44	0x83ab597a	0x084b5c9a
+	0x73f053c8	0x7590140d	0xad7d7fb7	0x9f1c8d60
+	0x2f96ec1e	0xd73ceb36	0x18c9db5a	0xb144c70f
+	0x745ca3d3	0x4b6a2615	0x09b7a09e	0x5c9e6f60
+	0x60431f35	0x13fb02c4	0x6a6a2aee	0x0052d8e0
+	0x3f120080	0xef5b3906	0xaf071511	0x981b4584
+	0x7e21a2a6	0xe6fd2e96	0x67f460e0	0xc2f8f323
+	0x22538f24	0x042f44e3	0xf271ed0e	0xa6fd7882
+	0x0a469528	0xd1997489	0xa005e740	0x1b37ed35
+	0xc546aa6b	0x5defa5e7	0x0df0e3b1	0x20de0573
+	0xafdaf222	0x4efa11c4	0x129e4d10	0xa5b36477
+	0x3cfd82fa	0x143f99ce	0x6277d132	0x41bc6588
+	0xa96832b8	0x8e448a33	0x64d475b3	0x0d03dde7
+	0xb9b7274a	0x7c43c3bd	0xcd7dea08	0x64f213a9
+	0x4e5e3b17	0x59f0ccf5	0x149d6092	0xb3da7ff0
+	0xe4bc1141	0xd6e3ad13	0x309b6d3f	0xa8bc2b2f
+	0xfe8c49c8	0xfcb93795	0xa21e6218	0xfa789db6
+	0xeda40d1b	0x8a571368	0xb20288ba	0x8f590d4b
+	0xe2d350ee	0x55de37b7	0xa6b1545e	0xd34397bf
+	0x2ca3cb72	0xc858a6e2	0xf18eb4f0	0x13162f7c
+	0x3c73d583	0xf42f4f2d	0x2190c996	0x5842aeb4
+	0x0fb8fac9	0x91835b21	0x768e94b3	0x0ee40fa7
+	0x0bb4abf4	0x5d634b0a	0xf05614d1	0x8421bf96
+	0xadc9bc41	0xc3c25730	0xead6783d	0x6b26a26e
+	0xa5654315	0xddfdbd76	0x0e9efb4b	0x2523aeec
+	0x0ded6345	0x9e745201	0xd74941e6	0xde1a8779
+	0x8369587e	0xfe9e7ff8	0x7361da63	0x3b392b9d
+	0x294fda91	0xd2bb0865	0x2584a967	0x2eaa63af
+	0xf24d9e7e	0x02f0b739	0xe78adfad	0x803d1b65
+	0x4fe08993	0xbbb8b6fd	0xee720db4	0xb9bc4da7
+	0x05d068c8	0x3e76a5a6	0x7ff1a6ca	0x2370982e
+	0xeea006ab	0x39482f79	0x9887af2c	0xdba4de83
+	0x9ecd4cfc	0x6978eaaf	0x1c910836	0x90abaf2f
+	0x66fbbb3b	0xdba1eb1b	0x7c5d8640	0x10e2b54a
+	0xbc9bae3b	0x4ab513c1	0xc3916328	0x923f610d
+	0x8a55ff24	0x3efba683	0x25f2c4be	0x58e5374c
+	0xd307e907	0x48ea462a	0x2dd7509e	0x870a5dcf
+	0x08012046	0x3cd12b1d	0x6a47b79b	0x4113492b
+	0x652e973c	0x9249d11d	0xcd2703e1	0x2fbe5959
+	0xbe07c47e	0x441a0496	0xe7a6c7e5	0xf7cbd2ac
+	0x44fca640	0xb264be8a	0x87b3042a	0xd347d1fd
+	0x8dbb5347	0x60a9b650	0xa5fa99b3	0x6745855a
+	0xea6324e2	0x380882cc	0x7d220119	0x344e1982
+	0x906ade50	0x24e90f8c	0x490d112f	0xf111aa2e
+	0xb08f13b7	0x8e1d7590	0xe9370ed1	0x62eb39e0
+	0x35927fb1	0x829a40cb	0x0806336a	0xbaa04062
+	0x9939850a	0x0869ac12	0x54b03562	0xa4f5c614
+	0x392c62cd	0x7c23d63c	0x85fd1195	0xb7ed5546
+	0x686e1f4f	0x55edcc7f	0x3094818f	0x2537a964
+	0x664d5c0a	0xe80e1cbf	0x7948cae1	0x23c64375
+	0xd418e137	0x78c3642e	0xecc9da92	0x79aa46e8
+	0x59be9660	0x88058e58	0xc3c31420	0x378a39d2
+	0xad44e929	0xb3131130	0x11a55e4e	0xf34bec26
+	0xdb1bdb5b	0x0e9c986c	0x21472aad	0xd10cb0ad
+	0xcfa7f425	0x8cc73d4c	0x935ad802	0x8a8252a8
+	0x4ef3c4af	0xa9ea8d4d	0x8b8d2327	0x49221fa4
+	0xb7a9a150	0xe635f856	0x37df5260	0x8d47a600
+	0x736ff5bc	0xfe702551	0x622bb56c	0xafdf67b9
+	0x394d0c63	0x1895e424	0x788eedd0	0xb8e7f6f6
+	0x57a690b6	0x7f37de59	0x5f4cf3e0	0x1211b1b4
+	0x9fd82e02	0x5c21f2af	0xdc016937	0x5c3a60f6
+	0xf7729837	0x77758003	0xc470bc58	0xed2622e4
+	0x88ba5184	0x18418beb	0x75659944	0x790ee40c
+	0xd7db7e2e	0xb263b2ed	0xae90b658	0xe31faa45
+	0x084b7b2b	0xe2817433	0x5fb477b6	0x05b99337
+	0x20897d5a	0xdd5349f3	0xb6de2ced	0x0ad02021
+	0x667a11e2	0x45fa8d58	0x7d9f7b52	0x982be1bd
+	0x80d9b10f	0x1311fdbe	0xfd0c3612	0x77d03036
+	0x9fc16296	0x60e450a5	0x329af69a	0x2fcd48be
+	0x9c61579a	0x398ee2e5	0x18d52ae0	0x2e6d52bb
+	0x0b1d391e	0x17d677a3	0xa56308dd	0xca961ae8
+	0xaa08b85d	0x230a894e	0xfd1bb53c	0x40f070c6
+	0xe536f86d	0xace6b686	0xb2ee8045	0x3ca0ca1c
+	0xdc14297a	0x016e04bd	0xd298babf	0x1775685c
+	0x25eeee81	0xeabf3996	0xdbac64c0	0xb644a8b1
+	0x1d034410	0xee2f26f5	0x646f8804	0x0a219178
+	0x88b774f5	0xb7757133	0x3ed44b66	0xbafb3535
+	0x7f28dad2	0xd9be6e16	0xc1ee44aa	0x6473e8c3
+	0xce6a8d51	0x58996952	0x74d779f5	0x7a332ec1
+	0x93b1ae48	0x072f4696	0x91a59962	0xd1b4650d
+	0xdf7bc203	0x5a1e01e1	0x0cc1c256	0x5f038178
+	0x316dfbd6	0x6b6066c8	0x88d3c99d	0xf4593234
+	0x7744e3e1	0xb986b226	0x122c5c78	0x98c304b6
+	0x8d8e5248	0x258ad65d	0x887d2b33	0xddbcf246
+	0x1079b709	0x69e5336c	0xaebbc436	0x021f40cd
+	0x1c5c888f	0xadf4031e	0x773c6a1f	0xca6a4b54
+	0x678a48b0	0xa83766e2	0xb51fc797	0x9378d2ff
+	0x24617e89	0x63b6f24b	0xdff10c7e	0xd7899313
+	0xa117de13	0x9ce9fe62	0x93568bd0	0x79525643
+	0xe73d74ca	0x6fa05775	0x16532ef4	0xf158297c
+	0x43d5b180	0xb3713768	0x42f5c74c	0x360674db
+	0xd503b365	0x85f2e190	0xe02701bd	0xc4f72047
+	0x9f0e8c3b	0xcb74c0d9	0x26a763f3	0xf052587f
+	0x1e6382a6	0x98957c55	0xf84848a6	0xc899e8a1
+	0x8baf0ead	0x04efc2de	0xfe51e034	0x31838b1b
+	0xfc488265	0x54c21df4	0x3a1a09df	0xc3197a60
+	0xf82505eb	0x01b09802	0xde6c5986	0xfa64e8e7
+	0xd46b602b	0xd4b8abae	0xfd712f8c	0x374a2d31
+	0x10bdfd5d	0x8b2c581c	0x11b999ce	0x93cb6b25
+	0x03f83c15	0x5e2ca149	0x3cf835ac	0x8952786d
+	0xde9aa5f2	0xc64c816f	0xcd56d134	0x6341ba5d
+	0x48f8b46d	0xa6465fc8	0xf17c3199	0xf8945500
+	0x52591640	0x126a5e9b	0xe4ef95ce	0x092ce906
+	0x60feea4d	0x3ed8d81b	0xe13b4585	0x3699ea3f
+	0x3c99d800	0xfb45a4c6	0x80b9af7b	0xdc1a8f13
+	0x42793d11	0xf5b680b5	0x17443c44	0x339178cf
+	0xe9122d87	0x60c79f06	0x2516b5c1	0x5225d594
+	0xeb2dcf80	0xcfe02eda	0x7719eab8	0xf4beaf16
+	0xce7d36ad	0x49a95435	0xacee9deb	0xc79cd246
+	0x8ed659c5	0x66894b11	0xaedd26b6	0x9ce7d941
+	0x294b5830	0x105962ad	0xeb5b34e6	0x31917645
+	0x122c34fa	0xc7c82bd1	0x6ee4ea9a	0xe2fe7f27
+	0xb1fd4c3d	0x702e9bff	0x7788ddba	0xbd3d942a
+	0x75159d12	0x6aaec1ca	0xc3b4abcd	0x37a69572
+	0x1fce87c2	0x01fbc543	0xacdd6775	0x2c7890d1
+	0xbc1563c1	0x413dd754	0x5b7970d0	0xfef5b1ca
+	0x8079af11	0xd551824a	0x5409896f	0x54e0be68
+	0x8bcd30ff	0xc8375f42	0x30c06a2f	0x779c737d
+	0x32d3e66b	0x7bd05d0f	0xb9c67b23	0xf273695e
+	0x13528262	0xe4a790e9	0x0805aaea	0x3907f7c9
+	0xd7abc54a	0xa4cc51a4	0xf49493f0	0x472aa285
+	0x4dbed2c4	0x4864edaf	0xa46700a8	0xd7542f0c
+	0x7c0ae286	0x951dd824	0x3c73e333	0x52eb49b3
+	0x70516de8	0x7efae010	0xfe0bb650	0x786eb317
+	0x43fb3ab7	0x4c86f7b0	0xab0c578a	0x59787f35
+	0x719e2575	0xe5c919b4	0x26076c48	0xf4c5cee0
+	0xa832e1c0	0xe0e719e9	0xeb978049	0xfde5093b
+	0xe1c5a86f	0xc0ca654b	0x07140b4e	0xcee94a0c
+	0x684f8c9c	0x0dc722ef	0x3f81b654	0x24f6b59e
+	0xc9366802	0x07317ae5	0xb07bc322	0xa68d61a8
+	0xfba88f10	0xdb077c88	0x2e2d4cae	0xf950f615
+	0x0eb4b1d4	0xcc43df94	0x7f76068d	0x9998b11a
+	0xd8c4c734	0x2444116b	0x6f387abf	0x402ba3a7
+	0xb343b091	0xbf1ed457	0x0325a66e	0xac685f81
+	0x3b13da49	0x71bfeadc	0xb706c3cf	0xc18367a7
+	0x74e05a7b	0xf15ce88f	0xb7effab8	0x8e79599b
+	0x758e0fd3	0xec60aff7	0xa36b3584	0x978555f1
+	0xf03e26ce	0x05b7f39f	0x0f44d1e7	0xdb301d27
+	0x2734c001	0x1ba4bb02	0xbed0c57b	0xbbb082d7
+	0xa0f5c163	0x7b081aff	0x8f6020f0	0xb2363b33
+	0x50fba5d4	0x8f862718	0xcfd4080e	0x31881dec
+	0xcea35f4d	0x0ce550bc	0x968bcd16	0x701e96b4
+	0x70104a77	0xd1381316	0xfa0b6bf6	0xd0800a1f
+	0x30dd27e3	0x53396989	0x58066430	0x6fe20758
+	0xe4776597	0x85bc8231	0x6f013aa1	0x8b0f1a6c
+	0x1d41e906	0xd476acb1	0x1f50f428	0x61ebc0b6
+	0x78c6389b	0xc70b922e	0x4d4c6fc5	0x97931134
+	0x9d157c3c	0x053d63fa	0x4ee4dbe3	0x351ccb06
+	0xdabfd086	0x6759fab0	0x277549b8	0x7a265b93
+	0x35d1a141	0x972395a4	0xffd773c2	0x9ba52eb4
+	0x41574c66	0xd4195554	0x49ccaa22	0xfe228bd6
+	0x6977e1af	0x100a9948	0xb6c9667a	0x276c9a27
+	0x169ba199	0x395986bc	0xa7079788	0x40b6deb8
+	0xe74c106a	0x620f202d	0x32b4ee73	0xe7916e7a
+	0xc949eba9	0xbf56f13f	0xa76139d6	0xfdca38ac
+	0x7a295c2f	0xebdb2f5f	0x452694f2	0x6183f044
+	0x0f29f26c	0x41760fa1	0xbf1fd689	0xd3055c3b
+	0x1edb2239	0x5e9aa007	0x193c6ca9	0xa5f75684
+	0x281732f2	0x99308898	0x78c4f631	0x6673d2bf
+	0x62b8251d	0x4a466036	0x9641449d	0x138ce807
+	0x3d637a7f	0x7d09bdf2	0x433bad7c	0x71bad217
+	0xfb587029	0xa9a436f5	0x0e24623e	0x0aa852a8
+	0xe86564a8	0xcdb686e4	0x65c48b10	0x2973caa6
+	0x62d4e121	0x4b0835ae	0xa17bd769	0xac4a2db1
+	0xf185166c	0x50f2fdfc	0xc39f14a0	0x5ef9dace
+	0x0e70ecb6	0xfa577352	0xf944271a	0x4219017f
+	0x4023cd16	0xcb999031	0x3435d9a3	0x376a38d8
+	0xf9c5020b	0xf607d1b3	0x20899f9c	0xd4a0c8ba
+	0xbb8afd18	0x4171935c	0xd949dd4c	0x2e33f6fb
+	0x02af555a	0x0c2cbed6	0xba680cc6	0x07f0e58a
+	0x88750bfa	0xdad6ce37	0x90e0e1be	0xfde50439
+	0x714c6da7	0x52d79397	0x73f2dd50	0x0ec2df57
+	0x38f609ac	0x6978ea5f	0x2b4f2a8e	0x977c5d83
+	0x40f4581e	0x9c862f00	0x0ec9124f	0xcec0f275
+	0x0830a2bc	0x1e620c5e	0x1c99889d	0x88fa02b2
+	0x12cdc5c6	0xd1308d75	0x68c1c312	0x4dfee754
+	0x8c7637a4	0xacd042fd	0xf9fa1e7c	0xa3fe1a74
+	0xbabca0bd	0xf2c4f9cf	0xedb898d7	0xbf68ed2a
+	0x88f88f66	0xba7eb154	0x8b657afb	0x8cdefdac
+	0xa2becf86	0xcdcbe0d7	0x9481c98b	0xb194eca7
+	0x2a0a02d4	0xfb00d895	0xcfae192c	0x304180f0
+	0xa82bcede	0x3f9407eb	0x6f616505	0xf2679357
+	0xc74ff05e	0xa42d33b6	0x6d131a74	0x46837c8f
+	0x618d8b8e	0xae3fdf80	0x5ac56792	0xe8204095
+	0x7fe678de	0x0aabe905	0xe23966fb	0xdfc3ae2f
+	0xbfba369d	0xd362d0ad	0xe4d00bd1	0x36468346
+	0x142ed1df	0xc97cad2c	0xe5c1035d	0xf6c78877
+	0xe00295da	0x3be8b0dc	0xb59cef1a	0xe8ed05c6
+	0x514ea1ef	0xf7633df2	0xb7e10bca	0x44cc343e
+	0xdb5ebaed	0xe10b3589	0x60fd04b2	0xfacbfe1e
+	0x93a1e9b8	0xee694238	0xd693b0b3	0x2812a260
+	0x08db3159	0x59ca9d4b	0x4153cc57	0xf0ecf932
+	0x438d4d1a	0x52c232d7	0xdf6d7a95	0x5b6f5092
+	0x81e98659	0x8f9a196b	0x99acb238	0x19f97546
+	0xba51ca3c	0x6c65e249	0xf45c7ad8	0x05bb02f7
+	0x3ef3a052	0x61ea6df3	0x3d28d168	0x085c370f
+	0xc2da1e98	0x7808a8c7	0x25be8a1b	0x89aaaf9c
+	0xb66b1fa7	0x3f734eef	0xa845dc71	0xf66dc75e
+	0x8a3fd539	0x7b0edfcb	0x93a439f3	0x835fd4cd
+	0xef222958	0x476a8df5	0x41622b4d	0x8bf6f823
+	0xd2c72644	0xb28c401a	0x2e56d5ef	0xb7762140
+	0x6640e607	0x825f8ab6	0xeb42e497	0x8c92adee
+	0xf680d2a1	0xc2f96614	0x014f5191	0x47becd6b
+	0xe2d06126	0xd5e04451	0xa03771d6	0x459e86bf
+	0x72d63346	0x908e8298	0xebc918c1	0x6deecf70
+	0x8bc4f332	0x79a31a01	0x2114b2df	0x0180e3e3
+	0xe2c91e71	0x0811ee5f	0x2c016723	0x069618e4
+	0xb3b08ed9	0x1d9fa7bc	0x657733f2	0x86e610f3
+	0x2621f0b7	0xd9f6651b	0xbefc2f7d	0x76a0b063
+	0x604856fd	0x94a4ec8f	0xd7472d38	0x64b07478
+	0xa4b4d499	0x43235f22	0x5319c88f	0x911e6372
+	0x89ff9bf8	0x54455299	0x7b3e4e02	0x2335f31d
+	0xf10efd89	0x652e4e5e	0x8a9325c3	0x4064cb40
+	0x59ea7010	0x97fbfdcc	0x7836d7cc	0x88d05455
+	0xf6a719e0	0xe6841411	0xd54f36de	0x2cb4c908
+	0xbf87b0f0	0x6b1bfb7f	0x4dd2f56d	0x699aa41f
+	0xb330eb1a	0xe1f021f6	0x65be482a	0xd48dc3cf
+	0xedc98989	0xc38a4452	0xc4d0144a	0x812fab34
+	0xbf112bd0	0xc9d10e16	0x6600a506	0x87955675
+	0xbf65cf7e	0xd0d0e097	0x789c3540	0x1b6c3b27
+	0xa17f9e2a	0x0d47f6c5	0x08ba8430	0x0ea5ab50
+	0xe6875bff	0x745f6e88	0xe91a037b	0x9da767c1
+	0x4673b150	0xbe14d919	0x3164e3d0	0xab5d0c2c
+	0x33a0c5c8	0x67436862	0x0f043a50	0xb48a4fdf
+	0xf2bebb0f	0xfc4df25a	0xd31c6354	0x21b41071
+	0x2f29814c	0x2eb38275	0x7d7b4493	0x3235611e
+	0x65e3106e	0x4fbcf4c7	0xe131e9d3	0x44b7028c
+	0xf424c38a	0x709a1171	0x0bf1900f	0x5228b316
+	0xda000118	0x61d8b278	0x0f4df4b4	0xdf948e72
+	0x289dbff5	0xef421693	0x0e9b89cf	0x809db1a4
+	0xde5468fd	0x937b068d	0xfd94e40f	0x397379be
+	0x9d41a041	0xc01b0889	0xd4fcd1e8	0x0456e57f
+	0xe91261fe	0x32ba801b	0x7edc2183	0xde70ea6b
+	0x3a81dd35	0x4641b2c0	0x016e7025	0x1c164cab
+	0x8430aace	0xa14e3de9	0xbeedfaf4	0xd5416157
+	0x89212bc3	0x8f517277	0x64dc0c28	0x051c353c
+	0x052f38fd	0xb4b9c162	0x087db1bf	0x384e2051
+	0x8012f360	0x31a94aeb	0xfdc99124	0x3cd37d7c
+	0x34067dc0	0xd4a35bfc	0x1fe16dde	0xd1f99248
+	0x5a9cec00	0x25a73f12	0x861daf34	0x956456b0
+	0xf042d8df	0x0b23f39c	0xf3dcf643	0x9ba5ce10
+	0xbac25abc	0xb8c56204	0x10db5a6e	0x8de89772
+	0x1e968309	0x4a478676	0x119afb50	0x988930b9
+	0x6119d759	0x51788bfc	0x1d61e721	0x3d480f67
+	0x66075802	0x45eb1829	0x118b4be5	0x7efeea7c
+	0xba49b891	0x4dd11852	0xf71b4788	0x99c2f05e
+	0xbd28303e	0x5ee62804	0x1b072acc	0x2d017ce9
+	0xc33294a8	0x57312d2c	0xfd67b2b0	0xbb18b0bf
+	0x2ec80198	0x26175f00	0x35255b65	0x516f5a38
+	0x0890895a	0xd965ce68	0xbd651309	0xf4eb8906
+	0x7e07e61d	0x7e9ef0f9	0x42865474	0xfeb2a58a
+	0xd7c2f2c5	0x1641fd75	0xa24be73d	0xca6e52f5
+	0x40cac5d6	0x24fee627	0xe56c185d	0x29cfe810
+	0x871b030f	0x3b139120	0x19f07175	0x230b1346
+	0x46d300da	0x04d6348a	0x9edc107e	0xeefed616
+	0x673a9e51	0x2daa84b6	0xa19fcd37	0xdecc2c69
+	0x3a683f29	0x17770c30	0xb5395aca	0xf8a977ee
+	0xfa920726	0x7ccd7850	0xc259807c	0x46f03a5e
+	0xb5049f0a	0x09a23cad	0x96208471	0xac73f67c
+	0x91555dac	0x2eda61f6	0x11997b88	0xf82227f5
+	0x333f3844	0xbbe6b077	0x9fa39297	0xa9731383
+	0x3a6e781f	0xc0d3f568	0xf97d2c47	0x84831be6
+	0xc4b64556	0xf9a8de4f	0x19eb50d8	0x72e5a15e
+	0x054a8fd2	0xc1c6345e	0xc0f7b580	0x9704a4a4
+	0xc4226ac9	0xc4ea548e	0xd513e3f5	0xd6af08f6
+	0x831ed495	0x01e6c528	0x1a54b048	0x96dd6e66
+	0x47988fff	0x188566a1	0x8e1313e1	0x5a7f71da
+	0xd3967f1d	0x7690d3b6	0x2f8f2fb0	0x6f6251d2
+	0x4c8aad64	0x02e2fa38	0x85287186	0x14a660ac
+	0x76d76c09	0x1cdd99e0	0x9469a4c1	0x2e627afd
+	0xb3c2e2ee	0x96ccf8e9	0x71d2baca	0xbc6e3480
+	0xf2aac857	0x937f744b	0x0aef9370	0x29ab7ff8
+	0x2d7df775	0x89a4880e	0x40b33115	0x1681969b
+	0x38f87c90	0x58d99e75	0xe0bdcf8d	0x0748a43b
+	0x815cc6fd	0xab02e1fb	0xa556d9c4	0x28045ce9
+	0x92cfd9e4	0x53c48e36	0x10e2102b	0x14bdbdad
+	0x072e7bfa	0x05f11cb6	0x647faaed	0x817802b7
+	0x37514080	0x34e1952c	0x2f97aa78	0x67e5480d
+	0x41c23454	0xb674bf64	0xf1059ebd	0x05bf0d65
+	0x8cea89fe	0xe4c80026	0x19c6c2ce	0xc7ba0a80
+	0x72361b09	0x40442dc7	0x0ea61783	0x0ae238b2
+	0xfd189442	0xc777a400	0x407c0ba0	0x0068c8f4
+	0xbdc3758c	0xccd5a384	0x78c17a8a	0xd9cace15
+	0x0b0cc384	0x4def636a	0xc9ac6e70	0x0b47f099
+	0xec8e3fd6	0x56de8792	0x613589e8	0x3625caae
+	0x54c9ba96	0x61af1ee3	0x22c13793	0x2bb28eb7
+	0xda0bf41c	0x37818fdf	0x66d06085	0x6ed9a2ea
+	0xbd2f6197	0xe019fef9	0x58b35249	0xf7c471d2
+	0xe08ee8c3	0xc0e4f4f8	0x2222e0bf	0x939049a3
+	0x0f81527c	0x6e9d9062	0xb98e6ab9	0xe131178f
+	0x9df0684a	0xfe4b3755	0xe29cc274	0xebbb906d
+	0x5c1ff361	0xf6f785ac	0x925c1ffe	0xbe66b7e7
+	0x341ce7cf	0x86b9e13b	0x3cde9717	0x528413e9
+	0x47017637	0x8fbdb425	0x75bade38	0xaaca2a42
+	0xc2cc87fd	0x341d3b6f	0x810374f7	0x539d08ca
+	0x370a9899	0x13c63028	0xf6121e3a	0x1b6b6379
+	0xe54543e7	0xd6c28f9c	0x92cad6e7	0x0c7805df
+	0xa74ec04c	0x0220c53e	0x02bf9983	0x67b30801
+	0xcfac9bdb	0x30ad34b1	0x623e6398	0xf72dff83
+	0x6d6fed19	0xf62750ba	0x3238cd67	0x520b85f3
+	0x814273a7	0x62249749	0x805a6f0f	0xe38b536d
+	0x41e5a937	0xa93cf20e	0xa751645b	0x8b3e9866
+	0x30967b99	0x3601f932	0xe3ff9f11	0xc4f80f52
+	0x79431f0a	0x6231aac1	0xc62affa6	0x460653a1
+	0x76e31119	0x06034ef6	0x1c69c3ee	0x93d7c70b
+	0x72090aa9	0xc6e716b4	0x694be9b7	0xe2824b39
+	0x669ac02d	0x443fbcab	0x1401440c	0x9e39be06
+	0xf0e38a3a	0x01e81eb2	0x2f04f9fc	0xf8b9e3cb
+	0x997f336e	0x276f6a76	0x4ad5de0b	0x4f1d43c9
+	0xa0de062b	0xbedbcc1e	0x490e9ef0	0x3b9c1a9b
+	0x1df97641	0x90a7dece	0x54b793c3	0x0ace3e2c
+	0x06858b88	0x9474b6ef	0xbbc9955d	0xd882fc18
+	0xb2c19d95	0xa2979c3b	0x2b87a2a0	0x25ab6e6b
+	0x9744f6df	0x8a58cd8c	0x299a4009	0xaf51abcd
+	0xf568b3ae	0x5ef83c60	0x491ed983	0xd3b384bf
+	0xfc42e31f	0x908aaedd	0xaaea2da9	0x62f5607a
+	0x3925938c	0x69432bc0	0xb94c3fd1	0xfa6e119c
+	0xf004de98	0xf26dc0f6	0x58ffc4ca	0x1e215ba3
+	0x77f52343	0xd9930eb4	0x84ff5f85	0xe357c135
+	0x7ca48937	0x45acab8b	0xeb8cb3a7	0x79697bd9
+	0x7aa4e063	0xc275dd65	0x9fce5cb8	0xfdea246f
+	0x8bf8ca24	0x8b61b9c4	0x6a000d59	0x383d33f7
+	0x89727da8	0xb6359382	0xf22d9f92	0xba35a48d
+	0xe8b29b52	0xee2ceb3e	0xb2fc82e2	0x8f343501
+	0x86312bd0	0xad483690	0x751629f5	0xb67a2e3c
+	0xd076ad22	0xc01b43d7	0x2f4f9e6a	0x08b72eb6
+	0x8db81d53	0x4e14b531	0x058c3ab5	0x81b3fbbd
+	0x334ebfc6	0xd0c30788	0x9efef6c7	0x9d468836
+	0xcf54f32f	0x18100d0f	0x75d013a9	0x872ca0a6
+	0x48b656df	0x856d0f88	0x726d5762	0xb1b2dc0d
+	0x49c7039f	0x2b9a468c	0x37f2cda8	0x62d964f0
+	0xc50299b2	0xbe5f6cac	0x67899dfc	0x96ee110f
+	0x7a00c5b8	0x9e9cdfcd	0x0b713ae1	0x06835e3c
+	0xd243476d	0x5b140c30	0x65d5bdaa	0xd6bb4f4a
+	0x1fde9ee1	0x12fd8800	0xd7a7c764	0x0fcca914
+	0x8bd85200	0x40957099	0xe27b21a7	0x46a7fd6b
+	0x0c16e600	0x4385aeee	0x157ada11	0xa750f2ae
+	0xcb37c17a	0x1246d3d1	0x0b8cf308	0xa4a006c6
+	0xa8649968	0x1e07eaad	0xe257f62b	0x966e3ab6
+	0x424bd346	0x9a3b57b6	0xc5a443e4	0xb839b41f
+	0x5ff5721d	0x78844fe7	0x210ef7ef	0x408c4278
+	0x1892d6a9	0x9c3f0954	0x8d607ffc	0xc4cf44d7
+	0xe1b650c5	0x4d417fb0	0x90d99753	0xf2fa12c1
+	0x40a80089	0xd8afda76	0x90885dd2	0x1ad599e6
+	0x828bf177	0x9969fafe	0x34232f6d	0x815828c9
+	0xe851cd4f	0x22d909c5	0xd8b4ed0f	0x388ce97d
+	0x651d147b	0x53d51595	0x09dce7cf	0x04a62df5
+	0x10eb3d91	0x634ab2f7	0x707583c8	0x0f1ce97c
+	0x61135a7f	0x14255857	0x17bcef54	0x24591002
+	0x26b42928	0x5bdfcd75	0x04fafa75	0x0b77e81f
+	0x3d149568	0x40074834	0xc9ed3122	0xa00483d1
+	0xd1094f89	0xfc7e9697	0xbdc02fd6	0x5c0dd406
+	0x55b3af34	0x147221f4	0x6a4e4493	0x70b27ba9
+	0xa839c20a	0xb4ca83c6	0x6976e395	0x53823387
+	0x7e7fa8dd	0x62f3eecb	0xe87a5081	0x2d2e5da9
+	0x2dc917a1	0xa840aa15	0x3ae4b7de	0x818020d9
+	0xe27c54d1	0x863b4ea7	0x3d770e0c	0xc913d78b
+	0x22b6ce26	0xa38d471d	0xd86dfbb0	0x43c94bd8
+	0xbb4e34a4	0x737265fb	0x68698195	0x89ec336f
+	0x61e94b6f	0x01661a18	0x3378d7af	0x2abdd82b
+	0xbc68f021	0x010136bc	0x54be683d	0x9600e0f0
+	0x2710a3e4	0x1fc8650a	0xffc41bfc	0x764776e4
+	0xdef736af	0x80a5b3e0	0x6ba97e54	0xdb90b4cf
+	0x33ca5c3a	0x7dffb784	0x82c7bff6	0xb5c67d89
+	0x8b39d097	0x87b0760a	0xe75b7bc8	0x67a40fdc
+	0x2e77c957	0x8e9e397e	0x8c7b8e80	0x8bd64f05
+	0xfc65f423	0x1ee3b99a	0x13d3c9bf	0xb37869d0
+	0x385dda4e	0x03eb3c6a	0xdf1d4a3b	0x0944847f
+	0xdb5d82be	0x6d8954c7	0x8fc3be6e	0x733e2ddf
+	0x561f1d46	0xebf0b439	0x9d1583dc	0x65406edc
+	0xa981414b	0xc57e522e	0xc960f260	0x6b23dc83
+	0x710d10b2	0xab5f0fb0	0x2d724302	0x03acc581
+	0xb7a06490	0xf3e2489e	0xef949571	0xcd054246
+	0x094e6a1f	0x6ed5f8c1	0x7db5c90e	0x2d52f22b
+	0xa0843e2d	0x4c0645df	0xe30eb8b6	0x10701a24
+	0x8adb03e2	0x98d68158	0xc838134b	0x631f2ac7
+	0x6e181502	0x0ebe0e06	0x39baa3e7	0x20d71f40
+	0x212b2283	0x7387444f	0xb6f617a5	0x17b0015e
+	0x390110fc	0x76f888ae	0x94399a20	0x14a05962
+	0x59a68ad8	0x4dec4aa2	0xfed32466	0xac0f4040
+	0xaa67f018	0xabb1afc0	0x96017ce4	0x55c61e4e
+	0xf549b0d4	0x050889f5	0x4d7d29c6	0xa65e7c08
+	0x87cda967	0x8fc571c4	0xac89bcb7	0x84e41f05
+	0x2316e3e4	0xd11c78e0	0xd7519fc5	0x311ae321
+	0x9443b018	0xd2d850b5	0x9df96b70	0x48b39b10
+	0x17afbb5a	0x81a8970e	0xaca67baa	0x76a0b500
+	0x0b9886f2	0x14e5edba	0x5193071e	0x266148b2
+	0x4a91857b	0x97d18119	0xe095541a	0x40f027a4
+	0x42a63a25	0xd47b0a19	0x537ebca4	0x953aac61
+	0xb601a00b	0x93f621bf	0x71ec4f8a	0x9f2a46e5
+	0x11ad282d	0xc2824e65	0x69bd7aab	0xc75c3965
+	0x2d760621	0x66d29d8c	0x669536b3	0x95524faa
+	0x7bbfc249	0xc459d1b6	0xb818eb26	0x14350530
+	0x2c023f4a	0xce54b444	0xc8373dbe	0x187fd195
+	0xb3b898d6	0x4af556e9	0x6b6c5ee5	0xcdd35ec5
+	0x44e2ae62	0x6d57b2b3	0xca4753ec	0x7cbfd888
+	0x9e4dc38e	0xcde55903	0x293d2710	0xd236f84b
+	0x016997aa	0xe415f003	0xf3c9043a	0x3c17d8cf
+	0xab946c5b	0x1492fa88	0xe800dc8c	0x694bf983
+	0x6330ade6	0x73cc7c36	0xb190371a	0x340a333e
+	0xcadb7168	0x46544957	0x161ce821	0xaf5aba0b
+	0x2a483074	0xdc414466	0xff89c2c3	0x6be345e5
+	0xcc6d38ab	0xb7184bee	0x2d3d3014	0xfab468b1
+	0x58769273	0x4cd9b32d	0x9904046a	0x93127753
+	0x6f750d9b	0x1b01b4b7	0xf5a8f0a7	0x06daf1ea
+	0x06688114	0x205f441c	0x807747f3	0xdf29ce48
+	0x9693acd2	0x648c00bd	0xdaf0730e	0xb5705538
+	0x1aef0ba0	0x5a41b185	0xe5ad0226	0x50714598
+	0xa6aaa344	0x849c7e6e	0x3c71f72b	0x4078f3fb
+	0xde8f37c0	0xccfa72b1	0x49606c96	0x49585dea
+	0xad971ab4	0x50208dfe	0xff446e7f	0xfac4de46
+	0x81cd1577	0x3bbf8978	0x5e11789b	0x3e7ce21d
+	0x53f9ecf1	0x22eb632a	0x26b3d386	0x35676803
+	0xa426e362	0x924fabde	0x858f8242	0xa626e03f
+	0x6b265948	0x2f7b1f45	0x1a3757ca	0xd7dfc2f1
+	0xa9324b7b	0x13ffad69	0xeea8f8b4	0xc9acc8b2
+	0xc3913f85	0x74df9857	0xa7743982	0x257c9f59
+	0x87e6f0a6	0x0ad53759	0xdeee3892	0xfc83ab6d
+	0x7f394faa	0xe7000ce0	0x7fdf6667	0xcaea0850
+	0xb51da301	0x2b534d21	0xade4d5d5	0xef584f5d
+	0xe22f4151	0xcc181641	0x7cb60248	0x43c7f754
+	0x0be0cbb0	0x0e1c1ae4	0x9846f0d6	0x5c26632e
+	0xee7f2381	0x37eb79a1	0xf27b2c89	0x45d49782
+	0x7df3e51c	0x838220f1	0x41173453	0x704695e2
+	0x8e697330	0x37860def	0xf5ebc630	0x468095b5
+	0x5222f701	0xebfa262b	0xb8482a3b	0xace9be0c
+	0xb7161f6d	0xc7ad9a9b	0x6e73d814	0x0980ff34
+	0x8efc3ee5	0x470779fa	0xbdd71e46	0x230371cf
+	0x0baad09c	0xcc68ac6e	0x6d2e0c74	0x328c9f08
+	0x6752d432	0xd42288b3	0x1739034f	0x8b80c37e
+	0x6338280a	0xd55a35bd	0x30799d71	0x7af5110b
+	0x17773f78	0x362581f6	0xdfee41dd	0xbfb03d86
+	0xd091d481	0xb6b0af6f	0x2c81daf0	0x049e0706
+	0x317622a7	0xb2b1df89	0xe1cb1376	0x6c9e5e92
+	0x809baf89	0xa6c275be	0xb942a1dd	0x9fe1efce
+	0x5fcf873a	0xfab5e544	0x471617fe	0x00be2ce9
+	0x65f76905	0xd96185d6	0xe7bfed6c	0xb9a24e09
+	0x776d6d5d	0x64ae6e94	0x90da99e5	0x4e12adc7
+	0x2362ce5d	0xa65c09e1	0x7f27fea7	0x8ea78f0d
+	0x7d33fcdd	0x7ece6d71	0xd873c817	0x63df756b
+	0x4215a6f2	0x657d792e	0x9f514868	0x6d19aa19
+	0xf6276b52	0x7a5046d9	0x0e642e24	0xb19ffed9
+	0xefa48aeb	0xd496077a	0x14f6f686	0xb013697f
+	0xbb28a39f	0x0b49c8e9	0x9fa12b7d	0x45ed23c1
+	0x7d5f545b	0x4c5eebc2	0x87457417	0x9912cd28
+	0x16456561	0xdc8bf90a	0x1eb50230	0xc5ca2117
+	0xc76a221e	0x32c46625	0xd718e8cd	0x4f391d4d
+	0x408d6ae1	0x59a1e68d	0xdc2164d0	0x1a27eb34
+	0x1226ab65	0x79b411ad	0x1e288871	0x9f1149b2
+	0x0c291b3b	0x65564605	0xa5577204	0x5d6418a4
+	0x74074f29	0xd475ca11	0xa47167dc	0x1e2a636e
+	0xc667c8ac	0x74ae41dc	0x80b486f9	0xf3e571c9
+	0xf5b58f5f	0x972066f2	0x9ab34e6b	0x36959a1b
+	0xc35b30cb	0x16535e2c	0xf4f343f4	0x3c4ce4c0
+	0x0d23dffb	0x7f5c7ac6	0x4b240af9	0x719656ce
+	0xd13cfc1b	0x5d391014	0x1df24571	0xe60eae06
+	0xe9b8348b	0x84318f32	0xe59b73b9	0xff61511a
+	0xad38aa99	0x9704f905	0xfbc7422f	0x99581ae2
+	0x59d4f702	0x29920e96	0xfd4605e0	0x45d6dd5d
+	0x6a8ae3a3	0x18a754a1	0x162a9f48	0x3d3cadcb
+	0x930114f9	0xc3157003	0x0e69fb18	0x3bef1ddc
+	0x5c75246c	0x7e45b98a	0x4c5d3d8a	0x5c7ba0d2
+	0x576de26f	0xc1717477	0x5289e141	0xed1703cf
+	0x5c541296	0xb4fd3ec2	0x8299b3ff	0x833d1918
+	0xb9c9d6df	0xfb864144	0xc68b2140	0xeef94cb1
+	0x3081ac6d	0x11e679fb	0x28a8d6ee	0x1450fa01
+	0xf2eb7690	0x069f4e2c	0xd82d9e66	0x90d0a134
+	0x94506a6b	0xb156f8e7	0x15d4988e	0x61e838b1
+	0x4050c1c8	0xf5480167	0x6c6b5387	0x882040e1
+	0x1c576822	0x721faf51	0xc62e23f4	0x0a5ce137
+	0x92e71c95	0x03704ca2	0xd4f4ffa7	0x62ce6831
+	0xf75937db	0x6ec41127	0x5a0f6b9d	0x740db083
+	0x17c844ef	0x2ff5f033	0xaa6c4c4b	0x1ba43741
+	0x82d539f3	0x89f8c559	0xe5d7d8b0	0x6cde9f35
+	0xe09dd140	0x752a39c6	0x357ab644	0x6d725123
+	0xd3156805	0x2a667adc	0x8fba9fc0	0x2b95f6a6
+	0x5b445475	0x1b6939dd	0x6d355453	0xd597908e
+	0x1eae67e2	0xbde7e7e4	0xc8b0f418	0xc30b9fd5
+	0x8429be75	0x39fc4443	0x5574e8b3	0x2737caa2
+	0x63f52048	0xd8eba3b2	0xb5d6817d	0x440701e8
+	0x8fa3c203	0x0b14345c	0x0f3de5f2	0x883b0407
+	0xf9a050ac	0x7708b92b	0x3a4e2047	0x6514b530
+	0x316caadf	0xba8f264d	0x2bb4e870	0x5c290444
+	0xb92c8256	0x69e74855	0x3bef0744	0x85074b9b
+	0xcd1cd441	0x65d7aa91	0xa6e6b18e	0x00950ef4
+	0x4b7e155b	0x0f20d1cb	0x66967570	0x4329041c
+	0x2822ef7c	0x5d23d9cd	0x8d9a08eb	0x22ece0fc
+	0xfd70002e	0x6dafb2cc	0x4d6245c5	0x4f922e5e
+	0xae71bfa6	0xd77143b4	0xec36850a	0x1141be49
+	0xeb354327	0xbd2e81c1	0xf1e02b23	0x36e6c56a
+	0x5b00e6ea	0x01523f35	0xdd467c4e	0xe0b68aaf
+	0x5add5b4f	0x8af89711	0xb3a6df1d	0x10d73bbf
+	0x7da50182	0xf7eef4bf	0xac8ab46b	0x9192187f
+	0x9a77b25d	0xa6fb4e3a	0xd974f36b	0x2d5d4287
+	0xfb8c99d5	0x8e09f429	0x87406c64	0x5b568921
+	0xb1f0c18e	0x07127af1	0x2a7e0373	0xfabaaf7f
+	0x0641e396	0x2c13d47b	0x7fc2c3cb	0x9923354b
+	0x0781b144	0x14565ec6	0xeecdcb1c	0x198deed8
+	0x756e2db1	0x9d63f9fa	0x8adad5a9	0xfed7f9a0
+	0x4e7e42a4	0xde606824	0xdd7a7b46	0x5bfdedd5
+	0x9de3bc4f	0x33632d20	0xa46f862a	0x44e7ee86
+	0x7f1dab81	0x04bc42d1	0xcab0836d	0x27a79498
+	0xf0908ee1	0x77bbe9d9	0xd5545f4c	0x96bdf186
+	0x43562be9	0x1aca7e5e	0x10a6afaf	0xe77f4331
+	0xd7a714f9	0x7d69bb8f	0xa6f7c2c6	0x5b47765d
+	0x85cf795d	0xec3bf9f8	0x6120a5a1	0x1221b3dc
+	0xa40eebd7	0x4b1a850f	0xc54b5f45	0x70696a91
+	0x95e4f994	0x68a4e7d7	0xf73610ab	0xbf9a918e
+	0xc296c1b2	0x22c94b51	0x7251446b	0xfa106d69
+	0x3a483b82	0xffbe90a5	0xb5193f29	0x4eab332a
+	0xcb256d5a	0x80a1d4f2	0xd0c82576	0xf206a4b2
+	0xa87c5194	0xeb9794c5	0x1f2de60a	0x03d24a40
+	0x7513f5b8	0x7c9eb6f1	0x310b3fb8	0x44db613b
+	0xe6a87138	0x01c2affb	0x86f7502e	0x4646c069
+	0x760cf456	0xaf1729d5	0x0cda28b0	0x05d25b38
+	0x75775802	0x0aec6066	0x398e862d	0x5cb646f2
+	0x27498e91	0x0d21c41a	0xc28f7d53	0x26b34c20
+	0x0def57d0	0xfbe8f668	0x54aacccf	0x31f671d5
+	0xfeb727ff	0xd1134b18	0x984befab	0xe8018e3f
+	0x5664fca1	0x9b4f89e4	0xa5f9e765	0x1c81abdc
+	0x07c807da	0x3eb61d45	0xd01e03dc	0x81685d21
+	0xa0e0fbce	0x054b75b6	0x7c0d5f19	0xdf75841f
+	0xd30386f4	0x7fbf1c38	0xd335b8ae	0x861b77af
+	0x01c0945b	0x159d55f5	0x658164a7	0x82460382
+	0x3889b1a2	0x69d1df23	0x9db51495	0xab5a40ba
+	0xe8ffb5cc	0x7f97ce27	0x72297780	0x08564c09
+	0x25245263	0xc77ac799	0xf020b6ee	0xa1a43e26
+	0x30a5e09f	0x01f6f829	0x97961644	0x398fb5c0
+	0xff8efc8d	0xaf5973be	0x39d03242	0x1102ccbb
+	0xf41e180f	0xf8b9b39f	0x58827e26	0xc3e85cca
+	0xf117b142	0xb1b72156	0x00fa68d1	0x6bd0cd65
+	0xd7baac93	0x71b6b09a	0xb051efc5	0x1abaca81
+	0xf1ec4198	0xc18d57c2	0xe3f81760	0x446267ea
+	0xd165cd13	0x623770fa	0x46f98309	0x84119b56
+	0x56687c4d	0x9276c444	0x3e1111cf	0x60cc43eb
+	0xca66d039	0x8a721094	0xb78bf506	0x45eadd1f
+	0x6dd24d41	0x4bf63cd0	0x4274755c	0xcb3c9104
+	0x65dd66e6	0xa017ea2b	0x18bcf547	0x54815e68
+	0x5d65b5ab	0xb14f312d	0xf2f888f6	0x367f0867
+	0x7d06617f	0x4cf5660d	0x90331978	0x2358e1b5
+	0xaf55418c	0x9700cb8f	0x04f04ddb	0xad2d66fa
+	0x14ff5f50	0x9ecec2bd	0x9d8e9213	0x3c02ad40
+	0xafad80ba	0x33997a50	0x8c314e5d	0x18485a60
+	0x147cd77d	0xb2e6d561	0xe1d7f391	0x4a774594
+	0xa2b31804	0x1c9573c7	0xade0a878	0x9d325428
+	0xe59a890a	0x4e14d3db	0x98828e72	0x62f061b2
+	0xa34102e0	0xe405b8b7	0xe70eb2b1	0x8305fffa
+	0x15fd4b1b	0x3647130a	0x0fa693fa	0x213bccff
+	0x8be2f93c	0x5fccc005	0x409b798b	0xae31fe47
+	0x7e5a0b87	0xbfaf1412	0xfcba0901	0x2c50e788
+	0xb03c6658	0x5bdc9914	0x461ca4ee	0x7a67fa0d
+	0xe452cdbf	0x3bdaa6f4	0xf05e956b	0xe5af1519
+	0x608afb31	0x04d305f6	0xa7942ddb	0xb42b9fca
+	0xf5377403	0x1a41b1fb	0x729c80aa	0x23b9f813
+	0x5259f61e	0x1dfbc47c	0x49cc1ba4	0x83f36f0a
+	0xa659d988	0x3411d8ba	0x9d283718	0x377cdf0a
+	0x0971775c	0x3301339d	0x15c9e915	0x57961066
+	0xd7a71fc0	0x0e61722d	0x18dde63e	0x88ac866e
+	0xe33c7e5a	0x1e10ee2f	0x1b4ed88f	0x24dab92c
+	0xba3ebd7d	0x045cd9c7	0x38349770	0x19c58bed
+	0xa84e8401	0x005f57e2	0x6c351717	0xdb0bd6f9
+	0xe02a7d13	0xa1c30bfd	0xe820c746	0xbb1b3319
+	0x6ff3592a	0x8d8805f0	0xf7f07017	0x4c445824
+	0x3ab65173	0x31e34226	0x0a64e317	0xea7adb49
+	0xd01b5114	0xe042a694	0xd4659e02	0x5a8a4094
+	0x68c06794	0x7ac9c7f1	0xbb195a3e	0x8c25b1b6
+	0xe61f7da6	0xa7377050	0x800d5805	0x728a3816
+	0x3556e2b1	0x7edad3ad	0x880ccd19	0xf704f716
+	0xa704fdbd	0x6c506715	0xb01c7949	0xe2c853b8
+	0x22d69d3b	0xd979fbce	0x61dbec7d	0x2e24a0f5
+	0xc44c42a1	0xa4371aa7	0x1c921c85	0xe163563f
+	0xdeb9aef6	0xb07a6815	0xc6113b37	0x0977db61
+	0x956a4697	0xd47e14ba	0x3ed9d661	0x2b6b483d
+	0x9ee66746	0xd77dcc87	0xd7b27bed	0xd6fd72c7
+	0x06fdef68	0xb9d02089	0x364995ec	0x201bf111
+	0x8ea2580e	0x831b0b8f	0x879de175	0x6cbff50b
+	0x4905be36	0xe2223f45	0x10c33c9d	0x4819cf52
+	0xfb24288e	0x71bce828	0xdc31a0bc	0x7a1f9638
+	0xe061635f	0x81a3bb35	0x0e7a5f23	0x30ebdea8
+	0xcdb09f35	0xf3a78100	0x014b1c6e	0xe40d0e4f
+	0xb4fd80a3	0xf625ee7d	0x83932d77	0x802a8bf6
+	0xacd62133	0xefa074df	0xfbbc8752	0xd03130c7
+	0x825f6a0d	0x13bc90d0	0x15461b35	0xf65bbcef
+	0x834d860b	0x10b85d8b	0xb0e6a6ba	0x073a2724
+	0x7b36fe04	0x3c5f6c40	0xb7267f96	0x8d41b32c
+	0xd14fa5e5	0xd0f1cefd	0xf16b4378	0x1b30158d
+	0xb8bc4c8a	0xcdd5bcb7	0xf599d6a7	0xae6c497f
+	0xa3295605	0xed018953	0x279e0aca	0xe4130d76
+	0x1346ca12	0x7c99293a	0x6a88d6a7	0x96a8e21b
+	0x4b2dec5d	0xe3a0d997	0x18884dc5	0x16b0c992
+	0xb305cf1c	0x059536a7	0xf9e8dd61	0x35f36076
+	0x411da268	0x0fbd04b7	0xbfc0286b	0x3f43d4a5
+	0x6ff425a7	0x191b9399	0x16955429	0xe7291c9a
+	0x94266d2f	0x0020ea77	0xe97a491b	0x05f3d64b
+	0xe904e7cd	0x1fc996ee	0xb5267321	0x0b045416
+	0xa05b8e9a	0x7e87b890	0x0418e547	0xc7d8381a
+	0xbfe27290	0xf1bf710d	0xf541392c	0x9d731a97
+	0x10d83fd4	0x1142fdd3	0xd45205a3	0x778ff68d
+	0xffe89291	0xef551eee	0x1cd65c9f	0xc0570b59
+	0x9cab6077	0xe382c833	0x2de6e07c	0x4503d1e3
+	0x611d3337	0x0db6912b	0x63e87ba7	0xec4cefef
+	0xc9f68c05	0x5d9f296b	0x668eb313	0x72606184
+	0x5c40431b	0x03883e0f	0x0c5ee3e7	0x9446406b
+	0x74ff15a7	0x2b7b26f3	0xe793f913	0xdbf796eb
+	0x33fb9128	0x5fa6a230	0x57b72dae	0x19a1645f
+	0x758e2f95	0x64bc0874	0xfaad2208	0xb272f8a9
+	0x8a3c1ba2	0x173aa881	0x2eda89f8	0x10be1bbe
+	0x7e6290a6	0xaa5a1c2f	0x2bd0e8c7	0xfd2ab92f
+	0xeb213701	0x643842e7	0x30896c22	0x1d5930c6
+	0x2a63e6ab	0x681be1eb	0x96e99eca	0x16086415
+	0x7adb7562	0xb8162576	0xfaf355f3	0xd62e8194
+	0x7d89824c	0x0d90dc84	0xec6045ed	0x0ec71061
+	0x36bac535	0xe97a4722	0x026e2cc3	0xc2a52ad2
+	0xf0fbdfe0	0x86d47f96	0x38783397	0x13e179ad
+	0x3939cfc6	0xc7a90e66	0xad11c691	0xd310ea0c
+	0x74c6848b	0xedff38b0	0x709e0c0b	0xb7fd3c3e
+	0xa7e61dd6	0x0cf5e31c	0x6c7da0c0	0xbfef7b85
+	0x212613d6	0x619e6170	0x6d664486	0x0aa491f2
+	0xffa6d7d3	0x5c1f2498	0x2909bf7f	0x7dc0d0bf
+	0xae5f6cb7	0x918acaae	0x2da16456	0xc237f9b2
+	0xb550afce	0xc9d12467	0x0e1fb820	0xe9089a77
+	0x7395b303	0xa226ef7a	0xa9763cca	0x16fa1f04
+	0x6ed0a254	0xe79a3e2d	0xbbabcd55	0x40b9f8a9
+	0x4381487f	0x04f4544b	0x492385cc	0x9b30b9f2
+	0xab640975	0xa2dc4c51	0xe11ce677	0x1679489e
+	0xe5d3a517	0x0fed6647	0x2392fae4	0xe658e71b
+	0x273c5243	0x0685982c	0x27c1cf33	0x6275ecd4
+	0xc6ff317e	0x7c4a29a1	0x0b426fcf	0x0991acf1
+	0x9feaa45b	0x1d1ffa07	0xf54687d3	0xb18f5d7e
+	0xdbc422d2	0xf70244c8	0xe5548cea	0x3a0c907f
+	0xdbf45c62	0x59b57e9f	0xa48f5e63	0x5c72e8a6
+	0xb5b47cca	0x8168e20a	0x34b27256	0x9038f6fa
+	0xe0ddd466	0xc2a48c7c	0x960db9c6	0x0f2732cf
+	0x3dcc51d4	0x9391c39e	0x357979a0	0x80e62d2e
+	0xdf3263d6	0x00524093	0xd370fc30	0xce834f90
+	0x7b9186ad	0x0a52f586	0x91f6a338	0xb1c0683d
+	0x19c473a0	0x58175c01	0xe2ddd12b	0x2eff8804
+	0x5edf1891	0x42b13b8a	0xe29cf9cf	0x1a9a57e0
+	0x551ae904	0x611c65d1	0xdfae00a2	0x5709d8a6
+	0xe8e96058	0xaccb2248	0x1329913a	0x3c94a76d
+	0x732eba5b	0xda39f17b	0x3c88c5d5	0x6d07ab0b
+	0xb74969d1	0x75af86cf	0xc8f4e048	0xdaa00f5e
+	0x8702a790	0x674d81bc	0xb4e1ab44	0xc2ea8673
+	0xfbd8ce22	0x14f850e2	0xb580842b	0x7246150c
+	0x3a6dee51	0x0766713a	0x8eed598f	0xa80b43d1
+	0xc2c7917c	0xe2ef5cbd	0x83251950	0xf4079d78
+	0x71f63dc0	0x6da3360f	0x001f8d0a	0x2f135670
+	0xc85d6376	0x6754e59d	0xf53b5205	0xea0b3d07
+	0xad19e39c	0x82408613	0x00c282cf	0x6bdfad45
+	0x62f0ab66	0x770cd75d	0x2ba77a49	0x7233cc6e
+	0xf9c76754	0x36880b84	0xc834c8fc	0xdec5ef03
+	0x968aeb22	0xcffe64df	0x5851070b	0x17f63d5e
+	0x48e7f121	0xc482ec1b	0xabd98aa7	0x5be312a7
+	0x156e01a4	0xd526a4d1	0x8b75c41c	0x441f8ad4
+	0x6ec314c1	0xef1cd01b	0xda6d9713	0x26cac0e4
+	0x836bfd8d	0x433df830	0xe5a42260	0x31422f67
+	0x81a83d78	0x0e3018de	0xad1c722f	0x110471d1
+	0xff047a60	0xf4c77372	0x2e7d944d	0x04ee0afc
+	0x627575af	0x1a3abe82	0x3beff798	0x8f492986
+	0xd20456ca	0x3502f3df	0x3b02e7c3	0x03365dc8
+	0x7705ea0c	0x3633c422	0x65b0b3ec	0x3e9ed973
+	0x750cd309	0xda693bad	0xa890b0fa	0xb40c4dca
+	0xd16afcca	0x49b9b449	0xae166692	0xc79d1384
+	0x9cb9e327	0xa56a7d17	0x3e10ae3a	0x8ec84814
+	0x1f82254a	0x07b889b8	0x7da971f2	0x540ac0cd
+	0xea60e782	0x3bea0849	0xb17dae28	0x50dba88b
+	0xd4df4a4e	0xda155e3f	0x672c95ba	0x1e91da48
+	0xaa6cce17	0x002dbf3c	0x886b0944	0xee556fef
+	0x4937b75f	0x3b5a6976	0xab70332b	0xc6335496
+	0x641b7e15	0x7db46337	0xe7271920	0xc22323c6
+	0x65ad4099	0x7cd99598	0x3ddd7e16	0x6835f314
+	0x145cec8f	0xb2e7a3c3	0x09170052	0x2c34fc34
+	0xabe9c170	0x765f3077	0xdcf265a0	0x95d95aec
+	0xa1485bcc	0xbfb16108	0x01694ecb	0x6bab8f30
+	0xaa4fdcde	0x2844bf83	0x677c7891	0x2b5304e9
+	0x3a2deee5	0x6b8ce685	0xc4adc75d	0xa9698b2b
+	0x7b83712a	0x178eac03	0xa51f95b7	0x1057a7c0
+	0x28fdc9a8	0xbbf9a172	0x6da21335	0x2c0ed8ae
+	0xbb41c417	0x8f2f2f7a	0x2d47a852	0xc5fef121
+	0x07b2f438	0x53ddb4e4	0x297629cc	0x060f4905
+	0x3b4b4b4f	0xcfa9601f	0x29ac502b	0x2ed377f7
+	0xfe6fd814	0x46674670	0x40b07340	0x1594a18d
+	0x3133a783	0x166dcbe4	0x6fdac44a	0x7966e454
+	0xbb31b980	0x64ebaa4b	0x66b8036c	0x6d1a6bc2
+	0xc9943328	0xce5c0b4f	0xc92855e1	0xc988f7b6
+	0x965f1b48	0x88139c7f	0xd7f572a6	0xd8b4ef45
+	0xfc3fb2bd	0x6e7e9728	0x98770466	0xe1ab3558
+	0x9bd99c5a	0xf4a7b8af	0x26961742	0x130a1467
+	0xf67c1237	0xf75ed2fe	0xc8edbf81	0x5d375cc7
+	0x1ca686c5	0x6428a8e6	0xb6a89c96	0x838620b8
+	0xa29ef90e	0xce6cc74d	0xc9a7ba3c	0xb8aaae94
+	0x7e2e7496	0xfe89d0e6	0x886b55d8	0x053559f6
+	0x13788e3f	0x1fe94926	0xe6be2cb0	0xb69bd93d
+	0xe080a734	0xef31884e	0x1b7ee144	0xd3c0e444
+	0x0dbd197c	0xa97c4e40	0x742fb324	0x60777e37
+	0x65a0e07a	0x60e4a524	0xdea92cde	0x9d53a354
+	0x054925d8	0xbed53c15	0x19a56f63	0x8e1d7d0a
+	0x385c0655	0x6127884c	0xd90669c3	0xfd01eb5d
+	0xba5230e8	0x8be4e0af	0x641ac70c	0x9da4bec4
+	0x491b3fdc	0x72088377	0x6fadbb6b	0x1eb3f194
+	0x138f76e6	0x06e5cfa1	0x50e6c02d	0xced3bc9b
+	0x4f3cb822	0xe7c05bef	0xb8939b8c	0x228423bd
+	0x2826da45	0x7c7a4327	0x69ee1772	0x6ce06d42
+	0xdde9f377	0xfd8296f0	0xcacf450b	0xac8a79cc
+	0x2515f4f1	0xb8877606	0xe3c75f15	0x87eefd57
+	0xd5f83e31	0x8ad83ed0	0x645c8379	0xfb2c09b1
+	0x29fa9f1c	0x523070c4	0xbdb3b12c	0x56b5dcde
+	0xf8426a93	0xe4b2c23d	0x3d5b9e33	0x82b25356
+	0xd92445db	0x33022612	0xb8ccdb74	0xa20ca557
+	0x55345b9d	0x8e9c951d	0x97a6866d	0x494c6e01
+	0x70210570	0x5a43c02e	0x6fe89bef	0x2cb5ad9c
+	0xe0ab87e5	0x75adcb6e	0x45405e26	0xa692bf48
+	0x5b609761	0x030a9467	0x40a759b5	0x106bb462
+	0x620a7d75	0xe929da61	0x071bd58e	0xee378d68
+	0x6b08d4d3	0xb8a36917	0x45efd5a4	0x62fa1ee8
+	0x267621c8	0x01fcc95a	0xb313963f	0x881e32d5
+	0xac58d47a	0xe8e98407	0x940144d3	0x9f4fe111
+	0x99c16f87	0xa6f50b4f	0xa9407cbe	0xe1ed1a1f
+	0xf7af2972	0xe3236e66	0x1514a6ef	0xa4838377
+	0xb6b7bb2d	0xe9c12d6f	0xffbc47d4	0x0009e283
+	0xe066bfd9	0x9453acd9	0x3a53516f	0x1565d9e4
+	0x05623966	0x1b1dbdff	0xd1d630e9	0xd0144dfd
+	0xc97ff66f	0x269311de	0x1f9661d8	0xc35a0169
+	0x8b206d41	0xc078f81a	0xe0d268b1	0x612f66ae
+	0xcef1e654	0x9ae0237c	0xa9a6db51	0x2ec4dc13
+	0x31225c9d	0x201ddb16	0xcb8c3092	0x92b5bce7
+	0xa554dd54	0x715c2779	0xaf77d5db	0x0e66d154
+	0x4346695e	0x096b18b3	0x4bfffc37	0xc12f275b
+	0x75be5fa0	0xe0844620	0x8ce45a27	0xbeb23c8a
+	0x038acf17	0xbe750146	0xcb50aa60	0x28b17d7a
+	0xf2c24fae	0xe80da3e4	0x53bda2ba	0x0db14ce5
+	0xd4562d22	0x906e6c6d	0x2228060e	0x7b758425
+	0x5120152e	0x79fab288	0xaa30431e	0xe02aff0d
+	0x11cf0942	0xd6dec434	0xa37c5532	0xdc75fcaa
+	0x6e709ccd	0x0fd6d302	0x9c0cff7b	0xa9ec920c
+	0x4930add6	0x9dc7080b	0xf7e84e66	0xedafc508
+	0xded94db8	0x32848bc3	0xb46e6e41	0xe9aec094
+	0x2c6ed428	0x81998fb9	0xba44962a	0xbd47d39f
+	0x69c5f06a	0x527f64a0	0x3863510e	0xabedb09e
+	0x66ba1af5	0x2f4701a2	0x89619e66	0x2a8213b6
+	0x96b35155	0xe36f9bf1	0x4e4c9831	0x41e29f39
+	0x8a38c10e	0xc6b0b3bc	0xb9a8bbf7	0x1b3feff6
+	0x116cee15	0x7a26aee6	0x8aa5e277	0xe033f839
+	0x03ae9486	0x87feab5c	0x2a76ec0a	0x2c9f5bb7
+	0x979e8365	0xb735d5fd	0xc5b2684c	0x65bec358
+	0x20ed649c	0x6044f3e2	0xe964aaca	0x083c0fc7
+	0x64c6f5ec	0x58c2f1a0	0x7248e733	0xf86633d0
+	0x155e08f1	0xb5105931	0xc3a675f3	0x58beb5c4
+	0xce27bb83	0xc317c8e5	0x08c20bd5	0xb52687ee
+	0xef5115d3	0x4c01fe14	0x031db379	0xcb219aa3
+	0x42ba3a94	0xe51c3809	0xae496040	0xf8a9cd70
+	0xcc5753ae	0x0540afc7	0x2f967c3b	0x7ef7aeac
+	0x4a41f6eb	0x705f7bed	0x556adf2e	0x68b38e05
+	0x86bc6414	0x0dd9c2a7	0x31d0f0bc	0x148062f4
+	0x2ee98f94	0xd62fe807	0x11d37fe3	0x052ecb38
+	0xca75133c	0x2ed8c2c6	0x8e604160	0x392e1fa0
+	0x8544d810	0xbf670aac	0xea63e11f	0x69f8e72e
+	0xe5ea3048	0xf33a1162	0x51def599	0x5aa97dd8
+	0xa7af7df6	0xcf7ac38b	0xfac81bb1	0x5c13e786
+	0xafb6c23b	0xf51f6a22	0xb07484dc	0x476b48a5
+	0x88a4b41a	0xac65199e	0x30206ad2	0xda03b33a
+	0x5c1f02c6	0xc47f63eb	0xf32643e7	0x963d6f51
+	0xa7154c6a	0x927627aa	0xf46ce42a	0x363f40e5
+	0xb4bf67e3	0xe47052d5	0x9e0b47e1	0x6b0fe58b
+	0xa03a9c49	0x5e945cb0	0x6ad3cee7	0x6e5bd7d6
+	0x11acd8c7	0x79545822	0x255b7b5a	0x5f909b17
+	0xafb63f90	0x5a407558	0x47b10cb2	0x510251c2
+	0x7534555e	0x374d4ac8	0xae77ac8d	0x42134d42
+	0x2eadea43	0x3abcc1c0	0xa3281b92	0x7883d25d
+	0x41825437	0x9a5e2c5e	0x805c11b3	0xf2fd6d24
+	0x9e5c2348	0x61cd2c3b	0x4290dcd5	0x906ac92c
+	0x75a98667	0x29a0953f	0xea6f3127	0xcf96cccd
+	0x255aa79f	0x566e1f66	0x6368bf00	0xd54ac5e9
+	0x364a210d	0x68739b18	0xa482d61d	0xbf54b83a
+	0xa572f37a	0xf3cb277b	0xecd0a7b0	0x4dadcf68
+	0xe611e146	0x9cf2a4d4	0x89b685e8	0x72b99e7e
+	0xe2571569	0xc136a3bb	0x7876c300	0xaa37ffbb
+	0x4733aa9a	0x9f5af114	0x288961fe	0xe4435cf7
+	0x7e72625e	0xa2c435bb	0xce8fa422	0xa457a9e8
+	0xfb68cabf	0x74968fa8	0xc3070a6d	0x785da5d2
+	0xf3405cae	0x0fe4988d	0xa0dfc0bd	0xf9e6e423
+	0xf6146969	0xb7aa7f77	0x5a57e757	0x6db990ee
+	0xc49f092e	0xb1dcf93b	0x3b5499ee	0x45551aea
+	0xfda57777	0x114422ef	0x2469c86b	0x50990211
+	0xd8de398b	0x0f1a46f9	0x82aaba33	0x41f2f3e8
+	0x64ad897f	0x6e00f781	0x6cf84715	0x46b63df4
+	0x1ba8220d	0x93f57e2e	0xd884801a	0x2be20427
+	0x98284ea3	0x69a7ab50	0xf92720f6	0x2669b337
+	0x72c26a6a	0xec7f7086	0x1241983e	0xb46cf0e4
+	0x05c303aa	0xf319d17c	0x1675bf24	0xbf3fcb76
+	0xfd40cd25	0x8f4b1a94	0x4c16fada	0x2a315da8
+	0xdf3ea7a2	0x98c05b13	0xd8a0daf7	0xbc0dcc30
+	0x1468a240	0xb52d9ee6	0xcd66c460	0x2a1a4d2c
+	0xf745b0e0	0xb5bc837c	0xeb6b1f38	0x9123504d
+	0xeba7ef5b	0x2b10b0d4	0x5e22dfcd	0x4738c874
+	0xb0f1d3d8	0x7bdd395c	0xd4f6a2b6	0x27fd3105
+	0x18fa05b0	0x19ff0580	0x990ccdb4	0xb81e67e0
+	0xb5bc6686	0x669059f3	0x6977de9d	0x876053bb
+	0x5b50f1b5	0x71c07729	0x7e1305e5	0xc248bd65
+	0x5f3c8c80	0x5b4c883d	0xeaf29302	0x764b7c09
+	0x95f53d63	0xa99544ec	0x04c35881	0x34e0c07c
+	0x2038454f	0xe5b98ad8	0xe076ee6a	0xe708b760
+	0x9420d20c	0x4bfea03a	0xf1588ed4	0x13d9a7de
+	0xe3a56c16	0x5216ae46	0x0bb1d9db	0xe78f9080
+	0x14f9bdb0	0x54382a55	0xfc2bcee9	0xcf678d72
+	0xafe6f3c2	0xe6266a66	0x81d8e14a	0x9df511f5
+	0xb76bbf2b	0xcd27eed7	0xca08842b	0xf982f551
+	0x358d4c7a	0x341eb98e	0x78b3248b	0x2c3ddf2b
+	0xbaa24b24	0xdd1b8ffa	0xbbbba633	0xdb05116b
+	0x124a84ce	0xeb724c87	0x46247d39	0x7373c479
+	0xf9153a17	0x670c54ed	0xa0f9332d	0x251d955b
+	0xf341ea7b	0xf3c7ed67	0xe54f4b60	0x2fb2a89c
+	0x1db5be18	0x6d87706f	0xb35bad8c	0x94f00821
+	0x7f1d5e2e	0xb94d96ab	0xb1bcfb5f	0x77f3e9c1
+	0x22a74758	0x12507b73	0x07454515	0x539ef418
+	0x991f26d3	0xb8a7e4fe	0x88f43bef	0xe5106dec
+	0xf08d35bd	0x37b78b97	0xdef6d486	0x36e9afec
+	0x44256976	0x8fa27327	0x5e4510e1	0x62b1d6ab
+	0x739f6a3a	0xe53b2560	0x0eee61ab	0xce5c2195
+	0x2a11d29a	0xfcc773c2	0x998f0377	0xfd0cfbab
+	0x60531b2d	0x0f163a3e	0x056e4ea3	0xcbf8f075
+	0x8eecb224	0xdb6f6564	0x9994cf11	0xf2da6068
+	0x7edf2d60	0x3484e010	0x3986d352	0x3215d09b
+	0x8acec634	0x88beb778	0x384583be	0xcfa9469d
+	0x3eaa128f	0xd2584846	0x526e16c5	0xe62c56b0
+	0x28878619	0x451a3cc6	0x9d6b3b22	0xbb4595e7
+	0xc41c5702	0x8eaf59af	0x3ec60116	0xcd3fdf25
+	0xf4baa3ee	0x995acf3d	0xfe048b4f	0x34bf9b46
+	0xef80dd5d	0x715270f8	0x7a0c0212	0xdf084b0b
+	0x6823f5b0	0xd63885c6	0x68fa0d06	0x4d4cdbb1
+	0xe3b28319	0x15e287fb	0x7c8a7c24	0xb260381c
+	0x956d8721	0x02e9a6a2	0xc43316e0	0xf8e8f45b
+	0x3b98c8f6	0x5ac45695	0xec28fec3	0xc122e2a9
+	0xd54498ee	0x075854eb	0x24a9c53a	0x88f82fcc
+	0x6a300c63	0xefd1ae69	0x547a9ec3	0xa137e93c
+	0xaaa2242f	0xd84cccfd	0x4b317c9a	0xa73c890f
+	0x53563e89	0x496e871f	0xacb487cd	0xac528731
+	0x979bd60c	0x1644d04b	0xfb25ec8f	0xa13f6ce3
+	0xfc0c1a00	0x13545d49	0x4b7f9ec9	0x4bd41253
+	0xe2b467a7	0xd677887b	0x3e52951d	0x1b16be80
+	0xb335a750	0x0cbe6466	0xd7b20d9a	0x2fc717da
+	0x7b421a32	0x361f1f9b	0x7a690107	0x07418186
+	0xbe912ff0	0x19ab248f	0x45f15951	0x928dc0bd
+	0x34b6d079	0x0e232ff2	0x905d8b2d	0xdfbe8b6e
+	0x9329a93d	0x730f6446	0xfd66b27a	0xfc2ee1e1
+	0xc7843f87	0xfb41abd9	0xe195709a	0xa55268ad
+	0x7fafd370	0x5b3d3940	0xd0499932	0x68b122f4
+	0xb68060a9	0xd8bc5e9c	0x3e97aa65	0x81d088e4
+	0x1f1d516b	0x91025dbd	0xa2bd0027	0xae82f668
+	0xd7b9a631	0x0a498109	0x4ffa40bd	0x82778f22
+	0xe57c458a	0xdfb5fc7b	0xe87374e1	0x8886dcc2
+	0x2cbc6bcc	0xcd024d5b	0x21987f5b	0x5bee50d5
+	0xcfc95d59	0xbfeaecce	0x35e308b2	0x1c431c62
+	0x63834bd5	0x9a93892a	0xdf509f2e	0x7a5ad3da
+	0xe11a9e99	0xc7363cd2	0x84e195f2	0xf18d74ad
+	0x5cd07824	0x5e632fb1	0xabf51bdd	0xbdcdb3b9
+	0xe7f2b97f	0xe0319ac1	0x92515886	0xdc4a11de
+	0xd2a8b48b	0xc713272b	0x1e1250d0	0x59d87385
+	0x7f962a6a	0x07c50bb2	0x935a13aa	0xbbdf216d
+	0x22bfe2cc	0x9c587c77	0x4e3d6997	0xb5b9030a
+	0xfe9131af	0xfafc7485	0x35a53be7	0xdd7a91ef
+	0xb790c7a5	0x5077a502	0x7670eb90	0xa032fe17
+	0x79f1a53c	0x426d12f7	0xda45810e	0x1892e046
+	0x1f11dace	0x1b80983c	0xed8401f4	0xd5813b24
+	0xe1d5665e	0x5d5086bf	0xbd7605cd	0x1ef38e49
+	0x79848055	0x0c537b4a	0x85198fdf	0xc13d9914
+	0x61c2d22c	0xc3a71565	0x80aa108a	0xbc6cee1d
+	0xa01d35d4	0xe1bd82df	0x11867dad	0xd04b476d
+	0x23f6bf14	0x1b326624	0x908504ab	0xbe631bc9
+	0x7bd48d7b	0x715d075e	0xdb00938f	0x295c2109
+	0x555dc4ef	0xfc476f0c	0x704f2970	0x1528a393
+	0xf5a5a3e5	0xb98429e2	0xf00ddc40	0x23df90f6
+	0x31d70e78	0x7ed4eb17	0x078264e7	0x0604a330
+	0x7f1a2a62	0x339ebf28	0xb6a7f8c7	0x459323a4
+	0x5e0da59c	0xe0f45bfe	0xc718dc9a	0x4b1b6237
+	0xe06bbf0e	0x195f6811	0x474d7c3d	0xcca640ae
+	0x77a48b6d	0x96eb434e	0x8a118ca1	0x55a513d8
+	0x2b4c0414	0x2bed5335	0x8feeeaf0	0x1e3ed22c
+	0x887a2db3	0x3e9cd3fa	0xe836764b	0x9833144f
+	0x9be55821	0xc45ca6ed	0x65419d88	0x4f4e8dd6
+	0xe159296d	0x1fe302bb	0xcdfa2bfc	0xf6cd6f1a
+	0x8acdeed0	0x8bcdb4c9	0x36c82e69	0x4ec65b26
+	0x10498082	0x6e267465	0x3b0831ed	0xafae25ca
+	0xf02be37e	0x930c689d	0x44d149c6	0xfcc96fed
+	0x39ea636e	0x02009f40	0x4e1de152	0x8c138829
+	0xa16e6860	0x33a5f206	0x9c97bd93	0x58af75fe
+	0x984e0f23	0x4abfa9f6	0x99693bab	0xa787d2e5
+	0xaff87efe	0xd5078255	0x21d6f10d	0xff7db25e
+	0xc3431f52	0x20918eb7	0x1b8605d0	0x23b92d4d
+	0x4a72f632	0x80c1fd17	0x0c02d9d5	0x1ae9c1c1
+	0x076b6166	0xa7182495	0xbbd4d5b7	0x81aa4b26
+	0x00ef55f9	0x3ee3d821	0x0b84ad77	0x2bcd72cc
+	0xf1787994	0x13422b02	0x9137efd5	0x4da3a99f
+	0x7ffc5321	0x4b2bc219	0xe96631b6	0xaeb03a4c
+	0x0296e305	0xf923b421	0x519becdc	0xf918f411
+	0xaf036986	0x85e8ccb5	0xfa7da8fe	0x50f4919d
+	0x1fb7158c	0x1cc71295	0x87b14315	0x68bf833c
+	0xe0e2f829	0x0899a1bb	0x7d0d6259	0xb3e0d938
+	0x87247548	0xc4b8b45a	0xa1a198bc	0x86553eb2
+	0x07903528	0x3468e45b	0x3f619b4b	0xd76e9f2f
+	0x1fe52ccd	0x1fa7489e	0x1a0944a9	0xa3001f22
+	0x52e29e4a	0xd8583e6e	0xa2f8bf9a	0xbb596023
+	0x78d13b38	0x37722a86	0xad2630f9	0xbe615c28
+	0x8d660703	0xd2c60522	0x93600693	0xb8026ec2
+	0x04d71941	0x0188c650	0x8fde0e25	0x00bb1949
+	0x18cbf921	0x9efafd39	0x61e2c5f8	0xd7e129d6
+	0x1da1c371	0xeebb9552	0x3d89d2fd	0x507ddb33
+	0x59aefa5c	0xa96050c9	0xa89753f6	0x8a6a3724
+	0x249e55af	0xf5d712aa	0x165332e5	0xeb8b8fe6
+	0xdd58d97b	0x696b8de9	0x1aaddbfd	0x5b70ab39
+	0xd3cfae84	0x43d4ed0a	0xc3e62170	0xff5a2f1d
+	0x4dcac28f	0x483e6b75	0x6f499dc7	0xe322ea5d
+	0x435cab14	0x9c83b6e3	0x03b8cd4b	0x4a773061
+	0x8dd12c6a	0xe16e0b85	0x71754c74	0x61da9e61
+	0x6b0a5780	0xec507e7c	0x67d251f3	0xd158d66e
+	0x5d554986	0xf1b869f5	0x3846a89a	0x93203735
+	0x1fee1e40	0xfedb9d4a	0x833f3275	0x4efbb610
+	0x84e139dc	0x391caafe	0x72ded682	0xc4578cc9
+	0x2a97e6a6	0x31ae0a21	0x61b759e8	0x7dba8f29
+	0x9f44920d	0x2a682773	0xe0973858	0x4fe8d93f
+	0x4461e195	0xb4e9d538	0x35244354	0x71e1e076
+	0xe7c9a805	0x9281e7bc	0x9c5866ff	0x8d3fcc6b
+	0x96bf9d94	0x081b5f1f	0x59f1c86f	0xc7624b4a
+	0x642828b5	0x2d1adf14	0xa23027b0	0x203baa5e
+	0x383020e7	0x9270e519	0x5c9db413	0x65de52bb
+	0x427d85ca	0x9be72540	0xcc42320a	0x2a540c30
+	0xb5f05697	0x94deb4f7	0x85931ed3	0xf6985f6d
+	0xcdbefa9b	0x4c3b4518	0x23900cdd	0xb61242cd
+	0x551f4fcd	0xe32114c9	0x1463bf4f	0xb1ab0b15
+	0x9d3bd7d5	0x482ba600	0x2a1905df	0xeca00b13
+	0x4231c992	0xbee51476	0xd53b8a3c	0x84e444b3
+	0xf580de73	0xb77ae962	0xd317f0f7	0x0696e18c
+	0x548cc93a	0xe84e9eaf	0xd3a112ba	0x09203e1e
+	0xe5fcf34f	0x8cbbcad0	0xbd39deba	0x3f3c444c
+	0x9b42960d	0xa7cfd77c	0x6fe061f4	0xa47cde9e
+	0xc6e0d1c0	0x73c66abf	0x5d1e8fbd	0x3623c582
+	0x661501cd	0xf82c02b3	0x1fdddc43	0x41326004
+	0x7e66833c	0x9b87f09e	0x460e9f29	0xaa42d4c7
+	0x9de056bf	0x7a04e294	0x4f45a29e	0x4dc53b68
+	0x35f66dc3	0xe5d61f33	0xdf1c3b74	0x7a800188
+	0xd2d69278	0x51d10dec	0x36ba5a27	0x84710d0f
+	0xdb9d4265	0x0cdb2557	0x2294b43b	0x21fd5276
+	0x8e242a48	0x534b736e	0x517c06fe	0xddae34d2
+	0xc9963646	0x316a2866	0xf78e670a	0x4354b9ad
+	0x6478b461	0x41bc356b	0xadc9d69f	0x86310701
+	0x698b5dd4	0xac1a065b	0x325b19b6	0xdd8c1424
+	0x9782ac36	0xd07f2b25	0x3142d1ef	0x1b65cce6
+	0x45dc809d	0x26b47e8a	0x47ffd190	0xddd23daf
+	0x852c505c	0xc68d8c2b	0x76f71872	0xd62371f2
+	0xa85876ff	0xd67bee5f	0x9c7f08df	0x7cffada6
+	0x1f87b705	0xb7395ce6	0x5f20c731	0x83b83c9f
+	0x39b72eb9	0x33402454	0xfaa4a4f4	0xce09b8a9
+	0x8fc8ec39	0x8282f919	0x18a12d7a	0x669b255e
+	0xe63cf97b	0xe06c98ad	0x9e9c48c4	0x9e1eca60
+	0xade5b5a5	0xe871bbcc	0xf5c4459a	0xd239cca5
+	0xbc690a32	0x8e6a5a36	0xf656c3cd	0x2aea3748
+	0xcd89e82a	0xd727974c	0xc89c15d3	0x2cb3d656
+	0x5ea5697f	0x95351d3f	0x3c51294d	0x19dad085
+	0x9875ff98	0xcbe290c9	0xec1db1d1	0x06dad038
+	0x59676ed1	0xd4ffaa52	0x67b53321	0x406d0405
+	0xb63b27b5	0x02a7acfe	0x0218e862	0x0600e77e
+	0xc5ab4fd1	0x59614324	0x0711ff6b	0x66aadc1f
+	0x03d4783b	0x260efa73	0x595b8ff7	0xcc38a258
+	0xf581cde6	0x54ad0529	0xe7fd85e0	0x865cdb10
+	0xb36829e6	0x292a183f	0x0365b477	0x699539bc
+	0x1bab4354	0xef8fbc6e	0xcd13d0d0	0xae88592d
+	0x1fd2b9ab	0xc73c4087	0xd443f88b	0xd954a62e
+	0x98f330f4	0xec153762	0x79ab5dde	0x576b971d
+	0x32bfeb19	0x8cb0fc53	0x0adf7206	0x1fd5c3dc
+	0xbf2937d0	0xe3a27af7	0x7a5985c4	0xf385bd6a
+	0x4749ff2a	0x2c9dbb25	0xfb5ec7e6	0xd35e3858
+	0x6b02a00f	0x39648c79	0xea16560c	0x7426126c
+	0x2e48ff85	0x7db3751d	0x5caa6cae	0x9d7bf7fb
+	0x7dc3045f	0x11a58714	0xb1c7ec05	0xd861d92e
+	0x3b9335a5	0x369f36de	0x86537f91	0x6df69efe
+	0x097f9eeb	0x21a1c221	0xe705e58c	0x814c6d6c
+	0x3b15231e	0x27348dc5	0x31904ae2	0xe795e0bd
+	0xd66763ea	0xe8d72c3e	0xa98152da	0xe13f01ee
+	0x3f309623	0x4af332ab	0xfa907056	0x55f64e59
+	0xec5b728e	0xffb73bfa	0x01e03bd0	0x78b40ce6
+	0x494800ba	0x391c7b3c	0xb1a5f6bd	0xc08f1e24
+	0x3e463ced	0x365110ba	0x637cb6b0	0x75753237
+	0x8a7eb826	0x10017424	0xece96fac	0x7e1ee939
+	0xa11e1553	0xfca3f88c	0x20937141	0xa10f07ed
+	0x2be3baa4	0x0b1abf6a	0x446bb4ac	0x431fcc86
+	0x4d13befb	0xa1dde1c8	0x956aa819	0xa6a6bb8b
+	0xca2e0a62	0x7ebd0a45	0x1ffbd5b8	0x95c8518a
+	0xa69b829e	0xba2506fa	0x8969eb89	0xb8989e02
+	0x2cc46256	0x52f394ba	0xef94217d	0xc397b570
+	0x029acc3f	0xe4ed9f6e	0x15d2b07b	0xe0e0e7b5
+	0xf0a90eda	0xd2b9c951	0xe7fd0d22	0xa11b524e
+	0x297192fe	0x09494708	0xc3231693	0x23057014
+	0x2347f4f8	0xecb07723	0x78d5387e	0xd950aa5a
+	0xb8b89982	0x3d4eb0fe	0x9a5eac36	0x3c314180
+	0x037ef95a	0xe5a07f1d	0x963d7545	0xda533ac8
+	0x652420c3	0xecba1589	0x69956916	0x7118042a
+	0x010cc872	0xca74ec31	0xb65b0a15	0x24d7076c
+	0x7835e3c4	0xae04ce57	0xb9106c38	0x450147a7
+	0xfcd308a6	0x3780795d	0xf127d659	0xabd3762a
+	0xc33508cf	0xd43c2743	0x13f9c4b7	0xb811ccee
+	0x60ea88e9	0xfeaf11ed	0xa2e4e08a	0x679a8a16
+	0xfe2f179d	0xf9d71588	0x46a5b44d	0xa3739f11
+	0x026aece1	0x27227337	0xa67499e7	0x150941d7
+	0x3acb3852	0x36e4a886	0xb3cdac7e	0xa6cc4731
+	0x3da129f9	0x8945d1d3	0x0ca8e53a	0xefc7a5a8
+	0xde9550b5	0xa2838b96	0x85855f0e	0x5f527d35
+	0x6f7cc825	0x3376c65d	0xe11c296e	0x31b6c238
+	0xaa78ce8f	0xed627ba3	0x8b341b27	0xe5ae270a
+	0xe4def7ab	0x4956ab96	0x8fe3e3e6	0xc38a8264
+	0x4a580ee0	0xa367eff8	0x30cd46a1	0x63bfb7de
+	0x0f077d1a	0x071655c1	0x9cd20ef5	0xbd910426
+	0x5ff8d076	0x780541e2	0xb1b78ae6	0x8d4f3e25
+	0x0d607fbe	0x6553eaa5	0x295663d7	0xad96bd90
+	0x3fb8d299	0xa876e194	0xeff9ad1b	0x8eca7226
+	0xae0822a1	0x2f2665b7	0x8c380d8c	0xdc3dced0
+	0xc5902d53	0x9487cbc7	0xaee8d33b	0x9918bc49
+	0x172b80a4	0x54da0366	0xb0480c4d	0x8505c00c
+	0x95f9d4e8	0x04f6c56c	0x4f1992d7	0xd5be2a99
+	0x9cfd5518	0xae36133b	0x68cfab7a	0x93c5b3c9
+	0x5c3e00de	0xfdba8d1a	0x1950a499	0xf585b68f
+	0xd7877843	0x31f26d1c	0xf6aaff0a	0x8422439b
+	0x34932e6a	0x9fdef126	0x004902f2	0xcfeb933f
+	0x461cde2e	0xbf0c2348	0x6f378884	0xc6f28584
+	0x0e8e1484	0x487df649	0xaa6d7abe	0xabe47e51
+	0x9c037ac3	0xa7d9a917	0x017ce418	0xd3fcfe05
+	0x45d44ef0	0xe2122eda	0x3dd12c7b	0x2b943ac1
+	0xe944001a	0x9ea8c0f5	0x13887de2	0xcdeac67e
+	0x661926c8	0x464d7d92	0x2153bc27	0x28f366b0
+	0x95aaccf9	0xf58e42a6	0xe2b74b95	0xc4e76731
+	0x8bbe0115	0xc13d03b0	0xdfd3c57d	0xa6a6a376
+	0x33054af1	0xf2164000	0xf12d1b3e	0x10aaba39
+	0x8c48e878	0xf62e4034	0x9989fe81	0x3cce7788
+	0x33dedaab	0xecce3579	0x52a1a0f9	0x25f7e0b1
+	0x00024fcc	0x9d315f1a	0xf9243a7f	0x51b5bfcb
+	0x4cf926ca	0x19a4e8f4	0x729db9a8	0xc3f0cda4
+	0x2cd53230	0x1d86dc30	0x7b20b7cb	0x1bdbf1f8
+	0x208a3bed	0x175ce105	0xfd45df17	0xdd3f5fc1
+	0x689efdd6	0x0ab4123b	0x7329b958	0xac90a04e
+	0x32caa96a	0xf7609907	0x862ee458	0xaa328d13
+	0xa839f1ba	0xe7da448a	0xb5f361c0	0x5d5f16c2
+	0xcb3faf23	0x9d6fca62	0x80ed4411	0xfb134416
+	0x39ab14a9	0x305ab74b	0x76312b28	0xea38b1bf
+	0x45dee43e	0x4890904e	0x548bdf7d	0x20ef92c4
+	0x86704c38	0x8366dde4	0xafc9d551	0x01486482
+	0x2a66f042	0x819315ea	0x59aef12f	0x5c4d2f1f
+	0xd1d0fb21	0xa286aa99	0x59fe8c60	0x0fb2275d
+	0x455d95c1	0x665c9783	0x4c6a7fda	0xd78f1536
+	0x2cca3af5	0xe7fc1c83	0x12836c68	0xe40afac4
+	0x04971027	0x15033991	0x1599b526	0x28f271d6
+	0x249e2db4	0x8c87a3cb	0xd8949626	0x467b165a
+	0x9834d5dc	0xaca55a99	0xae403e0e	0x5e44dfe6
+	0xb5cb972f	0x4affd423	0xdfe3a0ba	0xba66ddd3
+	0x8fb8afbf	0xf7d2127d	0xc56b4e4e	0x801ee995
+	0x3af70660	0xe4271646	0xfc9b3f0b	0x0d1b714c
+	0x2899451e	0xc0d2ac1d	0x5376412e	0xf8830b3b
+	0x00730f02	0x2070e1c3	0xaa3ecdf4	0x61c2b089
+	0x43160e14	0x1c909bca	0xb12b3e7d	0x563aa455
+	0xa6c82117	0x2fd25eb2	0xcbf7402d	0x5fd16485
+	0x2a903214	0x10b1e25f	0x20ec92fa	0x03e38321
+	0xe264cf01	0xd0b18d0a	0x529610d3	0x6a862094
+	0x0021652b	0x3e41ec43	0x68753afa	0x578208f8
+	0x63fc6585	0x3c065808	0x15072917	0xe530dbca
+	0x4fd31ab6	0x90ec9f1d	0xd21347c2	0x1aa8057c
+	0x707ac53d	0x3a6f6cff	0xef4f5bfb	0x91f9df78
+	0xd4d8e7b3	0x85b23779	0xd70dfb50	0xfc3eb090
+	0x2afb8f1e	0xd17d1671	0x887adc0d	0xbd01123f
+	0x39584f27	0xe5bdc9fb	0x8c1f74ea	0x4771c3ed
+	0x994f3f8f	0x71f73dfe	0x6d8f1065	0xe639d542
+	0x1a0c1e63	0x87d4f6cc	0x6b7d3f3d	0xf04e1fa7
+	0x83d6c73d	0xd674b74e	0x3c68a8c6	0x018b543f
+	0x3c1e295d	0xece6274d	0x1119b65a	0x74a6967a
+	0x69e31d43	0xed442719	0xb6d4d76c	0x0c634c05
+	0x94ee29e8	0xd780bfe7	0x2bfa6dd0	0xa84c1e0e
+	0xc5a76023	0x8513aaab	0x67104dd1	0x6758d5ef
+	0xb804c65a	0x4b5eae39	0xcdf42fc7	0x0a409263
+	0xd5172df1	0xe06de198	0x221b3d16	0xd389dea9
+	0xdc7ec34a	0x0cdb0c31	0x74aa5423	0x1a3a12f0
+	0x84af11b6	0xed5484a9	0x48a42703	0xf88a5554
+	0x1fb1c3e8	0x14f0139f	0x5bb798d4	0xa44d0a7a
+	0xffe63aaa	0x2623dfb2	0x3dfdf073	0x7c5f64c5
+	0x7fb8e776	0xd6ec4cda	0xbbbcc9c5	0x543d4e67
+	0xe6261cdd	0x5fa93a6b	0xb2f22232	0x46b3bf1d
+	0xc85c492f	0x3e9b59c8	0xc57467e9	0x3ef1cca2
+	0x885c11b4	0x430b945b	0x7e866a53	0x35640ef2
+	0x2bc250d2	0x143e8bcd	0x526e160a	0xaf195f5c
+	0x6b7af12d	0xae86e442	0xa8a7e79b	0x348e2f45
+	0x83464bf9	0x7e9217f2	0x633167d5	0x7f48a7d9
+	0xc0e68db1	0xe20a73d3	0x08631c1e	0x6d1c947c
+	0x09f758fb	0x4e7a91f8	0x6310962f	0x4cb9d435
+	0xc4e0d790	0x516ff75d	0x7d94e8f9	0x5e096081
+	0x54c45793	0x5c4006ad	0x96597e18	0x8288ae51
+	0x80b02790	0x07a93092	0xc3c4f812	0x5370f66d
+	0xb0dbdcf4	0x7b3989b6	0x401ba87c	0xb6583c3d
+	0x172f026b	0x14f6a157	0xf38c63d1	0xdd649ff5
+	0xf3f4e004	0xf35ada45	0xb4ef6088	0xf4dd2f84
+	0x45cfd771	0x87f4aea6	0x258285ab	0xd6cd6526
+	0x6ef11ebc	0xc9fe8974	0x19fa04ad	0x42f2cb41
+	0x1f79e225	0x4a377d25	0x21bfba29	0x344a68e1
+	0xf5ecce49	0xfbb59c84	0xd79e3b7a	0x66abbfbf
+	0xf472eadc	0x96e131d4	0x582cc500	0xd6e66fbc
+	0x89514daf	0xfc33243d	0x03f2ef3c	0xc89b7e63
+	0x81690099	0x3d7b84fa	0x760c3e67	0xd17dc669
+	0x5d224d4c	0xf4ff8750	0x0156afad	0x65d31848
+	0xb90d0084	0x5f8bca59	0x30fe3607	0xf42d02d2
+	0x1a1433d9	0x83e8ac6f	0x580fbfdd	0x621b4f0c
+	0x8a0384c3	0x8f2bb99e	0xcde8d946	0x656c0982
+	0x4e6ba947	0x6111abba	0xd2a533df	0x9d173834
+	0x12ae87b7	0x9c96dcc9	0xcb38017f	0xcfdb1a79
+	0xa812fa65	0x7e94957d	0x448b6e54	0x951db061
+	0x95413429	0xa9b8f2a2	0xed53849d	0x0df306e6
+	0x47ad8eee	0xc89bbc9b	0x2c812451	0x8a8cd47d
+	0x7f6fd5e3	0xac4f541e	0xd0141031	0x1bc101b8
+	0x445eabc8	0x8812e01f	0x1972aad1	0x490e0983
+	0xde196258	0x8a1f4280	0x7d4bbc9f	0xd8828045
+	0x6d0b5f9c	0x99300545	0x2245bb3d	0xa6212403
+	0xa16fedfe	0xd14bf451	0x26146824	0x56fb7edb
+	0xc569ab9c	0x3ee4ca51	0x4769b0c7	0x9702340a
+	0x81477a5c	0x5e5e2b00	0xecdf796e	0x1b71f918
+	0xeb7b0bef	0x4943478f	0x996aa457	0x563df3ea
+	0xc13e9084	0x84a710c6	0x51aae833	0x1286b9b6
+	0x646e93d2	0x27cdb6ae	0x2c5131d4	0x80331468
+	0xa2de5ec3	0xcc2f6702	0x3e395dc6	0x06faa48d
+	0x395bf0b8	0x2ab561f5	0xbf8d67e3	0x8faf4cea
+	0x51e93442	0xcf47cea8	0xbf63b9ee	0xe927b21c
+	0x1a03197c	0xec291d24	0xfb8519d7	0x4d955d6c
+	0x2df0903d	0x5a706cd0	0x61ef0856	0x494d1444
+	0x86699045	0x067b12c0	0xbe0a1b48	0x234b346c
+	0x34cd7efa	0x6a4ae615	0xcd91c638	0x954b84f4
+	0x1a128af5	0xd969cc17	0xf4dc37e1	0xaa5e52d8
+	0xde59f894	0x0f5a917c	0xb4fb57e7	0x0cab7d81
+	0x9aac2151	0x4cdbb7c2	0xacd786a1	0x3a7b62d3
+	0xf240daa6	0xff356dad	0x758d1e15	0x193a13f2
+	0xee61d3e3	0x981a74fa	0x227adbf5	0xce83506e
+	0xa1e3af28	0x5d4885c1	0x6c1f694a	0x96986af4
+	0xe458cbbe	0x91951817	0x854ec652	0x71e35285
+	0x89afd078	0x26170aa3	0xe65e2d7d	0x457ed03f
+	0xc2fc1735	0x026e2185	0x7084e0e7	0x118e91fb
+	0xba85dfc6	0xe658f66a	0x0c19dbe3	0x17dc8f29
+	0xa75cbee5	0x1ad8e022	0xf5458efe	0xbc5c0628
+	0x8bd901d6	0x8a986723	0x492e7376	0x7c35b261
+	0x39d55be9	0x3768fe66	0x7467ae3e	0x2388e33e
+	0x5b91e770	0x55d12deb	0x2c12b96d	0x82664969
+	0x6fddc486	0x790b4248	0x0a1a279d	0xd9b92a2e
+	0xe316f88e	0xf21cc3df	0x51038908	0xb3aecc0b
+	0x9b4048a0	0x21748d61	0xd65d0a32	0x0ba4dd14
+	0x51606dfc	0x23715771	0xce5bd0ca	0x26b7d411
+	0x87029a42	0x3a02968a	0x0b81412a	0x7fbf7638
+	0x6935a48d	0xd29ddd49	0x5e60b89a	0x498efa41
+	0x37756ec5	0x7a07ae76	0x60b6cad3	0x521dbbf6
+	0xa1d46ac0	0x61279e7e	0x28bdb70c	0xdae29099
+	0xb075ba91	0x6096a79d	0x2bee42c2	0xe2632f66
+	0x6f63ee5e	0x3c1635a8	0x9cc893f5	0x74fd1f0c
+	0x0e979de0	0x3cdf28f0	0x5a0f41c5	0xdad09973
+	0xc57f47f6	0xdde7dd76	0xd05965a8	0xdeadd87d
+	0x1d87a754	0x5513a4c6	0xbd5fef6b	0x0d649214
+	0x5b36915c	0x568038c0	0xc775afc7	0x7d32462b
+	0x78ae7ed5	0x132a1ae2	0x248359de	0x2550a259
+	0x7ff08337	0x2dd48301	0x7d11da38	0x4076b6a1
+	0x8d6ac3b8	0x2858fcf5	0x102ba807	0x6508bb1c
+	0xa5aa0335	0x25d56586	0x53b990b0	0x7e4e4c49
+	0x67b37e21	0xd4646417	0xcbf0e82a	0xa2eb08a7
+	0x53761d3b	0x3bc87b03	0x0e8da6ae	0xa867b1b6
+	0x03704bed	0x5460a156	0xdbc7b432	0x861e76c6
+	0xd9a25796	0x746ff2ff	0xea2ded19	0xc0c12f66
+	0xbed173c7	0xcba2a17f	0x073ade3d	0xcd20aa31
+	0xef12f091	0x306a0d01	0x683ffda0	0x6a4d3ced
+	0x2f19e821	0x2f220131	0x59c46a40	0x7370fda6
+	0x6c8268c2	0x82e5ef45	0xd79dee43	0xe7779aec
+	0x94ed3852	0xed0e12c7	0x6ab12986	0x32d1f391
+	0x10d545fa	0x5771a8a2	0x0cc7aac1	0x90352208
+	0xb8f980be	0x39d2c41d	0x60474238	0x54f2ab34
+	0x29cf4e10	0xf29aeabc	0xf1ab8e24	0x167c2b39
+	0x83e05ce0	0x12e6ce1e	0x35afe73e	0xd9095f05
+	0xfb41fec5	0x564488c8	0x94a858b5	0x8e940dea
+	0xf624ae34	0x85efbb1b	0xcbcfb146	0xb9455026
+	0xb4e40bba	0xc3195d35	0x1cfa4bf8	0x2d49eec2
+	0xf6695b41	0xd220af6f	0xfad02fa4	0x8af9362b
+	0x7d1dedcd	0xc5667cff	0x897bc389	0x831fb846
+	0x2442033e	0x41ebff58	0x05502fd4	0x43574914
+	0x58530064	0x11c1e752	0xbbe62845	0xa7618ec6
+	0xf1627ff5	0xafb00250	0xc3824684	0xee3eec52
+	0x337942b2	0x7a3a291e	0x857f05f3	0x15719b81
+	0x66fe3f57	0x88280481	0x5c866ada	0x2c1f07c6
+	0xcef7155b	0xd3a236b7	0x90c96bdb	0xedebecad
+	0xc478b1d3	0x75dc8363	0x340738ac	0x4d15034c
+	0x1cb8e2e7	0x41ab7b1d	0xe798cf70	0x3a33131e
+	0x6a43e6a3	0x386192c6	0x59693949	0xd6b28e16
+	0x22468abb	0x6f23eff8	0x22aaa858	0xcfc1443e
+	0x092215c9	0x894b362a	0x17819cca	0x75eacf86
+	0x9e8edcd7	0x578501fa	0x888b8186	0x7849f9ea
+	0x18a5f279	0x1a0608e0	0x3f79a285	0x5a9cccb7
+	0xc8288846	0x8153e63b	0x06745426	0xfeb7dd82
+	0x37967ee7	0x6501bdc8	0x2b1303ff	0xf105ea53
+	0x1afd9ea4	0xd7f0c26e	0xfc9d98e0	0x3adcfa5b
+	0xb95372a6	0xcf0737ae	0xd6f56c9b	0x3d047e23
+	0x1742e108	0x730cea46	0xd61b5674	0x1d4a0bf5
+	0x9f9a0d2d	0x15751fa5	0xd1f78c6e	0xbcbf0f49
+	0xf02861da	0x75c73284	0x565ac314	0x74f424cd
+	0x2de2c5d0	0x8b81d64d	0x7da7ed9d	0x0dec53d5
+	0x119bcb0c	0xe3280bc2	0xb8876379	0x61d9315e
+	0x76e711d2	0x5f7d25f6	0xe536781e	0x48bb7127
+	0x0241bdb6	0xa3f5c283	0xa4e289e7	0xb0c00a9b
+	0x31437997	0x8360ae3f	0xa89404b6	0xb5049139
+	0xecbe777a	0xd5aae954	0xa7e3497d	0x766e436a
+	0x00311364	0x09c314f6	0x03f4992b	0x57cf2522
+	0x717d0b4b	0x3f0c50a4	0x6f2faa6b	0xfdd19e4d
+	0x136b4811	0x2ec4df6d	0x540e503a	0x4ef99a84
+	0xe190e376	0x4c6a2b6d	0x898e2adf	0x30816632
+	0xb595e258	0xe1b16383	0x9a0dff8f	0xed42f0a8
+	0x12314f07	0x2d51c21c	0xf31c3c3f	0xc112dd94
+	0x052fcfe0	0xa567c821	0x6892dec8	0x07c26300
+	0x1799a9ef	0xf2ef0828	0x30cefea6	0x3f6919cf
+	0x5d3d2396	0xcb2f347e	0xf626b1ef	0x449fbf5b
+	0xffe2da0a	0x33d5d2bd	0x44d7d222	0xb24a94a0
+	0x04503d1b	0xde3efdb1	0xb6a30029	0xac134d4f
+	0xabb57951	0x4f3e6cb8	0xdd738dc0	0x598dd5ef
+	0x80fdf47f	0x756d4968	0x95449696	0x44dd4689
+	0x3781c7ee	0x8b3c7403	0x51b86cce	0x90d40f13
+	0x50296220	0x85637fab	0x11430ba6	0x37b6fe45
+	0x06923d07	0x75119847	0x2b16990a	0x558a824c
+	0x4f7ed662	0x6ff01850	0x73301b84	0xa9f8cacb
+	0xd47591c9	0x239f5de5	0x978dcd1c	0x50c99641
+	0xc4331a17	0x9c42adda	0x33adb88d	0xf278e923
+	0xe4f30829	0xe505a03c	0xd83ee3b1	0x46bf73fa
+	0xcfd0610b	0xe5904ea6	0xf1aef3d8	0x4f38284b
+	0xdc0ae0bb	0xb63412e0	0xd871cbc5	0x95e54457
+	0x4e6b6ee0	0x796e632d	0xb02c54d5	0xff6e3a26
+	0xcf25f241	0xa264f1e9	0x9c4c5a83	0xe8c67201
+	0x8a54d34c	0xefeef65e	0x224eda49	0xb66a6c4a
+	0xb7947d42	0x1b9cc0c4	0x18f24b32	0x265ba45d
+	0xfe433ce5	0xc878de4a	0x66239035	0x3e55f422
+	0xabc11200	0x5b3ceeb2	0x79972610	0x13b5b5ba
+	0xe0ec8eca	0xf5f2a0ee	0x98bf92e3	0x5bd78dbb
+	0xfe01740f	0xc089bd76	0x033dc19b	0x43d76143
+	0x34ce988f	0x57c18ffb	0x73d1ddb2	0x051a4e3d
+	0xc635e701	0x4a0ddefd	0xb10b6cda	0xabcccffd
+	0xbe1055e2	0x5ecae7cf	0x880329ec	0x7590ea81
+	0x967cc129	0x78faa2e6	0x7e0f8e38	0x222bd775
+	0x31943949	0x8c5e77ef	0x9fa68d99	0x5d90ff61
+	0x62b9de80	0x8f42ed5c	0x907a18fc	0x851b4e2b
+	0x46992571	0x0a2b6586	0x938b91c8	0x4475b4f1
+	0xefdd87e5	0x28c7339f	0xadc025bd	0xfe9a46ef
+	0x96b62846	0x9600fd60	0x8d30853c	0x5321f086
+	0x51504b37	0x70f70c0e	0xd3c63718	0x4ee48d14
+	0x0f42ece6	0x4c7788db	0x8d0838d7	0x487d073f
+	0x3c0c9a41	0xb02bd044	0x8509af73	0x6dd6f7a3
+	0xb0fb556f	0x92c15d39	0x35c3dad0	0xcea85451
+	0xc7d26893	0xd59a4be3	0x24c3b5e8	0x20ae4992
+	0x46fdf7ed	0x237c7116	0x6cf591ab	0x069f6538
+	0x0c1b1441	0x3b5be741	0xb410ff01	0x20d511b0
+	0xf2c96bda	0xeed21dc8	0x2a3602ee	0x08f774b9
+	0xf77317f1	0x788a9067	0x70907446	0x16affdee
+	0x999869fa	0x4d164296	0xab34d654	0xf7992cf2
+	0x676ec9ef	0x8e9b8b12	0x33ae21bc	0x1971e43c
+	0x28880c9f	0x1a62e925	0x76dc574f	0x15765e0d
+	0xe41a9f10	0xa7bfa8bc	0xa6a68542	0x5368b186
+	0xe235e3d0	0xc89c2aaf	0x2644f5e8	0x577a3fc5
+	0x0529603c	0x77c89615	0xb89aec94	0x9c8406a1
+	0xa340c976	0x343625f9	0x2e6031ea	0x2202e06e
+	0x97d888d1	0x1902d335	0x86c3b9e9	0xebefbeab
+	0xd0732d32	0x8be1ac34	0x4289df13	0x4f44a9fc
+	0x0871780d	0x413a895d	0x893db7cd	0xb58cabf0
+	0x8a20ff00	0x6529c6d3	0xd6d22f25	0x4cf7c2f8
+	0x427e50d9	0xaec1c707	0x91695339	0x711708d4
+	0xdfdd7fe1	0x5e9df851	0x65722a04	0x05d8da5f
+	0x27c91699	0x1efd60c9	0x940a132b	0x7ea2851a
+	0xd9fd9dff	0x0a541bbe	0xc0d63c35	0xc12929b2
+	0x33610416	0x502b2626	0x5228b15b	0xd94d4b35
+	0x14c0b45f	0x64ed4b0b	0x78af7626	0xc2e9046f
+	0x7a12f190	0x42beb256	0xaea48841	0xf0e790d7
+	0x72973deb	0x11cfeefb	0xba5cd0e5	0x1a1f41a7
+	0x65c06ace	0xac49a1f8	0xbbd82cf8	0x415035e0
+	0x33ebda26	0xc908a605	0x8dcf8b85	0xd4569ab9
+	0x2e5f7de4	0x2d0a3ced	0xe7c29493	0x6fb32111
+	0x71f9535b	0x63cef544	0xc2215455	0xb1574011
+	0x17b0b0af	0x4c9436d5	0xb16fdefb	0xe33c66aa
+	0xcc2e67f6	0x10f09eda	0xd46e0144	0x99dc690a
+	0xdecf7f81	0xc421b916	0x703e1199	0x6e074b90
+	0x259fcebd	0xb4e7dbcb	0x4045f119	0x4034d34f
+	0x0a52aeeb	0x0f8e2b36	0x3ddaede3	0xbd012dd3
+	0x7fdef8b3	0xe0071859	0xfb279d23	0xa8eff030
+	0x30e2b0a6	0x7c50a0c6	0x97dd696c	0xee072f57
+	0xe45d0547	0x3a4a96a7	0xc59bfeb4	0x37e4449b
+	0xb165ce74	0x2939ff17	0x2c16376b	0xacde50da
+	0x3e57b316	0x589a14a2	0x8ed5557e	0xfd6bdf76
+	0x57348636	0x77df0b9d	0x49e6e4ac	0xe9a3ce3f
+	0xc1b06ddd	0xaa5111eb	0x748a53ae	0xbde72bb6
+	0x7b2d7f63	0x7ed5bf06	0x98389845	0x17c8d9a3
+	0x4cace2c0	0x441e3441	0x67eb5256	0x59e7cd3d
+	0x46ffac59	0x8bd74b6b	0x09abf015	0xdedf14a6
+	0x92ed879b	0x116b4a44	0x471ce853	0x9c649ad6
+	0x9f1838c5	0xc4beea8e	0x747900dd	0x48ca9e9e
+	0xaeaf94fa	0x1c03c132	0x44662d4f	0xa537d972
+	0x589a90fa	0x57332041	0x2f8349cf	0x64364c6d
+	0xff5f1aeb	0x681dba1d	0x4eeebbef	0xedade9ef
+	0xcb938dfd	0x0164c6d7	0x13b9bc03	0x18b407e9
+	0xb298e043	0x9b224562	0xb645ffd8	0x5815aa44
+	0x4793d73d	0xb56f0e9f	0x8c9044d7	0xe41109b1
+	0x2710c352	0x4b7dcbac	0x38f754b7	0x3c6cf465
+	0xb54ee7b2	0x856a179e	0xe86338dc	0x1e7e2b53
+	0xe89b7e12	0x15c42976	0xad7a65ae	0x0d8a7cc3
+	0x4bc02b15	0x517a40d9	0x11c81722	0xb2bff7aa
+	0x0ba28f37	0x6c9e84b4	0xa1de9a97	0xdafdc842
+	0x418082c7	0xac99eb05	0x440d81bc	0x0f8281e7
+	0x62386c2a	0xe9772f62	0xdc79a423	0x09b53e98
+	0x84c3c90f	0xca17ba91	0x1c6389ac	0x873c14d9
+	0x2c259be5	0x1cc07fd2	0xfec486d5	0xc24694f4
+	0xdf474401	0x7be2a72b	0xadb66511	0x81209edc
+	0x62da35e7	0xcb368410	0xe80b6818	0x26cf9c82
+	0x321e312f	0x9cc8a82b	0xbf9ebd18	0xc598d6fb
+	0xc21858cb	0x6dc72a46	0xe44aa56a	0x82fbdec9
+	0xbd732010	0x6975adca	0xe5ddf36c	0x72bedc92
+	0xde4c0ccb	0x9e6e20b4	0x6bf5ce44	0x0a6eb5d8
+	0xa439cda7	0x055f776e	0xedf823ad	0x298c0f7d
+	0xdd6c8d9c	0x066e9378	0x86847ddd	0x151bda4c
+	0x61ec7724	0xbf3de534	0x64d80341	0x9c608f22
+	0xde5d94a9	0x7423895b	0xadfe2881	0xc7acfc0c
+	0x7ff035db	0x42c2ae6a	0x0cd9e52e	0x425bf47a
+	0x41cb2f2f	0xb0d034ae	0x1cbc0c50	0x9ae9ee61
+	0x40fd456e	0xcc5ddf76	0x3e5c52d7	0x4f7e55df
+	0xe88c725f	0xa38d12db	0xa63d5340	0x7a65f347
+	0x5d8e6ed0	0xb6140480	0x1d038fd8	0x32041136
+	0x1c45b5ee	0x5100ab0e	0x98473545	0xa92e7dab
+	0xbddefe68	0x6eee94c9	0xcd046fd5	0x9269ca4c
+	0x9244ed01	0x68b9272c	0xa2abf1f9	0x0c5eb602
+	0x3cee855a	0x8d449506	0x968687a8	0x69fc4521
+	0x89fb7d41	0x82d335c1	0xcc7e2c7f	0xdbdc20c1
+	0x5adb4bc7	0x429ea826	0x99c6d2b9	0x8f684704
+	0x53361f81	0xb8c4a550	0xd079cafa	0xe28fb54a
+	0x170c157f	0xe5faa727	0x9d37b6f8	0x7a0f88b6
+	0xdad0aa7d	0xe6eb4a39	0xa8391bbf	0x912bd27d
+	0x7676a2c9	0x67ebb91d	0x4f090fec	0x4148f1c1
+	0xb8456040	0x56befd92	0x9089e3a8	0xc2568a9d
+	0xeb649427	0xd904af9e	0xf99984b8	0x4467144f
+	0x79efc76d	0x75589aec	0x9f168b29	0x4c048855
+	0xc0fd5d25	0x4a58fa2c	0x31b194c1	0x8a801969
+	0xd5e0000f	0xa2f9f4e8	0x8591ac20	0xc0fe5118
+	0x5b7f969f	0x21a9dff2	0xbef3c51d	0x51873dda
+	0x207120cc	0x690d99c9	0xd532b33d	0xab0d4ccc
+	0x7452bd5a	0xa17f7858	0x5289f83c	0x7d0e053a
+	0xd906a982	0x6778d47f	0x005db3a7	0xe88104e2
+	0xc52df471	0x44db6099	0x995d4c1f	0xeca903fb
+	0x3eb38a46	0x3a656171	0x24945ee1	0x35439de7
+	0xbf95525d	0x9b4030a0	0xb518b00a	0x137ebe42
+	0x0997e7a3	0x1f344a83	0x00241146	0x40e74f33
+	0xb1cd34d2	0xfda51a35	0x7cc94789	0x2cc46a7b
+	0xb966a92b	0xdc8f9838	0x2a2fc869	0x846778b0
+	0xc2ded51a	0x88000d7a	0xc6d1a90d	0x2e4c17a2
+	0x112e4409	0x489edcfe	0x5be08376	0xf004d962
+	0xe26e28db	0x4ddb374f	0x6801cce8	0x35826ef1
+	0xeb3b8c3a	0xf209ce2b	0x728ad017	0xac4e76c3
+	0x721ad4c1	0x67da600f	0xeb8fe821	0xdecace00
+	0x0c355770	0x3d28fc3c	0x2eebca24	0x4753b9cd
+	0x0b945832	0xf4120f6d	0x588409fb	0x15a94438
+	0xa727a943	0xa95217fd	0x0ded75a8	0x1a556482
+	0x767d35c3	0x9d96d689	0xe8c6df73	0xbf229244
+	0x12bf8389	0xd5dc4782	0x2b2bba74	0x53a49a14
+	0xffa085b8	0x314087f6	0x3e036542	0xa9517e8c
+	0x6b6da9d0	0x15dd4ae0	0xe7ce03db	0x7abff8e0
+	0x89fdc6ab	0x28ed5196	0x8c79b0d9	0xa80f7919
+	0xf121a584	0x9809d3e9	0x83cc73dc	0xa4e51962
+	0x370d9307	0xda518436	0x5ed4c7e0	0xe024a1ea
+	0x0c524b24	0x3bb0bbc8	0xb4cee95e	0xb2622308
+	0x1fc85d64	0x1e836175	0xd43fdb9a	0x39d05c71
+	0xf8bcc9fc	0xd33a53d7	0x9c4d3858	0x2fa63ff2
+	0x351e8720	0x32419c0c	0x8fe0b68d	0x326a8a91
+	0x44625b27	0x52b2716c	0x22eb5861	0xe1a87187
+	0xf5ff95b5	0x0e9a42c0	0x3700221f	0xda6c81dc
+	0x6ec82ed7	0xebbc013b	0x907b528e	0x71222e15
+	0x17bf4813	0x9d8577e3	0x325ad1bf	0x2f98087e
+	0x6656baa6	0xf5bd91a2	0xe5bf2aba	0xc2e16644
+	0x8fb13479	0x0a19eb78	0x80cab720	0x02889d26
+	0x81d32f06	0x666bed5c	0x58aba47e	0x9f36ec4e
+	0xa6f8a312	0xd50dfc50	0xda6ee1c8	0xbf2dbd1e
+	0x6dbe34cb	0x2ee1459f	0xaf3ba125	0x69453966
+	0x0cf984ef	0xbee72495	0x9e1befb9	0x9785668d
+	0x7861dc74	0x16dd92c3	0x9c39366d	0x376b20bb
+	0xb08d0942	0xd2415614	0xb5eeddaa	0x92f148b3
+	0xc1fdb0ab	0xa64e8a08	0x11e6d898	0x7e345541
+	0xd7d875a5	0xd396f516	0x8cdf8a23	0xb324f279
+	0x07382961	0x35e5b607	0xff378354	0xa61e6e1d
+	0xe7b6830a	0xe4022021	0x7230e616	0xe113b776
+	0x595fc933	0x7052027b	0x02525cc7	0x23637336
+	0xae0dabfb	0x46492daa	0xb57f5cc3	0x7f8ff15a
+	0x70126d10	0x6a6b896e	0x330654c5	0x3680f93b
+	0x04e705e7	0xf89c1eca	0xab401dab	0x7fad939b
+	0xc9d8900b	0x29ca3871	0x2931e4be	0x26d73a89
+	0x74c2602f	0x61920680	0xbf532c23	0xfbe87348
+	0x5ee7efcd	0x8228b6e9	0x404e6492	0xbd577535
+	0x1ae12b2c	0xff26b6cc	0xeac396f4	0x04102950
+	0x28a698a1	0x26ab1d9a	0x06f0e8d1	0x82eba335
+	0xbace28f5	0x7f7efab6	0xc9ef2555	0xc5b33992
+	0x74f481eb	0xcfc2a96b	0xbcabf5cb	0x118a80c5
+	0xf815ac13	0x06da52e5	0xd70f8c6f	0x54af4177
+	0x7890b2ad	0x20c1a59b	0x5d1e3c26	0xb0fdd3aa
+	0x53b8120f	0xfff85542	0xfa402307	0xbc0736ae
+	0x3b05c066	0x9e8794ca	0x075af678	0xc540a9db
+	0x40d0dcf9	0xa9bba474	0xebb1b883	0xff1f4933
+	0x97a47b97	0x321b2d6b	0xf01a64f1	0x7d571e58
+	0x8889079e	0x86077eb3	0xe9f91569	0xdf70fe84
+	0xc6bb5b9a	0xf648ed36	0xb75c1714	0x0438e727
+	0xb30d2344	0x6e972d08	0x45164e18	0x3b325aa6
+	0x5fb60f83	0x8e836a45	0x55a693bf	0x704da46a
+	0x0924a501	0xff86991e	0x55bef546	0x9f8b4aa0
+	0x91574c19	0xa3e712de	0x4f9c39a5	0x227962ec
+	0xaece98a3	0x717c7193	0x8bebd8ee	0x8a63eed6
+	0x8907428b	0xd6293e59	0xc4b12c7e	0xc8deb375
+	0x686f9d67	0x141838c7	0x45e4c565	0x814d20e2
+	0x140103b1	0xf88b55c4	0x8b128c94	0x449cd74c
+	0xe4ea1fff	0x9432845f	0x8e700f5b	0x148a70d1
+	0xd0d20a83	0x5422d311	0x4b2562fc	0x0002e6f0
+	0x624bce41	0xfb72d76e	0xaec8229b	0x8511a0e1
+	0xaf3358be	0x23161922	0x7e4a88d4	0x0792e30e
+	0xc29c52b8	0x0ee24229	0x9ec21326	0xa53a3904
+	0x0a3c0eb2	0x973b1d25	0x02884f03	0xcdac8153
+	0xa8f17003	0x2ab6a386	0x59057b41	0x2bc5d886
+	0x86e91ce5	0x7211383c	0x06e20628	0x09361cd9
+	0x8128d9d9	0xc21195c0	0x43f63562	0x46d05de0
+	0x7ed2ef09	0x65ab5805	0xb6963bee	0xa1873132
+	0xf9998e7e	0x84ff6a0c	0x00fa22b5	0xc84432c6
+	0xae963ba5	0x80660ec9	0x2c25ca27	0x17b0b858
+	0x935459ff	0x6dddbdfb	0x418d3c0f	0xd3c6b5af
+	0x1e19e0a1	0x720d5e50	0x0ec48992	0x577c29ff
+	0x5837580d	0x0a7bd481	0x3f13a685	0x96b9ef69
+	0x977ead5e	0xa3e4ae2b	0x96f97a6f	0xd93d0904
+	0xdd5128c5	0xd2a00577	0xc1e6b315	0x175f49e8
+	0x79a4afad	0xa6d864a3	0x98d68c49	0xc54d1d7f
+	0xa0031e9f	0x82580ab0	0xe8567a5f	0xd853d485
+	0x0704e3ca	0xd8afbd7c	0xfe0ab692	0xa8dcd22e
+	0xeb7f1064	0xe565a37b	0x0f429464	0x94df9a46
+	0xb4a43a3a	0x85e7520a	0x828f17d3	0xe404df1c
+	0x02a24101	0x107347d3	0x64eb1552	0x127f2f6c
+	0x8722ba2d	0xb0e56339	0xf9ea6f68	0x80a535ee
+	0xbbc273e7	0xaf777c05	0x8638b501	0xb855c346
+	0x3c0a200f	0x280d2842	0xf727be3e	0x9d322582
+	0x71cf64f5	0x8ac26843	0xd4e8cba9	0x41b357d3
+	0xbdcbde9e	0x606b63d5	0xc793a0f4	0x729b875a
+	0x6a8f1a7a	0x5e0c326c	0x40780713	0x0ae7bb36
+	0x84184229	0x583b1e87	0x2c931de0	0x34d75344
+	0xd38c92ef	0x6a90cd78	0x4442aa32	0x48ce80eb
+	0x7419f27d	0x1f6971c5	0x94f2a389	0x38c4009b
+	0x3b663629	0x19adf150	0x8874214f	0x08a52607
+	0x946fcf9b	0x27c2cbaf	0x2969f147	0xf8fa352c
+	0x5422ac80	0x732d4b75	0x9c44517c	0xdd5e855e
+	0x24325f35	0xb56ff386	0xf2eac65c	0x09382b69
+	0xd6d63436	0x00b3471d	0x9cc6bb3e	0xd64770bd
+	0x4fee58cd	0x400cecfa	0xc9bbf876	0xaa4becb4
+	0x65d693d3	0x4ebd85fd	0x5274bf54	0xc28419ef
+	0x019bd1ce	0x8828234f	0x2361215c	0x9c996c26
+	0xde0560da	0x3be8a4c3	0x63f1a25b	0x1f3db503
+	0x433fcba7	0x27bdf9db	0x9e75e926	0xfa9a0c86
+	0x93144220	0x7b5c5dfb	0x831b0bba	0xac237612
+	0x9125e97d	0x18bc3d44	0x187e65d6	0xa7f1e29f
+	0x4949a362	0x49490a5b	0x9fd7f5c9	0xd4aa1ed0
+	0xae02d433	0x3c8a1c45	0x74aece0a	0x9281873b
+	0x74d67c84	0x7c3ce8bf	0x42d390b2	0xe1b67960
+	0x924c912b	0x39db2dd8	0x0fc0daae	0xefeb1793
+	0x86933e2a	0x79dc30d5	0xd6093f15	0x69c3e88d
+	0x4b4f4281	0x5aa01736	0xc6d4be3b	0x9e961328
+	0xe7c9d7f3	0x4cf1cfe3	0x2b7d0cb1	0x018e150d
+	0x15780565	0xf076db48	0x63c70787	0xcaa9d201
+	0xfb417ce2	0xba23b25c	0xc54e1651	0x9bf2a3c8
+	0x8bed1da7	0x842a94a0	0xd5a7eb11	0x06913cbd
+	0x4620eb05	0x76076fe6	0xfe87a105	0xcac81f51
+	0x9ddeec05	0x83ae9c88	0x682fb66e	0x71f2eabc
+	0xbab703ff	0xab9d687e	0xcbe35917	0x5976ce5e
+	0x0ef568be	0xdd8a23ab	0xd1b94ce9	0x14d47a65
+	0x0a21b6d5	0xb2cabc60	0xab6fbe1d	0x55ffee0f
+	0x59509606	0xf353d47c	0x83ae774a	0x3666736a
+	0xf5fb86ee	0xa1aeb0da	0x1d826dfd	0x873340a2
+	0xc1ea76d1	0xe05c76af	0x2ee20af9	0x27a1d100
+	0x9c4a42cd	0x0c44fe38	0xeff8de27	0x05ca0de9
+	0xe95f6fa1	0xb7bcff23	0x5c523206	0x4f31cdc5
+	0xbfe4910d	0xb1b1c09b	0x7f947c52	0x5cf70669
+	0x5be2fccc	0xf0f52eba	0xf8891b30	0xdbcd2578
+	0xed18f963	0x6953d3f0	0xdbc69319	0x4ac03f2e
+	0xbb073adf	0xbac8210e	0x3f7454da	0xe250ff05
+	0x53fe6a2c	0x9b096e66	0x0c2b33be	0xc9a66cc8
+	0x25fdfa7a	0x211597d8	0xdac355c6	0x3b0b8086
+	0xe1cb957b	0x34ead4b4	0xaaaace1d	0x45470209
+	0x4afe8bab	0x1f383d95	0xc4eb5e38	0x3a4adec6
+	0x9b68485d	0x0028ac74	0xc892a7ae	0x112963c8
+	0xedfbfd1b	0x9bc2a1e7	0x77e86452	0xf7285e2d
+	0x5165641f	0x0be144bb	0x26f32616	0xa889df07
+	0x8de11d0c	0x1ae8026b	0xa40c0afc	0xf66e6b1b
+	0x2f3a3959	0x0f96159e	0xd383fa2c	0x6d8ac6f1
+	0x77e3e042	0xe9d05a47	0x3483a623	0x0e13671a
+	0x8afb2f74	0xad1ee74c	0x2008e340	0xf5b7fe4d
+	0xbd46ec33	0x4cadba9a	0xc86ee5e5	0x12a441bf
+	0x8700bd26	0x1677d9a5	0xbb5299a4	0xc03f06ff
+	0xc015876d	0xdf3ae9d3	0xebafa8c3	0x7407fc93
+	0xc13c4432	0x5263ee0c	0x85b4cb87	0xe95c88fa
+	0x812ba6fd	0xf117a989	0x82a07176	0x1051b99f
+	0x3998d57d	0xa182e824	0x26d164ad	0x47244eca
+	0x436b2d02	0x5690b951	0xc4a2b7e5	0x9c3f4d63
+	0x9d5771ca	0x74bff8cb	0x3063c36d	0xc6624e63
+	0x93cfbdff	0xa392d1a7	0x8917d687	0x542dca54
+	0xf930db3c	0x530a62e0	0x6c3139ca	0xc733bbf5
+	0xfa22ff43	0xf91198d2	0x27ebc843	0x6fc4a872
+	0xeeba081f	0x71d8a984	0x2cbb615e	0x08f28f4d
+	0x2c242252	0xde7bd041	0x5e337eb6	0xdd6a8653
+	0xbe10c145	0xfb5c313f	0x9c8be692	0x3e9c4715
+	0xd3a028c0	0xd87cf41b	0x2d7ce48a	0x3527909f
+	0x2fe5a866	0xb8d7d44a	0xdeea8a8f	0x7e39ca58
+	0xaac93e0a	0xec7dcb33	0x0ddf07db	0x024c82f9
+	0x4c06c528	0xb1c9bbfd	0xdea798d2	0xc0518d93
+	0xf9309f76	0xe3a80954	0x5f5fc8e7	0xe42ce642
+	0xc13a067b	0xeae08cce	0xbf7a70a0	0xc23e36fc
+	0x57b7e071	0x74b9fd8b	0x49cc2ee7	0x566ae6f2
+	0x1a566458	0x0fba6473	0x207838e2	0xf830c013
+	0x2ad8f7e7	0x4a962bab	0x5656179b	0x50edfc20
+	0xd7eceadd	0x19833983	0x0ac98913	0xc78e1e72
+	0x22626a8f	0x07abac2f	0xbf64e3b9	0xd6e2be8f
+	0xf3bd33f4	0xc1d727dd	0xe6ab80c7	0xe01d5026
+	0x0b9f81b1	0x167d09db	0x168f9fd8	0x270f1384
+	0xeeaf0e65	0x33f0c489	0xd3871743	0xd885ee70
+	0x49157f15	0x4677fd7c	0x06211cc1	0x4dd6cda4
+	0x92f0e059	0x8bd2481d	0xf580ab05	0x74cea2fe
+	0x0972a039	0xe362b4a9	0x18a688a6	0x32eea77a
+	0xb4b28ba8	0x366b59f2	0xfd04f522	0x97cee744
+	0x455e8819	0x2db1da4b	0xb2ac81ad	0x85868d24
+	0x91a9b381	0x2ce1ae15	0xc8261a26	0x3c314755
+	0xf57d98fc	0xcbc1eeaf	0x26a2423d	0x3e4b57c1
+	0xd411d2c7	0xfd70ba8f	0x42940578	0x1fffe7a8
+	0xa34c60b5	0x8fe0d771	0xeae9f523	0x928d2b17
+	0x6174105b	0x42e3ab20	0xfc8477d0	0x0ff054a1
+	0x2896b26c	0x33fc61cf	0x5b8097d5	0xafd8a429
+	0xf18e6b50	0xcdc292e9	0xa2846d37	0x82656479
+	0x05e34533	0x3cc6434f	0x5a132ede	0xb2b47148
+	0x2380b9fc	0x6413dca9	0x3609f82a	0xbcfd5ce8
+	0xa234f6a1	0x70c158c2	0x8d516132	0xf8ffa8b9
+	0x39629663	0x361d3077	0x54d3a1d5	0x5c78770b
+	0x0d12c667	0x200ee0a0	0xb4c5494c	0x417161ad
+	0xd641d326	0x7e6c924e	0xdcb14454	0x52ec57a9
+	0xbdb8a491	0x214411c6	0x0f7aa41a	0x219a4610
+	0x77aa93a6	0x9f260e58	0xab671d2d	0xa738db71
+	0x3b794aba	0xd4d96e58	0xf4234dd4	0x119417e2
+	0xcc18e115	0x28abe734	0x2e3364f8	0x0eafdb5b
+	0x9a917e82	0x6c49a8c8	0x41cd3d33	0xd4d4c8dc
+	0xf2fdd3b7	0x9f033d83	0xc6383f73	0x615ab71f
+	0xd59d74b9	0xfdb24bd3	0x1a2b929e	0x9850abc1
+	0x06ebadb9	0x452d5748	0xd4dbd979	0x319b06e5
+	0x8cda871e	0x4c4d8acf	0xa65d3c10	0xceb80135
+	0x6362f88c	0x588c3cbb	0xc92e07a6	0xdf156666
+	0x5776a8dc	0x24615805	0x78a31c47	0x0a8e2897
+	0x924e21ea	0x3c9e4844	0x8beb8379	0x1a97c923
+	0xa66ce316	0x19b2520f	0x613db392	0xde86323b
+	0x6d986a88	0xcaa79411	0xe5236511	0xdcb10401
+	0x180e3dd3	0xccd3566c	0x34fe6a8c	0xdca4d272
+	0x7dc2d6b7	0x3445be9a	0x60ab92ae	0x973b90de
+	0xa0819660	0x3f3da862	0x7f948121	0xe35d655f
+	0x1f974969	0xd77e51db	0xbcac7e3f	0xc2e5ca0d
+	0x4a0fa8bd	0x3089fa79	0x5038a272	0x1309f923
+	0x2e2615f2	0xb1b51edd	0x6c74acb2	0xdc1348ca
+	0xf72c0596	0x7fc0ff17	0x23d5de89	0xe57f53b2
+	0xc2c3bd15	0xeb38d68a	0x0f5fc1aa	0x048aceb3
+	0xaf834119	0xb87a70cd	0x6f55c303	0xe805dc32
+	0x428f2215	0x8c1fe4a2	0x60f3f83c	0x958b6397
+	0xe1636adb	0x2d664743	0x407145a1	0xb99881f5
+	0xe69cdc72	0xf9ea8ca8	0x10990d7e	0xdce842e9
+	0xf516bbbb	0xa135ecd6	0xadbf1a3e	0x894687d9
+	0xa7f833a2	0x7c28a41f	0xb2bae9e9	0xb601eb62
+	0xd15f1fb0	0x812f61cf	0xe3833aa1	0x9dbeef8f
+	0x44020023	0x8dc8bed3	0x89319828	0xfd2eb018
+	0x00fedd3e	0x484dfa16	0xf7509751	0x5efe134d
+	0x30e92cba	0xd3d915cb	0xe2a6ea2e	0x6980c6f7
+	0xbaa228cf	0x439a0d8c	0xfb7dbfcc	0x482b24f1
+	0xe7de15dd	0x2fbfba0b	0x32ff4379	0x6d3235f5
+	0x643c45ec	0x271b652a	0x89e7ff62	0x0ab8b2be
+	0x09378021	0xce24e1e2	0x6565cf41	0x6f72e9d1
+	0x8767b9b2	0xa07dee1d	0xfecced65	0xf99321f0
+	0x8005ef02	0x842d1c6e	0xcd2c837f	0xe3614a4c
+	0xec977891	0xe632b995	0xbea82e41	0xd31418d5
+	0x96608016	0xa7ceb9fb	0xb02cb3ea	0xb0343ccd
+	0xacc278bd	0x142e4f1b	0x3d233a7f	0x4af4c3db
+	0x85279e02	0xe7b8cf1c	0xfa9bcc8a	0x72b8902f
+	0x7f45fe1d	0xb2726325	0x9c1d71f7	0x83935b50
+	0xa136f758	0x396424e4	0x674c2a3b	0xb8077412
+	0x547677bd	0xc47f916e	0xb4c3357f	0xd1147d60
+	0x228303a1	0x97d7b3e1	0x355d23a5	0x778f2f18
+	0xa20d6acb	0x7062246d	0x04aad4d3	0x4696f496
+	0x1000ac5b	0x5005eea8	0x51a26d3c	0xd782018b
+	0x65eeee7f	0x4a37d244	0x8d5c78f5	0x4276c06f
+	0x7b051c97	0x340f3f54	0xc818f340	0xd5436752
+	0x311d7cee	0x87f1ae54	0x77c99d33	0xcf913f56
+	0x97a1faaa	0xfe3a1719	0xba390f82	0xb715b00b
+	0xddfa1183	0xf3af7c0f	0x8601aa46	0xd18e0cbb
+	0xff036109	0x4985dbbc	0x4ed2596b	0xaa4dc69c
+	0x707e2300	0x51d4ed57	0xceef773d	0x7b70150e
+	0xfe007480	0x000041fb	0xc0fb79a8	0x437f1ab9
+	0x7fb711e5	0x833c06f9	0x064f9291	0xa9c5a76d
+	0x402383f9	0x9a5b6de3	0x5fdd7c09	0x69c57f17
+	0x243a4d39	0x4b91a17a	0xadb16f23	0xa95843ba
+	0x52dc3827	0x5c15f379	0x76f0179a	0x65792a3e
+	0x5becc4c3	0x879159af	0xdc96e7b4	0x81c96a72
+	0x9cc3ef98	0xc9a03721	0xb5e0e950	0xba46151d
+	0x73522da1	0x8e5f8e26	0x0ab8c9a1	0xb9e86fd6
+	0xb133c5fb	0x0605aa96	0xadd00ab0	0x759b6321
+	0x7f9d9ef8	0xdb242bb2	0xa4b339ad	0xe332a5e7
+	0x66d52605	0x3a03f318	0xff0d15ae	0x1db610dd
+	0xf65b1039	0x97be3c69	0x22a104ab	0x4a6c1b6e
+	0xc1bc3435	0xd57c4c33	0xec1a3ca2	0x5161f419
+	0xb2cd0cee	0x71a394dc	0x94c23225	0x42b398ad
+	0x29164e15	0xfaad2b2e	0xca59ad9c	0x360a976a
+	0x0c8d7304	0x8fd6ac30	0x684c3d63	0x564defb6
+	0x265b343e	0x22158f4b	0x354cc488	0xb5059d68
+	0x014520a1	0x6c493ce9	0x221166bd	0xdea1f9e3
+	0x2f69ca64	0x9c3ce396	0x7d1a5f8f	0xfd6a57c4
+	0x8764c0ec	0x41e15814	0x35c1bad6	0x2c539519
+	0x65087c3b	0xf5b3830c	0xc2bc2993	0xa1b3cf19
+	0x576391f6	0x5ce0cc84	0xab879f90	0xced4619d
+	0x19b6bd51	0x355d2c3c	0xa4133356	0x8a0e318d
+	0x535b8cc9	0x35660d4d	0xbca8d6ee	0x32215f13
+	0xde46d9f9	0x982ad7db	0x9f7eec2d	0x5282abc7
+	0xddf348d7	0x43cd6a3d	0xd63c9cca	0x7ca44fa2
+	0x0bc2f640	0x97498df6	0x30501800	0xd61520cf
+	0xbe3f76b1	0xa25a0c07	0xaa57867b	0xc0315c66
+	0xf4310292	0x21811c11	0xebc3482a	0x3a7b6e50
+	0x9cf2d841	0x92f00e94	0xefba5af9	0x25d2d9cd
+	0x737be378	0xdce27210	0xdf16478e	0xd9e45484
+	0xe402d70b	0xd797db64	0x03fe0e77	0xa89c88d9
+	0x09f22ee4	0x729caf19	0x23290678	0xa4bb622a
+	0x8730fe6d	0xb71f3eb2	0xb48452d2	0xe6dee29e
+	0xb91933b9	0x2a4ef477	0x7d5c4791	0x8b35cf57
+	0x3f1a49a4	0x3f585ea9	0x4d3d06a2	0x3531f766
+	0x4e9314ab	0x82e165b1	0x9b0493c3	0x898c6db7
+	0xdb53b9a8	0x266dd07c	0xb2be18e2	0x1ba50fca
+	0x7cf32c0e	0x227afc92	0x52c76fc4	0xe7f17624
+	0x0cf1789e	0xb1adfa4d	0x67773b86	0xcd46a6a1
+	0x3c9ea75d	0x73d3fbe7	0x7b0d0b80	0xe88f3ddf
+	0x20bd2842	0xb67a3c9b	0x0b3db9b2	0x62fbbdfd
+	0x76df2365	0x4b2bff0c	0x9c26c9f8	0x26079266
+	0xfc18b24e	0xc38a4fd6	0xd45ce2e8	0xb30cbcae
+	0x0f80fdcf	0xf2e8adfb	0x11f4bc7c	0x98102829
+	0xe40358f3	0x50d35ad4	0x117432cc	0x4e6fce32
+	0x695d7b3e	0x98d28a2e	0xe570db97	0xc015fd81
+	0x137f73dd	0xab23d5f1	0x7e8c0e6e	0x72a1a57e
+	0xe58cfb67	0x604f84cd	0x43ffacb6	0xae73cc50
+	0xab34f299	0x0b3035d0	0xfe214b74	0xed2a8168
+	0x3da3450f	0x8e51b78e	0x253e72b7	0x8b620f54
+	0x8b63af50	0xce340e10	0xbb419809	0x5ba00635
+	0x42493b0b	0x8ee85bd3	0x49b6a7df	0x808fea2b
+	0x091c809d	0x0cc496db	0xea6642fc	0x601d5000
+	0x3589e04b	0x714096d2	0x4e55569b	0x1c45121a
+	0x04a6050d	0xfd47c074	0x57269ffc	0x3e06836b
+	0xdf8f7d43	0xab671a69	0x0d0df4dd	0x54a67c89
+	0x92d408a0	0xf378abb8	0x214d6425	0xd91d7194
+	0x6dcc9cdd	0x02d27ea9	0xd4d4a4e2	0x7bdf848f
+	0xaa4149c3	0x9df0d2d7	0x8800c904	0x192fd5f5
+	0x10dbb590	0x5b8b1e2c	0xd5b5dad6	0x30ddbf84
+	0x405edb23	0xcb906b8b	0xd9a124c7	0xe7ac7fb1
+	0x2a7a4ba5	0x90fe1e2b	0xbf9323e3	0x50469643
+	0x16c8926c	0x6dff898a	0xd56a03ee	0x29ee3e30
+	0xb1893885	0xdc1e2e0b	0x87cedfd0	0xe458d4b5
+	0xdb878d28	0xd151d52e	0x6e5aad6f	0x0ccc8b2a
+	0x5a1fe08d	0xed61dc74	0xa4649fb0	0x670c43b9
+	0xd7b22c7a	0x4fbfeee6	0x77341a4a	0x28b2f3b8
+	0xd81079dc	0x9a81c4ad	0x1dcebd98	0xcbee2e9c
+	0x746399bf	0xf3383a23	0x5c5468e6	0xefadf365
+	0xc2a7a3db	0x08c1c628	0xf14191fb	0xbbde23aa
+	0x47f7c782	0x357b117a	0x2c2a92a1	0x87ed1511
+	0xa8d709e8	0x7de8749b	0x92199870	0xb8017e07
+	0x481b9913	0xf1a31212	0x5fb4f7df	0x07e246e2
+	0x274c1754	0x14fc9659	0x2513158f	0x4f8639b4
+	0xa602189b	0xbc1e3f31	0x311ff0b7	0x5ca7c9e1
+	0x49747707	0x350cc8ac	0xf6bf896f	0xdc0bc1ac
+	0x1f0d3ddf	0x21a21a62	0x80711ab4	0x60f70fe0
+	0xaa5ade5f	0x914eba42	0x0fed2bc8	0xaf4d97d1
+	0xf294b5ed	0x24ec5df9	0x66db067f	0xfb2b6ce1
+	0xce42c8b3	0xfb027c19	0x79447655	0xf0673adb
+	0x72befbe6	0xb25247a3	0x0813dc37	0xe640e10a
+	0xf45759f6	0x328aee51	0x95d537c2	0xd2de2137
+	0x30327a18	0x9e934258	0x5f0dfd3c	0x34b88261
+	0x5ca0fc63	0xd4ff6e27	0x2f287435	0x38be55d3
+	0x3590bf93	0x6497ddca	0xb48bf82d	0x3aa7c943
+	0xf705e627	0x2ecefc01	0xe85a739b	0xd91d2b1a
+	0x178dcb38	0xded1e432	0xe119864d	0xec965444
+	0xb6866cc7	0x84160d5f	0xa72c6b30	0x78223f8e
+	0x303132db	0x00f10c7a	0x6238a0de	0x9217bb53
+	0xe0313377	0x318ebadc	0xf9854726	0x632b2df3
+	0x16ac7842	0x2c0958df	0x49a879ac	0xc49f1fe9
+	0xa3e7c05a	0x811e01d4	0x9b11ccf2	0xc32eb57f
+	0xefdfc729	0x38fb8cc3	0x6781c78b	0xfab82792
+	0x08da3c82	0xaf0346f6	0x6588d336	0x06ae489a
+	0xb58419ba	0x771f3fd4	0x53f42a79	0x0653504f
+	0x93330a58	0xcddab350	0x2d44eda6	0x7860152c
+	0x63b3e12e	0xaf7dc6f6	0x5cc5ad4f	0x95b9d06e
+	0xddcfc613	0x84f74de5	0x51694312	0x1950051d
+	0x62cc7724	0x06742036	0x92e8805f	0x679a3c64
+	0x87b8f43e	0xce386713	0x5b476587	0x300ca68b
+	0x7d2fa903	0x552489d8	0x25ead402	0x8d0cc96c
+	0xb5c5ee96	0xf0b74e97	0x999b0e56	0x217d326d
+	0x45edc298	0x5d269e37	0xc88487f1	0x27ef568e
+	0x833ff6a2	0xf832552b	0x5a56b672	0x21379d3c
+	0x5de123ed	0x1617159c	0x666699f2	0x165b3fc5
+	0x04a8177e	0x9412ca1e	0x196a603a	0x752d8a13
+	0x46bd8094	0x200d93cd	0xe6f9002a	0xd2444774
+	0x29aee76a	0x13d6cb75	0xc947e68d	0xbfea3352
+	0x2fbbf62d	0x89dad4df	0x0f771fcd	0x2b5c3135
+	0x658aac69	0xe980266e	0xaa657242	0x8440f399
+	0x19ac2617	0xe74b3e55	0x9639c72c	0x25bc2843
+	0xe5428269	0xb06b7e52	0x47e3f96f	0xc3ff329c
+	0x7e428457	0x3b877e30	0x824d6981	0x8d66bccd
+	0x3ef8b239	0xb90ceaa8	0x5323ddd1	0xfd9f9711
+	0x747920e0	0xe64253b6	0x7bd26403	0x1cc2ad5e
+	0x51612252	0x39d671d7	0x5043d9db	0x4c1d9cd3
+	0xf1e48340	0xb68e5148	0x77d7ee51	0xb345cb5a
+	0x639e92e6	0x458cb2b0	0x2cb49fe4	0x01683f64
+	0xbeae5114	0x20d167c3	0x8439bb31	0xaa11d7f3
+	0xdb14315f	0xc474fe90	0x2992dc24	0x8ed70fb4
+	0x73228ecf	0x016c6e08	0x9bf91825	0xa13662f4
+	0x86a759da	0x0cb6d6b7	0x43d67df0	0x2badff1c
+	0xd1769bfa	0x0f5aefd4	0xbe2e49b0	0xa6e91ea4
+	0x046c73fd	0x38b33892	0x37a3ab24	0x30225f43
+	0xb4e9d784	0x0b8d3c79	0x83411221	0x0080586f
+	0x0383f4d7	0xb4733a71	0x4609dc6f	0x149e2be3
+	0x16be8f2a	0x6155a89e	0xdb42ebbc	0x4790004d
+	0x0b84706e	0x24d8e7a7	0x7434cf91	0x4aa01729
+	0xb285bf41	0x894256a9	0xc346c2ca	0xcf83c38d
+	0xd7a9df68	0x61e95cf5	0x05458abb	0x2468d516
+	0x6cfc6f97	0x06792edb	0x0faec9e3	0xcece2cd5
+	0xfcc300d4	0x93b52c8b	0xf9f81fa4	0x8a9d62d0
+	0x94715de5	0xcc4f5ae0	0x724c65ed	0xbc9d2513
+	0x3ff58f0e	0x2571d254	0x1b2f8fb2	0x593ff054
+	0x1542e7fa	0x5e2b8733	0x135f62d2	0xe5b8f1de
+	0xee3852fb	0x9e1bb2ff	0xcfe6ef95	0x85e3d35e
+	0x5fc2f0e4	0x1e391bc0	0x0c282cc5	0xc14e84a3
+	0x4a566eaf	0xac04ab06	0x15e9bb8c	0x74a82932
+	0x615af08f	0x92ca2937	0xa04182e1	0x8964f936
+	0x9c00cfec	0xf8ee661e	0x60c0bfe4	0x9d1c2a39
+	0x164f0f50	0xc1cde961	0x1ec2dbab	0x441312dc
+	0xff8f746b	0x4fd8e2f4	0x7d41bec2	0x610c39b8
+	0xe54eb811	0xed6eb997	0x6aef9b63	0x2ca1fa79
+	0x6a0741bd	0x9b323ed4	0xa9e51346	0x4c7c19dd
+	0x980117a9	0xba0a00c4	0x501e433f	0x3010f10c
+	0xd7cf710d	0xf03ab992	0xa9df2b11	0x2939a708
+	0x90182f87	0x2f5c228a	0x7982d287	0x4cc9aa36
+	0x4db0ac5f	0x2d5eb58f	0x78029b74	0x9e592313
+	0xac57236e	0xf5d3ba18	0x1310184a	0x0291a22f
+	0xa2bcae47	0xd4aafc4d	0x50f97087	0x9f428c85
+	0xe8b1d16b	0xbcf3cc24	0x2febcdef	0x8baaf25d
+	0x4839894d	0x713618c7	0xc6b4119c	0xa72804f7
+	0xf9ed3930	0x947ab473	0x52ba8d8b	0x9d3ef240
+	0x928262f3	0xde8a2e3e	0x0dd1a3bb	0x124cb146
+	0xbff6b771	0x8768185f	0x9dcfc72f	0xec46ce1f
+	0x55eb08e9	0xee110630	0x4f1abbdf	0x790d96fc
+	0x0edeee84	0xf4effcfe	0xf171d08d	0xf0ea076d
+	0xcfc6bcbc	0x2df2d7a3	0xba1a967b	0x1cea509a
+	0x1594c0cc	0x08339c8f	0x8633f7ad	0xcffdc9c1
+	0xb620cf8d	0x3807a89f	0x6b992761	0x222d9a95
+	0x900f8f87	0x0f085c6c	0x5ce2975f	0xfc2d28e0
+	0x1f1e2d6b	0xd2af1514	0xa3cc5dfd	0x301cca91
+	0xb02b1b87	0x070126f0	0xa18820db	0xaeec06dc
+	0x7f12ad58	0x79c8c8ba	0x173b231a	0xd52de2f0
+	0xdb67eb9e	0xd50fd00c	0x1767d59c	0xe83c1fb0
+	0x3d079a0a	0x34aad1b7	0x8e410684	0xd17f51a4
+	0xadadb74a	0xcc20b073	0xce1fc8e2	0xf9faa5e7
+	0xf7b96bfe	0xf1dc7007	0xf2a5df74	0x3036f630
+	0x0fddcd9b	0xd3292ad3	0x2e565365	0xa0bdfdc8
+	0xcea1dfaa	0xb161265e	0x28e1b5e4	0x6b718da8
+	0xab2fd7cd	0x06cf49cc	0x00db7d65	0x6bb855c2
+	0x6c58fb02	0xc34b1948	0xbbb039a9	0x7df185a1
+	0x323d797f	0x1f21b9d4	0xf63332de	0x03d84887
+	0x8dacb69f	0xb33e6158	0xf378a088	0xcdf7408d
+	0x9d54f759	0xc94c5d13	0xdf657953	0x77f8dc3f
+	0x432fb39d	0xedef8db3	0xd8443326	0xa06eab9b
+	0x77029612	0xcd729e14	0x3d1b4677	0x07c424af
+	0xf599ada6	0xb0eb8eee	0xd775afea	0x3013ddbf
+	0xe9d06eef	0x09600082	0xe8cd4c2a	0xd3ff4417
+	0xfe29cad1	0x2173b541	0x33585437	0x769344c8
+	0x02de5ca2	0xf5206b44	0xf3e34d41	0x6deba140
+	0xa79632c6	0xc9ba3a50	0xb3515fa1	0x9eee380c
+	0x4ad5290c	0xcb4739c3	0x71da64eb	0xfb559aef
+	0xa3091f65	0xfdef610a	0xce5412ec	0xcf498deb
+	0x26e1c1b3	0x2a8fb23c	0x0695459d	0x5a4c277a
+	0xdd483fbb	0x1a78ddd3	0x24c0c414	0xaa24b351
+	0x20c848cf	0x94dd1387	0x0fb0016d	0x9e1b83a4
+	0xafe2c58d	0x596d1cc6	0x42376363	0xa6b0a5ac
+	0xa6c30abd	0x067d634f	0xf921e454	0x1e86e083
+	0xb5986bd4	0x3e4e7b76	0xe02427d9	0xf39df942
+	0x77f82cee	0xd7cad721	0xf884ea2f	0x0247e300
+	0x4dcfd3ec	0xcd3595ab	0xca789c58	0xfd6f4b59
+	0xf39a1fb9	0x60d80d9c	0x67dc447d	0xd061e922
+	0x5c4ddc32	0xd87a0e11	0xec53091b	0x88f73838
+	0x4a30fbf4	0x77ddf719	0xec903563	0x1103cc06
+	0x38d36baa	0x6e7822ae	0x7e238d27	0x9f10f184
+	0xdc571ae9	0xbfe5a7be	0x60796471	0xe7193642
+	0x8f4932fb	0x3288ea54	0x880b61bc	0x6f5adeba
+	0x88078ffc	0xf53a7321	0xda5f397b	0x797d53cb
+	0x170023b2	0x2ae674b8	0x41ed6927	0xfc416bac
+	0x9517d112	0x8131bc8b	0x9207340f	0x0860f495
+	0x5ee42625	0x21abd2f4	0x730cc2bf	0xb705d5a7
+	0xb0ceef46	0xa9e1580f	0x04379973	0xbc2de3f3
+	0xbbf47518	0x8135e690	0x7dcaa849	0x2d284fcc
+	0xdb956dc3	0xa01dcee4	0x204879a0	0x25d4ec0a
+	0xab883c9b	0xf4c98ae4	0xd6ff96c8	0x1c44bb4e
+	0xefc0ce75	0xa018f744	0xf3b708b1	0x5219e162
+	0x03c478dc	0x56de45d4	0xd16b9680	0xf3809c02
+	0x3078072b	0xd1b792b0	0x1dc53f6c	0xf39f77ee
+	0x74db19ab	0x2d9772bf	0x1d117036	0x8439e76e
+	0x15550137	0x9378cce1	0xa3007b8d	0x44246b55
+	0xe27a583c	0x93fbb9d2	0x14b875ab	0x58ba4172
+	0xf70336a2	0x1a193fa6	0x6edd7c7a	0xf9d7abad
+	0xce49c41f	0xd59e4f0a	0x87c209a9	0x6c531d65
+	0x5e8b2912	0x4985e164	0xaa30d916	0x04c7a98a
+	0x92ec0a16	0xc81e0c8c	0xaa7fbc60	0x73c9997e
+	0x1080f5ff	0x05824cca	0xa465ca7a	0x4e7aec8e
+	0x5e230d7f	0xbd80153f	0x2f9fc7a6	0xfdc2e4c6
+	0x8447f46f	0x2b98b918	0x934e2131	0x89e96a33
+	0xaafe33c9	0xe821a560	0x3a7c81b7	0x3905eae1
+	0xec902015	0x8b70db58	0xc6e5cfd2	0xfffeeb18
+	0x4b79d360	0xb7d2a21d	0xa6742dd5	0xc38a9ac5
+	0xe4f33f88	0xf7864b38	0xb937ed2b	0x286ea756
+	0xc7b977e8	0x117abf40	0xc52e4e8b	0xd8423c60
+	0x4edaf3de	0xca387d75	0xb9fbe5f7	0xda6f9543
+	0x29684231	0xfdde17b2	0x55d9da3c	0x047472cd
+	0x48aa5670	0xd0fc555c	0xb694d68a	0x225d0c82
+	0x65da3f2a	0xa8da5a72	0xba791eb0	0xf6dda6d0
+	0x6f408fba	0x0f3e53c4	0x42dfdd18	0x83afd9ec
+	0xc0c28641	0xe9aceda4	0x9a57bb91	0x509ae5bc
+	0xfab6364d	0xa965bb80	0xed52b4ce	0xa9637114
+	0x1ba06d2d	0xe2a071a7	0x4f8005f7	0xc01078e5
+	0x6c8c1b40	0x0d785131	0xf89f318a	0x7a859d66
+	0xa54c61ba	0xa1ac3829	0x5846abc4	0xa4bbee21
+	0xc150c513	0xc43e56b0	0x2b9b6c2e	0xbd23ac4b
+	0xd5bb877a	0x26aab6e9	0x3175a360	0xa417779e
+	0xceda5542	0xd6ac1111	0x3631f049	0x822d6fd7
+	0x456b5441	0x14815178	0xf26c6347	0xcb2f0ac9
+	0x2876a89e	0x5d77052c	0x1dd9903e	0x1a243b17
+	0xd32ff417	0xf2ee16cd	0x29c1e28a	0xab23c5a1
+	0x7bf92552	0xb3ff18d6	0x7218138a	0xfc4c7fb0
+	0x8b431515	0xf42dc92e	0x39c27b33	0x5439b8c4
+	0xa044cf7a	0x1904dafc	0x8334b7b5	0x5285f6b1
+	0x64cec961	0x90bca178	0xe3108fb7	0xa0f64d12
+	0xf1bb4b0e	0xff22ca3d	0x455af526	0x45398675
+	0xac6db8a4	0xdd6b3cdd	0xd93e0ade	0x6407f4cb
+	0xe1434f7a	0x5048390b	0x9ecb584c	0xbaabceb3
+	0x592859c7	0x0b6dbd23	0xf5579ec8	0xfd372708
+	0x8d306020	0xafda0c88	0xe93bbcf9	0xeb0f3a50
+	0x8a0e1c30	0xfb926ba9	0xf628b5f4	0xbbef7f64
+	0x59bee520	0x8c95cf83	0xa9ff6a92	0xe8d43591
+	0xca0252b7	0x44311a65	0xa90c0287	0xd6769de5
+	0x647a9d7d	0xb3430eee	0xfc295b9d	0xfaa99965
+	0xfbc57eaf	0xcd1e38dd	0x4173522c	0x815845c3
+	0x2146414c	0x5d5c5b01	0x8a309fe7	0x6aa610e5
+	0xd102780f	0x89e6e565	0xbdac3838	0x32626179
+	0xa2a55556	0xca7a20a0	0x9e746a00	0x02726584
+	0x804f9c1c	0xa1edaa0a	0xe2a2ee7c	0xd1c5657b
+	0xea483c23	0xc6642eae	0x0a85bd37	0xf1f3be44
+	0xf82905bc	0xe412fc3f	0xf6bf0714	0xf91a7e1f
+	0x661f92e0	0x7283395f	0xf014d2a6	0x499044df
+	0xefdc70b2	0xb0f4e6af	0x75ef5398	0x08ecefe1
+	0x8be7f455	0x29b91faa	0xcd1622ee	0x3b4c3bf9
+	0xba7b11c5	0x0e4e91ad	0x29af310a	0x774115fc
+	0x7e6f4914	0x4ba6c995	0x211268e1	0x03b24064
+	0x558cc226	0x40d503c0	0x2af0591e	0x99792856
+	0xc5b667cf	0xd1e2cf31	0xdce9955a	0x061782c1
+	0x82b31a76	0x67bb7082	0xecab8414	0x0b20cf81
+	0xb8a21305	0x2bc2c62e	0xfb6a7ebb	0x598d2036
+	0x9f7f9f79	0xad9d6b51	0xa30bfc49	0xfec190dd
+	0x17fe7e3e	0xd020fbae	0x52ec37c5	0x6d9dfd4f
+	0xb4d1cf48	0x4d91b929	0x1b3e4116	0x81e109c2
+	0xe13316aa	0x8b49b605	0xd5c036d5	0x4feae27e
+	0x452760a0	0x308d5266	0x5af8ac2e	0x519bdab9
+	0xe2c88a12	0xbfe6a961	0x6e54bc3f	0x8143030f
+	0x5d47796a	0xe91fa496	0xd80e7e62	0xc5274d87
+	0xf0f7414f	0xd8a592cc	0x41fbae5c	0xdf848359
+	0x545f2e32	0x8650dbfd	0x116de333	0x5a013231
+	0xa9c16828	0xc103b508	0xc2230535	0x7167b332
+	0x7c0c8804	0x0a4f7a6f	0x3ef1104a	0xfa3401d3
+	0x042ba25c	0x05716cbb	0x88954de8	0x769902f8
+	0x93f8369f	0xdce3dc03	0x0f5bd13b	0x3417fbb1
+	0xe311cf44	0x8b6d116e	0x8a940805	0x53023454
+	0x2b608182	0x67424c31	0x9528932e	0xb4b69459
+	0x75308580	0x0d3097fa	0x4381d82b	0x75d297bf
+	0xda6c7f10	0x6adca79a	0xdd174f45	0x6e237e9a
+	0x5f17578d	0xea2869b6	0xd4ef7d60	0xdcf1e34f
+	0x39c0984e	0xca3cbf68	0x2b846994	0xf3c04152
+	0x58ad6900	0xa27a0473	0xa86814e1	0xb504c81d
+	0x0a263d9c	0xa21f5bfc	0x3634f89c	0xf2698fcf
+	0x0f10789f	0x580923ee	0xdd27aafd	0x49334c8f
+	0x6fc30ea1	0x535b6eec	0x103d548e	0x57681176
+	0x17152c46	0xf67cce7b	0xc6f1f215	0x763ec7d2
+	0x66f46032	0x9c7749b9	0x6ba3832a	0x24d788bc
+	0xcbe6ac21	0x1cc634fa	0x06b8d601	0x68b1c34d
+	0xef7a7f38	0x92c02580	0xfd5be079	0x67ec014a
+	0xda6a5b4c	0x9c884cf2	0x2e0cd606	0x1cb05866
+	0xf333f9be	0xd5585da9	0xedcecefa	0xb0224027
+	0xb2511fcf	0xab2440e6	0x77414c23	0xdc9263a6
+	0x25926b77	0x6083751b	0x825d995a	0x10ce9058
+	0xd91e2b6d	0x76126062	0x5f28b9fe	0x8df86405
+	0xb6e5bb6f	0x8eceac86	0xd08d074e	0xff4ed3d4
+	0x5fa5cf88	0x53c405b4	0xc60e7599	0xc07ef3e0
+	0x4435a7a4	0x28c490fa	0x9140004b	0xdb19895c
+	0x25d05b82	0x53d58535	0x8a2d6446	0x3e87d549
+	0xd961b6fd	0x76f8b718	0x6f0fd68e	0x86a7da31
+	0x4fcac697	0xcb4385aa	0xceca1471	0xc9ea76e9
+	0x18a36661	0x8da1db39	0x02bdd85a	0x56b5f9a5
+	0x39bdf861	0x206004b2	0x7a780b2e	0x9512fc70
+	0x8e128f45	0x964b5d31	0xc60ad183	0x763695fb
+	0x7addd1a6	0x8efae2e7	0x57b23dfd	0x91cdfc82
+	0x203aae3c	0xca53b1ca	0x05388d1c	0x3d5715bc
+	0xba33759d	0x2d3470b5	0x3b36c53c	0xe38fb71f
+	0x4c37e926	0xcba524c6	0x00d65da4	0x9d0dcb37
+	0x3a291c08	0x81ee1ef2	0xce1ecb25	0x6e34393f
+	0x4c7f9478	0x7bfa3437	0x3cf9d845	0x900979e0
+	0x1ae6a7c3	0xd5b64d84	0x467a16e6	0x489a3fee
+	0x73f7a7b3	0x29d2d941	0xbbb6cf3c	0x7478de98
+	0xa4618be0	0xecd3bf7b	0x9ec7a549	0xd762012a
+	0xbfc200db	0x172876e7	0xe3686578	0x74a03861
+	0x499dd970	0xb3600340	0x17a21676	0xe4f76eca
+	0x413c2938	0xa21b445b	0x30e36091	0x095c523a
+	0xf30af4b4	0x236740c6	0xb6a50c97	0xc285f888
+	0x5c45b9f2	0x6d2e28a5	0x561afb4e	0x112576fb
+	0x7740b38e	0xfe3789e5	0x5099bd10	0x8e565b15
+	0x463baaaa	0x8b712085	0x99fbb7fd	0x8b415a46
+	0x517c8de4	0xfcc385fc	0xac9fd9b4	0xdb29a377
+	0x3494419f	0x825386fc	0x6eeaa91d	0x2f48dbba
+	0x4615049f	0x90530f6b	0xfd2ddf08	0x97ee1b44
+	0xeea55310	0x6802e808	0x116d9cd5	0x874699d5
+	0xb9ec222c	0xbbc6e9f1	0x339cda6c	0x32d2c15f
+	0x10f073fe	0x2c544e3c	0x518503a8	0x24b730a0
+	0xf252cc99	0x6518b218	0x771d5ff3	0x841cc2cb
+	0xd3870e5d	0x6b166d5b	0xef10e55a	0xc873d615
+	0x5531c97b	0x6a10a199	0x63158156	0x40740e69
+	0xed060c8d	0x37625a2e	0x939ccd42	0xd225f0c8
+	0x060be21a	0xab542cb2	0x564ebdad	0x6d0e949c
+	0xc162caa1	0x22560483	0x26ed1b27	0xc8fedf98
+	0xd7358719	0x7b219308	0x327139b1	0xfb660fd8
+	0xe2d4e408	0xf9019405	0x38e6c024	0xe6ca02af
+	0xdaedb8e2	0xa81c4fec	0xa163e63a	0x9469e3e3
+	0x8bd652d8	0xd9692460	0x61671766	0x566dd7d7
+	0xd4ea8885	0x9f7c006f	0x963a23f9	0xc2a2abc8
+	0xe3f08b74	0x3411628d	0x0d5d26ea	0x368aebf4
+	0xeb8dcadb	0x3573f8aa	0xd23cd73b	0xa9b3c7d5
+	0x3119a47e	0xa5354659	0x7e375817	0xc7b36bf5
+	0x70c7ba81	0xda84798c	0xecf9aae1	0x52423bc0
+	0xb848058f	0x5dfbc1fe	0x4bd58fc6	0x38dffde2
+	0x8f41473b	0x8f2e8d22	0x5ba888ce	0xe7496da4
+	0x46ec5aa5	0xbb8cf063	0x9effa0b6	0xa487f166
+	0x1ceb3e26	0x468aac4b	0xe006c9c2	0x97b79086
+	0x1e53d58e	0x4ef59d4b	0x4ecfbb2c	0xb6ecbec0
+	0xc82338ae	0x7db1ab21	0x24d1e3e5	0x04c19de5
+	0x376f474b	0x6369bdaa	0xd3220ffd	0xc05ee6a8
+	0x24c3a90b	0x34a6c61a	0x811ce30e	0x4dfe9d6e
+	0x12a85352	0x38014645	0x1c07851e	0xe9beb298
+	0x0ed63abf	0xd5b40ba9	0x7f83d8e7	0x7a53ae4a
+	0x7360dd8f	0x1be62e35	0x5511f901	0xfbb6afc2
+	0xf788d81b	0xecfb7225	0xacb286fc	0x148e9a49
+	0xac3ff738	0xa3f93f2e	0x47f89037	0xc3226d1c
+	0x9d349976	0xcd757aa8	0x2eec4d43	0xdd7e7c19
+	0xbe13b149	0x60b4013d	0x988966e5	0xa41bd486
+	0x2a364043	0xb7a77403	0x60188f16	0xd5a13b2d
+	0xebf92c64	0x8e82daa8	0xa302aa28	0x33bac63b
+	0xbeb1e4bd	0x27bd0430	0xbd8d35ce	0xd14a8967
+	0xa7016b70	0x8a6722c3	0x6ff26f0e	0xfa50fc75
+	0x59e52041	0x339151c0	0x9c4a41ab	0x9edb4197
+	0x08eb539c	0xc13c7254	0x7fcd3f75	0xb3ac16f7
+	0x1b15d8cd	0x0505c2f1	0x076a2636	0x1d3bdeeb
+	0x798f8347	0x70e1fe1f	0xfa8c3373	0x1d26dda4
+	0x8911d6eb	0xc7278a2b	0x7208b02b	0x028e3adc
+	0x18f8ab78	0x68377e63	0xd61901af	0x2c2e46b8
+	0x32b7e434	0x63cdafd4	0x78e918d1	0x0b674143
+	0x8293d0c5	0x0ea5da68	0x4984eefe	0x9b67e25c
+	0xf4aa5f43	0x877688e8	0x2d1c032a	0x55548305
+	0x64ef45d5	0xf73d1301	0x2418537b	0x60c08c65
+	0x24329668	0xc4ef5f1d	0xdfa2aafa	0x8958d85c
+	0x9d5924c6	0xfc1c041c	0xf507ea2c	0xf922715d
+	0x3e895a74	0x1689f90d	0x59da19ec	0xff295078
+	0x423557cd	0x5902762b	0x7e11ad6e	0x52b10c3b
+	0xb5d68631	0xe0278437	0xf9b57e12	0xaf124829
+	0x7e9a1960	0x5f3585f9	0x54dc91e9	0x6d421667
+	0xbecf1cd8	0x00077b85	0x56c0b10f	0xefe280bc
+	0xaf20574c	0xfdee86e1	0xf6404d91	0x90bf47af
+	0xd916e601	0xfb81954f	0xc095cb29	0xf5bec4a5
+	0xfcef97bf	0xb07e37ee	0x82b6b56d	0x04ea42db
+	0x60abe29d	0x8222eab3	0xfbbb230b	0x73d93c02
+	0x40da8a92	0x524ff943	0x78bf83d4	0xe1c37afd
+	0xa35155c2	0x48329b3e	0xc762a668	0x68b6aa7d
+	0x41b5876c	0xbf8a8e45	0x3e1a53b1	0x76e546ab
+	0x79abb608	0x4c0501a0	0x18206179	0x61ef55f3
+	0x8fa514c8	0xbee9cc2c	0xde6def99	0xdd666c88
+	0x0b0a5c54	0x2857ceb5	0xceed57a8	0x62d86d3a
+	0x1bea74c3	0xf35942a6	0x684295f2	0x561a041e
+	0xf305e199	0xcf0c0f81	0xf9ea7e7a	0x3484577b
+	0xb3ee4a37	0x02b7863d	0x9cea59bb	0x847f5fcb
+	0x3903c152	0x05482a5b	0x9ad5099f	0x28dea11b
+	0x47e3968a	0xf6080cea	0x1a63a706	0x8100411c
+	0x0227c6f2	0x52e5a652	0x91e7ac8b	0x989b3811
+	0xe10a5c8c	0x65eac802	0xbebb07db	0x823f8119
+	0x1f25f0ef	0x47e69451	0x9a6794f5	0x9b9fab61
+	0x4244a127	0x556c18e5	0xa94651d0	0xbe8a0554
+	0xedbc5f9c	0x6e8fa53d	0xebe3d4d2	0x91d3194a
+	0x1ab227de	0xcce6da7c	0x300e6080	0x9c8fee09
+	0x21baa932	0x2c807700	0x422d0f10	0x2b318ab9
+	0x45f759c5	0x5f7a961b	0x7e3e7554	0x52651209
+	0x1e3e9181	0x7c583d7b	0x74bc7215	0x397bbca3
+	0xc969c761	0x89692bbb	0xffe3e02c	0xb3cbaf98
+	0xeb9f4218	0x97269337	0x201b4633	0x47bbf0ab
+	0x954f00f0	0xe50597d8	0xfa30bd0e	0x34f97b08
+	0xe70230b8	0x5175d237	0xf6f05156	0xc6ef5b9a
+	0x5d34628f	0x96ae0d57	0xc4a1c34e	0x2883f6b3
+	0x813ae49e	0xb7afbea1	0xb369902c	0x236fcaab
+	0x9bd3e129	0x1167510b	0x935bde08	0x74782cce
+	0x76c4d54c	0x67324fe8	0x20fdf163	0x30edb4ec
+	0x3baf38e0	0x3338e653	0x632f3e83	0x53754073
+	0x87587c1e	0x505229c8	0xd84db10d	0xa011f5de
+	0x89a24ace	0x0ede0052	0x24cb60ce	0xed01cd5f
+	0x1a5dc2a4	0x40a1c78f	0x08c394c9	0x94e53eb7
+	0xc36d5906	0x9c0411c6	0xa47e0212	0xb8a09053
+	0x789bbd30	0x185e99df	0x4e7f5e66	0xea395698
+	0x5b9185a3	0xb12ef72a	0x3bf786da	0xfcfc87e1
+	0x706f7e71	0x1defdb8f	0x6209ff4f	0x0fcf979c
+	0x368d78c3	0x7325607c	0x09cd4106	0xb2b5eacd
+	0xd91e2de6	0x3b208bcd	0x763aaea6	0xd2e67e50
+	0xb42c3b86	0x68442e72	0x607c9e3d	0xe50c8c69
+	0x9b04293b	0xd06db29e	0xd709d11e	0x4d87a088
+	0xf9d5a59c	0x90e387b6	0x1d6d00af	0x959e019a
+	0x3fbab7c2	0xbc2d59a3	0x22b7b925	0x5cc6bf71
+	0x7f4e1225	0x65f80dc5	0x92d6299c	0x464ece21
+	0xf107bdf3	0x93e265bd	0x596b14bb	0xc3ceeef7
+	0x4a821410	0x712ab8b3	0x976e8cd6	0x4ea91f29
+	0x72ce3351	0x4d18420c	0x186fe8f8	0xe1729dd8
+	0xe5ba8e5c	0x565b6c62	0x38727f8a	0x5eb3ca68
+	0x82238397	0x6addab1f	0x10ab1bd9	0x55847072
+	0x2fdf1819	0x48452cc0	0xf52b3405	0x430d0d3c
+	0xde25205c	0xc928a846	0x8a49a600	0x2e0f347d
+	0x68dd5eeb	0xb668738c	0x921c4293	0x28d3220c
+	0xea3a76e8	0x8e56a305	0x6232fe74	0x4002c4b4
+	0x9452e5a7	0x4a7d0781	0x6208ec18	0x1f223625
+	0xe16ed578	0x14d4fdf8	0x04d47966	0xe96a08fd
+	0xd95cb585	0x576321a1	0x00a8c07a	0xf0626b43
+	0x68e468db	0xe7e333b7	0x5145a525	0xb4a393ac
+	0xa7d58ab1	0x57d8ab46	0xd3803314	0xd8fa8397
+	0x73f0b404	0x07af9046	0xd7adc0bd	0x3fa6678c
+	0xebb05a2b	0x577b2e2c	0x52792d07	0x24abf050
+	0xe1046a1a	0xda2cadbd	0x9493d8c2	0x4fb41ba7
+	0x26f3f8b3	0xbfd58a43	0x15f53d77	0x3957de3a
+	0xf055d7dd	0x1056a0c1	0xcac3f7a0	0xd2433645
+	0x518c6d33	0x49b3af19	0x5ec8f961	0xfcca0f3b
+	0x91f9ab7a	0xac41e597	0x8eb537e0	0xc8642907
+	0xe293232d	0x8853aa59	0x8ac14c3a	0xfd6d1609
+	0x7989ba9f	0xecec948a	0x89b9adfa	0x2c1a155f
+	0x717d44ca	0x3b0b4808	0x679e6079	0x7f509dff
+	0xf46b7089	0xb9b93a45	0x973cda23	0xcb5aeecc
+	0x8bfcfcce	0xb3a0326f	0xd72feb16	0x1aa69d84
+	0xd63a720c	0x17917f37	0x6ce5305e	0x1d4be016
+	0xcd461cb6	0xdeb337c2	0x93f3aad9	0xb4392d5f
+	0x3794070d	0xf66b315f	0x773ebbe7	0xb49bca0e
+	0x6399ff52	0x666923d2	0x7da14294	0x62735522
+	0x607a3e72	0x74cfdf97	0x5120de20	0x87efd2a5
+	0x42ace644	0xe6bbe848	0x3c913024	0xcbe9c195
+	0x4cbfab2f	0x283d55c9	0x4124679e	0x9104dd52
+	0x402353b2	0x1d2934c2	0xd078f360	0x1e612c3d
+	0x55d7560b	0xc6fa6c69	0x8f3d701a	0xfe8d0621
+	0xf728b0ad	0x621bc481	0x767c00b2	0x20bd9a33
+	0x43153fb8	0x1dbaf9e9	0x9aacfe31	0x0c13b370
+	0x5207070f	0xcbe94b63	0x16107ec2	0x5948fc06
+	0xac484ba9	0x005295c4	0xdbc6c45d	0x0d0b938d
+	0x2ca516ed	0x0b0affd1	0x100d782d	0x6b13fe4b
+	0xdcf4adf6	0xed2d24f7	0x2528f40a	0xae52c51e
+	0xb4548c92	0x048c762f	0xf4be834d	0x36453c04
+	0x9d2ea546	0x13b9ee9c	0x018a9896	0x0fa6031e
+	0xbef7a3b3	0x4abc8aa5	0x78244a79	0xf77d7b9d
+	0x5ab92df7	0x653ab84b	0xd40e8ad7	0xbfe0f037
+	0xb08c3f61	0x3511b9df	0x71f4ac45	0x18f8feba
+	0x14b6bcb6	0x9f7f0ff2	0x0fbd67d4	0x08662b13
+	0x663606a5	0xcc43f0bc	0x119aba1a	0x6f078180
+	0x2ee00979	0xf9dc663d	0xcfb6e229	0x59e6535a
+	0xb9041219	0x5096ef84	0x5a7058c1	0x80841a9d
+	0x923c2063	0xdce14c17	0x540f2785	0x5789b67b
+	0x370c8d98	0xd1e83ce8	0x936e3988	0xbce0476b
+	0x80d96d9c	0xb40fb347	0x7276d0ef	0x34e41df1
+	0x4dbefc05	0xc0a109ad	0xa8a76647	0x0b324453
+	0x82a88349	0xaa8619a0	0xc90adf91	0x6db31b49
+	0x20b8ea53	0x6971e930	0x5ab45e41	0xac318e8f
+	0xf8440d27	0x6e7b4f5f	0xd641f8cb	0xee4b486f
+	0x376e4d85	0x40f86be5	0xbcf3fd65	0x711296a5
+	0x171dc6de	0xd76bb94b	0x486488ee	0x29869fb1
+	0x0eedf832	0x088222c7	0x79db06c6	0x08093c31
+	0x78e6af7c	0x7e92a84c	0x5b7af1e8	0x9ed1082a
+	0xb2cf6495	0xfe566712	0x810f6623	0x06f5b7f0
+	0x57ef86a2	0xd3d0543e	0x7b272150	0xd4eb6f7f
+	0x802d6331	0x8566d10e	0x07e3e6fe	0x1447cf0e
+	0x60b3e885	0xf89a005b	0x37110b56	0x68ae7dbf
+	0x72f27442	0x3df57b64	0x2fbf6e25	0x7ee42060
+	0x1415c9a2	0xbdcc37ac	0xf31ae0c0	0x172e8e14
+	0x8b5d2cef	0x27fe63eb	0xa9219d96	0x429a6e0a
+	0xdc3f1f05	0xe19d1296	0x36da614d	0x0e9ec19d
+	0xc66d4ce1	0x291d49ca	0x83a3d92f	0x1d9b06bf
+	0x733aaab2	0xacf961e8	0x63e9a69f	0xa7a075e1
+	0x4e23b6f0	0x81cc07f0	0xde10c07e	0xd331c8b5
+	0xfbf18a1a	0xfc755121	0x886c628b	0x79fea666
+	0x7ce1bc5f	0xec5b3ce7	0xebd177cd	0x66400f87
+	0x764b1291	0x5ea94164	0xfc0a0fb7	0x0fa43dd2
+	0x49235d17	0x37926a51	0x8526a177	0x773fc730
+	0xa0f54815	0xed6f01a4	0x5bb24014	0x8539b71c
+	0x132fd915	0x5f000b68	0xc06aff07	0xc8277dc5
+	0x2ddbbbca	0x3ba503ac	0x63b3052e	0x30b5342a
+	0x2af7a786	0x09da5bd6	0xe4bec048	0x133d461a
+	0x795f4916	0x419808e7	0x26261e73	0x56e041cf
+	0x4dabd60e	0x1831430b	0x2e98bb48	0xfd18b5b1
+	0x29b89cdd	0x5970a40d	0x6345a28c	0x12843c53
+	0x2313d471	0xbf22181a	0xeed3b409	0x2b998b70
+	0x6734d4e9	0x4a99f823	0xd29ee17c	0x2bd55ce0
+	0x815732a1	0xdebf0e7d	0xee592700	0x2b0e5cdd
+	0x6d1165f2	0xdd1cb298	0x21d59792	0x29ed1d86
+	0x838769d2	0x9e571c56	0x488df973	0xcdda2fd9
+	0xc2aa23fe	0xec54f33d	0x4071d93d	0xd436a884
+	0xfbacc598	0xec188594	0x2d58f807	0xd77c2f9f
+	0x4cc2ecdc	0x38b99efb	0x9ad5c2cd	0xcf93ac82
+	0x19fd53b4	0xc61c4afd	0x9019c128	0xe642476d
+	0x12975e1b	0x70406aed	0x0bba3c07	0x94944b64
+	0xf26214c7	0xa8504bd9	0x0e5dd9d7	0x0f0e705c
+	0xe1d40427	0xcf6ca05b	0xfad2e372	0xb635f645
+	0xf048ea3b	0x1a39e8cf	0x386a19d2	0x4b495c31
+	0x10ac1cc0	0xc3b65767	0xf36cf20e	0x5ad6c70f
+	0x83512822	0xfc78a6d6	0x63f73285	0xbbc3ebdb
+	0x9fe2c227	0x7b1bae2f	0xae794110	0xe438ab6a
+	0x368b06a3	0x5d98b357	0xaea10310	0x51de113e
+	0xa19bf885	0xa46d4603	0x16a6cd3a	0x87d0cb12
+	0x0b319013	0xed4495c9	0x8710f555	0xe051c6d1
+	0x6c0d2f47	0x1a09af9b	0xbc5da303	0xb3c33c15
+	0xb5ab2df0	0x7b1a02ef	0x0b7558f8	0x99faea0b
+	0x2694715b	0x1e418212	0x28163f30	0x9f842906
+	0x9ee82eb6	0xdf04c95a	0xf7f3e610	0x873f8210
+	0xe514e5b1	0x65426e17	0x1bb7426e	0xfbab6b85
+	0xa08ae8b3	0x854ca95a	0xd0d2d6ff	0x63225f99
+	0xb961fad2	0x2b4cfa45	0x51dda947	0x67405e3e
+	0x9617808f	0x4b49c09b	0x5ead3eb3	0x465177b4
+	0xabea9a4e	0x1e4272b6	0x8e0e4d16	0xfe2174d9
+	0xa604e462	0x02bae16c	0x214aaa79	0x55588fd7
+	0xa06c6534	0x52174dd8	0x1ffde727	0xb5cb4ff3
+	0x58e8e401	0x874ba1fc	0x09f52e68	0xe2ab8893
+	0x49943632	0xbe02e3ed	0xdade2e8b	0xa5da9671
+	0x31f393d2	0xfb4f4e01	0x10c03e2e	0x94fac702
+	0xccdd9c33	0xd51373c5	0x32f67c97	0xf75f6dc5
+	0xf7c56120	0x429a4417	0xee3533ff	0x6395711b
+	0x84c30f8a	0x87e400c9	0xdb34cbb8	0x554373dd
+	0x89c3032d	0xb54a2095	0xbf8ca76f	0x32b9528f
+	0x45a716a0	0xdabd57bc	0x0b5a9419	0x0607f8e7
+	0x97bd8515	0x34fcfa92	0x89914683	0x596ce15d
+	0xa0d16b41	0x0475dcba	0x530d9b55	0xb2f6980d
+	0xeeb49560	0x9ff9f979	0xffb3b3f2	0xf8dc90c2
+	0x7df7ec78	0x663f667a	0xda25d7f1	0x4e5e1a1f
+	0xb8017f9e	0xaaab7404	0x0fbc96a3	0x2e6883da
+	0x70b4ef71	0xe68fd886	0xbf9813e5	0xfbea41ec
+	0x0e9c7205	0x4f4324b3	0xe9f241c0	0x59848c26
+	0xa6c883b0	0x6fed019d	0x3bea1228	0xd636e300
+	0x6950359e	0xcf52052c	0x1b528057	0x06fe6742
+	0x04965c8d	0x9a7b26c5	0xc99230d8	0xb579c7aa
+	0xe24a7255	0xe814e07a	0x76f58992	0xbad495de
+	0x55700746	0xfaf4da35	0xb5536992	0x1008288a
+	0xd867fd0b	0xb1c9720c	0x047d6414	0x561bdcc4
+	0x74e334f1	0xb66a42e7	0xc08e03a2	0x859a375c
+	0x2d6c3b8b	0x0aa6b45f	0xc97b7c6b	0x5765735c
+	0x5367cf95	0xd957151b	0xb6354238	0x7c9dbd21
+	0x97fbcb95	0x110361bb	0x2394edad	0xbf8e18b3
+	0x2d4d9bd2	0x24b42b08	0xace76b11	0x2b8fb939
+	0x04105821	0x79af703d	0x434c240e	0x2a019bf0
+	0x02a38fc2	0x9c640e05	0xdde8995a	0x3b8c0b1d
+	0xb44190f0	0x3c84367d	0xdbb9bb01	0x27c42ea7
+	0x87f24ef1	0xc9abb097	0xe4df5c7b	0x45e04755
+	0xe29ab2aa	0x29be8522	0x4efa4f5f	0x2b4522d2
+	0x67f465fd	0x4171364a	0xd2bed8f0	0x477e8b5c
+	0x982c0339	0x48fcc0aa	0x06206cf1	0x4c132f24
+	0xc2a78b32	0x18a3806e	0x84551ba3	0xbc8dab25
+	0x3cea4ede	0xbe3cb62f	0x7be253ed	0x828e2dca
+	0xae76b847	0xc018fe6f	0x09e3d2ab	0xfd775e4c
+	0x80f2595b	0x1a1d440b	0xc48f9889	0x52d1cadb
+	0x99fd2c1a	0x3d700d86	0x079d1761	0x6811c4eb
+	0xcc2f677b	0xe5422423	0x11a606e9	0x3fd6ea3d
+	0xf9ae700e	0x09aca633	0xa7097790	0x5db8d41b
+	0x34941e1b	0x3fc50d4c	0x2fd2cf3d	0xa60aa40a
+	0xed6381c1	0xb192e754	0x3248af41	0xe0cc843e
+	0xef3c9504	0x3712da7c	0x9fffb613	0xdef40782
+	0x86f9bd62	0xbd8a3260	0xf6dcbb87	0xf9a264e7
+	0x3bb46aee	0x6f92d88e	0x6b0861e4	0x5ab7d4cb
+	0x2f1cf740	0x8213ac78	0xa34f0812	0x4d7db7bb
+	0x20d1abcc	0x9c519247	0xbc708c1a	0x66871981
+	0xc436271e	0x88247723	0x2996c404	0xca9c48f6
+	0xdcea7c3d	0xf6cdd451	0xbab6a23f	0xf064060b
+	0x3c0d3775	0x3a7ccc2d	0x5d056c98	0xa6521199
+	0x7f3b8753	0x3ca8407a	0x3097264f	0x60c75837
+	0x96e43535	0x5d17c5bd	0x89bb2825	0xd35fac11
+	0x1c323feb	0xe8fd05e7	0xcad8184e	0x23456746
+	0x6e4f1d7d	0xfbfada38	0x20faac8d	0xdcedab37
+	0xf094bd0c	0x7d4e750c	0xbd7ef698	0x0125c05a
+	0x17d840cc	0xf44bd1bc	0x236e7f10	0xdd53c6ac
+	0xb0bc6a1e	0x019b1a51	0xfd99d0b1	0xb723b517
+	0x728e0e9f	0x4280e2d0	0x8da35086	0x2e3cb572
+	0x2a53e018	0x6f7a3e41	0x7afe2ee6	0xe4efc53a
+	0xe2ed04c6	0x67112c67	0xe7e43b4a	0x03f680d7
+	0xe3434120	0xe2c12215	0x63ff546e	0x4d87e2b7
+	0x6f95093f	0x7c7a5e18	0xef98c38b	0x8ccf2684
+	0xf4619327	0x148676c5	0x4be2254a	0xcda85631
+	0x00ae4a2c	0x2df961dc	0x85b6fd89	0x1512b1fb
+	0xc17a7547	0xbd062ec9	0x91229a47	0xf6d4b08c
+	0xf7d3c4f1	0x4d951e94	0x62c8a9e9	0xd7df6f2a
+	0xce34f11d	0xc04b655f	0xfcf369b9	0x40eb0ec3
+	0xf7b55c23	0x8edce54f	0xba8ce0db	0x2a5e5a92
+	0x3b243dcc	0xbcc8c5d0	0x906db8bd	0x6a0aee9f
+	0x9e6c3df4	0x16f2252d	0xd389126d	0x5118a5bc
+	0xa75cc327	0x559dde05	0x5bb43b00	0x7fbe942e
+	0xa24e752a	0xabbfe05c	0x916daec7	0x8817b357
+	0x5be9fbfb	0x6e8bc90d	0xcdf7cb49	0x0b28069a
+	0x1922e927	0x24713a66	0xb9c800e5	0x63968dee
+	0x34464be9	0x712fa6d8	0x9f9c814f	0xf6121f78
+	0x12863a08	0x349158d3	0x66556d8b	0x4938c818
+	0x69374151	0x55046a98	0x94c8e4f4	0x48430cff
+	0xb885cdc4	0x762fb5b6	0xee98caee	0x8e582d5c
+	0x808ba575	0x7878cbac	0x1d257ec1	0x85bb9f16
+	0x50adfb99	0x98e3f712	0x532b6bb5	0xd3aa0b14
+	0x07369ec9	0xc6f71890	0x1bb76ff9	0x0e91023e
+	0x7d6e119a	0xe8c5f447	0x49edf0c4	0x8d380eed
+	0x99984929	0xd37dd90b	0xfffb0a41	0x69eb9ab1
+	0x67b2585d	0xe3a5a664	0x7f9d9156	0x0454b9c2
+	0x4b5d28f2	0xfa6d0a33	0x3c9206a7	0x5aa2fb75
+	0x767201c8	0x7db04d90	0xc27e89a0	0x4df1cfb8
+	0x81efb5ad	0x2eeee02b	0x42d5ef5c	0x394fdbd2
+	0x0bcc3166	0x2f43982b	0x832520df	0xdb6fb558
+	0x63fccc0d	0xc42816d3	0x5cf66464	0x2b4b89e7
+	0x2d62dcb5	0x6c4f52fb	0x6c3ac264	0xc92c6977
+	0x1f6cc458	0xd639250c	0x4044e6b0	0xc39df4c4
+	0x65595b2b	0x1c9be044	0x5242d7f4	0xec710e0e
+	0xa991869f	0xacb3cd55	0x4e82d850	0xa7ddd47c
+	0x12c0cc9d	0x8ff166b2	0x89d6bb4a	0x136ef38b
+	0x3875e7df	0x8d59d30b	0x3d22b091	0xc64b065e
+	0x73077e1e	0xcdbbe7db	0x000e842c	0xd5147941
+	0x8fbcd501	0x6d731511	0x1a45fa09	0x1579e7bb
+	0x4dfa5ed6	0x192d360a	0xc36e445d	0x6df0bb79
+	0x9c60d757	0x99067a40	0x286e1450	0x21d95d9d
+	0xbffde5f4	0x5b6e43a1	0x61b62406	0x87e27b1d
+	0x12fbc7cb	0x52332046	0xe2ac85fa	0xe6dc1b49
+	0xb04e0d61	0xf9cd9aa9	0xe56424ff	0xc5b0b353
+	0x7b99dc04	0xf8bf97d2	0x3fc86848	0x396441ff
+	0x92c981c7	0x97a58a03	0x18862056	0xc9849658
+	0x683cec3b	0x3298b913	0x1d381d39	0xbe687457
+	0x1598e8c8	0xb4944287	0x59e42ebd	0xaf631121
+	0x81c6ed2b	0x811cd718	0x9d9ece91	0x6d26ed1c
+	0xca577a45	0xe87b71a4	0xf9d884ed	0x8c88c874
+	0x452020b4	0x9e6ac4b8	0xa99fb35c	0x3d0acc96
+	0x6d0220f5	0xcd4a9041	0x0f7b3489	0x4de2fca5
+	0xd91865bf	0x7ae85bea	0xd0ac675f	0x3643cfd2
+	0x9c9e938a	0xcc24771c	0x04a8d771	0x69ea870c
+	0x536c78b1	0x9c986d53	0x188133ed	0xc2449d1a
+	0x949dcfee	0x657b7cbb	0xbac748a6	0x5469c94f
+	0x58b00d1b	0x4a95f324	0x9e3d996a	0x7d61363b
+	0x95c3b5e5	0xe0c628e5	0x89ba2777	0x92530a59
+	0xa52ed8d8	0x96f64b04	0xd7a09900	0x2b7bdcec
+	0x31ddf392	0x796d19fd	0xdbaac550	0xc1b483dc
+	0x7003a526	0x260f55db	0x2065f6ad	0x97c38ccc
+	0x2a6b7ce5	0xec4e0018	0x990007bd	0x93e4d47f
+	0x04d2536e	0x4bfd17fd	0x173af016	0x26515f4e
+	0x9051893d	0x63333e26	0xe47971be	0xd909f5f9
+	0x2f5be247	0xfade7a04	0x121542b3	0xcd5f8f3b
+	0x416d8352	0xa66d58b6	0x5656d408	0x10ee1bf2
+	0x3c65b26a	0x31dbef80	0xb3badd4d	0x388342da
+	0xc430266f	0x53fa9fe3	0xfecd7bd3	0xac043f73
+	0xc94b4ee6	0x1dd26332	0x993b8b27	0x1d78261e
+	0xbd4a0564	0x170a57fb	0xaaa7be6c	0x9bbde43e
+	0x70d16f35	0x11525ae1	0x00b8c636	0x7088bf37
+	0xed6ea850	0xaa37bc1f	0xe08e79ea	0x7d4ed426
+	0x95f8916a	0xc2fdd49f	0x1fa1bc9a	0xb759624c
+	0xd7159d5d	0x65762aba	0x50c99a62	0x8879a995
+	0x496ad905	0xcf5447b3	0x230a9e21	0xb6d586ac
+	0xccfd911b	0xa4a58d33	0xbef8ff75	0x6381b0c3
+	0x62d0e4ad	0x2f0992a0	0x27d2e923	0xc9d67860
+	0x46f394b2	0x877ea324	0x6ed5c693	0x386dbfd3
+	0x5f5c1f7b	0x1a339481	0x1cd12853	0x4da6425d
+	0xe50aa540	0x2dd400e8	0xd7b37c5f	0x52046ed3
+	0xdb24073b	0xb28cbf56	0x67e62bdb	0x32f6e9bc
+	0x8f2f443b	0xacedd944	0xfa99423f	0x3ae8d636
+	0x613a42fb	0x1a410513	0x4469e127	0x2fdb4b5e
+	0xf86ed877	0x07637d77	0xbb197929	0xa8fa021b
+	0x9a9f4341	0x35e36444	0xc6728094	0x54c438fb
+	0x17b46ef7	0x152d988b	0x42c512fd	0xcc4f36dc
+	0x1ab4ed10	0xd367833b	0x1c08b3d9	0xb5d182e1
+	0x198f9d7a	0xd68ac623	0x964db9a6	0xd6c121f9
+	0xdb56e5d9	0x69e61f26	0x6b9fe5f6	0xc414f7ed
+	0x812a505a	0x7b73b945	0x08000c8a	0x8ed6ff2e
+	0x19b9394d	0xcce2bc3a	0x46d66935	0xf3e5468b
+	0xf345f275	0x5f9bf5c1	0x46ceb342	0x45149107
+	0xc02af675	0xbf3ca371	0x55237036	0x8ae2d3bd
+	0x19b01471	0xa77a83f0	0x6b003b46	0x29a22e11
+	0x89a94839	0xd0c249a3	0xdb36a03a	0xe38f4040
+	0x88f9c8b9	0xef50fad5	0xd69b106c	0x5f314dd3
+	0xde5e9f87	0x91c24944	0x49eee859	0x2aaeaa65
+	0xab45e53c	0xf3a0e4c0	0x200a36e5	0x77e484f5
+	0xcbf8952d	0x64d6ebfc	0x1f832895	0xd835590f
+	0x13f5a770	0x190849af	0x3068c161	0x61a78e84
+	0xd7567c5c	0x4a1ab2db	0x524ae318	0xd488b5be
+	0x1703785a	0x0a1889eb	0xd39c572a	0x4f99ba34
+	0x3015e101	0x99e6ff5d	0x13cee969	0x0d66997b
+	0x8e3dafe4	0x9c0507b7	0x28cebbab	0x2e6cf3d1
+	0xb24b11bc	0xe411de4c	0x64d5f845	0xb0b20f46
+	0xa49b7b52	0x9b65793d	0x8756f69d	0x0e0bfcd9
+	0x6631f0ee	0xfea0c152	0xc54d903a	0xe05159f1
+	0xb2cd54ac	0x039a6d29	0x81cd7e6b	0x58cd335c
+	0xf6e95cc4	0xa6a02bf1	0x62e10eb8	0x0b11d249
+	0x5b52a70a	0xff2eb36e	0x9ce7f597	0xfc4421c4
+	0xba74bbfa	0x4ba989b4	0xce7c369a	0x8c149a5f
+	0x063745c9	0x4a1dc1ba	0x3c798afe	0xa47ef113
+	0x54c6c987	0xa6623430	0xed26b37f	0x0ebac834
+	0x54cb0233	0x92995cf3	0x5412dbfb	0xaf94b295
+	0x80ea9fea	0x6c776fea	0xc638768e	0x3e2cd596
+	0x8c6f6218	0xe5b70298	0xad6cb433	0x0271dd2a
+	0x25c9a276	0x24ee6a85	0xe72e9d3f	0x3bdf3f97
+	0xabf11c1e	0x99937754	0x2bb62c14	0xf3da4c81
+	0xc962c562	0x727c4e26	0x97b1c000	0x0de49161
+	0xdb8d6318	0xc9b83dd7	0x40901e67	0x68ac3dd3
+	0x217fecae	0xfa36644a	0xb9399c9f	0x620ccdbf
+	0x81fa634f	0xdb38edb1	0xf7e11418	0x1f580868
+	0x48b35cae	0x7230c6e3	0xf7cc6a25	0x440c45d7
+	0xb390e675	0x9b78318a	0x0d359239	0x97e078cc
+	0x80e65a34	0xd71dbf0b	0xd112cd54	0x53a3f81e
+	0x098f7be4	0xa11d522e	0xebbb20dd	0x2c4a78c0
+	0xd4e79e2e	0x01c919dd	0x2fa34e3f	0x6a16a7df
+	0xb81c9cf9	0x472fd48e	0xd197dae0	0x94cc62c4
+	0xe052d018	0x1ca9bf15	0xb44ddb70	0x814d856c
+	0x68927beb	0x5622d712	0xfb289586	0xd40ab10c
+	0x4c7f3469	0x357a822a	0x717a3720	0x3f3a99ed
+	0xf13943e4	0x043dbfae	0x6fb72671	0x06bcaf58
+	0x790c1e70	0x3e8e537f	0x5a4fb50e	0xa2fe476d
+	0x9db652cf	0xace6b43f	0xd1273d75	0x88727f3f
+	0xe66f9c36	0x24339816	0x28f8dd6c	0x5a4f8879
+	0x51ebf963	0xd64769b3	0xd9006ec3	0x20bd215b
+	0xce24e7cc	0x61c00c46	0xf9b16868	0x429a54f8
+	0x328834df	0xfcdbb181	0xd782c3e9	0x6b71dbe0
+	0x70dcfe9d	0x95c1a80b	0x5ae919c7	0x7e71afab
+	0x4103d80a	0x955c62d8	0xca197e33	0x4b579a1e
+	0x94521734	0xa9bd1f4d	0x112ef524	0xbfafeec9
+	0x6358d4de	0xe68efe2d	0x93c564db	0xa3e4ac68
+	0xc61833f9	0xef2e5dbb	0x4d3a5a3d	0x30e7a355
+	0x6b1ed181	0x1e6cbb81	0xb6fa389c	0x0c7e7ee9
+	0xc20c8770	0xcb04a3ac	0xa4ba69e0	0x7e87b290
+	0x8c67e8db	0x2c3a40f7	0x366bc618	0xdeaab8e0
+	0x95d11262	0x665c9d87	0x68435cf0	0x924c1e1b
+	0xc8f8c882	0xdff0c036	0xfe411797	0x2bd049c1
+	0xf4def28d	0xd8d01637	0xc7ef2c00	0x6367f83f
+	0xd34fdf44	0xd392e10a	0x6d522ea0	0x16f8e3c6
+	0x4d9b0149	0x6ce5ac26	0x57431d08	0x77f105e2
+	0xe9f6f804	0x92dae4d9	0x63baf9f0	0x17056564
+	0x010e1d9f	0x50231c43	0x5ba79db6	0x8517839f
+	0x18afe138	0x88d3a85e	0x786ed442	0x9cf4a72b
+	0x629ebf65	0x613d8e8e	0x712a0fd8	0xbc88b08b
+	0x81ea88b3	0x3ac5f023	0xb93c236e	0x93a3468c
+	0xd86745c6	0x6df47eb2	0x10e2e256	0x2da86820
+	0x1513101f	0x38128155	0x7fbc9673	0x5e8aca10
+	0xc79677d1	0x8006a420	0x56909452	0xde047cd6
+	0x33256da8	0x63637d54	0xdbb682c2	0x9b00c56d
+	0x9f62d072	0xb7be713a	0xb0e603d8	0x047e37e3
+	0xd51ffb7a	0xeec69890	0x1e72d673	0x6d7f5c0d
+	0xa80c0473	0x12b89507	0xd605abac	0xd4c6899d
+	0x9bb98856	0xa6269a33	0xe08135cc	0x8a69b777
+	0x077837e8	0xd13014ea	0x9ca638ad	0x908e6612
+	0x5bf969fd	0xfd9da209	0x3e72a1a3	0xc7cbec2b
+	0x66cf84a1	0xd67e67eb	0x1684ed54	0x22feca3c
+	0x9c0d00c2	0x6337c641	0x89f65117	0x7fa4c657
+	0xebbd3208	0x89322dfb	0x925f82c7	0xebeef669
+	0x8cf74ade	0x55847368	0x28fd1623	0x5c2e0709
+	0xceb12802	0xbc4de4d3	0xec44bd13	0x33574d46
+	0xe89ce0f8	0xc09d2036	0xf83ce68e	0x0da18b34
+	0x30bd2849	0x252235cd	0xae7b84e6	0xb894640f
+	0x5b84fc6c	0x23f8cca0	0xd5a506ad	0x5605e837
+	>;
diff --git a/arch/x86/dts/microcode/m0130679901.dtsi b/arch/x86/dts/microcode/m0130679901.dtsi
deleted file mode 100644
index 11aaaa0..0000000
--- a/arch/x86/dts/microcode/m0130679901.dtsi
+++ /dev/null
@@ -1,3284 +0,0 @@
-/*
- * ---
- * This is a device tree fragment. Use #include to add these properties to a
- * node.
- *
- * Date:
- */
-
-compatible = "intel,microcode";
-intel,header-version = <1>;
-intel,update-revision = <0x901>;
-intel,date-code = <0x4212014>;
-intel,processor-signature = <0x30679>;
-intel,checksum = <0x69c4e6f1>;
-intel,loader-revision = <1>;
-intel,processor-flags = <0x1>;
-
-/* The first 48-bytes are the public header which repeats the above data */
-data = <
-	0x01000000	0x01090000	0x14202104	0x79060300
-	0xf1e6c469	0x01000000	0x01000000	0xd0cb0000
-	0x00cc0000	0x00000000	0x00000000	0x00000000
-	0x00000000	0xa1000000	0x01000200	0x01090000
-	0x00000000	0x00000000	0x18041420	0x01320000
-	0x01000000	0x79060300	0x00000000	0x00000000
-	0x00000000	0x00000000	0x00000000	0x00000000
-	0x00000000	0xf4320000	0x00000000	0x00000000
-	0x00000000	0x00000000	0x00000000	0x00000000
-	0x3b6ec6fe	0xc0fda75e	0xb4ea6a9f	0x8fd6ed15
-	0xd537f374	0x669bf3bb	0xebedec72	0xb4cbc889
-	0xdb666815	0x5a17bfc4	0x4fca009d	0x099ae8b3
-	0x198e2c7d	0x7c665bbf	0xc07a1a7a	0x7dbcee26
-	0x867296b2	0xc885b6ce	0xe602baff	0x68544b14
-	0xc928c400	0x3add156d	0x531946f9	0x92a03216
-	0xda352322	0xd967ee1f	0x3c5170a7	0xf6de834e
-	0x5a2ed8b3	0x9fb8f050	0x450de17f	0xfd5ef070
-	0x4954575f	0xa3a071ab	0xb56e2afb	0xe2b48302
-	0x6655a958	0x57c9a438	0x1b2f688a	0x09309bc4
-	0x0be95612	0x529c1633	0xc48515d9	0x29eb78df
-	0x9933409f	0xda58dea9	0x58c805fd	0xbc110f5a
-	0x40780ec0	0x6ad59bb3	0xc7387fb8	0x591c1490
-	0xf9335932	0x32130e0b	0xef4b3c96	0xacd903f2
-	0x5b362539	0xe7f85529	0xcb17c41f	0xe7e440d8
-	0xfaf7e925	0x969b76fb	0x5edab8c7	0xf00012e8
-	0x121c2971	0xe5b18959	0xadfd07c0	0x1f09c9d7
-	0x9781006a	0x39550073	0x6c438b6d	0x436f60bc
-	0x11000000	0xf03f27bc	0x3ed2262b	0xe1f8f63d
-	0xc164c68f	0x92e5df39	0x46108645	0x99a9968f
-	0x1dfa58a4	0xd1ebfd99	0xca4dae70	0xe466a06a
-	0x49575333	0xe30f49f0	0x814e5961	0xfa4bb7bd
-	0x2e212282	0x31912456	0x7d722c47	0x9cda0657
-	0x111985e9	0xd28d3b0b	0xec52f0c2	0x956b5b95
-	0x0806f491	0xa8096786	0x1e4c1248	0x42ea1ecf
-	0xea09d662	0xa821f68e	0x4b84d60a	0xa6f61348
-	0xfc95c139	0xebcebc32	0xd68ffe3e	0xa9aefabe
-	0xf653aafc	0x2a9f10e4	0xdaf3d51d	0x5f25aaa5
-	0xdedacabe	0xf2e08b12	0x6fb9f444	0x31b13d4e
-	0x13074cd3	0x68905491	0x08ce3a00	0xb3e5a3dc
-	0x9554ca97	0x5955c3a4	0x2e9951fd	0x5d708c9f
-	0xf3abe824	0xcb9105a1	0x3f51122e	0xd2152f23
-	0x2873cd28	0x463c0ff3	0x7bb81500	0xaa360665
-	0xbe69bdf9	0xa32415d6	0x111af68c	0xd129eaf6
-	0xdd102779	0x098a2b08	0x90363b85	0xdb5d3420
-	0xd1d116e3	0x9e5dd54e	0xb4a93d32	0xb5ee99fe
-	0x409f0bca	0x40302319	0xe175ddaa	0xfd7c8d00
-	0x2c28edb9	0x698d27f4	0x2e7945f1	0xc0150485
-	0xf9c599fc	0x139824cb	0x1571f70e	0x222565e8
-	0x3377eb7a	0x70fdee6f	0xd409f0a6	0xc875d05f
-	0x70d6a86b	0x66201d61	0xf8fcb733	0x14279707
-	0xc204e0e4	0x124c89be	0x8b298d1d	0x79bfe168
-	0xdbf7fe94	0x0358af09	0x8291ef8a	0x3e74a2ea
-	0xb7780782	0x0194d445	0x0bab231d	0xd76f85b2
-	0xc7510861	0x4b9a5c80	0x6c9c8583	0x4e18d7db
-	0x7dfeaea8	0x59be4d17	0x8e96f5b7	0x51bcb2da
-	0x5f3afeed	0xd3f46ecd	0x10da04eb	0x29dd87db
-	0xb7df24c5	0xd58dc2dc	0xede0603f	0xadf00cf7
-	0x50090b9f	0xc9130c82	0x854fc603	0x13b8b4be
-	0x10e2e41f	0x5c1d2246	0x0ee11843	0x6d38356d
-	0xd3bd47ae	0xb419f115	0xb118cac7	0x9c61aa7d
-	0xca22cf8a	0xd41af2f1	0x0b5ebfab	0xc0889746
-	0x078c705f	0x9e5b2b7a	0xb886ff49	0x1ab413e4
-	0x085cebc5	0xe3a44ab5	0x8844df92	0x075a79cf
-	0xb8fdc33b	0x1766265c	0x9340a734	0x4af860c9
-	0xa933586e	0x3e8a9a5c	0xf6419a1b	0xa70a1556
-	0xf930240e	0xe294fb1f	0x9bba35c5	0x4051819b
-	0x6799015f	0x7eb725ad	0x3953fe03	0xb8760679
-	0x54c7978c	0x3dfd36c2	0x631212bb	0xdeaca312
-	0x56d994dc	0x3a1696d1	0x214451fd	0x6dc505f7
-	0x7bbf210f	0xa266b569	0x8fb5eb6f	0xa6b76bf8
-	0xc9e782a1	0x8456765d	0x0a9eb223	0xa67e533f
-	0x211016f4	0xd8783c3e	0xc35574b8	0xd97e9b52
-	0x28ad2911	0xbffc5dad	0xd807d783	0x3050f3d1
-	0xcc33efa8	0xb9cf97c2	0xee5dfc8c	0x2adad5bb
-	0x4011c50b	0xa16f5d93	0x5e2ac188	0x521c977f
-	0x6af1b858	0xcd7e4b4c	0xfc988f66	0xc0e4cee9
-	0x82ac99ea	0x54353832	0x2308e02f	0xd084d198
-	0x03574ad5	0xbe4b698f	0xe1d7d294	0xd772d08d
-	0xb7a4fb2a	0xf7c93bb8	0x42fb2f4b	0x98cb1a11
-	0xf564f28e	0xd6ace35f	0xc43f6639	0x85be741d
-	0x079b8c1f	0xb5b45522	0xfedab918	0xf7fa7494
-	0x32204c16	0x1c8d5434	0xc39e58e4	0x99c7a2c4
-	0x3ccfbc3a	0x3f5ba9ef	0xf919921b	0xcffbeb79
-	0xd2927d86	0x5a50486d	0x62bdb218	0x22731dcd
-	0xbad1db2c	0x2f4af4a5	0x8f7eded6	0xeca3dcca
-	0x0bb5ecf7	0x05e6f3c6	0xa38cddff	0xc7cae177
-	0x1d115485	0x711ea542	0x33729cf9	0x59000680
-	0xcaf26070	0xd2647235	0x4ce354fc	0x76d9bdbe
-	0x53e39ec2	0x2d8acfb3	0x193c03b9	0xb3cef3ba
-	0x1da26bd5	0x8dfeeaa5	0xc199d90d	0xcfc8ee2d
-	0x4cb1bd52	0x521d197c	0x008bf34b	0xb6ff25ca
-	0xf4922b7c	0xa91893a8	0xbd3d7874	0x32865e72
-	0xca72c49d	0x02733201	0x6156051d	0x47464b81
-	0x353a3c14	0xa87475c8	0x9681a015	0x4b58832d
-	0xea65c6a2	0xfefef1fb	0xd5fa7dbf	0x13aeee80
-	0x2915b47b	0xe4a54fca	0x31615326	0xbad80f83
-	0x21eedfcc	0x2a2787da	0x6eaa2c9c	0x9de76356
-	0x8a34d823	0x2e7641b8	0xef16714d	0x8267bad4
-	0xacdfff45	0x09a93862	0xf63863de	0x7eec7d8b
-	0x70b4cf72	0xc7a8118c	0x4ed89774	0xc12a5e0d
-	0xe77cc023	0xcdee8fd8	0x20ffe6d9	0x88bcfaa0
-	0xd945e4fb	0xf496fccc	0xe7587e99	0x42252ec4
-	0xcc47d738	0xcc549ca3	0xd5059657	0xfbf502a5
-	0x2788945d	0x4f8ca4d6	0x41b7c069	0x618ebdf6
-	0x0354452c	0xf7249d75	0xe048dd38	0x4ca484b3
-	0x0347342c	0x23608b20	0x8a76cb28	0xd445886d
-	0xfe0e1e6a	0x46678478	0x230c0ef0	0x3add3053
-	0xa6a158c1	0x22c589d3	0x3b728538	0x5f78bfe8
-	0xab0bb3ab	0xb39e20b7	0xbb913a69	0xdf8bb73c
-	0xc2d5bb32	0xbd3e928c	0x30374965	0x9accaf18
-	0x60bb410e	0xa7786a6d	0xd368444d	0xc5eda57d
-	0x7a835abd	0x9f5f74e9	0x33b14a30	0xc0129833
-	0xc5d2e117	0x5f884f0f	0xae6fd2f7	0x3ef71ba2
-	0x0f0b944c	0x1a8dd932	0x2448f0ed	0xfb8ca949
-	0x9d08756f	0x7914384d	0xdd70f795	0x8cf8daff
-	0x6755785b	0xf4e6a191	0x8c5a9a2e	0xfdc19939
-	0x66f39dc0	0x3da9fcc2	0x2c22797b	0x63f892d3
-	0xdcb75a66	0xa043c021	0xcb0f9292	0x887eb1a2
-	0x9d588452	0x9fdc185f	0xf481d465	0xbfef53b9
-	0x38da9baa	0x9d35c4f4	0xa652c843	0xf80f0007
-	0xb482a32c	0x7ae4df5b	0x74ad41c2	0x15d849b3
-	0xc4235054	0x36d44d98	0xc06ad604	0xdc83d81f
-	0xd4b87511	0xab79b430	0x832a7ce1	0xafe26f16
-	0x9f7d26db	0xd00816cd	0xec6e7b8b	0x0392bd20
-	0xfe4b6e2f	0x87795026	0xf9e4eef8	0x06cd2ec8
-	0x91670e6a	0x17aad6af	0x399050d1	0x043d05f8
-	0x5dd8e105	0xa2938113	0x2c47ea5e	0x64a062f8
-	0x14dd01cf	0x6773f479	0xf2b4a773	0xeefe3b89
-	0x8cf35404	0x0f02b236	0x430023ff	0x04ecae31
-	0x6949cdfb	0x65b63ba6	0x86c5a7c6	0xd53cc1b5
-	0xdc1ee770	0x30ebc654	0x67a95215	0x2e4508a9
-	0x9df37690	0x33baf9e5	0x9a58d5c0	0xe99baa0c
-	0x4b7446eb	0xfc7c8340	0xfa5ee60a	0xd1d873b4
-	0x302f882f	0xcff8ac83	0x56d809d2	0xcab281e6
-	0xadca5551	0x50691975	0x7766b753	0xdb7adecd
-	0x131c83af	0x1b09ee46	0x87fdd3ef	0xfe3037c2
-	0xcd2b5362	0x5f21384b	0xacd78f4e	0x145a4793
-	0x131a6a20	0x0fc1adf5	0x3707f20b	0x5d37ba20
-	0x6c8448e6	0x76f721a4	0x348b0456	0x608453ed
-	0xb1185c8a	0x18bbdaa1	0x7c1c6e05	0x46fa7cdf
-	0x390cf9b7	0xe9c825bf	0xf77554c5	0x7dd5a47c
-	0x49cfca16	0x5fd7e6dd	0xf707ac36	0xdb6f0142
-	0xaabda9b0	0xe7ac02e7	0x0a1eb844	0x225686b2
-	0x7852c1cf	0x3912115d	0x89d65081	0xc3f4faee
-	0xfedeba97	0x073395d9	0x33d20ce3	0x56c6c126
-	0x378f822e	0xf575b487	0x043da151	0x1ccae8c2
-	0x5fa2279b	0x0608f618	0x4c90662b	0x30591d0c
-	0xcf217166	0xacdbf6fe	0x1a653b17	0x6fa76090
-	0xc804480e	0x44c5b06b	0x1ebb8a6d	0x2f6f6f08
-	0x6bbeb75c	0x21c5c48d	0xd4c4cc2d	0xfdeab68f
-	0x25cd39e3	0x62970aa2	0x48aa915f	0xca38c833
-	0x9cfd1d10	0x81dbc61d	0x51702e45	0x8f80e492
-	0x07e89651	0x920e9f7d	0xdfa9f973	0x8cbfa187
-	0xbd3e7a14	0xee191486	0xb0077d2e	0x7345adcf
-	0xce36b2ea	0xc73aec7d	0x9278ac37	0xe07c6d96
-	0xf90f78a5	0x38f5584c	0x4941da80	0x67ff3048
-	0x3c263914	0x49656179	0x22f066a5	0x1f5a5e3e
-	0xce9ce83f	0x8e7446a2	0x85473d62	0xd7622673
-	0x3941bc22	0xf879d494	0x0936a517	0x2bba925e
-	0x516761b3	0xe238a8e3	0x11a0c8bf	0xd53cb861
-	0x60c0f0d5	0x63f7f157	0xb23dd4f9	0x5a4fd86c
-	0x3851d435	0x483b98c7	0x71c55b1d	0x1931d219
-	0x7bd54621	0x108bb4af	0xa72c8b97	0x51d985e2
-	0x598a521e	0x7efcf984	0x69b02671	0x5746157d
-	0x60cfc339	0x629567fe	0x2236a93a	0x520d0094
-	0x61811f40	0x856aeba6	0x4fc0a2b3	0xedcc9fb2
-	0x8fce6123	0x2ba53b1b	0x6fc610d4	0xabb564f4
-	0x957158aa	0x1d2b7989	0xaca5dedc	0x684a7086
-	0x1610e1ef	0x2abdf9b0	0xd9e9d205	0x0119ab86
-	0x6da64982	0x71f274b0	0xf425e61b	0x029dc92f
-	0xb13ff88f	0x064ecf92	0x4070c36d	0x58bd6ebd
-	0x629bcf8a	0x9091566a	0xc947a42e	0xd0475c87
-	0xe7773220	0x7b61f2fc	0xae0c08e3	0x44582521
-	0x557dfbaa	0x92fba0ef	0x529900aa	0x90fef908
-	0x570b0495	0x704125df	0xd8f9448e	0x9a7cf1f3
-	0xd83a747b	0xe27e3d56	0x4da6aaa3	0x55439398
-	0xce0d1c02	0xdebd6473	0x580f141b	0xcd5a5e57
-	0x1c64cc23	0x53f8f9c7	0xcfb5b464	0xa4939b05
-	0xc0bb3066	0x37923d76	0xe5e9b428	0x6f4f2894
-	0xe5144757	0xa9cfdc46	0xe3448b78	0x7e0bac3a
-	0x38066245	0x0d7c86fa	0xb7fd09a6	0x075426bf
-	0x3de7c82a	0x1f8d1b36	0x34144ca2	0x6c03ad9d
-	0x34305ef0	0x0a5269ce	0x82a9eeed	0x3be63f82
-	0x2001cea7	0xbba641a8	0xa4dad9e4	0x92e0fb69
-	0xa166dfad	0xd1ae10ab	0x0372e102	0x88469aeb
-	0xaa11bae9	0xf1006dc9	0xa8648217	0xe171b6e8
-	0x590ba849	0xa593cf1f	0x4cf079d4	0xe451e193
-	0x4355a93f	0x54dfcade	0x1a918a74	0x88eff191
-	0xd5a2bf54	0xb9962550	0x58d478ab	0xc78828a9
-	0xe2cff385	0x9ff810e7	0x9643953f	0x84764dee
-	0xe4950d03	0xdf17e0e5	0x4da892d6	0x48145872
-	0xb7453254	0x41240a2a	0x7ddf94bc	0x898771f1
-	0x61a423be	0xcfb46db4	0x7db27a89	0x2feeaa82
-	0x24d86326	0x043f5b1c	0x8cc6bd73	0x934b7b3e
-	0xac4a1262	0xebc494bd	0x53921696	0x115c4d9a
-	0x1d73de18	0x6417f141	0x9fdce4cd	0x8f72ccdd
-	0x3bb26030	0xdaf43da3	0x1e26758b	0xad1234be
-	0xe5bdf477	0xd2dd9e46	0x1270838f	0x557f3bd2
-	0xaa5a28c1	0x61e0d535	0xdc5aa028	0x9af22a6d
-	0x9b669fbb	0x979b5586	0xabf8264f	0xbcf91b17
-	0xda92e3cf	0xaaa87ae0	0x52336f6d	0x5beef95f
-	0x7c310125	0x8858f708	0x3c6e6d73	0x6720d3c6
-	0xed51b365	0xa9e50de2	0x865a7fc1	0x756b5758
-	0xbe13f4ca	0xf2eb039e	0x187d1641	0xc6e37977
-	0xbc3a2d64	0x6523583c	0x70db0cf9	0xebdba06e
-	0x632e8e5a	0x7b44144b	0x338bf7e2	0xf43dd8e4
-	0x2d91d815	0x9aff02dc	0x700ebe20	0xe9b6ea5f
-	0x776cdc38	0x43324788	0x53458290	0x2e22910d
-	0xed0fdf3b	0x279fc3ca	0x5a01f65c	0xc4ad1598
-	0x7a1fa09f	0xd12f97bf	0x34d99bad	0xfcecf69c
-	0x2b5567af	0x57a93cb3	0xfcf93005	0x3a403789
-	0xecaad383	0xc63fe190	0x5b8de563	0xbd9b876d
-	0xa20b875b	0x79db86f9	0x1917cad6	0xe925d5e9
-	0x8a233ed2	0xda8e6369	0x43028013	0x91b72d39
-	0x6b75eb99	0xc7bb03bb	0xab135e5f	0xb73cbade
-	0xfb7b0cfa	0x62ef94cc	0xdfdaa5ee	0x75c0f3ef
-	0xf020108a	0x6c54535f	0xc9583167	0x68fdd582
-	0xc6c95829	0x7fa6f2b4	0x9c7f494c	0xde5daac7
-	0x10088178	0xc27f2052	0x84714bf4	0xd2eb0ba2
-	0x23fd2e08	0x7c2fceb7	0x119bfd3a	0x029faaba
-	0x41c8cd67	0x2461da7f	0x25acc8ef	0xece252ec
-	0x997d4b00	0x3f19f111	0x68237934	0x518f427d
-	0x6c2a04d9	0x27f61e6d	0x68ebf9c6	0xf3ca994f
-	0x43e5c576	0xc4e1fd3b	0xe2393151	0xbf97bbec
-	0xefd161e9	0x5e3a816b	0x1d8b9bd3	0xecbc57f5
-	0x042c1237	0xcb1c852c	0x546f4d72	0x01b37ce2
-	0x20e30817	0x3fbd20d1	0x2ca11cc3	0x63cf6770
-	0xa65064ac	0x32d2cbab	0x9c1fb334	0x37c097ea
-	0x63ea10fd	0x7db8fc2f	0x8a4425dc	0x752ca318
-	0x9a570211	0x50f90038	0x90abfad1	0xe81169f7
-	0xd804a9b7	0x18b7efa2	0x6daabb80	0xf098566e
-	0xb5df2af6	0x8f23ef8d	0xed7dac93	0x4fbed0de
-	0x929b870e	0x60b5c69b	0x5589cc4d	0x588914af
-	0xfd78c6f8	0xd4018180	0x43d22344	0x873ee413
-	0x0ad0f12a	0x15200a82	0x749bff31	0x6fd4ca58
-	0xeea48890	0xc1507520	0x7a750a56	0x87c85e9b
-	0x2bc19182	0x9e7084d6	0xee8595b0	0x3c35ef78
-	0xaa19db33	0xbc4d7c20	0xa7b2c1ef	0x51ccd346
-	0x72b24c95	0xedf9e250	0x88a582df	0x42a27480
-	0x8fe7bfa3	0xb5f08d25	0x2cfb9e8c	0xcc118d13
-	0x50d9c479	0xf4abe2bd	0x1b22edbf	0x8f525f45
-	0xac39c5d6	0xb35d5c21	0x0e588e14	0x4715d55a
-	0x1b0ecbad	0x16e9e58d	0xcefb1002	0x8a37403e
-	0x70e90356	0x9b7a48f6	0x43bcf700	0x70470d6e
-	0x8e0dd0ea	0x7620f026	0xb4809687	0x8a3d8bef
-	0xdc0261a9	0x3e8d2dbc	0x6d48a5b3	0x4107a6d9
-	0x2dc369b0	0x671d66a3	0x559e6e50	0x4b8098ba
-	0x28209e38	0xf2bd6114	0x0a6f4f54	0x77a82065
-	0x406470a2	0x93cae58d	0xcf774ed5	0x7f4cdd72
-	0xfb869931	0x4ab42cd8	0x8251ded1	0x2c85fccd
-	0x14a8ae06	0x92333b50	0x53f605f9	0x3347f24f
-	0xf190509f	0xf72b525e	0x13a0f3ae	0xc04c7e10
-	0xa735fbf2	0x94df568b	0x71f6306e	0xcad6592e
-	0x1690c07f	0x64dda7ef	0xb03c8822	0x41f58140
-	0xc1953b66	0x2b4bae6a	0x278c23d4	0x0a02a425
-	0x10942d48	0x70557bb5	0x94981643	0x63214c9e
-	0xaa7ea265	0x505bf23b	0xa66c7082	0xf428671e
-	0xd1fdc33d	0x5817c28b	0x2ad4649a	0xb22b1eb1
-	0x17f29535	0x0423d04e	0x8b4d30cb	0xc36089f1
-	0x492dcfa4	0xe7842e60	0x7d4805de	0x02d4f43f
-	0xd3b6933d	0xa763e450	0x4301f667	0x58318b37
-	0x78d9dd14	0x84343bf2	0xf62e93a3	0x76d9d617
-	0x82c37d71	0xc3fa7cda	0x3dffa327	0xa171b148
-	0x4654011a	0x7cbd5689	0xaabe734f	0xb8226cd0
-	0x9d846c68	0xb9233e88	0xfc0b0bcc	0x2138ccfe
-	0xaff53d8f	0x9b0b8b80	0xb2be2912	0xcc871084
-	0x47a380a1	0x593c82ed	0x3cc8424f	0x5e77c12d
-	0x813626a2	0x8021e31e	0xeede3c2c	0xb8fea5ea
-	0x236a7fc6	0x783bdc5b	0x0d67a0ab	0x8987c13f
-	0xb6381e65	0x3b313687	0x52ad7a81	0x759ae49d
-	0x468ab620	0x8b735c2e	0x60937053	0xb3cf5867
-	0xb48525fe	0xd8bc07fa	0xf092e18b	0x6d8ce7a3
-	0xfeec327d	0x752e3f43	0xf106ac62	0xfe3489b7
-	0xa699af8d	0x1c5dcb5a	0x3a931d51	0xc1409944
-	0x843c3667	0xb923eb17	0x67c3d38f	0xd1edd5bb
-	0x4bffe68e	0x8b7acab6	0xe0058382	0x79de2e31
-	0x1e48cc0f	0xc4b8ad1e	0x5a00cf89	0xa4f6b8e4
-	0x29d42e0a	0x3d483f3e	0x746de9bf	0x0ce78994
-	0xcb6df646	0xe287b7f6	0x85907659	0x333127fb
-	0x6aac4a54	0x5ff7c669	0xd42ea2ac	0x92ae55b9
-	0x952f68e5	0x3273a013	0xec6cedbe	0x9ede1ad3
-	0x76d7c595	0x167c73fe	0x7c2572f4	0x8f653319
-	0xa1c726a4	0xf7ba8a71	0x5bc9b17c	0xc0d89104
-	0xc0ba5907	0x0e8c9c27	0xc8205b68	0x74f8aebf
-	0x02acd438	0x28783ffd	0x143ea70d	0x9c82abd6
-	0x9eb156e1	0x5951d075	0x5afb06d9	0xd14bac91
-	0x6ae19745	0x728cd46e	0x775cf71d	0x1126cf7e
-	0x058d4dcb	0x7f5f648d	0x5f37a908	0xd2fd843e
-	0x8dd64fb8	0xcdaa761a	0x105c38c1	0x9b5f440f
-	0x2dad00c4	0xd3c25b11	0xcc07bfb0	0xbc432852
-	0xc2d34e0c	0x0b1978f9	0x95a119ee	0xfc4dbdfd
-	0xae6d3b7a	0xff06ff00	0x30976600	0x9e47e68f
-	0x3308cf27	0x0a2d1580	0xe91ea75e	0xcbf12170
-	0xc7da3143	0xbe0a6ded	0x74d03d5a	0xb0869deb
-	0xbb94dec7	0xec2a053f	0xcb4fd13f	0x04912071
-	0xb1af28a2	0xee094f0f	0xa78a4965	0xcdded4aa
-	0x6d4959cb	0x93ee7709	0x2901d3af	0x6ad494ad
-	0xb95203f0	0x1fa160d4	0x7a06d88f	0x35f89a76
-	0x5e151830	0x27feb3eb	0xa9a9805f	0xc43b9387
-	0x5b6bf76e	0x3372d23a	0xbe2d27f1	0xad9b7282
-	0x5d67323b	0x2e96328d	0x3d90fe8a	0x9e4d4522
-	0xa2eba985	0xe1ed3264	0x28eab708	0x2551ba26
-	0xc143badb	0x3bebdacd	0x4da62bf1	0x875ffcaa
-	0xcc643e34	0x1b75c14d	0x13b84e83	0x8abb6f10
-	0xb82dd0fb	0xf31e4572	0xca8a5f58	0xb98da99f
-	0xec33fc4c	0x952384ca	0xd673c525	0x45f36727
-	0x269b8efb	0xfe5bc4a4	0x90325548	0xb8aefb93
-	0x6a2381c6	0xdc4ecc1e	0x7fc546b2	0x5348ca20
-	0x8eca0f26	0x5a49fa01	0x4b0822fd	0x862e680f
-	0x5abdf88e	0xeb23e8fb	0x2c023eb8	0x092cdb59
-	0xa15e0fbf	0x03f1e5e9	0x2c343bfd	0x8876aa74
-	0x5b80428d	0x4a4fba83	0xeea3da82	0x414a610d
-	0xecb123db	0x0f81b8b2	0xfdd1c970	0x8de71d6f
-	0x0ca553b1	0x57fc98ad	0x47d44eb3	0x17827c70
-	0x2d91f5b1	0xecf63cb7	0xb4fdb928	0xc49c42ed
-	0xeea589bd	0x62cf916b	0x02a553a6	0x50cb4523
-	0x959d3831	0xebfa026e	0xd2483d91	0x140364c2
-	0xa8ddcdd6	0xca343670	0x589a154f	0x6bf369ed
-	0x40eff32d	0xd7b49920	0xf4bff896	0x5a62c192
-	0x0a4cb0bc	0x449533d6	0xace20ca3	0xfae7465b
-	0xb6e0edda	0xda214fa1	0xcc08b6be	0x54c342cb
-	0xc09f8db1	0xead565c0	0xe38b2187	0xd0d0be68
-	0x16748998	0xced5a632	0xa0636b45	0xc71ab63f
-	0xfe161e04	0xe8b66fdb	0x878e2039	0x17af26c2
-	0x6851cb01	0x9484d4a5	0x697e6981	0x9946e0fc
-	0x970cbede	0x87d887f2	0xd987bd44	0x10dcae60
-	0x20239b60	0xe9ef795c	0x536f0f3b	0x2d4de85d
-	0xd50035c9	0x335410a8	0xee350c4f	0xcf94d278
-	0x688c98c6	0x3c0402d5	0xa8b8a81c	0x952c67e6
-	0xdf432d95	0xb74dd56d	0x77316d7c	0x56df9401
-	0xb8aad070	0xf5d1cbb6	0x206f18bd	0x59fdf55d
-	0x5de26069	0x31ab08b6	0x719a4d81	0x8f1c8212
-	0xc792bd91	0xd6f262c9	0xab4bd545	0x36f3c600
-	0x917c135e	0x1aa0455b	0xc1de8100	0x855db3e9
-	0x42d41a24	0x40955a66	0x8475c651	0xc7f44c6a
-	0x4e1f0df2	0x7cc5cd54	0x35a47bec	0xe6ac8550
-	0x8b43af30	0x6fcd1cb0	0xf37de1ef	0x00c70de7
-	0x63913125	0xb33688d5	0x8c296f13	0x93570308
-	0x6d8aafbf	0x67a574e9	0xf297b1a6	0x53600c84
-	0xfdea2e69	0xe75cf59a	0x1b0e3dd0	0x7f7fa8c2
-	0x7e463346	0x97c7069a	0x671ce307	0x2441f370
-	0xbbeb3a08	0xc2e4448b	0x2157fe23	0x70954499
-	0x3038e792	0x4a8a2fb0	0xa1f4541d	0x7c88605a
-	0x6a4edc03	0x689fe83b	0x93835e79	0x19c99c39
-	0x9ea7dfa9	0x36bd28c2	0x64ac057b	0xa2987c35
-	0x9c3f17ad	0x0be5e9f8	0xef63c94d	0xee32f2b1
-	0x3781a3ae	0x9ebe229f	0x77467a2a	0x1dfd79fe
-	0x24ed349a	0x3008c1c8	0xb77520f3	0xbf831d15
-	0x11dc4dee	0x7b5e47fc	0xfefa0f69	0x2a820af8
-	0x8e133d47	0xa021cf99	0x7886d896	0x8edadf3d
-	0x89a10318	0xb048ce73	0xd9843457	0xe000594b
-	0xff3c1ea8	0xd93a7c02	0x8471da9b	0xf24ccfcc
-	0x6f0576b7	0xeb024ef8	0xaf75787b	0x508fca52
-	0x18315250	0x74482410	0x169985c9	0x911c14ef
-	0x96575aa6	0xd4791358	0x1bcd07b0	0xf91ff654
-	0xc3b9c8d0	0x101e8aaa	0x84b8352b	0x16f57154
-	0x843a47f1	0x88269e3d	0xa625bd0d	0x99c91f9c
-	0xfe79c26c	0xd1844839	0xaa59ec6d	0x1e1b9ca5
-	0xb99e4bf7	0xc8c06104	0x29985a13	0x2aa0dea8
-	0xa92de35e	0x8242311d	0x61e0a059	0x09232eac
-	0xc7e8f2b4	0x05fbcfa5	0x41d2cac9	0x5d2026f9
-	0x69b970c0	0x0274700a	0x1f5f23d6	0xb98aea3b
-	0xd879d256	0x69230276	0xbec32596	0x6d4dcd0c
-	0x04efed6b	0xcf5ca09b	0xddd17a77	0x821a0172
-	0xe656d7e6	0x70dd6839	0x75710294	0x59765f6f
-	0xa3174d9b	0x4227c2a1	0x23ddd6c4	0x1d7d8c79
-	0xb2e50bb1	0x98744c39	0x853152f9	0x4d439b89
-	0xf852ac32	0x89ad2fd8	0x613c8c1d	0x47ab4071
-	0xdd62c705	0xe623a5ec	0x93f4bf07	0x5053a3fe
-	0x2545e42c	0x03e4ca84	0xa5dcf9cf	0xc279dd6e
-	0x6e3e2248	0x51c6338b	0x1b79f55d	0x871d7595
-	0x1991ba98	0x697bf68a	0x634bef62	0x415df824
-	0x007523ec	0x595fe4f3	0xd2018516	0xcfa8f6b3
-	0x1e3d33da	0x141858c4	0xa553fa95	0x0ba00794
-	0x923edb17	0x86a18480	0x4aa94d38	0x429814d8
-	0xdd0d853b	0x375808f6	0xcf857aba	0x6f6d5dc9
-	0xdc27fee9	0x7c49718b	0xb3eb09ee	0xf48ba9f7
-	0xa7f8deaa	0xa0afa80f	0x84a0ea27	0x63858132
-	0xa552f06d	0xcce0bc50	0x70a6b770	0xe21c7251
-	0x1fb70601	0x2e93b5f3	0x1f257ad1	0xab09dde3
-	0x176c80a3	0xa1845a72	0xcf68a2e2	0xe3bdd613
-	0xa41d6e7e	0xde870606	0xc292df07	0x7093562d
-	0x692e5e51	0x179dd237	0x01dc96ea	0x3a2efdfc
-	0x6088f181	0x7c3d290f	0xbd38e29c	0x340cead8
-	0xdca8ea9a	0xa43a7899	0xf6541b9c	0xafabfe18
-	0xb5557f4b	0x995bcd2a	0x5355ea0e	0xf3dcdf66
-	0x02216d50	0xaa3a8f23	0x1c63637e	0xb8950554
-	0x7199e726	0x20fed1f2	0x027d67e3	0x7d5a236d
-	0xd1e01da6	0x2db0e750	0xfba1d718	0xa58b42ea
-	0x839b80e9	0xcc55d1aa	0xb1da75e5	0x50789516
-	0x818913cc	0x03facba2	0x6e2bda29	0x1e3c1120
-	0x8fe64712	0x12317a15	0x6e6bb39f	0x7edd5bbb
-	0x900bf72d	0xc6a822c8	0x3353d602	0xd9965f2a
-	0xfc290ed8	0x9c8210e3	0xaa84d5ae	0xdf9f1507
-	0xbd10f9ff	0x50a4d9f4	0x22111607	0xd4043bad
-	0xfb7b42e2	0xe0285329	0x4e76e1a7	0x4188ed50
-	0x88cd2a99	0x4727768e	0xba625d6a	0xf8ad5d67
-	0xcc1595cd	0x36984dda	0x7c9f8fcb	0x4e9ec35e
-	0x37f95b62	0x8e70690a	0x8e43aeec	0xf3434e0c
-	0xa4b3ccee	0x99c0d714	0xee0082c0	0x9d9f002d
-	0x3eab3543	0x829e9098	0xafe4e802	0x5337a928
-	0x9bfd2d3c	0x43b69305	0x2c10167b	0x8b06b92e
-	0x949049c3	0xc98231a3	0xf77c9543	0x9961f18a
-	0x36a63fa0	0x039932f1	0x1179d978	0xb43063e0
-	0x89bc1a9a	0x2a61348d	0x34113ada	0x1866335c
-	0x8b0249ef	0x94c2a8a9	0xd002ae9c	0x029e1f71
-	0x989a3204	0x57b1aaea	0xf2d06793	0x62f17706
-	0x656e06b8	0x022897b3	0x09c381bf	0xafd90766
-	0x8c79df8e	0x665a6727	0x33c2cd0c	0x2e61c4aa
-	0x9dd83f35	0x01b2b241	0x70f5d0e4	0x0e98f63f
-	0x800dc70c	0x8eb5c772	0x7defbb2f	0x763810f0
-	0x7ff959ab	0x07640942	0x7ca07fa5	0xa7bace66
-	0x208a078f	0x2975dd73	0xa4866e67	0x271f5bac
-	0xdca36998	0xe5e1d1fd	0x511f9ffc	0xafac1c08
-	0x827968f9	0x8823df83	0xba2c243c	0x3e2a0d33
-	0x77e0cd0a	0x623d50a3	0x278f115b	0xb79a27e0
-	0x51ab943e	0xdda62a6a	0xb42ea0e4	0x2ae47d5f
-	0x5ceb281f	0x022dfce9	0xe1f879f7	0x6fe70f50
-	0x1d98abe7	0x0828e611	0x8ad0ba15	0x61bbd7be
-	0x5cde8df9	0xd78b7375	0xe1cf9350	0x9faae80b
-	0x5564c0dd	0x3d735e25	0x64985c05	0x20ac585d
-	0x57e9da3d	0x495cf386	0x1889c50e	0xc313efb3
-	0xb3f5e423	0xbb87a9b0	0x3cd06b09	0xdf51b230
-	0xeb2801dd	0x6d5d43cf	0x1fba7400	0x08791e6f
-	0xf90e0873	0xa65df0b8	0x64369b67	0xc22c9200
-	0xd840f9f0	0xcc49d4de	0x9987db7f	0x8fec9974
-	0xc826c852	0x657bd87c	0xcaddde2c	0xeb0dc447
-	0x4a45ffa9	0x035d22b0	0x236eceff	0xa3ba5f8c
-	0xccee0a9a	0xbad5d1dd	0x1cc8b587	0x5f11d469
-	0x99f8c63e	0x64311906	0x43c19b36	0xef9d5e86
-	0x00705473	0x78100dd0	0xedab57b3	0xf3b00610
-	0xfc6e3467	0x6c4bff2f	0x97227c44	0x38ca257b
-	0x4e79fd63	0x0c8b3466	0xa2ae7e62	0xb01fba5c
-	0xdeee261d	0x2a4c6387	0xb9dce78a	0x2f0905c3
-	0xa76a7929	0x5f3fa1f0	0xca4e5260	0xccba772d
-	0x862fec80	0xb8257aa1	0x7c79cfac	0xc75d7230
-	0x387e536a	0xaff486e5	0x3c549063	0xeea5fc5c
-	0xc433a55c	0xbfb619b4	0xf36fb0c5	0x4faab4e4
-	0xbcd75d84	0x6eb5ee8c	0xaa4e29a9	0x551db0d6
-	0x1ccbc659	0x9b5e8c52	0x1e33bab4	0xcfd30d60
-	0x6366c21d	0x3f0d7056	0x7f2247da	0xaba4f322
-	0x7b0ec4fe	0xdd64dd73	0xcd538711	0x67dfcd4b
-	0x02d1b6f0	0xef0b6e60	0x1058738d	0x0c056ad5
-	0xb40abdbc	0xfc2549e2	0x6fb269b6	0x08f7ec08
-	0xea0a76de	0x7e97ee14	0x4eed0856	0x75ba49db
-	0x8145dd79	0x43101098	0xac911399	0xf8aab5ed
-	0x1e9d391b	0xb2a3fbe1	0xa394939f	0x12b8300e
-	0xa5f5200f	0xc350dcc7	0x1b2380d2	0xa599b322
-	0xe219e0d0	0xe4912308	0x0ad305cb	0x2e22d468
-	0x599eacdc	0xcf3b7eba	0x65fe5903	0x44f6cb16
-	0x0ab29b19	0xa74185e6	0x41736bf9	0xeaf231f9
-	0x762d0e7f	0x8b445ce4	0x173d3775	0x138da565
-	0xe4f7f652	0xe62e4ae8	0x91ce0ed8	0x1fc94878
-	0xe44acd84	0xe4402b5c	0x6437aaff	0xe7b0d8d8
-	0x514fbcf5	0x4b3bf5bf	0x0696b5d0	0x89a562ee
-	0x02408e77	0x94cc3287	0x47860ed4	0x42aedc7e
-	0xe9f0f3a2	0x4cf19812	0x3181341b	0xd72803a2
-	0x42f5c8b3	0x5735456a	0xef70c247	0x5943b8e4
-	0x7c62b0e9	0xc507e2e6	0x85a2c82f	0x95c6d92d
-	0xfeefff6e	0x5740c004	0x1958f117	0x44ebaa15
-	0x9f061786	0x732a8720	0x9483f974	0x839d5b20
-	0xeefb728b	0xae2d4b7c	0x49bcb243	0xd86db07b
-	0x73b0542f	0xc5a34fd7	0x5b9401fd	0x7f75e686
-	0xb239ec36	0x41e7943d	0x2bc517f7	0x27057733
-	0xf6c9cbd1	0x2965ef66	0x969b44e6	0x77b66e0f
-	0x68b93916	0x31d581c2	0x8520df18	0x16ce6af1
-	0x70bbf865	0x6d1ea78e	0x989ed713	0xf97c0d1d
-	0x538aef6b	0xf1ac3c76	0xf65f8bf6	0x4f4d3a8d
-	0x639d90ee	0x43079e8c	0xc9d50f0a	0x9b12ec49
-	0xaebe3d8a	0xd1bc3cc6	0x8b92e348	0xd056119c
-	0x7aec25f3	0xb3d2cf65	0x32c03540	0x53287cff
-	0x0bfa781b	0xf8610282	0x18a2d96a	0x541a6f1a
-	0x6052aac0	0x4f79e46a	0x7c868b93	0x6547a94d
-	0x58326c30	0x98e46f02	0x77cdd3c2	0x204ce551
-	0xa5e32028	0x679e3153	0xc7880c16	0xf32743f0
-	0x63c8892b	0x51d8a6ea	0x42bc6417	0xdb8ae71d
-	0x04c71f86	0x1a5bd80b	0x810f3b56	0x049580a6
-	0xd384d2b4	0x92cd10c8	0xaf4e6ce2	0xac955cc4
-	0xf57b42b7	0x1017f2b4	0x3031fafb	0x3d1a8024
-	0x3aca42cb	0x75514d81	0x454b1806	0x5505c3e5
-	0x26d2c642	0x57454f1b	0x5e2d3c9b	0x6535eaf5
-	0x370de383	0x6adfbbe2	0x513a5d0f	0xfc48c333
-	0xa0a70bcd	0x35777e16	0x5ecec516	0xb7879d7b
-	0x08928fd4	0x88c8048f	0x4a0d2896	0x5bdae2f1
-	0x8761b488	0xfae8bb60	0x3c8e8abc	0x13939d3c
-	0xc29493ca	0x585a71c8	0x43205f16	0x06a3be38
-	0x4be88f47	0xd2be8c8e	0x3d721e2a	0x43051f74
-	0x922a9a30	0x6391fc85	0xc4965afc	0x61f082e9
-	0xc2686e37	0x4f77b6a1	0xac47fa16	0x1eb05157
-	0xe6f767a0	0x24177985	0xdf80b368	0xb54d959c
-	0xa5719425	0x656c70de	0xf35dfd40	0x702d5063
-	0x4e7ac001	0xc4bb4fb2	0x4af7b9e5	0xe0eb5c48
-	0xf08b19c0	0x468b1471	0x74af9030	0x51d171e9
-	0x81a59926	0x55b893e4	0x17adeb1e	0x72084962
-	0x7f358bec	0xbd4363b9	0x75a56726	0x3a033a75
-	0xd0fbf874	0xa6bf634f	0xa5e4be7f	0x4cd8338c
-	0xef6838b8	0x1d458215	0xff7698ba	0x4ba19dec
-	0x87f58c07	0x2c7933a6	0x1cd4f99a	0x158bba9f
-	0xffcedb5d	0x256eb5d7	0xcb6dadde	0x980349bc
-	0x6169dcf3	0x94267861	0x168ba5e4	0xd2063474
-	0x156c9738	0xc4bd2c2d	0x31ad709c	0x58cd43e6
-	0x76ba9c33	0x070f490b	0x357c3929	0x103bef50
-	0x82ebacfe	0x5affdca2	0x96d0965d	0x60911a5f
-	0x65d4f52a	0x795b3094	0xf56291dc	0x6e614bb5
-	0xf701246d	0x4953b1b4	0x15e4e5fa	0xb6954973
-	0x43ada767	0x4c0a9f27	0xa47f78da	0x52375c95
-	0x79770885	0x479c5aed	0xca2ac2b8	0xee74cc5d
-	0x752f00d4	0x2b5532d6	0xd3641edd	0x05eb0e05
-	0x5118c9a9	0x47a0e0b5	0x5f12d793	0x92019247
-	0x27d77d98	0x0e413c92	0x76e4aea0	0x9fa8e3f1
-	0x3c57e54d	0xf4a60ba2	0x5bb37f64	0x8b214f1d
-	0x320f3bec	0x1cfd1f0f	0xb0cf5b70	0xf26a138e
-	0x37bb143f	0x993d3fa6	0xde4138c2	0x9fa287ba
-	0x137617ff	0x591624c0	0x1d10f02a	0xf7e350a2
-	0x76bc2933	0x12af6e72	0x1777e320	0x3e161b20
-	0x6c9fd66a	0x0b30f462	0x9cb717cc	0xee2902ba
-	0x466d7b9e	0xe97c26a4	0x7406b88a	0xf15a7209
-	0x3d2815c1	0x3eb961e1	0xe5321371	0x05f60ece
-	0x39168ef2	0x201a9dfc	0x90fdb132	0xe4531401
-	0xbef01e52	0xade4b385	0x6ca0c911	0x7586ff60
-	0xe457457c	0xfbfa3688	0xc826a1e9	0x10360416
-	0x192b51d4	0x18471973	0x3f0dd5ae	0xea2bbfc1
-	0xbe099b58	0x8bd8efda	0xdfc56e40	0x9e50f4e9
-	0xceeaab0a	0xd1eeb5d2	0x840a3cd2	0x6b739449
-	0x4a94e95f	0xe53720e7	0x68c70986	0x1cec3aeb
-	0x2423ad9a	0xe83b9246	0x7ac4b815	0x3796ec1c
-	0x65ec7484	0x79e5b0cb	0xd25f4790	0x55573d75
-	0x0f24c1ae	0x6d5d9b62	0xf3b2788c	0x2c695087
-	0x0980abb0	0x5086c2b1	0x26a247e9	0x72071084
-	0xe76c66a2	0xcc9c0bba	0xc67723b5	0x19a809d9
-	0xddc03879	0x7161b52d	0x24ee285c	0x5a345427
-	0x0626ef30	0xb734a77e	0x8ff087f3	0x80222e05
-	0x91b6c40a	0x4fe76862	0xef66e1df	0xeedb9f06
-	0xb785ea7e	0x0e84aab2	0xd0a669d6	0x7ccc77d0
-	0x264df92e	0xe9d1b14a	0x4b517134	0x05444463
-	0x408e7bb2	0xe7ad2bc4	0x5d8cb4c5	0x61e508ab
-	0x9798953a	0xa6848924	0xf26be53c	0x8940d4f6
-	0x56f11005	0x6d8d60ef	0x03c374a9	0xce0dbc18
-	0x341e634f	0x64e7d2f8	0xeb201eb7	0x2dee184b
-	0x57ecd83f	0xd8f644a9	0xca4493e8	0x66347804
-	0x542e06e8	0x55f607ea	0x7f425fa6	0x362807b4
-	0x731c87c3	0x4b5d6e1f	0x03e70201	0xbc5f4080
-	0x899cfd7b	0xa651d567	0x9c333e24	0x8b0eedc1
-	0x53ff0c74	0x7db69633	0x6637bbda	0x5ce53c7c
-	0xe93bd003	0x91234974	0xe8a626f2	0xc6550418
-	0x1b4157aa	0xc42ff7e4	0x1b9213ae	0x70d84165
-	0xc7cb09cc	0x38bf0221	0x238ff6b7	0x3688fd5b
-	0x5694728f	0x4a8e4cfb	0x3cd7e1d2	0x72a41c1a
-	0x2d098e4c	0x5a0ab21d	0xc8a40160	0xf252b062
-	0xc172763a	0xaedea2e4	0xeedcbcf9	0x4c0d2216
-	0x02b5eba5	0x410139da	0xde4ff14c	0xa53ca456
-	0x8c30792f	0x6af27a7b	0x734b1dab	0xf4f60014
-	0x79fc3cc7	0xfc578e4f	0x20948f41	0xb4fbe4c4
-	0xdbb21292	0xac1aa341	0x7ffb8913	0xa498296d
-	0xae1e8f6a	0x167d82cb	0x094513fd	0x8f0810c7
-	0xd01d348f	0x700d0063	0xeaacbad2	0x23d45e0a
-	0xe3b3a244	0xf2f7100b	0xf680fb9b	0x529efdd1
-	0x01dc5480	0x263328c6	0x686fbe31	0xbf3a1057
-	0x34c763da	0xae45207e	0xcb5abb2b	0x011c0faf
-	0xde2b6f4e	0x3d95034b	0xacec6e7a	0xc792595e
-	0xeb3cd922	0x7894f0d5	0xd9a7e62a	0x1a3c2ea9
-	0xa8f22d99	0x1ffaa636	0x47c6f1ff	0x69feca71
-	0xcf8d73d6	0x1c85d0fd	0xcce984c1	0x993f7a9f
-	0xc095c139	0x1c013486	0x675a753e	0x01030902
-	0xccab4cd7	0x0c14c605	0x5ebc19b1	0x60ad33a1
-	0xe80e1200	0xdf49db31	0x855aee7a	0xbfa37ef2
-	0x135d844f	0xdde541e3	0x0522f180	0xa27312bc
-	0x57046808	0xb96fe1b6	0x77c2806e	0xb90ac06f
-	0xa425864e	0x857ff22f	0x16eca5a6	0xbaa58ca6
-	0xab30772e	0xb20507fc	0xa593f6cb	0x9e7e8409
-	0xac4ecd8d	0xa9c0561b	0x0c462492	0xb3ee5aa1
-	0x83d3d56c	0x5bc20412	0x03365294	0x09758ede
-	0xe9e6968a	0x80ffc576	0xe62ddfd6	0xd5934635
-	0xe07f36e1	0x99c0db4e	0x2dcdb7ed	0x68749a34
-	0x4f718748	0x630b1315	0xe632adbb	0x4c111085
-	0x13bbfaf1	0xb70bd522	0xf22068d1	0x4ed37edb
-	0x7c50ff42	0xa6b61456	0x828deb4d	0xf19dc8ae
-	0x7ed7560e	0xb47a1aed	0xb79beb35	0x720d104f
-	0xff5ecb74	0x1e7d9f8c	0xa69f72fc	0x743e81bc
-	0xa11aacfc	0xab8fdc17	0x263ea36e	0x840bc0ec
-	0xb994aefc	0xcc5922c4	0x08411c01	0x0073895d
-	0x7b661458	0x8bf91a68	0x93112089	0x541e53ed
-	0x37706daf	0xc8733951	0xe74fa74e	0x638cfb72
-	0xe696bdc6	0x87f4b7c7	0x413acce6	0x16642eec
-	0x83b0ecf9	0xcf770d15	0xa4aad143	0x2ecd9f9a
-	0x5bd7a2c0	0x07dca9c3	0xf6ab7c5d	0xaa4a55c2
-	0xd410d6a8	0xdb84dc85	0x6b8e3aa6	0x8f268bb5
-	0x1e9604cd	0xb5fabbcd	0xc8a519d7	0x07fdab7f
-	0xceee08f1	0x08b9566e	0xaa646716	0x4ba7ca9f
-	0xe0166e0d	0xb31e9561	0xbb9315cd	0x42201352
-	0x5eae88f3	0x8b8e8eee	0xd63d0610	0xe64a45bd
-	0xc2e8a084	0x2e421cb3	0xda754ee9	0xcdfe2c8b
-	0x52b5544c	0xe5c0616e	0x387916c6	0x204c7ca3
-	0xdc507264	0xca026018	0xb4dc7a91	0xa9f27453
-	0xfb6995c8	0x349b640d	0xe59e1670	0x53d18974
-	0xa61ee5e8	0xdc8b88d7	0x78d2f8f8	0x72ddf8c1
-	0x7345705a	0x1e6ecb19	0xff0f4f31	0x197ae361
-	0xc2e43f5f	0x80a2bf1e	0x274d46c4	0xbb3ae1ff
-	0xd59798f3	0x5bf16015	0x871d2acc	0x4044c5b1
-	0x9ea15fc0	0x9a735765	0x1683fd6f	0xfeb503d9
-	0xc3de1998	0x14405d5b	0x86b76966	0xb3893dbd
-	0xdb365404	0x6636d465	0x63558798	0x758d5f12
-	0x6e225d18	0xad787cc5	0x775a5c1b	0x68112320
-	0x23e1ea3d	0x8cf63961	0x0596cb9d	0xe9ca89e5
-	0x96cb88a3	0xb7cac802	0x3b38edc2	0xb455d1ae
-	0xfb215ed9	0x9cfe7580	0x0410155a	0xc6b75ca3
-	0x359ef846	0xf96db47a	0x9800cc06	0x9ab0eeac
-	0x1c86094d	0x19537992	0x3cc54b13	0xe877a758
-	0x35c01849	0x396470de	0x8c229cb6	0x2b01a145
-	0x54ae9638	0x33b0bb07	0x5d38fbfa	0x3a08d46b
-	0xab433b4a	0x6be993fa	0xe85fe0e6	0xd4d2b82c
-	0xc35398ca	0x66200602	0x51df5ed3	0xddb67c76
-	0x6a4c2d36	0x9a02eb04	0x8ce871ce	0x66753dbc
-	0x5441d00a	0x3d331728	0x80c55fcc	0xac286e97
-	0x71fad042	0xe99c0cdb	0x3120ef01	0xfabe32e3
-	0x265699eb	0xa73e31be	0xdd44e3fa	0x668531dc
-	0xd4ba1078	0x0f13c8fb	0xa136ed20	0x010f3c83
-	0xb3f8eaa6	0xc6d95837	0x0e09bd46	0xf0ecb760
-	0x8dd905c0	0x02cbe8fd	0xfa898489	0x14ab16b4
-	0x6ae99a74	0x516a171a	0xaa60c4c8	0xc075f0cb
-	0xef530ecc	0xf6fffd33	0xe1d2af99	0x6913b9ec
-	0xc96666c1	0x20743c9d	0xf65cd424	0xa671b903
-	0xcbff34ba	0x60df0c1c	0x0d610133	0x4281a959
-	0x656230ac	0x1693d52a	0xf4d37186	0x203caa5c
-	0xa54cad8d	0xea1c8816	0x5bd54f8c	0x2a3c33c3
-	0x151f72b6	0x63061580	0x0bc7f244	0x882f7656
-	0x243d76fe	0x9b3bf7c6	0x3337a21b	0x8b9e3e63
-	0x106289a1	0x74ae0571	0x8a43a5a9	0x7ad8c804
-	0xb6867d45	0x45732f84	0x0d1773f6	0x9fc01aa7
-	0x7b192c33	0xeeab4a4c	0xc96ae493	0xb5aad8be
-	0x8b32c8cf	0x8ebf63c8	0x5f2a5e17	0x43a2899c
-	0x35ec1fc2	0x7c675072	0x6673d01f	0xc1d85b58
-	0xf73dec41	0xc1c89c18	0xff8fac98	0x434c3c5d
-	0x184ee2bc	0x3469f366	0x2558fbf7	0xa0e5622a
-	0xebb39f69	0xe9020554	0x3cd80512	0x767bcd48
-	0x2e388fca	0x32eaa226	0xeaf4f6a4	0xbf7fb5ce
-	0xdde75b24	0x30365d1b	0x48fd5203	0xca805f98
-	0x82526a04	0x51a8dd82	0x61fdd2d0	0x3ef56891
-	0x6d5d53d0	0xd83646eb	0x1d7a7086	0x7ac52300
-	0x69e4359c	0x7c8058f5	0xf47d703a	0x21b863a1
-	0x608b8362	0xb9a78389	0xa9d2280e	0x16672055
-	0x05501917	0xf2e01be2	0x261a10f7	0xfe455dd0
-	0x902a0cf3	0xbed63a74	0xeb4bfe27	0xab8b091c
-	0x4cd8f22e	0x48dbda13	0xb3d29b0b	0x65bf3d3f
-	0xe9be4080	0xfdbf0a24	0x9181ebdc	0x5faf48d6
-	0xaaf1acb3	0xe2a2aaff	0xe1ae56f7	0xbd475702
-	0xbfbe292a	0xa6133579	0xadfd6723	0x289485b4
-	0x92667c06	0xee16866a	0xfbc71087	0x0cd78050
-	0xfd40dfba	0xc9834441	0x5cfac60c	0x844b44ba
-	0xe1e4d8ac	0xd6775e4f	0xd4f01979	0xab5faf6a
-	0x63e03982	0x7789e272	0xb75dd171	0x39d0666e
-	0xbd90a902	0xa4eebba3	0x2640274b	0xbcedd52b
-	0x87033b15	0x2048812d	0xc13c2230	0xa7d345d9
-	0x84b4fb4d	0xbc0960cc	0x4c7422ec	0x4bff7ea9
-	0x16315057	0x1a9c50ee	0x5441830e	0x61cc7b9d
-	0x2f7cd3eb	0x6ae05c81	0xc264d759	0x4c6dd592
-	0x3d47dbbe	0xf8797367	0x4ae67c6a	0xdb42d373
-	0x0f6a6e9f	0x3d6c6b82	0x16906b77	0x80f7dbbc
-	0x6ee0683a	0x1afb8d53	0x4df1322e	0xc7d489a0
-	0x9d06aab8	0x08c5ebc4	0xd8cf4766	0x0be222da
-	0xd45596ee	0xa8113953	0x1a42b7c0	0xf4de2c73
-	0xe5741505	0xeb9032d7	0x480ab9f4	0x595e824f
-	0xc87c4e6a	0xe636b3c0	0xddb3438a	0x03f6ba20
-	0xd43d9bf5	0x3bbe086f	0x6385fdd6	0x0b9d62ae
-	0x1b9fc458	0xf6d1cffa	0x168ec5f7	0x93c98771
-	0x018c51fc	0x3a6c5880	0xbc4d25c9	0xb90c47db
-	0xccee6371	0x289878aa	0xb63ebf23	0x9fdff591
-	0x863d71c7	0x1301cab8	0xead66f03	0xf8a74303
-	0x91439b31	0xcbfc5008	0xc78a05c7	0x172ddb38
-	0x16254ebb	0xf490cd3e	0x9724bdba	0x915c5eaa
-	0x2d971801	0x672389af	0x25023172	0x69fb7e23
-	0xc5d66742	0xdb578a72	0xbb6fe6ef	0x9ff3920f
-	0x9e04e6bb	0x9bd9079c	0xe70a3479	0x1f423c00
-	0xd3a901dd	0x7fceda2a	0xf1999db6	0xeb73cb34
-	0x891cf0c9	0x55313b9a	0xe74ad3b2	0x98fc0593
-	0x9ec6c756	0x7b84cb06	0xb06c9cf4	0x604b8b04
-	0x112e4063	0xeec6c6a8	0xab9b6bb0	0x33e24999
-	0x14c1cb98	0xac0fdd7f	0x2b9a1d04	0x7fb3667d
-	0xd4375e71	0xe0b840e4	0x1c0789d3	0xe67c6b6e
-	0x00b8439f	0xc0be1ba8	0xfd6bac10	0x3a7e3be0
-	0x3c6a0d2a	0x38eb71ab	0x43711d1e	0xdbce233d
-	0xce91e57b	0x2f386b58	0x88ca7857	0xbe5bf50e
-	0x487a5b5d	0xb6470361	0x91e09471	0x18ee543d
-	0xe1857917	0x60d489ae	0x5d44c618	0xc6f46454
-	0x3cc37b33	0x9f8cf96f	0xd365b8f1	0x721f6448
-	0xdbe1a2e8	0x81651a33	0xcf105b61	0xf4ef4f94
-	0xc4693805	0x801e2a58	0xc932d045	0x6352f5b8
-	0x731cb8aa	0x3b2a6546	0xad87d205	0xa6b41613
-	0x8cc971a6	0x5cb47978	0x86b89ba4	0xb482b4a0
-	0xe326080c	0x821b137c	0x2a154131	0x094b02a8
-	0x56a1868b	0xa8a38181	0x8815878e	0x749bb12a
-	0x8bab2a16	0xfbe0bfd1	0xabef2266	0xd59d9169
-	0x975b6018	0xdb45a39d	0x6e31771d	0xa373d6a0
-	0x214d69c0	0xa4cfc886	0x30a8b314	0x558b670c
-	0x7cb96533	0x9c6c1dbd	0x3bae20a8	0x6a792685
-	0x1a5d6816	0xd085f694	0xcf367101	0x908cc2d7
-	0x9a7eed70	0x1e19978c	0xbf77c25e	0x5098a627
-	0x2129095d	0xcb5c81c7	0xa2888a61	0xc9df4b0f
-	0x0f20511c	0x6a16bb53	0xda26eb80	0x9a0190c2
-	0x372ff753	0xe1ae8ecb	0xe54e1e31	0x967b935a
-	0xd58c26d6	0x7d4a5515	0xa8f41efd	0x737a8b53
-	0xb2a33b65	0x7d04ef67	0xfd491b9c	0xffe6c29c
-	0x54424355	0x50c502e3	0xd8400ac4	0x6f17dffe
-	0x8be39f17	0x6b3055b6	0x20c445f3	0x6cef7ee4
-	0x821cfb2b	0xab19d476	0x540476d6	0xa6d1099c
-	0x223acfda	0xbda49356	0x403d63a5	0x2b83600e
-	0x45e5e0db	0x10323cf9	0x80675f78	0x6acc9d72
-	0xf0d7b6bc	0x122fbbaf	0xafef53d0	0xa606b680
-	0x13e91e0b	0x95a464dd	0x54ae9057	0xf12e1c07
-	0xde806b00	0xce8904ca	0x44ef27a3	0x14f85e0a
-	0xbc1bd0a7	0xa19863a4	0x7bb14eab	0xc3fe7ff3
-	0x1c915fe0	0xfa45a07f	0xab471bb8	0x335918ae
-	0xbc91e280	0xd27ab8c6	0xf79a0fec	0x0d54b501
-	0xf870aaee	0x44c1b504	0x60d2338c	0xe2f01abb
-	0xad4ca3b9	0xe8f97018	0xb3810e3b	0x3f885db3
-	0x6890f6a4	0x8568faf9	0x503d9690	0x709dc422
-	0x11f02c4f	0x57305bce	0xc1e07251	0x3b8b0c3d
-	0x3da8d742	0xe5956aa6	0xf394f116	0x07daa257
-	0xfd5b1b25	0x354b3d77	0xc2587f36	0x6fa8083c
-	0x6b8b8a0a	0x71cebc82	0x799e5566	0xd66e6525
-	0x3d80e29e	0x0a1dd883	0x7886487e	0x5d80604e
-	0xf7533c54	0x53c428c2	0xdb5c0cb9	0x211fbb3a
-	0xc7fd4590	0x409ec2d9	0xce50ff5b	0x142bcc4b
-	0x475f8d75	0xdc4b4f3a	0x1f230600	0x863d868a
-	0x5a8cfd49	0xc761fa43	0xa2ee8f88	0x5e8dbe56
-	0x9a140e41	0xf5c00dcb	0x04786e5f	0x6c2baa7f
-	0x9e4cb1d6	0x4074ee5d	0xbb4f106e	0x9afa4259
-	0xefa345c2	0x806cd3a0	0xf51afbd2	0x653502a7
-	0xcdf6fac2	0xdf756b85	0xb89ef192	0xba0b2652
-	0xea1b3853	0x4edf3f15	0xccaf559c	0x11721dba
-	0x36ab3f38	0x198d218d	0x5bdd7b39	0x3be8d3cf
-	0xea3e6882	0x6ed8fc9d	0xbffeed09	0xe513b75e
-	0xdbb9f2c9	0xf693d870	0x7bed8b14	0xe98cae50
-	0x591d36d1	0xba55333c	0x20048cad	0x7104e6ea
-	0x08a1335a	0x6dc416cf	0x431d8dfb	0x3f4db80e
-	0x3ae3f65d	0xdec93bf5	0xe1773712	0x8b9d6e9e
-	0x7a3599f4	0xa6292450	0xb7b68277	0xe57c20ce
-	0x3cf4eb70	0xf00d3dd3	0x9da300bd	0xa4b25418
-	0x6273314b	0xc5be2c6d	0xf297eb77	0x851334b9
-	0x9eba7308	0x7a015151	0xa3416ae4	0x7c54c0b7
-	0x352083c7	0x5c56ffda	0x1cf4d4e3	0x6ffef4b0
-	0xa8c972d1	0x6db1761c	0x4b2f3400	0xfab16aaa
-	0x437f0125	0x0c3ba2ac	0x89680f6f	0x7e48432a
-	0x0e465f0a	0x943cc778	0x075156f7	0x46249153
-	0xcbc017fb	0x0de6f92e	0xf380bcf4	0x9732a788
-	0x6e01dc94	0x5329275a	0xec971ab8	0xea971178
-	0xc1e3cbee	0xe598c0af	0xc5ca63a9	0x06018d8c
-	0xc55446d0	0x18e04c29	0xd19da94b	0x74536dd4
-	0x9837bbec	0x64bba10b	0xa63810e6	0x2189497c
-	0xfab9e5a0	0xde0267ed	0xbfb94a58	0x377e52fb
-	0xc8f5016f	0xd34b0180	0x2a5e942c	0x2ca6fe08
-	0xfd52fd5e	0xcc2f838b	0x7aeb73c7	0x43832892
-	0x2a44684b	0x0d8a7b22	0x9b84347a	0xacfedd86
-	0x966aed18	0x66eb4a8e	0x890108b1	0xda13caac
-	0x36c0f2c2	0xe2d85d85	0xc51f9f4e	0x9594e1b0
-	0x0707929f	0x63fa9d30	0x2b461080	0x18566f8d
-	0x40e12ea7	0x83e37963	0xa8d0eab6	0xb242700d
-	0xd928ecb1	0x6f5d6d73	0x603f5d48	0x4902cf34
-	0x9a477f4f	0x1b282220	0x3645ae11	0x09acad23
-	0xf772e479	0xd3c5b6b6	0x09abad03	0xdcbffe41
-	0xc971e22a	0x360a0c86	0x102ee956	0x9162221c
-	0x6a59f30b	0x9685277a	0x6dc283ba	0xcffd7ce3
-	0x0e487e66	0xd4dd807b	0x686bd0f2	0xc44a3392
-	0x6422fa86	0x6716d62b	0x2ac73404	0xc88fe77f
-	0xc49b6e01	0x8f011f47	0x5bb1ac5d	0x1d0ba4e8
-	0x7eb0d0c7	0x9db01b4e	0x6cbdaccb	0xd46f1c0d
-	0x96cc24e9	0xdbbaf254	0x9c5c45d6	0x325aadfd
-	0xca9638fb	0x1aeb36f3	0x8be8295b	0x705d0bab
-	0x9ceab5e3	0x5eb5288e	0xd7ec61fc	0x69bb3afa
-	0xad60164b	0xc435c21c	0xeb79ab88	0x145a58f4
-	0xae1e30ea	0x29987183	0x0a2a0432	0x160daa37
-	0x14e295e9	0x978315c9	0xf323f88f	0xe24d5136
-	0xae6ed24d	0x4a812cf8	0xd1e45d3a	0x64894447
-	0xf47d0453	0xb6fb5f02	0x34685ba2	0x8c700222
-	0x4dec7d3b	0xf035a0dc	0x9a802102	0xc3e27d5f
-	0x1928580f	0xeaa68f5c	0x46aad88c	0xfa913719
-	0x4fb0b232	0x3a638afb	0x4cd2068a	0xf26e4c98
-	0xe9da3c5e	0xc7ad41bd	0x3f1cc280	0x1fca9886
-	0xa777ff80	0x1ca76273	0x6a63123f	0x46d87fb4
-	0xd9282597	0xab9e06bf	0x3e244814	0xd9653380
-	0x48ab7d76	0x65d98e81	0x06047ee3	0x29b7ce31
-	0xae94d96c	0x856f9e8f	0x158f1b6b	0x9de1570b
-	0xca4ce67d	0x6f09907f	0xc891e152	0x6867c97c
-	0x02a5b2d4	0xf2e7c715	0x84f6da46	0xd603e51d
-	0xd837b33c	0x70de8d6a	0x598dd9df	0xed29a7a6
-	0x42da0f62	0x893fc276	0x56b43a06	0x949d4f05
-	0x7dde2d34	0x8b3f4c32	0xccc9c0af	0x01fdbdd1
-	0x2a3a3cdf	0xb6763454	0x7377862d	0xb99dd58f
-	0x9ad6cf20	0x2f80a8b8	0xc11b356d	0x4adae4cb
-	0xe808d693	0x3e8605d2	0x005cbfb2	0xfe966e1d
-	0x713b365a	0x4d12fc2f	0x1664286b	0xb5d41f0a
-	0x4420d15f	0x63e106bc	0xc2fe4169	0xe5f440c4
-	0x7fc0ae73	0x35ba3ba1	0x7a228157	0xfc50c107
-	0x2bd1f472	0xa9d03dd6	0x62d1a612	0xf93c55e6
-	0x6677a632	0xcd874d7b	0xa76ba1f1	0x2d82a8a8
-	0xa65e30ef	0xe48eaccf	0x4d7a4adf	0x8c276f69
-	0x0e229210	0x0096b100	0xa039ae73	0xea245d6b
-	0x0ea50d26	0x99b480cf	0x159ea81e	0xfa45f5a4
-	0xafd411d8	0xe1190cd5	0xc9e85cff	0x1e037ea1
-	0xf4be41e6	0x48fd1c6d	0x24d52f02	0x3780b91f
-	0x8e31dd07	0x1d392b15	0xb07e9d5d	0xf05b19bc
-	0x4f52d03d	0x846cf6a0	0x4d51d2e6	0xe4144ab9
-	0xa8f9558a	0xdbea007c	0x770f27bd	0xef95e02f
-	0xc01ba9db	0x8ad80d07	0x039bfc69	0x8f5d2e43
-	0x8640ff02	0x31872f4d	0xb959380e	0x027a8268
-	0xf39dd7d6	0x7c84199f	0x8f977814	0x6830b481
-	0x46495e33	0xd5c68952	0x6f2c3636	0x8de0e29d
-	0xc03f0b39	0xbc54910d	0xfa46af50	0xe81542c8
-	0x462d1ff8	0xb229a9cc	0x6a234b00	0xc96f857d
-	0x0a932f55	0xbd7fcba7	0xf937d965	0xc90cfd53
-	0x2ff150f6	0x0f5a40a8	0x805bfff9	0x92056edd
-	0xf6326626	0xe18371b2	0x9b9ce558	0x252d7e17
-	0xfbb7fdfa	0x3cf275e9	0x8ddc0be6	0x7e83319f
-	0xc61ee1ef	0xee1751d6	0xe267323c	0xd7229015
-	0x4a9cda9c	0x841730a9	0xd924dc44	0x619f2cee
-	0xb5172002	0x210144df	0xf6fda998	0x64f75cb0
-	0x3cd50175	0xdc7d3564	0xad0e94bd	0x18c876d5
-	0x7532124e	0x3b99841f	0x1a2c6219	0xe7d5ffe8
-	0x9f76b0ed	0x63437918	0x2b14f1ce	0x898a1cc3
-	0xfad43f4c	0xde5adcb2	0x8b9d0166	0xb4f2370c
-	0x1d212e4b	0x1f55058f	0x26bc79ad	0x681d1014
-	0xe0ddd0bd	0x4c256b7d	0x7268e89e	0xa422562d
-	0xd7a55326	0x6955e943	0x86ccb09f	0x03133a0e
-	0x2fe2399d	0xd9601d6d	0xdd128b8b	0x182251f6
-	0xa041ce84	0x5b5bc49f	0xbad64d6f	0xa7594fcf
-	0xb6dce9ff	0x69c7e4bc	0x83d16d70	0x41c2593e
-	0x282d55c7	0xcdcdddf9	0xd9855130	0x83fca027
-	0x32379a19	0xf8fa8dfe	0x0720d059	0xcba2a7b7
-	0xeab4e686	0x228601ac	0x660b45f0	0xecde3baa
-	0x4047d983	0x4ced2e8f	0x77aa1d0c	0x7e6cd6a5
-	0x80e06058	0x95d27baf	0x071433d6	0xc7d3d431
-	0x7856634a	0xa1b894d8	0x2faedc1d	0x1e05a846
-	0xa9bc7fa7	0x0ca15e02	0xbcc96351	0xb483c979
-	0x239681be	0x24354ba0	0x5c743a31	0x7ed77958
-	0x20a4d718	0x7b37986f	0x43a9e233	0x02091eb0
-	0xebdbf21c	0xffd2069b	0x6f191684	0x111e2666
-	0x8adb42dd	0xf26db866	0xff83d42a	0xc7d28a0e
-	0xec1bf909	0x10434bd9	0x6404e8c0	0xae30d43f
-	0xf415a59e	0x3daeca66	0xe1be615b	0x04db2d3f
-	0xa53b33b3	0x5fd6479c	0xab5ffe67	0x2cdaaaef
-	0x61087f2e	0xd805a00c	0x11d85656	0xc1ae3754
-	0x1fe38c7d	0x108e2ccd	0x3c6e1773	0x512eb70d
-	0x86142b5f	0x826ec294	0x956a3025	0x8b04e083
-	0xd69cd3bf	0x04f39016	0xf362b172	0x960466d0
-	0x230a3139	0x19378fba	0x335f3518	0x206a29a3
-	0x82465579	0xc1e4684b	0x9ac06746	0x1f0138e1
-	0x875a9aae	0x35ed8dfa	0x030c59c3	0xb3ed8018
-	0x2e91fa18	0x93739c48	0x172ed0d3	0x13722907
-	0x8e4e0426	0x47f72379	0x8bc54eb7	0x8657e9b7
-	0x0472cf9c	0x1424f3da	0xdf83007f	0x87aa810c
-	0x0e14e6e1	0x9d0dcfdf	0x9e7696b0	0xe019c6aa
-	0xa866fc9d	0xc19a1ff2	0xb187dffa	0x220adae1
-	0x16deb6d0	0x57bb035e	0x8084703f	0xabca8b49
-	0x577af6a8	0x520ff09f	0x3d87711f	0x1d2254a2
-	0xe161d5be	0x23287038	0x11722e48	0xdc7c6153
-	0x7e953ad9	0x1797ca90	0xd56bdecd	0xf7973432
-	0x5804968f	0xb688ad25	0xfda5e113	0x584d2c84
-	0xc5c02d74	0x7b6235b9	0x6c1712cf	0xb8ef7795
-	0x26d414d0	0x4b705388	0xa5725233	0x4e29eb6a
-	0x4e2f32b6	0x4996ed96	0x45b98f88	0x67ed828c
-	0x34e7af7b	0x5640103f	0x6aacf602	0x354d85f7
-	0xf6e8983e	0x1468e2dd	0xacae2dcb	0xd3bcf29a
-	0xa176799f	0x57a1bd66	0x7971495d	0x44dfac4c
-	0x32c643f6	0x57cc7b19	0xfee17e6e	0x1505f974
-	0xbaef1420	0x3b930cd2	0x65fd2cad	0x92ce1aa5
-	0x734f0807	0x65a5a815	0xa7124d4c	0x1ad9684b
-	0x32eb33c0	0x761f49ca	0x10b49a88	0xf0af198e
-	0xd7173b32	0x640b00ce	0xd3ffd60b	0x3a92cb20
-	0x71eccf6b	0x7c1c49e4	0xc7401cfc	0xf3f52441
-	0x736776c9	0xe8609667	0x8cbb06c9	0xc821f68e
-	0x827c67ac	0x0a98a704	0xd71e62bc	0x349fe1e0
-	0xac56ba89	0xd36baf48	0x54af6806	0xaeb2f143
-	0x0247d79b	0xfd27b357	0xec131b3d	0xd9fecc41
-	0xfdcb3993	0xec61c159	0x911a6bb6	0x849e85d1
-	0x5e4794d1	0x3c771cb5	0xdbc45603	0x76ef6090
-	0x4bfa505e	0x592b3fd9	0x05509bbf	0x2766b252
-	0xd9b66afd	0xe80fb26a	0x1ea90db3	0x61b1e2e9
-	0x5899953a	0x08c3bdea	0xe6393951	0xd2db7170
-	0xaa7031f2	0x5afce44e	0xed13e406	0x2af7388f
-	0xc6254e8c	0x3a846e5a	0x49de8429	0x56792361
-	0xa9fa85eb	0x4d97a05d	0xbd804c72	0x9e3f10be
-	0x94c6cb39	0x38a2729c	0xf71833f6	0xb9b36d59
-	0x8d7a74cc	0x4d9d5b59	0xaa9a735a	0x4ebac1ef
-	0xf073c9ee	0x38d2ea0f	0x87247f61	0x2e110dfd
-	0xca47846c	0xbcfd03d4	0xea058e96	0x40cb9628
-	0xaea31bc5	0xf39d05d9	0x246bec2d	0xb514efa1
-	0x5861299d	0x148ef9d0	0x1f5e33bc	0x444e79ef
-	0x52d62130	0xf391282b	0x93fcd860	0x6c3065e6
-	0x8a739db1	0x51f6cd7f	0x2da05ac4	0xe8f8b6e0
-	0x48adb62a	0x8c0c687a	0x2dc37ce7	0x993b198b
-	0x31008c46	0x3e509467	0x514a6614	0xca7c1511
-	0x5d3bca38	0x3a8188ee	0xedc7da67	0x3d243fe7
-	0x209f9238	0x03b4bc67	0xbefb5ed1	0x644e60ef
-	0x708021de	0xe7a8f948	0x8ec69a79	0xdde65d7f
-	0x2304f3f8	0x616643fb	0x7343b800	0x102f165a
-	0x848f5616	0xa85d42ef	0xc725fcf8	0x63207a50
-	0xa10f827c	0xd23d11c4	0x9832e62f	0xe7e99da8
-	0x492e1355	0x63882a0d	0xbeb2e2e6	0x02fdc22d
-	0x1a696e02	0x9821f6db	0xadf34cb4	0x2b274251
-	0xc40e4a88	0x7b22d05a	0x42574be2	0x004de66d
-	0xccd4a41c	0xd19863df	0x2f1965ae	0x868d7221
-	0x07cf8546	0x3fba2d34	0xb39e65cd	0x425bf20e
-	0xa61be150	0x191d3530	0x4f975298	0x37e1f881
-	0xd45df57f	0xbaba406d	0x06385459	0x4b105297
-	0x1669f5df	0x0ff8db41	0x258d3667	0x8592fb19
-	0x20f3da88	0x8bc12e8c	0x4247ed36	0x9d6ad7ec
-	0x26128a8b	0xbfd08579	0x084e2fcb	0x9279b5dc
-	0x3a33654d	0x1e40c91c	0x8f0a953d	0xdfd96c06
-	0x8703d737	0xca1f3200	0x60ec2e4a	0xa8814a20
-	0x6d9950a8	0x4b2438ea	0xc6ca6580	0x99f2f4ad
-	0x42dc5043	0x1bec10b7	0xce44a349	0xa6b35911
-	0x3583a4ec	0x65bcf9c1	0xd25c3af5	0xcb72222f
-	0x97cb8371	0x85f75c9b	0x03b1d637	0x6f80294c
-	0x3bdb3942	0x91126cd9	0xd3fbb35c	0x752a7251
-	0x5ed886d2	0x19c91d06	0x7a883d41	0x550a9331
-	0x371f617e	0x61543776	0xaf4b02a2	0xa390ca74
-	0x99d106c5	0x3f8c2d8d	0x01ca467e	0x20e50f07
-	0xa40edcb3	0xdd2b0317	0xf96342e4	0x94a6e3ae
-	0x17431448	0x789ea7b0	0x7bb4fbf6	0x03839d5f
-	0x13f86c23	0xc6efbe86	0x9f891cd2	0x3e3af545
-	0x0b1d0457	0x481e80cf	0x406bd13a	0xb277b63b
-	0xfb5d99bd	0x6fea0963	0x5b48c16e	0x0ac10b3d
-	0xcfd388d4	0xe07a502b	0x4466cac6	0xaa21c31d
-	0x806ba060	0xf175bac7	0xfee9f170	0x38d1af9e
-	0xae1f0f7a	0x6252edb4	0xb23c56c1	0xede12e73
-	0x5747e22d	0xc3b58928	0xaf586774	0x9b6e8b87
-	0xeaf2016e	0xd1fa9a90	0x986a5882	0xdfe68064
-	0x5657ea69	0x237bbb3e	0x01e22722	0xb7bd28e1
-	0xb75d98c8	0x31ecee6a	0x861d60e1	0xebe8bebb
-	0xdc35606a	0x447f0a45	0x9f50d631	0xcaab3492
-	0x76035cd3	0x9d84a371	0x51b55a55	0x263fabd4
-	0x62ff9ab5	0x8b1ee33a	0xdc85e9eb	0x0471df10
-	0x29cabc6f	0x47467a07	0x6ee73133	0x536f5c8f
-	0x15f2a4bd	0x2ad7e8af	0x631a9bb4	0x9ce75522
-	0x228d008e	0x86fc05c2	0x5526b054	0x8db9d95c
-	0xdea2c7d4	0x1336add2	0x901543ce	0x2a855d2a
-	0x4c7e054d	0x967eab4f	0xca5c932d	0xec109941
-	0xf1752baa	0xd4b3a39d	0xd999886a	0x1a6cd856
-	0xb11f6348	0x60a21b64	0xea4467ca	0x51db6925
-	0xf8ee33a9	0xc674ce6c	0x5fa834a4	0x17f2b8ad
-	0x2eab9ce0	0x0ad42708	0xd8a6740d	0x164c4fe6
-	0x1f9d12c5	0x3efb12ee	0xedf0e724	0x7e8880ba
-	0xe9c55084	0xd9d6e9f0	0x8f4ec3ae	0x2d6aaa11
-	0x480e0081	0x28b6c152	0xee01619c	0x79ddd62c
-	0x4b17ea62	0xeda6fb70	0xd3673924	0x02e84486
-	0x4c0d66ec	0x9ab8cd5c	0x340fa6eb	0xf8db9df6
-	0xc72b2937	0xc09cdf2c	0x7ba60229	0x5318612b
-	0x08a07717	0x81cfe5ca	0x32a3b0e9	0x03cc518e
-	0x1085bd98	0x16069e72	0x6aa01ff2	0x0b512345
-	0x5ce6b51a	0xb58b347d	0x0dad3da5	0x7bc5aae3
-	0x81a88658	0xd9857a74	0x4fb95187	0xe03045db
-	0xbe4ddc3a	0x68be74f7	0x9663e4ac	0x4d31a7d2
-	0x7a2a70fd	0x03dde6ec	0x827e2f9a	0x17cf679d
-	0xb34aefe8	0x085aaebe	0xcff354e3	0x18754a97
-	0x10c4a4f6	0xb21d4e04	0x8e93af63	0x226ea564
-	0x6c3608a8	0x9fa96865	0x24f420b6	0x7d4a31e3
-	0xb7852762	0xd1c752f5	0xbcfe1a9f	0xe3cd44ba
-	0x800d6669	0x08455dfc	0x2bbdab4b	0xcc8cb0a5
-	0x268cd5d3	0x2b0cbe1b	0x40cd57e0	0x939c0f22
-	0xb85a1372	0x6c06319b	0x2be94501	0x9e13089d
-	0x2df0027a	0x47bb8a84	0x660234b0	0x6a05c46c
-	0xde9eb668	0x2fbef0ec	0x8e7391db	0x875bd721
-	0xa1e55bf5	0x31dc45aa	0xeb0fa893	0x36f0fbf8
-	0x8edacf6d	0x61c11564	0x9fe655fc	0x34378418
-	0xe032bb0a	0x5e996c49	0xaa576bb3	0x88f1f99d
-	0x08562a6b	0xa4d7900e	0x3d124350	0xf10984ba
-	0x65af441f	0x8329eb45	0xfa1c3069	0xd9c18941
-	0x6bf28004	0x32d89f25	0x107ae0eb	0xf23bea70
-	0x709b7c6f	0x7f6bc1b7	0x6829a1cb	0x770fec21
-	0x6dc4d64e	0xa37d7219	0xe5551a04	0xcd470067
-	0x81d6207e	0x81bc2a06	0x5330dc76	0xbe8b6aa2
-	0x5080f90e	0x7f393edf	0x37194036	0x1b19bf9e
-	0x4ff560fc	0xeb207634	0x2fa526e9	0x9c48acd4
-	0x9b9be6b0	0xfa749280	0x715fb587	0x50287f59
-	0x04bd42c6	0xf8674fd2	0x614fde7e	0xf0482894
-	0xa402a285	0x54813092	0xf50e474a	0xfa420315
-	0xfe7f82a9	0x835dbfdd	0x08540acd	0xabba517d
-	0x197c438e	0x3f69c2c6	0xdf1b60b0	0xbcc4b1c5
-	0xbb967e53	0x8a2e2be3	0xb78406f4	0x6cca685b
-	0x2877516c	0x3159fdb2	0x3f48f0a2	0x88c2ed5a
-	0xe8731530	0x227413ef	0x50b5610e	0xd0e7d76d
-	0x68b8a8e9	0x2f251606	0x0ba3ca68	0x3f470646
-	0xa473b7e8	0xa36ec586	0x0f41792e	0x4ef380fe
-	0x938d7626	0xbdf5914a	0xde6b5c26	0x26306e15
-	0xfbb123bc	0x9cd3a83f	0x5d621b36	0x9c391ee7
-	0x0921d18e	0x261a36c2	0x28cf5843	0x1b65db1b
-	0x28cf152a	0xd1308452	0x6aa9803c	0x8f11c7bf
-	0x42797ebc	0xd02410f3	0x56b4c779	0x22e788d9
-	0xc3fee627	0xa1673ded	0xa389d31d	0x47563835
-	0x4e963ba3	0x2acbc139	0x70da7525	0x39b3ada3
-	0xdf20f92b	0x1ff80e87	0xf847db4c	0xefae0a2b
-	0x42139d4f	0xd311a9d8	0xc54ccfcb	0x3b7c939c
-	0xb2eefc73	0x4908680b	0x30f160ab	0xa15abe60
-	0x31cdcc4b	0x2b5d457e	0xa264ccd5	0x73dfc993
-	0xa75c34aa	0x1b302cce	0xd5c93553	0x6982ca4f
-	0xf83cfac6	0xb1235d67	0x25780fb9	0x78af4f8c
-	0x76b1412e	0x139afea7	0x291cebe3	0xbd275519
-	0x18c300d8	0x33502f82	0x86f1d060	0xc83323f7
-	0xc8d57b77	0x928a2c82	0x9ba9d389	0x4942f49c
-	0x04c5abcd	0xc5fa8ab3	0x3e4936d5	0x6c5a6c16
-	0x69f97f82	0x277e2c29	0x4f5a84b1	0xcc546d60
-	0x887d8de1	0xbe980c48	0x6fb583bb	0x8f0dda22
-	0x64ed4be5	0xd3be3a6d	0x615532b2	0x260b87f7
-	0xb54915d9	0x9222464c	0xd447b5fb	0x08ef3c9d
-	0x1e68ebaa	0x16d60b49	0x67b5c5af	0xef5d90fa
-	0xf2fd3185	0xdb03838d	0x17ffffae	0x43304284
-	0xabdcf858	0xfa019d66	0x80a891f8	0x4b2898ac
-	0x676c113d	0x711d2b3c	0x59323717	0x912dbb50
-	0x55afd393	0xde134c0e	0xaaf1d1b7	0x97975a07
-	0xb66e6cab	0xfb0f54c1	0x6dae6384	0x04405a5b
-	0x95df053f	0x125f371c	0x6656c332	0x5801265f
-	0xcf365f00	0x31c300a5	0x2a7617ca	0x65ce79bb
-	0x4cc96bed	0x1af82f49	0xfefea103	0x49054f1e
-	0xb9341875	0xb37952dc	0x1db40d2e	0xe23154e5
-	0x5a4e8bcd	0xed67b774	0x6639eb56	0xa4b3a6f9
-	0xc0918496	0x295261ff	0x08b0f294	0x54573333
-	0xff925b65	0x7872e916	0xbd5552d8	0x5d72050d
-	0x1cf126d7	0x9dfc6d65	0x3b107698	0x0b9f2951
-	0xeba14913	0x5c065af1	0xb5dd50ea	0xbe47408c
-	0x3c9da76d	0xbafbaad6	0xef2b0118	0xa97bf92a
-	0xf2d0b2d6	0x39c8bf7d	0x3017810f	0x35583abd
-	0x2f430d70	0x7d08a9a6	0x4304c566	0x295fbed9
-	0x07412bc8	0x833dd8bc	0xf086a3c8	0xf0836418
-	0x85985a3a	0xd620dec9	0x3c81fc7a	0x08fbadb5
-	0x55d56912	0x6e63f48a	0x3e178cb9	0xaf43c5d2
-	0xce83c97e	0x0b59010c	0x7806f1e8	0x5ceda01b
-	0x0cbfd565	0x1234bea9	0xadf6ad5b	0x68c5c83f
-	0x7b5ceb7d	0x55bcd3f5	0x1e1fe06e	0xe6c9bce5
-	0x95b5563d	0x0318973d	0xc2c4b750	0x8297ff40
-	0x1223837b	0x8264fea3	0x1e9a70df	0x69ed57ff
-	0x9598bb0d	0x1647c7a6	0xc2f1e9ea	0xc47f77d7
-	0x5e088380	0x31b7cf46	0x7aca1985	0xea1bcad7
-	0x058afbcb	0x05929ff9	0x2d5c85fa	0x19b2eded
-	0xfb6bd501	0xa0ea0987	0x4b8dae5a	0xc9bc0d84
-	0x2d1841ff	0x58b4bbb3	0x5f3494c1	0xce489fcf
-	0xf048eee3	0x8a146cfb	0xcb5d2fce	0xf24dc8ab
-	0xac9a22f4	0x1c0e8be0	0x8f1982e2	0x979abeb6
-	0x2e61de90	0x7096ecd1	0xe6326066	0xf6b2c331
-	0xc8035863	0x23ac48f7	0xcc6a8a96	0x6d2a847c
-	0xe3cd2dfc	0xcb224f09	0x5274254d	0x1052513b
-	0xdd244a04	0x2b583887	0x24b623f9	0x1cde29e4
-	0xf86fdcab	0xf3fbee4a	0x34804cb5	0xe4d2d1be
-	0xe3ee0459	0xba8e1428	0xd0d61467	0x493d74a8
-	0xda33b30c	0xef080476	0x6c4f86a2	0x3917c5f6
-	0x14052bd1	0xc5d10f70	0x3eb72eb5	0x2939b07d
-	0xcf722a48	0x330615a8	0x797bfb7e	0x9c604abd
-	0x612ca005	0x716bdbee	0x8098f5f9	0x4a591363
-	0xbd89a21f	0x5e3787ea	0x2acbffa1	0xff907f14
-	0x42ca9221	0x4d15a235	0x76d4e9bc	0x2080e33b
-	0x6437bd3d	0x3d5b4267	0x9ac9655b	0x857b5a56
-	0x8db93b3d	0xe1c45c90	0x0872b3e1	0x4935532b
-	0x314c8628	0xa43c7d03	0xba6468b3	0x93056b1d
-	0x60e61ab4	0xb6995957	0xcd37b047	0xc50cd92b
-	0x259a8690	0xc78684a3	0x96384186	0xd9bcb24d
-	0x31b39f0a	0x0fbbae5f	0x869a70da	0x80f0714f
-	0x50070cea	0x2643b25c	0x164c01e3	0xc77d8624
-	0x48f047b4	0x0cbd2c71	0x4c0b13b2	0x667fc4a4
-	0x848c28cf	0x05443953	0xfdbd5329	0x3aeae7b7
-	0xeaa0de2d	0x498be6e8	0x9663391f	0x8d55c785
-	0x20c68ab6	0xfc7591cc	0x5f757324	0xa30d684f
-	0x6ccb9c33	0xe90c74ae	0x488bc0dd	0x08231a14
-	0xe253a7fd	0x9196b1cc	0x25a54296	0x0f70ba47
-	0x9ee0a233	0x43c2e7bf	0x2d927857	0x1fde792e
-	0xc0598134	0x7aac6123	0x39da69f7	0x99233284
-	0x5894e482	0x396fb16c	0xcc554518	0x61784cde
-	0xf12b0d7d	0xf1e7ee64	0x53a93eaf	0x142d292c
-	0x52c36ba0	0xd9037d20	0x9eba60f0	0x4a041620
-	0x5462a0d2	0x9ae6663b	0x0a5dfe17	0x9307f8f7
-	0xc3532fd2	0xd20b3393	0x82d40f2d	0x3b139fca
-	0x6ec0948f	0x1434629e	0xa529a79f	0x3a607eee
-	0x07ee780e	0xa407a5ac	0xbad8d686	0x888401a7
-	0xf221e944	0xe8ba61c6	0xc3caabc4	0xd610be89
-	0x0e5432fe	0xb38b44a2	0x65a48b8d	0xcc044491
-	0x253a116a	0x96c20a3a	0x13bf416e	0xbd80a231
-	0xc94420a6	0x8ffee6ea	0x35bd2c90	0x39bbc314
-	0x762981a5	0x7217db3b	0x8ace0761	0x31e2506a
-	0xf1d679eb	0xab0b8a9b	0xaaff2f04	0xf40502fd
-	0xe56aa165	0x418522a3	0x2fb1212e	0xc25102c4
-	0xae39da06	0xe708d400	0xfedfc55d	0xcf13fc39
-	0x77cc3ff3	0xb70b7ee5	0x57e2732e	0x54eafd32
-	0xee513833	0x2f2f685e	0x17c8b664	0x4b22ab02
-	0x684951ca	0x67844071	0x27c3c09e	0x36f129d3
-	0xf5d71bbc	0x251d6129	0x6cd71b6a	0x975e1d42
-	0x89142f16	0x6c250a42	0x9058209b	0x7f713bc6
-	0x7bfa7c2c	0xe6a5a5cc	0x90a74d5f	0x79902546
-	0xd43e0042	0xc3b12519	0x2afa12af	0xf11aadc6
-	0x5ee59722	0x802b403c	0xa282210c	0x7658c843
-	0x88a81f68	0x25b8fcd9	0x967d3058	0x1ecbeac8
-	0x9b1f0dc3	0x16dd19ac	0x3c279aa7	0xed5c8077
-	0x2c03b915	0x3b0cd605	0x3677eef0	0xddddb73e
-	0x407a5512	0xb8cbb129	0x7d6f0f97	0x96e41ef0
-	0x7d1bbca8	0x7fa26a3b	0x025ed42a	0xceea965b
-	0x4a10020b	0xc3c47832	0x171644f2	0x75baa013
-	0x436abd20	0xc7000fa8	0x03123e13	0x3b80f711
-	0xee4401b5	0x34bb57b4	0xb7fd072c	0xfb5cb343
-	0xf6ed3bc1	0xd83b2953	0x9285bbb6	0xb9e9afb3
-	0x23ef8322	0x46111ee3	0x1b5ee880	0x994b4698
-	0x11348ba1	0x358ca0d0	0xf9e1e517	0x58150115
-	0x31b69c9c	0xb59d1a14	0x736d1af4	0xa2b6fb4f
-	0x6df398ad	0x5f5ee1c6	0x499e00ab	0x65024633
-	0x32af0af6	0x61aecdc3	0x19dc2376	0x061c1132
-	0x09eb3e31	0x53edd271	0x280ad517	0x167d6297
-	0x11da637a	0xfee5d512	0x86ba451b	0x9ac4dd03
-	0xae09fe4a	0x011fb154	0x5dde9f8d	0x66b77ebc
-	0x348f5dc4	0x89d838c5	0xd1076c44	0xb7207c6b
-	0x288ef144	0x4ddbbc30	0x8ab3181a	0xb3a9cd9c
-	0xe8da4c2f	0x5f51ea25	0x25698b3c	0xe5d8be42
-	0x9033461a	0x08ab6b56	0xd3ef4e5e	0x22fef14c
-	0x40e6cbd2	0x8023d0d9	0xd3624fa1	0x05058ed6
-	0x7f9e29d4	0x2d679020	0xbd8a9438	0xfc2c7ae1
-	0x43ff62ce	0xa5c960de	0xca118741	0x1d3ff652
-	0x7aad82fa	0x7e05c2b1	0xaa60d6b5	0x1b44c011
-	0x3d8ed489	0x33e5569f	0x954c9df9	0x6a3f3eec
-	0x185e0868	0x0b261932	0x4abcec9d	0xe91a01b5
-	0x2dcb391b	0x2623c791	0x4054eeb7	0x39f859cf
-	0x838a2034	0x89b408d4	0x58976dd9	0x130dc93c
-	0xd7c36f4c	0x65a57934	0x87364549	0x5e9e1b78
-	0x598c3e00	0x1267d53c	0x12655bdc	0x757ba8ec
-	0x20897226	0x121f8469	0x4db11ce8	0x6c4457ce
-	0x408c5799	0x0dafde84	0x34e803f9	0xe6c40be2
-	0x76601d29	0x6f382889	0x60a7602d	0x0e9f8f86
-	0xd02bde01	0x6bbe40f2	0xcfc7e18d	0x18bb288d
-	0x7693588d	0x93b5bf2c	0x257a886d	0xa444942b
-	0xddc30b6d	0x0c733fc6	0x59c7fb0c	0x1e7428e1
-	0x00e95317	0x8bb2b789	0xd1e8d918	0xe79d96be
-	0xcdaecf72	0x1f10292f	0x8550150c	0x3ac030fb
-	0xa740ed6f	0x86ca944b	0x1cb36602	0xb7a210bd
-	0xe3943a61	0x3a6eee17	0x26e3c293	0x48587d54
-	0x2e3c250a	0x9f5139ca	0x4ba8e861	0x310f187d
-	0xf30ef633	0x96708592	0x2c8219ed	0xba807709
-	0xb84d2c21	0x683d5e31	0x7c73d54f	0x20a9f6bb
-	0x8c571bfc	0x18f513b3	0x983064fd	0xfbc61cd8
-	0x34d473d7	0xe0c16341	0x3a51b21a	0x3f7ffd24
-	0x33d20d89	0x92ed2b84	0x711d3f75	0x4437d1d2
-	0x19ffb997	0x03fc59d2	0xd73c4ce0	0x1c048be1
-	0x3e1c70e6	0x2132c8dd	0x96883172	0x9e7ceb89
-	0x03c9bd60	0x6a288f88	0x9b69b2e3	0x21de2320
-	0x7ec42f80	0xfa9c1431	0x421447e9	0x82b422b8
-	0x691d53b6	0xe5adfacd	0x58d1fd02	0x5e66ac2d
-	0x1020615a	0xf1a5aa71	0x9ae9f314	0x61a8780f
-	0xfd35d0c2	0x6d0acb7f	0x8665a3cc	0x638dfdae
-	0xf77cd507	0x9e896caa	0xf023fe26	0x138ad408
-	0xd4a3d2a9	0x20392108	0x4e259b7a	0x294084a2
-	0x353ddca7	0x6b4e0d0b	0x2ecb3b7f	0x2e72b5f6
-	0xbd09b0dd	0x4de2ddab	0x27bbaf57	0x93c0044b
-	0x0c9ff149	0x5e06496d	0xae665015	0x422e1608
-	0xfb06c77c	0x7f49815c	0x74b36569	0x97c6b34d
-	0xb2171d9d	0xd85c83a7	0xd95e5cd4	0x474b6faf
-	0x4276a8cc	0x3eebf9da	0x373c9404	0x0fe5b125
-	0x2140e5d1	0x99fd5df9	0x1b624b9a	0xd277f04d
-	0x57d365a0	0x49fef587	0x1e8c3af0	0x4d827485
-	0x075a70d4	0x75569578	0x9d03ee73	0x2956bfcf
-	0xc45c3dff	0xe15ef324	0x4389e20b	0xb2b6a465
-	0x863fbaf3	0x7503fb46	0x41d8f4c8	0x871f04e5
-	0xb677456b	0xc806932d	0x99d586ce	0x94ad33e6
-	0x996a43b8	0x4c7ff253	0x441e68ea	0x3f2454f6
-	0x7b33925a	0xed5a56d7	0xfa40f2f5	0x3e7a60f0
-	0x45bae53b	0xc3237b7d	0x3d6fe60a	0x7ef17115
-	0x6df8dbb2	0x26d1240a	0x7372d23d	0x5767532e
-	0xa72e2c58	0x2a0d2f14	0x74d029c2	0x1bcf8b01
-	0x513dd7e4	0x800a6440	0xe0f3a8be	0xf951cd2a
-	0x5795eb8e	0x3384450b	0x46e7970e	0xb4434ac3
-	0x468194b1	0xc562555b	0x76d9cb19	0xdf109cad
-	0x57f1ac2f	0x1207af15	0x19d7cfda	0xfb4c069b
-	0x306802c4	0xe8aedc76	0x0170ab97	0xd19b99d6
-	0x7fe69394	0x60b6dd20	0x184caddf	0xd4c81b0d
-	0x008ebffd	0xfd615c94	0x813a5a30	0xb3386934
-	0x5c54130d	0xbe0a6b6f	0x91b127cb	0x7207bbff
-	0x176cac26	0x450be167	0x53563516	0xd6f5ed1b
-	0x90ce178b	0x80e28eba	0x4ddf538c	0xb8037a72
-	0xceaaa6ff	0x3e0eabdc	0x2af375b6	0xfafdf3bf
-	0x24bb3630	0xbcd6da54	0xc59375ce	0x4e9d08c9
-	0x7953057e	0x81ef3d8b	0xcb641721	0x8fb73300
-	0x07f1dd2f	0xda12a374	0xae008fff	0xd106aaac
-	0x5a4f59a3	0xe01bd4ef	0xe1ff2c4e	0xd58c4500
-	0x283e8041	0xb2c7ec64	0x81077f24	0x304fd646
-	0xb5554330	0x098fe673	0x9e5976ba	0x2e24c1c4
-	0x3dfad07f	0x3d64fa0b	0x78a9c65f	0x282c343f
-	0x755810ff	0x363e7150	0x692be96c	0x62cc0559
-	0xb7b9e8c1	0xe35abebf	0xf28d706e	0xea9b31da
-	0xd4762701	0xce0654fd	0xc10a087e	0x0ee813cc
-	0xc66364cf	0x56a8143a	0xb8eafc6c	0x085125a4
-	0x758752b3	0xfd8df76e	0x483c550a	0xc155fb38
-	0x20188374	0x118c9519	0x2e1dad79	0x45b648e2
-	0x32eea6a4	0x73373bbd	0xce78e1b1	0x49b6150b
-	0x826f31d7	0xf5b27772	0x76467cdb	0xab248975
-	0xc98c52c2	0x331e7992	0xb7ca3cb9	0x65fba8de
-	0x8d9df126	0xafb34641	0x83627ecf	0x4f6f5711
-	0x0a18b1bd	0xbf9f7e56	0x5b532a14	0x2c1c7f27
-	0xaaba76a3	0x0019b4c1	0xad0dec08	0x0a090710
-	0x9d092403	0x4b7f63f4	0xdda21492	0x5ac79d8a
-	0x53636303	0x8baacf07	0xd0e54e2a	0x06af65bc
-	0x1776250d	0xe3b7a745	0x3ed99c2e	0xcdfa72f1
-	0x28e2c19c	0x972ed696	0xc40238be	0x2eae4108
-	0x16dbeec2	0xe5aab504	0xb752b0ec	0x908c027a
-	0x5d6706f5	0x5dc64b1f	0xda6012bb	0xd823ba00
-	0x21227a10	0x99c8a5f7	0xe13e863c	0x7271ad65
-	0x37341fc0	0xed4f202f	0xe9394896	0x8c51a222
-	0xc730618d	0x61f38ac7	0x077bbea0	0xf7068ed0
-	0x9fe0eff4	0x09f20a63	0x692cb600	0x965b334c
-	0xe4d16d0a	0xabfd76d4	0xcebb865d	0x52ae79e3
-	0x54be2cc4	0xcada0fcf	0xdc531eda	0x0f6f5a07
-	0x45c26e9b	0x1b65c5da	0x747e35ce	0x28e8f353
-	0x8b14a4dc	0x70fec472	0x386766f5	0x452ec69d
-	0xea3d1060	0x4ad0a84b	0x74947e04	0x241d736e
-	0x67087154	0xa8429f6c	0x93f6fa81	0xc8ae48e8
-	0x8bc37b91	0x3c412b3c	0x5a9b6ea0	0x77b1267c
-	0x4e654c9e	0x3af8be15	0x0c1fcc1a	0xdd53e911
-	0x4133f74d	0x19b478ea	0x935059e6	0x602d1c43
-	0xef2f0dc5	0x606c328e	0x3bcb34f9	0xd3e43917
-	0xa4b13432	0xe32ca0b7	0xe72cf4f7	0x89e64046
-	0xf7665787	0x0e2ceb68	0xad0326bf	0x0df255df
-	0xfbe35bd7	0x452ad738	0x151ded08	0x4977f8b4
-	0xfb0d8ce6	0x55ba4d5e	0xacc482b6	0x685f74cc
-	0x483dcc86	0x09346c6c	0x1bfb0413	0xc8454c50
-	0xed0ab7fb	0xbd60dc85	0x2d4ce7f7	0x7e374d17
-	0x97c4de4b	0x8e241f8e	0x0c63ba83	0xfe2b6605
-	0x0d16e6b6	0xd2b65dc7	0x574904d1	0x57013653
-	0x02bbbb72	0xa1a951e7	0x2e06e4c8	0xaf8a0ce2
-	0xe45132d5	0xc335004b	0x7a80a191	0x70abfb32
-	0x0e6dae78	0x47ae882d	0x2ffb0f2c	0xfbfb1549
-	0x3f5d2a7b	0x9df9be34	0xb69b7919	0x051a54d4
-	0x3e7822d9	0x83f3988b	0xf4f6a380	0x382ec90d
-	0x19ec37e6	0x41da0b90	0x63edbfe6	0xb53fca2b
-	0x4117bab8	0xe711495d	0x93b066cf	0xfa436ab7
-	0xafeb2443	0x842a6a7e	0x92dbfd01	0x5536c8ab
-	0x87706182	0x95b19ae4	0x20a5243b	0xd17d6e3a
-	0xacc705bc	0x02124f77	0xcdd25a60	0x27f2cfd0
-	0xab63270b	0x5d0d50c7	0x626b463b	0x8d1c6c67
-	0xcd8faed9	0xdec15e02	0xeead3ca7	0x35e6b1b6
-	0xa3404975	0xa40c4d99	0xba2aafa7	0x9fd543c8
-	0x737fca65	0xf825b862	0xed028145	0xa19ab5c0
-	0x7a5cf4c9	0x29275a49	0x4e70bfae	0xa68d7af7
-	0x4027d4ad	0xc0f1f772	0xb1857bf2	0xeff36b41
-	0x1cefd1be	0x609569f1	0x5e4a45ba	0x3982f52e
-	0x2662da23	0x9995e160	0xa5236c1a	0xfc3dbe22
-	0xe2cf629e	0x1927e9bb	0x890c2c5d	0x9b1a74a5
-	0xd98da36d	0xd6394f24	0xea08f3ef	0xd7543732
-	0x2c08cff2	0xb338420e	0x954ebee4	0x8f62faf8
-	0x30001084	0x6209f495	0x4bf3151d	0x549fe524
-	0xf0a233cc	0x3d9520f6	0xc3bb7564	0x724bf6b8
-	0xf0364758	0x8c780cc2	0x85041d68	0x004c18d6
-	0x7e1b0aed	0xe515764b	0x3f646ea8	0xfa14a4d7
-	0x1d197044	0xf3eddc81	0x8aa91a1e	0x16256c4f
-	0x8199c0df	0xbf9a50ac	0x568a0f09	0x2cb00264
-	0xd72fd139	0x2705356f	0xcbca00f3	0xd1d48350
-	0xd9ea820e	0x8cef5c8f	0x208f4413	0xa8cc4af4
-	0xd3925d45	0xcacb25be	0xf5c478f0	0x2d98856a
-	0x9b2ca15c	0xa866f9c0	0xd11e9a8c	0xecf63535
-	0x26afb8e5	0x07582187	0x68e92d2c	0x701732d1
-	0xcfa17e9d	0xcb923dcc	0xc6fd0935	0x2949f3f7
-	0x2f819c1e	0xea483296	0xb234a335	0xe3e174f1
-	0x2e79e24c	0xcebb3426	0xc7b11c2e	0x09c50c12
-	0x1a776bec	0x9eb75be2	0x906fc75b	0xa951a0bc
-	0x067984cb	0xeef41487	0x592d71bb	0x6d830d75
-	0x9315da53	0xfc4a745d	0xf55687dc	0x41d554e7
-	0xd9f4873c	0x51680147	0x70a32832	0x514a6b9b
-	0xdb221d0c	0x5d8a04f2	0x56d0d2e7	0xea241411
-	0x2fddf98e	0x4f114da4	0x5b08dece	0x4a1deb72
-	0x8a05c6d7	0x5412556f	0xb34099d8	0x769a94dd
-	0xa5e5f79d	0x2aeed8ec	0xb2c36124	0x4049a237
-	0x14984601	0x1a595742	0x64490292	0x630c8cd2
-	0x55e6bb46	0x6a0d06ab	0x2b0b11b4	0x7c616e40
-	0x88ad3ace	0xd51e4e32	0x09b91afd	0xe7e15aeb
-	0x0050ef89	0x4330509d	0x12cb2d58	0x8aa65df5
-	0x6a3a7bfe	0x13110a63	0x6e0321e3	0xe00dafca
-	0x71e02a28	0xbb179946	0xa46ec287	0xec8a407f
-	0x71e4ecb1	0x9aa3eaf1	0xccc68628	0xc593d002
-	0xadc7003a	0x4266b50b	0x3c1883ee	0x6dccb885
-	0x417c946d	0xbed06b8c	0x333c5aae	0xb05e54ee
-	0x16d7a8d5	0x2c4711e4	0x77f99748	0xea4f1ce3
-	0x99077ba5	0x3efe0258	0xd6df1959	0xa68402c4
-	0x17fb46f9	0x84dd7f43	0x2743ad55	0x4c3618ab
-	0x066e70fb	0xa7ae2740	0xabfa9383	0x3550f323
-	0x12df0416	0xf1453568	0xa72e19a3	0x858f6f03
-	0xf17cc616	0x4ae587bd	0x18a72aff	0x3a7e96e0
-	0x742fcbfa	0xf2978c0c	0x1c9b4647	0xead5df7c
-	0xa4006862	0x4ff1f7ad	0xad9ef88a	0xf2e10660
-	0x408e1435	0x54fce4ac	0x3b362a56	0x31215f74
-	0xaa3c9bda	0x9e20dbdf	0x0d5fce6a	0x282c976f
-	0x0edc8226	0x373f111f	0x3e98c061	0xf268555d
-	0x2bc94957	0xaea989d8	0x509c71ba	0x12314a4c
-	0xf763fd18	0x756c083a	0x210052bf	0xc8a587ec
-	0xad316f0b	0x8bdc25ef	0x97d826c2	0x2b2274e0
-	0xb2d83dc0	0x758a648c	0x98f048ed	0xc049ee18
-	0x86a7ae90	0xb2cd2e74	0xbf05a5fa	0x99569e00
-	0x91ef2ef3	0x0fa73191	0x8fbe0377	0xd833195b
-	0xa8f92c91	0xd5180d87	0x78e66404	0xa6932c29
-	0x63767065	0x212597be	0x71443fa5	0xc7f0f7e7
-	0xee005d0f	0x3f554ee1	0x0ce921c3	0x11f7aa65
-	0xab833603	0x226583ac	0xdc02270f	0x582acced
-	0xe4873a4e	0x4789f1b5	0xe4556ae0	0x2db116e3
-	0x4dcf008e	0x94848eef	0x33dd4850	0x763ee311
-	0x8d129dec	0x37584ab5	0x2a72a7f1	0xc3812cba
-	0x8b28d2f2	0x0adb3ef1	0x77c139ed	0xa024d006
-	0x77b56ff4	0x237a0ef1	0x70c06866	0x3f678b49
-	0x758b3ce4	0xac6fba3c	0x425f5226	0x736cb61c
-	0x6d33908e	0x2db271b8	0x57a0b9e2	0xafa0c8eb
-	0xe16670ac	0x01358d54	0x291458e7	0x20dbb518
-	0x750ebeed	0x3b7ce363	0xab142fda	0x2f827c5c
-	0xe4b63c2f	0x25b21550	0xd9a7d8a4	0x9a0d0235
-	0x6ccbe996	0xbd16a832	0x408c6b6e	0x264e7057
-	0xf76251cc	0x10b292aa	0x44e35c08	0xe10072a1
-	0x8496f9f9	0xf3f14db0	0x903e0d04	0x437cbdab
-	0x94bba5f6	0xd93cb547	0x6c8c5b9c	0xdaef1d7c
-	0xc9245303	0xb8327055	0x17b4f91f	0x9609ed57
-	0x276a2fef	0xd6547d96	0xd845e2a3	0xdb17e11c
-	0xe06b1865	0x91ac2801	0x7499b2bf	0xfcc13e08
-	0x4d2c3ad7	0x33f551e1	0x7d9409c7	0xafc9eb56
-	0xd1b99328	0xfb86b03f	0x386621b1	0xc937917d
-	0xd049796a	0xb61b9848	0x6e6c850d	0x9acceebb
-	0x2335fff6	0xba4cc878	0x71410231	0xe2f8c5ab
-	0x9af0d19d	0x28ec5cf5	0x756ac8b7	0xbef10a49
-	0x0845244c	0x1d73e741	0x9062b8e2	0xda4ff7ed
-	0x02b84967	0x1dfa2bce	0xa39fde98	0xb9754114
-	0xf1d1128c	0xfe4a89f5	0x7f752ab4	0xc079051f
-	0x9d280392	0x8e4405b6	0x9a78116b	0x93ccc928
-	0x9423c484	0xd9d02b55	0x8b293206	0x4e1ba855
-	0x8b163dac	0x86097281	0x5fed4e15	0xa3a9986f
-	0x6aceb1fd	0x9840a4a6	0xb9159ba5	0x43a6a036
-	0x48c6b148	0x741b03e3	0x2034fa35	0xa2238e26
-	0xcbd2d186	0x543a2254	0x52bee0c4	0x3d86f09b
-	0x91b2c0f1	0xbcc3b745	0x2f74849a	0x0330c741
-	0xbe83b31b	0x2be0b1e3	0xb5289590	0xd70e1559
-	0x575ed5ef	0x26095dad	0x243db065	0x7deef6bb
-	0x65d12981	0xed493443	0x8bbb1d52	0xad9cceeb
-	0x9d2347e0	0x6cca137f	0x17470bbb	0x7e3c2e70
-	0xf8f031e4	0x089ffd36	0x54188a4b	0x0da3ca59
-	0x89502f42	0x118865a6	0x188d2f03	0xbab32122
-	0x8b7dce7e	0xd560dcf2	0x3b664c1f	0xc75878ec
-	0x24483e82	0x5f98c3ad	0x30f8edb6	0x750517a4
-	0x26b74663	0x4a92cf2c	0x34142eea	0x74434b26
-	0xef952153	0x499bb195	0x0eef898b	0xc87096df
-	0xebb06a79	0x6f85e09d	0x61582c0d	0xf067fa23
-	0xe800ddac	0x5d94560b	0x7b3c3438	0xf8656d92
-	0xbb2e740f	0x3919d1e9	0x4ae59719	0x9884c38e
-	0xab33c8f3	0x2b6fe11e	0xbb918fe1	0x78b89ddf
-	0x28ff265a	0x8d1be42f	0xc7ae521f	0x59021a63
-	0xc8feb2b0	0xf4adb84d	0x1627d0ad	0xdf2f54b9
-	0x6c34378c	0x19905a68	0x751ab74a	0x4ac834b3
-	0x0482a8a0	0x3fa5727e	0xc67e56e6	0xe9a7fa62
-	0x138c624b	0x8cfa9421	0x777be58a	0xa77e4a9c
-	0x317880c6	0x784adbec	0xf24af624	0xca7b14cf
-	0x0733ca3a	0x4df8fa2b	0xe737de97	0x8221ad28
-	0x12318567	0x1143d1b5	0x6d785e96	0x96b4706f
-	0x62b54a94	0x2cc3c8f4	0xf4509cba	0x013b1838
-	0xeb30c28f	0xafdce478	0xb079b9e2	0xf7fde255
-	0x369de668	0x51eaacb3	0x1a4857b1	0xdc155799
-	0x14312bb5	0x88e95615	0x3baea03c	0xda51f1b7
-	0x2ba9c897	0x02acb260	0x45d16629	0x69f4125c
-	0xb814d67f	0xd9371fdb	0x2abe9516	0xcb4347a5
-	0x8499fa6d	0x548d5caf	0xeaaea9a8	0xd2050d3e
-	0xe7ffd097	0x1343ddc5	0x2c063604	0xd4860459
-	0xe97d7e58	0x2b039549	0x7f9abb32	0xce9ae49e
-	0x6a9f2bc8	0xf42c6e74	0xa2cc44a3	0xa586ee59
-	0x9468aff1	0x9baa9f44	0xc672fa47	0x81af898d
-	0xbe2e0747	0x2568ec6c	0x5a297908	0xa3a45a84
-	0x86e7b0c8	0x25d653d0	0x2e1dd924	0xb8b8401d
-	0xb6132a11	0x63380a89	0x70457a9c	0x5599343c
-	0xdfe56efc	0x7347c609	0xd2a0254b	0xddb9eff8
-	0x2ff89812	0xc3fb0b4c	0xaabcb56d	0x8ea167d7
-	0x3058af81	0x90c13947	0xd2d066bc	0x9187a7c2
-	0xea3f4bc7	0xde558f0c	0x553387c2	0xfe52ae90
-	0x55e9dfc9	0x280c76a9	0x22029fbb	0x695decb6
-	0x37e156cb	0x636cd8d0	0x314735a1	0x6b97c31e
-	0x5990da35	0xa36210e3	0x731aa846	0x3e9f4591
-	0x1c311983	0x1b05ca14	0xd26366ce	0x35108fc6
-	0x6ec7c06a	0xe5479ece	0xabda431a	0xe876a3b9
-	0x7306ec54	0x8ac2dbd7	0xb6025692	0x60e08291
-	0xbd2d5771	0xae63c08b	0xb57f59d0	0xa0b7a4d2
-	0xa1975545	0xd4246fff	0xb541c3e7	0x80579f75
-	0x350f9ba5	0xc167fd9c	0xa4753b37	0x614432a2
-	0x8c2a5225	0xcacb408d	0xc692b149	0x44eb19e3
-	0x9e36674a	0x4221e3a5	0xc8847980	0x22188be7
-	0x9f3b54db	0xca30b3a9	0x4f23026c	0x1ac563dd
-	0x0cef9dbe	0xde1759e4	0x88a1ac44	0xdb249ed0
-	0xcccf2728	0xc54995cd	0x1410f555	0xe68a533c
-	0xbf63c4b7	0x53890c13	0x501696a3	0x09695674
-	0x49675e62	0xd5859fac	0x62dfaa74	0xc2837e8f
-	0x5693d6bd	0x6c4b7df7	0x19673414	0x436523f6
-	0xd7476fa4	0x1c123daa	0xf160418d	0xb022c7e0
-	0xa0798def	0x908aaeed	0xab420cd0	0xb42b83a2
-	0x779b9257	0x8bd0dafd	0x17088cc8	0xe5707f57
-	0x7e95cb37	0x2f0975fe	0xf6c69671	0x9adb2ac8
-	0x9744adf6	0x534f59b4	0x70126a4c	0x094dc52f
-	0xeb1bca01	0x8439872b	0xa9eb2393	0x93466ee6
-	0xfaefa751	0x407578bc	0xf96695f3	0xece8916c
-	0x90555ebe	0xd4bbb5e8	0x521e0328	0x733e7a44
-	0x6b38d125	0xaf78c4f6	0x02a68e77	0xf0b3de08
-	0x6b7055a7	0xe173c89d	0xf8d502e8	0x0af8722a
-	0x0cb5d7c7	0x67fd3443	0xc3ece1f6	0xd1e3476a
-	0x6c51b69e	0x1e4d6701	0xd30b9ed8	0xcae0b2cf
-	0x107a07cf	0x9e995fe8	0x96be9a9e	0x9679a48c
-	0x56e943fd	0x5840eba2	0x903172e8	0x030e7848
-	0x01aa0b3c	0x3430ee93	0xd9074e67	0xba76da7c
-	0xac651f8a	0x4776630f	0x335cc3e6	0xf196a501
-	0x3946d5ab	0x9521219b	0xd5c1b923	0xea8a860d
-	0xb68cd8e3	0x422fe195	0xee228116	0x7935c07c
-	0xf9a777a8	0x5ebb5f11	0xca9af85c	0x2ced106a
-	0x839746e2	0xb278a109	0xd80ac684	0xad50dc92
-	0xcb1306fc	0x03b5953b	0xa1739037	0xb3d2eca5
-	0xa2177c85	0x331d941e	0x07d760f1	0xaf91e655
-	0x37859c68	0xa93f3fe7	0xfd8c0c27	0xfbaa7226
-	0xf9ebb691	0x378f97ba	0xbff7118a	0xe2dcdddd
-	0xbbcb31c6	0x690c39d0	0xa87db784	0x71e8f7e3
-	0x6030ca21	0x4a0e52fd	0xfbfb507d	0x162bf88c
-	0xaa2641c4	0x8df9c9b8	0x23266298	0xc3c49ddd
-	0xd285aff8	0x3b867dd6	0x0be83ba1	0x0f4a797c
-	0x1c934d37	0x0e0fcb24	0xa0a4d4bb	0xa4c9e180
-	0x1f151322	0x44b9bce0	0x047feb93	0x3e05cf8a
-	0xa9b3e489	0x43f0da55	0x6fcddbe2	0xa402623a
-	0x5c8ad2f4	0xf7ea52fb	0x3da14b50	0xbf8849bd
-	0xb45ca440	0x2893d691	0xf6d8ee21	0x9dc0cf25
-	0xfa6be75a	0xeb27219e	0x9b160b84	0x1867d384
-	0x5b536f15	0xdac9e97e	0x1d290193	0x683d4a93
-	0x4c449e2d	0x493edc1b	0x8ae3a3aa	0x3a49ca51
-	0xd6751c65	0x174ef916	0x94118e1d	0x0bc6adeb
-	0x49c4b0cd	0x04668564	0xc9e39f39	0x19907555
-	0x0320cb0e	0x32a643db	0x4ba9edc5	0xce11afee
-	0xce71c45c	0xebe0c707	0x48d1d23f	0xb2704cfb
-	0x94b97cba	0xaa934cb4	0x7e375bf3	0x7c9f87b7
-	0xb34ebd26	0xb1ed5855	0xdd458d3f	0xcf071bd0
-	0x3204188c	0x744959b0	0x20eb0748	0x1b863237
-	0xc36fad4a	0xde026857	0x74c278b2	0x7be0749e
-	0xd61895dc	0x509355a2	0xab890c09	0x210ef412
-	0xae4678f3	0x3605af3b	0xc111b378	0x81f0173e
-	0x4ac61ae9	0x2efebbd3	0xec8a55b0	0x5c60addb
-	0x19ab7fa7	0xbf5bb0ab	0x7b55db2b	0xa246b5b0
-	0x70739cad	0x20bcca0c	0x152a98a3	0xb1ada872
-	0xf3a401eb	0xb169b481	0x1024e632	0xb285ec8a
-	0x42f7bc38	0xe6ce9265	0x05ce19a1	0xf89e52ec
-	0x2dd6f337	0x81b30e86	0x459ac80d	0xfa83fd49
-	0xc0ba36eb	0xaeaf8c90	0xab621eec	0xe94ee998
-	0x0f693a97	0x5d9a589e	0x439e79a6	0x565ea22d
-	0x60d8e090	0xa021284f	0x4dd58eab	0x35cbe80c
-	0x386c67b8	0xb260ff41	0x9b2685c2	0x37c33d86
-	0x2b922b27	0x1aeb19d2	0x9d503c43	0x0fff6ce2
-	0xf400393b	0x70be801b	0x8cfb132e	0xbb1781c6
-	0xbeaf80e2	0x2a5a64c7	0xc02c7ebb	0x8f870c7b
-	0x6bfecce5	0x8d885183	0x4f2c1b6a	0x0a3e6c0a
-	0xb7d17ad8	0x7d593bb0	0xb1e00ea2	0x8d553de0
-	0x07ecf8c5	0xde0c3afd	0x40f193a0	0x77030199
-	0x458046a0	0x21b67cd9	0x836ef83b	0x53563580
-	0x4edacbc3	0x1263d410	0x2b217042	0x4e3ad860
-	0xd51576cc	0x714ba8f7	0xe02e102c	0xb38770fc
-	0x34270f26	0xe7aa59c0	0x17a3461c	0xe6667980
-	0x9d5ed074	0x4168f2da	0xdefefcf8	0xc6b3031c
-	0x27c4d4f0	0x5e51e5be	0xf90cb81c	0x26ff3f7c
-	0xabc25d19	0xd65e5687	0xa5ee2995	0xc4e545b1
-	0x0184fab9	0xa44f4395	0x2aaef6da	0x33a682a0
-	0x5f878a4d	0x0b808a4e	0xb95490e1	0x4e4b3902
-	0xa1815407	0x3769d4f8	0x81943938	0x0d8b44d2
-	0x89c90314	0xb779e2b3	0x1acfa29a	0x3ee54de2
-	0x203c8450	0xfdbf24da	0x8b9bc91b	0x41a25706
-	0xab9b74a3	0x6feaa6a3	0xed50c416	0x5dca2489
-	0xf9d58d01	0x57682903	0xd951335c	0x55a323f2
-	0xe6c10c4b	0x0983a265	0x50df7efa	0xc550b079
-	0x1e670ce5	0xca74138e	0xa7e01118	0x4d1cd2e3
-	0xcd3b73d7	0xc5c0d501	0xdd56b269	0xbc6bf217
-	0xa3094ee9	0x794e6e21	0xc097fddf	0x191a1b70
-	0xe6a45c45	0x47a1899e	0x29fe5a55	0xaf88ab14
-	0x0a05bec0	0x05c97061	0x0b7654a3	0xfcb357b7
-	0x31657eec	0xb5aeed41	0xc70ea45e	0x096075af
-	0xf5236b88	0x6329310c	0xe1bdaf51	0x569053d0
-	0x7679fcd0	0x04c70d46	0xcce2d566	0x0316e8c7
-	0x391cdf9c	0x47045b03	0xac63bff0	0x1a7bdde9
-	0xa5a725bf	0x6dc151e9	0xf02a3df4	0xfb01c649
-	0xa6690e2f	0xd561a5df	0xbe0efc39	0xd35f7dd6
-	0xddbe2e12	0x8f403837	0x1c92e116	0x1b47ecde
-	0xabd75d5d	0x3b39c5a3	0xbc8a81e2	0x5beaaeef
-	0x1206f28d	0x7aa1852e	0x96eb9ef2	0x30911a7b
-	0xc1ed82f9	0x0940dcef	0x07c62124	0x1ec437a5
-	0x688e0a9e	0xc26852a2	0x01bb985a	0x55429a26
-	0xc90b329d	0xf618584f	0x1ed4fb9d	0xfe605231
-	0xc20810d3	0x7cf66bbc	0xadf11084	0x80697ce9
-	0x473457b6	0xd162e619	0x4e452b78	0xd39ddbdd
-	0x8591db3a	0xb225b8e7	0x208855e9	0xefa860f0
-	0xdd96e987	0x074a8ff1	0x1cf505b1	0x78d7b7d5
-	0x8cd1cc29	0xae25f5c3	0x4fdb0160	0xc4cef03e
-	0x9a9c5704	0x47032d85	0x3486b65f	0xd3ecb515
-	0x58bd87e4	0xa408f421	0xca577e46	0xa5e921df
-	0x5a295aa1	0xe53f571f	0xc03f9dd4	0xf1d6a0c4
-	0x711016e1	0x300d5999	0xc321eef2	0x96669e94
-	0x2925f8c6	0xf7096453	0x65d21402	0x6f7462ab
-	0x826ee986	0xfd04606c	0x5554d246	0xb3d98bcf
-	0x237e9d62	0x82224172	0x35ea607d	0x8142bbeb
-	0xcb0edddd	0xc0a9233b	0x64be095a	0xf8b39e85
-	0xde2d0b29	0x69e2d7a1	0x6737f156	0xf85e0d4f
-	0xc194effb	0xed018c03	0x873a1908	0xa4fa5da8
-	0xf6eb812f	0x04e4819c	0xd189a19b	0x94694499
-	0xd0545215	0x371f62e8	0x2208dede	0xcb49f3ad
-	0x192654ac	0xf36c1f49	0xeb3af0c4	0x54bfd20a
-	0xb86f85aa	0x3d94435d	0x31a9a1ed	0xd02b0620
-	0x0b44bc44	0xb4861a1f	0xb4605284	0x1c83e472
-	0x055d7e70	0x717bb954	0x44d8e8bd	0xbd9af75d
-	0x068d8de3	0xe25b73ad	0x8df23c60	0x4050ca9b
-	0x86c000d7	0x67a9e98d	0x437bb833	0xe26ca015
-	0xcc53371b	0xa0ce2a4c	0x83bfc220	0xc392520e
-	0x38d7f316	0x4801955c	0xcebd086e	0x6a3b8eeb
-	0x83d63b2a	0xcf516140	0x3f0d648a	0x58b62c57
-	0x7ef3bffa	0xa6976628	0x8f3a5c55	0x42a3baa3
-	0xedeb9c23	0xb477c88c	0x63d7c7bc	0x2bdd0e26
-	0xfe7b9821	0x31fe5981	0xdb5425a8	0xc716b3c4
-	0x0a6f1597	0x34a8a007	0x36b0614f	0x8362c856
-	0x5e0f52b9	0x9398b4d7	0xc5c5590f	0x4af55ddb
-	0x1ec59258	0xaf0222f6	0xcc2c7b6c	0xf0413081
-	0x1ac15bcd	0xf0bf09a8	0xbdd23bc0	0xd75ed77f
-	0x551c6a1e	0x5380ca48	0xf5f30a44	0x88ecff13
-	0xa5f8130c	0x7cb60dc0	0x9eb26ba1	0x3f883068
-	0xd954b9a3	0x95c87a30	0xefcc0c68	0xf7337080
-	0x1eb12337	0x125c5a7f	0x25a0fee6	0x439a4a47
-	0x02ac17fa	0x5d581e53	0xafb9d7be	0x914f9ebe
-	0x82f5c4e8	0x7d29838a	0xe8d6c3ac	0x1192f816
-	0xdbfa1251	0x239defaf	0x8d4a48d0	0xa48bf5a7
-	0xae7149d2	0x9c349068	0xe7e1f6c3	0x8c28773a
-	0xd441626e	0x81fbd796	0x3597d8c0	0xb8f39eef
-	0xbafa40c7	0xe4e53aa9	0xb678c826	0x1ac82ff4
-	0x9e7fa0bb	0xe8bb2559	0x064e4e96	0xb0e6f10f
-	0x9ae0ee3d	0x7d9b0b42	0xadd1c5df	0xf095f8a0
-	0x30f172ae	0x61caddf6	0x4ce89732	0x06099b54
-	0x011266e7	0xbec76cea	0xf7f8d2f2	0xdfbb7f1b
-	0xbb003bf7	0x425d3677	0xfdef38c8	0xadbe4b40
-	0x634753c2	0xe53ae88c	0x1714dc8c	0xb788dd35
-	0xcbaffa0e	0xffbda6ca	0xe1f91cc6	0xf92d121a
-	0x9a260275	0x45b2c1ca	0x707a08b6	0x2a8db106
-	0xa7df6894	0xe7189751	0x206259b0	0xde37dfea
-	0xe468cebe	0x2476d774	0x1687f09f	0x2c06af20
-	0x60fa742d	0x81aca355	0xef888aa1	0xc1847c88
-	0x32036160	0x29a779b5	0x47d9e830	0xb9f83d5f
-	0x3fa4e61b	0x038f4901	0xda804b60	0x231c9fff
-	0x8070517b	0x2a4e6c70	0x9485f89a	0x7b57f832
-	0x0d92d4cd	0x04aa0eba	0xdcf5c49a	0x3b3a772e
-	0xe9df2e03	0xde378b39	0x3bdfbf09	0xa60790df
-	0xdd8826c0	0x3de3b41d	0x68c3f5bc	0xd6f093d4
-	0x41bd42c0	0xc68291ba	0x12f94625	0xae5ca753
-	0x0abd919d	0xf48b4d3c	0x57c0c82a	0x5ba454cb
-	0xce5a94ff	0xae3cab47	0x4aa33823	0x1afaffe8
-	0x7d4136c6	0x2be28394	0xfb7602ee	0x39eb1300
-	0xd12bae68	0xe4b7a0c0	0x94f94c06	0x048abf82
-	0x4eb3e435	0x6fd07abf	0xd471636c	0x5c6c299f
-	0x702a9e43	0xf239358f	0x82dc3598	0xc76a572b
-	0x48b47811	0x1de592d8	0x258a64a6	0x9b61d81c
-	0xf44f9c0f	0x737b3537	0xc6e0eef8	0x169efe91
-	0x834cc9a3	0x67d42617	0xa3df949c	0x2e4601f3
-	0x21630729	0x7bb68a4c	0x7e489647	0xfa9179b3
-	0xf2588707	0x4fddeedb	0x7a1f612d	0xb55787d0
-	0xafee1501	0xb3e7b9c6	0xba804c9e	0xd4ae95e0
-	0xac524f6d	0x58cf914f	0xe057bd9d	0xf3ac907f
-	0xb03a6d32	0x2260788c	0x4caaa555	0x984ca3f0
-	0x2129f747	0xc8d68e34	0xa87c8179	0xa480412b
-	0x63e15d82	0x41cbe3df	0xdf1a76d2	0xc60c1cde
-	0x7648f22c	0xacd4fc11	0x06b9d04f	0x991c16ed
-	0xcb417c7f	0x479c604b	0x5582e2c5	0x40f9c0e7
-	0xc2d613be	0x136c76be	0x91e780bb	0x2063d01b
-	0xc4e5d68c	0x6862f436	0xa56544a2	0x5d022a83
-	0xf72335d0	0x85e89050	0x89306316	0x1f0514bb
-	0xa5080fbb	0x2a7369e4	0xeac3af3d	0xca7607a5
-	0x5c743d9a	0x7ffe728c	0x9e8fb02f	0xa0c5eab4
-	0x0fab7728	0x4cb95891	0x2e79d596	0x018ccc65
-	0x0b58f60f	0x2ca2b629	0x046ea589	0x3b30acb7
-	0x8ba03fbc	0xf22519b6	0x8cb72f21	0x202dee89
-	0xf9d00d21	0x2ec96d07	0x4b83c51b	0xa9fe32cc
-	0x1d8f9267	0x1a432a84	0x6d823868	0xc7911f1d
-	0xcb21bb51	0x3c2456f1	0x1a03390d	0x25052957
-	0x20616d36	0x4fb85138	0xcdd69e20	0x42b7854b
-	0x158e4668	0x6303770e	0x96e26c4d	0x71b527a5
-	0x11319d1d	0x6d75f287	0x1dba9eaf	0xccd4fce8
-	0xf5d9cfa1	0xe9fd8f1d	0xb6f43134	0x2d4cbbab
-	0x1304d4a3	0x7a05977a	0xe773bf6f	0x30baa540
-	0x61f204da	0xc5a5aaba	0xb9957e48	0x3262daf3
-	0x78511464	0x2ab04e32	0xc89d96b6	0x14246913
-	0x4b836fc9	0xf50f4f05	0xff2d221c	0xc14a1bbf
-	0xe05e4591	0xf4c57aa1	0x935d6b79	0x0878ec6d
-	0xdf4537d9	0x8a82fb47	0x6510da09	0x37a2a471
-	0x216f3f32	0x40bac353	0xbd273df0	0x92a53e79
-	0x54e1c315	0x494f9ef0	0xf206a246	0xb536ed59
-	0xbd90d8ac	0xe7cd65db	0x1528ae70	0xa999b3ea
-	0xfc3616b9	0xf26b0fb8	0x0d26f2e9	0xbf44ebf3
-	0x690d86fd	0xbfa22568	0x760c8270	0xb51e0a14
-	0x3f9d311e	0xac848312	0xfc101499	0x553fe2a4
-	0x6a6b0f3e	0x6f970879	0x2be81e35	0x6144ac40
-	0x501451ea	0x268aa441	0xc6cf124f	0x6bf90440
-	0x08fa587c	0xc04bf04e	0x25bfb03a	0x3741f6db
-	0x26242832	0x5bf071f0	0x8d6463b9	0x500e503c
-	0x1a9468ce	0x5d23d18f	0xf2f8163c	0x0d7e519f
-	0x98f0edd1	0xdd12a97d	0xba39e22d	0xc91cace2
-	0xb2204698	0x87eaa42d	0x7968cfdc	0xe32a8876
-	0x6799323a	0x5df22ef3	0xa674dfd7	0xb46117cb
-	0x8294a996	0xac7d3b17	0x30c06dd6	0x3b827594
-	0x1cd8770a	0x026d3220	0xb9efe807	0xb3d73bad
-	0x68c78f8f	0x8f8a13ea	0x1ffb9590	0xe99cef6f
-	0x03cd123d	0xfb1bb840	0xaff37d51	0x199b5161
-	0x842c3d56	0xf31e3aa0	0x218ed36e	0x16bbd3f8
-	0x733a6088	0xed5c4240	0x29ac4df9	0x65765620
-	0x1645afd8	0xb9af1aa2	0xdad3a6b0	0xa1007b56
-	0xe709a529	0x51a7d880	0xe58a2cd7	0x79c1915a
-	0xf63df885	0x83e87bf9	0x33e3818e	0x3e3c0136
-	0x59b684da	0xc03628d4	0xfc3e229f	0x67fdb30e
-	0xe965e7c5	0xcd262320	0x171c70a9	0x85d68571
-	0x1da4d76a	0x59e854d3	0x138428bd	0x0804e776
-	0x948e121e	0x410cd3d9	0xdc4834a3	0xecaa7f10
-	0x6d2993a3	0xfe17843d	0x518ec623	0x70c3f7f1
-	0x418d09b8	0x04272bf6	0xbb6f5ac6	0x86993bb5
-	0xae28afb6	0x1afa1ba2	0xf1231937	0x599c8856
-	0x47eb85af	0x6cdf0c60	0xc08098ee	0xa26eaa47
-	0xabcead3c	0x72e567a9	0x54196049	0x502ed324
-	0x2c8773c1	0xb109a085	0xe8a25547	0xe13f68a0
-	0x08ceb631	0x024c1b3f	0xb1701b83	0xe3602a0a
-	0x2d9d092b	0x55f9960b	0x1eaeb777	0xcb422b9d
-	0x15484e5b	0x3b040ae5	0x6851c37d	0xbe99e012
-	0xdf731c32	0xf2a4ddc2	0x4f18a7b1	0xf244d571
-	0x20a13803	0xcff77b0e	0x6a32c0ba	0x6db996c1
-	0x83b3dba1	0x0287b69e	0xc8132123	0x1cf51166
-	0xeae54e68	0x64c974a8	0x4d6add7b	0x58a87bc3
-	0xa70799a9	0xd6575ef6	0x9c67be5f	0xe565e7f2
-	0x6c602d11	0x47a2332b	0x58e3a7c0	0x4bb04592
-	0xb899331e	0x28691b63	0x35a5b304	0x590e8684
-	0x398bce23	0xa6e5d1a7	0xbe941045	0x8248a1c7
-	0xe2f0f0b3	0x8fedacf9	0xe9412fa0	0xfcdd0389
-	0x0aadca9a	0x592efaa5	0x5b32f7ca	0x59331bb2
-	0x8c3edeb1	0x327d14ad	0xaf6ee0de	0xba015362
-	0x331e2a77	0xd0759b70	0xd80e1d52	0x8f24b791
-	0xa77b5abf	0x0dc0bb13	0x22d28613	0xf579ac0e
-	0xfb8f0252	0x7073e4df	0x28a4aa05	0x7e665e37
-	0x8459682e	0x17ce0744	0x55c15497	0xf0d506ed
-	0xe4402e0f	0xeb964b36	0xadf8cdfa	0x51e408b2
-	0xac8f1f75	0x21da7eab	0xd8be84a6	0xb889de7f
-	0xa3b7ccba	0x2e92096f	0x51dea741	0x4bc8b6b7
-	0x509d1e16	0xa51680d2	0x94570667	0xac5f5203
-	0x916845a5	0x1e2b4162	0x39f55bf1	0x903c4c15
-	0x0953148e	0xe0ebd00e	0xcb659fdf	0xd3574623
-	0x4d97e3cf	0x49f4b61e	0x44007063	0x20a32437
-	0x7c5dde33	0x8c7145df	0x9db86b04	0x19b6dc0c
-	0x18ae6d06	0xa7e11c47	0xbf60d44b	0xf8670b5b
-	0xe9e8e361	0x6bea92d7	0xddb5fbf3	0xfe493a6a
-	0xe0010eca	0x472558e9	0xd3438288	0x67dff800
-	0xdcf99ebc	0x8550e460	0xd4f74bf2	0x9cd801bf
-	0x69a5fcc4	0x70ca0a39	0x8ca2156b	0x7c3d451f
-	0x688ccdc8	0xcf6fe525	0xc39776e6	0x2d71269f
-	0x9bac002d	0xdb4bd577	0xaaff71ad	0x99a880ee
-	0xc4e77913	0x4f58dea4	0xb0d35b3c	0xb7dd5cd6
-	0x368f88e0	0x1a153497	0xa61a686a	0xb4b29fc0
-	0xa2605188	0xf1bc0648	0xb2ad7cbd	0xac582f14
-	0xdfb3bac0	0x079fd5f3	0xfb336ee5	0xdbd17aac
-	0x5c5da53d	0x89d5d69e	0x07451fc0	0x53f3ee4c
-	0xfd1e08cc	0xcf46a702	0xe9b4e436	0x25e13d98
-	0x809a73ab	0x07b25e94	0xd5845739	0x7eb131f1
-	0xd3e5d83c	0x5fa46a68	0x178d2b05	0x94ee2f16
-	0x75c6be0b	0x01716271	0x359790a8	0x754a16c4
-	0xa26be7f5	0xd998b02e	0x25497107	0xb842f73a
-	0x34f680a0	0xae8c305d	0x5b9b239c	0x0f2b009d
-	0xfe440280	0x145d1126	0x6d102c8b	0x402b89b6
-	0x9a580c40	0x91aa00a9	0xa03d8974	0x4d2a26a1
-	0xb75b8202	0x16600764	0x211ebb2e	0x28bd93d9
-	0x6518d2cf	0x6d5bd308	0x382c5ed7	0xa29e0aa3
-	0xf89cf93a	0x74a0b016	0x3ca612f5	0x24064cf1
-	0x47747a5d	0xd22975dc	0x3c696e1b	0x0e4d0a5a
-	0x3718d1a4	0x1fcc5ea4	0xab35093b	0xb50603ea
-	0x3650c65f	0x32858ec5	0xa87dd504	0x687c5833
-	0x2a36de42	0x9cb6868a	0xe78d1072	0x675eb362
-	0x64e67cfc	0xcdab05b7	0x72e23276	0xc7dd5753
-	0x409f3b09	0xfa93587d	0x99eb8cff	0xb6c5fc09
-	0xca99a2a2	0x7f5583e9	0x2fd55cd2	0x38a65dd0
-	0xa16d92a2	0x286f021f	0xd71619c3	0x7d1c61f3
-	0xf7507ce9	0x6c2a3eee	0x1053a2ae	0xb63e258e
-	0x86f335a4	0xb5b07b32	0x0d156a38	0x53755412
-	0x76a542d2	0x26f25a85	0xfc038aab	0xa9d96a0c
-	0x8575d08a	0x24805c0c	0x39ea0650	0xb2edc539
-	0x1df34734	0xf7728395	0xe17c0196	0x54079a46
-	0x5c52fc37	0x09d2d435	0x19f28d5d	0x92dc3611
-	0x4f7fa756	0x19a128f0	0x3e273d1d	0xff6309c9
-	0x2c34216c	0xba4cc184	0x8873b38c	0xcd84fcdb
-	0x3ede1e50	0x286cfb74	0xef17d548	0x01e12784
-	0x5365dfce	0xe808116d	0x619f6117	0xaaa322f5
-	0xc81e268a	0x8303df05	0xe251ffa3	0x86b43181
-	0x1f6ab10b	0x60c48f73	0xf0a299df	0x311f1a35
-	0xcf1b31d1	0x67bbee54	0x4be22f23	0xe1cbb341
-	0xce778173	0x495c5dd4	0x2597b567	0xda1bda27
-	0x45409289	0x5f8290bf	0x9b3d5714	0x5a732f3e
-	0x9ec75a75	0xa062a5ae	0x1d9b6d09	0xa983c663
-	0x0fc1863b	0xef46c113	0xaf6517a2	0x3a90caa4
-	0xc1c36909	0x16a68595	0xd83751da	0xf965e105
-	0xf0a2c08f	0xaf5a83cb	0xb1ef85a2	0xb994a331
-	0xd0dc78d2	0xeb278a2a	0xe22a165d	0x3f1f999c
-	0x5b7c2d89	0xa0a9afbd	0xc42db24e	0x061c9ef4
-	0xbf09c71b	0x2e14198c	0x8765e181	0x6eb6884d
-	0xa91be755	0x8d203fe3	0x80e25674	0x0b39ba38
-	0x12cb68bc	0xf0dbdc5d	0xb95f1bab	0x7ce7663c
-	0x227dc658	0xcd46afb7	0xaf9127c3	0x0ba73835
-	0x613b23f0	0x599e6f37	0xb5e6463b	0x49557c88
-	0xb104b402	0xd5276a66	0xa68ce0da	0x5d229e9f
-	0x59292206	0xe71d18a5	0x3627be43	0xa1931f4d
-	0x9b282f64	0xa429e37d	0x2954801c	0x78f8ff7d
-	0x72d0997e	0xb6333f10	0x9db0ae49	0x849d6972
-	0xf3105f52	0x42413f96	0xddb2c652	0x99802d95
-	0xeeedf598	0xfd785866	0xd13a7b1a	0x225a59fd
-	0x19722276	0x9a016c80	0xf4d22f4e	0x5a739fb9
-	0xbaa3488e	0xcf913c7a	0x7ff05f65	0x0b5ecfe3
-	0x86a7dbde	0x2de1255b	0xbadc1a92	0xe8be38c4
-	0xf13fa2fb	0xd46894cd	0xc48b9503	0x8e715854
-	0x3a03fe9a	0x013e5b08	0x4f46f488	0x7e27181d
-	0xec159b58	0xc4977b80	0xcd454784	0xbbaa3742
-	0x124eaaa3	0x66414ef9	0x1e514b4e	0xe978d0e6
-	0x46d8c643	0xd316c855	0xb84dd9b7	0x5122465d
-	0x34c59dac	0xa6f10643	0xd80b3949	0x07536f2d
-	0x4fbcc30a	0x8aa8a4b6	0xdc2be5ef	0xbc3e1c78
-	0xc25d1ebd	0x96919bed	0xdb37931b	0x6e077871
-	0xfb2bf61b	0x9a659648	0xeccda7dc	0x79e86b23
-	0xf1c18329	0x59830510	0xf1dcfedb	0xdc7d2b84
-	0x41e7afd1	0xeca8021d	0x7312d4fb	0x7a45eeb5
-	0xbffc8a1e	0x494d7c24	0xc2a84a95	0x460a0ddd
-	0x7e44dbd5	0x2109fdbf	0x556374c2	0x616bf76c
-	0x8b3ae7b6	0x0e2cfcd1	0x65370b6c	0xf1fbb913
-	0x81c57609	0x4c2cadad	0xfc74a3cc	0xc9556305
-	0x16464838	0x5ef7fb12	0xc90eb9f4	0x72353a20
-	0x46bc1ec8	0xd3b12916	0x51c45e0e	0x061b53b2
-	0x1a203faa	0x4e5e3054	0xbaff1858	0xb65398a0
-	0xd5b4eca8	0x5649844c	0x2e1c6f6c	0xf828c53c
-	0x689565ba	0x76f11b18	0x5dfd40ae	0x1d98abf6
-	0xc9322c46	0xa22604ad	0x2740ba5b	0x99eb85be
-	0xb52a3340	0x3fde5fb7	0x5e0e3a01	0x60f69345
-	0x37f6fd3d	0xd084006d	0x26c3a62b	0x161b206a
-	0x2a224c7e	0x93a45c60	0xfacdce07	0x2e7b4058
-	0x3c79d10a	0xd7939bc8	0xbca2e30f	0xf22b6c21
-	0xbb03c5e1	0xf30b3651	0x2fbb40f4	0x8050c8d8
-	0x8683e045	0xe6024d08	0x81dc0b0c	0x8cd923e3
-	0xdf8df717	0xb1f8d6f6	0xb0469246	0x79ea7958
-	0xe3743d7d	0x83e1cad3	0xeaa7fd02	0x4d3aebc0
-	0xba63ef51	0xd5cde1ca	0x1bdf1383	0xbb462d70
-	0xb777376c	0x5a382db2	0xaed44fff	0x130fdd93
-	0x1ed8bc23	0x1f3c7297	0xf3e79215	0xaabc0139
-	0x50005a1e	0x55ca82c7	0x58778cb8	0x2e58a478
-	0x4c4cff0b	0x3c44a21f	0x8f108d67	0x58211b23
-	0xd233181a	0x9e46b169	0x37533a95	0x33bddfef
-	0x777df938	0xda8a8239	0x45af2beb	0x3613b03e
-	0xe6ae05f4	0xe33730a2	0x1e65dff3	0x7a64a0d2
-	0x79273ca5	0x580a16b5	0xc51b39b5	0xccea7be3
-	0x29d9caff	0xf7377acf	0x0bc27444	0xb68b6ba4
-	0xa75ccbbb	0xdbf69f05	0xe8be0152	0x569bdc28
-	0xb8ebe746	0x43398e79	0xa7def566	0xc99e1f1c
-	0x3be29c87	0x6e4c4b68	0xb8a37b2e	0x84970f9c
-	0x178d4e72	0xac72ec6f	0x0862e04d	0x85cdb66d
-	0xd6f2feb9	0x10d299c2	0xd91a74a1	0x831697bc
-	0xd0038240	0xbe9aed06	0xe808bb08	0x49462fac
-	0x7efb2fbe	0x1e276eb9	0xf83b97b5	0x3754f4bb
-	0x4449cb0c	0xcf2a2866	0x04840e6d	0x9d9b6551
-	0x3b50f722	0xd8f7f14c	0x9ba685f6	0xcf6bed00
-	0x41012924	0x82b27e98	0x7541d6e5	0xfa5b81cc
-	0x91d44937	0x46d27cdd	0x91570abf	0x959e1e97
-	0x7ee9da66	0xf82883a5	0x87afb380	0x761c818a
-	0x180811ad	0x095d4970	0x751dee19	0x9f438246
-	0x32a3c642	0xb3b34b98	0xab450f56	0x539a6ffd
-	0xb339563e	0xe8808c93	0xc7ad9eef	0x0dc36b70
-	0x1278e749	0xe83d046b	0x987de721	0x2115e00d
-	0x7a09efd3	0x8e56c4f1	0xd5de351b	0x98eb73c2
-	0x9becebb9	0xb18998d9	0x3ee01945	0x20eea116
-	0x846bb55c	0xb7f624c5	0x6f7b7463	0xcbb986ad
-	0x545c3c41	0xd754bfbd	0xfc4148ec	0x312f89dc
-	0xe2894337	0x7867e25b	0xeb11c6df	0x9fb721ac
-	0xa843962b	0xef242fd4	0x6fcf4b6c	0xea208951
-	0xd521c86f	0x08f67a28	0x07209b9c	0x6ee42989
-	0x9fdc0e42	0x3794b7db	0x038a398a	0xb339b4b8
-	0x6d621319	0x6b9d713f	0x3537ff34	0x3fff0baf
-	0xa5c0e302	0x8fdfa8da	0x50dede4b	0x448ed0b2
-	0x2178bf5d	0xf7dc834b	0x9762f1aa	0x087a9b65
-	0x7f3cc965	0xcd1c011a	0x4c630727	0x755908c4
-	0xe33580fd	0xca010764	0x677b59b5	0xb3d182d3
-	0x55c2d739	0x8c6f67df	0x10f6b558	0xf034ee76
-	0x540009e2	0xe6343edf	0x95f2508e	0x2a9c22c9
-	0x5d42e77e	0x82216d23	0x10ad67da	0x8ec77e6e
-	0xa88a3bb0	0x4e10dc6d	0xf3fa2dcf	0x59be53e7
-	0x25f758c1	0x2c42fef5	0xba575ddc	0x0435bf50
-	0xd390d087	0x6e230259	0xf7e3c764	0x52c16ff4
-	0xf2a6105a	0x31f0188f	0x83f2582c	0x2b73521d
-	0x6b320332	0xcb7f3899	0x17f23cd3	0xab7d47d2
-	0x535f1340	0x700ea217	0xbcf4f83b	0x16ea4470
-	0x76a618f7	0x30216e93	0x6e80cfd7	0xcf706ae5
-	0xd766457d	0x0ebc1377	0xdcb10949	0x2f679120
-	0x5cc6abdf	0x65754d61	0x1a3dab69	0x8f349b8e
-	0x95bb833b	0x5588b280	0x0f0fa923	0x21250ef5
-	0x73bc2547	0xcd7dabe5	0x4795737a	0x82b92e90
-	0x896f9de5	0xa18ae6d7	0xfeeffde3	0x346b0557
-	0xdc7c068a	0x4e6eed51	0x4ff07c63	0xdd15b445
-	0x97808676	0x304a0912	0x7fe07453	0xb9e64599
-	0xd7a57b8d	0x7f4fd506	0x226719e4	0xe6c251e1
-	0x7ea1ee5d	0x6051b787	0xb00b6e40	0x6babdb06
-	0x725fc094	0xf35fc6d2	0x4e7d6c3e	0xa5a718f4
-	0x17f63fb4	0xc39bf11c	0x808332f9	0xd2c07986
-	0x57bf130e	0xe1f5656d	0xb52a43b6	0x9a105745
-	0xafc22c4c	0xeb5b8a45	0x39153d0c	0x55f1b477
-	0x4a947d5d	0x83dee3b3	0xc3d1e1c1	0xc6dc4d47
-	0xfb93a531	0xea002909	0x95e58a9e	0xf14453ee
-	0xe7fe7f8a	0x6eb7bf4e	0xfd74da03	0xe2a994cf
-	0x4ec6321a	0x27c4a2d8	0xfaecde76	0xd4ba53bc
-	0x22b291c3	0x32dad786	0xedc8172b	0x98f6cbe5
-	0x0407f9c5	0x0e3e7894	0x68c4562a	0x2264dbe4
-	0x938a45c1	0xb02c5428	0x31df8b31	0xefb49223
-	0xad0abeb3	0x9ce02ca2	0x7906e6d5	0x2fbe9f55
-	0x3dfed450	0x9a9f5854	0xa99171aa	0xdedd910f
-	0x3e7727bd	0xbf49e35f	0xfb435c59	0x872ca461
-	0x9693c2e5	0x4d9f7917	0xbf9b494b	0x4cb695ce
-	0xc21c2629	0xaceab2b2	0x30a8686c	0xc09e85e3
-	0xe3cf9904	0x39d0db4d	0x73e0c451	0x64b5d63f
-	0xc27777a3	0x91272d8e	0x511db1dc	0x9d1a6175
-	0x9c7e83c0	0x60037169	0xe9d248c6	0x54d04f10
-	0x99787291	0xc3ee42f5	0xbbd26f8d	0x7fa0ab4c
-	0x1e1e7f10	0x170b04bd	0xdf46d792	0xb17864a5
-	0x832c1074	0x17783980	0x174f75ea	0x92980341
-	0x7aca43ef	0x851a6e2d	0xa25dfbd7	0xf84cff03
-	0x8a3d6563	0x8fff04c8	0x9ac359da	0x58a7b145
-	0x57c1e741	0xbc735a98	0x171bc199	0x9f704237
-	0x1efbde72	0x79b48991	0xa7d67d95	0xe9869769
-	0xf6324dbe	0x17360a53	0x2131f704	0x5cf7b840
-	0x53101e35	0xe71c8bb6	0x1c10fa64	0x28aa5883
-	0xc41d3377	0xe6c3556a	0xa5140cf0	0x1e0224b6
-	0xaabe86f5	0x00b520f4	0x346aa560	0x7de8aef9
-	0x2a19e4a0	0xbe2a2772	0x93653c17	0x2ec53d8c
-	0xd0a5ea33	0x985e6fd7	0xd300651c	0x72ce1567
-	0x16559001	0x6e459145	0x2dafc413	0x28f514cc
-	0x2d1b9e94	0x798b5770	0x3bd27af8	0xd5437be9
-	0x0bc1de32	0x83f58c43	0x4a968323	0x873cf533
-	0x44b8f501	0x8caa31dc	0x90961244	0x257e5811
-	0xfb1c4c4d	0x7203f540	0x9d2294eb	0x533e9896
-	0x670bf234	0xefde4d0a	0xace846e0	0x16a1421f
-	0xe6a40e79	0x8b0f861c	0x63b8416a	0x80bc7963
-	0x035bcc06	0x2f3a8636	0x4adeb4a8	0x527a1f98
-	0x6d0ae365	0xd430ee93	0xa54d6e88	0x9e492859
-	0x6d435e2a	0xf3f336df	0x8789fe48	0x04683847
-	0xeb35012c	0x793f787f	0x1649fc98	0x4daae27a
-	0xa899ef37	0x0aa874e3	0xe877985f	0x3877168e
-	0xbcd9af49	0x925bd4a0	0xd7653ea4	0x1a7356c1
-	0x53cf5cbb	0x5b3e660a	0xce923831	0x42ea11b2
-	0xcb85c607	0xcb4fef4b	0x33ac8e92	0xc68e0ee8
-	0xda28f304	0x34466a58	0x4e3ed659	0x433c37d5
-	0x6e5d8f11	0x2306c1d7	0xb8562926	0x857280be
-	0x7f6978c9	0xb6127ef8	0x848ff180	0x3f175d08
-	0xc9ea3682	0xa7f8401b	0x073a04ee	0x75d43c6e
-	0x193e70e8	0x9e6ee78f	0x5eda1df9	0x53e54ed1
-	0x94a57a5c	0xd66dc923	0x121c0f87	0x637f93d0
-	0x52b5658f	0x34ca3432	0xed262d4d	0xe7c3c8bf
-	0x05519bb1	0xa27335b6	0x8aeba357	0xa9edeef9
-	0x06dad515	0xcc0258ca	0x0db85a3d	0x4edbeee7
-	0x8efdc1fa	0x53f1f91c	0x367b73bd	0xc9785288
-	0x8046ec91	0x1270cb82	0x6a5cc22b	0x7c56f6c4
-	0x09140a7f	0xa362df46	0x794ba791	0xc280f317
-	0x0a8c218e	0x8fd18bc7	0x9d112770	0x4a94c675
-	0xd08f6e86	0x200978a2	0x08bb8824	0xeda38a74
-	0x396364ed	0x4cf3fae5	0xd1bbcc8a	0x38e68b54
-	0x49fe9e89	0x0f372a6f	0xcb8206ec	0x686c51df
-	0x3d21fba2	0xeed5addc	0x8cb09804	0x7b144b6c
-	0xc31b72c5	0xb2e1fc8a	0x699440df	0xa1484706
-	0xbfd64898	0x87c7d89f	0xdd1f06e2	0x9048531b
-	0x3fb97a6f	0xec79fb12	0x1a81577f	0xf6fe7c86
-	0xfa572435	0x0ed1607e	0x85823de4	0x2688f491
-	0xcd6f5341	0x55c944e2	0xd94a5421	0x43b0eb08
-	0xabc52c65	0x3f624e64	0xaaec22a7	0x0b6fc108
-	0x0b5e8a54	0xb9f36d25	0xf531e230	0x18405343
-	0xadf99cb1	0x779851bb	0x93aec541	0x8364b884
-	0x9e14f66a	0x389f6625	0x94d43b9a	0xd9f3b002
-	0x34b23621	0x80599e02	0x7ab4a0f0	0xb0428b5c
-	0x8510def7	0x2871743f	0x350d0bc3	0xdbe61d9a
-	0x787b3c6c	0x80272431	0x2ed6efd3	0xcf77c8b4
-	0xa21f406c	0xcb82aafc	0x451b3a49	0x4bfd9ae6
-	0x4bb86748	0x03fbd542	0x329ad4fd	0x0761e756
-	0x07f31e88	0xe6aa2f44	0xc209345b	0x250eab3a
-	0x2710b3b1	0x710bb403	0x921c083c	0x94e25ccb
-	0x6b344255	0xda1501d3	0x3e0dc98c	0x2c09adda
-	0xefbf0286	0xdec41f1c	0x3865e02d	0x211215e6
-	0xbd3e4351	0xa3b9abc0	0x9ab908b2	0x5c345108
-	0x0175a871	0x3611d15b	0x54733b2a	0xe57bfda6
-	0x3b507ed3	0xcdcd1007	0x5314fc0d	0x3ef57680
-	0x181ffd9e	0x27a7e64f	0x7a780684	0xc8fadf11
-	0x13415b31	0xce53dcd9	0x55488687	0x858b70cc
-	0x14067837	0x0f3f012f	0x41f0636b	0x1c8d2f52
-	0x9dacc300	0x63b27876	0xe1c23617	0x02c57956
-	0x85a91d2c	0x0740e7a4	0x619eab0c	0x10f254ca
-	0x9ec8ca01	0xdfd090f4	0xbac084ac	0xa1f8168e
-	0x7fa0e114	0x282b1cac	0x8e1283be	0x9e108b3b
-	0xc6eb7a09	0xf8d643a3	0x3b4afa67	0x3e7f307c
-	0xa5fb1937	0x0b00178b	0x017369f8	0xafe1fcff
-	0x29987f54	0x965cfcd5	0x0e362047	0xd03dfc30
-	0x9540bd32	0x2c688ee6	0x6c32d9c1	0x5935278a
-	0x11b6c4c9	0x69202bd5	0xce48e114	0x9c5bc22e
-	0x3e92fc71	0xb77657e2	0x9232fd3f	0x76dbd637
-	0x1d672fbf	0x4dcb0727	0xe719838c	0x3db49bc3
-	0x77d94683	0x6d82214f	0xdd3d51cb	0x3c23f486
-	0x46253c8d	0x347089d1	0x7fef2912	0xee1d3cb4
-	0x10da8cbd	0x7172b3ac	0x95c24117	0x60d1bd52
-	0x1b2b9552	0x20ac6729	0x3614535b	0x830844db
-	0xd9310617	0x3480f0ae	0x8e2e14df	0x4a02c210
-	0xf5944144	0x680b5216	0x5b5ff941	0x921f8c17
-	0x798012fa	0x43dd9855	0x725e40e7	0xb3bbac37
-	0x44ef21ec	0x7fcbcfe0	0x0630ce23	0x3f39b5dd
-	0xf0b3f7dc	0x51bdefd5	0xf5e0b7ec	0x3a2c2398
-	0x00e4ad5c	0x4017fa32	0x205c567e	0x70c646e9
-	0x81c0291b	0x33c5050c	0xeda458a6	0xa6c868fd
-	0x1b70f270	0xb661cd4e	0x322b97a9	0x1572f522
-	0x004792fd	0x01d23270	0x667b335f	0x5da3142d
-	0xb7de831d	0x9736e866	0x0a70d898	0x16d1b373
-	0x70bd1a6b	0x75170aff	0xe98d71af	0xb9829684
-	0xedaa0924	0xbc67c151	0x155b4797	0x63c8d08c
-	0x7811c5b5	0x84a348e8	0x6d841a8a	0xdc0e3707
-	0x3defd447	0xac78f3ba	0x44ac7616	0x68147936
-	0xc3f6fe4f	0xe3550b13	0x1dbb593e	0xeede24e0
-	0x3935ec43	0xe0a30569	0x66a0223f	0x32b741c6
-	0xd9e35135	0x77793169	0x8479a087	0xcf7433a2
-	0x91d6967a	0x34aee2fd	0xfd68c051	0x6375cafa
-	0xe5d7a0bf	0x1a3cdf26	0x4f0765b6	0x89dd8de2
-	0x0ebfa813	0x8a5b91c0	0xd698549a	0x4ee2cfb4
-	0xc2dbd4a5	0xd0e2ab9b	0x9765a4e8	0x880f32ac
-	0xf0f30fcd	0x74021c54	0xa1d6944f	0x25270ba8
-	0x75dd0748	0x770e7b69	0xd6dafdd2	0x0254ea84
-	0x427eb60e	0xf5a422b1	0x53fbc0e3	0xb470027c
-	0x3ff09ede	0xbecc9100	0xba2d3ea8	0x86295a6c
-	0xf3a8690e	0x503f198e	0x7498daba	0x4c04fd03
-	0xcebcfdcb	0xec671b62	0xeb98f36e	0xcf3d095d
-	0xfc627be1	0x7a6aa482	0x4961f814	0x82a9df39
-	0xeab68128	0xe618105e	0x603e4e80	0xd42305a1
-	0x2ab596b0	0x66ef4bf8	0xbe2d8a31	0x7571fd10
-	0x6ad34e73	0x77c92e69	0xf70829d0	0x243bca33
-	0xa41899b2	0xad3847d1	0x326085c9	0x1e32f76a
-	0xe5939032	0x2ef87117	0xedd0598b	0x0f5b0ab6
-	0x843d972e	0xbdedfd02	0xf6f281d2	0x806f8619
-	0xc0d4e6f7	0xc7c752e2	0x4cb18e8c	0xa3109bc7
-	0xb3c9d39f	0x5fed1b89	0xf56bf4a6	0x1ef9ad37
-	0xb6d27d00	0xd62e0e2f	0x427c1f76	0x64b708e3
-	0xe61b8094	0x58c140cf	0xc9ed8bfd	0x549d8321
-	0x887f495a	0x9b92965e	0x19dd4f23	0x48faa916
-	0x536988d2	0x5c41f555	0x78dd7a98	0x52c98af1
-	0xaf1aa0a7	0x472d9c18	0x5072ec30	0xcb8d8c2a
-	0x20ca2831	0x54741df0	0xde485e64	0xde719ed4
-	0xd0e4fa14	0xdbe68e08	0xc4b52f6b	0x7c478181
-	0x5ce15685	0x20bf9757	0x01ccdc90	0x3f59a540
-	0x09dfd538	0x96d5313a	0x11b8a5b5	0xb185b4a6
-	0x80b8ebac	0xdcbf7885	0x1f78d8ed	0x3f845528
-	0x8f10047b	0x31048ec4	0x08b16c82	0xef8212ce
-	0xba7e12b6	0xbb27b4dd	0x880c366b	0xbb9013e9
-	0x680e9afc	0x639c8dd4	0x67a899a9	0x95d99658
-	0xcdcd0ef6	0xd35bf9ae	0x73dc39ff	0x1159cdd6
-	0x820e821a	0x233b30ac	0xa5355178	0x508a060b
-	0x70f8eb69	0x7dd6cd6a	0xc9babdac	0x952886c9
-	0x20a4d780	0xcafe7a7d	0x4a564d22	0x23c88386
-	0x95dcd3ba	0x57e703c6	0xbafaa61d	0xd515f701
-	0x1634dc08	0xaf721b5c	0xdb4b52e4	0xcb54c7f2
-	0x1bdf64d1	0x7e798a76	0x20066741	0x1ecacec1
-	0x2d5be224	0x8eec039c	0xa2adcff2	0x6abe342a
-	0x15929ccb	0xde4a5a29	0xb0ef2733	0x51e6e38e
-	0x88f7ded5	0x9a7c3d12	0x0102cd55	0x1e5fa60d
-	0x43e10b70	0x17c67005	0x6d60158b	0x03ebc351
-	0xc1877454	0x99486475	0x68e31d63	0x4ef41164
-	0x1250792d	0xe2dbb2b7	0x3f041adf	0xc00f1ca1
-	0x0bf6b065	0x581d1496	0x6babf291	0x0cab401a
-	0x37305a02	0xd8b025f0	0xd9aad863	0x33378c27
-	0xfce64bab	0xb944fc9a	0x421cb71a	0xeaaf1a0e
-	0x08c62ae4	0x4be73168	0x95907070	0x7b40f3dd
-	0xa0273b1e	0xe4995d27	0xb6aa456f	0xbbefad85
-	0xdf650ed9	0xcdfde8ec	0x8f3ba9b3	0x6c8aaa45
-	0xbb938c57	0x2d26fcf3	0x1fc85e00	0x30338e08
-	0xe3502aad	0xfe0528ba	0x25c888e4	0x136224fd
-	0xe3fb8d06	0x8b521420	0x8d4849b0	0x128a5579
-	0x485bd52d	0x46ced7d5	0xe922bb2d	0x76d52253
-	0x976436c0	0xc3fa64e6	0xf900fa97	0x1ef8db2d
-	0x79a8b6e9	0x1ff2b058	0x61dd59cb	0x76eaffd9
-	0xdaad829b	0xaf929bc6	0x7f1461f0	0x28541e57
-	0xdb2223ca	0xb5a41af3	0x963dfe3c	0xf332afee
-	0xf01270c1	0x37fff0d5	0xa8db736d	0xbf6b8ace
-	0x060b9827	0xe04fa359	0x8483405b	0x526756af
-	0xf93bd116	0xaaf82ddc	0x3d800e46	0xa462a35c
-	0xb62236e3	0xab42ba34	0xb662603a	0xe8a24ea0
-	0x4b13879b	0x0271f215	0xb7227ebc	0x1c85b75a
-	0x06a7f989	0x5a58a071	0xf027ba62	0x3940d149
-	0x174c162e	0x1710f899	0xe50684e0	0xe58982ee
-	0xcb3b9fa5	0x545dd73d	0x42a33d21	0x14ce3ed8
-	0x151fc3e7	0x6fa96a65	0x60131642	0x20115648
-	0xe2fe3663	0x618bb9ab	0x9b2fe08c	0xce906711
-	0xb9fbe11b	0xce79c0a2	0x76320db5	0xd2b8956d
-	0x3c8fba1b	0xda7d5cfd	0x79930fde	0x7b1eaab3
-	0xe4190098	0xe46cc648	0x796557fa	0xe61f5c5d
-	0x85341adf	0xa01cc486	0x1460f8f8	0x0de8488c
-	0xc3575498	0xdaba60b1	0x6e00e9de	0x8de1e277
-	0xd7ef67e0	0x6f209a77	0x582ec810	0x4636f6cc
-	0x6bd9e60d	0x64ea05fc	0x580f9f7a	0x0f18218c
-	0x240f624a	0x0afc252f	0xb025c839	0xe6a5afc3
-	0xd5e32234	0xf30ced0c	0x90f032cf	0xb6fd59b8
-	0x2ef1aeb8	0xdd5d3fe6	0xa18a909d	0x65c3e9e1
-	0xe821d2f9	0x957146ce	0x86ea8c2e	0xea79a59c
-	0x91bbff8c	0x50efab7f	0x4a8c0919	0x11faafd8
-	0x3f3463b9	0x80e0e50a	0xdbcc8485	0x3f7c058b
-	0x4cfa4e1f	0xff8867ed	0x6bf2f6e9	0xa61daaaf
-	0xb718eeec	0xefe4f834	0xd0c4727d	0xec787df0
-	0x85bfe1f5	0x7329affc	0xf4c0ed95	0xa6a8b495
-	0xb3bd1c06	0xd38e0a09	0x26e3f747	0x6bd5ceb3
-	0x5eef12c8	0xd1011d66	0xb1dd692a	0xba1294c7
-	0xf7ddcb0f	0x4dbd2861	0xb29db408	0x051fb421
-	0xa4fd5f8c	0x1ad5a3d0	0xd95aee42	0xd52203b8
-	0xc4e76978	0x5780ee25	0xc38f6280	0x0e4bdb05
-	0xdeaf0dc3	0xcada9dc0	0xf7dd201b	0xffe07b67
-	0xe486f4d5	0x72a0b32a	0x518c1122	0xc240db35
-	0x1d7b5a09	0xa26636f5	0xe1b716fb	0x9158d0d9
-	0xfbe3b60e	0xd37c00dc	0x551615da	0xc7fde3ed
-	0xac94b6ae	0xcc87d6a7	0x0d010d6c	0xe1bc4072
-	0x8d8a4caf	0xf4381342	0xe3efc8dd	0x64be88ba
-	0x0eac9658	0xd10e87c6	0x8dc223f5	0xbbadd543
-	0x3ad28376	0xba68d553	0xbce5620d	0x1adc3d5e
-	0xa64d27fe	0x65086819	0x80b82c62	0xff91b5cd
-	0x97cadf1a	0x2cb0d45c	0xa73587ca	0xdaffecee
-	0x299e3888	0xb4c116f2	0xd7aee299	0x9c33d177
-	0x8af686c9	0xba6b45b6	0x47fe7688	0x1e49d908
-	0x721370a8	0x1220ffc9	0xeb62dcbd	0x4255a463
-	0x13ef302e	0x619bc137	0xce369fdf	0x3a1ded2d
-	0x88dc709e	0x4b10b186	0x582eba1a	0xb508101b
-	0x6e827983	0xb25e5755	0x9f29bac5	0xdd946461
-	0xa6b87255	0x92471f76	0xac61af93	0x670e9ae7
-	0xb3cc278f	0xb674f114	0x5616b751	0x527869b2
-	0xb6847ec3	0x7c94f508	0xdedd2e51	0xe322e023
-	0x3ef45d78	0xc95848ce	0xd53c243c	0x645d8456
-	0x1c510cde	0x243ad2e5	0xfafac2e4	0xc23ad8fc
-	0x481fe577	0x1f73fdc8	0x4cf5388c	0x8afb0c47
-	0xe39a7e0e	0x439e32a0	0x1a3af126	0xdd0ddbcf
-	0x56efe7bb	0xa4526c50	0x1f1e8d7c	0x6fff2758
-	0xa9cfc7c8	0x9aed3088	0x1419791f	0xc41006c6
-	0xe665ffb4	0xe0cfc001	0x5ac279f7	0x8dda44e8
-	0x6ba63b5d	0x11cd5e85	0x87b35603	0xfcb57486
-	0x64df1bbe	0x1df9ceb9	0xc2565187	0xbb6b4730
-	0xa60ba743	0xb50ca534	0x224eecf0	0x8acbd1e3
-	0xff2a22f6	0x00b94b20	0xb2bb1824	0xe3af6f67
-	0x78db1d5c	0xa3dfaa5e	0xb23a1a59	0x234628d1
-	0x46a0b6b1	0x6d7b354d	0xd7f14b18	0x492cdb7a
-	0x4b0e5fb1	0x3b210deb	0x82ba85b1	0xe5af7727
-	0xde5e2892	0xf4ba96b6	0x1011fde0	0xb96e65b0
-	0xb3f72d55	0x4388cb56	0x09f8801d	0x534eecde
-	0xa30f33cf	0x2454f5c5	0x5f32f1a1	0xd1d008eb
-	0xadb25f06	0xea32375f	0x71734ccd	0xc989e49c
-	0xb45f560d	0x49ed0d08	0x5ccf1394	0x5115dd15
-	0x46876215	0x20e6e84f	0xd5deaeea	0xe559d4f2
-	0x1e1c44d0	0x9f582603	0xad90b17d	0xf16c26c9
-	0x7f0708f0	0xfeb0b9e1	0xb853f20e	0x16f3ff5c
-	0x1789f6ba	0x236bb3aa	0x906f2ccb	0x255c8814
-	0x9d762cb2	0x2846e2b6	0xa34f8522	0x2502c2fe
-	0x698ad3e5	0x09c88175	0xdbee86b6	0x264167d1
-	0xcce5d399	0x78a3f959	0xa0a515c8	0x36c2db5c
-	0x5dec037f	0x56a558ad	0xa17a21b5	0xca0296a3
-	0x963a70b4	0x2733e44e	0x4f979549	0xf3738ba0
-	0x60aff2d1	0xf66ed176	0x8f658d9b	0x1e83fc2b
-	0x28a3d57c	0x1d50c6d7	0x434f286e	0xbbd6f950
-	0x5bfebf75	0xe366392a	0xbd328d7b	0xf10a2ad9
-	0x59504439	0xac3f2cb8	0x28cd3fd9	0x3776a6d9
-	0x5ac2b26e	0x25171f43	0xfb20e0e7	0xda4565f0
-	0xcf0cd438	0xf54f1ff9	0x33322457	0xaa368462
-	0x540acfd9	0x331fff32	0x8b66b3b4	0x19a74ca7
-	0xe3037b68	0xa4ddcf1a	0x48dfd4e6	0xe0302745
-	0x21522f0a	0x3b9f1cf8	0x2f7da1d2	0xd1e02b1a
-	0x89d834ef	0xc03b327c	0xa32b106f	0x2bfb3409
-	0x7f001db1	0x9ad9a334	0x0f2e5ed3	0x1063a583
-	0x6cb009d2	0xe9670521	0xdfcab184	0xd02add2b
-	0xfa7721f2	0x6e772878	0x11c5f0cd	0x1d228ded
-	0x54d84a8b	0xffbb136f	0x489a4619	0xf51cd9d7
-	0x6618cdff	0x76685892	0xfebcf111	0x02ee0a86
-	0x77ffdd9e	0xd36303bf	0xed4a8619	0x0160eb27
-	0x0b7ae017	0x7e3919a8	0x1b0c65ca	0xc8c7ef9a
-	0xdd593e48	0x48091b98	0x5ad15379	0xf9f54186
-	0x8c064d3f	0x09f23b45	0xb1bf1f50	0xdefe3c11
-	0x3d9c3506	0x328acb8a	0xc0efd1cc	0x7f3e472c
-	0xbd0855c8	0xc32d33ea	0xb2aedfad	0x5f9c5e3f
-	0x39fab7b6	0x3d58511c	0x74dce606	0xca5975f2
-	0x7adc328c	0xa7f2cf36	0x9084c11d	0xa25fccfd
-	0x0f5591e9	0x7c912a6d	0x6bcd5638	0x74174d51
-	0xe4f38864	0x545a4f72	0xad79bce7	0x68f23ea3
-	0x2c29455e	0xb2dce3e7	0xf75922bd	0x62d9d813
-	0x2ea9daf9	0x9544ba17	0x1036f50d	0x003d0734
-	0x6de2f91d	0x12de6d4e	0xbe6f77c9	0xcdc6f7e0
-	0xb7bc6908	0x8102989a	0x81b1ecc4	0xbec4c06b
-	0x57ae207e	0x0d9bf8ed	0xf82fd233	0x626e99b4
-	0x775ba43d	0xfdbe57b3	0x9e13e0ae	0x8f9e71cb
-	0x22e5b181	0x879a9646	0xa59f02b6	0x315bea64
-	0xfc2d998e	0xf3ee358a	0x465f0469	0xae5e30d1
-	0x8667c5ea	0x4d3797f1	0xdd9119c1	0x8a5c7526
-	0xefdbe49b	0xcba8bf75	0x31c56598	0xb089371a
-	0x50b88730	0x8b04e9ea	0xbe766234	0xb589b311
-	0xac86a2dd	0xf3cab9d4	0x8392e86e	0x459f4c2d
-	0xdc6e9e42	0x38fc7db6	0xbe1c3f55	0x87827bb1
-	0xd3fb2dae	0x29f65cb9	0x288ee868	0x44ef835c
-	0x5412f96d	0x8db90a63	0x619eb896	0x819145d0
-	0x4c334fcc	0xb28d29d1	0x71198c8e	0xcb7a1ec7
-	0x67d911c8	0x83e5b451	0x18dc1483	0x74d2d7fc
-	0xfebe405b	0x1b1865d7	0x552adee0	0x62e24345
-	0x4c772a36	0x047bfaa5	0x848961c3	0x86f2f24c
-	0x3f5db1e9	0x48c4d9c7	0xd7902c02	0xa0dfb8c6
-	0xb16ca129	0x7df0a350	0x58e2570b	0x6c0aefa5
-	0x2c8a35be	0xd155ab73	0x0801d1ad	0x913ac469
-	0xc6398211	0xa44aabec	0x74f991fd	0x122423d0
-	0xd1d7f77d	0xeccf8eff	0x59ecfdbb	0xb85cd73f
-	0xbd10ba8d	0x0c9880b2	0xcabcba47	0xc11e71ef
-	0xcb57870b	0x3a29030f	0x0bff4c01	0xf2629315
-	0x6686b1e9	0xd2b50835	0xec24eb6c	0xb23c7e88
-	0x045a35c1	0x5fb62127	0x2dcc31f7	0x5c47cd7b
-	0x1059b75c	0xe2d6d12d	0x6bc8f0da	0x30ade89c
-	0x35b06222	0xd13a1347	0xacbb2f8a	0xb7fc8acb
-	0x2edd849b	0x8d74157a	0x562d8d4d	0xa393948b
-	0xb89b904c	0x418eee39	0xd42898ae	0x630e1cda
-	0x96c56104	0xdd16c830	0x89ae9ec2	0x1e1cadb2
-	0xb8ea73b8	0xabaa7ad5	0x654ab956	0x17b2bb13
-	0xb064652a	0xbf9897cf	0xaabb9b9e	0x38a0654f
-	0x8bc378bf	0x11559864	0xd193ee51	0x3883fef8
-	0x461d458b	0xc35b1b22	0x570015df	0x2b18a043
-	0xab4aee83	0x4e0bff9e	0x323dafd6	0x8bec69ed
-	0x1846d886	0x0ed944bd	0x9a2b4a60	0x132616d5
-	0x86f3c871	0x76ee6765	0xe971f2cc	0xabaac761
-	0x59bf478b	0x0d83ee79	0x0883a1e1	0xbb4660cd
-	0x24c77bd5	0xed55f531	0xfaea8dbc	0xdfecc13d
-	0x285e5bef	0x7b14cc12	0x68cb6d5c	0x07b7a0a8
-	0xaf3d6e45	0xbceb6223	0x1eeaa87b	0xbf0f9998
-	0xf7582f97	0xce1d2f25	0xd8509595	0x1f6729ba
-	0xe3fccc36	0x7ca2d51b	0xa92c327c	0xe1b49064
-	0xe3cc87e9	0x82c05001	0x9d855812	0x0a7cda02
-	0x65017632	0x1b226e96	0xd4ffaa0a	0xc5a5e42e
-	0x04ba35e1	0x39f6606d	0x23668a62	0x9f670515
-	0x4fa60d9a	0xc8bd3911	0xd95d20c8	0xfe483aa8
-	0xbad0ea2f	0x3a443ce8	0x3857d9f0	0x4516097c
-	0x98d96ee3	0x11529725	0x85c93890	0x47461181
-	0xf6fbe21d	0xda939a92	0x1bf3d3d2	0xf5385362
-	0x31937784	0xa7b86d9e	0x42bbf80b	0xaa3c390a
-	0xf4b7d5bf	0xb1c43ae7	0x59efcce8	0xb69885db
-	0x2a6ff378	0x20f6ecb3	0x5cd55e2b	0xcb345f54
-	0x6ff1d8c8	0xa6766f2a	0x80b3f21e	0xb69aa081
-	0x7b685d4b	0x2b84356d	0xc8f7c968	0xdd9582cb
-	0x2ae3329d	0x2884e0a1	0xcfba6d58	0xe80ffa06
-	0x1d9e8104	0xb1cb5fdd	0xdff34ce8	0xa3d46b2d
-	0x229a693e	0x02c1ffad	0xb52810d7	0x94a5f91f
-	0xb2410f87	0xb827abdf	0xd608ca6f	0xb1091e4d
-	0x75b7eb78	0xc40d51ea	0xe8c64259	0xa2b38060
-	0xd3284d20	0xc7bcf1f7	0x380b300b	0x469fd0aa
-	0x39f0e4a8	0x58b56c61	0xe42a3c3e	0x95afbad6
-	0xd989f15c	0x12f9d899	0xaa41188b	0x5ef0a7dd
-	0xe50d22a6	0xceda0b9e	0x53e0fd62	0x4f974e41
-	0x78684102	0x743bc6aa	0x973a47ff	0x48a09dfd
-	0x815546e1	0x346ef0a9	0xd8b9f0d9	0x1f990a29
-	0x1cb7cda3	0x93b243b5	0x081298b4	0x8b1c0520
-	0x6740563f	0xad1275bb	0x82aeb54c	0xcedb023e
-	0xfa9275e3	0xac1918df	0x395ffc44	0xe52017e0
-	0x9b88236b	0x47229fe7	0xafe00678	0x1b506855
-	0x6cd90e68	0xee6332a0	0x806910a8	0xf42b4856
-	0x99ba5340	0x8a0f68d6	0x7a7442e0	0x01f543b9
-	0xd3ae2a29	0x82006e7f	0x84f3c581	0x945c25c6
-	0x08ebe7a0	0xa544b292	0xa828419b	0x17363dec
-	0xf772131d	0x59edff26	0xd05d94c9	0x86f00bb9
-	0x45ce081c	0x25916c63	0xbc881029	0xa52c11da
-	0x846b2a91	0x5802a2cf	0x4a8de481	0x2b418464
-	0xfc6c04ee	0xf23c0f6c	0xc470aa16	0x5f168faa
-	0x544e44ed	0x66e02d1d	0xe4316d32	0x5faa049a
-	0xa3b599c1	0x1712d5c0	0x22c049f6	0x0dcf6498
-	0x59d976ff	0x5729d27b	0x20667d36	0x5e94eb1b
-	0xfe9f912a	0x5b31c8d7	0x96754466	0xb5b7387f
-	0xe6557f48	0xc095086b	0x1876dd38	0xbe3bd213
-	0x2a956ef8	0x59cde6dc	0x79ef6f14	0xd479ac9c
-	0x4fb12aa6	0x1773ac27	0xc99a79b7	0x88319c2e
-	0x017171b0	0xe9322144	0x89ad5ffa	0x66bce095
-	0xe7feea4a	0x67457e06	0x4c85a956	0x91eeaf30
-	0x8e9a3fb3	0x04029d73	0x831daebb	0x15105d48
-	0x855d539b	0xe041b09a	0x64d2d1bb	0x3c3249f1
-	0x9e601a46	0xf6c06195	0x9304a550	0x07ba1e54
-	0xe0e41cbc	0x686ba561	0x92a1174e	0x8dae719e
-	0x7363732a	0xe31c5716	0x75ea27ac	0x20dce24b
-	0xcdd0cb3a	0x7510e7dc	0x6b438775	0x7dc88707
-	0x097883a8	0x9a0653ba	0xa5b58b39	0xb4dffe70
-	0x3dbf5354	0x1296bec8	0x6afea6f7	0x5a396962
-	0x44c59723	0x00197649	0x88476700	0xcebb0206
-	0xc6cb5364	0x01ab08a9	0xefc19a10	0x98b3dbb7
-	0x79290d1f	0xeeb1cee1	0x155d3eb0	0x0d1ad333
-	0xbecbaf44	0xcb494c9e	0xfaba7d92	0x8f0a38d2
-	0xd71aadd7	0x96898e98	0xfae22e00	0x5cdf8ce9
-	0xec12989e	0xc0e235d6	0x35ffad3b	0x0607e758
-	0x146c87c7	0xd441c093	0x94ba23ed	0xf9029146
-	0xb2a55678	0xd9575a72	0xc8d977ea	0x3e4ee1e9
-	0x929514f0	0x947b0b81	0x7659a020	0x1e889477
-	0x47fc8fc3	0xba26006b	0x11ba9b5a	0x296ee7c0
-	0xb9625907	0xce20ae26	0xab5c4ffd	0xc8fb7bdb
-	0x09b94a92	0x96955d13	0xcc165a1c	0x59774853
-	0xd033d21c	0xfcb748fe	0xcca14a49	0xf7c3bddb
-	0x1699d641	0x5a7df26f	0x800db96f	0x3f06e996
-	0x32cb5eec	0xcfed09a3	0x590f6e50	0xe0de426a
-	0x8818035d	0x3e864da1	0x9915f5a5	0x0c9f0e01
-	0xc039e81e	0xbd41702e	0xedeb91f3	0x58bb813e
-	0x58d88d4f	0xcc9aebb9	0x1f16b1f6	0x20289a23
-	0xfc74f52d	0xf76141fe	0xefeea38e	0xb264ab37
-	0x5761d199	0xa615c301	0x854a2586	0xece5890d
-	0x25687347	0xdd5b00cf	0xdc380b09	0x3679f957
-	0x8d28f162	0x8d192079	0xc5018575	0x84e7dc2b
-	0x6801ba12	0x0ff46ee9	0x05977f7a	0x2804d141
-	0x2d66aef1	0x12b96d1e	0xbd0fee36	0xeb61eb3e
-	0x3bfadea6	0xecc451ad	0x6a7c496d	0xa9df4093
-	0xba53eb3b	0x6fc140f0	0xa10e0b45	0x7177ac62
-	0xcf5fb075	0xf15384d3	0xe76956d2	0x6bfe3cd0
-	0xd4c176b1	0x7b83caa4	0x6fcb1c28	0x7013d243
-	0x8303b45f	0x77217eec	0x5f04b4cf	0xed77af47
-	0x4ee8c05b	0x84d50949	0x4af30115	0x6536adfa
-	0xe3460043	0x42d089f5	0x6e7b3b0a	0xa33f554f
-	0xb2f9a7f4	0x8b1ee0d4	0x75b77494	0x5084f874
-	0xd12a5561	0xe22cc792	0xc5b37ca4	0xd3325f7f
-	0x941da42e	0x5f3faf13	0x4d328409	0x2efe01d3
-	0x54742b4e	0xd07c956a	0x57f65956	0x6c1af66e
-	0xe0a2f710	0xe90fc5fb	0xaabb9038	0xb1b78f53
-	0x2235d7ef	0x5421ca3d	0xc2d423e7	0x0d44fe4f
-	0xcb104bc7	0xc68e796d	0xc9f45636	0xd019c30a
-	0x14bdaf28	0x8c1a1651	0x90ab3551	0x9f19da7d
-	0x9b987a22	0x8d49388b	0x89c83ae3	0xafa42208
-	0xf29b54a3	0x83bc5cbe	0xe250c960	0x2c902a21
-	0x057042d0	0x6cfce181	0xca9a5abc	0x43739c7b
-	0xdcaa30b7	0x658f0a5f	0xfc3a3524	0xf1d40104
-	0x611b0e9b	0xf50e2887	0x0fd173f1	0xa0e9597e
-	0xd70ca0e4	0x66657238	0x4c6b155d	0x46021c60
-	0xf6abb98a	0x8b8eca83	0x63a6b1c6	0x000761db
-	0xb9280399	0x68593f55	0x7515caff	0x2c50e58e
-	0x512cab6d	0xebe2dd7d	0xe627fe0f	0x1c85dc4b
-	0x867a14e9	0x5052f8d0	0x8c4bfb3b	0x77047e84
-	0x650c4f5a	0x8f28e68f	0xe50223bb	0xd38f07d5
-	0x1924055d	0x0a89a801	0x9ebb9896	0xd4c7c7e0
-	0x6edea478	0x74ec0a2a	0x4d70ace1	0x1f57c098
-	0x9acae446	0x2d695902	0x0b7b67bb	0xf2c1cd8d
-	0x9d999240	0x02916fc1	0x9eb6f334	0xe7b45cc4
-	0x1155b93b	0x8a101032	0x71a1014b	0xf01bb4e8
-	0x04a38871	0x57d7d947	0xa7b9d28b	0x3f7969d0
-	0x3aca24a4	0xf9d4c499	0x2220fe8b	0x94b1f831
-	0x42f919fa	0x68bed324	0x15a50bdc	0xe29db9d4
-	0x7fb44468	0x3d82d179	0x4736a849	0xc04dbc09
-	0x797c4eba	0x7a6e09e6	0x3704f556	0xe0200cd1
-	0xc52dd55a	0xc80971f0	0xe6c01cfb	0x8057e7bb
-	0xd36b505e	0x85d81001	0x569f284b	0xf44d32cd
-	0x8b6860e5	0xa65bcde5	0xe55c743a	0x9a8a1caa
-	0xd3f91d2b	0xb27506e9	0x82316358	0xbe864575
-	0x809bb916	0xc978bc53	0x4725378d	0x30e50762
-	0x67586f24	0x01a9fcb6	0xe9f6c5b9	0x19719844
-	0x9fb9fad4	0x08c4b450	0x4a45b9ac	0x3048f27b
-	0x077c4a30	0x4aea9304	0x3b2a2216	0x3cf58019
-	0x84f1cf20	0xca0eb68e	0x50775bc5	0xd1f7aea7
-	0x8ae46127	0x54edb313	0xf845afb0	0x61f398d3
-	0xf536b987	0x0b9e6912	0xdb2f264e	0x78e46fdb
-	0x41fbda89	0xf03fe81f	0x187c1ef1	0x17bc721b
-	0x41cf8c8b	0x9b011fb1	0x1aeb5155	0xd0a0fefa
-	0x6751ef85	0xd5d88dc7	0x10825111	0xfc087529
-	0xe33dffad	0x6e82678f	0x50cb45b1	0xd5cc582b
-	0x5df4b1f5	0x6f4f0276	0xcd6aecb6	0x80c6602b
-	0xaf862a20	0x882518ae	0x69fbcf16	0xf3e38188
-	0xa7b35576	0xe40eb7b7	0x879a2088	0x55944f95
-	0xcf7672f2	0xc4541a5c	0x6e09ad3a	0x38075dfd
-	0x2ed6c693	0xc4fa0139	0x671c3821	0x038d5dc5
-	0x09793c52	0xb6a931be	0x453d79e9	0xecd6cd11
-	0x960f0fae	0x7649359f	0x19766e8f	0x4a7fb57d
-	0xb18746cb	0x8c3f492e	0xb91a220a	0xaa889e36
-	0x246cb452	0xa7f61e5f	0xf9fb9e07	0xef7c0d56
-	0x4f8d0024	0x082dd2a2	0xa8c091f1	0xd7466121
-	0x10c79d8a	0x3300740b	0x6d1f3780	0xf60f731c
-	0xf2d58803	0x6a80b882	0xd5d9c4fa	0x3dfc9be7
-	0x9dfe48fb	0xed7e7e88	0xcdd5dbdc	0x485b67d4
-	0xd19f715f	0xce7d6a99	0xed483597	0x2f0eb52b
-	0x7546c358	0x54f1cbcc	0x5df93879	0x79693708
-	0x8eba40f1	0x8f705e5c	0xd1154fc1	0x9f99ac65
-	0xb92d1d22	0x07c98e9a	0x21a14255	0x78c68738
-	0x7cd994da	0xbad78e73	0x463d5997	0x83a71109
-	0x53bb8986	0x15bd8dc5	0x7e1f1998	0xa8c5391b
-	0xc5abc962	0xd9a0bd54	0x48f64292	0x77410557
-	0x09db7193	0xf835577c	0xfd0f32fd	0x578d5fe4
-	0x198232a3	0x5e332aa4	0xce6b2647	0xeabc740e
-	0xf8e545ba	0xcd7d6c42	0x2776f043	0x3f0486c9
-	0xeea7d9b9	0x6773671d	0x08043447	0x290896a7
-	0xe5d05e2d	0x1701dd00	0xe2ac31a2	0xc7a96166
-	0xaff6d0c2	0xfd73837f	0x0bd95906	0xdbbbd03e
-	0x93406214	0x8e4827ef	0x67c7af4b	0x2e83eefb
-	0xac7857ea	0x6a3705ba	0x0e6694ad	0x5b7cf57b
-	0x12b302ab	0xe302c65a	0xb86a70e4	0x558c3c3b
-	0x516b9e0e	0x14a404ac	0xc2125bf6	0x7b004a59
-	0x65781699	0xb455f1c2	0x1f1f7b0c	0x800225a8
-	0x382ec77a	0x31f3d8ee	0xeedbcabd	0x6b95ea73
-	0x7a3a3f50	0x49b810d1	0xb682073c	0x36971f10
-	0x10eec5e1	0x9b9354cf	0x220dc62a	0x0f901007
-	0x204baa07	0x8b028c1e	0x7e4fff42	0x19123ff4
-	0x0219d4f0	0xfd355ae0	0x82e8c025	0x04daa19d
-	0x1d65eb84	0x282aa6ae	0x40dbee56	0x906b6b46
-	0xe1112280	0x031a9dcb	0x61dd8e8c	0x42504f64
-	0x1cb256d9	0x569448f3	0x9ed09cc2	0x52cffe5d
-	0xa0d21264	0xad756a66	0x42743067	0xbc6a7470
-	0x3950b8e6	0x62a4ec00	0x1743a299	0x659adbca
-	0x7206b852	0x156b6cf0	0xa54cca90	0xd4f789b8
-	0x177e7e86	0x6b19f13e	0xd7fadfd1	0x68ef1abc
-	0xbad802eb	0x3802a623	0x43b08974	0x23bc8939
-	0x8ee2bb67	0xbdc11c8e	0x2efbf4e3	0xc550bd4f
-	0xfb7e6923	0x9fd78d20	0x0238fc36	0xa733dd00
-	0x1ae532d2	0x83f4e497	0xca0f4cdd	0x3b204df2
-	0x0d5084f2	0x15da2f6a	0x904b1dc3	0x7418ce5e
-	0x28258fee	0xbc0292b7	0xf2002944	0x73720375
-	0x2486734c	0x1883172b	0xe1dda0b6	0x8e1ead82
-	0x18e47d65	0x9b8178a1	0x0251a0af	0x5a8577c3
-	0x1c5ce32f	0x0220633e	0xc90c9de8	0xe63cc5b7
-	0x7f334c91	0xfe0e70da	0x0af05ce6	0x8506f70d
-	0x52ee885c	0x1c723bd5	0xc547fa0b	0xeaf183de
-	0x5bf6e086	0x436d2b8e	0x3d7ad97e	0x9b766a06
-	0x021e0e79	0xdd17bae6	0x04607ea8	0xb8d174a6
-	0xc3b99816	0x9f2bf1fd	0x6521b1c9	0xc6373e8f
-	0x9c472d66	0xa71f624a	0x14af923d	0x52266735
-	0xa0a0bb3e	0xba8d52d2	0x54c78a14	0x4dd0708f
-	0x190c6c33	0xbfcc1963	0x3ed502c8	0x0766a192
-	0xe1724557	0x32271339	0x6078e163	0x8de0c570
-	0xd8e8dd17	0xce6b4b31	0xb341a175	0x8b8da109
-	0x557dbde6	0x4863ddc1	0xd345fd2d	0xbe39b49f
-	0x0b46caa9	0x572a2334	0x67d7e89e	0x658e947b
-	0x6afe994a	0x17bd769e	0x054b5949	0x850db30c
-	0x20ac6bb6	0x50480eb7	0xe06ebba0	0xacb7497f
-	0x1dadb5c5	0x4d33366e	0x8559d54a	0x7cce6ef5
-	0xfffed33f	0x7695b9c7	0xbec2d062	0x92a1c084
-	0xe0220148	0xfef08bee	0xc3ee1787	0xbe7151b6
-	0x86c8e888	0x4cae3d51	0xbeb8686a	0xa4b252b9
-	0x54d8cfd3	0x8d38b0a7	0x2f8051f8	0xeb3e0808
-	0x7bd6ef4a	0x6d3850d0	0x718b796e	0x20aa1cda
-	0x0a2ae34a	0x1f786b4d	0x1ef65ce3	0x5a710df0
-	0x618056a7	0x1863794c	0xb98ee235	0x9627fafe
-	0x48c9dc0d	0x33a09717	0xc985c1e1	0x0dcd0297
-	0xd8559f14	0x0925fff7	0x1ec6e43b	0xeabd0343
-	0xdf224c30	0x1560e2d0	0x11072a5e	0x5439abec
-	0x68539ad2	0x7e220044	0x8a1285a6	0x1728d4a5
-	0xf9d7cce1	0x6797757d	0x65c9101e	0x6e40134a
-	0x2a3bf252	0x5859d1c3	0xd42d7037	0xe519f182
-	0xa52ca09f	0xa4b8a207	0x3e2c5afa	0xa2dd1581
-	0xfc43c1a6	0xc10737bf	0xc3196027	0xdbae602c
-	0xa8b8bb9d	0xd092e4ae	0xd08b558f	0x41b0c1e1
-	0x6523934c	0x2c339d81	0x903f234e	0xb24cdff6
-	0x98e056ff	0x7f3d915a	0x87d1fa96	0xfbf87d09
-	0x9543241e	0x5d7df767	0x81082a30	0x206e5ca0
-	0x3c78dd55	0x3c4ef16f	0x0cdcda86	0x41b65308
-	0x04001fd9	0x51647a1b	0xd0eba6a6	0xea5b6d04
-	0xe6040387	0x0d8bb27e	0x68cf3432	0xd05a4c2d
-	0x23c1f2b6	0x17241b34	0xebb1ca9a	0xf37a448d
-	0xece67298	0x0487a8e5	0xfcb0bcef	0x31be2771
-	0x82bce53c	0x85b84892	0xdabc1c6e	0xfa2abcdd
-	0xd1df67c0	0x16f1ede8	0xff1a16b7	0x0d8c5570
-	0x51fbe82b	0x8bbb72cc	0x2329bada	0x3085b33c
-	0xb57804b1	0xb0e794b0	0x15c12782	0x607ef889
-	0x0f812dee	0xf4cd98ef	0xb952b6f0	0x5a58331d
-	0x5ec46323	0x125057ea	0x622c0ff6	0x883106d2
-	0xfb3dffea	0xdc3e0223	0xa97ab5da	0x654600ad
-	0x933167a6	0x374ed2a9	0x937eb718	0xd9501125
-	0x1ab096d8	0x7c9e0cbc	0xe4977ce0	0xc5f10f9d
-	0x34d150bb	0x964e8a96	0x45ca9ad2	0x4682d4cc
-	0x1a547f3f	0x48fca7f6	0xd7bcc4a6	0xd97d99ae
-	0xd8f0abc1	0x66cc1dc0	0x97db316e	0x8a382cab
-	0xbfbd6c74	0xa48d1b1c	0x2699542e	0xfd497691
-	0xface9d1f	0xb9efda89	0x4bbd1fc2	0x92f8afc1
-	0x43b37edd	0x6dde4632	0x3919ef3b	0x895378e1
-	0x87bef27b	0xf411bf33	0x656ba5fe	0x8b265339
-	0x50901749	0x3bde1f64	0xd6ca273f	0x896cbaf0
-	0x94122826	0x34ea9bf5	0x15d3043b	0xf332ff70
-	0x2b95d76e	0x57a79ba3	0x71c1f063	0xe71fc35b
-	0x8f07ee43	0x048ac612	0x65aac513	0x68ea6eb7
-	0xf730ded5	0x4402fb34	0x70ac795c	0x69800516
-	0xb1b869f3	0x6f4bbd00	0xe7447778	0xa36497f4
-	0x1c59ed09	0xb2992d4a	0x93c6a1d3	0x11d3ce10
-	0xdef0a673	0xe86e3d99	0xf1468e25	0xb272fd13
-	0xd407426f	0x95497062	0xcad1dae1	0x5a483a78
-	0x0bdb41a5	0x2899f32b	0xbb8bac96	0x5003c23b
-	0xf88ffbad	0xf4155bd2	0x4dea88df	0x5507bfac
-	0x86bd066f	0x7c993d88	0x89ad6efa	0x2dc99462
-	0x8d634a1d	0xebd312d7	0xfc8a8549	0x26f6cc24
-	0xdfc6c501	0x9615c1c4	0xa48293ef	0x52aa4e4d
-	0x7c1126b1	0xed10ce8f	0x39d15759	0xf6dd7f71
-	0x2f4d86f5	0x151da4d4	0xd9175dd4	0xb2d20142
-	0x20fe7518	0xf35752a8	0x37ae7efc	0xc210d83a
-	0x5d9ff559	0x33e91d21	0xd1c7714d	0xa98c7599
-	0x8ee50ccd	0xc747a3b1	0x9dbc5317	0xc25ae129
-	0x51b3647e	0x25aa4406	0x6e123b35	0xcc8fe12f
-	0xdf9c6d92	0xff1e6b44	0xc294d3cf	0x458dbe77
-	0x8176b64a	0x4daa895b	0x5ecc9d75	0x1b570965
-	0xd563bbb7	0x297b9784	0x4129fd5b	0x77beeb2d
-	0x82bab257	0xca55d798	0x4d413dfa	0x27214528
-	0x918d94a4	0xe9dc1881	0x17a00e62	0xff38fe70
-	0xf0578886	0x99fc567e	0x89728e9e	0x267a192e
-	0x5e16982a	0x5da1f959	0x3c407435	0x9c5cfe85
-	0xa7626913	0xb1145c57	0x174daaa8	0x0487ef1a
-	0x11d7b896	0xcd48cce8	0x464ceff1	0xbdc0f36b
-	0xffdc957b	0xb94233f9	0x61dd9f4b	0xfbc1fe7c
-	0x45f0195e	0xd7c92251	0x6c4ba5b1	0xc780a5a0
-	0xe8fc9220	0xa7ca21ed	0xa82eab05	0xd6050a60
-	0x68bf3f0e	0x50214ae8	0xb83e6b76	0xa435330c
-	0xefe62d27	0xd3b40484	0xe96a563c	0xc93296b2
-	0xd1531895	0x5db76e04	0x491b827a	0xf160fcf4
-	0x4b82737c	0x3c72de73	0x1996e649	0xd2d79c59
-	0xb1263519	0xb8660e24	0x4b07996d	0x71df252d
-	0x58f95a70	0x8618a823	0x94239726	0xd6d92a80
-	0xd8142a6b	0xc98c3175	0xfaa52b59	0xe91fdee1
-	0xd9a1fbff	0x8d63a59a	0xe0bd9077	0xbb1cddda
-	0xad57fea1	0x32af0614	0xea652e8d	0xa02ef7b3
-	0x07440720	0xbac50654	0x5e32309d	0x444a9d5b
-	0x9c5d9ff4	0x6b0ef745	0x248f1f75	0x7d87e2e8
-	0x27490681	0xfc2a7b49	0xd81d2e73	0x76b09294
-	0x4512b27e	0xcd72c2f1	0x41d3ba4f	0xc752688d
-	0xc22a2077	0x45a01ca2	0x82b5ba56	0x9f12c039
-	0x44cc1b0f	0xe8b8353d	0x0c26d80b	0xe54b917e
-	0x62df727e	0xfce091be	0x79ca5f3c	0xec222126
-	0x4df04d01	0xcd7566d0	0x839eb434	0x9b6d3415
-	0x61fda637	0x3549727b	0x44117109	0x9d1c3ed2
-	0x2c3cfce8	0x2e2acd9d	0x4ba9129d	0xbe14efef
-	0x5d07e000	0x2081f339	0x1daf0bc2	0x74d098c3
-	0x301e59a7	0xfd696b42	0xfc4d3387	0xa5c09d3c
-	0xf8b0e4d8	0xadd63e51	0x5815b319	0xec7e8516
-	0xc8d93178	0xdf1b9e1d	0x22107d46	0xa3a99acb
-	0xfffc3859	0xd00561d4	0xb383323f	0xf6b7033a
-	0x90f781a0	0xf5f2ce72	0x6eb3fdf3	0x8cc20a5b
-	0xc97c9c66	0x95135ade	0x24880471	0x9bb65b03
-	0x81b19c7f	0x700d0f5d	0xd13737b5	0x6607133b
-	0xfbe4e7d6	0x3c4f45fe	0xfd6782c1	0x93aa0e29
-	0x5e80ece2	0x16609c87	0x238ba834	0x1ddda4b4
-	0x6d07bef6	0x23422da6	0x034a0e64	0x9fbd2d4d
-	0x29f9bf71	0x009ca5a7	0xf483d433	0xcc5b600b
-	0x6bc292eb	0xbbec5d01	0x3e45ed47	0x1f19013c
-	0x9beb22ac	0xab5e821e	0xa1430d82	0xd88d6684
-	0xf8e70a20	0x4e267714	0x32740299	0xc87b9d0d
-	0x61e7c75a	0x967f007c	0xe1f93f4c	0x11a1c3a5
-	0xbbee7b5f	0xd1ef645f	0x141aba51	0x70694200
-	0x71945636	0xc9dde72f	0xc5955db8	0xdbef5230
-	0xbd17479b	0x53159bd5	0x0878bdc2	0x9fdd9d07
-	0xaf67a519	0xadca8377	0x13841851	0x97f464f6
-	0xea749381	0x47018b36	0x42cfffdb	0x2366f112
-	0xe280757d	0x7426dc87	0xcd5252bc	0xe5bdda7d
-	0xc9728a8e	0x8e08cd82	0x66797c08	0xe1600e06
-	0x149121b9	0xf9ea0e1b	0xc3da0d90	0xde18b684
-	0x0c568801	0x58e83138	0xfe3fe553	0xc52b4e60
-	0xb6afb01c	0x9154fba6	0xddabb2f2	0x018eaeac
-	0x7c9640d4	0x9c7c86dc	0x41b8d514	0x8bd27333
-	0xf07f842e	0xb75e7858	0x990187d3	0x316ef3a6
-	0xfaf22ada	0x95356100	0xd0ed3ad6	0x3d9951bd
-	0xd4aa1b22	0xf3a6ad11	0x797f6e48	0xb2428538
-	0x91466c20	0xf17569d0	0x62d5d1b3	0x5a3d69e4
-	0x6d869d97	0x82a84e5d	0xf6a45cdd	0x8781c19a
-	0x0dac70b8	0xe79a4712	0x4617b8c0	0x3167f846
-	0x9c6e7b77	0xc60b0e08	0xd85879c1	0x2be3a597
-	0x06a6daf1	0x80915697	0xa3452bde	0x9cfd11d6
-	0x69be41f8	0xebcadb24	0x315dcb53	0xc35f3e59
-	0xd5b2edf3	0x443859d5	0x7d54f6a5	0xdcdac118
-	0xe767ecbd	0xd017fb76	0xd0e7b4eb	0x8d9bb8f4
-	0xce7b7d9a	0x92c0b4a2	0xcd5d8e1b	0x6f83d592
-	0xc17f2b68	0x2cdab9c7	0xb6e70484	0xe5fe74c6
-	0xe87747d2	0x228d5a4e	0x9dde03e2	0x9a14ba34
-	0x471229ca	0x69be2353	0x74450c0a	0xd1eb650d
-	0x78501400	0x1c4f2372	0x1fa1b6fb	0xaae57238
-	0xd724663b	0x05f5c43f	0x402bc254	0x68877f3a
-	0x57e6c691	0x0a51ef53	0xb65a2733	0x57431f71
-	0xceb73088	0x03c761af	0xb4542581	0x23933fee
-	0x4d726fc8	0xe6474d89	0x4816a760	0x97f68d6e
-	0xb892a46f	0x1fffcbc0	0x63f9c6a2	0x19ec45f7
-	0xad0f5d1a	0xe1436104	0x02db0bbf	0xa88a4df2
-	0xca060341	0x7bef4581	0xbbfae170	0xedf98d3a
-	0xc3972d10	0xce08a7a5	0xf2554832	0xb22c4280
-	0xf51295a7	0xaafe76f2	0x0503afd6	0xadc0191f
-	0xf788a6a8	0x32dde44d	0x2e148322	0xe4f4dd86
-	0xa8012f5f	0x68950d8e	0x40ba9fb7	0xeff278cb
-	0xf1f29ebb	0x5f273270	0x54db6ab6	0x032c76d6
-	0x28b7a8ba	0xe06ee4ec	0x95b4c36f	0xf895a4bd
-	0x6e886a7b	0x29ca6362	0x5ab44a12	0x122b4b0b
-	0x77542b75	0x4254355b	0x8ba85616	0x78f02722
-	0xad2c32f4	0x7a8b56be	0xda66fe2b	0x1018c515
-	0x8e963b24	0x492cd4fa	0x8e8daa8b	0xbbf9a920
-	0x5e1c170b	0x5b55acbc	0x96a08ca9	0x87628e01
-	0x7daf9cde	0x402b7363	0x704db5b5	0x4ed3e581
-	0x0b76bc99	0xee629701	0x976cfef1	0x222eb820
-	0x1eae4155	0xce2c39a0	0xfc80e3ff	0x46604921
-	0xa6411e39	0xc64f34d4	0xc2506d0d	0x9175c98e
-	0x2b41e939	0x9f612788	0xe84717b2	0xdd5f3d18
-	0x011ccf8c	0xd47c6dbc	0xc42724e4	0x4ecdb867
-	0x88c2fc65	0x7146f321	0x426ce2d0	0x21874594
-	0x94752082	0xac96eef9	0xbfaa8f43	0x4b599929
-	0xc40c67df	0xc2f88319	0x6c13b780	0x0331ddf3
-	0x03141f93	0xc8792b1d	0xa5cbe506	0x68424a36
-	0x35fe7a9b	0xc42db001	0xa2c5e600	0x2e9f8f21
-	0x7733f912	0x24b163b0	0x71003270	0xe5a5c52a
-	0xf08c8455	0x9f6b0203	0xfa048b10	0xfb2ef899
-	0xe9b81eef	0xc5d91db3	0x604bdb10	0x30a2bab3
-	0xbf75341a	0x1609bb55	0xfe4d07ec	0x0ffabee5
-	0xbfb339e1	0xb3f43c0e	0x66cd4d8e	0x752b5a86
-	0x9908cfea	0x237d4b88	0x1e4c78d1	0x41914cb7
-	0xe2d72121	0x815cc67e	0xfbf32db4	0xd4ab50c3
-	0x5b8f8ca4	0xd7f0225d	0x75662558	0xe1586c50
-	0xb9add021	0x1475644f	0x7d4d1e0f	0xb078549d
-	0x64edd4ae	0xe9aa17b1	0xe03324aa	0xad30bdda
-	0x2f27b674	0xf65879fa	0x5b5d7360	0x75905386
-	0xc2ecd3f8	0x373566df	0xb7de23e1	0x91805774
-	0x86162380	0x449b798d	0xaaaa35b5	0x0c72c757
-	0xda4f445f	0xa83096b7	0x86002daf	0x7749832b
-	0xf3a61bab	0x5feb28a1	0x26ee7610	0x5a5c40b6
-	0x42c9ee14	0xc4dbb8b6	0x1f67936a	0xe1b56bbe
-	0xe027f6b9	0xe63fb059	0xc88bc732	0x3111de49
-	0x35c2305a	0xcbf91704	0xbd792b65	0x36de53d2
-	0xe2de429e	0xb90aad73	0xa9f473a4	0xca054a43
-	0xa984faa3	0xe8ddfb62	0xc36104c8	0x95e7e647
-	0x17437e84	0xa20c074f	0xb5609b79	0x468c3b7b
-	0xc0bc3e20	0x368c94fa	0x04ff3519	0x60b01b2e
-	0x4a3ad0b2	0x4d8b4633	0xb1dc5e67	0x7e14c0be
-	0x58a6cde6	0xc88980d9	0xb4ca1c86	0xe17c13bc
-	0x3efb7728	0xadecba18	0x369ab25f	0xcda74fec
-	0xe9c4c6aa	0x55590211	0xbe191ec5	0xed8ffbcd
-	0xea3bd84f	0xe1fde7c5	0x5c788a9f	0x31a7b858
-	0xd65315a8	0x62be6ed6	0x04b8be91	0x73548a2f
-	0x93f9cbe6	0xcae8695c	0xea678c66	0x618251bf
-	0xbe8920fc	0xf4f76833	0x15ad8be7	0x5ccf9cb0
-	0x8d6a4fb9	0xe1a946c0	0x00fe7631	0x6abf0c2a
-	0x72fbb39d	0x72bd5bac	0x7d679c95	0xaa5ccef7
-	0x6df60938	0x9f08de64	0xb13afd73	0x61e2cc19
-	0x31485e10	0x2e125f53	0x74021ab6	0x43fd53f4
-	0xe506757a	0x454bd201	0x84947916	0xc89e453b
-	0xa92324cd	0x3667608a	0x28e2645f	0x17e1f1ad
-	0xa300d261	0xc9662fd3	0x987795f5	0xad6c0302
-	0x55d47cc3	0xe96259cd	0x0d67ce7d	0x07bccb37
-	0xf43d61a5	0xbd7131a5	0x686bdc7f	0xd570d5e4
-	0x9ff9331a	0xac9d1d6e	0xa1702a68	0x4a5775b9
-	0xa5624641	0xf65bd241	0x2ac16f90	0xe3413b5a
-	0x17ffa019	0x9d46dc7a	0x2a3081b6	0x857ce29e
-	0xe6640ac4	0x6445b538	0xad3d7e1c	0x9b79c366
-	0xf462361f	0xd1097ef6	0xca1c68f6	0xb5f30167
-	0xc14a23d8	0xc10dcd22	0x2a2fc332	0xfb253533
-	0x65fdf0b5	0x404b7ad8	0xa9ba6f4d	0xaba569c0
-	0xbaa52473	0x0e4627a8	0xc5f59463	0x362e6c4e
-	0x4b2a486d	0x0259c34b	0x28c473f1	0x503bb776
-	0xc5c0c537	0xa8b225c1	0xeea3c262	0x576dd495
-	0x571ada41	0x9f7cd0c7	0xd7496acd	0x05feea00
-	0x41201b9e	0xc77a94fc	0xe9bbcdcb	0x57b23f11
-	0x0804834e	0xd03b6bc7	0x01010b7e	0x1398ab11
-	0x16c14655	0x3c6e5e32	0x420bcbd9	0x8047a032
-	0xf70c4e5e	0x2a3e76ac	0xedd3223c	0xbbba8d71
-	0xba2a9916	0x1b83f930	0x4c93f25b	0x79731cc9
-	0x77925eaa	0xb2fee6dd	0x01f12a1b	0xd797d09f
-	0x1d63619b	0x2b04daaf	0xcaa55fcd	0xc4628c52
-	0x930f5701	0x0293b2d8	0x00e82920	0x3c4f3f60
-	0x6c0990ea	0xec07864f	0xfd650432	0x5bdb68df
-	0x9d138863	0x2a06928c	0xe0f69d3e	0x5310dae5
-	0x5bd2c0a7	0x775d764f	0xd8aadd14	0x20ba7850
-	0x358aabd2	0x192ce2f0	0xfe029fcb	0x9a787089
-	0x032bd81a	0x2033745b	0x11b36de7	0x38e63443
-	0x26a6a138	0xfe1b4cf0	0x8e8c2e54	0xd8d68982
-	0x1f8bfd73	0x11132e4d	0x217497b3	0xa882ae2a
-	0x895350e6	0x58042447	0x027e3513	0x9b23ecfd
-	0x0368bfc8	0x1f2bb5be	0xe81d1738	0x69176a5d
-	0xb4e0531d	0xc899b145	0x9fd09aef	0xabf6b854
-	0x2f1856dc	0x4186e028	0x02aab53b	0x0231c01f
-	0x543d0d94	0xbc207922	0xef61da69	0xe1056724
-	0x67fd8072	0xc98426e2	0xc7635142	0xff184885
-	0x653f91f3	0x1ab5cd1d	0x133df7d9	0x67b35000
-	0xb5880c56	0x21e4c4b3	0x6773270c	0x1c30a75d
-	0x360b8cbd	0x0efa143e	0x025c298e	0x8bea4b71
-	0x903465e9	0x99521cf4	0x2e1857e7	0x13266774
-	0x72f6d2f6	0x36a1a4fc	0xf0e38e70	0xc9d613d7
-	0x765b045c	0x28ea90e7	0x99766fb3	0xcdb93ca8
-	0x4ef82ae9	0xfa083dbb	0x280d6bc6	0x5fa6f9f4
-	0x8232c95e	0xe899ae64	0x9757bcb7	0x7b9a3fbf
-	0x7ee59763	0x707c1e8f	0xb09b26cf	0x39b130f4
-	0x57b13cca	0x9431c3bc	0x03074f78	0x77108240
-	0x2243cf2e	0x79f1c09b	0x2d7051d7	0x1e896e0e
-	0xfca3c98a	0x033f9d17	0x8a84fa5f	0x54ef6d59
-	0xea4f038d	0x37de0f3a	0x290fdf6d	0x87a99d3f
-	0x03539027	0x423a6a72	0x1751d4ef	0x3307e618
-	0xff81f836	0xeff8f63b	0x5fd7f014	0x5d2a7e84
-	0x9bb1c22a	0xd90f6902	0x53594d40	0x2a06777c
-	0xbfb045d9	0x3a994642	0x5d3bb1c9	0x92ebe0c2
-	0x1351d163	0x1d164e51	0x646facf6	0x5a09577c
-	0x1d67f8e2	0x5857aedf	0x4325f877	0x40b104d9
-	0x417b2244	0x944a7154	0x46887db2	0x8e5c72f6
-	0xb1e4105d	0xe23955a6	0x32c458f7	0xc5b0adfc
-	0x45b48308	0xccde9154	0xa84cfc72	0xc4f67710
-	0x19a5d6c9	0x18feea83	0xf731b3f5	0xd26e63c9
-	0x3869ef48	0x70b962d6	0x5f2b4ba3	0x5dd5a9c3
-	0x1efc97a6	0x09be830d	0x791d72d3	0x53f2948a
-	0xf5bdc706	0xa5b6aeb0	0x6c35db0e	0xc312c33b
-	0x6dca7a95	0x9f890aae	0x75308dfd	0x7de2239b
-	0xf530420c	0xe085f9b7	0x2d48c359	0xa8d1fcef
-	0xcb3f9669	0xdf491f38	0xc59ffdd0	0x995cda92
-	0xdef37f3b	0xe056b574	0x676eafd4	0xd4bd9336
-	0xda3ada02	0x290cf756	0x991efdaf	0x2f70baa2
-	0x515ced1a	0xaa0fa199	0x77f09ee0	0xafc3d840
-	0x79e5ada0	0x7900a254	0x4ca65cb7	0xb3eaba8f
-	0x98cd17e0	0xe179d477	0xe80d2f39	0xd89f3b4c
-	0x8d3ca0dd	0xd1d87ab1	0xf9368d54	0xe885ded8
-	0xd500c7f7	0x04910374	0x7c6467be	0x5ad058ce
-	0x5f8885b8	0x08a4a3c9	0x90583a94	0x369f4c36
-	0xafbd90a9	0x6eec8300	0x1fd17777	0xaa8ba562
-	0x24531969	0x64eae352	0x6f7e72c5	0xca5e2247
-	0xee11333d	0x4e96b233	0xcc9c45db	0x377d9b3b
-	0xac17897f	0x8d4f2cf7	0x03786608	0x2ed70cb9
-	0xabb521fc	0x27ae8324	0x99fedf05	0xfa60f2f4
-	0x60fe2470	0xd9994193	0xce4a1f0c	0xdf803250
-	0x7773e538	0xe3461726	0x8f1fb31a	0xe20b4ba0
-	0x247a6bd0	0x33f33c29	0x0534675d	0x9df47ebd
-	0xcb86d416	0xfca6bde0	0xc2113e28	0xac64d376
-	0xd34923e0	0x128f937c	0xc74b76b6	0xb653872c
-	0x05c78e23	0x482ece1a	0x17cd4da8	0x460f5a20
-	0xa9a3676e	0x0776830a	0x9c5764a5	0x7c0bf0f2
-	0xe193d4be	0x31b71120	0x4beed8fe	0x8426bc77
-	0x9f665f9d	0x4e2b00be	0x2dd365af	0x015f5889
-	0x92bd288b	0x4bda3b7a	0xeb2b0605	0xaadc6a84
-	0xf715172f	0x1b0fdedf	0x17ccd242	0xd511eab2
-	0x75829b1c	0x0f5861b7	0x229338cb	0xcad5ac0d
-	0x95ed8bb9	0xe719c62b	0x2e50c781	0x40492cc9
-	0x7ac3e8c2	0x4881bef1	0x8359b0a8	0xd0a8713e
-	0x3808db04	0x847e12f9	0xd28ee5b2	0xc77f7a81
-	0x2e89e5ae	0x95296641	0x55f44a6a	0x22c16d11
-	0x1fa9d5ec	0x3b131a56	0x6b113976	0x057616a9
-	0xf4813132	0x003fbe23	0x082a9ff4	0xd0db4d18
-	0x84be1702	0xc9c51278	0x9f5bc62e	0x5691be5d
-	0xc12f7c79	0xa84f8dc9	0xa9b2b8db	0x0ab996e3
-	0xd25a2195	0x91584ae2	0x11e0a407	0x9faf14ef
-	0x7ecf8b2d	0x64d1b392	0x8292b54e	0xaec7c7d8
-	0xedf1eec6	0x9164a0a8	0x16132244	0x07077758
-	0x32f53095	0x8036d28b	0x5534fa23	0x66869c3f
-	0x3a503595	0x87706388	0x315540f8	0x5348f0c9
-	0xfbe7451a	0x491d7c96	0xa70ad473	0x5d7975c1
-	0xa51c99b0	0xdc0320d8	0x259a0935	0xf15dee76
-	0xb080d4bc	0x1d8611f7	0x64b6c12d	0x115bb158
-	0x1ae6f885	0x9b7bddbb	0x74107ba0	0x5ec2433f
-	0xc05198b8	0x4e3921cc	0xf866e4ee	0xdf4e5b52
-	0x93dc0bfc	0x9f5957eb	0xffebb962	0xb2845803
-	0xf16acbdf	0xda0923e7	0x2b7d8663	0xeef7ea5e
-	0x5c468035	0x1bf5eeb4	0xcf04aad0	0xa898340b
-	0x58f32310	0x6502901b	0x151e45a6	0x4e0a8176
-	0x312d5e40	0xb0a82dd9	0x7461f194	0x5d955cc7
-	0xbc26c368	0x26cc45a5	0xfff346fb	0xcdbdad82
-	0x1f0da6e7	0x6800be4d	0x931a3413	0xd471a14a
-	0x773ade46	0x525f8a29	0x416f7b22	0x75c2b0cd
-	0x5abe1934	0xbb87502d	0xb1568281	0x95c1abf6
-	0x491971cc	0xbac11423	0x0daf5cfb	0xb5e37509
-	0x2eb36341	0x1784cff3	0xdcebc5df	0xdb10122f
-	0xbbed7029	0xb7b66506	0x2b732807	0xb5524662
-	0x37c211d4	0x0730df05	0xe09e9822	0xd6910951
-	0xc6ed46f2	0xfc7d7cd6	0x8d6af74d	0x4697b13d
-	0x7959b678	0x9c67c19e	0x96686e89	0x7f973e98
-	0xe5759786	0x42ba4801	0x05416f70	0x87a85c5e
-	0x8f21af39	0xc64ce827	0xf658f857	0x3b75a282
-	0xf6813344	0x0e9adb2c	0x46ca59b3	0x2f2c4fd5
-	0x1a7ee3ef	0x1e3202ce	0xc4135b57	0x22792d11
-	0xe399a044	0x9453c580	0x639da579	0x80239655
-	0xb1b68953	0xbd677cce	0x9163a0fd	0x766c5b7e
-	0x46ed281d	0x99ec91f2	0x7db3499c	0xbf2b9793
-	0xb111887d	0x3906e075	0x9e211f1c	0x16f15768
-	0xd27474c3	0x8813b27a	0x3393ce5a	0xe73aeee6
-	0xfe056806	0xfe4bf0fa	0xe106529b	0x317d9099
-	0xd2ad43c4	0xbd618f1f	0x77d8e13f	0xd4c10bc0
-	0x30a335fe	0xd7a4b251	0x84c67582	0x1bc0723e
-	0x7a1cded2	0xf6664fce	0x2bd8c844	0x967cc741
-	0x8cb6bf8e	0xb8c49dd9	0xc167221d	0x5c65b9b7
-	0x1f32b243	0x5729b02f	0x76f22a55	0x22ef22f7
-	0xabcde168	0x273b0513	0xb8cc1b47	0xf0e378e7
-	0xc3e189b3	0x344090c4	0x3cac2fc3	0x2a06749a
-	0xb026617d	0x26bbe774	0xb15d08d3	0x6b29e7ed
-	0x34b5145f	0x740f6f69	0x7edb95a3	0xf55df95f
-	0x25061c1e	0x45192d2e	0xdef6bb9a	0x5538188a
-	0x2f7ff744	0x6592e57e	0xdfc302eb	0x8564f70a
-	0x81f22fc6	0x1ed3f7b7	0x3eb74e98	0x84ff649b
-	0x40535223	0xa81996a5	0xb30b0b97	0x9ca701de
-	0x45bd91f2	0x07e94e32	0xb2f60f7f	0xc3d68aec
-	0x2296450f	0x31567179	0x5fa15060	0x6ade7193
-	0x7ca6e320	0xb231f34c	0x1e392751	0x3fb50014
-	0xff632467	0xff33f75b	0x65f2dcdf	0xfa464ff7
-	0x1ffd17ab	0x34c38154	0x72906efc	0x2f649bd5
-	0x5349c835	0x6c83e7da	0x9e0ff921	0xf2ad6dd4
-	0x5afa8581	0x2d6deedc	0xf582ce84	0xda7ddfa8
-	0x6485db26	0x874585e9	0x13bbb0a1	0x4283bb8d
-	0x1648cc58	0x69fae5da	0xa5d7bc2c	0xd7fce256
-	0xc2e25ab7	0x7ec604af	0x1efde306	0x36422ec5
-	0x78e9bd5d	0xbfa63459	0x052efdbd	0xfbc9d2eb
-	0xd8b729ee	0x888dfd1b	0xb64a687f	0x9ebd05b2
-	0x622c28ed	0x3801fff8	0x476285e1	0x262e5f3d
-	0xd6ba77c4	0x8d5663fe	0x4b9bb3c5	0x1909dfb2
-	0x40db7079	0x2799a10d	0x1e2e55a7	0xe597551f
-	0x4d38f913	0x972b1b35	0x92f77eb6	0xb2dcdb5e
-	0xe275428e	0x0f136b53	0x321b55ba	0x70f7edf1
-	0xc41fe047	0x332e9ff5	0x3c372115	0x2ea1c88d
-	0x3ea09444	0xe93066a0	0x666670f5	0xee9553d0
-	0xa817ee82	0xde3fd981	0xf6c5b2b7	0xe88e3857
-	0xec60b610	0x4b0e1af7	0xceaa144f	0x0a8f8703
-	0xd7969cd7	0x0a946a3a	0xc6f77ae4	0x3805f71d
-	0xd5d56360	0xbee37cf5	0xfa524a3b	0x68ba0662
-	0xdf153cee	0x5954f21a	0x05aedb31	0x340e4963
-	0x129115db	0x271db9a2	0x70984fa6	0x7daf0407
-	0x5fcd11d1	0x750f56c1	0xf1a93401	0x3a3aca1a
-	0x8a6d152e	0x9c65e58d	0xf0afd845	0x3abef6ea
-	0xe6e1ff7e	0xf8407d49	0x45dea271	0x545631ca
-	0x73fad7df	0x21e60e47	0x3bd83fd5	0x12b4394e
-	0xba4731b1	0x786279a0	0x97c6d6ab	0x2591deb2
-	0x4b33bf75	0x772fb5bf	0xe9060fd5	0x6a752986
-	0xdf3090d4	0x9de70555	0x471c2e4d	0x5305f077
-	0xf2bdabad	0x2a4ed093	0x36e029a8	0x17b7a5b1
-	0xce75a688	0x8377b839	0x731fa872	0x63f45ed1
-	0x010bdd8c	0x4366cba1	0xd899b1b2	0x839a8a34
-	0x4914176e	0x58fec42f	0xb3ecd171	0xa88b5247
-	0xbfecbafb	0x65962301	0x7b5a7822	0x08b1056f
-	0x6f0cf6b5	0x5dbe0084	0x3280b172	0xc77913e4
-	0xa298f67e	0x2131f5c2	0xb9b9b501	0x7f30b7ef
-	0x55d8cdb6	0x3b0c0dde	0xbf9a5cb6	0x50ba39ab
-	0x0741872a	0x69217ea4	0xad4b12ca	0x14dd5da0
-	0x5d220b6b	0x9d0356b5	0x9608d36a	0xdef765ca
-	0x7d55819c	0xb57ca102	0x9f2a2c76	0x5efc9c7d
-	0x42952b33	0xc8e2749b	0x2eff7d6b	0x211caa64
-	0xec846e0c	0xf3119325	0x31bf7f1d	0x984fadb5
-	0x36670140	0x6419ae9a	0x1c206656	0x86cb7d35
-	0xbd323508	0x5f970165	0x21777792	0xc8808541
-	0xecba85e0	0x0b4b3240	0xa70d8609	0xc68913f2
-	0x67415bba	0x26af0069	0x81974b27	0x92066952
-	0x5f6aa2e7	0x0dfa50b9	0xc1e65cad	0xb93b9d66
-	0xad6c8ff8	0x8e885310	0x5f77e1eb	0x2dccb750
-	0x8f18f33a	0x6ad45207	0x921285f5	0xf3d2d3ab
-	0x1be2996f	0x9bc30897	0xc7c85614	0xce88b0ca
-	0x55a5fec7	0x0570e871	0x50cd5f3b	0xb723a9a4
-	0x8c2f6fd8	0x3a0bfcc5	0x0b75181c	0xe595e483
-	0x063a7f01	0x16984414	0x9c74253c	0xd9627dee
-	0x0b8aa93f	0xef9f3c7e	0x186719dd	0xb0311955
-	0x4ffcf417	0x519b631c	0x295cb456	0x58494234
-	0x81ebafc8	0x02002fdc	0xb28044e7	0x2682e878
-	0xb86f281b	0x108f9c77	0x99368ca5	0x24887533
-	0x37676f0e	0x71230faf	0x8e689144	0x81bbe972
-	0xc8dbab68	0xca5a3ed9	0x878d622c	0x05217a5b
-	0x7ce7e849	0x0416578f	0xc43b026a	0x86abc8bd
-	0xf0fdc5dd	0x1684665c	0xf167d783	0x00d58f21
-	0xb4929559	0x70572ce4	0xbfe6985c	0x051bdcce
-	0xa9307ffe	0x2fa9902c	0xd8f76dbc	0x6dcd4744
-	0xecb46877	0x18ac0a40	0x6f8a8064	0x66dff5e2
-	0xa55d991a	0xfcd7e70b	0xad9c7fd7	0xb77415a6
-	0x761134a9	0xa76e4079	0xe9ca8a5f	0xdb627ec1
-	0x328cd5a8	0xc3f378c6	0x7f5ae9a2	0x5a144e26
-	0xc4b778f8	0x1910215f	0x1d29a078	0x728c7575
-	0xc2017bc9	0x201a0601	0xea1e939b	0x7ed85f43
-	0x92893ace	0xb97613d5	0xa3e47eb1	0xaea2a6b7
-	0x45b4de8e	0x864e3d12	0x300eb84b	0x57246fa1
-	0xf9e50600	0xc5fb68af	0xff700271	0x4ecfe6df
-	0x195f3f4e	0x9bdcfa8b	0x1bcca506	0x0ee96e1e
-	0x4d722003	0xe6ffe15a	0xc3a392d5	0xedc4ea2f
-	0x1cc2bc4e	0xf133ded3	0x584bcee5	0x63e54048
-	0x34f57fa2	0xe606b846	0x82dece0c	0x7bc24217
-	0xf45b9ac3	0xd9949991	0xbc262aef	0x7949bbec
-	0xf37e0563	0x716bdca0	0xef533f5b	0xfa53b4e0
-	0x97365a61	0xbf4cd291	0xc69c9c3f	0xb5ddd420
-	0x92a65067	0x4a63f3ce	0xf53104a3	0x0053fca8
-	0xb8f972b1	0x7eb74704	0x2bc2ef35	0x491b520f
-	0x80f67bbe	0xd36fc91a	0x8babbc98	0xdd3aa4a7
-	0x1005ace4	0xafe0a165	0x921ee005	0x9d05e888
-	0x4e7913ee	0x43690cb8	0x634c75a1	0xf2ca1d08
-	0x6f453485	0x1a62b5f4	0x692608a8	0x76837c9a
-	0x222f6cb2	0xbc883372	0xc785ebf7	0x21b16a27
-	0x5ad7860b	0xd5fec2ec	0xa573aead	0x9c0bd90b
-	0xec3b5d8d	0x393a1263	0xd0cddd05	0x08477829
-	0xd4bb3080	0xd1580e80	0x614e8dae	0x7e789a32
-	0x273b2589	0xe5368d97	0x8db1b602	0xbd06492d
-	0x6760aca0	0xee176a78	0xce44021c	0x4d35c720
-	0xcc3d8185	0x752005a2	0xffdb4703	0xf01771b1
-	0xfccc8abf	0xadca3bbc	0x2c2a4739	0x970d0fb8
-	0xa829ca54	0xc4301da7	0xa56d3181	0x24a95701
-	0xb760d1ee	0xea87f071	0xfabc32df	0x465f142e
-	0xe0998f0c	0x6923edf6	0x3a1debda	0x3e88908d
-	0x7069f55a	0x0cd61367	0x1218e044	0x99713258
-	0xbb60c477	0xe3997857	0xc4e9ca48	0x4be6b283
-	0x1bde70e0	0xb0f3e15d	0x40cfb11c	0xbb9e0879
-	0xc4c732e7	0x2aa169d3	0xa2bff233	0xaa50e35c
-	0x2d0989e3	0x6f39a59d	0x7a7b69c5	0xe66152bb
-	0x69c74ec0	0x46ea7bc3	0x59c93af6	0x0a036f99
-	0x95698244	0xe0ca1af8	0x3565483c	0x8abcce28
-	0x6b322770	0x188e97b6	0x77874604	0x93298d36
-	0xbc4a0f5e	0xbf367940	0xf69906ef	0xf2b5975b
-	0x5968ec40	0xd0e75276	0xdf02b089	0x60b72248
-	0x32de1e9a	0xe52bb0f9	0xf4b33702	0x87b4cd47
-	0x31c86ac5	0x77106507	0x20ec46fd	0x5086dc0a
-	0xadce33fc	0x898ee47a	0x3c6f8af9	0xb4a26000
-	0x8f11d65b	0xf83d2284	0xe512bf22	0x24a7d8af
-	0x12b194cd	0xa530f50a	0x1f64f621	0x6160f047
-	0x8f223c99	0xc7e0809f	0x99312a95	0x5c729b2b
-	0x4af6e5b7	0x8c6e5da4	0x93a07403	0x89fb2a5d
-	0xeb347cfb	0x0d127850	0xc3278db5	0x456e3472
-	0x731c2b96	0x841ed8d1	0x5ed8671a	0x16814226
-	0x4cc3932a	0x556b1403	0xc8547260	0x52340a36
-	0x78b8243c	0x9ce3ac1e	0x997c64d4	0x25812f0d
-	0x5cd3b82f	0xaefcd02b	0xda85628a	0x3b9e3e2d
-	0x4780e91b	0xbb265ae9	0x4667a62e	0x7fde4743
-	0xae2d2c8a	0xbdf272d6	0x490e5bf1	0x8f764531
-	0x59a8ca61	0xc39751a0	0x9777eddb	0xc89da92e
-	0xfd46b968	0xd5383421	0x916ced6c	0x9fc14c5e
-	0x91ff992e	0xd59cd577	0xf5cdda19	0x99ed4f29
-	0xea30d84d	0x868bb72d	0xcd3e19d8	0xefba277e
-	0x9b895f2b	0xb67570ae	0x7b963bfb	0xb7f59d33
-	0xc82c0da2	0x713c0ebc	0xd2e19b6d	0xfdd7cb4f
-	0x0442a88d	0x58e2e7e8	0x7b179f2b	0x12013442
-	0xbbd1c2d1	0xc4e7d279	0xddb4cd95	0x18a254ad
-	0xb2876346	0x4bdca7ab	0x94dc9778	0xb648e703
-	0xeed00eb6	0xab02dd6b	0x3e25115d	0x45cedb33
-	0x906c2403	0x457849ca	0xfea6f2d9	0x252fb56e
-	0x2bbe39b4	0xa35c94e8	0x04952551	0xad733a12
-	0x40bf3982	0x30cb3742	0xd6c149da	0xb6d29f20
-	0x9df8b8eb	0x706065f5	0xfa915b7f	0xd2bdc0ca
-	0x0a4c462a	0x288ef8ee	0x2fa27cdb	0xea11b73f
-	0x5e909f42	0x06d764f5	0x1e2deaaa	0xfae5dbe8
-	0x0ec720a8	0x8fd675b6	0x58ee95de	0x19fd1ca4
-	0x4308d173	0x1884c251	0x56ffe45e	0x961c6bdc
-	0x44582512	0xb76a958a	0x12cdc33f	0xdee5c784
-	0x8dbbe9fb	0xe327f532	0xefb271ca	0xedecdca5
-	0x798e60f3	0xcf2d194a	0xee275fd0	0xd8fe6f12
-	0x30ce7bd8	0x3e17e29e	0x351ec4bf	0xe23692ac
-	0x0bb60ab1	0x60818dc2	0xdfaea801	0x1afe161f
-	0x72fbcb53	0x9382e661	0x56054fdf	0xe6261b4b
-	0x97e746c7	0x6257411b	0xf0bbac9d	0x8fd6478e
-	0x203e690f	0x9758da43	0xef6ede77	0xe85fc9e5
-	0x8e5315ed	0x479c6f9a	0xeceaa8b8	0x4f626f85
-	0xe79c2ead	0x14e97f8c	0x2bb51ff0	0x6b733645
-	0x9e578a09	0xcf424ddc	0xb315bb19	0xc4833717
-	0x3890ca82	0xf00aa52d	0x9e652f98	0x87ea3177
-	0x7acc6baa	0x531c5eb4	0x6a85b1f5	0x7b1c0192
-	0x0b32c8d7	0x735c5791	0x86c1ebc4	0xa4361511
-	0x0c7bce26	0x1357809c	0xa382b877	0xa4f9a0ed
-	0xca30e907	0x277d3c65	0xec0bba64	0xf5169aa9
-	0xb8a1305b	0xbb4059a3	0xa44d32ca	0x76b0141b
-	0x7bacc1c2	0x51273c1c	0xf8f4d7af	0x0278678d
-	0x04d36367	0x38ed7b1e	0x8a45327a	0xdd19324f
-	0x36a5952f	0x97661f43	0xe2671856	0x1eb34493
-	0x8708de21	0x080f9e7d	0x070d13a0	0x2c54a64f
-	0x86ef2751	0xf83a87e8	0xf61841fa	0x0ade1426
-	0xe1cca086	0x96a9a439	0x648f53e0	0x378a6cf4
-	0x894a3c7d	0x9bf1031a	0x2f0affd0	0x4688048d
-	0xec159b64	0x28b103ac	0x462767a5	0x278ac30f
-	0x3e5bf100	0xdd860ac2	0x384e9dea	0x55abe65b
-	0xbc95d098	0x905277bd	0x8b47e264	0xf4cc82c5
-	0x8f06e7ef	0xf2fb2364	0x13f70c45	0xc5eb083c
-	0x6c4ee92e	0xb2f7719c	0x19883212	0x611f22c8
-	0x8c742ec0	0x1550089f	0xc6c5933d	0x1a6aab8a
-	0x27ac73c0	0x4b8be65d	0x25c17a0f	0xd1ee7238
-	0x54a47bdf	0x9bf2d8e7	0x223873f1	0xb0825f98
-	0x6263a6a5	0x6e732bde	0xcb2460bc	0x195b6758
-	0x74eab2c0	0x10509c33	0xad5153c2	0xa9c77d09
-	0x5581bc9e	0xe85a2906	0x19ecd606	0x22d04481
-	0x2acc285c	0x4b01bec7	0x7946efc4	0x3fcc4f9b
-	0x7711e2ba	0x769501b9	0x565ed3a5	0xa6a2e0c2
-	0x2fc9f212	0x1da1dc7f	0x1e354a51	0x42f070bf
-	0x96f603fe	0xa11ea899	0xefa65c44	0x309f3b3d
-	0xa4e7de23	0x0fc0ecf0	0xed135d01	0x11526284
-	0xe1535798	0x46236948	0xbbf375f3	0x33d03953
-	0x057340ac	0x1f8d08bd	0xd3e19b4a	0xd1a074e8
-	0xe8f7b3c1	0x81f4e7cc	0x7efb3ce4	0x2d7b8dfe
-	0xc35c1b7d	0xa981b243	0x56dc3df2	0x7b0cdd73
-	0xba20923b	0xe4469620	0x9999a05a	0xd558e6c9
-	0x1b2a6e34	0x1a03ad40	0xead427a9	0xdfbdf1ea
-	0xe9b9c758	0xe1ce3e74	0x2ee3013c	0x37fde647
-	0x7528f451	0xdb169663	0xc1595963	0x487703e0
-	0x649824fc	0xf4e557c4	0x26ff0cfb	0xa6c61495
-	0xbf6ff8a8	0x1e936c2f	0x28170318	0x16623623
-	0x7cf43aa9	0xcf44b9bd	0xee05bbe9	0xbc364396
-	0xfac9c35a	0x70664227	0x4200bc74	0xc847c1f3
-	0x393b52cf	0x67df2a37	0x24828663	0x85c64437
-	0x0ca91fc4	0xbbab8588	0x170d40ec	0x6a5270d7
-	0xd873cb99	0xc461e41e	0x68fb5dcb	0x175808d3
-	0xb3c75d6c	0x5f8659a3	0x164af2cd	0x491ed225
-	0x21b774d4	0xfc5f44e0	0x5a761165	0x8394b784
-	0xa3625993	0x23db8229	0x18adfc19	0x7a86dcaa
-	0x3759a419	0x8236b6a0	0x866eb76b	0x40e3936d
-	0xa327f573	0x0793a949	0x5511fbac	0x7aa8017a
-	0x869d2433	0x9fb80368	0xd9b8d14a	0x725f0a17
-	0x50ec0c4d	0xeb8bd3bb	0x6785d7c0	0x9882836f
-	0x0c164e65	0xa7ff708a	0x3f4b7ded	0x160237e4
-	0xfa551105	0x7dfeb41d	0xf60157d5	0xf863bb00
-	0x23d96b49	0xc8b80eea	0xd395a7bb	0xa6cb0b99
-	0xdae2d53e	0x374d5699	0xede8a731	0x64e2eb82
-	0x3aaffc9a	0x03da3d18	0x775890e8	0x3842a94c
-	0x863c3914	0x4cf8cc03	0xc40d3d2c	0xb5514333
-	0x1254c457	0xae791759	0x7eebf7c4	0xcaac9331
-	0xb3f9a144	0xf9430aa4	0xc241038c	0x7b481099
-	0x6ffaf560	0x504946d2	0x5ad1fb41	0x4c4ed169
-	0x1331c934	0xfc02efaa	0x519b65e5	0xa2eb152b
-	0xe3b78626	0xf6cc1ce2	0xaba6d9c6	0x6c117767
-	0x3ba1a970	0xab320fb2	0xa17ae6c9	0x07f8b830
-	0x1752f87c	0xcadd1616	0x81229b18	0xb8f1c91b
-	0xf62e10f9	0x40fb1a82	0x6feed0ca	0x375b3f31
-	0xcc951ee2	0xdbbc0a84	0xc3caf9d9	0x51e4f7e2
-	0x6c2cc2da	0x86994a97	0x58516036	0xa680e1ff
-	0x83255438	0xe304daf0	0xabf95c4b	0xeeecb868
-	0xf258ca56	0xc63b1f45	0xe4637c07	0x4bd8052a
-	0x01515dbd	0xa3d3dca6	0x79565fed	0x0427abda
-	0xeb640f00	0x4f34d441	0x135af3a0	0xad86ce4d
-	0x83daca30	0xd9ae59ab	0xad9edd9a	0xbb18a84d
-	0x9163b7ae	0x68c45613	0x4eeb7297	0x12c0aa50
-	0x0003968c	0xb872a623	0xa39b33c0	0x4c934155
-	0x658bcce4	0xfa7c8c07	0x062681c6	0xd091dce3
-	0x6b421cf0	0x726aae92	0x623e4f88	0xd74b50b4
-	0x0a6410e7	0xe6158980	0x2956f74c	0x5e18c87c
-	0x6fd6e24d	0x8afdf654	0x928a859a	0x55edce30
-	0x63a859ef	0x4b82ee8c	0x6eda25a4	0xf8b32d44
-	0xdc47b7f0	0x5ff1c6d3	0x8ec85752	0xfbcddc99
-	0x86b90e33	0xe9fe679e	0xf6933cee	0x7054cf99
-	0x7fca8ff3	0x06bbad7c	0x1a5a6f2f	0x1effefd9
-	0x1aae25a8	0xc594864f	0x8df29cf4	0x373b22ee
-	0xfd7cc798	0x2d3018a5	0x31806f07	0xaeadce1e
-	0x9eb56db2	0x997e6a02	0x3f6ad090	0x8d13dedf
-	0x6fb3b150	0xbd15fe3c	0x35b6e654	0xfd9cda44
-	0x77864119	0x7ab48f53	0xf0cf2f91	0x16c955fe
-	0x06ae6500	0x11969961	0xcf4c27cc	0xe0500cae
-	0x361b4f0a	0x95eafe71	0x9ec8e2a0	0xafd6afe8
-	0x424b6b80	0x4b2e1810	0x3b474219	0x142aea44
-	0xf3654186	0x3ba86c0b	0x833f65c2	0x6d47eb79
-	0x62dd2140	0xd94a70fb	0x8ca1614f	0xaf4b2f5a
-	0x49a94d86	0xd1bcf8ff	0x75758118	0x4d249643
-	0x1998d0e3	0x9138a5d2	0x25c3285d	0x94aff0c3
-	0xa3b5228a	0xd19437b7	0xef21e585	0x1b7e4f3c
-	0xd641981d	0xb402e718	0x864429c0	0xdea501be
-	0x106824bd	0xfa029c7e	0x24d7c5b1	0x392faf14
-	0xc6d34b80	0xcdae7248	0x8fcda2d8	0x4ea47d55
-	0x6159a07e	0x7321230e	0x898acb28	0x1ee768ef
-	0x18d5b5ce	0xad651352	0xcdb1b265	0x51344650
-	0xac50b615	0xe63a8384	0x80662716	0x82a18a79
-	0xa5a7efaa	0x7a145b9c	0x849e7f01	0x6798d58b
-	0x040590b7	0xc5ea38e3	0xc801c79c	0xbb195537
-	0x928bbb0c	0x38dbcc6c	0x78392d00	0x7a1ab99a
-	0x7ab11689	0x5da16626	0x01fc4fc1	0x73aaf369
-	0x4ae39f8f	0x5615a7a3	0x973313fa	0xc7ad9ba8
-	0xd58a9805	0xf600d196	0x2acf7e8a	0xa9781219
-	0x2f60bfd1	0x73dd49ed	0x08e92462	0x7c088af6
-	0xc0ec767b	0x813d1a47	0xc854915f	0x38c19883
-	0x3d68948b	0x37013904	0x7d673d86	0x9a347e46
-	0x89b64816	0xe2eea157	0x9c9e7b43	0x88894832
-	0x4e420ce2	0xff8ca9a2	0xc152fd87	0xfb407682
-	0xe2808404	0x4c386f6e	0x053cd949	0x08f55f48
-	0xf89b7624	0x37e43a08	0xf9bc62ae	0xa6d76f51
-	0x4e400425	0xda181f10	0xad190c86	0x6952cd23
-	0x1c1fc245	0x44d3449b	0x2383b865	0xfe9bb854
-	0x745990c5	0x34be0541	0x3ec0104d	0xda80eb99
-	0xf0b3f266	0x29caf9a7	0xf4ff713b	0xebd3c95c
-	0x1b2223d9	0x14809a4b	0xde8ecf29	0x2140f249
-	0x9da938f4	0x5376618d	0x45e1c6b9	0xcde4cb9b
-	0x1dad65a2	0x47567cc3	0x285f8145	0x080df22d
-	0x61f570bd	0x54c91058	0x597a3472	0x4e2199a7
-	0x54bc0b43	0xbbe1df4b	0xdf0843a0	0x007ffa70
-	0x44a969ce	0x2b10aaad	0x337ffb08	0xd176496c
-	0xe89a0d63	0x953fb0c5	0xc3cfcb1c	0x92a96ea5
-	0xbde759f4	0x497e8adf	0xad8b516c	0xfb6967f2
-	0xdc9031a4	0x6a200ab4	0xd93f8951	0x28e22ade
-	0xf54c1c4d	0x8b6325f0	0xa7946fbb	0x76ed4a4d
-	0x6b808dd2	0x86634406	0xa5044ca5	0xe0d0591a
-	0xd817455d	0xc00d1daa	0xc7c40850	0xe2e025fd
-	0x74ba9bad	0x550c236d	0x29b44966	0xdcbd8276
-	0xc4b6586d	0xb1702e0f	0xaebf15a6	0x7d2f1cd7
-	0x9ccc8b24	0xd2fe8842	0x1fe70488	0xffe89b22
-	0x7600ef41	0x75569ee5	0x89f065c0	0xda8d0c8b
-	0x27296329	0x99241565	0x611cc8c9	0xc67415f1
-	0xf0cf41fb	0x38f066ea	0xc13dff67	0xbc04723e
-	0x8f6f8db7	0x94821abe	0x45a5c57a	0x0c3c2474
-	0xd80aa358	0xf95e1874	0xaf4258aa	0x325f2c1d
-	0xcb15342c	0x40d77acf	0xefad72fd	0xb154345e
-	0x9584df00	0xd0712387	0x6d7d329b	0x8c8ff2eb
-	0xebd94378	0x8b0bae9d	0xeecd6bc3	0x529a6a69
-	0x797edc8f	0x4845ef9f	0xa0d083f8	0x14cd8c0b
-	0x775ef704	0x1f83b4f0	0x0047afdf	0xebf6dd6f
-	0xad0a5557	0x9a9beed1	0x9784c839	0xc5fb7640
-	0xe0b3993c	0xaaf9fee0	0x59976746	0x79e0674a
-	0x82b5ffca	0x608e4a56	0xdb81df21	0x3a558382
-	0x17a7c643	0xd9112bd2	0x2e2a3121	0x852a0836
-	0x5625abd8	0x57f8621c	0x7d64dd40	0x2a8d920f
-	0x5fe3e399	0x4486edd8	0xd36655a2	0x23851557
-	0xa096b610	0x06d36c37	0x05d1fb87	0x953aea36
-	0x168daec1	0xbb219585	0x5f17aa7c	0x35d378ae
-	0x76e183ff	0xd6ec5f10	0x4bda67c1	0x96859188
-	0xb328559f	0x834f3e93	0xab87eb5b	0xa8bdb45c
-	0x6e81579f	0x07fee7e4	0x426aa06f	0x7380dc40
-	0x27cb618e	0x05d41994	0x98876595	0x4e6ecda7
-	0xd0549783	0x21b62d1c	0x85058d66	0xbeb36620
-	0x3457564f	0xc29012ee	0x40f30d02	0xa19964e0
-	0xe6f4e733	0x629df93f	0x958abe90	0xab4c3d2a
-	0x55c626d3	0x63cd0ce5	0x832f8ae1	0x8dc5bc20
-	0xcd0b0550	0xfeee65eb	0x0b8309a7	0xdaa9623c
-	0xb5e51b5a	0xf00c9323	0x6b897c27	0x0bd12d37
-	0xf42f8ae6	0x48b81705	0x155e9392	0xb40ca230
-	0x798cd836	0x58e7eb07	0xca2eb2d6	0x238429bc
-	0xdb60b26c	0xca555fd8	0xac907a1c	0x2307f54a
-	0x74b44142	0x44d620aa	0xabf0208d	0x8904f028
-	0x264f31eb	0x5096576e	0x470ccc88	0xed1d68c2
-	0x03ddf124	0x507bec18	0x262b5988	0xb9b530e2
-	0xd1ac6728	0x3a407a87	0x92308c30	0x7394af8f
-	0x4273dd50	0x1abd7a7d	0x28374e74	0x87404b18
-	0xcf9b2454	0x2da15860	0xfb151dad	0xd7c5e552
-	0x58a49994	0x7daa7fb6	0xf5c7032d	0x199c156c
-	0xe42c6748	0x7ab9b557	0x547802b8	0xc606a059
-	0x3d89ff21	0x4fcdec22	0xb1087ad2	0x5521be5a
-	0x5bd9618f	0x93aabce7	0x28be0c32	0xcae8c149
-	0xe98236c3	0xe4be458c	0x805a0a38	0xb300ceb7
-	0x1dcb3642	0x33d87e03	0x81c17b3a	0xf8b59cd4
-	0x9ed300eb	0x5e99acb6	0xab24565e	0xa7e9d72a
-	0x92f97cf2	0xb61fa917	0xbc4167ea	0x5c37d1f6
-	0xcd5200f3	0xc48dcdf1	0x3ba93fe4	0xf5045cec
-	0xc09adede	0xdeef5953	0x1d7c6b08	0x77f2cd7c
-	0x025d30ab	0x206b53a8	0x8140335f	0xed1751b1
-	0x9fc265b6	0xdc56b2ba	0x6f60ddda	0xf92d7837
-	0x3560dc91	0xed0140fd	0x12071a5e	0x397e7dba
-	0x8d9c89b8	0x5f79e3f3	0x41add538	0xafce559e
-	0x8956bcaa	0x76854169	0xac9d211d	0x1d9d2f47
-	0xa4c8cf2f	0x0bdfa060	0x35ca5f3b	0x1ec524c5
-	0x859b6ead	0xb3bd5250	0x1616fbf5	0xd18e5d38
-	0x8b1b06a7	0x9b6e1a2b	0x128e9c72	0xbb672bb7
-	0xd50b0234	0xfe1f75c3	0x40062da3	0x7b875ae3
-	0xca401a1c	0x1668185e	0x25002654	0x314eb038
-	0xd03a8be3	0x86717b8c	0x1bd58524	0xe17ba392
-	0xaf90d12d	0x7b3afe6e	0xcad2b963	0xb91245fe
-	0xe0c7c9f6	0xf98b3bd5	0x305bd207	0x713515d1
-	0x4677d009	0x20e34228	0x6128d849	0x5fb620df
-	0xe3274241	0xd3814ecd	0x223303a7	0xcba4f054
-	0x73a34ab0	0x874fb4ce	0x390efd43	0x490a7a12
-	0xa45a9d66	0xde80cd80	0x9a36beaa	0x2cfca0fc
-	0x231f4d1d	0x04c1fad2	0x5ad83a8d	0xc2931f83
-	0x97f63f61	0x38a6029c	0xe34de276	0x699fa28b
-	0x458d2e15	0x67b57701	0x49385ab4	0x09417b0c
-	0x18897b93	0x516f5749	0x4578a8ff	0x52fbda3e
-	0x2da1dd8a	0xf22e616a	0x7806ab6e	0x92886668
-	0xaf7e056f	0xd9a35959	0xf6ae0b16	0xa42d213d
-	0x928ba1be	0xb61f8e2a	0x6635e3c8	0xbaf76f05
-	0x693d4eb0	0x69546031	0x00427e2b	0x97e563bd
-	0x2857d47f	0x28aaa688	0xf91ec5a8	0xd119289f
-	0x721dc1df	0xdc40c94e	0x67e3d987	0xd2141380
-	0x1bdb7023	0xa84158f3	0x5637a2a8	0x34f80708
-	0x7d452316	0x7cdd1f84	0xe1d1633a	0x82d9f886
-	0xad779cc7	0xd2ae85f9	0x0c467ac9	0x27c1d5f5
-	0x1b28be66	0x34d759d5	0xbcb56ec9	0x171c3020
-	0xac4319ce	0x68c1e8c2	0x3cb463cd	0x78a065bb
-	0x5188b314	0xc8566dfa	0xc93094fc	0x28a21400
-	0x9151a62d	0x678940c6	0x5023ed27	0x089290aa
-	0x327f3b1d	0x7e3d9bc8	0x2c664ff5	0x32e58da7
-	0xe998fd47	0x480411d0	0x9297db4c	0x182058ef
-	0xe21c0a93	0xa32d2771	0x91199466	0xdb8694df
-	0x6261f08c	0x3aff7da0	0x1e24865e	0xde2f7ebf
-	0x1f570473	0x3ec320a3	0x3a8461b6	0x3e1c1e73
-	0x862aa78e	0x74c9a73f	0x090973ab	0x248fb1fd
-	0xebb1b73c	0xab8cc3d0	0xa80d3a86	0xb81c4992
-	0x9f14bb10	0xef283b13	0x060ac416	0x03768c78
-	0xab1a3b35	0xa8f7cf27	0x947beee4	0xdb6d4731
-	0xbc6cebd4	0x39e3cd02	0x9ced359a	0x3358a905
-	0xa4f31baf	0x56bb572c	0x0a8ccbde	0xe701126f
-	0xad241a42	0xd66bafdf	0x5be07a77	0x4fa8a2ee
-	0xff2a829e	0xbe7aa422	0x8ba9b94c	0x20fce978
-	0x8086487b	0x66bf1d28	0x0e9a4b37	0xdf5836b6
-	0xa6eb018c	0xf6a5ef16	0xcfb3b85f	0xa8bc1ecc
-	0x3c5925ab	0x1c926d4a	0x60e2747c	0x629eb075
-	0xbdcfea23	0x10443caa	0x5d005a9a	0x4a6235b1
-	0x56b70ab3	0xff8cb97f	0x42828a8b	0x33692058
-	0x4ce783ad	0x08d1c099	0xb14379df	0xd65d24dd
-	0x14450585	0xbb0450d7	0xc8776287	0xea2eb9b6
-	0xc44d73e2	0xcb386daf	0x9d3686a1	0xb58c318b
-	0x287fbe53	0xe8d84535	0xbf17ef8f	0x98332fff
-	0x5e098cbb	0x9ecc14a7	0x08366dbc	0x55028860
-	0xc09e869f	0xa29a43e7	0x9be9daac	0xa1750a10
-	0xb2fd8da5	0xf380c1cf	0x6087ff3c	0xd69bd21c
-	0x7e14ede5	0xc0ed409f	0x12f25810	0x3f44d63e
-	0x9e7b0cab	0xcb9cc71b	0x18b66ea5	0x80843c35
-	0xf140a7ed	0x89fb323d	0x0a326c40	0xe3f9af29
-	0xf6c59365	0xad3a2017	0x906d1ce2	0xd3360e1f
-	0x046307dd	0x290ff1e8	0x910a9632	0x5cf471a7
-	0x54321c10	0x12924fa3	0xff3d87e6	0xb1687618
-	0xa2a68555	0x1a21d3bd	0x1095d6f9	0x349b25d0
-	0x8166c94a	0x006c839e	0x0094b4e4	0xdd11f901
-	0x1c40e7f0	0x50946c87	0x52bcea55	0x20b86a9c
-	0x7b386df2	0xddd48f3d	0x421d417a	0x7052e089
-	0x8ec43a4e	0x6174ca83	0x6b712d8e	0x566ae151
-	0xc38d68a1	0xf7d64e87	0x9f53d487	0x5e985461
-	0x21d27e2b	0xdbb9bf40	0x2826a5cc	0x6ca4d786
-	0x381508b8	0xd8ffd839	0xa85f5b86	0xb37fa53d
-	0xe4906f8f	0xc7329e0a	0xe56272aa	0xe7b97be8
-	0xbd6a48dc	0x935e9f91	0x02313e13	0x026b8e36
-	0x939a5293	0xe125a1a5	0x6b27d136	0x3d520ae7
-	0x7abc1309	0x183f50f6	0x08575ed5	0x1d2c4c72
-	0x0e682129	0x655ceb36	0x1a508349	0x3be034d9
-	0x4bf83c5f	0x592520d0	0x5f65a0c2	0xcad74a35
-	0x5c4e605a	0x973b60a3	0x309fc15b	0x3ea3781f
-	0xb56c3172	0x269f8d75	0xebfa9293	0x9ff8bf36
-	0x27bc0472	0x4a1888d1	0x598b47c1	0xba2d3073
-	0xf71b310a	0xb9db5309	0x065ffaf8	0xeb21604b
-	0x60875644	0x6f76cd48	0x47746357	0xbf2e90b5
-	0x7d40e67d	0xe87f11ec	0xc5409f18	0x9904fefe
-	0x9745644f	0xe1089f12	0xdc49f755	0xf0cd3596
-	0xe9e69302	0x419b9a3b	0x3f0a6315	0x8b715e28
-	0x363ede54	0xcd41a72f	0x0bafa9fe	0xd00225c7
-	0x6e8d0407	0xd1f100b9	0x0cd02e9c	0x760a2ffd
-	0x6ac6f01e	0xd2226e57	0xe7a7bd75	0x0bec05af
-	0x72b4d6c9	0x54df0f5b	0xbcb2bb34	0x20364bf2
-	0x9fc24cdf	0x83452f28	0x734248b7	0xc698bf34
-	0xee328cdc	0x8e4bff33	0xa1addacd	0x07af68c8
-	0xc34b5d25	0x8e611a0d	0xcbb8ff85	0x077c6d43
-	0x95feb2a3	0xb435fffc	0xef5eca7a	0x0ff6045a
-	0x449647ba	0x75795c99	0x9c514436	0xabbe74d9
-	0xd180f18d	0xdcdeee76	0xa9550f7b	0xb4c8e109
-	0x80b21662	0x8a407a0c	0xa6245b13	0xa16f44ac
-	0xb3db67d3	0x0b335cfe	0xd878e875	0x81d6df28
-	0x44871141	0x6a6dada5	0x7f97fcd0	0x7ee87f79
-	0xddc5bcfa	0xfc2763db	0xb11a9212	0x94ba7acc
-	0x49428749	0xd219071f	0xd91bc4c2	0x4ad5c326
-	0x54ea2297	0xdb16bca5	0x33327f3f	0xc487b8c7
-	0x54ca8d94	0x4c6f5655	0xf51c3911	0x37931433
-	0xf6506856	0x6b5a93f8	0x388950b9	0xdf5263b5
-	0xd4cf56ea	0x8da347e2	0xf20a9a39	0x1a6b8e4c
-	0x2ce3df55	0x38269e78	0xdc7a9762	0x9e73a3dc
-	0x57de6fa7	0x9c2573f5	0x3491629e	0x009452fe
-	0x8a34ddd1	0x701df9ab	0x4035380c	0x6f25e16d
-	0x0ca914de	0xf9277a06	0xca1f1fe3	0x95aec5b6
-	0x7a613e97	0x52e77607	0xd7229ff0	0x5f301016
-	0xd4e142c1	0x29a939cb	0xe96dd1ca	0xc953aec0
-	0xbf02c31e	0x02135076	0x4f931dcb	0x4b280cd3
-	0xe0cda493	0x70831c04	0x8192143c	0xc9f94a3b
-	0x13eda1d1	0xc62c39ad	0x754a5411	0xe43ce416
-	0x95ac1b10	0x871261dd	0x79f33a8a	0x77383224
-	0x98b2480f	0x2df139d4	0xd753e53b	0xbad87b53
-	0x977cc17f	0xacc4bb71	0xbde6b5f2	0x206562ae
-	0xe0319086	0xcf903501	0x56ed1506	0x64f4556c
-	0xb90bbe0f	0x2def02e5	0x9b625a9b	0x96086cce
-	0x39d1d0ab	0x8c85c5d6	0xa8199040	0x23c770e2
-	0xf5303bd0	0x51a83607	0x5afa1989	0x8a81b4ff
-	0x1b24e6a4	0x4cb58014	0xbbee7d31	0x758271fd
-	0x259bc3f5	0xb3f9c6eb	0xbd8c4f86	0x66c27a35
-	0xa41c2904	0xc9848ce3	0x9ba21676	0x18f65508
-	0xe5637556	0x031e21c0	0xc09e3c77	0x5f10856f
-	0x9b3ea697	0xd8afe20b	0x447f5be1	0x5c4b1668
-	0x71f44cc1	0x8637d0c6	0xbd182081	0x1e4221b4
-	0xd312a403	0xf49d2c96	0x686ff9e1	0xa3f9b746
-	0x3caeae90	0xf2bfb131	0x5823eb37	0xcd4edc6d
-	0x3a7f65d8	0xbb4be9d3	0xd7939b2e	0x71d03a37
-	0xa30ff63a	0xde7ccb57	0x8ea031ba	0xbcb3994d
-	0x8018d6fb	0x1c7a3610	0xac900573	0x9ad05089
-	0xe2d17d5e	0x7816b9a7	0xffcca5c1	0x9faa9a0c
-	0xadbe99e6	0x06de7ee1	0xe4ac8981	0x29ef423c
-	0x32219ad2	0x806642b8	0x412ab076	0xfe4c5196
-	0x82c2507c	0xd58c7b7c	0xfe9edc9a	0x89e4c6e9
-	0x4f122269	0xf0aeb2f1	0x77f4fbc0	0xe6692464
-	0x6e64c198	0xaf79a455	0x01e2ed98	0x897ec1b0
-	0xf7a0dd35	0x92baec5e	0x93f17b7e	0xfbf82b90
-	0x168d32c5	0x741b61c0	0xb0f5b9b5	0x0557fb71
-	0xca937e89	0xad652a2b	0x9a2121c8	0x34d189ca
-	0x037dd1a3	0x3e650192	0x4defbaa7	0x06763750
-	0x48d4d1b4	0xda2af400	0x7df71d63	0x3e0b4c46
-	0x28c645bc	0x29b15428	0x34e10558	0x1166cdd6
-	0xc259a364	0xdc7e0f21	0xb02cee35	0x3055f39b
-	0xb77a50d2	0x2c143c84	0x7903e30c	0x018e20a8
-	0xf95b4a26	0x38c84311	0x1f0c3098	0x535a95e7
-	0x730214dd	0xb0f90f53	0x625fc5d1	0x2c1f2d76
-	0x7c9b5351	0x5cc285f4	0x0f63b5f4	0x90d59d57
-	0x140213fc	0xd21a74b7	0xf85fd83b	0xd9f21e94
-	0xbbefcd30	0x5091f90f	0x8d5c47fc	0x9455364a
-	0xef89f274	0x901af041	0x782cd03a	0x086f1f81
-	0xe09eb4db	0xf7a8146c	0x41898271	0xe8be480c
-	0xdfbac329	0x5fb899cd	0xfdca25e8	0xe994b3d8
-	0x2299ede3	0xc0341512	0x0128eb87	0xd5cff619
-	0x779bba38	0x1e986657	0xc22ac15c	0x919af309
-	0xd3cd1df4	0xb4b22d9a	0x210c0617	0x5723f9e0
-	0xb7b79328	0x613e738d	0x39057942	0x48d48958
-	0xf9d80cc0	0x16f69a5c	0x6d517734	0x012f07fa
-	0x7a8329e1	0x586b22c3	0xdd0d96b9	0x0c56d5f9
-	0x60410aa3	0xd1975446	0xd2c142fa	0xb13ba75b
-	0x0b046c21	0x03afb4e0	0x346f5dce	0xd108fa96
-	0xd1ca963c	0x73f5838a	0x4b4f734f	0xa1d430a7
-	0xd0cda381	0x64fecfee	0xc5048480	0xd3bfb251
-	0x088982f9	0x2383aaee	0x9b9c8f48	0x623f2132
-	0x0f5ae663	0x3c32959a	0xa1fd9ecc	0xf62d0e4c
-	0xe690d930	0x6be7a286	0x825d0066	0xe51094ca
-	0xc99affb8	0x832222ea	0xe7296513	0x2c040c86
-	0x35f62e4f	0x6f46ba84	0x25cdb0a3	0xe8b6ec22
-	0x5b6cf8d0	0xcfd85f8a	0xf0181633	0x5362c0b7
-	0x58955c60	0xc5a36973	0x874d04eb	0xa42a42df
-	0x4bd5d994	0xee6114f3	0x671ccecb	0xf0ae2422
-	0x70c98042	0xf9ed2a1a	0x6b60f0c9	0x04b13374
-	0x96fba002	0x8b481645	0x315198a2	0x65c80b9a
-	0x31475dd9	0xe95c5c3a	0xe3c22d43	0x12659565
-	0xabec6f96	0x9446e315	0xa6552f83	0x295e2596
-	0x8b6a2d9f	0x71efb10e	0x2d309912	0xe3dd2879
-	0xabd39f50	0xcfa94a90	0x61d282b7	0x062b246f
-	0x617b7162	0x3628fffd	0x93c8c8a5	0xaa44c72a
-	0x11b78bff	0x8259874a	0x186bbcfd	0x37bf7395
-	0x6f8582a7	0x65fdd21b	0x53106cb5	0xbfbe1e4a
-	0x1ed99eac	0x670b3763	0x245db7b2	0x7584d9be
-	0xc3472009	0x572bddab	0x17e7406c	0x79e0ea4e
-	0x74779fd3	0x92d0c51a	0x1808d006	0x46c1e76b
-	0x40e48bf4	0x61e17325	0x1d437ab2	0xacf51c38
-	0xc19eab2c	0x02957308	0x0bcc40bb	0xf603815f
-	0x9c666571	0x6a7d539f	0x57f3941b	0x7af81d5c
-	0xad1427b0	0xc188d623	0xac010003	0x1ff4cdf6
-	0xfa504446	0x6425ba6c	0x27ff69fa	0x26da5613
-	0xb6fc0a69	0x1155853e	0xbab81c6e	0x3dc17909
-	0x07b209d9	0x8b269554	0x73fc8781	0xfc1c2c82
-	0x572df087	0xb71bb5e5	0x55f9d202	0x6f525daf
-	0x117755f9	0x52cce1bb	0xa789ed0e	0x1313ca47
-	0xe8bdd878	0xc37e8dcb	0x53b971fc	0x43540a80
-	0x3d2384a7	0x25ac992d	0x7aef31c8	0xb1294afd
-	0xb0a34878	0x96e9ca1d	0x82a19bcd	0x08cd2bdf
-	0xd2681e35	0x2d32fa5f	0xc7c0c8b2	0xeecd089d
-	0x97404355	0x0b34539d	0x37ce4df3	0x599352dc
-	0x06734f29	0xf47ab5d8	0xb15ea9a4	0xfd92ed2f
-	0x9510bdbd	0xb740d34b	0xbac3e94a	0x52efbc03
-	0x40bd7acb	0x1bf83a4f	0x3d76c698	0x7e691383
-	0xec85e4ae	0x55e9a446	0x1fc3ab3b	0x6aea12fe
-	0x8fab4a84	0x69cd7328	0x935a7236	0xc3f59437
-	0xb73a7d8b	0xba0f54e0	0xe8e7aafc	0x6f82ade6
-	0xed6ccaf0	0xdfddc46c	0x0763fc3e	0x778e488f
-	0x0bcc4dce	0x8f919858	0xa7bc7d1a	0xd4954eea
-	0x517b5458	0x6c3f5835	0xd960f76d	0xf5be65a7
-	0x133666d9	0x4431f94f	0xccedf47d	0x6eb21ff8
-	0xb858dfef	0x15beefef	0x9a1b6b6a	0x64890eda
-	0x2a381329	0x660302bb	0xc65c001c	0x049a4be4
-	0xfca1b112	0xb081a099	0x3a2217f8	0xeea9a2ef
-	0x7719129c	0x7c915047	0xb3fe3e16	0xf1c31548
-	0xfa84a76b	0xd7af5b51	0x0de24c14	0x89a7263d
-	0x5a9dbffe	0x7ea90ae3	0xc21a2a1d	0x65ef3a3e
-	0x90fd1fa0	0x69aa0d9b	0xb44a5778	0x5ded34b3
-	0xa0d78617	0x91817661	0xf9541869	0xa0960273
-	0x024d891a	0xbc9f6d7a	0x630bac04	0xd186ffe5
-	0x0d60d640	0xc05e4701	0xba72d775	0xacec7c0c
-	0x1680e76d	0x6b153d69	0xbcbd60c1	0x3e1ed6c6
-	0x9705975b	0xaa3cc082	0xbdd723d0	0x7c0bbdd9
-	0x2bcf8414	0x787b2dea	0xaf923561	0xe4ad94a2
-	0xa85f83a1	0x1de0ddcf	0xd96f918b	0x617b1461
-	0xb1d3e386	0xe8d80b5d	0x40dad53e	0xcd8fb285
-	0x46fb4bae	0x2845c456	0x8b261251	0xf4923055
-	0x99d0db1e	0x0d7cc781	0x9bb20af6	0x7116d81c
-	0xd7f54821	0xba4eb2d0	0xaef6b275	0x3ca796cf
-	0x8807360c	0xd887484b	0x7066ec38	0xf7262152
-	0x5ede9cc5	0x6b8eb00c	0x5564b7af	0x4726dfd1
-	0x9421fe95	0xcc0ff9e5	0x10ca7e89	0xb76760e6
-	0x3da3a50a	0xf9cd3f82	0x1eb01d3c	0x13ae6371
-	0x129747e6	0xab223504	0x9978c7e9	0x1f7ce259
-	0xb17fb162	0xd1ac0e80	0xe04bfd17	0x197d9eac
-	0x59586a32	0x7436e8ef	0xc28b1ec5	0x83af0dc7
-	0x8382692e	0x17f04148	0x31ee5ad3	0xfe89b973
-	0x0148467a	0x1a6a16ef	0xb6400bcd	0x53ae7036
-	0x6b258693	0xb6edbeca	0x2ff0b686	0xe6f0c346
-	0x0e0ff99c	0x8d369a6e	0x7d10411d	0x2ebccabc
-	0xa67435d3	0xf9901563	0x363f164f	0xf01a1b15
-	0x93b6a10f	0x81f0c068	0x89b8423d	0x60eb711a
-	0x4e45bf98	0x24845e1e	0xda91d7f7	0x561e7ab1
-	0x51a183de	0x73bf29a6	0xcdb20f84	0x46d5ab3d
-	0xce01efbc	0x8d09be04	0xbf4aee2e	0xadf03a7b
-	0xbc454c61	0x83647148	0xec9e834a	0x11527826
-	0x2c7eb009	0xc6d7e3f4	0xbe8befd2	0xd3cc42a8
-	0x0442b41e	0x89643506	0xfd1dc572	0x74b340bc
-	0x686f6f6c	0x48b92189	0xe8f88be6	0xfc591dbf
-	0x8b453678	0xea1fd8cc	0x659d57d9	0xb501f90c
-	0xa6d6b031	0x182d8378	0xd6a8d690	0x6419c2b6
-	0x523d3089	0xc23c971c	0x43994015	0xa4b23066
-	0x831e6ca5	0x03c18610	0xd6d1f4b5	0x28978a3d
-	0xdc620eba	0xc1f86faa	0xf6c4d906	0xf06f85f3
-	0x232fa1bf	0xcf80cc2a	0x6599a5b2	0xc2d4cdad
-	0x0287eb92	0x5cdc4dd6	0x34a9b6d4	0x6d4b1324
-	0x6d21a837	0x00026037	0x80a225a8	0xad75b226
-	0x414a3741	0xb74d0962	0x363b24b5	0xb5044295
-	0x0a01c1a1	0x90a110c8	0x53bdeee5	0xad31aa53
-	0xfb85cc5f	0xdf80b0f3	0x7ad3cb0f	0xb5c68bd6
-	0x89185ff8	0x41544629	0xad5adfe7	0x39061752
-	0x2e9c106c	0xbf52a0df	0x9d2cef79	0x99eba49d
-	0x4459b32c	0xdc98fd7b	0xd81f2f74	0x8aa59f53
-	0x1817857f	0x5f79e3bf	0xc4b7c810	0x9e3a9ddc
-	0x724af115	0x121239e3	0x3c33c849	0xd8abb44d
-	0x600d67b7	0xeaa06b4c	0x20fe7ba6	0x502c684b
-	0xf212d37d	0x413d883a	0x5abc83ec	0x3112bb6e
-	0x27e1b3e0	0xf6dc8508	0xfe602c4f	0xa5b34bce
-	0x4d03d689	0xdacb23c2	0xa00fb513	0x78606ea8
-	0x8fd43ecf	0x90072d2a	0xfcc7b1b9	0x7ffec951
-	0x684bbc25	0xc21a0374	0x8f06a016	0x0e28dfea
-	0x40da3a00	0x8c73a059	0xc0d565ef	0x13bb6c81
-	0x6e27c2ec	0x2f4c9a43	0xae1b4513	0x9738b38a
-	0x5557c3e1	0xa292c6ab	0xd0f78cea	0xb96402f7
-	0x6c281a04	0x948787f9	0xe59f0714	0x6f130446
-	0x4b12e263	0xcae5e073	0x00f0e279	0x9b03c647
-	0x2a141b72	0x19d1e112	0x97b3b6df	0x3c2b6c82
-	0x5b119136	0x57e2084c	0xe954bc0d	0xcdfbfa78
-	0xadc6b571	0x010b9122	0x236676d6	0x2458c822
-	0xcbb8384a	0x662cfd01	0x096c50d2	0x4959676b
-	0xf8b59f31	0xad912a4d	0x2e87fa6e	0x30182092
-	0xc0bf2c01	0x02b4bfa7	0xdd208dac	0x4c174da2
-	>;
diff --git a/arch/x86/dts/microcode/m0130679907.dtsi b/arch/x86/dts/microcode/m0130679907.dtsi
new file mode 100644
index 0000000..30e2f9e
--- /dev/null
+++ b/arch/x86/dts/microcode/m0130679907.dtsi
@@ -0,0 +1,3284 @@
+/*
+ * ---
+ * This is a device tree fragment. Use #include to add these properties to a
+ * node.
+ *
+ * Date:
+ */
+
+compatible = "intel,microcode";
+intel,header-version = <1>;
+intel,update-revision = <0x907>;
+intel,date-code = <0x11142015>;
+intel,processor-signature = <0x30679>;
+intel,checksum = <0x1bb67b21>;
+intel,loader-revision = <1>;
+intel,processor-flags = <0x1>;
+
+/* The first 48-bytes are the public header which repeats the above data */
+data = <
+	0x01000000	0x07090000	0x15201411	0x79060300
+	0x217bb61b	0x01000000	0x01000000	0xd0cb0000
+	0x00cc0000	0x00000000	0x00000000	0x00000000
+	0x00000000	0xa1000000	0x01000200	0x07090000
+	0x00000000	0x00000000	0x13111520	0x01320000
+	0x01000000	0x79060300	0x00000000	0x00000000
+	0x00000000	0x00000000	0x00000000	0x00000000
+	0x00000000	0xf4320000	0x00000000	0x00000000
+	0x00000000	0x00000000	0x00000000	0x00000000
+	0x9703f29f	0x1c68d65c	0x1f15f858	0x114237f4
+	0xfef8d172	0x363b5a9d	0x4c3d9e71	0x13ff68a0
+	0xdb666815	0x5a17bfc4	0x4fca009d	0x099ae8b3
+	0x198e2c7d	0x7c665bbf	0xc07a1a7a	0x7dbcee26
+	0x867296b2	0xc885b6ce	0xe602baff	0x68544b14
+	0xc928c400	0x3add156d	0x531946f9	0x92a03216
+	0xda352322	0xd967ee1f	0x3c5170a7	0xf6de834e
+	0x5a2ed8b3	0x9fb8f050	0x450de17f	0xfd5ef070
+	0x4954575f	0xa3a071ab	0xb56e2afb	0xe2b48302
+	0x6655a958	0x57c9a438	0x1b2f688a	0x09309bc4
+	0x0be95612	0x529c1633	0xc48515d9	0x29eb78df
+	0x9933409f	0xda58dea9	0x58c805fd	0xbc110f5a
+	0x40780ec0	0x6ad59bb3	0xc7387fb8	0x591c1490
+	0xf9335932	0x32130e0b	0xef4b3c96	0xacd903f2
+	0x5b362539	0xe7f85529	0xcb17c41f	0xe7e440d8
+	0xfaf7e925	0x969b76fb	0x5edab8c7	0xf00012e8
+	0x121c2971	0xe5b18959	0xadfd07c0	0x1f09c9d7
+	0x9781006a	0x39550073	0x6c438b6d	0x436f60bc
+	0x11000000	0x46e87267	0x7c9db265	0x4ac824e5
+	0x94ed53c5	0x4b1bbf81	0x241a4da8	0xc3c5d866
+	0x186d6eed	0xba1e5092	0x3d19677c	0x82b56f7d
+	0x95d4d506	0xdccbbfb2	0xdc6be978	0x416dbe64
+	0xe591ce22	0x02987636	0x44858276	0xfbe3729a
+	0xee42767f	0xb415639f	0xbc959b72	0xa6919bec
+	0xb9e2d0c5	0x2fb1e39c	0x1ebae20a	0x9a3ce21a
+	0xebf72206	0x4020d73c	0x92674cff	0xbc607b8d
+	0x488d8dc0	0xd1d6f435	0x39e3ee1c	0x1ed65078
+	0x967d7a88	0xaa1b9f3b	0x38248bfe	0xb8a0aeb2
+	0x3b8e34fb	0x86dd48e5	0x887d7432	0x3a3a3faf
+	0xec556202	0x50ebe457	0x7676b9bf	0xe84604b0
+	0xcb26a17e	0x52c94055	0x6b39d618	0xa82d63dc
+	0xf583cafd	0x32107d4e	0x71d5aee8	0xad5956f2
+	0xad58e817	0xb6da62b3	0x66d63e32	0x00a13bc7
+	0x71233e63	0x326ef79d	0x2e3cf966	0x92b08830
+	0x42be3b3e	0xd49905d5	0x638b6a72	0xbeaa8cbf
+	0x5f28a0f8	0xff10578d	0x59a2d213	0x2919bc00
+	0x61398c7c	0x2a0865e3	0xf1a42982	0xa1e24984
+	0x2234d6c6	0xd6a9a013	0x79740c47	0x56cd5120
+	0xc4bb279e	0x707d1519	0x33b0445d	0xae3be614
+	0x3c3d5c9c	0x6eb115a9	0x4a2d5cbd	0x58718272
+	0xea01ac92	0x8a6e8d3e	0xadc4315a	0xc6ba0145
+	0x52363aac	0x4960bc5e	0x56a66f82	0xdb06eae9
+	0xbcf5c135	0xd59539a8	0x7b68c56f	0xe298be9c
+	0x8ac3c19a	0x3928fbea	0x4a72f2ab	0xbe32ec72
+	0x5928b934	0x6b56ff28	0xc8f2c78e	0x97d168ee
+	0x43381910	0xa592424e	0xb14ae0a8	0x46f724a8
+	0xded8973b	0x9f9100a2	0xd7cbb2b6	0x2db57173
+	0x217fd7ff	0xa85f3087	0x9e23192e	0xff8a0f31
+	0x86f1ddbf	0xcae0ea2d	0xcd0591a1	0x10733827
+	0x1758f010	0x38bfb48d	0xc0ec80d4	0x3a497694
+	0xe82c7b4a	0xf21a8a2a	0xc4ba866f	0xc88fbed8
+	0xe0e9a0f8	0x60ba6708	0x73fe95cf	0x46fab51f
+	0xab34c80f	0xcd06bd33	0xdee23ab5	0xbb405653
+	0x7948d7e8	0x88713e19	0xf3507645	0xc6cf938e
+	0xa690f2ed	0xa1603eaf	0x71688d1a	0x2fc9a057
+	0x3488d635	0x5f8eaa82	0x5c3ac4be	0xe15a8f69
+	0x0421729e	0xfe7dbfb0	0x5fb6c672	0x99c59c6d
+	0x2feb9ab8	0x0e831a04	0x1c8a41eb	0xe3bda963
+	0xcac53147	0xe6a154bb	0x1dd48215	0xe0fed62e
+	0xd0bc2263	0x820d5f12	0xc3df9df4	0x5c978a68
+	0xd4a6d275	0xaa7525d6	0x9e7c91a5	0xad05611f
+	0x8fa896ec	0x9d002d2c	0x06f50042	0xb05c73cc
+	0x2362a6f3	0xb1db87ad	0x2e08390c	0xb827d183
+	0xba59fc97	0x9c7f5996	0x5a6645b9	0x7ff51fb2
+	0x5f8b2b55	0xbdd03e7d	0x0d7ed8c6	0x0468dd35
+	0x4a32332c	0xfc2af9d6	0x33a14776	0x5a0b8da7
+	0xd278a1c3	0xd3f4df32	0xf06ece96	0x08bf7444
+	0xeb1076fc	0x7ac6604c	0x8810a1a9	0x64920094
+	0x0e68356b	0xef753730	0x9e5a90c3	0xd050c0cf
+	0x80c11368	0x37334deb	0x9a758bcb	0x6a50677f
+	0xe091cba5	0x5e574d20	0xce0786da	0xe8ac8ca7
+	0xb08cc364	0x599dec0d	0x755090c1	0xdeb882a1
+	0xdb41e3b9	0x5bea550a	0x588fcfe6	0x2f47fda6
+	0x3c535740	0xb01ef7a1	0x41318391	0x9573deaa
+	0x3b049cbe	0xba4a8bca	0xc70f0a90	0xe353d011
+	0x79493cae	0xb41bd61d	0xbb73d556	0x08fe7bac
+	0xd8214968	0xa6fd5c58	0xb90f3e26	0x7374f308
+	0xd9d66fb7	0x23db8822	0x1b1f7701	0xbb557c36
+	0xd8573d73	0xaccfafa7	0x245cdb75	0xd633e6a4
+	0x623cce13	0xff1b1379	0x068eb371	0x634b1fda
+	0x88d187f5	0xc7524ccd	0x4f907ff9	0x65ed9ec6
+	0x90f9f995	0xffe5e671	0xee78e6ff	0x48aa5768
+	0x1d5401d4	0x76125937	0xda829f6b	0x7066f6ab
+	0x35659966	0x59bf2950	0xfe3194c3	0x93e928ec
+	0x94ea826a	0x252f240e	0xf8293138	0xbd9c56a1
+	0x6d976d69	0x00c2bb0b	0xefe2fa50	0x718391d2
+	0xc2856548	0xba3785dc	0x594f8bb7	0x32a3e0a0
+	0xd4ac9cdf	0xbdee3ec4	0x0c1ed6c5	0x5cd2b1dd
+	0x9bd8afe8	0x5598b8fa	0x8899700f	0xe5b11279
+	0x6bc1eff5	0x81488bcd	0x0066bd0f	0x81a041c2
+	0xb8e1db32	0xd6f00d10	0x53c9f929	0xbf537406
+	0xe90e75b9	0x2846542a	0xf8111284	0x6f448d25
+	0xb9303c44	0x73ce77be	0x319187f6	0x2fa38401
+	0x6ce1515c	0x880a819b	0xf18f7bd9	0x4975e304
+	0x7f530a68	0xa15309fe	0x5d2ccf5f	0xfa1388b2
+	0x5abc2e7c	0xd7508296	0x90ab027f	0x1ed00025
+	0x67ad3919	0x040191cb	0x6f2750ca	0x371e23da
+	0x219ce1f2	0x2a94685f	0xf431a11a	0x8f3a916c
+	0x83add01d	0x15b7c162	0xc5fba638	0xc9231626
+	0xc44141eb	0xeb761838	0xf56010d3	0xed370b64
+	0x3d5c291f	0x369d136d	0x64eb568f	0xf0c2fb04
+	0x1ac908fc	0x5267daec	0x72b77c0b	0x9bd72098
+	0x90505914	0x0ab130e0	0xe9d4cc65	0x3841a119
+	0x49107805	0x104d8a9b	0x948432b4	0xa4d9acb4
+	0x01708bdb	0x33867b75	0x77ed63f4	0x6c59d6df
+	0x6ff89016	0xe140d51f	0xfd55b64d	0x2f260ed2
+	0xf5b97bd0	0x4a278b70	0xfebc3552	0x402ab7c7
+	0x1c563e33	0xde063184	0x32e862b1	0x56fd9e7d
+	0x8cc320a3	0x381ad628	0x736053ae	0x8a4d3500
+	0x9af58234	0x9a4f381c	0x2449cda8	0x8bdc08ab
+	0xe02865f1	0xe5384199	0xbc8d798d	0x6e7539be
+	0xbc3d0476	0x7e0d35ee	0x8bf8be24	0xfea1f124
+	0xc93600bf	0x055e1524	0x4d2e695c	0x8ca4be1d
+	0xf56549d1	0xb610a66e	0xf9644f1d	0x72c21fc7
+	0x325c68f4	0x7e46995d	0x98e494b4	0xb80f3796
+	0x63a58bb0	0xc0918dcc	0x90e1ec3d	0x02da69bc
+	0x48d03c2c	0x50f010d7	0x4e33c8ef	0x3868bafc
+	0xa1bbb203	0x6998fad0	0x69c1e854	0xdd61c5a8
+	0x1eae5c43	0x325a24f6	0xcccd1c27	0x286c1720
+	0xe4b90b87	0xae9d5754	0x35d85c1b	0x6dea7c71
+	0x528f612d	0x7bc8e019	0x4554a520	0x06f224b1
+	0x8f956a0e	0x3446bddb	0x05e3665b	0xf78be26d
+	0xfc87322b	0xed1809f8	0xb00b4c9e	0xad731b02
+	0x36cc1bb0	0x3e56e274	0xe1ef883a	0x07c6c2cf
+	0x86055da9	0xb43d2b6d	0x5e4030d1	0xb4a60919
+	0xbc12554c	0x0c1f4dd2	0x1cfeeebe	0x1c21eb21
+	0x32712e65	0x4791d232	0xe35d3bcb	0xe09629b5
+	0x34a07f0c	0x4220cfc1	0xf6b5e353	0x1ddba77b
+	0x1f9ceb98	0x78f1db33	0x9644dcd5	0xaf097bb9
+	0x066a83bd	0xdebaec77	0xf2c82254	0x29dc7087
+	0xbe788ad0	0x6379772c	0x10f39ff0	0x223458b5
+	0x28d5301a	0xd74cce3f	0xdd5a6fe3	0x8407e1fc
+	0x3a7d4db8	0x02e0f87d	0xc3c1330b	0x2c4990f2
+	0x50735cca	0xb9e45d2f	0x63c8c276	0xfe0b5168
+	0x7c54350d	0x0cb05c93	0xee247fb1	0x40a2c610
+	0x22a00f5a	0xdb4d1da6	0x2086a88f	0xd9fa3196
+	0x9d4cb1c7	0x59d40f0a	0xf52294be	0xbc8d5d0f
+	0xead98b7e	0xd31ff3dc	0x4e32632c	0xb9836653
+	0xeae227e3	0x1e334cf7	0xe5ee9187	0x479d5dd8
+	0xadf733a8	0x12c0a7ef	0xe8307249	0x8d72f210
+	0x3336e271	0xbcc12da0	0xb8d52e29	0xe94a46ae
+	0x5926aab4	0x7a929d80	0x60acdcd9	0x9031695e
+	0x76244706	0x48c3995b	0x17f9966c	0x3c1a30f0
+	0x50c0a42d	0x4ae56578	0x1a81d4ab	0x1395c82e
+	0xdf92c366	0x90a188ac	0xe2f83649	0x5696676d
+	0x7a507ba9	0x45f0e0ab	0x2d68a9bb	0x65d50b4e
+	0xa684fa7c	0x63a04a35	0x0f73e4ed	0x1859da4c
+	0x242dfeaa	0xffa2815f	0x04e5ffa2	0x30d55d0c
+	0x559bbc55	0xe68b716a	0x7dcb07a5	0xb1d3c43e
+	0x5b1bc142	0x77656508	0x5f03d2a7	0x13c21c86
+	0x008bf74a	0xe2f5bbf1	0xaee8a9be	0x9bd33d42
+	0x435aa8bd	0x9e8f958d	0x4a7a566d	0x5b2356b4
+	0x4be34fc7	0xac3f87f7	0x7520fbfe	0x351f4afe
+	0x67476a0d	0x64d18e88	0x71bd9d70	0x9da2e4b6
+	0xe7c611c0	0xf009f13c	0x8eb98619	0x74c22cbf
+	0xfe9f40ce	0x23864c9c	0xa0d7777b	0xff87bcf8
+	0xe42e3b0b	0x9c7fe855	0xfb365cf3	0x0ae87000
+	0x39558461	0x5a7fe922	0x52fb616c	0x1dee6ae8
+	0x430c550c	0x0a30532a	0x87403149	0xb708a4c5
+	0xcc1ff466	0xcfca59a9	0xd743b0bd	0xa7e0f484
+	0x6e7ee3dd	0xd5f919e4	0x9015fc59	0x39b566fd
+	0xdd3f25ca	0x8dfc6741	0x9179d918	0xcf08d388
+	0xe523b058	0x0c4407e9	0x25ae6238	0xafe9cf0b
+	0x9fc29e7a	0x236c823d	0x607add38	0x8833fd32
+	0x21c60d26	0x362de265	0xb6bfa503	0xbd27e44e
+	0x5b6bf836	0xe0d35274	0xebe7908f	0x7e076c9c
+	0xa34aeb4e	0x642898f0	0xc87e1a07	0x9bda87b1
+	0x3721f746	0x65c1ec7f	0x3d0ae8a8	0x3115b008
+	0xcb1a56a6	0xd1a76d04	0xfacd1b7f	0xe553744a
+	0x057f2c33	0x13caeeff	0x209c5884	0xc3211b8d
+	0x5a8c81d2	0x1e59cc0c	0xe7b42f60	0x510fc068
+	0xd200fa5d	0x23193201	0x1e534fe0	0xcf2037b8
+	0x6b6bd4fc	0x3e8e94c3	0xdbe1d38a	0x597d5871
+	0xec0129e1	0xb3be9453	0xa400f9f2	0x6ce19ff9
+	0x259187f9	0x24ec708b	0x5fc5f413	0x847c8969
+	0x9fcf3fec	0x0cff18ab	0x4cefa78d	0x35266a04
+	0xbee81833	0x32634f58	0xc9a7c8dc	0x614f28e7
+	0x4dd5ace1	0x15fc0226	0x3f8b4aa5	0x05606056
+	0xbdb5a3f1	0x851e10b9	0x2a6053e5	0x6df96185
+	0x2cd9cf8c	0xe28d1444	0x08d79dea	0x18da1e61
+	0xb59950fc	0xbbc8c699	0xae43972e	0x920023dd
+	0x13008ca7	0x54b36917	0xa35abb2c	0xd4984b2b
+	0x606083d6	0x4e49dabb	0x372ba59d	0x380f7bb4
+	0xeb861260	0x7f0538b5	0xef69498e	0x83bac8b8
+	0x2344d697	0x4f789a8b	0x2d98b057	0x4e94ee3c
+	0x983d7fee	0xaee49b46	0x00de7dcc	0x94c52878
+	0x6f9e3754	0xaef4b9b9	0x6b46ee19	0xddb10fe4
+	0x0dd24290	0x08f708af	0x3fb2e39b	0x3dace909
+	0x84838754	0x94149bb0	0x2359b874	0x4e09221f
+	0xa56ef81d	0x086f9c79	0x0d338c01	0xb2a91bf7
+	0xaa4d6c89	0xf49969e7	0x6a509eb8	0x809ec124
+	0x71563d2a	0x2b7dffbc	0x5bb334bf	0x18ebce8d
+	0x3e434c67	0x4904d4c8	0xd233d209	0xca3cd2ba
+	0x7c618885	0xf68cce7b	0x35adbff5	0xf61e3d48
+	0x4cb3ae04	0xaa20201a	0x6f491596	0x0b934538
+	0x16a605f1	0x57dfc39c	0x7aceebdf	0xb6082f67
+	0xc36b7e2b	0x592f3f53	0xee3cf851	0x76ec175f
+	0xabc73b4d	0x8d6dd974	0xca41dde5	0x74ab505e
+	0x8c15f4c1	0x9d41aa44	0xcc8fa5d2	0xa570465e
+	0xbbb630c6	0xfc977e06	0xa8b1775e	0x1f4dc519
+	0xbabada41	0x91b2fad7	0x1135566b	0x567652f9
+	0x1d0f955e	0x57c4c2dc	0x660bd5a4	0x59c92987
+	0x9d695aff	0x88aac7a2	0x20308598	0x8e12997e
+	0x29c5181b	0x53ae2439	0x7862d015	0x1626cc32
+	0x10f95eb0	0xbb25f25e	0x03b241ba	0x9bdc7bd5
+	0xf6106050	0xf5154783	0xe080521f	0x061e86cc
+	0xb2ca16e9	0x915f0a4b	0x8f4325c9	0x1a5f2ac5
+	0xc976520b	0xe0717cca	0x5ac6e76b	0x1f62f48d
+	0xf31e76e4	0x8c3a146b	0xc87d8c2d	0x8ddee751
+	0x8bf4db09	0xd2a686d8	0xf216b59c	0x911ecfcb
+	0x65842c11	0x630e6a6b	0x48985e2e	0x9e94bce5
+	0x5cb2afaf	0xe31d5ef6	0x7806074c	0x7744bf55
+	0x1355a6bf	0x388865be	0xb9d900b3	0xea2bce11
+	0xd0228c4d	0x816dd5f1	0xb3654090	0x6c296240
+	0x5956a149	0x402672c4	0x42830ea7	0x8099a3ef
+	0x1b0d2d24	0xc4180b6b	0x2228bf23	0x6ad12711
+	0xb41611de	0x34c8b9e6	0xe301bdbb	0x495e50df
+	0x809d2864	0xb3424c33	0x7399f498	0xc91b39d2
+	0xfec47b00	0x2a2230d3	0x61341d6c	0xe7a75efb
+	0x8aede4d7	0xb20cf7f4	0xfbef0902	0x4459ef58
+	0x197445ab	0xa03e71a0	0x25f67b4e	0xddfcd1c9
+	0x52f4388a	0x5af77420	0x8ffe5b18	0xa29fce69
+	0xbb0a60e6	0x373b3ad9	0xa00e19a6	0x2db7e515
+	0x1a77ced9	0xbd039c17	0x374d5460	0x9ec3a1e5
+	0x77434c84	0x0c22e7d9	0x5fb76173	0x8646c434
+	0xda49e7b0	0x03f47da2	0xc4e5ab4b	0xd3555a92
+	0x9765dab9	0x4848b517	0x05c2b154	0x6e2b996c
+	0x44964009	0x76fe7858	0xe9e8467e	0x1de54367
+	0xd124abd0	0x41ae9672	0x521ae70a	0x5f7430a3
+	0x44695344	0x576beff4	0x50ae299d	0x616c731f
+	0x6144c083	0xf032bf4d	0x3e3cb949	0x7ead292f
+	0x2151c92b	0xce4708c6	0x93bb3ef6	0x5795f4ff
+	0xbc3ad2e9	0x5a65010d	0x0b96c64f	0xcc0cea06
+	0x50e8a9ac	0x502fdfb9	0x03de0aa8	0x696fc1bc
+	0xd8c23367	0xe966ac13	0xcdac2cea	0xb1103122
+	0x902a809d	0xd876e570	0x197ca73c	0x6be80342
+	0xe20bc0af	0x13558f40	0xff1b5f43	0x6c4968f9
+	0xf707bb0b	0x2bda4cfc	0x51de4ccf	0xd9361c61
+	0x2bfc555f	0xdbbd4b0a	0x4b9d588f	0x9a744c02
+	0xd909ddcd	0x91a05ffa	0x2d8d4949	0x35aa9505
+	0x9c6364fa	0x95515e59	0xace63492	0x9e33a345
+	0x724cc057	0xb9d449f5	0xa20f8526	0xe2ed31b8
+	0xa0e9d2e8	0xcaf765ee	0x247314b6	0xd91fad82
+	0xab9236cf	0xea5ee132	0x10c8ed58	0x71faf9e0
+	0x7dee7eaa	0x2470519b	0xd4c9d2e3	0xc56cc95c
+	0xbf1a9b60	0xc170f2e7	0xa8505838	0x863fcb43
+	0x1208ca84	0x07781d9e	0xbd944838	0x460a62d5
+	0x0fef3252	0xca1964ce	0xfaecaa6e	0x5312a7c3
+	0x7ec09ecd	0x0e4a64c1	0x0e4379be	0x6b1c1bc0
+	0x47170f9e	0x12615e56	0x97d30146	0x6cdd0cd5
+	0xb012c33e	0xd1d11658	0x11609a29	0x064562b4
+	0x869c8b99	0xf4e59989	0x84fdc9ba	0xddd6bcf6
+	0x5496a219	0xdb079dd5	0x244e6776	0xb0d8afe5
+	0xf14dba52	0xceec92d9	0x73d66ca5	0x55a79142
+	0x844cd92d	0xf79ced97	0x1857b9dc	0x9addd16b
+	0xcb87c2d4	0xcc47c5c8	0xf6216778	0x047364f6
+	0xa3f057e5	0xc47f4b92	0x49b65696	0xc8476f0b
+	0x6150cae4	0x83e956ee	0x84952a17	0x32c001f4
+	0x12e6c124	0x8733ed63	0xa96622de	0x2b97d312
+	0x3c93d154	0x4a43719f	0x5c94d4a8	0x89138d7d
+	0x59287d4d	0xb6be0aa5	0xe38463da	0x0ad5cb61
+	0x10c3dcc2	0xa649403f	0x763dad43	0x15e8796e
+	0x23fed728	0xc65881e2	0xcae78b38	0xecbfa6a4
+	0xe9f4d662	0xb49b7fae	0xbfe36a20	0x9e1034dc
+	0x816472f9	0xb3cf5e3c	0xfd9ceb35	0x64985d38
+	0x28e5462d	0xe617f874	0x9d1cc79a	0x14987e3d
+	0x48847394	0xe396e54d	0x2a9d37e2	0x90d2c038
+	0x4680ae11	0x8ab15c2d	0x12e5372e	0x18b67728
+	0xffd655a8	0x8c0aeba6	0x42c3e703	0x996c63e2
+	0x0a5ff71a	0x242c4779	0x33068ece	0x59abc18b
+	0xea60c431	0x5992a226	0x5041dccf	0xfec6e22c
+	0x11146c09	0x77be906c	0x82879c44	0x51129cc2
+	0x77a9a0dd	0x3c68d1ca	0x02049622	0x10cb7324
+	0x9309b245	0x42bfb895	0xe011f9c4	0x0a907dc1
+	0xc3351de0	0x2385f003	0xf2d22a22	0xaa760f2d
+	0x38d628bd	0x71ef5bd7	0x37127450	0x446928a8
+	0xbb88d4d1	0xf46e188e	0x224cd2a4	0x4f56954b
+	0x70674ab6	0x9be90549	0xafd18245	0x4689e00c
+	0x07d8e74b	0xfe6a2759	0xa6847004	0x7025494a
+	0x2ef97b21	0x8aabbf03	0x46cdad16	0x2b300203
+	0xa22dcb97	0x2c643664	0xb721cff5	0xbfaa532b
+	0x9173a582	0x0a7c7658	0xbcaa4bd2	0x3c4c82ea
+	0xc1b1ebe2	0x1000d5db	0x178850da	0x2276213d
+	0x1cde5666	0xecdb0d8e	0xfef90d48	0xecd4d1f1
+	0xa96103b3	0x935c5a02	0x8e6fe155	0xd047165d
+	0x3002cf6e	0x9ae52c60	0x62cc7175	0xcafeeb88
+	0x826c0adf	0x4ea5baa1	0x085a2723	0xaaf5f994
+	0xbd599d45	0x8c7084ab	0xff2acaf1	0x96fe0230
+	0x4a22f285	0x710eb741	0x3f941922	0x0b2ca014
+	0x6b6619ec	0x1ac478f2	0x7d74461f	0x89668c79
+	0x3b9edd59	0xf51c425e	0xff6e246c	0x915b68ee
+	0xa1142d51	0x62409991	0x543f5f49	0x8579d5f8
+	0xf97989e0	0x98d23c87	0x393a9364	0xe56329cb
+	0xf62cd0a4	0xaa01e22a	0x5bc6c70e	0x1db499e2
+	0x2e35dc25	0x88d5fda4	0xb9204812	0xe282e4e8
+	0xee44d3f9	0x7c2374ca	0x9558fbe2	0x0df70c02
+	0xe78efdfb	0x4caf264e	0x757e955c	0xa06a145d
+	0xcdb5abc6	0x10633804	0x381ef262	0xee9d22fd
+	0x1922ed89	0x17c41f08	0x78db4265	0x47353c26
+	0xd741f54b	0x98f1e3c0	0x2843a6e1	0xb9fc4eff
+	0x30ba0638	0xf1e2fb9d	0x8c8f03c3	0xe300fa41
+	0x2a0b4a8f	0xaa66ca88	0x0372d9c2	0xbf1b3283
+	0x6d7bb883	0x073b7f90	0x90ea76ab	0x7adf3d37
+	0x94b412d4	0x2b788f5e	0xb76fa8cf	0x2ee0492d
+	0x2d30b5cc	0x097cb48c	0x26147e08	0xea57884c
+	0xe1bb97d9	0xd671b4d6	0xb9f45ee6	0x709ed07b
+	0x89e791f7	0x50a0abab	0x59bba13b	0x4c95ba8d
+	0xf06faf1a	0x9eba91ea	0x203a0896	0xe9180d97
+	0x2c747ad1	0x2bd9fdc3	0x9b66ccaa	0x511e730c
+	0x4d4afe59	0x261d4191	0x431f33e2	0xa537e847
+	0x07f3db81	0x0c553226	0x8fb5e7f5	0xdf27bec5
+	0xa91bf277	0xafb9ea61	0xc0c18350	0x96ecd71e
+	0x65713a84	0x913d77e0	0x740d13b7	0xb7524399
+	0x96d50b1f	0x3c33cc3b	0x1ffd3ccc	0x220fe9cd
+	0x13ff2a0a	0x7737d122	0x282709bd	0x66aae30b
+	0x2578d841	0x73c6ae19	0x77d5a00e	0x54705866
+	0x702c38d0	0x642437ab	0x97888628	0xc92ef39e
+	0x05ff9fc3	0xeee7a2e0	0x08c849c4	0x842988c7
+	0xff8e3d16	0xfa73e115	0x7a152edf	0xb4191cac
+	0x0c9eea26	0x5dbb6b97	0x922fc1e2	0x3c727b29
+	0xe447a6d9	0xe6428089	0xa1c2a174	0xa4b85d60
+	0x5f08cbdf	0x2015182f	0x754c5beb	0xa06453e0
+	0x20493816	0xdf17b930	0xf55bbe8d	0xdc28116b
+	0x7c8b4c37	0x87ea1da1	0x8268b17e	0xd4c4fe34
+	0xe2df10c2	0x240aa809	0xb0916d20	0xe96f934c
+	0x8cc175b4	0x478cf279	0xae91f6ac	0xe09c1b44
+	0xdab45144	0x6fd51ca0	0xda83d37f	0x37bf81df
+	0x52fe608c	0xb3f37371	0x156d69d5	0x12b9c82b
+	0xe7bb0089	0x01ae780d	0xe3f7be6c	0x32989ddb
+	0x971fc124	0xd9048910	0x7166fe08	0xd2724c31
+	0xbd2596e0	0xf7b5d8f9	0xcbb76a30	0xdbbbe890
+	0xe506ffa8	0x5932d8c4	0xea064da2	0x881c72ee
+	0xae1ea9f6	0x50a5c29d	0x5388f42f	0x213b990b
+	0xeb38f978	0xfb81832a	0x702338ae	0x9264d6c0
+	0x9640aeea	0x4f01ee0f	0xd99fe781	0xd9e8b556
+	0x35653091	0x0e2287a2	0x90b7f886	0xd4bcded0
+	0x4b964aeb	0x95271c62	0x12c8860d	0x196c92ca
+	0x8e4edf59	0x4907f388	0x9d275902	0xb9009a4a
+	0x30ecdf04	0xfbf86b10	0x94b946bc	0x5757c752
+	0x916f5c3d	0xd4a080ea	0x7dceecff	0x42dccf57
+	0x97ae2be6	0x4052d8f2	0xfb5cff0e	0xacb3972f
+	0x2fdbea67	0x44fd0087	0x2c8dd356	0x702872f7
+	0x5bdf98ba	0xcd436c1d	0x4cf42708	0xbb9b848c
+	0xafc7e684	0xe0ae15e5	0xbe77beb7	0x5465f78d
+	0xa1a5c3de	0xd7d1bf37	0x293dabee	0xd83985ff
+	0xb966b1e3	0x77908298	0xc814783b	0xf43be773
+	0xc7704e0c	0x7f6d46b0	0x1e9eae7b	0x2e110f7b
+	0x2c3e8cd4	0x198263e4	0xf49bbfe0	0x1ddf332b
+	0x2619d305	0x1c4f083e	0x218695b2	0xf6e9eb91
+	0x2bd46f27	0x8c903e19	0x77c69dc8	0x49ad5596
+	0x9b1e4064	0x33af259e	0xae57d885	0x0f89d69a
+	0x1a3c21c4	0xfa8d3523	0x33e1e79c	0x466a8b05
+	0x5318e75a	0xa64c31a2	0x9e8b489c	0xfa3dd512
+	0x19b504fe	0x087795ee	0x1a1119d7	0x92fd5dc4
+	0x161db69e	0x9b8246ca	0xa4f164c7	0xfa1310b4
+	0x7c761994	0x07a9bfd9	0xd76cda4e	0xd220fd89
+	0xfac3a0ab	0xa35fd4bb	0x103319e7	0x113cecac
+	0x8a0b2dcd	0x39001a5b	0x803e3006	0xbe2e8a0c
+	0x256961a0	0x40cf27e4	0x4229799d	0x14a30f23
+	0x23d80ad7	0xbb1082b6	0x1325fdc2	0x41082eb9
+	0x2c531bcb	0xd1c2c909	0x6b68d5ad	0xc7cec053
+	0x95119d6d	0x8cc85ae1	0xfd204466	0x0dd7b4e7
+	0x930de6b2	0xf0386cb7	0x09867321	0xea6aed3e
+	0x0bc79d5a	0xb2d88c9e	0x387fc5be	0x264b3e24
+	0xa962b5d4	0x6f6fc6d9	0xa1b8a9d4	0x65b61263
+	0x91383a61	0x6b1e8571	0xbc902055	0xbc53cf50
+	0x4fe8e29a	0x048ff6ea	0x9a7d949c	0xa83ceee6
+	0x25b5c85a	0xa10a7511	0xf606a949	0x57b41656
+	0x230afe7f	0x73d65619	0x9819c9cb	0xea609f2c
+	0x4bf6fe21	0x4de72091	0xc439faca	0x58ac932d
+	0x36944d39	0xd046acde	0x8495bc22	0xdb20e8e7
+	0x537d1619	0x8c96eb24	0x8f0dbb8c	0x2461b9b8
+	0x1f9e9c0e	0x0e58f1cd	0x196ecb76	0x7ce9198c
+	0xfbea063b	0x06d810ac	0xa5acf2e2	0x2742822f
+	0x17aa581c	0xb214addc	0x6b8da387	0x3a66dd9b
+	0xa28ae955	0x347f5607	0x755e2679	0xd76cc2e3
+	0x80a38077	0x2a85effc	0xc42f63c5	0xba4f0c04
+	0x2df3075f	0xe119e31b	0x74c09c92	0x8f0de61e
+	0xfd1c0d09	0x0e03f74b	0x3730c527	0x8913961a
+	0xda9a8573	0x0d060655	0x41e91539	0x2f145441
+	0xac24e688	0x71df76c3	0xdd88e778	0xd082154d
+	0xcc87a1cc	0xca1d5469	0x55a9d11e	0xa1496402
+	0x5328879d	0x01130306	0x0fb6e89c	0x6a88d6f5
+	0x2c35d644	0x64787df8	0x0cda642c	0x050d559f
+	0x34d986cc	0x4d46a0c6	0x16958610	0xb095b7f0
+	0x42344d4a	0xaebcc04d	0x38cd1303	0xf55ef5fd
+	0xa2229e10	0x1c84dd21	0xc751cdca	0xe70e4d92
+	0x7cfbc446	0xc346c504	0xd1d0c3d0	0x1a11f80f
+	0x4c3d3092	0x860608e8	0xc629974d	0x36b7ba9b
+	0xa6954e66	0xcddd2377	0x2484d0e3	0x16364b7d
+	0x9f5cff4f	0x510b68a4	0x3f66ffc0	0x3fd56799
+	0xe0e9ee0d	0x2733808f	0x91e062f9	0x0194bacd
+	0x7d0758d6	0xe5c3b76e	0x877cca91	0xb1c6caa6
+	0x6d8390c1	0xdbef1e02	0x4900b2c5	0xb9d48fd0
+	0xb86444ca	0x4b32cf44	0x9d52f809	0x5e465a79
+	0xa654d13f	0x5005bc4a	0x2ff38509	0x90a06923
+	0x567912ad	0xca101885	0x9d2362e7	0xf5dcd206
+	0xd8b2de97	0xc9cfbff2	0x850b73b9	0xa9cce812
+	0x1c89f5c1	0x0e93ca25	0x26977294	0x00651015
+	0x3b6ac439	0x2454a988	0xff2cdd4e	0x0d90452a
+	0xbc9f8a09	0x93f1c4dd	0x650c020a	0xfb9b37df
+	0x2f7211bd	0x9cfce13d	0xb02cb359	0xe149b294
+	0xe6c478d6	0x0ba8d9e3	0x3e8d6b1c	0x28549a36
+	0x5b389e02	0x92d73111	0x33053a24	0xfb4295e8
+	0xc31f642c	0xcce6d7b1	0x19256f9b	0x05af3c0d
+	0x46c876d7	0xf3cb570a	0x5b3419c1	0xeeaf101a
+	0x2415133a	0xa5e5d7ff	0xdfbfa790	0x5fb1acc9
+	0x4b411267	0xfb5f01ae	0x44c85d60	0xf574f2be
+	0xed6951a3	0xc72b9616	0x7a400d1f	0xafb1f5fd
+	0x036d3f4d	0x00426a64	0x10152052	0x16fbc209
+	0x5eb41a25	0xbdd91d58	0x23a593da	0xe99994ed
+	0xe1dfc74c	0x2ace293f	0xcffca29e	0x3f9eb981
+	0x46b74da1	0xa08addc5	0x2e4db3cb	0xbb35bd91
+	0xcf047df0	0x9f000bc2	0x095cd891	0x0e8b0afd
+	0xdc862db2	0x381de055	0xfe5b209e	0x98a6ce93
+	0xe07ec88a	0xed2dace1	0xb5f6ed90	0xa59a3995
+	0x3987443d	0x56650b10	0x0a8c01f1	0x28599c21
+	0x51817fe4	0x88ac9845	0x8a5d7b55	0x89a15b17
+	0x0457e30a	0x9ecfdfff	0x03c7290e	0xf14c569e
+	0x88963e60	0x7bc5e18d	0x595ac0c1	0x29f34d31
+	0xd0870bde	0x58fb1622	0x2736799a	0x20c6ab00
+	0xfd606ac9	0x5931c90f	0xe93eb3aa	0x78f4fdb1
+	0xe3c0b354	0xb02dcb2e	0x028635b1	0x6084413c
+	0xbd262370	0xdd84b981	0x50f4cc00	0xc2a13e6a
+	0xf195d7d0	0xa568ace4	0x3506ccda	0x1a7b1e49
+	0x6b623dd4	0xd5b43db2	0xbd2db225	0x5fc0873c
+	0x07b0e0e0	0x8a7c7240	0x51d21461	0xe39acfe0
+	0xe8b1d0dc	0x319cc88c	0xdbb0501c	0x2d530ef9
+	0x6796f013	0x8d7c42e6	0x64840fc6	0x95f18131
+	0x14128fee	0x06ed7694	0x053701e1	0xa113706b
+	0x7efa1437	0xd988408b	0x15a55f2f	0xdf2da6de
+	0xe1637888	0xa6eb0132	0xe5a49f75	0x13421229
+	0x76b358d6	0xfd430ce4	0xe4b54719	0x4d373720
+	0x2363e083	0xc7c3365e	0xd2c691a7	0x337ba782
+	0x85f0e27b	0x6f270f7b	0xda2e7bd6	0x86aa4e8c
+	0xfccea641	0x4ccffdd1	0xfba17e58	0x48f98550
+	0x7fa85f31	0xabf971fc	0xd24dd6a5	0x2a360f9b
+	0x955234ec	0xe75f238d	0x76ce3dd7	0x9dcf7973
+	0xd90c8737	0x23aa80b6	0x9e4f45a2	0xc8e22d59
+	0x9e74d525	0x2cdeb43e	0xeddedd26	0x14b8ca5f
+	0xd42f6bee	0x4ea5803f	0x772d0ebb	0xe7990ff2
+	0x02e47c5b	0x1c88d149	0xef43755f	0x6482ddcc
+	0x1aa8c862	0x169fd30b	0xfe19600c	0x79253784
+	0x61d94629	0x078a3859	0xfed2680b	0x8bb14474
+	0x9fe0981b	0x0e4cb157	0xbaaedde2	0xff3711ec
+	0x1c03dfb4	0xdb4f9346	0x67faa4c0	0xa9fda842
+	0xd1a08a3b	0xb675f6e9	0x2eed32af	0x54169c1d
+	0x2ab8047e	0x0fa33847	0x69c4eda5	0x4f47713c
+	0x8186f17c	0xc68e0d8e	0x1e512fa9	0xb200eabd
+	0xefe05879	0xec521f72	0xc3b7670f	0x06d96a0e
+	0x830dd6f9	0x293926e7	0x49355c40	0x4bfa924b
+	0xb19404fb	0x4cfcf114	0x39f09bee	0xc5959edf
+	0x17e43b2f	0x36b8cb37	0x48d36720	0x87142d1d
+	0x4dcac00b	0x346a77e0	0x833ec251	0x180a0eb8
+	0xec827f6f	0xd389e5b4	0x193666a3	0x40deb1ef
+	0xeb287db0	0x59d72fdd	0x16c01b8a	0xb2f21a23
+	0x78fae723	0x96704b79	0x1cfa8eb2	0x3174d946
+	0xeceb41a1	0x8af02dd6	0x19b3cc91	0xfb452b01
+	0x185564bf	0xadca8abe	0x5dc86f8d	0x6f8752d0
+	0xef5c4281	0x57053d43	0x84ea5d02	0xb4d2053f
+	0xd5f4c35b	0x907f2a8a	0x782ec949	0x773fd7bf
+	0xb71de809	0x6ad67473	0xfc0f2916	0x7e011263
+	0x8388249f	0xc222cf7d	0x1b8123e0	0x2315de70
+	0xd8cdcf39	0x0181feda	0x6e39af97	0x0b77654e
+	0xaa0c9e17	0x863fc367	0x0615d44c	0xe29b86e6
+	0xa1948dff	0x6d4e1893	0x40db2923	0x4d9b1c95
+	0x4803e7f5	0xfaff923f	0xc1031c3b	0x8ee8b451
+	0x31288c50	0xab825d13	0x1c1473b6	0x08b41dee
+	0xb714574e	0x574040da	0x583db761	0xd3d2139a
+	0x9fb3f39f	0xa0cf0027	0x315521b8	0x4c1f5cc9
+	0xdd80b461	0xf1460806	0x0f0ae57b	0x2b8258c6
+	0x4578a951	0xc16a1b9e	0x147faa8e	0xc96ec7a2
+	0xd03de9cb	0x8df8317e	0x0a619904	0xa65850b3
+	0xff6b05f3	0x5f645c92	0xce69f994	0xa1846ae9
+	0xaf8789ca	0x08dba3da	0x08dda80c	0xe8e396d0
+	0xd9478844	0xc47706bc	0x2f56c392	0x0032ce69
+	0x1e25b40c	0x07d67e34	0x2148bd55	0x9b196864
+	0x7955790a	0xeed52b37	0x6e7bb914	0x3ffe3c36
+	0xe65f8946	0xac51ada6	0xae9b3001	0x5bfd4896
+	0x5d04baaa	0x744c6bd8	0xd8d6c510	0x25d25740
+	0x1f97ac5b	0xc37f23a2	0x17fa1b4d	0xed300b12
+	0xea71b408	0xceeed65e	0x96db804d	0x709d79ae
+	0x20546660	0xbab82134	0x51d74293	0xc02a65c9
+	0x0b1ec776	0xf2b31fc7	0xcba74077	0x4f0c1ae0
+	0xc07f66ea	0x170f1224	0x4acb1ec3	0xfc7b9cde
+	0x07e006ab	0x9da5ed04	0x8370e78b	0xc39691c9
+	0xed854623	0xcfca7c05	0x3d2e700b	0xfc52eccb
+	0xf5c71a7e	0xe4cc4143	0x9164e2b9	0xfa7fabd6
+	0x505ff063	0x2859ed81	0x776b50ed	0x3b15d21a
+	0xd2f03b4e	0x8315f3af	0x5269b9d8	0x31bd7c3f
+	0xf99d8e31	0x7df70284	0x568956ef	0xbe3d74b8
+	0x8fbed915	0xc4e227a4	0x689efb23	0x3d323ff1
+	0xe225e3a6	0xe1fc3a94	0xf988514d	0x161b6ebd
+	0x712dc25e	0x21aa2ce2	0x6c630ed8	0x789c1bbf
+	0x7eddd464	0x2a79f889	0xc7c0f496	0xda39e80c
+	0x6fc17a39	0xed41038e	0x42491e77	0x0097fdfc
+	0x25083426	0x0ed5da03	0xa867753b	0xf2629247
+	0x6bf18213	0xd33549e6	0xd127896c	0xbd2440ba
+	0xba184a7d	0x5f534e5c	0x12fe02ae	0xe5234798
+	0xb3e47348	0xad96a97a	0x177e5fe4	0x62a0ebc4
+	0xf74d4d2e	0x2667eb23	0xca156680	0xc2d6ef24
+	0x8b03cd6c	0x65cdd0a7	0x02a17a02	0x1e5d73df
+	0x8d3d1985	0x634424bc	0x6e332211	0x8f619bb5
+	0x2e57902f	0xfc18e1ea	0x5327dfc5	0x249904e0
+	0x6c7e15d6	0x4c93e017	0x72b72678	0x47e3a4c5
+	0xf925b0ab	0x861b9efe	0x2110a250	0x02d111cc
+	0x01db264b	0xc78ffd32	0xd35b62ef	0xc5e26509
+	0xaddc32b8	0x7384adb3	0x14dd80ed	0x6ea3c9a4
+	0x8846201e	0x43f496e8	0x18dbde7a	0x9382de97
+	0x2571ea26	0x73e1c559	0xbf0328fb	0xf54e01b2
+	0x787b9baa	0xcda5ae3d	0xa7f7c5dc	0x794063e0
+	0x6050f2e3	0x3d067abc	0xcd348208	0xcb7c206a
+	0xdb0f590b	0x0556823d	0x9daafb23	0x68de4801
+	0xdd3d5c14	0x153ae055	0x379ae503	0x05a4d468
+	0x35a3809d	0xb41a49b6	0xbabb51f2	0xa9ade96b
+	0x2eed4a4e	0x682e04cf	0x3fb8a3b0	0x71a6e838
+	0x6b1924f9	0x2325ba72	0x4bc9513c	0xb95807c3
+	0xc7e5c617	0xe0eb5303	0x22e25ed0	0xd86c0256
+	0xbc03456a	0x985b81ce	0x9c2ecf75	0xcbe1292d
+	0x12aee1a9	0x6f83c685	0x20e348a3	0x9576eb55
+	0xad06f6fa	0x36293aea	0xf587b498	0x73e5eb09
+	0xd47e5cfa	0x9379d70b	0xb87fa431	0xa4791f08
+	0x003dd242	0xe64437bc	0xae50505a	0xc5a337ad
+	0x9a63bf9c	0x9fb46dd8	0x06d6d6b6	0x1d557c65
+	0xe19a751f	0x8851e1ef	0x88474420	0xbda6a5ca
+	0xe5c570d1	0xbd520d15	0x9c991349	0x774847fb
+	0x09062314	0x74ffcd56	0xf244496a	0xbc822fe7
+	0x6619f249	0x19ecf3d9	0x0356ec07	0xc754b087
+	0x0c2cc5b2	0x0a928559	0xa63defac	0x2a1016a5
+	0x59f9579a	0xa32ac751	0x880156e7	0xfa98f785
+	0x561f9243	0xf8ad3b44	0x88d09686	0xb7656804
+	0x1d733be5	0xf835036c	0xd9854eb6	0xe3d3e252
+	0xa335451d	0x6cef2f72	0xed2d8bad	0x40ccdac7
+	0x026ccf2b	0xd8907e8e	0x6b9dcb88	0x6db1b016
+	0x88b67853	0xf169c4f5	0x71d030fd	0xe3d0e64d
+	0x331b875e	0x14156d9b	0x8e34aaf6	0x735eb827
+	0x7d96125e	0x757b15ad	0xa501ab24	0xc155f8b0
+	0x9c49cd8e	0x5a8e7118	0x74af8bb1	0x9e8de93b
+	0x07687721	0x5ac42b56	0x3042d915	0xe30e20e2
+	0x94a1e376	0x73d34595	0xce30d8f5	0xefafdcd4
+	0x67a242b1	0x27dc9594	0xf8fae52f	0xc4f6ceff
+	0xd0ffedf7	0x493359e6	0x1deda1da	0xb944d24d
+	0xf483b532	0x40396343	0x312c13a9	0xfa616fdc
+	0x5e318d6b	0x57bb126a	0x79433a17	0xfdae5d08
+	0x24350f44	0x42b9819c	0x8c3e4914	0xb8fd955f
+	0xb66519f3	0x03376aa7	0xc7b35448	0xec75d467
+	0xf861dde6	0x75d9ebec	0xcbc3e8ca	0x5e6d47e1
+	0xe7e499fc	0x6123c26e	0x19fe2cc3	0xde86af73
+	0xf0de8655	0x230a6313	0xe484cae8	0xf160e445
+	0x7c3ad8e2	0x29a2347d	0xcab560e0	0x737c2d14
+	0xb60d784e	0xe34dc241	0x39124427	0x632bb7af
+	0x150080d6	0x2988d6b3	0x435e4222	0xbc26852f
+	0x2cd7e704	0x0e2a05b2	0x1c41169f	0x07c41b03
+	0x0346f767	0xe96b6733	0x54dec6b6	0x8f2d3c90
+	0x1fe618fa	0x75dddb13	0xc9ba2a28	0xe9cc9369
+	0x2c8e53d7	0x3f781a20	0x5791014c	0xadebd041
+	0x855aee45	0x996d5acf	0x9f7219fe	0x94a426a2
+	0x779c04fe	0xd8a5f141	0x9ae3cc2e	0xce57a8ee
+	0x4865de61	0xe14d8d5c	0x98389084	0x81bdf77f
+	0x72aaab47	0xb11b1e31	0xb23c943d	0x65b0e428
+	0x9d2fde62	0xd64cfc1a	0x9ded7094	0x1446e84f
+	0x7b660a21	0xc26c252f	0x5ea92407	0xcc2dd193
+	0xb18d6c04	0xe08faa12	0x84366ee1	0x53dd342b
+	0x88f99d7a	0x97754233	0x54777ee2	0x72103530
+	0xffb77bdd	0x67c3f3f9	0xd1e9396f	0xf7e91a5f
+	0x1ca09c1d	0x148dcedd	0x4812f994	0x734bb2a8
+	0x4c616674	0x79e0669c	0xcc3695a0	0x965c6b99
+	0x54b4bfe6	0x24ff8fe7	0xf227fa4d	0xaeee1502
+	0x2207334b	0x444d4768	0xd1c3e5ac	0xc635e962
+	0xa5fdc383	0xd642360c	0x0bb1d6bf	0x40eb05b2
+	0x563d58c3	0x37ef1c49	0xdbdef02a	0x5c954622
+	0x249cd7d2	0xbc00f7b7	0xb9d311b0	0x84ebdfc0
+	0xb777296b	0x8f922505	0xe3007f02	0x45369d3d
+	0x1b1ef9ca	0x9434faf1	0x955491fd	0x918dae49
+	0x2c55e53d	0x2bb5e664	0xe306a3da	0xe9a4b542
+	0x74fecfe8	0x315d2566	0x42ce0ebd	0xfc8b2c09
+	0x4503579c	0x0194db62	0xaae82e99	0x638cc58a
+	0x6253580a	0xa9e134a9	0x7cf09364	0x2a0f2762
+	0x555e0f4b	0xcaf84599	0x88ff57dc	0x760f71b6
+	0x5f3b52b0	0xf8762c98	0x37d45f0d	0xcefbb54f
+	0xc99699c0	0x54638fd8	0x5d116ae9	0x0b125847
+	0x88aa62a0	0x8ac7b007	0xa97c115d	0x128e72e1
+	0x035d5aa7	0x5d16a915	0x9f1ef842	0x8e23b89c
+	0xb52d59c8	0xc048bbf4	0xca42c82d	0xdc85185d
+	0x0011465f	0xbb025e83	0x9ea0ffe0	0xda4c0e4f
+	0x89401781	0x7a3074d7	0x878b8546	0x9370c686
+	0x5ca6f5ec	0x96808035	0xddb4682f	0x5a616b12
+	0x57618954	0x0e3f255f	0xd3072641	0x8eed8068
+	0xb8fdf1c9	0xb417e2ba	0x9c613492	0x75c3a921
+	0x2e7e0223	0xa9a68825	0xef180ab9	0xe2550aff
+	0xf743b61a	0x92b02868	0x2e4d4a92	0x094055f0
+	0x5b901d5c	0x6512ecc1	0x1d6d35f0	0x114f6a1d
+	0x40bf1f43	0x8e7ba25d	0x8cee3d80	0x5df565ca
+	0x29403904	0x27cd7367	0xad48535d	0xa6e54d45
+	0x24b9e3aa	0xe301871c	0x53e21f70	0x514fb2e2
+	0x937c0248	0x82624d35	0xbbf2a9f7	0xd7b6e482
+	0x21c76f4d	0x430c1bea	0x445ba31b	0x7732e9d2
+	0x19175315	0x712cce54	0x56d653ba	0xe55361a9
+	0x7543f198	0xa8f9e517	0xe8ec0529	0x4681a1aa
+	0x3edd8dbb	0x8cec11b7	0x6b6f0bc1	0x8b9256a7
+	0xb5e86885	0x1a2d632d	0x59dd488e	0x4d529b15
+	0x87d3b0dd	0x3e334eb0	0x8ecc38cc	0xbcd42c7d
+	0xee7b85ad	0xf8db1ebc	0xf7242be1	0x936c4ad5
+	0xf0d3e133	0x15b21e10	0xe13ccd7a	0xafd28ab2
+	0x86f873d4	0xe75498df	0x1cdcacc7	0xa0952f4d
+	0x9c1aef8d	0x4c45d667	0x1ce18e2b	0x95e753ae
+	0xd3cc14c1	0xbc9d6c08	0xb9bb31cd	0xc38cfc3d
+	0xa0f90015	0xe71ec516	0x89996ee4	0x3ca7b1bb
+	0x5cb81d2f	0xf83eba1a	0xd4c7f0ba	0x0fa3724f
+	0xf70fc314	0x6bddc2b5	0x6b5b73ca	0x7fbeb86c
+	0xdc04567c	0xbdee5488	0xa5e84cf9	0x2d923cd3
+	0x10affb44	0x7072a096	0x569c6186	0x73b955ee
+	0x5f51325b	0xdbe6d601	0x80a09027	0xdce073bd
+	0xc4a57e68	0x8e36feb7	0xe95f03c6	0x24536972
+	0x7e9d0914	0xae891f9f	0x71b00cfd	0x4ad1d3cf
+	0xb0c12a1c	0xe6ae12ac	0xe55fae1d	0x41fa24e1
+	0x26ac1069	0x07f63225	0xdc6af020	0x736be557
+	0xbd81cca4	0x0d970e26	0x00aeee65	0x5a95aa6d
+	0xe11d862b	0x73445f3e	0x9debc7c6	0xb9fb9316
+	0x70c80f6b	0xdc3b462e	0x98e55897	0xe3c038bc
+	0x1e6be1e2	0x6b73a471	0x6b08dee9	0xc11316c9
+	0xa03ccd1f	0x9850a735	0xf6f69d7f	0x5f84661a
+	0x35124e9c	0x580021ad	0x83f5cc8f	0xbf6299b3
+	0x87a9300f	0xbfdeac53	0x3e71aa0f	0xef0f924e
+	0xa05ccefc	0xdde79132	0xd37fab59	0xf09bd0f0
+	0xe3d45f0b	0xd800d032	0x23b74559	0xccbaf882
+	0xd7482f3e	0x19b61427	0x8812072d	0xc7b547d5
+	0x3d77bbad	0x16a7a565	0x613512b0	0x1f5941d8
+	0x15c469c5	0x6b594868	0xea78dc23	0xb7edca03
+	0xec75b400	0x85960837	0xe295e802	0x442d5aa7
+	0x1a505b0a	0xb7100575	0x126ab9c6	0x30fc8981
+	0x33d1c5e6	0xe7b36f3e	0x2529f025	0xf7de09a4
+	0x9a237b73	0x4199b6e5	0xcd0ca5cc	0x483c7496
+	0x18a082e1	0x49d36b6a	0x29194f20	0x256236fc
+	0x7ea67a7c	0xf9902240	0x29abc52c	0x58178309
+	0x8d87c634	0xaddfa3ac	0x26a7582e	0x22a46c59
+	0x30275956	0x823d736c	0xc3fd5992	0x49151051
+	0x6f7e26a6	0x69f61e26	0x151611e6	0x0c0603d3
+	0xd472a6d9	0x3b41cc64	0xb2cc8f30	0x361a119b
+	0x2a6325f8	0x6068c424	0x770c3284	0x72ec88bc
+	0x833bbba5	0xa70802ca	0x32a5545e	0x5c22e9d0
+	0x5ab3d9f5	0x9007e5b7	0x24e39b69	0xd33bd9cf
+	0xdc9d6e9c	0x2b7836d5	0x757c6cc8	0xcae907cf
+	0x9e46c6d8	0x3bccb4b9	0xc66ab681	0xab9b12de
+	0x366df0b5	0x7f785550	0x258959f3	0x3a72720d
+	0xb4044294	0x11e76388	0x78006943	0x94321f26
+	0x09e5d3f9	0x2f82cd05	0xdee1653d	0x39b9ec91
+	0xc9012ee1	0xf885bae5	0x79493693	0x2b13808a
+	0x5376c547	0xc997b444	0xc581c3d3	0xbad42d8a
+	0x4901b3b5	0x968eee21	0x77455af2	0x10b0fa5b
+	0x20d71f73	0x575412ef	0xf205f541	0xc551b8f8
+	0x12773d9e	0x7561b494	0x8e5a2137	0xfa842331
+	0xf4a22b14	0xfceb868d	0xc3f356af	0x99c600de
+	0x9803462e	0x35bed02a	0x45f52576	0x3b87c4fe
+	0x92846fbc	0xfe85457b	0x5c17ab10	0x06ce7af4
+	0xced24e04	0xc0e6ae3b	0xb125d859	0x92364ba9
+	0x3a0042a4	0x910bbb65	0xf23b6521	0x5c0fab3d
+	0x3a3d8051	0xd213a5e6	0x16553ef2	0x3413123f
+	0xf7bb2e3c	0x174d8805	0xcc640b23	0xc4713fdc
+	0x9636237c	0xd71729a3	0xc301f9f2	0x63189fdf
+	0x88e96526	0x71b83d67	0x5e819dee	0x03b95fd1
+	0x50d95d14	0x6a3f8a67	0x23c337ae	0xe1863d6f
+	0x6c4b54ee	0x2d361ae5	0x7fe534f4	0x95c737b8
+	0xc9e50fe0	0x97c348cc	0xf007d43b	0xc6f9f79f
+	0x23d80edb	0x921ba7d4	0xae2ae8e1	0x67a7d17e
+	0x6773c41a	0x538aeedf	0xaae06e55	0x21150c78
+	0x2e80e133	0x99361ca3	0x717ea509	0x039822dc
+	0x18792613	0x55ddf173	0xc9c048be	0xd5e49d71
+	0x8adbc8a8	0x81200c61	0x6ae354ed	0x1a708d48
+	0xb349a77d	0x074143d8	0x2d0eac87	0xedacdf08
+	0xa964c6e8	0x3848583d	0x7916be91	0x7be53a63
+	0xe924661f	0x4fd00b9b	0xbfd03db2	0xb65d4052
+	0xd33500dc	0x73a5a54f	0x93c2a984	0xe114df2a
+	0x170408d5	0xecd50a31	0x9f20a1b1	0x34267201
+	0xbdfce32a	0xd8006ace	0x9732c7a5	0x3334c162
+	0x6ef73bfc	0xbfb4ae2f	0x68eddc82	0x2421d413
+	0xa75f7db0	0xb68d99ae	0x3b77b2c4	0x2e5f5aa2
+	0x18a02c7d	0xaecfaf69	0xa798a7a1	0x1710b58d
+	0xdda63c42	0xc0b9f0c1	0x6e98ac03	0x0a6ec04c
+	0x65b6d31f	0xbb420c7b	0x2d0ae4cd	0x073969fa
+	0x075ab187	0x37ebf9a4	0x75b32e70	0xf4e3b50f
+	0x072c13c7	0x629d6d10	0x692a9f39	0x9d424951
+	0x7ccc6e4e	0x0df85aa1	0xaae96b53	0xf0fbe227
+	0x79f4cba3	0x3a4cfe17	0x31005c06	0x2ee79ed9
+	0x175662a2	0xea67d5f8	0x6a585206	0x74ff608d
+	0x8d0e43da	0x46e465a6	0x8b3a1789	0xf58de200
+	0x7470ee83	0xf4b3081f	0xcab7b26c	0x679c03c9
+	0xb2f3e0b7	0x7b0ce5f0	0x54458cc9	0x10adf9d1
+	0xc6418621	0xda7db924	0x42c87af6	0xca18ee03
+	0xbbe316ad	0xffad751d	0xa90e2f31	0xa4f1b741
+	0x79b692b2	0x51c015f8	0x1ec279e5	0x0b66f53a
+	0xd873b167	0x86bb7c09	0x6250d31d	0xfc276aaf
+	0x1b912c09	0x033c336b	0x5e23abfd	0x4f5c8997
+	0xc674dd92	0xfa1817df	0xa56ca16e	0xec6b2cfd
+	0x2feac778	0xc468211e	0x8b60ac67	0x712cc8fa
+	0x4380f941	0xccc528dc	0xc71b2dfd	0xfb08d4c6
+	0xd493c636	0xa7783d6c	0xc7df0669	0x716e9db7
+	0xaf231a4e	0xda22d68f	0xe33184b5	0x3c207ff9
+	0x0318cb6a	0x42e7c8d7	0x4397e1fd	0x6b178ba7
+	0xf979d8e9	0xa968800b	0x3ef4c2f7	0x35386ad6
+	0x1c02b942	0x7a320432	0x2b210df5	0xd2dcfeb3
+	0x8151e49e	0x3fa01660	0x20b2c744	0x56869e1c
+	0x536b6037	0xac6a3c1c	0x7da9b889	0x510a284d
+	0x25e3a895	0x0dae3e72	0x54680194	0x5c8bac35
+	0x95037fd5	0x0dc924a1	0x06eb65b6	0x7e094b2b
+	0x34283775	0x5dd176d9	0xe30c266f	0x70249a10
+	0x2652882d	0x07b82677	0x6f200cbd	0x7cfbde35
+	0x7fb2004e	0x2c01c9cf	0x559cc8e0	0x61a1a572
+	0xfe7ae6a6	0x3658fd46	0x1f72b09c	0x716562d3
+	0xc3fd2552	0x4a7faf26	0xd1b88210	0xfcc8a888
+	0x9352ada2	0xc9649b3b	0x864ef2f8	0x40c3cc52
+	0x38c11046	0xf4b7b9e5	0xd3507c37	0xe0341177
+	0x8b02f6de	0x61e57507	0x7dec5942	0x20e67c7a
+	0x49c8d38a	0x6374e513	0xc4859401	0x3d83138f
+	0x90721624	0xcc979f52	0x43770516	0x4ce44048
+	0xfdcbbbba	0x195318d0	0xd4d67bbd	0xc3e3ca42
+	0xa9a993ef	0x04cf3ccf	0xdd53b6fa	0x670788bc
+	0x928dc8e3	0x459976f6	0x30afc373	0xaaa0421c
+	0x25014ae7	0xf15ea02c	0xa745d8e6	0xf1e8fc13
+	0x6e5d5330	0x2c6d628a	0x7a70b26c	0xe431d5c8
+	0x688f05f9	0x13af38cd	0xcead3e97	0x739092de
+	0xf947216b	0x9a7babcb	0x0ffb6763	0xa5aa9ae8
+	0xf555aec2	0x9524406e	0xe3c1aa92	0xddaeab00
+	0x9a8ed819	0x723cf554	0x510b9a8b	0xb0230e50
+	0x84e77af3	0x5ad3fbe9	0xda99502a	0xd87fad7c
+	0x90d91966	0x47afd789	0xc714548e	0x1bd44ae8
+	0xb6bbffb1	0xe212610f	0xa7be9aa5	0x2d7a51a7
+	0x58ad5cff	0xa69a29f2	0x56650abe	0x60ef1148
+	0x41c878ad	0x99e7cdd0	0xf942c629	0xda11df04
+	0x68a8d833	0x837dc701	0x21c1c80f	0xac3611c4
+	0x9fffc67a	0x46b75e05	0xa297896f	0x5b461329
+	0x72c55e08	0x9069d0f7	0x12e2bc4d	0x0087d348
+	0xcbf33420	0xb4daf92d	0x852a7cd8	0x640647eb
+	0xb08e6b2c	0x7f3b928d	0x4c01bc4d	0xfca759ea
+	0x7106955c	0xcf4a3778	0x6f55efab	0x07447abf
+	0x0cff9f74	0xd42ff16a	0xa03f4bbe	0x7dc27f82
+	0x752e070f	0x573515a9	0xe666b080	0x993fc9b3
+	0x0538fda9	0x5e4a60be	0x5cd19062	0x54dd5d8a
+	0x534e1037	0x75fb6cdd	0xa1e2e1cb	0xa5697b97
+	0x71e3eaac	0x78ebda0a	0x9909eff0	0xc8c9917c
+	0xe52fdd67	0x99f087cd	0x25fc8e89	0x901c2ec5
+	0xd35c94dd	0x2df236f6	0x1373f129	0xfa2de0f5
+	0x9243449b	0x665b513c	0xace1a572	0x9058a604
+	0xab37ecf8	0x22e84435	0x76a79cbe	0xd95909d8
+	0x1b517a23	0x3105603d	0xf6a11df5	0x137c2f63
+	0x444603cb	0x1d763abf	0xb71c6817	0x46b6a93d
+	0x46a43774	0x96db6af2	0xa14bac62	0x695d653e
+	0x99897538	0x6a5780ff	0x58415eb4	0xb907ecf9
+	0x3cb7d6ae	0x4541d829	0x482562ac	0xc4de34a8
+	0xbc2114e7	0xf54eacfb	0xc5b65bf6	0x7c7b3db6
+	0x6c885294	0x5193ac1a	0x7e80e8a8	0x255e7372
+	0x71935b44	0x70599b03	0x7240a62d	0xcc8ab48c
+	0x4eda8111	0x554286db	0x54166dc5	0x7c8029d1
+	0xf79fc09e	0x418c4256	0x045c82b8	0x2de3c54e
+	0x32dac6ec	0x2a5ddc75	0x69be6373	0x22bf468e
+	0xda52d5d1	0xb123f760	0x3c4d7690	0x5e00046a
+	0xd3102e82	0x15e20bce	0x3425b5ec	0x4b28fe48
+	0x6a942095	0x79199aec	0x566369e7	0x27821292
+	0x3dba6081	0xf72378e2	0x8e06822c	0x59669bcb
+	0xbc891709	0xc6af2d1b	0x909e57de	0x7ed2b997
+	0xa06ce64a	0x0b09c561	0x00a1a65f	0xa11faa7a
+	0xe7d1e118	0xfaeeb687	0xd05b4158	0x3b4c1135
+	0x18c1016f	0x556841af	0x09d960f5	0x88a98a6a
+	0x841d61e1	0x54c4a616	0x2ef515db	0xaa6f8670
+	0xa1f4b97d	0x54bd1997	0x95ded232	0x82257303
+	0x3f1565cc	0x65d285a2	0x2828f910	0x7a2290dd
+	0x7f0a8e0f	0x96470c2d	0x8efdb971	0x790fa536
+	0x90b9d2f4	0x615c9b2a	0x5ec4f5ce	0xc7489b5c
+	0x2ab45d94	0xf7bb05cb	0xec8e149f	0x94bb8b1c
+	0x1a6fb3ba	0x77d22379	0x82a8e9d2	0xce732d90
+	0x7108cffd	0x03ded7da	0x06e86199	0x8e2c02b0
+	0xcb2c0281	0x4c49ee4f	0x4b00e705	0xf828ee69
+	0xaab31af5	0x275ee2c0	0xec247123	0xfded371e
+	0x440d3f1d	0x201bd35b	0x76e6b8c1	0x7cccc245
+	0xdc0403c8	0x2c539a1b	0x80db718d	0xb738778f
+	0x489698c2	0x78928e8d	0x7f241403	0x83b5aa04
+	0x99d19efe	0xc52c6981	0xee504664	0xab09e1a3
+	0xf1d99af9	0x3987f801	0x6f666ccd	0x41ebab71
+	0x954645a2	0x7d037670	0x2dae35fa	0x82b60622
+	0x761d5e16	0x0a2aad58	0x9706d97b	0x1347e659
+	0x274d4c0a	0x74e8f15b	0x63129b5b	0x901ad757
+	0x8777b117	0x44e63d79	0x8bd3b480	0x07108a1d
+	0x02e03a7c	0x923e9811	0xaab4b369	0x51fe2c08
+	0xdc8456e3	0xfe49f3c4	0x2954e5eb	0xc54dee8d
+	0x0f80df98	0x63aaba57	0xe45d04bd	0xb15d4d92
+	0x2c8d9557	0xa04d0109	0x309ea608	0xcb0738c6
+	0xe9dacd06	0xee68f11d	0x693a4dbc	0xb11287d6
+	0x1a2e0e76	0x10fdf2aa	0x9c7ea896	0xfd6d6a64
+	0xb45df9bf	0xb55eb016	0xec82d40b	0x8d1ed23b
+	0xff38e0b7	0x9e330c13	0x7d537ac1	0x12cf35ac
+	0x6e6c90ee	0x2941504e	0x783385a9	0xb311af56
+	0xc08a6072	0xcd4f0ef2	0x3e076723	0xff3d56f9
+	0x161acea2	0x2eff759f	0xa506452c	0xa5a71901
+	0x658eaa33	0x6ff385d3	0x57b6eb6b	0x6d66aeff
+	0xacf53aed	0x74eb0676	0xb47ca784	0xfde6497a
+	0xaba4fe9b	0x29f52e2f	0xe785df06	0x1a21f65d
+	0xe339fc97	0xbff4f394	0x635c50a9	0xe7993eac
+	0x169f7568	0x9afbd085	0x3790fd86	0x89708c40
+	0xaf08378f	0x8cddfe3f	0x512e5e7b	0x2ccac57e
+	0x432d49a7	0x922fe1ac	0xd0f7416c	0x2cf9ea13
+	0x0fbad9e2	0xb9282867	0x1bcdd5f8	0xd50eb8c4
+	0x6ee9c0af	0x1a109a02	0xa233e0c1	0x77cd4e43
+	0xfd9876e7	0x81c98fd0	0x226a35bb	0xfb975e44
+	0xc5e290a9	0xd2f46341	0xcfb8d819	0x66a7274a
+	0x94e02e2b	0xdf3ca2bc	0x2f1dd3af	0x78462257
+	0x490f62c1	0x5ea11bd1	0x23d01a6c	0xffb348fa
+	0xda323bb3	0x17fce38d	0x8924bbc8	0x37c696ae
+	0xc35e964b	0x696ecb76	0x63e8f910	0xe1ba966a
+	0xb3b00602	0xf47e8114	0x2615a30b	0xbfaeabe2
+	0xf8d5020f	0x12781ee1	0xc0ab16d5	0x90020b18
+	0x66845dd4	0x6e66a277	0x8572a535	0xf7797d8c
+	0x348de75e	0x86f89a83	0x64848b5b	0xd7dca20e
+	0x57d60248	0xd8e4fe98	0x3a17c717	0x176435b5
+	0x52ab4735	0x6f9f35f5	0x615f63aa	0x48cc2329
+	0x5aa3897d	0xee9999bb	0x92a2bb36	0x8d40208f
+	0xc76f48e7	0xe648c445	0x782c5ae6	0xf83280d7
+	0x47f0d558	0x8deffa11	0x6524c319	0x9f60b5f2
+	0x9a6b7d9d	0x200e1d14	0x88d0c8a2	0x38506369
+	0xfd64aa87	0xecf06513	0x8a26932b	0x8b27c57f
+	0xcfbff561	0x4ee1d390	0xcb61a62a	0x490d373f
+	0xdc60f0ee	0x457fa88e	0x804c0d6c	0x71b52b54
+	0x9174b1a3	0xd63cc831	0xb65bbb2a	0xe47078b0
+	0xf526f67a	0xa722a8d7	0xb3f347ac	0x443ad7af
+	0xedb9147a	0x4393902a	0xbab30f17	0x2ac69afe
+	0x41fa55ff	0x88d1b1aa	0xa3dc36e3	0x9cbb4707
+	0xedff1826	0xfa80b980	0xd15aa9ba	0xcc5565df
+	0x71d1097a	0x1ded7d44	0x515af4f4	0x91f132a2
+	0x3833086b	0x0778bb7d	0xb50b443b	0xc42bbf30
+	0x0de19bda	0x7a2278d9	0x98452188	0x7f5e566c
+	0x428c699a	0xdd3082e5	0x57ffe68f	0x51faa68f
+	0x6e57e480	0x709147bc	0xdc526111	0x1d01f1fb
+	0x199410a3	0x75a82d1e	0x35e77131	0xbfb66d4d
+	0xd20cf839	0x17a00050	0x13020cd7	0x07738d81
+	0xc03ce801	0xa4336caf	0xc86ffe7a	0x5bcbc12e
+	0x9b7efdf4	0xa7b61193	0xe029ff62	0x29a61ff1
+	0x80b9e172	0xaa3e57bf	0xad1d11d2	0xce16c606
+	0xa92322da	0x16b79015	0xc4c6e8c0	0x27ece292
+	0x830bbab2	0x941a8f76	0x9d765045	0x9cd9aad9
+	0x5bdf199a	0x388659b8	0xc21a9647	0x3ca3e970
+	0xea948455	0x7e962f48	0x05aea56f	0x50933a6e
+	0x32f844ea	0x00925b86	0xe1e520b0	0xddff7542
+	0x9670ee54	0xe9ccf36d	0xfdcc295f	0xe328ac55
+	0x5b9a5638	0xf2caf15a	0x4f369aac	0x15d9eb8e
+	0xb57ba439	0x141f2467	0x02691964	0x4a27215e
+	0x049827da	0x1c06854e	0x9a1a7f56	0x227d90ad
+	0x585d7d0f	0x02120773	0xb76a4d3f	0xee4fd64f
+	0x7f94945a	0x0ec9beb0	0xfec85f9a	0x01d52eea
+	0x11269008	0x417decde	0xb66ff3c2	0x6ec6d1de
+	0x180cd9da	0x733ecaa1	0x9cd6385d	0xd9caa54c
+	0x4d8d26ff	0x85f4fdf7	0x48196b4f	0xcd1ceda8
+	0xb6c7c863	0x5c3671f0	0x10784425	0x0311bcb0
+	0x5e3f100d	0xd88aaa51	0x12e0eb23	0xc29a35ca
+	0xa1790cbf	0x3d9e3ca6	0x8b773d4a	0x0c8b4f02
+	0x79a0dd34	0xc8780264	0xadf4a473	0x9eb41db7
+	0x89f3aa34	0x10c7c008	0x08279d39	0xccbbffe6
+	0x306be328	0x52d44c5c	0x73cfae89	0xb5c82711
+	0x5d15bed7	0x3a4e311e	0xd9d7046c	0x9254b741
+	0x42018289	0x5fa67a0d	0x85b9a2ea	0x419b7b3c
+	0xe8821339	0x36f5a2e8	0xb447d566	0x553340e3
+	0x3132df32	0x48d0deab	0x0bb49158	0x75355135
+	0x3aa4c569	0x3cb9ac54	0xa73a9867	0x5e4899e4
+	0x2615816b	0x0604b573	0x9c070767	0xd26356e8
+	0x53933261	0xa6175afb	0x1632f9c3	0x2bcab1e7
+	0x37c57c51	0xe97811e3	0xb719360b	0x51ab2348
+	0x39aca372	0x5f0451f8	0x1068d924	0xf622d0d8
+	0x723b6015	0xd08141b6	0xc12c5c86	0x5d9c54c9
+	0xdc5f75de	0xbf48170a	0x5bf2c552	0x67c44ec1
+	0xe3cbe281	0xac7d823c	0xa0d9ed54	0x8d5e7191
+	0x119b69d1	0x81bc5077	0x70ab7567	0xe64e4de6
+	0xe8dad08f	0xb0885ce4	0x5d4df047	0x6a505a49
+	0xc90979d5	0xba8bcbb6	0x86357aaf	0xa35de476
+	0xcc238d23	0xee718054	0x95422094	0x92f40612
+	0xbce5dfc3	0xbfda5955	0xc1110667	0x33832607
+	0x923d8479	0x0819e80f	0x6ecb452c	0xaa408266
+	0x859e7e19	0xbf885a99	0x8ed80943	0x5717a581
+	0xc3f68967	0x72443b1b	0x4116229a	0xaa61a840
+	0x18f78912	0x032c14e5	0x5f3b85eb	0x28662050
+	0x0b10d6c9	0x3435eba6	0xc620a491	0x40ace7d3
+	0xa960f987	0xf17de397	0xcc385654	0x1c5ab258
+	0xd855b9a4	0x1a431ddb	0x39842fa4	0xfc639afe
+	0xf3ff2d7c	0x0bfd7666	0xdb189c2c	0x8c529267
+	0x8a4e8b6d	0x28b9c6e9	0xbe497951	0xcec75e71
+	0x96f3c1c2	0x72f16e15	0x946a9fed	0x12b84763
+	0xdf5a28c5	0xb5964d08	0x6135ecda	0xbe070220
+	0x3fcb729c	0xd29323d4	0x7759247b	0x5e5492a5
+	0xeac7b650	0x4c34a70c	0x5a97eedd	0x26bb2fed
+	0x7cc4b125	0xb89cd8da	0x6cf8e4b2	0xafefad13
+	0xc39a73d7	0xca78640c	0xe866bc2e	0x06e9ffe8
+	0xbeae327e	0x48be3d47	0x9b795815	0xb8f41c1c
+	0x26562469	0x26840fb6	0xe1b315b0	0x72c869b3
+	0x199c61cf	0xdb0be36f	0xe748b500	0x1580d2b9
+	0x6dfd3b43	0x5c02e6a7	0xf9720399	0x2c686d4f
+	0xabda5878	0x1652d37c	0x202fc972	0xae9dd35e
+	0xe805bc3f	0x24352d9e	0x1dfea6de	0xf7d81750
+	0x48b2ed34	0x8ac388e6	0x5283720d	0x09b4fb5a
+	0x1b94cb22	0x3bf2261c	0xa829a09f	0xa95e2122
+	0x16361e5a	0xd7554d4b	0xfc0d42ac	0x2e24554d
+	0xff51fb78	0x26ebfea0	0x58395138	0x143c8a55
+	0xc2293b7f	0xe9aa4b72	0xd1424a85	0xff9b8181
+	0xbb3eebaf	0x266de1fd	0x90db257e	0x7d35beb4
+	0xeaffac02	0xf79c88ff	0x3e14f387	0x0bc083b5
+	0xcbd395ab	0x1041b3b3	0x08ea7750	0x8728fc11
+	0xf61bd8b3	0x1f88ef7b	0x78b7e9b4	0x17b5c1f5
+	0x025e6c82	0x57f8d81e	0xde5866a8	0x7b7cba80
+	0x28221a45	0x96f83ebd	0x77c715ed	0xd3a4e160
+	0xd4be9d72	0xed659f39	0x7af0b3f6	0xb1d83c34
+	0x2876540e	0x0aa244e8	0x6af45032	0x52cc08ef
+	0x69b51eef	0x94367800	0x80adf5d4	0xcdf9cfc5
+	0x367d995e	0xa22aefd9	0x2faa28ea	0xf15648a2
+	0x8e397577	0x5e449c5a	0xb046cedb	0x17072ee4
+	0x9499b958	0xb230dbc1	0xffbdbc91	0xd8d60c85
+	0x0a139cb8	0x36e99cdf	0x4bdc3842	0x320fa3e6
+	0x075cfaa3	0x43240bd7	0xc8c6a0e3	0x43a14f16
+	0xd7d5d7fe	0xba846e6a	0x0579ab86	0xbf084d77
+	0xe8c4765d	0x8bd7ee60	0x8c4e7a16	0x2cad2f9c
+	0xd5bd8a08	0x63eefdd7	0x7528a1ef	0xb7512102
+	0xda25ea2c	0x4654e6ab	0x4cfc6989	0x84539f52
+	0x00f79862	0x65074163	0x45e2c2ee	0x28731aa6
+	0x7e9f6395	0xf8555873	0xd33bc4a7	0x8ecdbea6
+	0x49f0e7e1	0xa26ef54d	0xfb3e6779	0x35292faa
+	0x4ba9d214	0xead84a75	0x02cfdafa	0xbd1b47e7
+	0x36e2b9a0	0x98779f87	0xfc4ec502	0x71854294
+	0x5826c064	0xbfbbfaaf	0xa00db5c6	0xdea7f68e
+	0xa2d32e0f	0x46954ffd	0xeb66d2f9	0x35fb88c7
+	0xa2465311	0xf989f526	0xbdfa214d	0x95f0afd5
+	0x43a1041e	0x7740e027	0x9bb117fb	0xa63c0645
+	0x9db93447	0x5f250441	0x6537eac1	0x29f787fb
+	0x60f5a17c	0xec8f80e3	0x83c9165e	0x1d9ff136
+	0x8f43938d	0xf040a1d8	0x9e938a3a	0x48606674
+	0x932d15d5	0x383fcd65	0x4d7db303	0x5f633834
+	0x8a17761e	0x19528112	0x371b0358	0x1e34cfba
+	0x7046c689	0x438c7afa	0xad1bc6b0	0x9bb9e775
+	0x4d703091	0x04d9fc0d	0x494ebf77	0x610c1855
+	0x4b88816e	0x6c591a81	0x15597954	0x0fe13112
+	0xa949a9e5	0x4022dfd1	0x8eaf10e2	0xc436ad18
+	0x337254bf	0x0c44812d	0xc759ce3d	0x1da78e29
+	0xdba82250	0xe355c8df	0x6e614615	0x791713b6
+	0x247baf0c	0x9636e6b3	0x092382bc	0x196a100b
+	0xa0478de9	0xfd4f26b0	0xa5a1c49b	0x70d1ca23
+	0x6c54086c	0x47286307	0xa185c373	0xaec65e82
+	0x6ce77213	0x463b07d7	0x5420939d	0x3ee4fc03
+	0xc4cd11de	0x65d521b8	0x5304e894	0x8c707b4a
+	0x455ec718	0x10d082cf	0x20535bc1	0x0c3b1016
+	0x90cf26d0	0x25919378	0x671c24f7	0xeaa83d6c
+	0x9cbb1c64	0x42f1bbfd	0x43b5fba4	0xf4f6ef30
+	0xd2034c56	0x6f7d60a1	0xeeadc1f3	0x319af4d6
+	0x0c7e9098	0x0655d994	0x340a3544	0xb37d57bb
+	0x78d086b8	0x350297da	0xc8540081	0x7918666e
+	0x422de0b9	0xbed54d9b	0x03e32a80	0xf0d0c693
+	0x2fe80f16	0x5941f0db	0xa824c1e8	0xe46e7a57
+	0xfcfa4b53	0xb7d8ff24	0x3ab82e1e	0x0332c4fd
+	0x669fd568	0x64adabf1	0xd9c372b3	0x5ce6c28f
+	0xaa8a0e64	0xd4ced1ba	0xfa74c3f8	0x8a59e9fe
+	0x009f47ea	0xe7c2505e	0xad0470b9	0x92abdb75
+	0x9215812b	0x1fb86f54	0x57268f45	0xe91fc794
+	0x9bb1be94	0xc40daab9	0xb75cecd5	0x293c40c8
+	0xe507f284	0xb79f199a	0xa6a0cbdb	0x505cd140
+	0x04a6d213	0x84812279	0x09e5720e	0xf42e2fde
+	0x112178ca	0x1bfcbf80	0xf42738a3	0xd4e205fe
+	0x204c92ad	0xb916f4c3	0x0d7ce99a	0x90eef87f
+	0x924a4183	0x48d1978d	0xe6e16abd	0x5d9eb6aa
+	0xa7a0ee24	0x5aa5ab50	0x563ba4b3	0x7f2b08ce
+	0x641ec0be	0x955af0f3	0x4689d1ab	0x8625ae9a
+	0x11eda5e0	0xe5cbdb1e	0x010591c2	0x632b37eb
+	0xbc20a998	0x33b69747	0x414334ae	0x92b82687
+	0xdba623c3	0xb0d2d852	0xddf1511f	0xeca97e4f
+	0x8ebf5668	0xee509e06	0x8a9ceca2	0x7391233e
+	0x19e71554	0x02315bfd	0xa3fe5260	0x6e6b8370
+	0x1cfab468	0xf3cec4bc	0x11a6a066	0x129d2ead
+	0x79d0f2c1	0x6aab68d0	0xa243135c	0x5be05f22
+	0xba353845	0x7b96f7d8	0x2ba7c6c8	0x67b38557
+	0xedf2c1a9	0x9bc7531e	0xf72fbdda	0xcef2d3a8
+	0xa471a9d9	0x33a35e80	0xffe32136	0x974bf4e7
+	0x70c2d3be	0x95ab3510	0xd878a265	0x16548746
+	0xca45cfd5	0x2b22b0ae	0xf4f855b7	0x3f44b872
+	0xb66db844	0x680417dd	0x72188a88	0x27f830d0
+	0x09d64419	0x35989f77	0x33b7c1c1	0xf6e14634
+	0x3a0d712e	0x42b02a73	0x37592d52	0x34a2bf38
+	0x4434fa60	0xf1fa3c09	0x91ab7747	0x429124cf
+	0xa6b8eebf	0x5d2bbd8e	0x3dfd42c4	0xcd9ada39
+	0xbc3ecf68	0xf5b00eac	0x6e81fc62	0xf58437d7
+	0x09b3139f	0x27fc4f88	0x2d76418a	0xba8deabc
+	0x79557497	0xd322c58e	0x6669c5c0	0x97939ba1
+	0xe96972fa	0xe69d1ec9	0x816a4730	0x693cf703
+	0x1c350d84	0x328e1953	0xd29e402e	0xd4b68664
+	0x3070a143	0xf332f24a	0xf8f3519d	0x4829f694
+	0x15c92ec2	0x4c09709e	0xacad6a79	0x706821ed
+	0xffb8343f	0xa51a014b	0xec3bae13	0x2691fa26
+	0x50af71aa	0x9ccbbecb	0x25cacfab	0x4ff30e8b
+	0x827c619f	0x912c486a	0x8bddf9cb	0x1ca329c6
+	0x3c2494d4	0x4e3c0761	0x231246b5	0x1bd705f9
+	0x9b15013d	0x78fcda4d	0x42e62ef5	0xb7dcdac0
+	0xb27efdb9	0x09dfc5c3	0x5e6286f2	0xaeea106a
+	0x7869f2cd	0xe41b3015	0x8046e217	0xd2145f6a
+	0x45c88a59	0x892b2ea4	0xc8525432	0x1036d246
+	0x8e6045a6	0xf4f56dd2	0xb7bf140a	0x28cf6014
+	0x142b6c0d	0x27e31fe7	0x52ced865	0x4fdafb4a
+	0x68177bcf	0x2bdd5bdb	0x2b0fa0a6	0x0fcafe58
+	0xddbf88c7	0xde93d5b3	0x49e297a9	0x771049ab
+	0x3c2c3287	0x09134d1b	0x3764389a	0x3781cba4
+	0xed665fe8	0x9b055946	0xdc3ded39	0x6576e100
+	0x6826150c	0x68151773	0x9d1bee18	0x777ea1b7
+	0x4b09a72b	0x973120f9	0x92cc1baa	0xe610b576
+	0x7f08cb8b	0x12f9788f	0xa8387cab	0x38bfd391
+	0x6cb0b1b0	0x0b76d93d	0x73ebec97	0xf152a945
+	0xbd3d40c5	0x54362aa7	0x90e626af	0xa92dca8c
+	0x7865aa83	0x7defce09	0x2a173231	0xf1f322a3
+	0x6dcbe003	0xa82ec53f	0x609d2fba	0x7ed0daf8
+	0x21d72068	0xe50202d5	0x99324a58	0x5cd587b1
+	0x22de1ca5	0x8bbfc6f3	0xb4ef3242	0xb73aea5b
+	0x200b456c	0xa14a0da9	0x7ca58ac5	0x1a187705
+	0xd58896e9	0xa5bc10cd	0x3470d7ad	0x1247dc26
+	0x877172d9	0x3b1dc34b	0xb88494e1	0x39db9c8a
+	0xb802b911	0x20701030	0xea20b1c6	0xd28d8a3e
+	0xbd9d9f75	0xe371ca39	0xfe361a6f	0xedd62fb0
+	0xe76daec9	0xd600efb1	0x5f90ed95	0x5d6fb5bd
+	0xdb0ac4f4	0x8008a84e	0x845d50aa	0xe19c4754
+	0xe68847eb	0x8e5b5c61	0x994239fe	0x9834f61d
+	0x024a2077	0xc3fc21ab	0x6a45af08	0x35258359
+	0xf16b1eba	0xb3bc5423	0xc92d6b29	0x54e02b89
+	0xe6aa9df1	0x8a38aec0	0x031a68f9	0x1107d939
+	0xd7e0a74f	0x976c7d59	0x3fc7896b	0xa247b93c
+	0x58d2e8c5	0x6168e2ca	0x65ce7a4d	0x07eecbe9
+	0x064c67b2	0x06f57d98	0x2fb63ba1	0x7632e204
+	0xa6c9de98	0x8c382895	0xe74fc689	0x2a1def5e
+	0x31002493	0xc185e709	0xd18edc2d	0x7137deb8
+	0xabe21a4b	0xd17d019f	0x95274457	0x737b6860
+	0x9e0f6c6c	0x3fb11486	0xdf8897f2	0xf0d628ab
+	0xb290a618	0x3aab7d23	0x05677cf1	0x5056127c
+	0x14cfd11e	0xeb24053f	0x9654344e	0x6b1d8c8c
+	0x68cc5f04	0xbf17e79c	0x54cfe8d8	0x107f0a52
+	0x9bca389f	0x24252885	0xd758eef5	0xd898d717
+	0xeadf045e	0x165e25d7	0xa685595d	0xf637d696
+	0xebca236c	0x368079c3	0xfdafe821	0x89715066
+	0x6cd7aa80	0x31775690	0x0de0b4d8	0xae9fde9b
+	0xb425dead	0x41471330	0xcd4e58bd	0xf484f0b9
+	0xcbfbf813	0x1a25e5ee	0xe6456cea	0xc956ef7f
+	0x8ac948a2	0x775b1bfc	0x9739ab03	0x4f0b6411
+	0xb6b76e6b	0x9ec9343e	0x4f84c648	0xe1e66557
+	0x94f9fdec	0x386e4616	0x05c69bdb	0x93b0d440
+	0x9e5a3f61	0x635a80dd	0xdb6c23ba	0xc8d5f680
+	0x53767271	0xc0df8ca0	0x117efc6f	0x78758796
+	0xb3c77572	0x40e23c4e	0x82d7a503	0xaec195a8
+	0x53c1fe03	0xa131e6c9	0x2abdf9e1	0xa586fef5
+	0xb6d68103	0x34de4b9b	0xd4c02e0b	0xe5cda9cc
+	0x1a7e7917	0xb9b2f0f0	0xcabd1b03	0x18c17e71
+	0x07a37b1e	0xa83d6960	0x4dd66c28	0x32cc6b02
+	0x6eaca18d	0x7b166b05	0x095d85fb	0x938ec035
+	0x1a7e82ff	0x54bfb69e	0x6fbb6339	0xbeeaf829
+	0x8802a09c	0x604bdd0a	0x8191f84d	0x7da1e89c
+	0x64b9b0a5	0x6a5b6428	0x93eea3b9	0x21c433e8
+	0x8043427f	0x605e743a	0x9c81808f	0x7c976479
+	0xd7ef98c6	0x8b39cbee	0x89be6e39	0xd01dc72f
+	0xe6c09227	0xc8ecb3f2	0x399d3a41	0x4a91d1a8
+	0xf83eeda9	0xe1d4fe01	0x518ca766	0x0c3b1ce3
+	0x828f30cd	0xd3edf647	0xac126894	0xdd3f996c
+	0x601e5d4d	0xdd7856cd	0xce16a70a	0x99212df2
+	0x5e2b3d89	0xdb8d2ef6	0x70b79dd9	0x361a3a38
+	0xf6ec33e6	0x4ec9a451	0x1a280939	0x2d9d6d7f
+	0xfd4e1f43	0xfd5ffd39	0x83921d68	0x37db0d24
+	0x77c94204	0xf11165db	0x5cc1103a	0xab1d0669
+	0xd12ee8b4	0xa9ff0fdb	0xa494ff37	0x694f46c7
+	0xf64b5f33	0x520f1325	0x141eb18b	0xd29adbb7
+	0xa68fe24f	0x3d430328	0xedd40f99	0xdb5725f5
+	0xd3b0249b	0xf430037e	0xd105a0b1	0x95fe82ab
+	0x72dc63c8	0x8c1b45fc	0x96355d54	0x76e40b98
+	0x5f7baeed	0xba9b2590	0xbd64bbb4	0xf1541f6c
+	0x7ca49b5a	0x111f2640	0x4b86cb63	0xfe71a409
+	0x3ec03f6b	0xae4aa450	0x525163aa	0x1123ab5f
+	0xb385fc44	0x6901f207	0x2ff5773c	0xd55b0a75
+	0x6732e0e1	0x773f7dee	0xfe70aee9	0xd856780d
+	0xdee051e7	0xd950ffd9	0x4da637f7	0x13b4c650
+	0x2eff422d	0x0871c35c	0xb3e61664	0x1fb1abad
+	0x78e2ad46	0x44f63fe4	0x1e9e1d36	0xacf791a1
+	0x4fb51853	0xd0d5b2c3	0xf9728625	0x7160dab7
+	0xafe5d4b3	0x8bf7b7f0	0xd49a6ea5	0xab1694a1
+	0x1bc22cb3	0x3fcf2c26	0xf3237c26	0x442367ba
+	0x5dda5917	0x20031a86	0x1f1b8a1a	0x1477325a
+	0x546ee877	0xd347d71d	0xba45204b	0x750c5e9a
+	0xde39e049	0x4a544c72	0x627d76c3	0x13b7f044
+	0xe173e94a	0x64337a88	0x8e0548bd	0xfd0f0271
+	0x45721e1e	0xaecb5a8e	0xfb1f7bec	0x42449a14
+	0x620a6043	0x6310cdf1	0xb49eaae5	0x2bbf380c
+	0x26b7090b	0x4dc2da7e	0x3218693c	0xa6866d0f
+	0xcc998a27	0x57fa9a65	0x38a55c26	0x2d110f40
+	0x75fd7072	0xe147d675	0xb40adfba	0x3ea3896d
+	0xf289c62b	0xfad4fc7d	0xe5e10d26	0x1bd5f851
+	0x96f5e841	0x36a4e81e	0x670ba3f9	0x67aa030e
+	0x5577f4be	0x953b0bf3	0x307d00c6	0xbb9eabe1
+	0x871966cf	0xeb40c08d	0x74fd7e0c	0x49d4864e
+	0xf908f80f	0x1ea32c4a	0xd69e9ad0	0xaad2ad31
+	0xccf27a60	0x41ee5ebd	0xfe1dafcc	0x71cef55c
+	0x784168de	0xc4a0c447	0x315d99b3	0x0c2470f3
+	0x9002b535	0x29b95878	0x7a8a2ce4	0xb49967d5
+	0x37814d76	0x333b15fe	0x8a964085	0x3cd76bbb
+	0xfd1d1834	0xba0c3dfc	0x61d29379	0x8764238f
+	0x5aaf4d00	0x24c3bf1c	0x9c3c7488	0x94dd60f6
+	0xc844a0a1	0xef8b2bfc	0x0e8d1c17	0xd6d4d2d4
+	0xeb15153b	0x4f1233f6	0x8ed307ac	0x749fa7f8
+	0x387d4e80	0x80904eb7	0x53385377	0xf77ca9fc
+	0xbb037920	0x3cd8ef96	0x05ea8e91	0xdd0e0501
+	0x29779eac	0x55de6e6f	0x89874da9	0x56ad3af4
+	0xd8228766	0x9887bc22	0x213a0648	0x4db466af
+	0x550f82e4	0x964ab9e9	0x0cbcb32f	0xad872a85
+	0x97ef2fdd	0x8e78bb79	0x95be67ea	0x44c2d180
+	0x236b246a	0x3b253079	0x15c0dd93	0xef4b0368
+	0x30f36d65	0x506737dd	0xcc93b5e0	0xaf00bfff
+	0x1a79a0e6	0x4dad4900	0xe59a76c8	0xe1533fb5
+	0x75a4d69d	0x80744617	0xdc92e0f6	0x18e53a7d
+	0x9c1190f4	0x6411a55a	0x24137a70	0x3fad9fde
+	0xdfb6e346	0x7221d85c	0x6f6e2aa4	0x3ade33c8
+	0x9410407a	0x953aab54	0x8dde9999	0x7afd3ca3
+	0x1a92d29b	0xa78e9ace	0x95d15c64	0x95e9314a
+	0x0cf548cf	0x31bf5f8c	0x5cbae6b2	0x883b14a2
+	0xe21a9715	0xba500b0f	0x34ec849c	0x2ee98b5a
+	0xa3bdccfb	0x1022fa85	0xbf97abdc	0xf5bd1fe1
+	0x542d7143	0x896ed934	0xd3c42da1	0x13d90044
+	0x0573619d	0x305067bf	0x6f02b13f	0x0c516dc8
+	0x378699d9	0x838166f7	0x380ddd16	0x4c0e8bdb
+	0x61ba5a38	0xd5cf4a2b	0x0733d359	0x39468b9d
+	0x0d9e90c5	0xe8717681	0xe2d0a06a	0x8a436126
+	0xa5a31cea	0x03e217c7	0xe00398c3	0x1e36ee68
+	0x6bec78cb	0xd2de6eab	0x7d252266	0xbb4e8fb2
+	0x96c7fa6b	0x5758c3a7	0xe81f9a51	0x0337916f
+	0x4f31084b	0xa0dd1f6d	0x7da31b5d	0xbfbd5092
+	0x7d9f1e22	0xced1d5d3	0x8c397f51	0x68488587
+	0x2c89b78b	0x5c95b114	0x03a124b7	0xa9c22961
+	0xd05b4125	0x7987a218	0x9b33b81a	0x8dbece84
+	0xcd44692f	0xc2f7e2bc	0xee62478b	0x19a72768
+	0xf89a81c2	0xde94f042	0xe786cc87	0x1cf6dfe8
+	0x97357227	0x5d0b8ccd	0x210ded20	0xa3415b63
+	0x5a44c511	0xe00d553f	0x9106e41b	0xbb90e29c
+	0x4278fb00	0x13c4d245	0x0da5d28a	0x33bcd03f
+	0x622f99a2	0x5403b878	0xb755e5bf	0x93260477
+	0x57163c58	0xd5ad8ede	0x38597763	0x843ee2e7
+	0xf6bbfd8c	0xa80486d1	0x0aa9d04a	0xc3a21001
+	0x0988ea5f	0xa599060f	0x35ed1e4c	0x6861fb9d
+	0xdb49e460	0xeea1563c	0x630322fa	0x1db98607
+	0x061ce758	0x0ac92a43	0xb86273fa	0xc74cff34
+	0xf754e2f4	0x1d2a92f5	0x7345cab9	0x684f75ff
+	0xd68ac78d	0x7ac26120	0x2849d90a	0x9b9e68f1
+	0x61f0cf5c	0xa8ca277c	0x59b364c2	0x0c697e32
+	0x299f1644	0x390cc831	0x52f8fcc7	0x324a355a
+	0x245255d6	0x66571e06	0xff7cfc9f	0x9a1d968a
+	0x77d5b3bd	0x02118c12	0x886cb817	0x86863d76
+	0x6e9e8f89	0x16b32373	0x548c53ea	0x366dd932
+	0xc8bc0ed7	0xc55d2cb3	0x382a1401	0x0c343f0a
+	0xbb7022cd	0x775c425a	0xc942868c	0x491c03f1
+	0xe4e8bc37	0x57eb119b	0x161f1c40	0x78813d90
+	0x64ba5ad4	0x8c1a3687	0x6cc54f9c	0xe838a982
+	0xcb582447	0x946585f3	0x513fb0ca	0x1207f8f3
+	0x2c317225	0xd3144a73	0x937db9b9	0x1512f0fa
+	0x0144c46f	0x617ee635	0x6abb13d1	0xa5735cbf
+	0x28c41d41	0x4bf3cc5b	0xef15db89	0x93fd1b38
+	0x9429d27d	0xbe2c2385	0x8ad8bf36	0x47b18f4b
+	0x439baf8b	0x9f7b5c0c	0x403263e8	0x85a4a0ed
+	0x2ab72c87	0xe5962ae7	0xb2eb376e	0x023c83ea
+	0xe14729a5	0xef1f1f07	0xe8ad7262	0x4577adfe
+	0xb27407ff	0x299d5afd	0x2def24cf	0xb0fb321a
+	0x91a3ca39	0x549ffb9b	0x00c11c2f	0xd52620d2
+	0x483c3576	0x21b03393	0x6c19a634	0x60949c8e
+	0x2eb2bcb0	0x77b950fb	0xe5762d8e	0x491bfad9
+	0x6ecbc8ca	0x8f6665f1	0x1d76f0fa	0xe07c8ed7
+	0x93c70313	0xe3846992	0x84364566	0x642caf16
+	0x5ac66840	0xa8e4829c	0x1503a3f0	0xf0b7d2eb
+	0xac163682	0x4da9a902	0xcb03ab68	0x95395ba3
+	0x9c33a7cb	0xdeed8413	0x9d6b8d5c	0xb802340b
+	0x1ea7fd81	0x99313f3b	0x6b85ad1b	0xeb6ebef3
+	0x6e59a06b	0xfdc0fd57	0x0062b9e8	0xbf16842a
+	0x6cbd26a9	0x83444a69	0xa6f6c1f1	0x2cf5a079
+	0x1c3f8b9b	0x5c95aa6e	0xcdae53bd	0xdfce79db
+	0x3908fced	0x5e5d8e6d	0xbb15c722	0x1aaf5bd0
+	0xd978d536	0x91f112d0	0x3dde83fc	0x1abfd9dc
+	0xc42b4d93	0xb91530fd	0xe782c8b7	0xa78637ae
+	0x87827a53	0x332a694d	0x2fe77c47	0x4310fb1e
+	0xd9ce00ed	0x41458131	0x2db53f24	0x58e70ac0
+	0x48ae6ac7	0xf99f1548	0xb4547cf4	0x5d87e704
+	0x5f6481e6	0x4cc4b6d8	0x38e87cd7	0x9dc7790c
+	0x1a2458d3	0x1cb3d6dd	0x6b42515c	0xe4ad86f6
+	0x3854471f	0xe599520f	0x0499246e	0x9d76565c
+	0x75019717	0x5607a929	0xfcbae54a	0xc98593da
+	0x5d9c3101	0x80dd77cf	0xe8c8d2b7	0x40ce61b9
+	0x2090ba2c	0x487bd52e	0x2e4ed94c	0x3f2f0d11
+	0x7b66d583	0xd91b93db	0x7bb06fc3	0x80c38aa9
+	0xff6d96de	0x47806328	0x255fef60	0xefa54a24
+	0x74dc5c69	0x4b4db032	0xe15621c1	0x11c6b1c5
+	0x30e4067a	0x07d4b9a6	0xc466c81a	0x3d1baac3
+	0x9ccfb9d7	0x13d170e2	0x43ce03b0	0x6a010f61
+	0x53fca3f5	0x2c25ab82	0x09f729fc	0x9f706241
+	0x6a53b88a	0xec3b1246	0x6977fa94	0x02cfcfd4
+	0xe4a7c27d	0xe8e8ea3d	0xe845b11c	0x19862507
+	0x8acf6cd7	0x978be162	0xf01ded4d	0x7ff7e81e
+	0xe6f36ca6	0x22a0a9f6	0xcb178f7f	0xe2e15339
+	0x2f71a56f	0x75fd3f09	0x03c93002	0x26784382
+	0xf21aff81	0xe23413b4	0xdd1330df	0x2ecd91d4
+	0x7fd8d558	0x76878bfe	0x8b1dbba7	0x4383885d
+	0x003baaf5	0x299b274a	0x69e5c88b	0x55b2b499
+	0x522f83f3	0xa46c9774	0xb0212460	0x3085a0b4
+	0xdb229bc9	0x963f7774	0x47267dcb	0x1fa9ce5f
+	0x9433ccb5	0x2848a201	0x93019d81	0x421e703e
+	0xb121c267	0xcc2ad207	0x7f17e83a	0x596a8994
+	0x96f27104	0x89b2eae1	0xa544803e	0x5cb08340
+	0x2f720974	0x1350dcba	0x78ce7ae4	0x7d320399
+	0x3735c25a	0x0545b42e	0x3e4c7d54	0x6ed68501
+	0xc9b2f3f8	0x4e949c93	0x389f0e89	0x43ee36f3
+	0xb3c459f1	0x17513779	0x8229f712	0x215bde53
+	0x4b4b07a0	0x90ad9983	0xaeb3494f	0xf6f727ca
+	0xc28fabb6	0xddabcdab	0x01febf71	0xb244b8c2
+	0x0a455225	0x2901729a	0x0a7b35ca	0xf1b23e0c
+	0xa5f7c517	0x92f8e547	0x233ec55b	0x2bb537f0
+	0xeaf1b875	0x289e0104	0xda51c3d3	0xdfabadde
+	0x06a41866	0x4bf82f47	0x12060655	0x153525e2
+	0xb8cfef42	0xc307b295	0x778b6b82	0x036e40c8
+	0x6a4cdec0	0x750e09f6	0x0806ab28	0xf8dee912
+	0x45b906e8	0x08fb675d	0xae22c34a	0x2f54dc88
+	0xe98c7993	0xb76b6518	0xc70d5d8f	0x5987130a
+	0xd89d1cec	0x1744e957	0x22db0f57	0xc7501e9b
+	0xe9c9dc0b	0x1a8553a7	0xc15a4e4c	0x9e1840d5
+	0xeac1888a	0xba4c0a4b	0xdad84202	0x2d1b2d75
+	0xef06c127	0xd319a36c	0xd60b9d92	0xded20da2
+	0x00d23bdf	0x96b431fe	0x636914b8	0x494e02a4
+	0xc8c4ad31	0xe56bf0b2	0x28f07451	0xd86917f1
+	0xf7299383	0x977635a5	0x9026dc33	0x3e3b3b57
+	0x767118a5	0x04182a61	0xab5ee0ea	0x34f4cc0c
+	0xce072097	0x78d15c95	0x6735d38b	0xc23bab3a
+	0x7633847c	0xdd6d33fe	0xa1df1bc2	0x864ebeed
+	0xda785538	0xe87d3586	0x1b22b9ff	0x13160899
+	0x63bf5870	0x3e2955dd	0xf0ef68c7	0x51265578
+	0x63b70533	0xcfd7b598	0xeef8ed8d	0x760fa884
+	0x6375b455	0xa9c173e5	0xbee01756	0x6dd2f4a6
+	0x47ed59f1	0x7720dc3e	0x629c2a41	0x782040c2
+	0x7b86f562	0x7d5ff40b	0x17fb5fb0	0x26c157bf
+	0xbf0060e2	0xd9688952	0x98374c22	0x59ea8e69
+	0x252e4b81	0x123bf2e0	0x3d56230a	0x5188164e
+	0x93261c35	0xa564aa88	0x121bd9cd	0x5c16aec8
+	0x2fa246a9	0x15789e4d	0xa4bb3b72	0x5bafbec9
+	0xcd1b93fd	0xe2d0427b	0x56f5694e	0xf48953b2
+	0xc50fc819	0xe0af3ffa	0xc3e48bda	0xb80b874a
+	0xf9258e7f	0xad9f4362	0xfca90c4b	0x4884b4bf
+	0x4dee8a41	0x5c4d0196	0xc249d85c	0xbb5b9632
+	0x8b5635c4	0x2b637b4f	0xb840896a	0x4ca8646d
+	0x4696be9c	0x6630a968	0x5c5b4533	0x29eb7b7c
+	0x55f67376	0xa8dc36cd	0xb4f4474d	0xef64a1fb
+	0x1418534d	0xa76530c5	0xdcb4641b	0x8dfc7ae5
+	0x9afc17a6	0x44dab843	0x80f1f874	0x23b8762f
+	0x6cb7650f	0xf30d05cc	0x1f1fe1c0	0xba28476d
+	0x066fbc0d	0x97d7e010	0xb2d29434	0x4a42af7e
+	0xe0292aa5	0xfb450fe3	0x670c292c	0xdb35b707
+	0x8a981c83	0x30e2c3ac	0xe0e9c1b1	0xa8331796
+	0xcf5af247	0xc01b2f47	0xd25679ff	0xd5388c03
+	0x94227b44	0x95b55fa5	0x72fae874	0x4c760f50
+	0x3279c236	0x4b0e3026	0xf0ef3721	0x30ed3945
+	0x99f7e6e1	0xb985557e	0x6f5599cb	0x5c4d76d8
+	0x559f7096	0x183f53c7	0x7ddaabff	0x92ec2b04
+	0x5935371b	0xd968d5aa	0x4818a8f0	0x76d10b5b
+	0xcc0eddb8	0x86a730b6	0xaa95c741	0xdd404554
+	0xcc529f43	0x28567f77	0xe9dcde95	0xcfbfbf96
+	0x1f1253fe	0x60822fd3	0x2b0ed852	0x80e06c9b
+	0x5e8d23cf	0x577c0905	0x96069c6d	0x99c241c8
+	0xe5ae5dda	0x99539ee1	0x56abf146	0x917dfb3c
+	0xe84801fa	0x3d9b7e26	0x404c8082	0x3d704cfe
+	0xb6f7453d	0x1f509b7b	0x846b280d	0x8d20fa61
+	0x1990f9da	0x6dd00698	0xd0b108e0	0xfd767fe1
+	0xa6270bb9	0x1aeff8d4	0x7621ae8f	0x37f5f2a4
+	0x95bc6d03	0xf98e99fe	0x2b03c0d9	0x928b4e3b
+	0x3493fbbf	0xe5833647	0x42a92ec1	0x3ae9f16d
+	0x39089d52	0x8ebfa3e7	0xc05c7627	0x0b42a1ad
+	0x2773bd44	0x10f95843	0x53994b3b	0x0d3f8f05
+	0x4745c534	0x073c3264	0xe7d88425	0x12ce91fc
+	0xc45eed99	0xacda7b87	0x34819b15	0x44cbba73
+	0xd939e0cc	0xd02b4d35	0x2c2174ae	0xd8d25155
+	0x8af4ec1d	0xcbf70b9b	0x647e75a3	0xb5db7051
+	0x978b8f7a	0xb74404d2	0x1635f61b	0x8c1db8cc
+	0xd1414536	0x4caa27ad	0x58aec877	0x625683ae
+	0x076d11fd	0xe2bbbc48	0x75c3d352	0x25dc3bf9
+	0xbc0097b4	0xd8fa1b96	0xc9f01dbe	0x449393d2
+	0xda1893be	0x741f6c84	0x71538d10	0x38d42ac3
+	0x20f9e95f	0x3b6d6511	0x3547488d	0x9ec4e3a0
+	0xaa096298	0x7738626a	0x56a4a9c0	0x79a865c1
+	0x8a590afa	0x8d60b288	0xdb1e68ac	0xd4d1b724
+	0xdc734e47	0x167bbde8	0x43e2fdf9	0x847cd1c0
+	0x49034f8c	0xe9aff87e	0x8b743e83	0xb811b6cd
+	0x3546ec3e	0x856eb97c	0x41d4c579	0xad60d402
+	0x4f0ff4d6	0x9afbee57	0xe678e2e1	0x53a1d97d
+	0x22f885dc	0x642856fd	0x4a81b1a9	0x265dd2ba
+	0xef16b9ec	0x8eb61d21	0x4f484265	0xa668418b
+	0x5c28fe6a	0x895c076f	0x22294668	0xae1d0869
+	0x103b8f52	0x348edc9d	0x8094074f	0x00635bed
+	0x0e48d8b3	0x85a44cf4	0xc06e8cd2	0x96b3bb35
+	0xf80f6829	0x72070e75	0x45f139d0	0xae3c90ba
+	0x72eab68d	0x6dbaf724	0x7b1bb04d	0xeccdd042
+	0x6c55b042	0x5c2d3da9	0xe6883282	0x43085add
+	0xfed4e6d4	0xf6a4e8fa	0xd2609bb6	0xda70dfba
+	0x9e9d1d8d	0x4c4928c8	0x74ef7983	0x76c471e6
+	0x0a84f86b	0xc90a6f35	0xa6a3d84a	0x534312a3
+	0x021377f9	0x3e38177b	0xb7411fdf	0x47d09e78
+	0xbeedc504	0xc69f3e45	0xb9ad6ddf	0x67305b87
+	0x0eee93ad	0xeb42ec4a	0x2d792e40	0x36b38150
+	0x70553e78	0xc9faca6b	0x109523e8	0x92907948
+	0xb1bcea74	0xe949a024	0xa8416c81	0x535456c0
+	0x338ce49f	0x0fe855b3	0xcfe9d839	0x4a71671b
+	0x3b39dca4	0xe7f2f3b0	0x9670c765	0xd0b5582e
+	0x8af482af	0x4de8e13d	0xfc229249	0xa44568d7
+	0x9af47a09	0x56d992f5	0x6359b7aa	0x26179b95
+	0x681fcbc8	0xfa67fff3	0x253b2406	0x900be39e
+	0x1b918c3c	0x184cd65b	0x86dbb9a1	0x406555c0
+	0x9e71c8ce	0x08aafc7e	0xcf7bcca8	0xdbfee8b9
+	0xf6690e2f	0x67dc077c	0x971b0e18	0x93eabd5c
+	0x995e6579	0xe02aef8a	0x1dd8edf8	0x21e5a297
+	0xd8fbd7d1	0x6b778ea7	0x73818f7e	0xec9c60c5
+	0xbda7ec46	0x290f2b1b	0x9b9c1ff5	0xdbc720e0
+	0x4057d01c	0x583aaca8	0x42157273	0xd04cc9e7
+	0x17f006dc	0x7a0061c7	0x5092ebc6	0xaf39abc4
+	0xc83234b4	0x95766854	0x26beaf6b	0x7707852f
+	0x26b81ab3	0xf32e8f16	0x0fb218d3	0x92128d4e
+	0xa1c881e4	0xd99b97b9	0x32ddfdc4	0x788499e7
+	0xbd4da7e6	0x2134a49b	0x768f16f1	0x651e8ca4
+	0xde95ac3b	0xd63d22ce	0x2f7d34de	0x1f44aec0
+	0x22cf59ef	0xe845473d	0x249699b8	0xee698261
+	0xafdf6327	0x4b6c1eed	0xd55259f0	0xac3c90d3
+	0x4a5691b9	0xc2056b30	0x46726519	0x99097fe0
+	0x36204d12	0xae5f9c05	0x6146df29	0x2e3777e1
+	0xd96ff159	0xd6a25f3c	0xc39cf188	0xce8035c3
+	0x18915c69	0x6336aed8	0xba4ee698	0x14160c9c
+	0x5b3f9df0	0x76bae97e	0x42e4feaa	0x3977a8d0
+	0x37dc468f	0x04b24cc9	0x0bba0dcf	0xbfa6e345
+	0x44bdd1e8	0xc92547c6	0x6788da17	0x59e796b1
+	0xe2770fb4	0xd92b9ad4	0xd03d1b8b	0xd07b8c2e
+	0x8a543f84	0x05b0d456	0xfaed7eed	0x52d3fd0f
+	0xf9591f25	0xa00b2f73	0xf0107935	0x91e5b227
+	0x18850204	0x8dcfc51b	0xb6db0c07	0xf7116316
+	0x6a5dbd17	0x0d76e281	0x6005fac7	0x16d79045
+	0x31895a18	0x399371cf	0x536e420c	0xc49323af
+	0xd2b27dc7	0xe9a2c450	0xd1aacbd0	0x8e899397
+	0x67aa7c54	0x235619ff	0xec87a0b5	0x71be4483
+	0x06657d96	0x884020df	0xb8f2a975	0x12e2440e
+	0xd1966cb0	0xa7bfde0f	0xbb51bf79	0x8604d7ad
+	0x4f09e7a3	0x32e6bdf9	0xc964da28	0xa751b31a
+	0xdb35eee7	0x8c27e01a	0x26b538d4	0x0dd36be9
+	0x706170af	0x3b18f53b	0x9c7992d9	0x5ed9eaa4
+	0x47347d24	0x1ba8eb3a	0xa510b5b2	0x033d7153
+	0x7e91532d	0x4a81361c	0x288d3cdb	0x563dd47c
+	0xe7cd0eb7	0xfed9fb6c	0x4d4967a8	0x78f79653
+	0xf1325f1d	0xc165b27e	0x3b92daf4	0x3796065a
+	0x86eda8ed	0x8ac83880	0x4292f50f	0xd9afc9c1
+	0x9fb0b6c8	0x14eb0c0c	0x26cf5e56	0xcd98b055
+	0x1e40d460	0x872376a9	0xb5f0201e	0x90eb25f8
+	0xb4239ea3	0x146369b3	0x778889ae	0xc64a629e
+	0xd687e1e0	0x02663180	0xd37cfdf4	0xc3a99b90
+	0x936df670	0x343064b5	0x65faa530	0xfd161930
+	0x5d89793a	0x7cda7663	0x2a0078c3	0x9caff427
+	0x7c7eb5bf	0xa738ac55	0xa3ec5238	0x50d6b47e
+	0x6006e6be	0x9ce735cc	0x6f0b9435	0xefcd8529
+	0x5e49fa2d	0x3c56e74a	0xe5953695	0xe9435485
+	0x03350f9b	0x94fc5471	0xf8034f8e	0x1bfaf4cb
+	0xd99c75e1	0x8509d572	0x1d7e45a9	0x932770e9
+	0x5c830a84	0xdfb3fe3d	0x7e9d70e1	0x2780e800
+	0xe8408a90	0x704f3051	0x0f0756a5	0x10c5504f
+	0xa6c1ef11	0xeaddf020	0x7978f3a7	0xf6d772e1
+	0x0282f5fb	0x3da228bf	0x93f3edd3	0x1a3c0f7d
+	0x51845545	0xbae91b97	0xbae42cdd	0x497addad
+	0x7e7d072c	0xff1bcd9a	0x3329bf18	0x215c3451
+	0x5a1be9c0	0xc3db81f9	0x0583c1a0	0x134e3d8f
+	0x979b3eea	0x90f6eee1	0x84ce4681	0x573c40ea
+	0x5b93038d	0xa6a8548d	0xc6fa2186	0x5445b29d
+	0xecb121a0	0x0d1526da	0x43c6a7a2	0x5263513f
+	0x5d8cc589	0xef87c7a9	0x352c9ce3	0x7ee7e3dc
+	0x29d35302	0xebcc2816	0xa73da8db	0x8d6ad8b5
+	0xae2dd2ee	0xe3b008c9	0x560f1552	0xa049ef2e
+	0x86bd5c68	0xd28c5e3e	0x8589bc6c	0x19d2bbe1
+	0x94e340eb	0x8b1eebe3	0x4b57554d	0x0781be17
+	0x916fa9f5	0x603c886a	0x3762bb9d	0x6a88e776
+	0x070b02b2	0x02b511dc	0xcb0e2fd0	0x9f610d94
+	0x205c39b4	0x030e84bc	0x105d5847	0xd59ee0c2
+	0x4c000cdc	0x0414fef9	0xe7e5dba0	0x311b623a
+	0x9f8c96c8	0x61af8dcd	0x8d669491	0xb00d611a
+	0xd7fa1cc0	0x0c14260a	0x21e3145b	0x2575cab7
+	0x4c21c29c	0x5d35eaf4	0x888c262d	0xa370d1a2
+	0x81cc8ab6	0x09448c73	0xbcf40a87	0x76283841
+	0x9a2fac29	0x0b4c4aff	0x109cff31	0x289fee1f
+	0x942dfa79	0x221584e5	0x8918480a	0x3a3cf8c8
+	0x8870c5bf	0x79d8e3cc	0x7a5127c5	0xf50ef1ff
+	0xce14b7a4	0x815fdff0	0x984e925d	0x4e079d76
+	0xc48dc46f	0xffc63e16	0x3b72b70a	0x3d65ac7d
+	0x2d09b538	0xcdd74489	0x957827d7	0xbd28802a
+	0x7bd3a4c8	0x0323f7a4	0xd2e0fded	0x1180fffd
+	0x943e9101	0x39771bbd	0x3c9f2cfa	0xd43fc1be
+	0x159378e7	0x23dfd475	0x7366b82f	0xf70424ca
+	0x39252769	0x92e4e18d	0xbf985620	0xf0304d71
+	0x840aee3a	0x26396736	0xfa14e721	0x8496038f
+	0x3f75d64d	0x1a555d68	0x23fe7107	0xf91d6676
+	0x3e26d6d3	0x000d3b87	0x175a5caf	0x234c6cd2
+	0x1bc3abb1	0xeab04320	0x8654115d	0x7d3cd3b3
+	0x5156a35e	0x98e39a23	0x1c35f79c	0x516f34ae
+	0x455293e2	0xf44f7c95	0x61e01820	0x7d3edd82
+	0x9213352f	0x08966bce	0x473cbff7	0x9d139979
+	0x50b7f69f	0xf4264832	0x6e7fcd24	0x26756e8f
+	0xe62b221b	0xa2609ebe	0x9e88ba86	0x5505ae8b
+	0x7a096006	0x8a4811f3	0x103db4fe	0x40a48e38
+	0x8635607c	0xd2f38d22	0x297e3b49	0x6c90a21f
+	0x517de294	0x5295cd01	0x5077705e	0x8a21897b
+	0xa0ac1da0	0x221cddbc	0xa1e9653d	0x8caa99cc
+	0x1c8246ba	0xa50aeffc	0x3d5c71be	0xe2278aae
+	0xefca9113	0x214ecfb2	0x3e46acd0	0xcd029c62
+	0xccc5f799	0x13ba4d53	0x01a857b6	0xce918062
+	0xcc023172	0x70d9c96f	0xceac54cf	0xe39ea79e
+	0x411d6d63	0x0bd9756a	0x1ca60d69	0x1d09c516
+	0xddd3d36b	0x7fdd11a8	0x62a744ed	0x1c47b291
+	0xe1306284	0x3dffbdd0	0xf3243232	0xf1088297
+	0xa6f0d267	0xc1508ef1	0x1df5a29b	0xddc37fd2
+	0x1cf8ccfc	0xcffcaeea	0xc81be18f	0x2ccad7be
+	0xe95737e2	0xc67b0667	0x7382caa8	0x4a4a58cd
+	0x4247ddee	0xfaba56d3	0xde82cf7a	0x5301df88
+	0x6c57cdea	0xadd20675	0x23c86330	0x1e16d63c
+	0x02431073	0x23630e7e	0xb0e0e940	0x099ec0d1
+	0x6e7e854d	0x5e0bae04	0x7c650f85	0x190c0f6e
+	0x6d55b46c	0x97c0e70b	0xbab62ddf	0x8c52867c
+	0x5063c950	0xa38ff7af	0xbff35da2	0x4ed590fe
+	0x42b180db	0xe31c3a64	0xee1d74dd	0xff383c52
+	0xd3e7252e	0xcc1d120f	0x02a7cbae	0xcfefc2bd
+	0xa1abd1f8	0xbe007fd6	0xb1c208c7	0xae640518
+	0xc903dbc3	0xfe049c73	0x9c10ab77	0x00fb4dbf
+	0xba1fab03	0x94472765	0xfa6b1de0	0x45c382ba
+	0xf9e82dd1	0x6c97ffc1	0x05558b82	0xe3c461e5
+	0xfd0f4056	0x58b131b4	0xe0a1c278	0xe7b06c07
+	0x4aeebbdf	0xd304f26a	0x841897e3	0xab607818
+	0xf33dafb1	0xdcc5025b	0xaef62c8d	0x7c190674
+	0x5ccf46b9	0xac4d8f10	0x55aa5bfb	0xc4808316
+	0xf7bc5b55	0xe67fc285	0x91d33eee	0xe5e3b446
+	0xcf268c0c	0x00715de3	0x562415b9	0x75e45b2c
+	0x78cec40a	0xb6b452d8	0xe7d6c7e8	0x4d957481
+	0xd2d3ee79	0x3e31ba54	0x6045c572	0xb77d5c0c
+	0x92bdcfd2	0x0002d033	0xb866a4c5	0x95ee6deb
+	0x9934a3df	0xdc53496f	0x5bcff76b	0xa17ae9ef
+	0xa420b1ea	0x7cbef81c	0xca7cc86d	0xfad89413
+	0xf2e1fc25	0xccd1d762	0x43a52cc3	0xb8f96294
+	0xd05db9c9	0x760aed71	0x8b0d07c6	0x12e32551
+	0x04a17e2c	0x5559875d	0x145a9f9f	0xe8dd21cf
+	0xc81b8d9b	0x885bb782	0x93df24ed	0xdedbd4d5
+	0x8385507e	0x0e2e03a4	0x8b61a48f	0x452ca6c4
+	0x800c4bc5	0x3634577a	0x8a88f244	0x7c6952e6
+	0xba284820	0x55849ccf	0xfc706545	0x59aaf00c
+	0xe3554b17	0x4d56a632	0xb7d06485	0x8bdd62f5
+	0xe5f4ef61	0x16d2e19c	0xf851bea2	0x32322892
+	0xffb592b3	0xed4e8eaf	0x92974b49	0xb24d4db8
+	0x615c7f1a	0xfdc82a12	0x42364455	0xfc550c10
+	0xc8af5c1a	0x1ebede22	0x3a7c3fbc	0x5e573dc7
+	0x0382b39f	0x1f05874f	0xc03e404f	0x31fd13fb
+	0x2b11c5a3	0x162b8ae0	0xa6861122	0xe1b824d3
+	0x8bcfddbb	0x4dbecd7f	0xfdc25b5a	0xd16e15b1
+	0x55b5112f	0xf11217c2	0xd8139a4a	0x79d20da5
+	0x2c34b064	0x7cfe7771	0xd311f0aa	0x8dddcf75
+	0x3f493817	0x9b9b193e	0x2d5dfe6f	0x10f6042c
+	0xe7b2f72d	0xece22f9d	0xdf4fa708	0x533574f8
+	0x3341a9d4	0xd009d35f	0xc92922c1	0xeb24b1b1
+	0x26a9e0ab	0x288da2ec	0xc2ca2a7a	0xdad44c15
+	0x678390bb	0x306f8dcc	0xf3cc8f58	0x1f897400
+	0x0b08ebb6	0xc6999962	0x2d25cdb9	0xdb05ed8e
+	0x85e94793	0xde6cd4c1	0x70c01373	0x7e329df7
+	0x65a75cd9	0x700b19e1	0xf481c94d	0xa3946dda
+	0x32200c19	0x92baa53b	0x4fa53b3f	0xe71b63b7
+	0x8a74a1b0	0x490e4942	0xd256b661	0x7ceca619
+	0x181eee74	0x151effb6	0xaaa8753f	0xe9807163
+	0xd3ffdd84	0x9957bf49	0xe664e8a2	0xc25011a3
+	0x2d659ad7	0xf4b1414a	0xc4cca358	0x4d91d8b9
+	0x7530beda	0xb52bd177	0xaf8e90d2	0xd4ecbabb
+	0xfc9fef6a	0x1344e0bb	0x39bbb6c1	0x9f4c25b2
+	0x27c6efdb	0xb9b35e6f	0xae97797a	0xdd85fe41
+	0xa32fb35e	0x063e2404	0xdea1a837	0xafde0fab
+	0x55882c4e	0x38b4e391	0x437e49aa	0x2d46d297
+	0xb2bd8e6e	0xae36a3e6	0x1977f2da	0x46ba42ee
+	0x3f048c68	0x5f96ef92	0xea6eddd0	0x38539fde
+	0x3cad4c53	0xda123f1b	0x7c08143f	0x995b4425
+	0x91e7f202	0x13b3ffa2	0x6122c76d	0x27338748
+	0xbbf19aa8	0xab13342b	0x1df4d24d	0x95d8e41f
+	0xa85f001b	0x8b6617c5	0x8387c326	0xc63a9172
+	0x13d34c19	0x17d87d92	0xa9865c60	0xbae3f512
+	0x601f9f72	0x6dba49ef	0x4d62cd06	0x2cf42dc2
+	0x5ae11fd1	0x50a35fd7	0xd7795dc7	0x40310897
+	0x1a4bb21f	0x8c8113f5	0x55bcde16	0x2fa12370
+	0x5c6a1c19	0xc13b2571	0xd54d67c3	0x5d9674d2
+	0x5b28b05e	0x5dde9781	0x06a4e4fc	0x30b40878
+	0x171a86c8	0x641386e5	0x8e04cd61	0x632b95ba
+	0x9e802e0f	0x2b7a5305	0xeec8ea33	0xdde05bdc
+	0x454500a5	0xc279403d	0x1bfafe51	0x8032d0ea
+	0xa398b329	0xd6db01f5	0x1e4d454f	0x2f8c8fea
+	0x1bf7f3d9	0xead8f047	0x8b192c4c	0xc6939f19
+	0xe16366e7	0x107216b1	0xabd7780e	0xa24beece
+	0x4a04cfd4	0xe633886b	0x6acf4b15	0x85d74b92
+	0xde3358fe	0x765dfd80	0x3a14896d	0x9cc0fe2d
+	0x7550516a	0x05f7ae59	0xfe0b042b	0xe1d7c935
+	0x7a2e68b6	0x27d84d32	0x86f9f688	0xfc79d99c
+	0x9f18fa11	0x0eba09e1	0x5446dac1	0xc19da943
+	0xfd7aed7d	0xaca9b65d	0xc93f6976	0xbfeec780
+	0xb76d13b4	0xf872fd7c	0x31a67785	0x8f1869d1
+	0x5d95d16f	0x0eb43e3d	0x5ecccdba	0x39852805
+	0x92c43fbd	0x1c36738d	0xa08b382a	0x5da59286
+	0x059315ee	0xf3186365	0x5515e98a	0x23ef39aa
+	0x1dbd4089	0xbd7f88bc	0x1123394c	0x967440ae
+	0x97bec31e	0x4d7ad282	0xd6d8c9b1	0xa06c9673
+	0x96c73bf8	0xd58c200a	0xbabba6b4	0x1bef7dc8
+	0xba26cf24	0x92cb0af1	0x592f13fa	0xef4cdc58
+	0xd65e4cb7	0x48c4106d	0x1bdb7acb	0x65a4887b
+	0x1eb6f79b	0x7af8d180	0xfdc90059	0xefec18be
+	0x4203d88c	0xbf756ca8	0x6b11faaf	0x507607ff
+	0xb2af9e23	0xc74f2d6f	0x568e33ec	0x33bdb129
+	0x63748473	0x0a1bafe2	0xdd82c263	0x93e2fcba
+	0xe196494e	0x52005967	0x2be26f02	0x591332d0
+	0xc8ac5d46	0x17088f44	0xeca12983	0x3799c4fd
+	0x47f62095	0xeda06c65	0xf2cb3455	0x117e0c68
+	0x74fec213	0xc8a652ff	0x338e4840	0xf590dddc
+	0x0a3ee9fd	0x60e23d83	0xb44d23a6	0xe1920037
+	0xdce96701	0xfa34277b	0x9f9ab88b	0x8cfb722c
+	0x66431f59	0x4c37f1a4	0xfbfab598	0x95ee3437
+	0xd338f436	0x4cd9d0be	0xffad23d9	0xa3dd4d6f
+	0xfd4b53dd	0xdb5bc57a	0xddf2baa0	0xfdceccb1
+	0x12025458	0x2f29cfeb	0xebfc2d0a	0xb8d6509a
+	0xe7ce0731	0x0d8c538e	0x6454c057	0x8911157a
+	0xe99ae359	0xb7c960c9	0x1eab1fd6	0xda058037
+	0xa08e7b63	0x45870d45	0x0fb167a3	0xad25fed6
+	0x0844c4d8	0xfee41e4c	0xdd53b488	0x096c6c8f
+	0x5e6a34b7	0x5c24aafa	0x39df9116	0x101795ae
+	0x020add80	0xd644cd6d	0xfd1d7c12	0xc59116ed
+	0xe0b15366	0x90f56459	0xe035796f	0x698a88ed
+	0x78700bca	0x0d9fa980	0x6368b93f	0x61feac15
+	0xfd82b21f	0x8c694a54	0xc317fcf5	0xc2a18c95
+	0x2a3013ad	0xf83fef17	0x44467b9c	0x4047b2c4
+	0xdd920d54	0xd487e3f8	0xf0f92f79	0x13e48f43
+	0x9705bf94	0xfcbc9e3b	0x6d12d9b2	0x985ee1b9
+	0x2e24fa3c	0x46dd8662	0x1cc299dc	0xd21b40b2
+	0xeaeda8dd	0xbfbd1a40	0x8e1a0a8c	0x56a40b91
+	0xf95cece6	0x3a287e01	0x9e0907b9	0x3309b654
+	0x9a5079bb	0x36dbb78b	0xf87c0669	0x775ae8f6
+	0xd4332970	0x2a2a5975	0x28b0767a	0xc110195c
+	0xbf8f47a5	0xb7b9ec93	0x209d3c7d	0x553d8613
+	0x63559ade	0xf692bf89	0x4da236db	0x8d5d69c6
+	0x0991cefa	0x8461b5a7	0xf1d154b4	0xfdaab3bb
+	0x2959c2fd	0x1d5f7b82	0xe730df15	0x11011c88
+	0x016c4062	0xf8d7b303	0xa8ec06f1	0xdc49a98a
+	0xab73e277	0x6566e521	0x566feb86	0x29bb70ed
+	0xa163cef9	0x5e927c40	0x5acffef7	0xefec277d
+	0x07d1c031	0x63efda30	0x52aa8e08	0x3826c55f
+	0xf09909aa	0xdabc930a	0x8266463e	0x3b83fcf8
+	0xcc37dfb9	0x21d64edb	0x9c3b4dfa	0x39fce836
+	0xbf169f0a	0x034979bd	0xcfb36d81	0x381c7551
+	0x28e54be1	0xa8101c44	0x0179404e	0x0ea377f3
+	0x33b8f2e9	0xb7169617	0x9cd2eb38	0x767db03d
+	0xaf40bf7e	0x0ea102a9	0x7a5efc59	0xf2c4b32c
+	0x1547d8bf	0x996d0646	0x77aa0e71	0x3955d7bb
+	0xdd2b7fa2	0x08d5f569	0xda2425f2	0xd87cb778
+	0xa846b6ce	0x047c29d1	0x038a55a5	0x3dfac25b
+	0x3edb60ee	0xbbecb7d1	0x45095acd	0x3f135521
+	0x2f01df8d	0xc1e41e56	0x454d7265	0x85a2d14d
+	0xa233c32d	0x18413260	0xda873753	0x3084d995
+	0x3bde0b3a	0x96523ec2	0xdf924ff3	0xb00ec764
+	0xda13676d	0x58bc42bf	0x2829a06f	0x2efba826
+	0x00ffe1ad	0xd6b5cc2a	0xf53ff94d	0xcd685cb6
+	0xf9bed7db	0x0b4ddd1a	0xe8a448de	0xc495727c
+	0x68cf6052	0x11cf0218	0xb63d6908	0x24c1b0e2
+	0x75eaf5c5	0x7114c81d	0xd596913c	0xf8310f81
+	0xa1dac3da	0x50c235a5	0xd535df89	0x835ccdf1
+	0x2f0a0505	0xd6d76b3b	0x3a203ed4	0xded4a58f
+	0x7b7dadea	0x9103eae9	0x4ee7f33b	0xe785e1ce
+	0x5e0633f6	0x70beb9c8	0x145d7ea5	0x9e7891a8
+	0x2845916e	0x1a61b6fc	0xd90c9265	0xf915e61d
+	0xfcd5c8ce	0xa0f12501	0x6e2dccb1	0x388ecc82
+	0x9519ce00	0xbdefe148	0x1392dec2	0x58e97609
+	0x5bae1b18	0x69929d43	0xc2346b30	0xfa4a2e99
+	0x9ab7eb3e	0x3eb11055	0xd16d2ddf	0x7b70f2c5
+	0x55187d91	0x7d2c7520	0x0e69f3ab	0x5e2509c5
+	0x728e44a2	0xd7a612be	0xbabc885b	0x93016436
+	0x60258064	0x4bc489ff	0xff9de32a	0x98dbc15e
+	0x48eac41f	0xf753d2c6	0x3661eeb3	0xdaab4d1c
+	0x5d81d91a	0x8662b646	0x5952bdc3	0xe38c69e0
+	0xc8537ec1	0x6a9492b9	0x02452afe	0x8f06dd3c
+	0x565a0d06	0x67da4191	0xdc48099e	0xb777bb54
+	0x5d857773	0xfd4ad163	0xd49a6672	0xb2ef80f1
+	0xc6a96c41	0xa6e8db1c	0x6700f1a3	0x683d6730
+	0xa4580400	0x5feb5d8c	0x72dc9b68	0xf40dfab9
+	0x750400de	0x7cc468b3	0xa3e36eb6	0x5e029d98
+	0xd4632a18	0x527a7d4c	0x62bf1ab9	0x7c3a71b1
+	0xefe9c651	0x5e812162	0xaf0bf476	0xb11b216e
+	0xcac9f3db	0x9f068787	0xa4230a9b	0xc4ee7735
+	0x091099b9	0xe0c89a2e	0x844b5e78	0x9a208c07
+	0x86f48fe6	0x1f2b8bac	0xc8873d41	0x7380cce6
+	0x1f80f956	0xe9ca8d9e	0x4baddaf9	0x2687537f
+	0x9d4e2f19	0x8a634fdc	0xa5c1c324	0x258f1e18
+	0x4399e859	0xe43a7e7c	0xd572faca	0x914bcf39
+	0xf2dd53f1	0xde126168	0xa4940acb	0xc8edb772
+	0x4a089deb	0xe9308ae3	0xad97a55f	0x8853ae8c
+	0x976d4337	0x919b885a	0x155ac377	0x5ffcdb2c
+	0xec335ab0	0x4118c00d	0x10f6d291	0x89adb1bb
+	0xf514c024	0x2d6513dc	0x8b8743e2	0xff2fa127
+	0xf4be8a38	0xb54de614	0xaf2688c9	0xd50dc4ac
+	0xdf71a920	0x7556deb6	0x2b0a08f4	0xeb47487d
+	0xae9244df	0xf81216e3	0x42699e0b	0x953ce6a5
+	0xa3fcb558	0x76547905	0x95086ca7	0xf29f303e
+	0x027975ae	0x313b5bbd	0xa8f8d662	0xf32c6538
+	0xa4c44558	0xe626d8aa	0xe7b73b5e	0x21957cb2
+	0x4f830a34	0x713f6e71	0x52241020	0x4f152bfa
+	0x1efe2a53	0xf45c268c	0x569e09f3	0x4878ef31
+	0x77198eae	0x0057bfe0	0x71541c01	0x1eff510d
+	0x34d84a6d	0x43787da0	0xdc4bbc4c	0x9c5656a5
+	0x067a0908	0x806d8a21	0xff3cf1eb	0xbeb9435d
+	0x5dd154a3	0xd4cf6735	0x376e86cb	0x114cbc28
+	0x4e26f648	0x9e15b6a0	0x57e5ce4c	0xb9a084f1
+	0xd9a0385e	0x4cd29cd6	0x80287ea5	0x12609d95
+	0xc705541c	0x0b9cd2a2	0x98af1097	0x0e0ccec3
+	0xdbfb6216	0x370549c6	0xe36cd94b	0x7a71d4b0
+	0x09e51ffc	0xd83c2c6d	0x32e63037	0x87b7c18c
+	0xfa74b115	0x3045a93c	0x146ecc07	0x329bf17f
+	0xcc50fa94	0x6ae5027a	0x9ec70396	0x9b8f3ecc
+	0x565335b9	0xce0a5dfa	0x2b41d3cc	0x6f20e5d8
+	0xd1ab9ee0	0xd5f04207	0x4296927a	0xe5c629e0
+	0xf7b776cd	0xdec98eae	0xff1fe0ff	0x2fe2e3f0
+	0x9ffe3481	0x3f649922	0xfd960e99	0x88ffd8e4
+	0x417db733	0xb233f1e7	0x9dbb56ae	0x271646bd
+	0x8f6a6a2d	0xdf70cbff	0x64ec8381	0xfe97aca2
+	0x48a8099f	0xbe96d90e	0xd32416b6	0x0136efca
+	0x71676cca	0x9d6ba000	0x5c040306	0x0ea08882
+	0xd41a8ef9	0x30dbe3f9	0x73e822db	0xd791f185
+	0xacbe39d6	0x4ea7b8b2	0xde3092f1	0xa1b98671
+	0x83507aeb	0x3be451ba	0x57c7c672	0x773399f7
+	0x9cef2b76	0xaba00924	0x4a333a0d	0x59bef9b7
+	0x77b7ae3f	0x7cbc022b	0x99825bdc	0x6b434156
+	0xbe86d9d7	0xdfd89b81	0x615301f0	0x645c2004
+	0x81a0d706	0xfa5fc5b3	0x3ddea2ac	0xf8b77c77
+	0xdbb9afbf	0xb2966f32	0xa9ef0668	0xf80a9fd0
+	0x46b678fc	0xa5e4783a	0x585cd0cf	0x8dd017a3
+	0x5df45495	0x0f96a151	0xfbcc6c28	0xbbb01982
+	0xc60b9014	0x0da33bd7	0x3f8c9e48	0x4bcad7ee
+	0x8f29bea0	0x434bd06d	0x2d40ee8b	0xf674fefb
+	0x7d13c2dc	0x8b102d90	0x25ee47b1	0xee42f973
+	0x6abff5c0	0x90337ecd	0x650b75fe	0x57592038
+	0x9b8172de	0xa818a53a	0xc9ba76c0	0x84f6302c
+	0xbc2dacbc	0xa33c4350	0x05ffcbf9	0x46178e9a
+	0xb8802aa7	0xb77cca54	0xc4acf832	0x6329da72
+	0x9e0bc1d4	0x4dbad7cc	0xcc1435a6	0xf62df35d
+	0x23bf4f9d	0x5655c820	0x8f362a62	0xbe3c7c4a
+	0x7db11ca2	0x3a5c8fd5	0x04b9598a	0x67a21cf5
+	0xfddeb57a	0xcba92e27	0x85dd2a2e	0x410c03f2
+	0x37d01792	0x52fea426	0x6bfdf31e	0x63cb798c
+	0x6fd48d31	0xac08449f	0x76fd6be5	0x59b6f6fa
+	0x7d7bb61c	0x8a921346	0x5fa14930	0xd00ef222
+	0xbb5d6d04	0x7e4542be	0x56532853	0x6074a287
+	0x21f8b4fe	0xb91b2398	0x72287a1a	0x4edce9fb
+	0x5418c044	0x3b90ef86	0x38620751	0x9fed1072
+	0xc8d64b1d	0x397a4379	0xc0534beb	0x806c80e5
+	0x309b7d0b	0x0ffe292c	0xefb53f50	0x3cd38191
+	0xcc5a6cd9	0x1dca92dd	0x3f7af05f	0x796e20ab
+	0x1715da6e	0x5bb48b9d	0x8a06a2fe	0xe06fd98b
+	0xd7a429ed	0xea2c8ec4	0xb365f13f	0xa803131c
+	0x1ebc16db	0x1e85595e	0xa370b578	0xd3036dba
+	0x0d97668f	0x6ebf2e28	0xde53e48c	0xef8d9c9c
+	0x1697a020	0x65362f2f	0xab0b2447	0xf06ac16b
+	0x68cd2cc6	0x8dee764e	0x41c7f21b	0x89a7d310
+	0x171bfbeb	0x93233fc8	0x4b72e18b	0xef38bda3
+	0xe5a9b23b	0x1f4f7ea1	0xeed90665	0x2f8899ad
+	0xcf933790	0x878ec306	0x59c63347	0x73da1ec8
+	0xcd703bfb	0xdba0f460	0x412023f7	0xf5ac4823
+	0xfd3d5203	0x34b71f30	0x280e7077	0xfab4283f
+	0xb666f47f	0xd5410131	0x79f36bff	0xa94a4d26
+	0x100c5a04	0x4f588fd2	0x6630ad71	0x26a5946e
+	0x7f690901	0x82d8e4e4	0x99bfeafd	0x687f3ab0
+	0x6c99abba	0x988bc7a7	0x23c19c3a	0xae9a5d40
+	0xd0545a03	0x4b9eda6b	0xfc01747e	0x6c02950c
+	0x099d4e73	0x32bc7385	0x299c25a6	0xe8a3095c
+	0x3acaea23	0x893b3b01	0x7ce8a326	0xa4ebeb1a
+	0x64509259	0xd9eebbb8	0xa88fd8b4	0x7b92ed79
+	0xb41eb189	0x50bebf8c	0x9763eca9	0x861359cf
+	0xeb0716f4	0x34d23cee	0xdb7a4372	0x193cb7cc
+	0x7ea76d3e	0xd26c0d17	0x080753fe	0xdacb9dde
+	0xbcda60b5	0x64f756ae	0xf19ded12	0x69775827
+	0x9d581039	0x444e92ea	0xaf3fe40f	0x49c17460
+	0x62b3f21e	0x2e20a0dc	0x9d1e7d46	0x66a6a703
+	0x45c8ada5	0x6ad9e74e	0xa0ab96c8	0xa0c1ddfb
+	0x9ed0fd66	0x659c874a	0xf3ece1d8	0x1b0302d5
+	0xa4ab0a5b	0x78e4ad92	0xef11406b	0x3a02e6ec
+	0xf733a593	0xea7a3997	0x0f4930b3	0x18ca72cd
+	0x8e312e70	0x345fc898	0xb38aedd0	0xbc7adf8e
+	0x580b9f57	0x7dd53eb6	0x1f0e7300	0x5524f2fb
+	0x25280378	0x45dddae7	0x2f1b38fd	0xd9c448f0
+	0x4c561bcc	0x72d2320e	0x23de442b	0x7f5b9046
+	0xfdd80059	0xe9ca2598	0x5527ef4e	0xc834b9bd
+	0x1dbc357d	0x2656f81d	0xa9549423	0x338e5639
+	0xc19706ac	0x0ca6028d	0x86ef336d	0x6c822807
+	0xe40fb194	0x4de2320b	0xb9eef8be	0x33655612
+	0xa2cd1803	0x480ce7cd	0x51c19215	0x68f2c282
+	0xdb097679	0x0f694612	0x03d9bf77	0x3f1e04d9
+	0x3e613825	0xe5833060	0x729a811a	0x2a4ae763
+	0x05cd1497	0x8fbe47ba	0x04e83aa2	0x505717f0
+	0xbf0b978e	0xd378cc7b	0xeee38551	0x5092a751
+	0x52dd9f6e	0xd59ee759	0x4528f839	0x2003c88b
+	0x10b9afa8	0x0bb880c6	0x5bbdc70d	0xe9b5e179
+	0x0941507e	0xee252bf9	0xea772da9	0xf099310f
+	0xf6fabcb0	0xf038e392	0xac061a3f	0xd51656f1
+	0x514935bc	0x3fd22f7d	0x254b06a8	0xff2877f5
+	0xd848996d	0xef66e1a9	0xf79ed46c	0x2196e979
+	0x522b472d	0xcfedf066	0x9a768bda	0xd48632f4
+	0x4773ccbf	0xec4435f4	0x46f7be05	0x2bc5d794
+	0x03f31d81	0xfb7103cf	0x3dedb78b	0x9fc36042
+	0x2280e88e	0x4d250150	0x8fa7e54d	0x5cdaa33f
+	0x4b52bf85	0xb32a714f	0xce7a9013	0xed0fcb60
+	0x8718e79b	0x74e26a9e	0x1fb725a0	0x6e8a63af
+	0x332eb12a	0x36c32a05	0xcc456676	0x95dc04d1
+	0x77f85170	0x304a6906	0x8612e7d3	0xde994cd9
+	0x0b285e4a	0xe60b523c	0xabbfd040	0x374c76b0
+	0x5e40f411	0xe93f8f9d	0xd55059cd	0x2c40bb2c
+	0x1d0bc87b	0xf258dca2	0xb66c26da	0xead5a854
+	0xedf1ab2c	0x2392bf2f	0x3480ebc9	0xf5f1dfab
+	0x4336fc17	0x89bc6f5e	0xf794b812	0x12300220
+	0x8cf10ef0	0x55d78885	0x5c0cbf25	0x1915799b
+	0x52b6d7e1	0x310bdab5	0x07edfb80	0x243abead
+	0xdcf99a9b	0xa9c5148a	0x12d2c0c2	0xc1478005
+	0xd27224d0	0x3bceb6d7	0x9e033549	0xe132349b
+	0xdf5a4ccf	0x3e777127	0x8a2233fa	0x3758bb10
+	0x85ccb13e	0x7b8155b7	0x85bf5cb4	0x26a7a7b0
+	0xcc84ba7a	0xcc0285d7	0xf416da1f	0xffac6701
+	0x95ac6f58	0x3cb13304	0x407406d7	0x14d99a71
+	0x1cc0fdba	0x298468d1	0xbea241a6	0x126fdf79
+	0x8875ee25	0x9f6226ba	0x64678e21	0x2509f53c
+	0xffaf9851	0xe812f808	0x8ba956e0	0xf457db00
+	0x518fe465	0xf160a88c	0xe448bdce	0x930c070c
+	0x3c5c081e	0xca3ae614	0xa831d664	0xf7c4368c
+	0x08fe2afe	0x1adf7b81	0x17f6d3f3	0xb2fee3ec
+	0x9c28bbc0	0x79542475	0x286ef63f	0x4359beff
+	0x7e883a76	0x197d355f	0x63b49b54	0x863a746a
+	0xbb27e270	0xd341236d	0x12f44393	0xb466e0a4
+	0x1d76fb92	0xfa41d1b2	0x1d8c4a73	0xb2d9dd7d
+	0x86b63425	0x425d7223	0x15de6bf6	0x925a9489
+	0x2bb11f48	0xf6dbba84	0xb7a7d5ef	0x20962b37
+	0x02d0d4ef	0x8cdb97c2	0xdca7fee5	0x149444e0
+	0xec103a29	0x7f51f8bd	0x4d5c6758	0x9eb4446d
+	0x6ebaf66c	0x02325a25	0x8bdb761a	0x650dd77a
+	0x1c8e75bd	0x0837afc5	0x6472dfe2	0x3830220c
+	0xf317f6a3	0x8554a846	0x342a150c	0xe4ace9d1
+	0x4ff2e1b2	0xa4d50080	0x95d1c85b	0xc5dfc5a6
+	0x0766a97a	0x71b2cec1	0x8043996e	0x620fb5ac
+	0x35cc0e1e	0x9e0be88b	0x1bd723fb	0xdbe05966
+	0x8d7928b2	0x97561525	0x857d12a9	0xa84475bd
+	0x94a6acd0	0xda298885	0x9a039423	0xae6cac16
+	0x7a76851f	0x70277277	0x50a53b6e	0xa9100daa
+	0x4090b164	0xc5dd2129	0x02475e30	0x1cc65bae
+	0x85790253	0x5eea73b3	0x1b4343a3	0x13ece90f
+	0x470ac2b9	0xf61841e3	0xef6655d7	0x1992dfdc
+	0x5f5112ab	0xb4dd51a3	0xc5e87b31	0xb65f3d2d
+	0x070e9bbf	0x05ffd055	0xf609c346	0x65fbba75
+	0xc9108013	0x7bfaa5db	0x49dd3066	0xcd8c524a
+	0x99d8fcbe	0xfecb842e	0x739feb70	0x79c75772
+	0xe4cd3f68	0x1b062319	0xd3360038	0x7658335a
+	0xabee5b58	0x466809ce	0xde21f2cc	0xa197a1f5
+	0x92287d5a	0x21a75ff8	0x095e0058	0xa38bf1a9
+	0x57ba37ab	0x4747ff64	0x4a12b779	0xc12ddd5f
+	0xe7a19a45	0x1b927ca7	0x88144955	0xd35ef843
+	0xd068337d	0x5632330b	0x65a34c89	0x775e9caf
+	0x78c20a0f	0xff1c2f5c	0xdbdd9887	0x7f48e40d
+	0x54ee1f8b	0x65d42710	0x5fc0d0e7	0x15fce5dc
+	0x318b5abe	0x7860c719	0x6f63f527	0x95bc6f90
+	0x58c37cc6	0x4334f068	0x3f51dc09	0x851a2b85
+	0xe82b9da0	0x7d265c4c	0xfd8ebab1	0x83d54210
+	0x3f74b74a	0x7ee0c3ca	0x61a3a8db	0xb0b704ef
+	0x477cd2cd	0x2a796236	0xfc383efa	0xa6ed3b51
+	0x24791edf	0x80562e6f	0x1273a1f5	0xc74e5921
+	0x3779b3e6	0x7a3f32f0	0x49e60afd	0xa5d0fe64
+	0x8ef054f6	0xef5be639	0xf692e588	0x54044e06
+	0x3f27c315	0x55bb8f4a	0x96554540	0x550e1a56
+	0xace36033	0xff19182f	0x86a5bd4c	0x85da4168
+	0x986a002c	0xd7857384	0x76af389e	0x68ad939e
+	0x2b70c6f2	0x449ee188	0x92c907ea	0xbf2764e4
+	0x3bb587fe	0x783d282c	0x45534e20	0x10658cc2
+	0x4de7c28b	0x0a1c55a5	0x2bacd66b	0xf0a46ce6
+	0xb7ec3bbd	0x1f5e80a8	0xdd058c42	0x7332d51d
+	0x3cef2355	0xa3b65cb8	0x1ee63aca	0x9f957ac5
+	0x0281c9dd	0xd26aeb78	0x58cbb21d	0xac33a189
+	0x7ee718e5	0xee82aae0	0x02a7047d	0x97ab6b72
+	0x525cedb4	0xe2349594	0xd5ae4bf8	0xa339d3c8
+	0x067f1b36	0xf64bdbf3	0xe9a3ddc6	0xa4c5c24c
+	0x6e353ab5	0x0738144f	0x47a2447f	0x9e68b3ce
+	0x78e80afa	0xf940582b	0xb89ec8c9	0x2c6d309d
+	0xd61b1cfe	0x9636289a	0x6117fba6	0xc79f8986
+	0xaf1541bb	0x9c0ac0e6	0x8387473d	0xb9fafa5f
+	0x6a579a20	0xd3f7bde5	0x5cafa55c	0xc4b019eb
+	0xd5898c2e	0x773a5c0c	0xb0094e24	0x8911c4e3
+	0x5c1617aa	0xea4d1e5a	0x4ca917bb	0x616d3d63
+	0xe78a22a2	0xdf438e2f	0x2a95a02f	0x7bab22b1
+	0x7e10fe4b	0x419950b2	0x416176a3	0x87eb366c
+	0xdab47c2c	0xf1ca38ed	0xf3e0a547	0x7a17a658
+	0x302b56f9	0x49c64bd4	0x73411255	0xeced949e
+	0x7b34d21a	0xfb29e71d	0x73833d01	0x03394245
+	0x29976efb	0x43283d82	0xe99524fe	0x86cd9b90
+	0x53908651	0x4bc2181d	0x9e5edd8b	0xa422354c
+	0xc027e7e2	0x8ce2db84	0xc58d19ce	0x355c8b91
+	0x25018861	0x1c72bb1f	0x751abe69	0x203350d5
+	0x7a483fa4	0xb2c3f20e	0x1f0a5ba0	0x01b7e2eb
+	0x1a043812	0x7103279b	0x96216501	0xce39d080
+	0x637f4509	0x2dc69eea	0xa4efc113	0xa5d30a2b
+	0x58340b23	0x028a5b36	0x55f38544	0x6a1446f7
+	0xd1414b79	0x2911a443	0x0db0caff	0x5da8e7ae
+	0xba030f57	0xe3aae6c2	0x0b058245	0x87da158f
+	0x37e8eead	0x321192c6	0xa450f2b1	0xf1a7353c
+	0x2a704f83	0xce0feef0	0x7d817a79	0x26831535
+	0x365a1cd9	0xe9e2d8ee	0xe8d0f555	0xb4293ebe
+	0x2795664b	0xecf43916	0x1a2489e4	0xfb7a2f91
+	0x524f46eb	0xc580b7d4	0xfb48ec9f	0xe9edac5d
+	0x687e2734	0xd4d78bfb	0x1c6693a8	0x9204e278
+	0x2b030f0a	0x1c1e5dde	0x1233cafa	0xb28f23fd
+	0x3e9ec6d9	0x340daf97	0xeca43ed2	0x7580c01b
+	0x98bc3331	0x81df920f	0x66fa4723	0xb5576074
+	0x560b0b7b	0x2b330f51	0x11d4383e	0x2403d863
+	0x2ea9ef88	0x0a4f364c	0xff826ec8	0x1a2b598d
+	0x27336491	0x3ed50c05	0x7fa670e9	0x117c4928
+	0x4f7cb2e1	0x0246bfb8	0x0299dfb8	0x25da1033
+	0xc943c492	0x0c928512	0x88231d4b	0xfa8cd638
+	0x648b0dd2	0x8dad6a9e	0xa6fee246	0x48c260f4
+	0x89f51cd7	0x45d87837	0x7dbc8e53	0x43ae16d4
+	0xb6537ed6	0x5623ab3f	0xa9067ff4	0xe7357501
+	0xb74554de	0x8db2a8ee	0xb1e92a76	0x6e8970ad
+	0x5266a3f0	0x90df4e6e	0x8d646d19	0x4cedc27e
+	0x2bf8d9b2	0xf525778d	0xbdd502ab	0x51bab600
+	0x4eb5b0fd	0x7fe503f6	0xb93e599e	0x2e7d6071
+	0xdde8884b	0xc91c3510	0xa8e14896	0x1880e079
+	0xa4c89f7d	0xadf62f1b	0x6ff233d7	0x3be5bfb6
+	0x6d105d93	0x120397d9	0xfed419c5	0x205a6631
+	0x4d0ccb3d	0xae0e1f09	0x86b9112e	0xcdf2228c
+	0xa0e388cf	0x7456f52f	0xed2d99fe	0x6914f63b
+	0x00feaad2	0x8733d05f	0x2c466ea4	0x7fcff031
+	0xa529f5f0	0x729f8fa1	0x7df47b76	0x1f711f4a
+	0x81e6e406	0x5eb25e9f	0xf762231c	0x26420e88
+	0xae513342	0x6b1ad7f3	0xa5a6a7c8	0xa1ddb22c
+	0xb838a4c3	0xb227f5ff	0x6b86a07c	0x99414531
+	0xde3a3511	0xc284c098	0x3946172d	0x8797e956
+	0x5287bf4d	0xdc668157	0x514f837a	0x0898e1b2
+	0x923d59d4	0x9bd5b501	0x24ab0c95	0xd9a6b20a
+	0x938f61e6	0x14ff757f	0x285003aa	0xdaa7c43c
+	0xd1831a8c	0xe3ee3682	0xf1840914	0x3925fe7d
+	0xf0837c25	0x10228862	0x17fa9af4	0xe7dcc72a
+	0x1849b0f5	0x51320d1f	0x0333beea	0xc35685e7
+	0x0160dbe9	0xca507680	0xd6f2f43b	0x4c9a31d0
+	0xdf6460dd	0xaec8cba3	0x52c8bdaa	0x2664c6ee
+	0x4b3288c4	0x53cea59b	0xfb6ace34	0x41dc20e1
+	0x6a5f4706	0xbbedb5f3	0x9f37322e	0x44a09752
+	0x2ab91444	0x57b4ada9	0x6afe576e	0xaeb73b50
+	0x97d3de4b	0xfec4d616	0x29896080	0x43fe8c34
+	0x83842eec	0xb08f170d	0x03c432a7	0xfefc7b82
+	0x51f66600	0xed503541	0x03b6608d	0x8e3ad843
+	0x4bf99ad2	0x614c069f	0xce7641b6	0xd27a6f9a
+	0xd40eaa7d	0x110c143e	0x352d0651	0x4473dffc
+	0x5d40252f	0xa25db878	0x7df32c3d	0xf4ef6edf
+	0xeaf881a4	0xe88b9a18	0x7df554b9	0x1891b621
+	0x55af4ac3	0x8c39df79	0xc4c205db	0x4b34c0c1
+	0x8c0ff68f	0x72bc50d3	0x5f99c8b5	0x7ba6188e
+	0x798c3d10	0x26870c75	0x90a64bc3	0x6979b922
+	0xbd185fdc	0x6b661e71	0x0beab544	0xbe84004a
+	0x3aa803bb	0xb1e808f0	0xaf7e7b83	0xb12a39d7
+	0x616490f4	0x920b37c9	0x857eea29	0x6d6ca978
+	0xa8388103	0xf4218257	0xfc9a0717	0x4c739240
+	0x3e79ce00	0x3dfd18eb	0x37138fa4	0x9894c467
+	0x507d7d56	0x26c1bc89	0xe787e45c	0xdf554cc5
+	0xd2279a50	0x5b172582	0xcc5d24a4	0x7dafb34c
+	0xd4b16c6a	0x21b79147	0x89e1024e	0x04094b5e
+	0x850c0a4b	0x0c7cf33c	0xe4da26f7	0xa1a62536
+	0x920afaa2	0xba63c038	0x16591450	0xcb6c34ae
+	0x29464a83	0x1cc673d5	0xa530ea51	0x265ec529
+	0xe30bb676	0xbf18606c	0x3f12df0f	0x1ab669d7
+	0xeee0c289	0x33106be3	0x00e39909	0x5a312123
+	0xcbda8bb2	0x0d3ec086	0xdd7c0f83	0xb7ecd1e6
+	0x1b3002ad	0x737b819b	0xa5dd3b45	0x632f9c32
+	0x0ab37cb8	0xad7eb92e	0x6e2d114c	0x586e0994
+	0x2af40df2	0x5501217c	0x0ab62f0c	0x3b7100b8
+	0x0dc35d9d	0x3937491e	0x04f37faa	0x6933c2af
+	0xf1e2c593	0x8c66b14e	0x7d542e43	0x970d2632
+	0xd49e3d2f	0xaf9d7d2a	0x327e5488	0x871a50fd
+	0x3f1158fa	0x2f3838ec	0x9617a31c	0x16e2c967
+	0x09710826	0x077a1657	0x95a1abe9	0xea49bab3
+	0x32ee12a9	0x2d49626e	0x9b95c7dd	0x4846b0a7
+	0x9cfae6bf	0xa9f862b6	0x3e3d167d	0xa544a3e3
+	0x94cccf7c	0x8b97f7c6	0x022b9624	0x5b60bf75
+	0xbd533ed1	0x133cc7d5	0x3853ff82	0xca2bd76b
+	0xed552e3d	0xf133d2d5	0x652c0f02	0xdec8249c
+	0xf61921ad	0x09a9e3a3	0x2229e133	0x01afa009
+	0xc843783f	0xba96a153	0x3d80b2bb	0xbf5398c3
+	0xb66ed306	0xd48fdf1d	0x39040227	0x1f1980fb
+	0x51e740a3	0x6603060c	0x9ce34405	0x9abc2a4b
+	0x7ece5908	0x457998a7	0x45443d10	0x20f2a0d1
+	0x9cac676e	0xb8e66c6f	0x4cbaa744	0xecdc6c5f
+	0x5be9ad3e	0x1a7af08b	0x94375052	0x9547a526
+	0x3f3d7a29	0xfa571d4f	0x00324a11	0x003ed568
+	0x92224138	0x0bc6fa9c	0xd4dcb738	0x81932d66
+	0x27525a40	0xee39a4b5	0x4ad66faa	0x59c5ca88
+	0x578921a5	0xb493d0f3	0x005d131f	0x49bf227b
+	0xa8ea547d	0x2e5c9a48	0x16afbca7	0x34e8a7d1
+	0x5aea0b5b	0x82c3e281	0xc537c374	0xefe8922e
+	0x4ed6aa04	0xc957d8d8	0x54887681	0x61da5bff
+	0x7d116291	0xf2046fc6	0xb71da398	0xf9ddcc7f
+	0x7a884d46	0xf0bdbbe2	0x5fd74815	0xf86cf766
+	0xf588e4ba	0x88d910f0	0xa246d4b2	0x5b2e87cf
+	0xef07a06c	0xefbb295a	0x6be0b60b	0xa0684b8d
+	0x2e4ba4a7	0x32aea4e6	0xde8df602	0x9754eee3
+	0xb79c1df3	0x92819bcf	0x6e2212c1	0xff2ec504
+	0x970e83e3	0xe44c1588	0x25ef7a1d	0x78439e8a
+	0x49befb02	0x30dcc732	0x2abf9573	0x8fb2d451
+	0xb708f582	0xba802a07	0x5a4b4d7c	0xac3d8fc6
+	0xda0c8cdd	0x616ed6ef	0x371d43ac	0xd7e81188
+	0x197b6cce	0x598b7855	0x81091bc4	0x73115e41
+	0xaff509b5	0x62ec8b9c	0x070f53f9	0x65e9acfa
+	0x46b936b1	0x5a97edab	0xbd9093c3	0x7e56e0be
+	0xceb08216	0x523f649c	0x73565919	0xd5a478da
+	0x5e49884e	0xeed780b7	0x670f342d	0xcbec0af2
+	0x60193aa2	0xb9b836f5	0x88142d75	0xb6ef20ec
+	0x45ecc95a	0x86fa7d20	0xbed3332b	0xd72235ef
+	0xf3dc1ee6	0xdee60153	0x17c288ee	0x1598ee3a
+	0xad8be82b	0xbed18162	0xe741e3ff	0x7b2ceebf
+	0x0c023ffd	0x228d9357	0x2519b917	0xb21337c5
+	0xf7ef1ec9	0x1e38a02c	0x2aaca8aa	0x91ad2397
+	0x39b94e45	0x9c16a80a	0xab4f0207	0x9fdd96e8
+	0x4c7e82b0	0xe58e52dd	0xb35c5152	0xf72c7988
+	0xe15b2b53	0x37b3ca5a	0x382cf820	0xe9a5b10d
+	0xfdac3128	0xd613d631	0x0bfa05b4	0x8ed858c9
+	0x48fa9bf3	0x6b0a24b3	0xaea3ded7	0xfe944124
+	0xbfa01ac8	0x90c4b032	0xd506ef49	0xf3c2a52f
+	0x1e717e29	0x9d032123	0x4eff6847	0x87fe7932
+	0xf91e0251	0x7291c0e9	0x04c8865e	0xe26812d8
+	0xd7af6deb	0xab8b239f	0x0d357507	0xc3f23049
+	0x0fcefb47	0x7c1ebbbc	0xda0ff8d8	0xa2e91757
+	0x2cdd7611	0x51b85a13	0x1a658155	0x97ba5866
+	0x7b02d127	0x9a65f8dd	0xcea44087	0x3c44fedf
+	0x6cba4b83	0xb30c9c48	0x5f33e368	0x46309d1b
+	0x5e97e1a1	0xd4dfca3c	0x03762329	0xf499e182
+	0xa8b3de50	0xd6a940c5	0x420b4200	0xebfae5a8
+	0xfff42408	0xd034dab6	0x0fbfc9f8	0x618c48aa
+	0x3258a668	0x040eb946	0xa3e0adf7	0xc5374611
+	0x640a6581	0x57444570	0x4249f689	0x44f6314b
+	0x7461455b	0x13066c2d	0x0d3d29c8	0x58e15f8a
+	0x454ef231	0x9185d050	0xe99a20a0	0x7a06d75e
+	0xd7449ae9	0x93e6bbd3	0x872176d4	0x333d8cd5
+	0xcb511dda	0x3c1ccbee	0xe36c2ec0	0xe9344c87
+	0xf54d7abf	0x531dfea3	0x7272fa0c	0x4c3dc858
+	0x3d13b763	0xb2996ab8	0xa0a21103	0x95e9b6c8
+	0x240dd708	0x92e0ca36	0x3945b765	0x436cc495
+	0x333ef58c	0x463a6f85	0x793e9df9	0x9fe86bdb
+	0xfbf0cbd5	0xdac52990	0x4c3afe5b	0x267ad809
+	0x662c4ebd	0x6b4ac1be	0x89e7bcc0	0xfe4a7721
+	0x48b4de81	0x4c81164c	0x1131ab47	0xc661f7e9
+	0xe1d1bb65	0x7b57048d	0xdc99c55e	0x215a3641
+	0xafd86760	0x1b2d56d1	0xe76d8f74	0x559c649f
+	0x97219fc9	0xd5333043	0xf846c8fa	0x8cb63ba0
+	0x1b320870	0x884e95cc	0x1655b161	0x4ee1ffd1
+	0x376ce49d	0x028cc7f3	0xcc13e8db	0x9712f287
+	0x753196b9	0x4227cf42	0xa5c3c359	0x37b5733f
+	0x8e2920b7	0xe0e6198e	0xc9cc7de5	0x8b8d8fb0
+	0x93807f0e	0xc476c872	0xda4d5c5a	0x4ead8398
+	0xe5da2718	0x253611b6	0x54273437	0x435528ed
+	0x37fe8557	0x3f31ac9c	0x4ce87c33	0x83f19d78
+	0x5b7974d6	0xe62a980d	0x0d35445f	0x6823eeff
+	0xfb23d49c	0xac42eaef	0x7cf3f7db	0x4703e364
+	0x2fbad2c7	0x6ad6c9ca	0xdeac6634	0x9aa4e069
+	0x16375fed	0x5a37affa	0x3ab2c7f4	0x576377ba
+	0x9ca8949d	0x9eab830a	0x2eac9f46	0x20140d74
+	0x49e169a4	0x29c8228b	0xb10c113b	0x97486ddf
+	0xb268ccbd	0xee145285	0xf6db444e	0x2971a507
+	0xe20506c1	0xaed3b844	0xa7d3a71f	0x0ec8a80f
+	0x3964b61e	0x664c06c3	0x8aa6f07d	0x190bd9a4
+	0xa713711e	0xc149601a	0x0e33b930	0x92d924b0
+	0x3a3e6055	0x891417db	0x9da57235	0x7a5c95cd
+	0xb220a13a	0x61486a53	0x84e823ae	0x3a525213
+	0x8f83fed2	0x97a20f72	0x01d40e7a	0x51a8696f
+	0xf78ee740	0xcbe3f17d	0xa03fec72	0xa3c10477
+	0xeee0cc71	0xa4275070	0x71a4858a	0x3e6c10c5
+	0x157f1c48	0xe761a235	0x7ebd0044	0x0587573a
+	0x504bace1	0x18b0e30c	0x87da65c8	0xb09e218f
+	0x394ddcbc	0x30850b35	0x870144df	0x308786b3
+	0x3b5e72c7	0xae824b41	0x08dcbadd	0x4205606c
+	0x0dba1b98	0xea8b026a	0x0ff80267	0x4d345dde
+	0x3e9fe94b	0x2e5150ee	0xe690ebe4	0x7e15f05b
+	0x6fd516be	0x113d1f78	0x8e460364	0x0a18c989
+	0xc858ba5e	0x65229038	0x7103dd07	0x9cd5dfd4
+	0x1d90fe4b	0xe020ff30	0xcd525bd1	0x9b44f15e
+	0x535137e9	0x06e76f27	0x7fef31ba	0xaf21d659
+	0x9f96533b	0xee3b980f	0xf88f1efa	0x47e69092
+	0x7384ba38	0x76c06863	0xcdea308a	0xf05dfad0
+	0x954345cd	0xa0c58d59	0x82cdc2ff	0x5501bae6
+	0x1ca051d2	0xb992dc65	0x98d2f849	0x759e5af7
+	0x3f6ba599	0xbd2b801a	0xf24cf7e1	0x523f4bc9
+	0x280bbd9f	0xaa28b183	0x8b41afce	0xa4ffac7c
+	0xd7555ff9	0x15e6d70a	0xf7d9ecf0	0xf647181e
+	0xcae10548	0x7bf3059a	0x5f53e585	0xf168d5de
+	0x78041850	0x3f3c1c0f	0xbb820ed8	0xe84de7fd
+	0xe0f8e79c	0x06b59d3c	0x42cde450	0x40068ecd
+	0x239241fd	0xef3e69fc	0xe54ca169	0x026d86ef
+	0x790f5960	0xeaac92da	0xdb1ea331	0x34b1795c
+	0x975382e6	0x383576d4	0x9846ba3e	0x7d666cfa
+	0x63c9f2c0	0xcb0b0e51	0x15de13af	0x5b50543d
+	0xf3088ada	0xb0a0eea1	0xa16789ae	0x023687e5
+	0x3fe5a0a8	0x2d087c46	0x1a9f7dfa	0xc111594f
+	0x22f0c9e5	0x23519d74	0x063af453	0x3dded0c4
+	0x2fbec97e	0x94c3a2ed	0x712515d9	0x4e23c2bf
+	0x47ffab6d	0xcc975cde	0xb2cba5ae	0x4f64f77d
+	0x1170d2e3	0xc8ec9fcf	0x548eb6b2	0x28c636df
+	0x7b85e66f	0xc3ae89e0	0xa769b4eb	0x3f7b60d3
+	0x99ae9021	0x32951125	0x38d1f0f7	0x635b3981
+	0x784cab8e	0xb9ac2ae0	0xd9c8e406	0x849e2f3e
+	0xbd46e71f	0x31cc9145	0xcd817b28	0x5d234af9
+	0x5682e8f0	0x6963b396	0xbf42c2b3	0xa6b17649
+	0xb083630e	0xe2bbb3f9	0xe2812105	0x524c7c1a
+	0x3587ab3a	0xe5a43843	0x9013db3e	0x1c7202b0
+	0x059b7c45	0xa79ad1f8	0x578dcda8	0x286f7a7d
+	0x29b82899	0x17e9a470	0x292e9656	0x4ffecb5d
+	0xdf7d989c	0x33d2f0f6	0x1ad9a38f	0x7192ebcb
+	0x63c0924c	0x87adf98d	0x003433bf	0x1f9dbd42
+	0x38811388	0x032c6dbd	0x7216bfaa	0xb8405caa
+	0x358ef886	0x0d8de625	0xda26a3cd	0x02e02bed
+	0xbfee97ad	0x9bd94b51	0xa3e0d47d	0x07afc5ce
+	0xf1846ab8	0x9c56da77	0xdaf48909	0x980d0cf4
+	0x201ff73a	0xecd7d225	0x2f8b88f5	0x6afda416
+	0x1c230e24	0x6e71c111	0xd056e64e	0x8b02a960
+	0x7b3e5cee	0x9369c16f	0x8cc648d2	0x5b1044a3
+	0xec7ad383	0xafdc087e	0xb7331119	0xe2b73df2
+	0xe5aa2679	0xb68a0024	0xbf417687	0x39f8f49c
+	0x4dc6f396	0x394c364b	0x84b262e6	0xfd08738b
+	0xef799352	0x99f6ce19	0xf0deea77	0xff7b2b32
+	0x9f0047ec	0x93328447	0xa68daaeb	0xa15c49d9
+	0x9c2ee179	0xd880098c	0x591333e1	0xf95bbf1a
+	0x99b94163	0x6775a129	0x58312bae	0xb05a0204
+	0xb369ee9d	0xe33139c8	0x228ddb00	0xa90eb06e
+	0x9d740ac2	0x7fe877d0	0x49e80e67	0xae0a1b4c
+	0xe0762721	0xa8aa010c	0xe1b1c70e	0xc4cb1331
+	0x98e2a2b1	0x95eb5adb	0x27ce7e8d	0x0c4c9fb0
+	0xa5600d3e	0x0b1b01f7	0xf5d073ff	0x618c31f9
+	0x09ca0170	0x6f40bf4a	0x778c6e4c	0x82a5d345
+	0x89739b55	0x9a8055b3	0x882713f8	0x6127132b
+	0x7dcd4b1d	0x693bcd45	0xd37be4c7	0x5cfcc650
+	0x108ba25c	0xe514be8d	0x0e6acbe4	0x53164bbe
+	0x04f80fc7	0x3d62e170	0xdc0977c1	0xe4e696a2
+	0x2951e0ab	0xe7df7bb8	0xed0452f0	0xa052451e
+	0xef71dffa	0xe7e1a83b	0xf44f3edb	0xdc8909d6
+	0xd106ca58	0x65a50c30	0x629bbd64	0x8aa53b1c
+	0x281d476d	0x9d8ebab9	0x7618cdd0	0x8726df1d
+	0x873d200d	0x3f0dfd8a	0xac699c41	0x6c5fd299
+	0x1a4ec8da	0x02849d77	0xfb9a17b8	0x97353330
+	0xf58f4ca3	0x8cfd3379	0x560c085f	0x0b0f4412
+	0x93abd1f6	0xa4610fe6	0xb2093ea3	0x2132e754
+	0xa27f6dab	0x1dfdea78	0xa453f3fe	0x84952158
+	0x40cc656e	0x6bc83102	0xbc64b5d9	0xebd58830
+	0xae5d5041	0xcb2518e4	0xfbecfd7d	0xd35df3d3
+	0xb1f3c02f	0x672b45c8	0xf1ec9063	0x7e1af731
+	0x9591a4e5	0x8f6cba68	0x47961590	0x46ab9cdc
+	0xafcc329f	0x89527de5	0x848b9e15	0x12a76f30
+	0x8dd22cb2	0x111febb4	0x9f2b87bc	0x4d1124d0
+	0x82885b16	0x9800ccac	0x8ab228d2	0x4edb46a8
+	0xe3a7867d	0x6a0f0f31	0x0ba359e5	0x238c560d
+	0x6f2e9960	0x714940fe	0x2c8b115c	0xb367636a
+	0x5ef73955	0x1fbd0ed4	0xea769618	0x22879b8e
+	0x19c54520	0x1d60b769	0x8f9c9206	0xe12e6178
+	0x6f7d4e60	0x87a42234	0xbf426187	0x136d1b3b
+	0x096388ec	0x12cf7c8d	0x4f9dc462	0xc4132bc1
+	0xbb83ec7e	0x8a26142e	0xb2b10d85	0x0a22ac57
+	0x587d0f8c	0xfc6566a1	0xf9a313a3	0xdf5b8e38
+	0x3ba410d0	0xcaedcf98	0x623da0d4	0x48a77151
+	0x9fbc8986	0x75d69451	0xdd8db5ca	0x3d143e41
+	0x23c6ef92	0xd4e8c17f	0x50fcf1cd	0x65202d54
+	0x7f465e5a	0xfc9487e9	0x21302b5e	0x22cf616c
+	0x09b9278a	0x24807c5a	0x5347363a	0xa0d43079
+	0x243222c2	0xf31afc3c	0x299615c7	0xbc9862a7
+	0xd9fa9ffc	0xe0da4c33	0x4086d085	0xcd9fef47
+	0xaca1ebf8	0xe9054295	0x0202a632	0x2a566a47
+	0xde6072e0	0x12ab6f47	0x1e961f96	0x79b78cea
+	0x178d0054	0x3a6db40d	0x1c1fa4a7	0x04aeca16
+	0xacfc3b3d	0xa95d26ef	0x7fc56d9b	0x8cd04862
+	0xf05ca31a	0x2f1a8451	0x1fa55f63	0x038c689c
+	0xd275082d	0x6ce3bbb4	0xa5787d5c	0x284ad4fd
+	0xdb456159	0x72fc2b88	0x4e8846f8	0x3652ccd5
+	0xdb67b32f	0xea7afaf8	0x31981989	0x7479b85d
+	0x8cd4965a	0xab410e17	0x3b6000fe	0xefe70084
+	0x4d903c3f	0xad10aa48	0xdf7d8f3f	0x06eb3088
+	0xf80c6c8c	0x1f45157e	0xc81017fd	0xfa4b5d19
+	0x183d9f3d	0xa6552ca8	0x940914f7	0x0dece704
+	0x5183a544	0x2ca83fd1	0x0d39644e	0x689020e9
+	0x8fc6451b	0x6fd1271b	0xaa27e129	0x7c96848b
+	0x51efc70f	0x8fc41606	0xf5d42b17	0x80694280
+	0x1f774b0c	0xaad194cd	0xcdcb3bbd	0xa30226c9
+	0xe94699f7	0xe7e0ad1f	0x4e0e7887	0x4a8eef8a
+	0xd7b8d9b5	0xad81550e	0xd8a47d80	0x3b31cc2a
+	0x283b170a	0x954184bb	0xcb4d6ef4	0xc53a8ef4
+	0x1b9eba45	0x0df70c46	0x9ca62404	0x1960596c
+	0xe447c659	0xbbdf89a3	0x11d5399c	0xf70d6c7e
+	0x2f5f411b	0x55d83f23	0x49d3a5ee	0xa30d42ce
+	0x9d7b5dab	0x798ac7a0	0x54427d51	0xb93539d9
+	0xeab10ab0	0x9baeca42	0x5db291e4	0x6a572088
+	0x1996c3b5	0xc49e4528	0xe5d91c6d	0xace9b18a
+	0xdc00ef96	0xabb2be9e	0x9c8c3dce	0x5575fef9
+	0x55ee1588	0x54fd1f04	0xb51f8054	0xa79f2970
+	0x2b944de3	0x258bb2a9	0x6d795400	0xd8e37086
+	0xe28e13f8	0xac866668	0xee61e623	0x74822294
+	0xb8e40564	0xed674c7a	0x41649345	0x18f67675
+	0xccf6dae5	0x2f771905	0x41617a0d	0x89892452
+	0xebe9c54e	0x15c0047a	0x1360fe11	0x97e9968e
+	0x969ba1ec	0xa8d87a94	0x89c42871	0xa3b7600b
+	0x1eb2da3a	0x51ad206b	0x0ffa1e92	0x6b54cc4b
+	0x551038b9	0x56d3134a	0xc604c359	0x921df194
+	0xdd0e8901	0x0aa069b2	0x63cdd252	0x7f0eb051
+	0x6eb669a5	0x9e4744aa	0xbbdb786a	0xade2eff8
+	0x01735f2f	0x59b21311	0x2a9b3c19	0xfef63adc
+	0x7f935ed5	0x4107ae2c	0x7e87a339	0x169cff65
+	0x9c405742	0x714007c1	0xb7c3a785	0xc4c48389
+	0x31f92159	0x0dc32968	0x52ffa3ea	0x97148ffe
+	0x24e05234	0xaa26f639	0xfcc1d939	0x88657f96
+	0x8f50c4f9	0xf1889d95	0x0ced35a1	0x436cecef
+	0xeca9a15f	0xf48e7adf	0x457a7fcc	0x7a6c1239
+	0x5034af95	0xa718db0d	0x148c7f75	0xe71321af
+	0x6ca91aec	0xd8e3f28e	0xf1792028	0x6cd6de0b
+	0x08a5b4f8	0x6c423f4a	0xabc9fd13	0xd9b32cb5
+	0xa11cf2e9	0x1cf2a8d1	0x5399808b	0x41c4342f
+	0xfc8cc322	0x886c8a1f	0xda930d22	0xcb065a7d
+	0xac2af243	0xde40d5c4	0xbfc31749	0x1648efb2
+	0xd7a7c284	0x66354919	0x0ae2ebfc	0xe9467716
+	0x31bc8fa5	0xee8b06a8	0xd225ddf4	0x1abb30a5
+	0xbab806d6	0x4089c5c5	0xda27fce1	0x049b6de3
+	0xc750ba15	0x8a46ce66	0x036144aa	0xfe034871
+	0x1abebc7b	0x493f7de8	0xb2159be7	0x6fa331cb
+	0xb96cabc6	0x38c0604e	0xfc029108	0x5e60b9d0
+	0x4659e613	0x03acd4cc	0x199fdfec	0x378d55eb
+	0x769412a0	0x15e6347b	0x92c90797	0xc9074949
+	0xf8122bd8	0xf412bc92	0xb78b97da	0x0b57c329
+	0xe53305ea	0x8df0ab76	0x8306e3dd	0xd0d7318f
+	0x36adcee8	0x874d40a3	0x01013be2	0x22ea83d6
+	0x103a41eb	0xb0597649	0x3da90abb	0xe329568a
+	0x197f2854	0x0bcf6548	0x9a8cadf8	0xdbcad384
+	0xdbd146a4	0x47614216	0x20ae929d	0x700c45dc
+	0x2957fadb	0x2ccecc42	0x59dade3a	0xbd4ba21d
+	0xa54cbdfe	0x2168aeac	0xf3fc977e	0xb8a43acb
+	0xb673e386	0x8374b99e	0x1c9b8514	0xb27755b5
+	0x76a14bad	0x7f9e80f7	0x7827aad7	0xa38aace7
+	0x09bfb029	0xd8744c16	0x60e27d36	0xf0bb9c68
+	0x6c6ea1ba	0x1920dde0	0xfd949296	0xbdd246ba
+	0x71b9255b	0x443eb00a	0x484b5641	0x6cf54003
+	0x719a7b75	0x5fd6ceee	0x94379976	0x610d0ec5
+	0x2e601eb8	0xd5b31116	0x351833bd	0x71e20a77
+	0x1bdf31dd	0xf2b71f50	0x643e7b0f	0x14966e60
+	0x2ea94458	0x18fd7a19	0xc2042ba8	0xa6b2a8a7
+	0x5591ab4d	0xd62a7fb3	0x478b9fc9	0xfb0faa9c
+	0x840848c4	0x51d8e887	0x0982b486	0xf5a7a82d
+	0x651cd99f	0xc429c680	0xfae0f0a4	0x341f4588
+	0x358b09c5	0xeab81b53	0x4107619a	0xfd8686a0
+	0x23438c74	0x03e44685	0x7acd2f1e	0x0324c896
+	0x0c4fb764	0xa859e8ce	0xc041d07b	0x1ddea0d0
+	0x0c7d3a05	0x1a9552b9	0x791ac20b	0x135c3573
+	0x3315a1b0	0x20f6b0ba	0x9301b576	0x5f9396fc
+	0xd2b55a44	0x1ccf9ebd	0x8cf0350d	0xa58f9151
+	0x251be7f3	0xce2201a3	0xdf354713	0xe1c1bb1b
+	0x6821a792	0x8b1a47e4	0x681b765a	0x6b857d78
+	0x4b453e66	0xecbeea8f	0x7d4aa02f	0x138ad3ce
+	0xa2e27fdb	0x9f47ceb9	0xdb849664	0xd89748fd
+	0x3245bf9d	0x16bdbedc	0x386f037d	0x9cc949f5
+	0xbeda4924	0x357c0a52	0x9f6e807c	0x547bd479
+	0x51495240	0xd1883e61	0x04869ce6	0x47f09ac8
+	0x2e5cf223	0xc34ef901	0x15b69b18	0x052b45c3
+	0xa045628f	0x7fdf706f	0xaa943b26	0x52a91e2a
+	0xed73757f	0x6ddb9171	0xae2e6289	0xed44ad05
+	0xd9ba87ac	0x5225b7f3	0xd227abe1	0xf95c862c
+	0xf22fb4e4	0x34376d96	0x121f979b	0xb65b7535
+	0x3bca35ab	0x579ef994	0x72659829	0xc0094673
+	0xdea78eef	0x51248fb0	0x4a883536	0x9c69810c
+	0x6f9e2a2d	0x33a54fa3	0xbf04ea97	0x081092e0
+	0xe783b995	0x47f781c4	0xfe77defd	0xd0b42d36
+	0xbe387b86	0xe3072ad9	0xa3b6908f	0xe2141964
+	0x77d70045	0xa86ad40a	0xc3c457c5	0x3e7b7126
+	0xbef763ea	0x0d6fc62d	0x5915bf32	0x2aff83b7
+	0x21cb6fed	0x52903bf0	0xe020e340	0x0b3f355c
+	0xee7c6bc1	0x060fb2a8	0xc0323dfd	0xe1dcfb29
+	0x668647ce	0x3e46e584	0xae4baffa	0x6a77a8f6
+	0x20d34fcb	0xd9ec900e	0x778a2afc	0x1a59fb8f
+	0x43e94780	0xd4e333ad	0x97f82259	0x141571cd
+	0x73aa7c5c	0x18fcf18a	0xd48a4fb8	0xc109eac0
+	0xe8de4f47	0xfd509a7b	0x90707861	0xfb8c77cd
+	0x3b7122fc	0x4ca78b8c	0xa35f59d0	0x45ae991c
+	0x8e70498c	0xb9202519	0x65c96b4b	0x78a4fc95
+	0xdcf1b9a5	0x1031417a	0x9ff8793e	0xa2030f94
+	0x8c733cfc	0x1c91d955	0xf6a68ffb	0xedd6944b
+	0x2aa354d3	0x6ac7af45	0xf1f3cd2a	0x4c62c093
+	0x03480c9b	0x0f246eb1	0x2a4b1c9f	0x839b624c
+	0x29a74da9	0x34ae761d	0xaffd7053	0x136c170c
+	0x62d45905	0x6707d6b3	0x7c828933	0xc8df0f9a
+	0x16917824	0xa446ec27	0xc0ebdeb3	0x78183042
+	0xf55d10b0	0x7ac4cae7	0x1e03a86d	0x5b0469f6
+	0xaaa1c0d0	0xe1ec5485	0xbd92cc52	0xe57b7def
+	0x371cdae6	0x5a344a02	0x4fe6202d	0x550f73f7
+	0x0379ceb7	0xd8136303	0xdc4359cb	0xe38ee67a
+	0x2aa895da	0xe6cd6cdc	0xa50300f1	0xdaecc9bf
+	0xde559d55	0xec988d8d	0x2daf3e0b	0xcae251fb
+	0xd26d26e9	0x130ce5fe	0x86d2361c	0x3108822b
+	0x842528a2	0x23b91b1b	0x48fb92e7	0x013305da
+	0xb9382453	0x8e338247	0x1cee69df	0x28dda889
+	0x3098b87d	0x2fb8a4f2	0x12cbca62	0x0050c443
+	0xa9640f44	0x56926695	0x84f1af0f	0xe7612db4
+	0x7ca148a4	0xde5a4740	0x04fc09c8	0x1168eacd
+	0x3afcb851	0x481d093a	0xdab01eb3	0xad7d6f56
+	0x0311d8e9	0x4094dbf9	0x264b6da5	0x3a5fdc11
+	0xcd2ee17f	0x50cfbfc2	0xfdc9419f	0xa61d64be
+	0xd9786507	0x4202f8e9	0x13f58fd8	0xae675835
+	0xaf0c72ea	0xadd2275e	0xa0afc1b2	0xaef42673
+	0x059895be	0x4504a91c	0x0d1abd4c	0x7986dcc6
+	0xc13fe6f8	0x4780bfd7	0x44ae446b	0xb70c300a
+	0xba32a5dc	0x807aa794	0x45e8373b	0x955cb2f6
+	0x4ff6ce64	0xa75d9feb	0xf99b0f94	0x1f6f42cf
+	0x7f3e7082	0xf05cfbc2	0x2981d66a	0x0031868d
+	0x93ad9527	0x20e0a72c	0x7af059e2	0xb4db736f
+	0xc1ee8a47	0xee31b1f2	0x075c758b	0xb796cef8
+	0xe758683a	0xa417d0b8	0xec701109	0xd5db6f14
+	0xee6759ba	0x965fd314	0xa991abc2	0xe431e1a0
+	0x8c49bd5d	0x393827a6	0xa432862f	0xc41e1a96
+	0xbe0bc3b9	0x3d8cf302	0x42bc70da	0x8748df76
+	0x110951c0	0xb1685274	0x06f426f6	0x65ec87c5
+	0xaf689ca5	0x602d9679	0x19363407	0xb0fd04c7
+	0xa38ad24a	0xfad9b36b	0xa13c711c	0x4e386365
+	0xa4f8a466	0x55276e7b	0x7e8f736d	0x6fb49d16
+	0x319c5c11	0xaf40ba4c	0xe7f84dd4	0xef4dd864
+	0x5ae207ae	0x09a3ef70	0x23a90e6b	0x9c9697f8
+	0x7155d79b	0x131fc9fb	0xb46cb500	0xeae3eb61
+	0x51e29783	0x3922bd46	0xdb8afa10	0x33b0ebfc
+	0x3e43da19	0x2fc38e51	0x97f3bf1c	0x8c3ce68b
+	0x7c0550be	0x6a53e9f6	0xbf6cf7c6	0xf338ad58
+	0xce0f1a73	0x4d372ec0	0x29281dbd	0xf6b0bd7c
+	0x85b26827	0xa454dfb2	0x52b28dab	0xdf3af48a
+	0x5f533d2f	0x2a609d20	0xeaf73bed	0x5e350bb2
+	0x95d2bd12	0x908c3f5d	0x71511f88	0xd2060f72
+	0xa818d161	0x84f5ebee	0x59ed524e	0x4e45cb9d
+	0x6ce00f42	0x33e0c310	0x75e34119	0x140e3cc3
+	0xacbeda6e	0x4c450e0c	0x9ae2ef44	0x7c98afc7
+	0xa2093bf5	0xeab6cf15	0xcba6057e	0xf04c3ce8
+	0xcb5cf30e	0x044ff594	0xc2cdb5f4	0xc8c60b17
+	0x701c8bbd	0xbf893762	0x2ac72a28	0xe777c968
+	0xcd25da52	0x747eeb7b	0x76ee7f3f	0xffa7dcdb
+	0x69e68c12	0xeec17e1d	0x93710ea9	0x5370892c
+	0x24463499	0xfa5ec00b	0x3b1f55cb	0xa6fec9d7
+	0x4fa50806	0x7f8066fb	0xf914e3dc	0x1f814780
+	0xedbff426	0xfec2a635	0x5355f69a	0xf4f47000
+	0x0be99ed6	0x6ca79305	0xb5744697	0xf50a8edf
+	0x91fc0932	0xb3ff4411	0x4d72ecd7	0x335f8ba6
+	0x1b393143	0xf0cdce19	0x95543420	0x88d44565
+	0xf47e1e74	0xd7ceb70c	0x95508187	0xfc65e9f3
+	0x92cdfb27	0xa12af6a8	0xb8754dba	0x436f5819
+	0x0e3a952e	0x91178a2c	0xa25c2395	0x15379544
+	0xaeffd675	0xb74779b5	0xd9229b70	0x7c72bd05
+	0x0349e5c9	0x3f2dd364	0x96e25f24	0x5c0fca2c
+	0xe56f81ea	0xee339b9b	0xb6f9888c	0x54ea5d03
+	0xfd136dc5	0x78ebd8a6	0x7d65dc8f	0x1f79781a
+	0x7f058e70	0x68caae5b	0x9e17a15c	0x0b0d7b34
+	0xec758cfd	0x2d2d39ee	0x72b46a64	0x98569c65
+	0xcff678a2	0x1e5eae00	0x197cff21	0xa17e1c00
+	0xf0da9430	0xa007a848	0x0be7cd80	0xc55a8077
+	0xbe7ed983	0x5c6626cb	0x103c6639	0xc0348431
+	0x48a06b34	0xd8c43a93	0x94f5dc15	0xd8282ff4
+	0x798fecbb	0x969eb56f	0x97b834f3	0x9361d4b4
+	0x451962dc	0x9411aa6e	0xa9eb502b	0x2fa0696a
+	0xcfce109a	0xbdbb187f	0x0cef3b86	0x7d420c93
+	0x6a38b476	0xdc49d8b8	0x34652cef	0x1d38f2c7
+	0x9042655d	0xfa414d42	0x79553a30	0xa1197a11
+	0x47f0892a	0x7c7cc3cd	0x0d16e724	0x205ee0e0
+	0xe8d2af7a	0x1b84e9e5	0x762b8343	0xe6f0d4f1
+	0x13c47e29	0xd625bdc8	0x16136974	0x7f4e63ad
+	0x5fb6589b	0x53699412	0x136774ad	0x4469f334
+	0xe0e90aac	0x88a24073	0x940ce7e0	0xcef6082a
+	0xaf7251bf	0x569dfc49	0x23058c3f	0xa2c897ce
+	0x6a31faae	0x352ad804	0x88cc7d68	0x68570267
+	0x07314cae	0x8cc2a6bc	0x3dabbd9f	0xdee27981
+	0x32c1ffa8	0x826ab175	0x769de94a	0x3b11317f
+	0x362a6306	0x2422aca0	0xfc53764d	0x2ca4c418
+	0x5fc2d68a	0xa74a5fc5	0x949b041a	0x0f0f69d6
+	0xd075fac4	0x965a3001	0xb6dd4eb5	0x9b5c6979
+	0xfd84a8bf	0x4ca80a7d	0x42fb907f	0x5770680c
+	0x3684714f	0xba50c3b2	0x0fed8f5b	0x42f42f2d
+	0x7e98ba74	0xcf4ad155	0x33972750	0xabbbbbe0
+	0xcab7ba1e	0xc3e54c90	0x2cf8e77c	0x7eb3c185
+	0xafbe0fc0	0x6ff94321	0x9699d3a8	0xa8f51d2e
+	0xaeba0be5	0xc519f879	0x73b89b8d	0x2c98994c
+	0x5c6688ed	0x0c4edf1e	0xd27a0c40	0xe58b6112
+	0x8b01ccb4	0x7da8a608	0x03b02b0a	0xc35c0051
+	0x33f60875	0xa215809b	0x34e2e84e	0xb1249172
+	0x9c9068f0	0xa4067a92	0xd6260de5	0x2e30b0b8
+	0x895a3ef4	0x1d0df2a1	0xf5fc1a24	0x51fea72e
+	0xa6b203f2	0x13b8ccbe	0xc411482e	0x40529a43
+	0x8ec685c6	0x31334940	0x3758077e	0xc551b5d5
+	0xeed75a95	0x1bbcd839	0x64b09366	0x426afc28
+	0x70826210	0x2cfdb0b7	0x2e1d1442	0x39db3d97
+	0x3826c5a0	0x500157d0	0xd6dacf6f	0x9b9dbe3e
+	0xab4c2657	0x98c19ffa	0xd12dcb10	0x73d3b9ba
+	0x0c15214c	0x737e36b0	0xb903b782	0xb7ac4e8c
+	0x0d0a3b55	0xcf534bc7	0x3268a6aa	0xdaf914d3
+	0x33f832b1	0x280109cf	0x270be538	0xe6bbe826
+	0x11c372ce	0x74a668fe	0x0065b4c9	0xffc007a3
+	0xbcea5c8c	0xf95f792a	0x88b93d2a	0xa76a2eaf
+	0xb6dbc1be	0x8aea9c60	0xaa7f4bcb	0xb48d40c9
+	0x5aeba8d5	0x45797ea3	0x736e4060	0x40dc0826
+	0xd497fb52	0xcdfb751e	0xebd6fdf6	0x3471bbd0
+	0x6d5bb733	0x02b6cbb1	0xd086c9c4	0x0485863e
+	0x878391a4	0x57e62c09	0x37385c15	0x96e76ac8
+	0x093dbd37	0x1ffe70f9	0xe256fc68	0x3a509a68
+	0x019d3e81	0x038168f1	0xe0b2b6b0	0xe6eee6e5
+	0x2080b0d1	0xe25aaf0c	0xada6ac13	0xa3755f0e
+	0x99f9efd7	0xb0cbe867	0x1dd5fe38	0x1bb8bd56
+	0xb54dd0ee	0x344d878d	0xf937042f	0x9ac5c721
+	0x1a60dc54	0x643b9a83	0xe66ce361	0x0d10d718
+	0x31aa90fd	0xf71e52c2	0xdf7eda2e	0xdc068ad5
+	0x095f114b	0xdb1a9b68	0x64ecb9d6	0x6f13609a
+	0x9242152a	0x1a7059cd	0xaa4c92d3	0xbf9a70e0
+	0x93936ec0	0xc8456867	0x05118674	0x0d6289af
+	0xacc6aedb	0x3cd3aea0	0xb11acc65	0x93121235
+	0xd080cb09	0x1a3e9be4	0x3772ad61	0x1277ce89
+	0x503309b8	0x7cc1ada2	0x87e93e41	0x565bfd16
+	0x8d64db91	0x8776da19	0x8068ea78	0x8c4ed3dc
+	0xb9904266	0xafc63a7b	0x120c746b	0xaa5503ae
+	0xf6c8c09a	0x7390cac4	0x736c1bdd	0x03ed0655
+	0xa692aa13	0xa95b2587	0xeeb8140f	0x97c907b5
+	0x6665d1e1	0x335794bc	0xc59a6232	0x0a6a7bfd
+	0x0820e282	0xde4982d4	0x43ce576f	0xca9f43cd
+	0x439467d8	0x513c59aa	0x40a47741	0x6c92f234
+	0x712a918f	0x5222ad75	0x90097829	0xf82f3dc7
+	0x5c95108a	0x9432a016	0x1c13d7fb	0x6a64358e
+	0x88c43a59	0x726c4bab	0xbba1d26d	0x3a6fbec6
+	0x603c6edb	0x5002f608	0x65b6e6f4	0x9911d725
+	0x1e9d73f1	0xad3facb6	0x3074a331	0xff08050d
+	0x84efd825	0x0ba49a61	0xef94c605	0x95e6fa34
+	0x42102abe	0xbb7a7327	0x53fb9fe5	0xbf3e7e13
+	0x35ed38b9	0x2af0b51b	0x59d53a64	0x77963248
+	0xe3788d31	0xe193f2b3	0xeee24485	0x8688c4ee
+	0x9c61fe6c	0x5745fc77	0x8fb588c0	0x9b8b73a9
+	0xddf4a85c	0x37f97b96	0x37ef756d	0x75b88955
+	0x4ddcf2ee	0x0ddbaaa6	0x53188169	0x9c17c6e1
+	0x6d6f6640	0x97c72398	0xf2a555d2	0xbeba7505
+	0x8a330e05	0xfd73bf33	0xa84d8356	0x928cd08f
+	0x302f868b	0x4dc8aaa4	0x0eae2165	0x0151f140
+	0x1b337b5b	0x168f2728	0x377c45df	0xd5a333cd
+	0xf9cd451c	0x386cd928	0x5e45d283	0x7e224f31
+	0xaebe5122	0x75c7e49b	0xe3949ce8	0x397bcadf
+	0x4c0e0f77	0xba92d6b0	0x9288f86a	0xe9a47d7b
+	0x344fc436	0x00a9a682	0xd15e8917	0x7dcae697
+	0xa2955662	0x9465b695	0xec9f769a	0x740159d4
+	0x738b71ab	0xfb57cfe9	0xfa582c08	0x7d5521d3
+	0xe2644c13	0x4311f413	0x3c2751d0	0xc9faa58f
+	0x36b94cf3	0xcf8cff31	0x5dbf8927	0x82f8c846
+	0x8bd2ceb8	0x2a7368e9	0x9eff066f	0xd93f3e0c
+	0x2358ff4c	0xa41ce1e6	0x41ea009a	0x04c7a7cb
+	0xa2897e54	0xdb46c580	0xeca4c4df	0x0920694c
+	0xde5d8ad0	0x23968b10	0xfda8d5ff	0x6bfaebb0
+	0x596eb388	0x797dd1b5	0x18a1e5f7	0x8b58637d
+	0xd618cddc	0xbfe51118	0x46ba28b1	0x94854536
+	0x0fa51257	0x381f2d54	0x20d68fc0	0x540b8ea8
+	0x5e81f3f8	0x55409d4c	0x03768f09	0xdf9ccc98
+	0x012b6611	0x9a8ad678	0x340313b0	0x08fb187e
+	0x3c208640	0xca62a71e	0x75e62236	0x303002e0
+	0x71d8ce8a	0x15cd2434	0x519570a8	0x2ad715ff
+	0x61f33c8b	0xdd1ec924	0xb1a4c788	0xf2c36eb4
+	0x5aa4b007	0x75e7c1e5	0x29bc37f9	0xbc7bf320
+	0xfce34584	0xbebf90d4	0x8a8be8a2	0x3ac72a9c
+	0x0de840bd	0xda21156f	0x06a72c18	0x0c31c6a8
+	0x8dbfb88b	0x2c030320	0x7b91cf76	0x4b698166
+	0x11465c72	0x2dc1af9c	0xec43656d	0x07313b0f
+	0x2347b8c1	0x3a66229e	0x3e19108b	0xe734c641
+	0xc8ab5c8a	0x295e857e	0x80ccac9c	0x52fc246d
+	0xe0d5729d	0xe788795d	0x862db49b	0x81de8327
+	0x57a24391	0x46873200	0x1d6d9e62	0xb61cbde2
+	0x40c67928	0x5983967b	0x249cf427	0xd944ba02
+	0xf915cb96	0x7f07bdf5	0x01d35dc8	0xaed094e3
+	0xfb177ba3	0x81f39bdc	0xab553569	0x09e791f2
+	0x866c4561	0xe41ed6f8	0x880ded55	0x9a6f5b07
+	0x5457168b	0x13b672a3	0xabba6ff2	0xbb92c573
+	0xf46b5af4	0xb8690988	0x8b767492	0x53e2f7c0
+	0xa6b8cd45	0xccc0f21b	0x2205c607	0x97f74f86
+	0x4a671fe4	0x2078716f	0x2530825b	0x3b0db3a3
+	0x3c86b75d	0x780e6f20	0xdf8af7d6	0x547710e3
+	0x397470a9	0xb3f04101	0x206511ae	0x30ccf385
+	0x1792e9bf	0x80ad156b	0x7325e8c7	0x88ba99a8
+	0x6d0992ce	0x07e834c7	0x334e415f	0x2c246850
+	0x8502dfaf	0xb1ef5b19	0x75ef61a9	0x98e3b45b
+	0xcb9f0a6f	0x8c5f2ae0	0x16e43384	0x7ed0eec1
+	0x940e8b42	0x03fcde5b	0xcadb2d4f	0x0a3d8362
+	0x93038e69	0xef8c8384	0x065fcb40	0xdd57dc0e
+	0xf0362942	0xb39c96ab	0x979ec3f8	0x0efb2396
+	0x67a7c975	0xf8f272c9	0x52461862	0xea391db2
+	0x11f15fb5	0x2435ce54	0x9c51b8f5	0x8c7b9119
+	0x4b48b4fd	0x9864e85d	0x9840cd3d	0xa98f4da4
+	0x9a7f03c5	0x89e50015	0x6c6d54b2	0x9e647aa2
+	0xb3835823	0xea9bafb0	0xa6839d36	0xecf71292
+	0x170f2b96	0x44b0ac85	0xaf475a0e	0xa892f2df
+	0x7e92ff6e	0x7a55a76c	0x97a6edf8	0x1a8b561a
+	0xba061934	0x2d4ba604	0x85ece0fe	0x0ab3a735
+	0x26935212	0xe74ea97a	0x33ed586f	0xca8989f3
+	0x4802c043	0xef153bc8	0x32c511aa	0x994c3044
+	0xf3608e41	0x8b2ba3c1	0x27c40d2d	0x56ae54af
+	0xb5df3e4f	0x7cf1679d	0xf76a120d	0x28af2bf0
+	0xf87650fb	0x4ef69312	0x2a28acb1	0xe78d71d5
+	0x8cb89388	0x7f25bce8	0x420545da	0xe654dc1f
+	0xe6fd962f	0xf4f06310	0x9b5ccd44	0x60e3624f
+	0x9f38c5d8	0xe5fcf792	0x839bee9c	0xb405347a
+	0xc8cc045e	0x61506b9a	0x3a3682e4	0x22ca3ee4
+	0x5aff86c7	0xb9091ac9	0x2f8c8afb	0xafb29af9
+	0x1d4a3f19	0x9de74245	0x1a0ea238	0xc8bdc6cd
+	0xf1107b01	0x1dc7552a	0xb46a8c4f	0xe716b42b
+	0xfc060840	0x15fbc29d	0xc532c4e6	0xe96c8306
+	0x9e69da96	0x7f68fcc7	0x67d18b52	0x77a87432
+	0x280a6ee1	0x9a617bd9	0xd8d601b9	0xadc7f7f1
+	0xe3349a28	0x8efa2d8a	0x37ca44b0	0x6499f67f
+	0x5fc7b339	0x690852bd	0x27bd71fd	0x07159d82
+	0x9c841ba9	0x40741162	0xd7df8ef1	0x3edecc5e
+	0x12086a65	0xe8e6ee6a	0x1c177c39	0x1bee453c
+	0x5cc0b73b	0xec84a212	0x174a641b	0x7fa732e8
+	0xdafe94cf	0xa8eb95d6	0xb658346d	0xceee084f
+	0x3ed35394	0xb339f90c	0xb9bc44b3	0x1dd76c34
+	0xf9a54771	0x1482cbec	0x3816720a	0x3a1ebcc2
+	0x15cd4a11	0x94bc6c92	0xcb4cbf26	0xa141f0a9
+	0x11d8331a	0x82a73ed8	0x129d4088	0x3718c117
+	0x9fb3a041	0x51686b91	0x6f735d1b	0xd9eaabc9
+	0x623e6caa	0xbba10978	0x4811fea9	0x9e8a6779
+	0x007ea597	0x02a71344	0x0bc9b390	0x7bca4fb3
+	0xecc97d95	0x1c82c55a	0x746391ab	0xb0fab9a5
+	0x54f66c88	0x21797043	0xcca5c581	0x4fdccf5a
+	0xaabaefdf	0xd606be82	0xcc2b2d33	0x7fd7cb14
+	0x1e3629ea	0xd8e76e94	0xa895dfbe	0x0c06919a
+	0x4ea7aa08	0x3a178b90	0x4a56dfa3	0xb98a1f87
+	0xaf5a9fdc	0x7591a3c7	0xd5b58c30	0xd4028625
+	0x55d42179	0xccf397f9	0x824b38df	0x97292483
+	0x09119e73	0x945cc1fe	0xf4b77171	0x753154e8
+	0xcf0740db	0x3282b3a7	0xcc266194	0x7cdf91b3
+	0xd123931c	0xcfbb7728	0xfe410560	0xc4cce81d
+	0x3b843933	0x75734bca	0x3ea34af3	0xb9515793
+	0xeb66b451	0x3a6a1135	0x633d086a	0x31e627e8
+	0x3d12a160	0x9909d28f	0x6b98e9fa	0xf5e81dba
+	0x8d233c7c	0xbfde17d4	0x5a442267	0x228a56d4
+	0xfcf27d3a	0x3bef2fdd	0xd0c9c057	0x84c2dd26
+	0xcb54e412	0x01f6d774	0x78d352bb	0x3403cb49
+	0xe16e92b7	0x25fdeaa6	0xa90610a3	0xcb43c17e
+	0x880f57cb	0x50908846	0x8255be3d	0xc01dbf9a
+	0x4bb1a52c	0xafc5a8c0	0xa543d14c	0xd18efbe7
+	0x5b18ff14	0x910913a7	0xb78f2a4f	0x2e9aff82
+	0xf3604dc3	0x77b5dc87	0xcbd16de3	0x9e9aa767
+	0x50c14c8d	0xa53a91f6	0xf5369c5f	0x693421e9
+	0xe7d41706	0xde2ae3c0	0x3383fe8a	0xfff54f57
+	0xb22e6bbf	0x330cc71d	0x0566d22d	0x63726b5b
+	0x4af41cf9	0x1da8b9c3	0xd8c5fb71	0xcb4860f9
+	0xbd301732	0xd0300319	0x51458c3d	0x2915617f
+	0xa76713c0	0xaab3eb2a	0x35cdab1c	0xd1958253
+	0xc42c14ed	0x9794c64c	0x3f4860d3	0x5be281bb
+	0x7153eb66	0x0fbe8b50	0x3296f7f6	0x14ca3bc9
+	0x5d3e1995	0x3f54a9a0	0x3a350e66	0xe0eaec63
+	0xf6b40eda	0xb432a3e9	0x8eaf6fd3	0xa5e02a4a
+	0x82181320	0x7b18018c	0xeba1bb24	0x192f05f9
+	0x95aa2c21	0x2635f2f9	0x13a81ac3	0x57feb353
+	0xfffbdfff	0x20c3f27c	0xfe1ccfb8	0x75e9bb2d
+	0x2470564b	0x59e7905c	0x5ad8e400	0xf575caf4
+	0x3c99a548	0x93ff04a9	0x494be39a	0x966d5c2c
+	0xa0439df2	0xb42ecb84	0x5ca0e55a	0x72bb3b6d
+	0x903f12cd	0x55b67ebf	0xaf4188f0	0xdb3828de
+	0x0e8603f1	0x35a3b856	0x63402b22	0x21ab7779
+	0x4efeaba2	0x919829f2	0x4190e5ed	0xbd99779b
+	0xbc96cd73	0x6d5eda45	0x872b6659	0x7c30cb30
+	0x1ad0c877	0xa88ef386	0x03bf7f3e	0xa6c18655
+	0xe39e2764	0xa40da119	0x01f5eb9f	0x4b6790fd
+	0xa50414de	0x4d7d8fcf	0x28e6bdfb	0x345dae6a
+	0xe706b08e	0x7958d05d	0xf6ea912a	0xeebf2736
+	0xc5ddbbc1	0xdf079dad	0x09ea5e1f	0xddea3b87
+	0x367782fd	0x7e657215	0xbce3c13a	0xd998f10e
+	0x22a6ed1b	0xbd57ee41	0x8bd6a4ff	0xbe81acf7
+	0x186aa189	0xe986fbb4	0xb4b798e0	0xa313653b
+	0xec674a01	0x656d8992	0x92104018	0x01eba2fd
+	0x99314063	0x0bc67b96	0x98891022	0x32a936e5
+	0xee8331f5	0xff55bf99	0x2e305833	0x6fea2320
+	0x261d4ad4	0xb357a04e	0x6086539b	0x12b59123
+	0x170e9c0b	0x2c509ff5	0x4684fa75	0x55535535
+	0xc47f3dd0	0xf74a35a7	0x468e5623	0xdee52521
+	0x55f86d53	0xc6c66d4a	0x0f127241	0xa89d946c
+	0x2054df6a	0x7555153a	0x91cf4407	0x71d0e3de
+	0x6dc16613	0x32a44245	0x8607574d	0x6eb010de
+	0x02cb87ad	0x16ca5da4	0x79026a0b	0xb3c22ea4
+	0x2aad720f	0xc59c6272	0x8b0ffcbc	0x90138b11
+	0x94960289	0x018dc9f4	0x28795fe7	0xa9d97031
+	0xdbabb687	0xa26c631a	0x22b60590	0x816e4981
+	0xe881272b	0xc2d2a9f3	0x251dfcc7	0xef7d7cd4
+	0xe92e8a70	0x5a41e9db	0xe4c0d1c5	0x559d1455
+	0xe661afb6	0x87819510	0x880a078d	0xc82fdc06
+	0xe27e27f1	0x9912132e	0xbee4b9de	0x04477b74
+	0xb25684d8	0xeec01992	0xd3e81251	0xfa528234
+	0x435b2dd7	0xe45673cb	0x9b4c9767	0xde5de093
+	0xa2e591dd	0xe4e27f7a	0xe94c0e70	0x5c392194
+	0xff2d4212	0x810af41d	0xf8d322c9	0x14f17d5a
+	0xac7aed44	0xb5fcd81d	0x65eb270f	0x207876ca
+	0x8a89846e	0xe6418235	0xb5a935c4	0xf188f339
+	0x9acf3f50	0x5083deba	0xea6c6c76	0xce7e9d9e
+	0x22461871	0x87f0108f	0x12a97a3b	0x7c8fdec8
+	0x8f326b24	0x617cb20e	0x21a34a79	0xce7c70ca
+	0x1b33c68d	0x92f06767	0xc51c5649	0xf5ae12cb
+	0x75c2ff79	0xe485811f	0x191c9dba	0xc87e8cbf
+	0xafd4b4d2	0x6fc0af0c	0xbb76c0ba	0x6fb0336e
+	0x46f59bb9	0x401ded33	0x88a92571	0x328d44c2
+	0xb494f4dd	0xf5a68521	0xffbacaa9	0x30ff5d32
+	0xa3dcc986	0xc10670cc	0x4d9d69d4	0x365865d7
+	0x9ae0ef1f	0x97e8a835	0x83acb6d4	0xeb6fe7b0
+	0x7337d45a	0x384731ec	0x6a12e5f5	0x5f5f0f92
+	0xb0ab43f3	0x1ecff295	0xc2c72221	0x02d90770
+	0x59869deb	0xe01eb4ed	0x38691b29	0x39b21ecf
+	0x812a2a39	0x1d211c6f	0x027ebf3f	0x9b94bc94
+	0x0be5efbb	0xd4c43105	0x0a3845c4	0xa5662a41
+	0x5110cbef	0x127d92bc	0x99924648	0x222c4bdc
+	0x4db3da4f	0x57c771fa	0x3820187a	0x0fb448c9
+	0x3c17cb96	0x76d5c447	0xdd6cf323	0x180615dc
+	0x6d133cf6	0xbed0d7f3	0xb542fdb6	0x837ff1c6
+	0x5686629f	0x1412eea2	0x45b93f3f	0xd6c324a4
+	0x9b3021fb	0xf0976d4c	0xfc02bea8	0xeab7f534
+	0x0a5f2aff	0xeabbd304	0xfc2b6ef2	0x8e1444fd
+	0x6a683e99	0xef114948	0x9c61f02f	0x702da123
+	0xa10a252a	0xb435a995	0xc828d43b	0xeb2e16a1
+	0xed91a2f1	0xb1783a96	0xae6eb190	0xf5b3ece5
+	0x15caec18	0x41d2124b	0xfe97094d	0xb63028bc
+	0x3849f412	0x60c25505	0xbee19f15	0xad10e883
+	0xcb4529e8	0x5ff6312f	0xc081c3a8	0x51d7c2b7
+	0xdf4b795d	0xe14ace52	0x639c5108	0xce31269d
+	0xed005d20	0x0f251ce6	0x105051ff	0x7ace3072
+	0x2e490489	0xd0677ac2	0x06c42d29	0x09c7eab7
+	0x03a75852	0xda74f991	0xe8bbd5d8	0x49a04f14
+	0xc034774c	0xcefa0c35	0xada23997	0x247c022a
+	0xb87a5cfd	0xd47e56ca	0xc6a48f18	0x745f325b
+	0x97fd37de	0x16ee3f7a	0x94d119a0	0xc943976d
+	0x3969772b	0x3b4eef57	0x13b0c418	0x9a03fed8
+	0x2311572b	0xaade9680	0xce4cd64c	0x63180789
+	0x00abbb28	0xd10c8e72	0x55967c83	0x6eb8b4a4
+	0x8e178a4c	0x245db146	0x37ddc447	0x265c0aad
+	0xfd20a1c7	0x3c6972a1	0xe8f63469	0x4269bc90
+	0xe5c9ede7	0x7b8f7b4f	0xe777406f	0x17e2a6cc
+	0x5ffa1f4d	0xeded9e39	0xb83702c7	0x8ac429ee
+	0x926d8060	0x91ec6bce	0x89a6f240	0xbeb1b113
+	0xd0d62f8c	0x6282f306	0x805e8d16	0xc4ce2681
+	0xf1a51ca3	0xd3f69f39	0x50ee27c5	0xdcdb84d7
+	0x7744f4c9	0xe750aebf	0xae52b932	0x7833c17e
+	0xb6adf91b	0x86c7a692	0xfb8b3854	0xee875284
+	0xc66a6e8a	0x950e6596	0x5a21665f	0xb99421aa
+	0xb2bddb7b	0xf0307281	0x22e79399	0xb541e0e9
+	0x6a45bc69	0xb6ebdd7c	0xd851e16b	0x9783cf97
+	0xafdfc7a7	0x4f011d28	0xc570cd93	0x752db80a
+	0xcf3de399	0x907d3ad2	0x91faadac	0x8c9c578a
+	0x61cfc727	0x8b20e89f	0x4d5a6666	0x8c28e00f
+	0x1a1675d8	0x7c793aa3	0xa2210e0f	0xaa5a9509
+	0xa3942ddc	0x5f8b76ec	0x00aa7a2e	0xea375121
+	0x521b786e	0x4b27e1f4	0x262332ca	0x2a739651
+	0xf442ed82	0x74f40d7d	0x0f374d95	0xd6121c68
+	0xdc6aa0e4	0x0fefe09a	0xb06ef32f	0x45951415
+	0xc25d5b51	0xa139a8f3	0x87363003	0xe59a0f0a
+	0xbfc54dc9	0x69f84ef1	0x3804453f	0x976850ab
+	0x65bfbe93	0xa0b4c673	0x5fd531fd	0x1b90f96d
+	0x93c92211	0x26236f14	0x6d67aa9e	0x1fc006aa
+	0x1e41a145	0xc952b72c	0x3e274f98	0x6cba1001
+	0x8a3007b1	0x12318114	0x82ea0917	0x4a783735
+	0x967e9463	0x957c4366	0x039c4f2a	0x732e105a
+	0xbe8f62ce	0x7acf5484	0xc1dbcbf6	0x6d663150
+	0xafcc53d0	0x9e54e869	0xaccd2f5a	0x0596bac7
+	0x6102d4bb	0x145b2201	0x85772d86	0x157fd7a4
+	0x27b4bceb	0xbc8634e8	0xd713f53b	0xb9a22cb9
+	0xbb6e509a	0xec84eb87	0x58a99ff7	0x6e026c56
+	0x262cf17a	0x96aa6b86	0xa432b5a7	0x4261f767
+	0xdeb7cfcb	0xe52bd101	0xedce6213	0x6bd1704e
+	0xd446c3ac	0x3396a979	0xe46c23ca	0x1be0b8bc
+	0x04b81418	0xb74da201	0x1ba7e42d	0x96db8852
+	0x01477c80	0x4f84f7ed	0x556e3d40	0x2c5ecaa6
+	0x784f461f	0xe6a79f5f	0x223f6345	0x7dc789f9
+	0x803cebab	0xc9fc7fab	0x144312b0	0xfb68670c
+	0x8d3bd502	0xb73a19c0	0x50b4dd3b	0x4434bc5c
+	0x3c96afa1	0x4caeef15	0x4b73b56b	0x6c2dc827
+	0x09d29490	0xda88aafa	0x58e7d66f	0x02d85153
+	0xe028d696	0x397376f4	0xa0b385d4	0xfc52d8ef
+	0x9ff7f61d	0x53d9e137	0xd7eade45	0xf61a3be9
+	0x732b9585	0x172e0d6a	0x6b439ec3	0xf7e69034
+	0x11cf3bfa	0x72db7836	0x28a71411	0xa7e541b1
+	0xa11a869b	0x40cc133a	0x99568ddf	0xf88f5407
+	0x3b9566c6	0x14ee8af3	0x0a553446	0xde19963a
+	0xb30a65df	0x620f06a9	0x23a13e20	0x677abaf9
+	0x85348c3b	0x227e886e	0x621ada06	0x29410dd6
+	0x1d3279c2	0xcb2e1db5	0x8f9e4dec	0x39c7ef14
+	0x1deb388e	0x487865ab	0x2063f724	0x13309f26
+	0xcb9c175e	0x5db6e659	0x2d4afe5e	0xf93105b7
+	0x9c88614b	0xe4c2d81f	0xee47bc34	0x05a42aa8
+	0xc7a366c1	0x717696ba	0xecfe37be	0x8ef87213
+	0x7953b258	0x6b4cc006	0x9687ef62	0x7796cc13
+	0xaeb3b791	0xd8c6d496	0x6801b485	0x75d7bc78
+	0x6b6eeb6e	0xf38743d8	0x6eb75dcd	0x384cb686
+	0x54bb91c8	0xa4c32f35	0x54bb1256	0xae792803
+	0x7764e3f6	0x24ab5fa1	0x3e629e01	0xdeef8f34
+	0xea0bd2ff	0x665e7068	0x18bdd480	0x225c0af7
+	0x96d97929	0xee100c2c	0xeff847a5	0x714dd01c
+	0x4e18e204	0xe804801f	0x9ee779dd	0x8b116fea
+	0xe46e94fe	0x3a7c2031	0x059d9ae9	0x35704f42
+	0x88d7b497	0x90c487e7	0xe82c3c79	0x4ea43be4
+	0xa898a30c	0x68d8ad90	0x675dd885	0xcd3102d8
+	0x527ae14f	0x6cecf590	0x85157cf1	0x713fa88c
+	0x1a3871ae	0xa6a7901c	0x69ed7c83	0xd65a3328
+	0xb9b99e6d	0xa8abd0a1	0x22878c58	0xfc1b1ee5
+	0x86c19e75	0xe370301b	0x312058dd	0xf886eab6
+	0x6887322c	0x5bb6097c	0x45710db2	0x0a0f0b3c
+	0x77367703	0xdd22a598	0xaca61cb7	0x41a8d898
+	0x1cfd1b9c	0x1b5efdee	0xb89bc576	0x9b7bf384
+	0xa51b486f	0x43bd652c	0xdc2a42c7	0xf1d964e4
+	0x60162276	0xecb776da	0x8debf109	0xffe59535
+	0x81a2b6a2	0x3db50d88	0x2b7446a0	0x8e3db5f5
+	0xf0e60f94	0x29c4ec91	0x7d028705	0xc9822a5b
+	0x448ce3b1	0xbb764fd8	0xc1cc6a57	0x2209a704
+	0x79e09f45	0x55bbb983	0xd49826d9	0xc4a8fde9
+	0x0d21fe4a	0xba53caf3	0x7fb4bd8a	0x726917ac
+	0x987c1240	0x06d3bec4	0x20e63056	0xb935a165
+	0xda3ea0b9	0x17c5542f	0x608e6dac	0x0d0ae11a
+	0xbfa956e7	0xec1c2a59	0x8f876337	0x08cc0abf
+	0x01893ffd	0x52ad2c87	0x20b44ffb	0x9629089d
+	0xe38c7dff	0xd170448b	0x58ec3730	0x058f49fe
+	0xf71605f4	0xae95f30e	0x392fb97b	0x1d253d57
+	0xaf27d084	0xf40ee99e	0xc7e6bb9b	0x2385218f
+	0xc33d94cb	0xb3409f26	0x84aada63	0xc519ac78
+	0xb95ababd	0x70e0d193	0x85456e9a	0x619065ab
+	0xca86977a	0x39f8b061	0x283f9b30	0x501e24b5
+	0xb7c6d6e4	0x4ae8a58f	0x2d1002b3	0x59987e28
+	0x0468ccf4	0xa2f04277	0xb0ac7e87	0xb5810d46
+	0x0bad366e	0x483e37c3	0x787222ee	0xe33251ca
+	0x632f6dc1	0xb5cd27af	0x37152a50	0x03204246
+	0x734a5b2a	0x884f4d38	0xe690b2ed	0x0cf8e2f1
+	0x5e6ea1fb	0xdde6e3f0	0x2c64badd	0xb3e27661
+	0x958d5792	0xabeb5422	0x7bd72c81	0x423ddb78
+	0x5da377f2	0x63c26b0d	0xa5bc8b76	0x407d5d9a
+	0x95d388aa	0x3bd4e246	0x9e0fdf3b	0x95a68a1d
+	0xda40dc30	0x04fb17b5	0xbcac4960	0xb21548e4
+	0xb13fb831	0x897b8443	0xba928329	0x02c9ef1e
+	0x955b70fe	0x66decee0	0x0028f1ba	0xd6abca27
+	0x07c3e749	0x81daf249	0xfcc77b67	0xd92cb560
+	0x4d99bc0a	0xfd4f2868	0x835ca0e6	0xf7cbdfce
+	0x2ef23e50	0xb73dee70	0x52c31bd3	0x0216f011
+	0x8f843803	0xbb328ce8	0xbafe6cfa	0xdc11931a
+	0xca78f5af	0x701901bf	0x0cb2f369	0xcf81f5ac
+	0x130df41c	0x4ebf5b97	0xc20e71dc	0x77c7db59
+	0x7514598e	0x076b8d81	0xb4455b6a	0xd39a43a9
+	0x1454ec13	0x16bf144f	0x873b8300	0x8cf24e90
+	0x06df232f	0x5d72ee57	0xe77b4ca0	0xfe7a93ba
+	0x71a6fe0c	0xcefb044e	0xfa41f121	0x0c736797
+	0x69d26292	0xa4571b00	0xb6cd7ba2	0xd088966e
+	0x13ba8390	0xabd689f4	0xa7348565	0xe153af32
+	0xd3af3755	0x3a291ac4	0xd0fed6e9	0xe76d077a
+	0x3fa5afb7	0xea870423	0x9bc02dda	0x0696570e
+	0xc528294c	0x8035bcb1	0x3fedf497	0x4e85da97
+	0x87834ad7	0x4cbc4464	0x7fc32e15	0x9f248783
+	0x74cc30fb	0xc004e66a	0x65b3e508	0x9dc7bf07
+	0xe70e9553	0x762c4e53	0x06377c76	0x415d95dd
+	0x4c74daf2	0x5492b248	0x2ac359c7	0xafd715ab
+	0xeea3bba9	0xdc21177d	0xb89b4364	0xdd3fbe05
+	0x5e2dc68f	0xc445c91f	0xe2a7305b	0x3b434867
+	0xd55f2fea	0x028f3861	0x8c5656d4	0xe2c04c10
+	0xaea45e47	0xe65651a0	0x6f67d97b	0x759d1fc9
+	0xa0bea30c	0xe62c32d9	0xbb57faaf	0x40207bd6
+	0x780de534	0x0fe4b81c	0x0735bbc5	0x25dc0c03
+	0x3909ff0b	0x1808cac4	0x520b8337	0xb9729f84
+	0x24fb3c1d	0xd82e0a5b	0x79f99b13	0xe9612c13
+	0xaee4bce1	0xb6c0f691	0x32d2c31c	0x9e6f92f7
+	0x86e98158	0x33643ab5	0x7617e010	0xb95bac7e
+	0x0e56bb41	0x74dfabea	0x3cf7749d	0x119b9839
+	0x875cadea	0x9327f3d2	0x1b5a9b8a	0xfcdcdd2c
+	0xbb7300f6	0x7b532fdb	0x0bce3f2a	0x93a79dac
+	0xb88f3690	0x342e1bed	0xefad0cd6	0xc31975b2
+	0x575a8a01	0xa524c868	0xcde65ef0	0x97a9c33f
+	0x735784e4	0x40498a19	0x45c63c8d	0x679a2416
+	0x046c9898	0x8e66cc4c	0xff503359	0x95dfbe22
+	0x2424bd50	0x2b882310	0xe4d6931e	0x55e4e1a6
+	0x2dbfebc6	0xe2b10c94	0x2ba0b6e4	0xbda3f610
+	0x78ccb9ed	0x15eca5aa	0xf3ef1825	0x7fff8209
+	0xb9ae92e9	0x4344502a	0xbe549a7a	0x459997b8
+	0x4c88c72e	0xcb6109f3	0x57879c01	0xc1e7d40f
+	0x79cbee03	0x52a5dfc7	0xb0a3e20c	0x11cc0682
+	0x634345d4	0xb1097bcb	0x4170bc95	0xa38e7f08
+	0xf89ecaba	0x37f4f748	0x50fd02b8	0x6b026dd7
+	0x8e9270f9	0x3c6bd04b	0xcbb680d1	0xe10f1161
+	0xfa3011fc	0x273f1915	0x66bea263	0x22ba4a11
+	0x73d679ca	0x9f88a3c7	0x40eed71e	0x974b512e
+	0xc1fe137b	0xf0054108	0x223fb47f	0x0fd0ae5d
+	0xd2352fbf	0xebc2229a	0xac38d629	0x25ec7169
+	0x1939d86a	0xc879b796	0xc7f8dce1	0x92b9dc60
+	0x3e5291de	0x936a2f7e	0x9b2d869e	0x24d0f8cd
+	0x1ba680c9	0x0c839619	0x0d69bbdb	0x26a3644d
+	0xb102adfb	0xec059a27	0xe2477ab9	0xc2e9f654
+	0xe5f257ed	0xa9cd346c	0xc0f22053	0xb9dfc03e
+	0x3f737368	0x791e3a80	0x5d6280ff	0xda55df26
+	0x8d5740e3	0x2a6d7113	0x83a70056	0xbb31a7f5
+	0x413f4612	0x5302ddfd	0x44f41d43	0x675b7e05
+	0x723af78a	0x2d833251	0xaf8419b3	0x3bc05d32
+	0xa9251294	0x92fdec09	0xa1346541	0xec186dd5
+	0x252d4e94	0x55a207dc	0x09e57c82	0x05a8198d
+	0xb970c263	0xa772c113	0xe625a4a9	0x780f80ed
+	0x5391fdc9	0x40f8e6ee	0xd37cf89b	0x35e1a4b4
+	0x8e2e14d8	0xf595c9f5	0xe457cb19	0x7da1c578
+	0xbaee8480	0x6626129b	0xb0e949b3	0xdfa72b6b
+	0x2df13902	0x041f7101	0xd7ad6d85	0x84a12d44
+	0x3c48863b	0xd77a0d78	0xc4716f33	0x5f6c80b7
+	0x8dbc331e	0xb81e99b9	0xc030f343	0x1395fa80
+	0xbbc472a9	0xaadbddf3	0x331f1162	0x62aa6ae3
+	0x329ef3ce	0x3c63ddf9	0xf74613a1	0xe6845844
+	0x2bf454d9	0x9349f051	0xe47c2353	0xedd3ad76
+	0x6e148e5a	0xefc1a92b	0x2c94fc97	0xc96ac0dc
+	0xa1b239d3	0x56fa2e07	0x5dce9da5	0xd99fc97a
+	0x151f4557	0x92d3b296	0x51c5adb2	0x472e3502
+	0xa2a9ca6d	0xdf1537fb	0x7497ee54	0x652788fb
+	0x3480f678	0x6226432d	0xd3196022	0x60af6d8e
+	0x7b9ba419	0xd510fd1e	0x48d5309e	0x5fc1c0d2
+	0x108a41de	0x0e9f8028	0x549710b4	0xc48d9ab3
+	0x36fc7bff	0x7e257815	0xd51cc507	0xd321681b
+	0xe12d9f15	0xfe39bede	0xdcc3ee34	0xeb20cba9
+	0xcd77b4a7	0x894b9283	0x2b5c1cef	0x5200e41c
+	0xf67270bb	0x5d104c61	0xeb64074f	0x22f5bbc2
+	0x37d8b7cb	0x88122de3	0x009cffd2	0xe772f72b
+	0x9c63f41a	0xc424e4ae	0x1464b37a	0xa6dda79e
+	0xcf89c39a	0xf23eba0a	0xf3f3a685	0x50120883
+	0xace33f54	0x53346d1f	0x3ce75d82	0x555040f6
+	0x4b458356	0x1d617f5b	0xbd6d29d5	0x6789cae9
+	0x3d787e1c	0xaf7dac99	0x69ae0efe	0xd5b62c89
+	0xc1b371a8	0x466c8316	0x4a1a399c	0x02d36ce4
+	0xcbdc024a	0xc69d6d8d	0x88926761	0x12a5d8b4
+	0xe01c2b8b	0x1e1991cd	0xe9aca0a8	0x49410f8b
+	0x426226d9	0x4b9d3543	0x6072827e	0x6037c39d
+	0x40e457d1	0x3361d4fc	0x7de4c8a0	0x68800165
+	0xc1e069b0	0x71bf38ab	0x4ab64b8c	0xc0acd6f4
+	0xe742be7c	0x46e21cee	0xed07ffba	0x148c7fe3
+	0x48c6a945	0x8a561bc6	0x3838c25f	0xcfed3d21
+	0x87451835	0x3a75912d	0x2ca7241b	0x5b252f6e
+	0xffc394b4	0xf4f62530	0xb933058d	0xe62195a5
+	0x09542e3d	0xdc5bbbab	0xf87bfd18	0x4a0915bd
+	0xdaee30b0	0x1c45049b	0x53057aef	0x8559c1b8
+	0xf4bd34ef	0xa70cc429	0x37ecbe19	0x5d2c0088
+	0x30c6e209	0x14d3f5ae	0xac2fce42	0x47b96c6e
+	0xe0b33111	0xefc61925	0x24554cae	0x401cca83
+	0x248148df	0x4d36387b	0x01987a6b	0x8f9ac8f9
+	0xf93718c3	0xf4c0605c	0x35600f33	0xbb57951f
+	0x01bd3ae3	0xd6b00ead	0x5c900933	0xbeafdfac
+	0xb3496a47	0x0e6d06ed	0xa69a4710	0x4aeee99c
+	0xdc59363b	0x710300bd	0x51643fc0	0xb2fa91eb
+	0x379f7f65	0x39c6e97c	0x098d6935	0x2a9d3085
+	0xd4df1162	0x5a2cf41b	0xe8671010	0xcc7d115f
+	0x328d3892	0xeea7d61f	0x573ec7e9	0x741a117d
+	0xee2ea628	0x3d1b983c	0x7f92a4bc	0x62025cbd
+	0x7ed34073	0xddb5d088	0x10139b27	0xcc217f9c
+	0x809352f2	0x6d1a1668	0x4ee31e30	0xd21e1f5f
+	0x6d37301c	0x176d8faf	0xa7768fde	0xcad1bb7d
+	0x24deebef	0x134a7f2e	0xcde8fd3d	0x409fff56
+	0x81b89c4d	0xdadf2ef1	0xe970a40f	0x4dca9906
+	0x948b6082	0x886f9c40	0x402ab8b5	0x3f3a363d
+	0x31c5f241	0x6b829609	0xf8923e52	0x2c6f3dc2
+	0x8b831a4c	0x0f847c9e	0x5dec8240	0xdd999571
+	0xe0e0bd87	0xcdabc523	0x347a64ed	0x622a5655
+	0x63a26351	0x29ff7cd6	0x5dd5dfa1	0x79996f26
+	0xde481466	0x10d4782c	0xb6e77d9c	0x0dc2853e
+	0xd0c81fd0	0x5f0bb987	0x27f4ef8d	0x9c23b96e
+	0x98fb2a24	0xa0e15d67	0x93fe17cd	0xe628130f
+	0xf2843acc	0x93bb57c9	0x4273a3fa	0x265976f3
+	0xbbee8aa4	0x52d8ef84	0xb3997bba	0x369525b6
+	0xeb7c39af	0x872c5324	0xc400f956	0x1cb37354
+	0xf4948758	0xe3096651	0x5a0ba8fc	0xfb69c499
+	0x312d8763	0xf3343ecd	0xe6fd3135	0xb3498520
+	0x5c854917	0x328b3eaa	0x1c840929	0x1c36fe47
+	0xfe0c3e42	0x56a8862d	0x3569f945	0xc22dda25
+	0xf84b1f5b	0x004dc57c	0x8a00a3e2	0xac699574
+	0x51039189	0x765e8036	0xc7afcc49	0x04842695
+	0x7b84b057	0x9c97f05c	0xcc79bb47	0x17dfb4b6
+	0x2fe652d0	0xe1498d3d	0x2ca8b3f8	0xb53ee5e3
+	0x1050d2b3	0xa2572be1	0xfcd3c334	0x70a15f82
+	0x1728b0db	0x6209c5fc	0xb44e5603	0x863332f1
+	0x96838397	0x36955feb	0x0d2da0a8	0x125e7d60
+	0xde2a310a	0xa351a181	0x6b228298	0x8a4d1cee
+	0x5e6b14b6	0x2f3a9457	0x3e9dc04c	0x74479b2e
+	0xd3d05a04	0x68d212fa	0x117406a4	0x4748ed39
+	0x41d5cd60	0x8dc01410	0x3ae6572e	0x70285c5b
+	0x83134014	0x1ef0ae5e	0x003e6be1	0x0b3ae0b5
+	0x39185245	0x5855200a	0xa12dd85f	0x35d08c8e
+	0xb8b9b054	0xe631c2b9	0x2008ecfe	0x8f3eb245
+	0x79b3a1b5	0xec1b3903	0xda6d57b0	0xcdee5055
+	0x25af467e	0x26d5f7ae	0xd97ec276	0xeea91eab
+	0xf261e901	0x3c981d7f	0xcd9dccbb	0x32136d85
+	0x9cfdb038	0x7fee83d3	0xf6e6d1f2	0x177663fc
+	0x0b6ed3a5	0x72670825	0x2cbb9cef	0xe4436641
+	0xc61f9d9f	0xb5c763d4	0x213a06bf	0xbbce6dc1
+	0xaf464963	0x343697e4	0xa2b3af13	0xf7fdd78f
+	0x6a460f6c	0x1b62c963	0x352ba307	0x91c830d3
+	0x66116773	0x280dfc31	0x302844db	0xdb47b3bb
+	0xc0ad1851	0x9979ba50	0x0083ba23	0x25c70fae
+	0x7c06b66c	0x65d20a4e	0x9848a1a2	0x295bacc7
+	0xe44c5837	0xfecf2330	0xe3ed6510	0xb1a48827
+	0xe694e108	0xa8a41bf0	0x17c797d3	0xfdae9b67
+	0x6f8ce672	0xc8d89a80	0x8f71f171	0xe95b2a4d
+	0x99f9e617	0xa6af87d5	0xa9160687	0x9d0393de
+	0x89bd4e6e	0x6528c903	0xa3ca2db1	0x6f77a5d8
+	0x9c377bb6	0xb888ea4f	0x06b81f7f	0x3c5c8de5
+	0x3bbcc468	0xcfaae47a	0x502a3f60	0x158c94c2
+	0x225ab827	0xaa630a68	0x77afe20d	0x19fde08b
+	0x171a5af6	0x81d81f8c	0xfde9be4f	0x69cd49b0
+	0xd83ff3c8	0xec30b85e	0x58621479	0xda1f95a5
+	0x0b1d8f12	0xcda765c2	0xb509d70b	0x76d158e3
+	0x7c9d02b2	0xebfd61e3	0x6e4d8ec8	0x8b779fdb
+	0x38d745b1	0x287a434b	0xf20a73ad	0x897e635c
+	0xdb9c36f1	0x12d23511	0x92f661bc	0x1e46d8a8
+	0x58d1f9e2	0x1f984e89	0x3b7d87ae	0xed74a89f
+	0x1c5614e3	0x1498a110	0x042704c3	0x287ba930
+	0x2f2a5122	0x5838d48a	0x85b720f4	0x2c99ed7c
+	0x893ab885	0xe1d9b760	0x0d097bfc	0xc0b1835a
+	0x2565db51	0x8b2c75c0	0x34b273ab	0x4e77c96b
+	0x95d64cf4	0x466a739d	0x32f2f18e	0xb993681b
+	0x2259c2e3	0xcd3c5fad	0x93b7a44b	0x56db345b
+	0xcc391356	0xa56659ce	0x9ab298d3	0xf756c870
+	0x9e8aa6b1	0x27f7ecfe	0xb02ecf08	0x3db06cfa
+	0x62225f46	0x0cbdc0f4	0x3660bc97	0xb600d787
+	0x47448beb	0xf2ec76e3	0x2f35cc41	0xaa07ac70
+	0xc8d7cfb6	0x3191df12	0xa35ed6be	0x5f6350a0
+	0xc92a1b36	0xe51e83cd	0xe67f70fe	0x2c30dc44
+	0x2720ea68	0x8989e2e3	0x1ee7a61d	0x25e49174
+	0x60370be6	0x4ad9f751	0x98269b55	0xe38875f5
+	0xa7dcebe5	0x8eaf1efb	0xaca785c1	0x75ef8dad
+	0x9c4a4e81	0x05b14e6b	0x94973929	0x8b0e51b5
+	0xad7d26fc	0x6028aca3	0x76abe148	0x2cf38c8e
+	0xf16de59b	0xe0e9ef73	0x14a157df	0xa487f134
+	0x90808475	0xc7c8fdde	0x507b2fa8	0x715be38f
+	0xe984cdcd	0xb86a2fd7	0x62996d71	0x41ae9aae
+	0xaf328519	0x6e26bd43	0xa9259149	0x43011256
+	0x8db13e02	0x666fcc5b	0x75850832	0x7a8967c3
+	0x533724bc	0x57d692dc	0x4b2bfa27	0xa94f1345
+	0xabc7f978	0x112a0629	0xdca1371b	0x99b30d9f
+	0x171c1e7d	0xba9c4528	0x715eb21f	0x824dad28
+	0x77b0faec	0xa8dba035	0x3026db98	0x5480ebd8
+	0xf6dcf737	0x9f01c720	0x505379b4	0xcfb68c56
+	0x8010d1ec	0xc0a022b6	0x0494af87	0x34a5e3bd
+	0x5f97db91	0x91c4f8ee	0x22c177a5	0xb3b3b38c
+	0x3b96b026	0x75e82ee9	0x6c25591e	0x79cb8247
+	0xb81a26a3	0xe9242a92	0x8427b5f9	0x0893338f
+	0x0d6869c3	0xec22cd57	0x5d7d4621	0x95cdac7b
+	0x8408d975	0x11d40c4e	0xf38fe7a1	0x088dbf91
+	0xa603a268	0xd9098a09	0xf8687105	0xba9e11eb
+	0x197b4e7e	0x4308d671	0x50b99383	0xc29a07bf
+	0xe1076808	0x22d410a6	0xcfdf5b6c	0x798c63b2
+	0xf8928203	0x59341208	0x9da6636c	0x7ea8b574
+	0x9c56d366	0x9ee85f63	0x27901787	0xf7fa83b6
+	0x11ec3148	0xc5866a56	0x1ac9faf8	0xc8600dcb
+	0xb4cbf815	0x6553c20e	0x408db234	0x30452ecd
+	0xa50638c3	0xac82df8c	0xc12e0fe6	0x281e6189
+	0x7f4d9cc0	0x5c12a79e	0x8da23fb4	0x8e495e59
+	0xbe52507d	0xc75d5612	0x7ca07018	0xffe33c48
+	0xe8a9c75a	0x30a3d329	0x8fda15ba	0xd7c53ea3
+	0xdd07d298	0x968dd723	0x594af13d	0x05593aa4
+	0x2fab8d67	0x3ea4294e	0x60c3d12c	0x1b2a165b
+	0xe3b5d840	0xe8f078ad	0x0bcf0df1	0x56a08b20
+	0xb99e6aa0	0xf119a946	0x1b3b1613	0x0691eae0
+	0x20a8c753	0xb864bd3c	0xeec8d111	0xfc809ccb
+	0x5230e148	0x968a3f36	0xbedb39ee	0x96ef8cec
+	0xd137d35b	0x4b336a7c	0x8fcf008a	0x65a4a722
+	0x7688912a	0x95b30531	0x8bd2df5f	0xa21f1deb
+	0x7c8288c3	0x11cb48ba	0x3604f444	0x56af95f2
+	0xe16135cf	0xa7b34be6	0x104db16e	0xcb94acf9
+	0x5e9be620	0xfbdf8d99	0x61a16de2	0xf1739a2b
+	0x177e6ccd	0x2d473093	0xf8b85187	0x10c7bdad
+	0xcd44645f	0x6a7a371d	0xe860523c	0xf631119d
+	0xaaa070d6	0x79668637	0xe9117794	0x42c496d0
+	0x9d294481	0xa640ccba	0xc1201582	0x5d86a701
+	0x1c935a06	0x10719c63	0x53889b4f	0xf0e56447
+	0xc54e8d83	0x95968c38	0xade37a4c	0x2fd5461f
+	0xb2e4cc0d	0x316c6c57	0x379cd5da	0xdb4510f0
+	0x5d71f2b6	0x10786416	0x6fcad2da	0x65f1908c
+	0x64aad9b9	0x08cc03c6	0x57ffa0f9	0xb12d0384
+	0xe12be67a	0x3dc91a85	0xd88ca183	0xb3b3512c
+	0x5b0d71c3	0x1389ed0f	0x99b6823c	0xc263b6d8
+	0x7e6a18ed	0xc74c9223	0x03e92612	0xc3b16895
+	0xebda3f4b	0x76d79b51	0x6b41a791	0xe838eb87
+	0xf80aa3dd	0x49dc8f9c	0xad7dc06f	0x0c0e6e03
+	0x9a533db8	0x51d66b1e	0x5415c797	0x9645217f
+	0x34b8dd97	0xc100b64a	0x6d2de029	0x4f7e89fe
+	0x8292bd52	0xa4309ad5	0x4a6651a4	0x4e67eaa8
+	0x97e27f87	0xd24fdbbe	0x367ec769	0x5704cfcf
+	0xc48e8c08	0x56fe9fe2	0xfb85f4ed	0xb0c68432
+	0x226d73e7	0xa1ce4c14	0xa50f188a	0x33f003bf
+	0x273e59ea	0xee1a3901	0xcf20c176	0xef66122e
+	0x197b9e36	0x4d866dc5	0x9cf4b530	0xd56ac309
+	0xf91f0f44	0x3143dae4	0x61ba2ac6	0xab3e3241
+	0xb070fe2d	0x8c7ed48d	0x9cdd506b	0xd052fe76
+	0x171287b1	0xed3fbd70	0x98f23794	0xe881dc63
+	0x916d5bcc	0x5a5d405a	0xf450ef75	0xc99b0ee3
+	0xfc1f0b8a	0xe05e94d6	0x1f0da54a	0xafc412bc
+	0x838546f2	0x7913cd41	0x029b6992	0x00bc4c0f
+	0x872c237f	0xda6114b3	0xc18ab867	0x437cfde0
+	0x33aba1cc	0xf87d202f	0x571b233c	0xd2ebc904
+	0x5efca706	0xa7d9aaa6	0xdc03ca11	0x1b5a00af
+	0xf85427bd	0x5329e108	0xae95f78d	0xf38e0d3c
+	0x8f976d3e	0x36474f32	0x8b96a672	0x2f5fb1bc
+	0x2c12ee75	0x348265d9	0x69ccbab1	0x852631d1
+	0x71a08001	0xc6e3ed3f	0xfa9a584f	0xa3e98596
+	0xd6730da6	0x41300caf	0x7b5fd490	0xc9158337
+	0xe02ed753	0x605b5f9a	0x684b6cfa	0xd8186840
+	0x1026e9c3	0xd8550587	0x37d7fcda	0x140021ca
+	0x13effe78	0x6f3184ca	0xa8f8ba37	0xf56a5c29
+	0x502f4ba0	0x36901ba0	0xdf60a738	0x6afeccf9
+	0x206e4e7d	0xe763e575	0x9e3dd2e8	0x574c3bd9
+	0x2b9050d5	0x36b1833e	0x018a432a	0xa544ffcd
+	0x94d11277	0x350c57f4	0xbde9ee5f	0xf2c634ee
+	0x826933e0	0xd807dd5a	0xe9ce6b4e	0x380419d4
+	0xc48514fa	0x9fec960b	0x612b53bd	0x3bd0f68f
+	0xa8b9573f	0xee1af1a4	0x5ba43078	0xdc4433e6
+	0x09980221	0x84e2b562	0xd0685c82	0xc821e22a
+	0x2f591314	0x36cd6cf8	0x95a584ee	0x85ac1c0b
+	0x8e1c4d17	0xfdcd3aff	0xf59140ff	0x990cecb2
+	0x5a86b9c4	0x0be7961b	0xd10cf022	0xda4e0039
+	0x0d42ac7d	0x6b6068ed	0x595b338f	0x8e66fbd1
+	0x5d76290e	0x1eb1d30d	0x02681d5e	0x675f48a9
+	0x3620fec9	0xcbeb129d	0x9d0d7d90	0x286b7f46
+	0xc96084b6	0x001d009e	0x5e0d3f04	0xfdc775cb
+	0xfdc6f6aa	0x4f29084d	0xf8fbd3a7	0xf859eb71
+	0xa7e37df0	0x9efe5fef	0x2f611654	0x7061f5ce
+	0x50f95714	0xcca9c4b2	0x72262846	0x376c21bc
+	0x4edad528	0x5d241145	0xf2dc8615	0x9ac9da86
+	0xbc5e3211	0xc6df5283	0x8f1346c8	0x52479029
+	0xa38fd13b	0x7b81167b	0xf7f2eb16	0x09e4675a
+	0xa4cbab39	0x4aaf12e8	0x0d156c19	0xf2ee198f
+	0x857661d4	0xa39f33fb	0x6f500373	0xdcd3aab6
+	0x5e4d97fd	0x8184eb1b	0x1e00850e	0x56037e60
+	0x1f5c2839	0x5fdd3d3f	0xf5462ad5	0x9e96d752
+	0xe1499fe4	0x30571868	0x895af53d	0xd37d411d
+	0x4a1a3461	0x95c4f0b0	0x5ead887c	0xf53803ac
+	0xf3cae670	0x09f151ea	0x102cfa3e	0x5784433d
+	0xcf581826	0x476cfbb9	0xd1489eb6	0x68f4727a
+	0xc4dc85a4	0x9094832a	0x0ff6725f	0x7f1f40a0
+	0xf771d9d9	0x13c2b620	0x75448c8e	0xfec2bfc1
+	0xd707e400	0xabd5b0ff	0x71753ced	0xd4e9fcf6
+	0x2a4ddfd6	0x2719afe8	0xea8dc6a6	0xf75ea39c
+	0x619a0725	0xab1110a0	0xbd63041e	0xd839bb8b
+	0x693bfce2	0x989031f9	0xf621e105	0xedcbd708
+	0x0cb4aa8d	0xf1ccef16	0x06894709	0x0aff3a4f
+	0xdefe2281	0x2ad64edb	0x349b9733	0xe062b7f4
+	0xc8aa62be	0x36a184f1	0xcb918d5b	0x844ea7ef
+	0x78585466	0x80139ac2	0xe45b2b11	0x973f0a62
+	0x5dea255e	0x916925c0	0xc9578efa	0x3ca7eb07
+	0x36c02e4b	0x89cfcaa3	0x641b07ad	0xf9e7197d
+	0xdbda750c	0x447f1191	0x690f7c39	0xd7e9a602
+	0x6edd8896	0x2b03daad	0xbd288f1e	0x7f70057e
+	0xc8567673	0xaf74fac0	0x37e31aea	0xd992d754
+	0xe8211c22	0x3eaed525	0x88fc8ef2	0x2f41b02a
+	0xf3c07f7a	0x3777c91d	0x8c3ed230	0x82c64da4
+	0xdeff0362	0x2768503b	0xcdbaf18e	0x9a45ccca
+	0xe92fd6ad	0x72a71f75	0xc5bd6f66	0xbeb4d59a
+	0xe99415ab	0xf7dd10c5	0x0db15260	0xbbac9f71
+	0xa3e434ba	0x40fdea27	0x50eb8c40	0xba26f675
+	0x2ce865b0	0x748ec966	0x6490f9fe	0x01dbda28
+	0xd4dfed39	0x645fb3b4	0xcdcb9de0	0xccd7fcb1
+	0xd0dabcac	0x60fd0fbd	0x168d9289	0x270ecd39
+	0xe1ca48ec	0xd242edb6	0x95ba25a0	0x34ef7dc9
+	0x39b20624	0x4aab3814	0xf6fffa0c	0xe6f18c9b
+	0xc579ea88	0x3c29d3cc	0x15358dc8	0xe2ca0595
+	0x067a5f59	0x98ac44bc	0xf92ecfdf	0x2a8f2847
+	0xc7098327	0xf770c58d	0x65247164	0x2356f75b
+	0xe38ee36c	0x19bc57bd	0xd1432cf8	0x4c343d9a
+	0x800294b0	0x41906df6	0x211fb5c3	0x13d372ca
+	0x8649cb8c	0x54a6908c	0x12b21839	0x188da49d
+	0xf026020b	0x9dca39f3	0x1b85ad7f	0xe16f849f
+	0xc74d6d14	0x1542b72e	0xe2e21a4f	0x13c01264
+	0x1af57985	0x15d69f66	0xf0475b50	0x791db250
+	0x16c4cd65	0x6aa3172e	0x50627731	0xc050f139
+	0x8690135f	0x6b2d53f5	0xbea8c582	0x770e5dc3
+	0xc6f1e36f	0x532b5b3d	0x5f513746	0x16a84ad7
+	0x1d429215	0x84b0905f	0x98a47e1b	0xc8b47605
+	0xf67fc56b	0x862e5696	0xeaebb6c7	0x2cd4dd80
+	0x7a2345d0	0x89f02a31	0x757d6bfa	0xe1532bd7
+	0x0eaea9e2	0x4a00dea0	0x54414e43	0xf1b723b7
+	0x84b589bb	0x17b823cf	0x885e8430	0xc658beb3
+	0x7251da37	0x9c6c0c94	0xd6237fde	0x7526c254
+	0x7abe9c40	0xc815aa39	0x5c2359f8	0xd2ccb88a
+	0xd72c3593	0xb5bac7f5	0x500d5980	0x63d1e5d6
+	0x43f2fd4b	0xd4e7a58b	0x682c83c0	0x372647da
+	0x897844b5	0xc8f43767	0x52c95bd9	0xb134d1e1
+	0xf4dcf340	0x0418a91f	0xd5f53498	0x8960aa3b
+	0x559e959d	0xc9465034	0x92f87c38	0x030bad59
+	0x535a65f3	0x2a77f8e5	0xdfa3bb3e	0x1cfb0e7b
+	0x745c3e85	0x4adb107f	0xe0ad43e6	0x2d2d7110
+	0x1d2f4281	0x2eba0483	0xf1741ce3	0x872c33d7
+	0xf43039d9	0xfe974a77	0x5bdb65de	0xa9ae81cf
+	0xd950f31d	0x4f9dba1d	0x86c23a69	0x091cf111
+	0xe658a751	0x84a91276	0xcd95d552	0x28e6ca41
+	0x49f25055	0x63d4b350	0x5bcd4eb4	0xca30011f
+	0x80c53e84	0x09bd4736	0xbaab15c7	0x240a5c91
+	0xc78d09a4	0xe65699e7	0xa53f862a	0x4dab9d76
+	0xfa9a9fc3	0x59603e35	0x2ac717ca	0x46b604d5
+	0x6c3f7387	0x8b036d97	0xf2e656e8	0x3134f9fa
+	0x07e4c866	0x5ffe4c6b	0x0b66f7d4	0xf70ec6ae
+	0x70a34f65	0x5b899964	0xfa6d75c8	0x1201342b
+	0x6a97079e	0x265e17b2	0x68c65a50	0xff89ec35
+	0x1dd400fe	0x442463d3	0x28255bc7	0x0b59c045
+	0x3184409c	0x22149a93	0x46c4e731	0x79f055dd
+	0x37f63a7e	0x7e756b2f	0x215965e0	0x50d6830e
+	0xecd76722	0x7ccf6440	0x7f35066a	0x6ae5b23d
+	0xf1b3d97b	0xc10fb8f4	0x1dc8a180	0x560fde50
+	0xc309b2d5	0x67f045a3	0x1c9b5b82	0x5a58d04e
+	0x1605cbe6	0xb39d46e7	0xfc73771c	0xb27cad4e
+	0xb11e103c	0xfcf832c7	0xa445f737	0x63704126
+	0x542bdf70	0x4a134996	0xdfbbb48a	0xd46b0c8a
+	0x658504f0	0xff3a73cf	0xd6a37646	0xc76bd82d
+	0x7f590e8b	0x45168edc	0xbc980f1e	0xb74cbd25
+	0x8ed51cfd	0x42e86550	0x098d3dca	0xa1c667fc
+	0x4a1cf2fe	0x6dac04c6	0x0c06311a	0x56c5ee6b
+	0xae2fef37	0x3077ed34	0xed2b3c58	0x704796bd
+	0x8d4b9dd7	0x58e93741	0x3d954ff6	0xdd2514b7
+	0x4bd6d974	0xd6e0f1c5	0xcd38a25f	0xa5315745
+	0x982505f2	0x16c78771	0xf03bf442	0x8433c49e
+	0x822b13a7	0x5e52a287	0x3e837cc4	0xf5246300
+	0x62235c2a	0x4286917f	0x92694b91	0xc149428b
+	0xcee47250	0x1073ca49	0xadfe26e0	0x39b7b1bf
+	0x0980b264	0x460e0f79	0xb747c221	0xd2280e13
+	0x6ebaae7f	0xbf5e4fe1	0xd83a06ae	0x15607146
+	0x9f80aee5	0x9d3d1ea1	0x3ac75973	0xbce15424
+	0xd3afad28	0x60b00359	0x15b1f6a2	0x860dfc81
+	0x3a3aced8	0x17e60cf4	0x628de10b	0x6226cf18
+	0x94aac94b	0x04e89e23	0xd647af9e	0x34fac1a0
+	0x82107a58	0x5ff06089	0xed899a38	0xa95fc727
+	0xfed5f0e1	0xfe6db6fb	0x495cc0da	0xa36d9c65
+	0x9ae386d3	0x091791a6	0xca9619dd	0xd1b1681b
+	0x283ede9d	0x54684259	0xdc0ab403	0xabf2d823
+	0xf2705407	0x48857264	0x5a49666d	0x8d73c4cc
+	0xc6d6c23b	0x924b2fc1	0xbde8db0e	0x6be302a5
+	0x13d38cee	0xab9c5a5b	0x6e3f151d	0xc68ebac7
+	0xcab34c09	0xdd0b5340	0xd7599b20	0x5c05e5fd
+	0x58975ebd	0x253b9809	0x90044065	0xa34a0b9a
+	0x7b98fa31	0xba00d0ca	0xbda6fa17	0x97937eb1
+	0x43ab04a0	0xa85e1fa3	0xe732c720	0x43113659
+	0x80e21c8c	0xc1593d8c	0x5304dbb0	0xcdb37507
+	0x99895f48	0xc1018047	0xeaab54ed	0xd5326d76
+	0xc1371a9c	0xcfd263bb	0xf9ecddc0	0x2381b427
+	0xac78b897	0x46bd1bc4	0x0b7f5dfa	0xe55ac354
+	0xd98b29e1	0x7fb53225	0xadf7fd1d	0xe7f42f6c
+	0xe42b58fa	0x31ba8f85	0xea3d049e	0xacfac52b
+	0xa50181c1	0xae6a0de6	0x16cf1122	0xa5aff99f
+	0x9d1102c1	0x10f11ca3	0xabfb8005	0x9911353f
+	0xbb430261	0x81c1400d	0xe01c0343	0x038b2e46
+	0x3f919f9d	0xc0e1c884	0xde6272fa	0xc25d6ea2
+	0x72e18fb7	0x88b8b150	0x8e85cd62	0xf0e1d37a
+	0x96ef1ce2	0xe32c8193	0x1001ff2d	0x9964ec56
+	0xbe8aaf70	0x1a416fea	0x1eb92b2a	0xa3578712
+	0x9504cab3	0x77e975ba	0xc491748c	0x3080c466
+	0xc8418a02	0xf44d7998	0x77051bcc	0xff646682
+	0x6082eb7f	0x2886a8f3	0x88315209	0xa7b9fab0
+	0x6f6c2b63	0x2aeb4634	0x809011a2	0x2df48429
+	0xcb39f8a6	0x6b879cb1	0xa7b47618	0x09b8666d
+	0x706ab210	0x0864689c	0xd1ca3fd0	0x69c1e584
+	0x5212526e	0xe1a9c5ef	0x5685d88b	0x5382bdbc
+	0xf8d5bc5b	0x8e8ded9d	0xc8cc93c5	0xe1e226f0
+	0xd2c17da9	0x23cd104c	0x4362ff2e	0x88a7a9c5
+	0x8a2e8873	0xd0581d74	0xfa1d8084	0xa9829395
+	0x31a382e8	0xf423acba	0xbd436f3e	0x00ed9514
+	0x964d6ea8	0x45e530cd	0x7b067f2d	0xe758fa63
+	0x82767a73	0xa5e5d959	0x83adda38	0xca815b70
+	0xca2eb490	0x879da759	0x3af36316	0x1c398e43
+	0xb7033303	0xde77c60d	0xa0e83068	0xa072c077
+	0xd038adcc	0x979aa6f3	0x4ff53908	0x1fcdb043
+	0x83ccc713	0x38bb8a83	0x185cb8be	0x32594da1
+	0xb5771673	0x9b371c9b	0x71554d0c	0x353452e0
+	0xeb17922f	0x86f610e5	0x219706c5	0xc2516c79
+	0xd9f1e5a5	0x4e71dd96	0x19acd081	0xcc9e8fb7
+	0x3cdca52d	0xa8eaf0b7	0x677a8883	0x29afcfeb
+	0xbe65bf18	0x578d900e	0xce1f20b0	0xc0464b95
+	0xd8a7b365	0x153ca5f8	0x338f4440	0x725fb123
+	0x0266fe31	0x20afb681	0x6ad3e79a	0x4b0fde5a
+	0xd482ceef	0xfbebb20d	0x9ba0e25f	0xad5e0225
+	0xb8a55ac3	0xa1823693	0x1ec05e62	0x5f0bc17f
+	0xd45315c1	0x581d4f7c	0x71d0fc2e	0x7ab28236
+	0x2058473c	0x59778cad	0xa31250c4	0xf5ee4b70
+	0x0182f25e	0x093d224c	0xc0e2a624	0xdef1a681
+	0xc3ac2477	0x684485dc	0x248b6733	0x2154c4d0
+	0x48125445	0xdfcc6d53	0x98648e66	0xad47ff70
+	0x98de0ea0	0x705b6663	0x585c82f5	0x41fc7750
+	0x0f9302ac	0xd84db157	0x5473b3af	0x47fc75e1
+	0xfd70ad9f	0xf8ac1ad3	0x2d44d472	0xd2efebac
+	0xc012bb8c	0xaca62095	0xb2909db6	0x71f0cd19
+	0x10f22608	0x7d2bc553	0x6a422ca4	0x5d8ca05e
+	0xbe2c2447	0xc6c7e0bf	0xa497d984	0xc647d81a
+	0xcbedee3d	0xf32ffe2c	0x6162e640	0x41f69600
+	0x91244338	0x95609997	0x8d238396	0x66e7a884
+	0xb12cdbc7	0x47161675	0x51ecf757	0x3c82038d
+	0x031421db	0xe2ef93ea	0xa68873df	0x039e0c25
+	0x5572321c	0x9df1728d	0xe6ed57c0	0x57a039f2
+	0xe31b3be2	0x55715ed2	0x59d600a5	0x3ba7f734
+	0xa429f7da	0xff7ddad3	0x1ce287d9	0xbd308541
+	0xa6b20324	0x1fd4c741	0x9244413b	0xd914325e
+	0x486a10c3	0xaba191f0	0x09cd2579	0x6fbd86d3
+	0xf9eaabea	0xcbc6a11f	0xc97eff2e	0x604949d5
+	0x73208a00	0xc5640d64	0x75fd1830	0xea2841b2
+	0x3efcac7d	0x3f2be687	0x9737b5a5	0x7846b723
+	0xfeb5d90f	0xbf9b347e	0x94629b88	0x0e0bd993
+	0xeaa3a0e6	0x92758d2f	0x06b4a92c	0xee31d291
+	0xcf91699e	0x39b5a732	0xb63b660a	0xc5ffeaa1
+	0x90833668	0xd1995d7a	0x84030c26	0x62b1ca49
+	0x7efa5144	0xe7288b77	0x6230a776	0x1be6a7db
+	0xd2a0bc0e	0xfb36d845	0x261fb4eb	0x8f8fc434
+	0xfb833fb4	0xc7474543	0xda6c6a88	0x1659bb4c
+	0x9194a11d	0x071154f5	0x82d51f58	0x63a2f751
+	0x46f7a823	0x04974444	0x360cdcdc	0x7452e132
+	0xc9a98443	0xd03ad3ab	0x30dc5c84	0xd3928173
+	0x38b6e6e1	0x0cda2c1e	0x4cd9d2bd	0x59cfadb4
+	0xbf73f35e	0xfed1a2e3	0x7c7f7fbd	0x9b5129a3
+	0x780f877b	0x2104f056	0x90bdc3a4	0x9ee71bf4
+	0xd28d3305	0xad550ee2	0x3c8f4067	0xfa0dd7e5
+	0xd625f145	0x3b5cd69e	0x645db568	0x5e56c683
+	0xfb1f1f24	0x2bfe72c3	0x0cdb2809	0x9404915b
+	0x120d6624	0xcfe55309	0x0b978365	0xb4a25446
+	0xb26e8767	0x83c6e6a8	0xaebacb46	0xd79ed05f
+	0xd4d07268	0x1bb3faf1	0xde8dbf0f	0x2e7ba152
+	0xabc0ff05	0x6ca54fc8	0x51acd5dc	0x65a18671
+	0xa619f93a	0xa84535c1	0xa0ede59b	0x6bd55a4e
+	0x5aba8fb8	0x01cc90e7	0xc3eea3cd	0x0f503e9b
+	0xad697d5d	0x6021cacf	0x70dd0dec	0x11d7617f
+	0x19e6864a	0x6b252ab4	0x6820dba3	0x9db53d55
+	0x1108f4b2	0x71aeae7e	0xdff9a4fa	0xa724e0b9
+	0xefe50832	0x91ea4d28	0x4f02d339	0x15e0212b
+	0x2c725507	0x3de817ac	0x4fcbd836	0xf9484b90
+	0xeb9ebf31	0xcfd90e4d	0xd3d6a071	0x3dff27c3
+	0xb891858e	0x99daaeeb	0x3dc5528e	0xb2fea196
+	0x2724ae08	0x6c5845a7	0x184faafc	0x44446f10
+	0xe9d1537d	0xb0933101	0x9229e352	0x4f426c82
+	0x98147850	0xca22c0fb	0x4d414090	0x981ac8f9
+	0xb8d034af	0x6b8aa278	0x6508c7b7	0x6293fe73
+	0x66f15617	0x0679cf83	0x6a58257d	0x4deae251
+	0x6e19dc6e	0x899db947	0xcb261cce	0x9c8d3929
+	0x64a097e4	0x38acf6ab	0x07beeeb0	0x9ba17f04
+	0x6897fa21	0x1445cb4d	0x6d79f51a	0x83661214
+	0x812f8cb4	0x73a15a75	0x5d9edf24	0x490b66b2
+	0xf503c382	0x9a7b92bc	0x8367b4d9	0x8df42ea5
+	0x790dc812	0xe8a51197	0x1f9ec3e8	0x0fe9d551
+	0x29facbeb	0xaaa131a7	0xc0ce9784	0x3f0b2412
+	0x63d56d18	0xe2ca7aef	0x35f66550	0xe49095c1
+	0x8d8531f1	0x815ca696	0x18f31b28	0x39a102bf
+	0x96bd3241	0x1b79f65f	0xb5750fc0	0x7e41b1aa
+	0xe7c7e0f6	0x294a848b	0x0d90877b	0x87c42915
+	0xd5839e6e	0x00635ed9	0xc51b8d91	0x34e60826
+	0x08082536	0x3550eed6	0xc78b127e	0x2f428ec3
+	0xaf95830e	0xb0c8fb6c	0xc0b5e989	0xb45d0020
+	0xce6466e0	0x8e244ba2	0x17ef4563	0x2c74b037
+	0x8d15449e	0xa96ad89d	0x0672ebbc	0xf5a037f4
+	0x633b2cd2	0x82d1cb6a	0xeae7ab21	0xfe156394
+	0xb223326d	0x6bf37192	0x349934ac	0x747e4995
+	0xfff3f992	0xe916d599	0x95917b72	0xd3e810ad
+	0x704231a5	0x041ed2f0	0x32cca85f	0x2ceb1663
+	0x80d3e7c7	0x901d33a6	0x18a99b15	0x21b50c44
+	0x295e5a16	0xceab5147	0x503b6e34	0x732a4fdf
+	0xb6b38684	0xa1317fff	0xb76492ef	0x88e7eda4
+	0x5ccde55d	0x7448f240	0x12d3436b	0x6a152377
+	0xff0b0448	0x8b124b95	0x55321a93	0xed4229ef
+	0x7ea05a46	0x992eb553	0x5f2d7278	0x90dd258f
+	0x6ecd1946	0xab971c70	0x3d341faf	0x49855465
+	0x1973c8cf	0xb5976088	0x6640e00e	0x155dd9f3
+	0x674285a8	0x720515e1	0x5fdffc94	0x0d3a3347
+	0x1dbfe5ff	0x7079f37e	0x8c470652	0x46d6c1e3
+	0x1402e1b4	0x05217695	0x67e45039	0x683ba960
+	0x97cadd4e	0x59664501	0x4726c2a6	0x7601358b
+	0xec77b4b9	0x66a912a0	0x8f157d86	0xa0e221ba
+	0x3aa4bd23	0x547e9323	0xaa94772a	0x1ba6ac0c
+	0xbed2aa6f	0x8a945e94	0xeea5c775	0xf2c66a89
+	0x89ebde2f	0xd7b4e71c	0x6a1c8bb3	0xb9392201
+	0xc7a2191f	0xf180c19a	0xc3446d78	0x7f5f61c8
+	0xc6a251da	0xa27c507f	0x329133a1	0x0c951593
+	0x344ca56a	0x329dea98	0x73112997	0x32bc47a4
+	0xbeb18227	0xd3347aaf	0x1c481ab4	0x62606e69
+	0xe18da26b	0x8243c025	0xfe05b066	0xc1b0c590
+	0xd8c107ba	0x235b8c6a	0xac4fe894	0xa012810b
+	0x5470e6de	0x6f1217ae	0xcb099ad1	0x2b03655e
+	0x91f0b417	0xc21a1af4	0xb4a8c50e	0xa5988ed2
+	0x7f03fa1e	0xa0658a65	0x5532c4b3	0x1fdcfcec
+	0x17f41c26	0xd6b29efb	0x3411f331	0x1b774029
+	0x2ee2d094	0x9f5edaab	0xc644a9f3	0xdc4cf7b1
+	0xb6304748	0xb064cfca	0x89e4dbee	0xb1563a5e
+	0xd370bca8	0xe6cb17d8	0xbfcacc87	0x76940250
+	0xf2456a18	0x3c1873e4	0x0a3d7d0e	0xeb145eb9
+	0xe88a48fb	0x9413f290	0x626e4e00	0xb234a13b
+	0xcbf49379	0xcf600cee	0xc78891b8	0x799f8e80
+	0xdbf4e604	0x89860862	0x04fb77db	0x0fb1bf13
+	0x3b1aa906	0xadaf9a45	0x48526bf7	0x09d8ffb3
+	0xce751581	0x00e35b8d	0x0549e629	0x6d3cc316
+	0x3d8f300a	0xdcd790b5	0xde1ca316	0x737d5f31
+	0x171b2646	0x4798a85d	0xea36f650	0xcf889098
+	0xe4ec65b8	0x944637d3	0x019c8103	0x5fbdc21c
+	0xa61ebe77	0x74ea95a5	0x258eb8d1	0xf8c8c4d6
+	0x9a1edc66	0x9118b309	0x639ae9b5	0xd0c40735
+	0xc6ddec32	0x36d26a75	0x86018c99	0xe8bf66df
+	0xf345dba0	0x780670a3	0xe34e60fd	0x733ad4ba
+	0x2ef04d54	0xb1b9c41f	0x84cca1c2	0xaa09279b
+	0x34797d41	0xb93d4c70	0x919ce970	0xd0d6ec5e
+	0xdc70cc95	0xd89f4680	0x458cfd33	0xc257784b
+	0x29ec9364	0x8e717417	0x6d9732df	0xa3658440
+	0x8574b5c6	0xa58ebb8c	0x81bc4dea	0x1f396663
+	0x361dfd98	0x20b35a46	0x886a7e4c	0x69f0a1c5
+	0xd0b7de5f	0xbbc08761	0xa1cef991	0x084a8ea2
+	0x4df68c5b	0xb84b4b2e	0xd4bf1770	0x94b4f7c7
+	0x9906a752	0x878c7f1f	0x385b5a5e	0x99147c87
+	0x97c54a35	0xbacb57d4	0xf85f9733	0xb5d2c83f
+	0x4405f9f5	0x020260b5	0x5c0a8556	0xb623ad79
+	0x8d42a6a3	0x35ae5806	0x2c28a60d	0xa0200ee8
+	0xed9e0ece	0xb7e0442a	0x1ddf0e2b	0x26ceec5d
+	0xda397b2c	0xb073d9a2	0x9d856bbd	0x06e35ca8
+	0x6296193e	0x292dee18	0xf5a9bd7a	0xb62fe73f
+	0x95a8775f	0x1efc0fd0	0xf3338af4	0x06ccbe78
+	0xafb3f669	0xd9f7fe16	0x09beed63	0xa2f0bb3e
+	0x02f5c52f	0x24aee650	0xf715039b	0x3f566d89
+	0xd575429b	0x9d40207d	0xa89c7de9	0xde5157f0
+	0xd79025ae	0x4259c4b6	0x61e86217	0x6d2e3273
+	0x57b5c99d	0xa18edb02	0xf5f314be	0xfa58bf5f
+	0x581e95bb	0x04967c03	0x9187d903	0xdaf34bc3
+	0xa18e49f0	0xb7973963	0x2984967f	0x7332f94f
+	0x57e5a8b5	0xe6e0a6f8	0xbc08c39f	0xc9e73ad8
+	0x0ea113d8	0xa9cfdb06	0xfda1ebbb	0x1a30e9f9
+	0x69a9029a	0x44b43320	0x04182d93	0x00220972
+	0xa7f984c5	0xb4eeae8a	0x11718517	0x06e70840
+	0xb3091fe5	0x099ccb1a	0xac3df88c	0xa8bd0ca3
+	0xa202bbc0	0x19979cf1	0x8656c385	0x139abf7b
+	0xae298ea4	0xab9481ae	0xe08e2c38	0x27967dab
+	0x1108054c	0x1ba0d3c5	0x8a0fb923	0x9c54f682
+	0x5f363a46	0xec564b34	0x8d53c918	0x47f39642
+	0x3fd68743	0x197f16cc	0x2b03d11c	0xcc574d53
+	0x8b2d1aa3	0xd403c5b0	0xce21d3a6	0x57c88abe
+	0x56d6b12b	0x204f9ac8	0xfd44c338	0x18417de6
+	0x5582f0bf	0x7ea9d04f	0x7bdee65d	0x9fe3f5b5
+	0xa14edd82	0x8301f6ba	0x24bc737a	0x5c6e71a8
+	0xdb0d7fc2	0x243b6e99	0x3941f113	0xcaaa3674
+	0x1b25b686	0xfb219a33	0x1b122757	0x27298223
+	0x44cbb8ad	0xed4e6ef9	0xae338c2d	0xa8d231ee
+	0x9bc2d8f3	0xcecd4d27	0xe8ba9908	0x9a106344
+	0xbdf27147	0x0c547009	0x46b16833	0xd89b0690
+	0x4b742f40	0x733d4cd5	0x1abb6f77	0x803f40df
+	0xf8d909bb	0x8fa6a921	0x08966531	0xdf093174
+	0xc7ee92c8	0x4272612d	0x149f8242	0xf8c07ec3
+	0x99259781	0x8bf3f9c0	0x09d6b679	0x19a1968f
+	0x735b197e	0xa98c913f	0x3e208a56	0x59b2b40b
+	0x0ed212ed	0xfc92d02a	0xe9b1b441	0x1429fc3c
+	0x8a6fb38c	0x6235d73e	0x82f5aca8	0x9ebb490a
+	0x718fed05	0xee355cdc	0xf34bbc8e	0xcfde74ac
+	0x5c267a70	0x30b66c7f	0x9a655781	0x1d354268
+	0xd0debf01	0x71798948	0x4542b707	0x66c02ecf
+	0x49763e11	0xa02f170b	0xbcf30ee9	0xba9bbfec
+	0x6d915d18	0xcadd484f	0x8eadbd10	0x91463818
+	0xe8add34f	0x55620c30	0x14d47fa5	0x63c2a25f
+	0x7213f2f4	0x6d96a516	0xf10f4ed1	0x9825aeac
+	0xe9ca9b8a	0x4bb0e2aa	0x957f8851	0x1a41de29
+	0xa0039e6c	0x3ec63393	0x66b6ac8a	0x2992d983
+	0x2d73caa4	0xb0ae06c2	0xa4008915	0x2ba7050d
+	0x6d9e01e6	0x908f316f	0x3f17dabb	0x8c86b0e3
+	0x89fcebf8	0xbada4307	0x0f6e9f6f	0x07f36992
+	0x1a82520e	0x728f11a9	0x418aa9b7	0xc57f51d7
+	0xcffa1cd0	0xf9f6d902	0xdf22329a	0x4ac48293
+	0x37326e23	0xbb39c187	0xc9086dfe	0x1347e4f8
+	0x7ae88ecb	0xc280a07f	0x7f0a6b0a	0x57cff37d
+	0x2dfd629d	0x5a8a444d	0x934bcafb	0x593b6a3a
+	0x9c62c1ca	0x0ecdb2dc	0xb4c2fd82	0x2c19c0ab
+	0x26acf079	0x71aa1041	0x8aeb2595	0xed90f704
+	0x7d68f5c5	0x624429d5	0xefd0d147	0xc8682f79
+	0xfe7e9cc0	0xaee6c970	0x33e9231e	0x4720df4d
+	0x6a3f6428	0x463b676f	0x71960ee6	0xc684d974
+	0x9f01a6d2	0x728cbec7	0x2e20d715	0x172a4a11
+	0x4153ad1e	0xb1f36e53	0xc277f818	0x94ac6d39
+	0x502f91d8	0x3028b1ee	0x48390347	0x45a8b5af
+	0x2cb8095f	0x063cbe4a	0x07a53b3b	0xcfd08c80
+	0x81679803	0x9fa4726a	0xa682f4c8	0x4d90e8bf
+	>;
diff --git a/arch/x86/dts/minnowmax.dts b/arch/x86/dts/minnowmax.dts
index 60bd05a..936455b 100644
--- a/arch/x86/dts/minnowmax.dts
+++ b/arch/x86/dts/minnowmax.dts
@@ -117,6 +117,7 @@
 				compatible = "intel,irq-router";
 				intel,pirq-config = "ibase";
 				intel,ibase-offset = <0x50>;
+				intel,actl-addr = <0>;
 				intel,pirq-link = <8 8>;
 				intel,pirq-mask = <0xdee0>;
 				intel,pirq-routing = <
@@ -297,10 +298,10 @@
 
 	microcode {
 		update@0 {
-#include "microcode/m0130673322.dtsi"
+#include "microcode/m0130673325.dtsi"
 		};
 		update@1 {
-#include "microcode/m0130679901.dtsi"
+#include "microcode/m0130679907.dtsi"
 		};
 	};
 
diff --git a/arch/x86/dts/qemu-x86_q35.dts b/arch/x86/dts/qemu-x86_q35.dts
index 5d601b3..0d462a9 100644
--- a/arch/x86/dts/qemu-x86_q35.dts
+++ b/arch/x86/dts/qemu-x86_q35.dts
@@ -69,6 +69,8 @@
 			irq-router {
 				compatible = "intel,irq-router";
 				intel,pirq-config = "pci";
+				intel,actl-8bit;
+				intel,actl-addr = <0x44>;
 				intel,pirq-link = <0x60 8>;
 				intel,pirq-mask = <0x0e40>;
 				intel,pirq-routing = <
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h
deleted file mode 100644
index 4872b92..0000000
--- a/arch/x86/include/asm/acpi.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * From coreboot
- *
- * Copyright (C) 2004 SUSE LINUX AG
- * Copyright (C) 2004 Nick Barker
- * Copyright (C) 2008-2009 coresystems GmbH
- * (Written by Stefan Reinauer <stepan@coresystems.de>)
- *
- * SPDX-License-Identifier:	GPL-2.0
- */
-
-#ifndef __ASM_ACPI_H
-#define __ASM_ACPI_H
-
-#define RSDP_SIG		"RSD PTR "  /* RSDT pointer signature */
-#define ACPI_TABLE_CREATOR	"U-BootAC"  /* Must be exactly 8 bytes long! */
-#define OEM_ID			"U-Boot"    /* Must be exactly 6 bytes long! */
-#define ASLC			"U-Bo"      /* Must be exactly 4 bytes long! */
-
-/* 0 = S0, 1 = S1 ...*/
-int acpi_get_slp_type(void);
-void apci_set_slp_type(int type);
-
-#endif
diff --git a/arch/x86/include/asm/acpi/debug.asl b/arch/x86/include/asm/acpi/debug.asl
new file mode 100644
index 0000000..8e7b603
--- /dev/null
+++ b/arch/x86/include/asm/acpi/debug.asl
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/arch/x86/acpi/debug.asl
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/* POST register region */
+OperationRegion(X80, SystemIO, 0x80, 1)
+Field(X80, ByteAcc, NoLock, Preserve)
+{
+	P80, 8
+}
+
+/* Legacy serial port register region */
+OperationRegion(CREG, SystemIO, 0x3F8, 8)
+Field(CREG, ByteAcc, NoLock, Preserve)
+{
+	CDAT, 8,
+	CDLM, 8,
+	    , 8,
+	CLCR, 8,
+	CMCR, 8,
+	CLSR, 8
+}
+
+/* DINI - Initialize the serial port to 115200 8-N-1 */
+Method(DINI)
+{
+	Store(0x83, CLCR)
+	Store(0x01, CDAT)	/* 115200 baud (low) */
+	Store(0x00, CDLM)	/* 115200 baud (high) */
+	Store(0x03, CLCR)	/* word=8 stop=1 parity=none */
+	Store(0x03, CMCR)	/* DTR=1 RTS=1 out1/2=Off loop=Off */
+	Store(0x00, CDLM)	/* turn off interrupts */
+}
+
+/* THRE - Wait for serial port transmitter holding register to go empty */
+Method(THRE)
+{
+	And(CLSR, 0x20, Local0)
+	While (LEqual(Local0, Zero)) {
+		And(CLSR, 0x20, Local0)
+	}
+}
+
+/* OUTX - Send a single raw character */
+Method(OUTX, 1)
+{
+	THRE()
+	Store(Arg0, CDAT)
+}
+
+/* OUTC - Send a single character, expanding LF into CR/LF */
+Method(OUTC, 1)
+{
+	If (LEqual(Arg0, 0x0a)) {
+		OUTX(0x0d)
+	}
+	OUTX(Arg0)
+}
+
+/* DBGN - Send a single hex nibble */
+Method(DBGN, 1)
+{
+	And(Arg0, 0x0f, Local0)
+	If (LLess(Local0, 10)) {
+		Add(Local0, 0x30, Local0)
+	} Else {
+		Add(Local0, 0x37, Local0)
+	}
+	OUTC(Local0)
+}
+
+/* DBGB - Send a hex byte */
+Method(DBGB, 1)
+{
+	ShiftRight(Arg0, 4, Local0)
+	DBGN(Local0)
+	DBGN(Arg0)
+}
+
+/* DBGW - Send a hex word */
+Method(DBGW, 1)
+{
+	ShiftRight(Arg0, 8, Local0)
+	DBGB(Local0)
+	DBGB(Arg0)
+}
+
+/* DBGD - Send a hex dword */
+Method(DBGD, 1)
+{
+	ShiftRight(Arg0, 16, Local0)
+	DBGW(Local0)
+	DBGW(Arg0)
+}
+
+/* Get a char from a string */
+Method(GETC, 2)
+{
+	CreateByteField(Arg0, Arg1, DBGC)
+	Return (DBGC)
+}
+
+/* DBGO - Send either a string or an integer */
+Method(DBGO, 1, Serialized)
+{
+	If (LEqual(ObjectType(Arg0), 1)) {
+		If (LGreater(Arg0, 0xffff)) {
+			DBGD(Arg0)
+		} Else {
+			If (LGreater(Arg0, 0xff)) {
+				DBGW(Arg0)
+			} Else {
+				DBGB(Arg0)
+			}
+		}
+	} Else {
+		Name(BDBG, Buffer(80) {})
+		Store(Arg0, BDBG)
+		Store(0, Local1)
+		While (One) {
+			Store(GETC(BDBG, Local1), Local0)
+			If (LEqual(Local0, 0)) {
+				Return (Zero)
+			}
+			OUTC(Local0)
+			Increment(Local1)
+		}
+	}
+
+	Return (Zero)
+}
diff --git a/arch/x86/include/asm/acpi/globutil.asl b/arch/x86/include/asm/acpi/globutil.asl
new file mode 100644
index 0000000..46381b6
--- /dev/null
+++ b/arch/x86/include/asm/acpi/globutil.asl
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/arch/x86/acpi/globutil.asl
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+Method(MIN, 2)
+{
+	If (LLess(Arg0, Arg1)) {
+		Return (Arg0)
+	} Else {
+		Return (Arg1)
+	}
+}
+
+Method(SLEN, 1)
+{
+	Store(Arg0, Local0)
+	Return (Sizeof(Local0))
+}
+
+Method(S2BF, 1, Serialized)
+{
+	Add(SLEN(Arg0), One, Local0)
+	Name(BUFF, Buffer(Local0) {})
+	Store(Arg0, BUFF)
+	Return (BUFF)
+}
+
+/*
+ * SCMP - Strong string compare
+ *
+ * Checks both length and content
+ */
+Method(SCMP, 2)
+{
+	Store(S2BF(Arg0), Local0)
+	Store(S2BF(Arg1), Local1)
+	Store(Zero, Local4)
+	Store(SLEN(Arg0), Local5)
+	Store(SLEN(Arg1), Local6)
+	Store(MIN(Local5, Local6), Local7)
+
+	While (LLess(Local4, Local7)) {
+		Store(Derefof(Index(Local0, Local4)), Local2)
+		Store(Derefof(Index(Local1, Local4)), Local3)
+		If (LGreater(Local2, Local3)) {
+			Return (One)
+		} Else {
+			If (LLess(Local2, Local3)) {
+				Return (Ones)
+			}
+		}
+		Increment(Local4)
+	}
+
+	If (LLess(Local4, Local5)) {
+		Return (One)
+	} Else {
+		If (LLess(Local4, Local6)) {
+			Return (Ones)
+		} Else {
+			Return (Zero)
+		}
+	}
+}
+
+/*
+ * WCMP - Weak string compare
+ *
+ * Checks to find Arg1 at beginning of Arg0.
+ * Fails if length(Arg0) < length(Arg1).
+ * Returns 0 on fail, 1 on pass.
+ */
+Method(WCMP, 2)
+{
+	Store(S2BF(Arg0), Local0)
+	Store(S2BF(Arg1), Local1)
+	If (LLess(SLEN(Arg0), SLEN(Arg1))) {
+		Return (Zero)
+	}
+	Store(Zero, Local2)
+	Store(SLEN(Arg1), Local3)
+
+	While (LLess(Local2, Local3)) {
+		If (LNotEqual(Derefof(Index(Local0, Local2)),
+			Derefof(Index(Local1, Local2)))) {
+			Return (Zero)
+		}
+		Increment(Local2)
+	}
+
+	Return (One)
+}
+
+/*
+ * I2BM - Returns Bit Map
+ *
+ * Arg0 = IRQ Number (0-15)
+ */
+Method(I2BM, 1)
+{
+	Store(0, Local0)
+	If (LNotEqual(Arg0, 0)) {
+		Store(1, Local1)
+		ShiftLeft(Local1, Arg0, Local0)
+	}
+
+	Return (Local0)
+}
diff --git a/arch/x86/include/asm/acpi/statdef.asl b/arch/x86/include/asm/acpi/statdef.asl
new file mode 100644
index 0000000..e8cff10
--- /dev/null
+++ b/arch/x86/include/asm/acpi/statdef.asl
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/arch/x86/acpi/statdef.asl
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/* Status and notification definitions */
+
+#define STA_MISSING		0x00
+#define STA_PRESENT		0x01
+#define STA_ENABLED		0x03
+#define STA_DISABLED		0x09
+#define STA_INVISIBLE		0x0b
+#define STA_UNAVAILABLE		0x0d
+#define STA_VISIBLE		0x0f
+
+/* SMBus status codes */
+#define SMB_OK			0x00
+#define SMB_UNKNOWN_FAIL	0x07
+#define SMB_DEV_ADDR_NAK	0x10
+#define SMB_DEVICE_ERROR	0x11
+#define SMB_DEV_CMD_DENIED	0x12
+#define SMB_UNKNOWN_ERR		0x13
+#define SMB_DEV_ACC_DENIED	0x17
+#define SMB_TIMEOUT		0x18
+#define SMB_HST_UNSUPP_PROTOCOL	0x19
+#define SMB_BUSY		0x1a
+#define SMB_PKT_CHK_ERROR	0x1f
+
+/* Device Object Notification Values */
+#define NOTIFY_BUS_CHECK	0x00
+#define NOTIFY_DEVICE_CHECK	0x01
+#define NOTIFY_DEVICE_WAKE	0x02
+#define NOTIFY_EJECT_REQUEST	0x03
+#define NOTIFY_DEVICE_CHECK_JR	0x04
+#define NOTIFY_FREQUENCY_ERROR	0x05
+#define NOTIFY_BUS_MODE		0x06
+#define NOTIFY_POWER_FAULT	0x07
+#define NOTIFY_CAPABILITIES	0x08
+#define NOTIFY_PLD_CHECK	0x09
+#define NOTIFY_SLIT_UPDATE	0x0b
+#define NOTIFY_SRA_UPDATE	0x0d
+
+/* Battery Device Notification Values */
+#define NOTIFY_BAT_STATUSCHG	0x80
+#define NOTIFY_BAT_INFOCHG	0x81
+#define NOTIFY_BAT_MAINTDATA	0x82
+
+/* Power Source Object Notification Values */
+#define NOTIFY_PWR_STATUSCHG	0x80
+#define NOTIFY_PWR_INFOCHG	0x81
+
+/* Thermal Zone Object Notification Values */
+#define NOTIFY_TZ_STATUSCHG	0x80
+#define NOTIFY_TZ_TRIPPTCHG	0x81
+#define NOTIFY_TZ_DEVLISTCHG	0x82
+#define NOTIFY_TZ_RELTBLCHG	0x83
+
+/* Power Button Notification Values */
+#define NOTIFY_POWER_BUTTON	0x80
+
+/* Sleep Button Notification Values */
+#define NOTIFY_SLEEP_BUTTON	0x80
+
+/* Lid Notification Values */
+#define NOTIFY_LID_STATUSCHG	0x80
+
+/* Processor Device Notification Values */
+#define NOTIFY_CPU_PPCCHG	0x80
+#define NOTIFY_CPU_CSTATECHG	0x81
+#define NOTIFY_CPU_THROTLCHG	0x82
+
+/* User Presence Device Notification Values */
+#define NOTIFY_USR_PRESNCECHG	0x80
+
+/* Ambient Light Sensor Notification Values */
+#define NOTIFY_ALS_ILLUMCHG	0x80
+#define NOTIFY_ALS_COLORTMPCHG	0x81
+#define NOTIFY_ALS_RESPCHG	0x82
diff --git a/arch/x86/include/asm/acpi_table.h b/arch/x86/include/asm/acpi_table.h
index 9856fa6..56aa282 100644
--- a/arch/x86/include/asm/acpi_table.h
+++ b/arch/x86/include/asm/acpi_table.h
@@ -2,83 +2,19 @@
  * Based on acpi.c from coreboot
  *
  * Copyright (C) 2015, Saket Sinha <saket.sinha89@gmail.com>
+ * Copyright (C) 2016, Bin Meng <bmeng.cn@gmail.com>
  *
  * SPDX-License-Identifier: GPL-2.0+
  */
 
-#include <common.h>
-#include <malloc.h>
-#include <asm/post.h>
-#include <linux/string.h>
-
-#define RSDP_SIG		"RSD PTR "	/* RSDT pointer signature */
-#define ACPI_TABLE_CREATOR	"UBOOT   "	/* Must be 8 bytes long! */
-#define OEM_ID			"UBOOT "	/* Must be 6 bytes long! */
-#define ASLC			"INTL"		/* Must be 4 bytes long! */
-
-#define OEM_REVISION	42
-#define ASL_COMPILER_REVISION	42
-
-/* IO ports to generate SMIs */
-#define APM_CNT			0xb2
-#define APM_CNT_CST_CONTROL	0x85
-#define APM_CNT_PST_CONTROL	0x80
-#define APM_CNT_ACPI_DISABLE	0x1e
-#define APM_CNT_ACPI_ENABLE	0xe1
-#define APM_CNT_MBI_UPDATE	0xeb
-#define APM_CNT_GNVS_UPDATE	0xea
-#define APM_CNT_FINALIZE	0xcb
-#define APM_CNT_LEGACY		0xcc
-#define APM_ST			0xb3
-
-/* Multiple Processor Interrupts */
-#define MP_IRQ_POLARITY_DEFAULT	0x0
-#define MP_IRQ_POLARITY_HIGH	0x1
-#define MP_IRQ_POLARITY_LOW	0x3
-#define MP_IRQ_POLARITY_MASK	0x3
-#define MP_IRQ_TRIGGER_DEFAULT	0x0
-#define MP_IRQ_TRIGGER_EDGE	0x4
-#define MP_IRQ_TRIGGER_LEVEL	0xc
-#define MP_IRQ_TRIGGER_MASK	0xc
-
-/*
- * Interrupt assigned for SCI in order to
- * create the ACPI MADT IRQ override entry
- */
-#define ACTL		0x00
-#define SCIS_MASK	0x07
-#define SCIS_IRQ9	0x00
-#define SCIS_IRQ10	0x01
-#define SCIS_IRQ11	0x02
-#define SCIS_IRQ20	0x04
-#define SCIS_IRQ21	0x05
-#define SCIS_IRQ22	0x06
-#define SCIS_IRQ23	0x07
-
-#define ACPI_REV_ACPI_1_0	1
-#define ACPI_REV_ACPI_2_0	1
-#define ACPI_REV_ACPI_3_0	2
-#define ACPI_REV_ACPI_4_0	3
-#define ACPI_REV_ACPI_5_0	5
+#define RSDP_SIG		"RSD PTR "	/* RSDP pointer signature */
+#define OEM_ID			"U-BOOT"	/* U-Boot */
+#define OEM_TABLE_ID		"U-BOOTBL"	/* U-Boot Table */
+#define ASLC_ID			"INTL"		/* Intel ASL Compiler */
 
 #define ACPI_RSDP_REV_ACPI_1_0	0
 #define ACPI_RSDP_REV_ACPI_2_0	2
 
-typedef struct acpi_gen_regaddr {
-	u8  space_id;	/* Address space ID */
-	u8  bit_width;	/* Register size in bits */
-	u8  bit_offset;	/* Register bit offset */
-	union {
-		/* Reserved in ACPI 2.0 - 2.0b */
-		u8  resv;
-		/* Access size in ACPI 2.0c/3.0/4.0/5.0 */
-		u8  access_size;
-	};
-	u32 addrl;	/* Register address, low 32 bits */
-	u32 addrh;	/* Register address, high 32 bits */
-} acpi_addr_t;
-
-
 /*
  * RSDP (Root System Description Pointer)
  * Note: ACPI 1.0 didn't have length, xsdt_address, and ext_checksum
@@ -87,7 +23,7 @@
 	char signature[8];	/* RSDP signature */
 	u8 checksum;		/* Checksum of the first 20 bytes */
 	char oem_id[6];		/* OEM ID */
-	u8 revision;		/* 0 for ACPI 1.0, 2 for ACPI 2.0/3.0/4.0 */
+	u8 revision;		/* 0 for ACPI 1.0, others 2 */
 	u32 rsdt_address;	/* Physical address of RSDT (32 bits) */
 	u32 length;		/* Total RSDP length (incl. extended part) */
 	u64 xsdt_address;	/* Physical address of XSDT (64 bits) */
@@ -95,35 +31,8 @@
 	u8 reserved[3];
 };
 
-enum acpi_address_space_type {
-	ACPI_ADDRESS_SPACE_MEMORY = 0,	/* System memory */
-	ACPI_ADDRESS_SPACE_IO,		/* System I/O */
-	ACPI_ADDRESS_SPACE_PCI,		/* PCI config space */
-	ACPI_ADDRESS_SPACE_EC,		/* Embedded controller */
-	ACPI_ADDRESS_SPACE_SMBUS,	/* SMBus */
-	ACPI_ADDRESS_SPACE_PCC = 0x0a,	/* Platform Comm. Channel */
-	ACPI_ADDRESS_SPACE_FIXED = 0x7f	/* Functional fixed hardware */
-};
-
-/* functional fixed hardware */
-#define ACPI_FFIXEDHW_VENDOR_INTEL	1	/* Intel */
-#define ACPI_FFIXEDHW_CLASS_HLT		0	/* C1 Halt */
-#define ACPI_FFIXEDHW_CLASS_IO_HLT	1	/* C1 I/O then Halt */
-#define ACPI_FFIXEDHW_CLASS_MWAIT	2	/* MWAIT Native C-state */
-#define ACPI_FFIXEDHW_FLAG_HW_COORD	1	/* Hardware Coordination bit */
-#define ACPI_FFIXEDHW_FLAG_BM_STS	2	/* BM_STS avoidance bit */
-
-/* Access size definitions for Generic address structure */
-enum acpi_address_space_size {
-	ACPI_ACCESS_SIZE_UNDEFINED = 0,	/* Undefined (legacy reasons) */
-	ACPI_ACCESS_SIZE_BYTE_ACCESS = 1,
-	ACPI_ACCESS_SIZE_WORD_ACCESS = 2,
-	ACPI_ACCESS_SIZE_DWORD_ACCESS = 3,
-	ACPI_ACCESS_SIZE_QWORD_ACCESS = 4
-};
-
 /* Generic ACPI header, provided by (almost) all tables */
-typedef struct acpi_table_header {
+struct acpi_table_header {
 	char signature[4];	/* ACPI signature (4 ASCII characters) */
 	u32 length;		/* Table length in bytes (incl. header) */
 	u8 revision;		/* Table version (not ACPI version!) */
@@ -131,12 +40,12 @@
 	char oem_id[6];		/* OEM identification */
 	char oem_table_id[8];	/* OEM table identification */
 	u32 oem_revision;	/* OEM revision number */
-	char asl_compiler_id[4]; /* ASL compiler vendor ID */
-	u32 asl_compiler_revision; /* ASL compiler revision number */
-} acpi_header_t;
+	char aslc_id[4];	/* ASL compiler vendor ID */
+	u32 aslc_revision;	/* ASL compiler revision number */
+};
 
 /* A maximum number of 32 ACPI tables ought to be enough for now */
-#define MAX_ACPI_TABLES	32
+#define MAX_ACPI_TABLES		32
 
 /* RSDT (Root System Description Table) */
 struct acpi_rsdt {
@@ -150,103 +59,80 @@
 	u64 entry[MAX_ACPI_TABLES];
 };
 
-/* MCFG (PCI Express MMIO config space BAR description table) */
-struct acpi_mcfg {
-	struct acpi_table_header header;
-	u8 reserved[8];
+/* FADT Preferred Power Management Profile */
+enum acpi_pm_profile {
+	ACPI_PM_UNSPECIFIED = 0,
+	ACPI_PM_DESKTOP,
+	ACPI_PM_MOBILE,
+	ACPI_PM_WORKSTATION,
+	ACPI_PM_ENTERPRISE_SERVER,
+	ACPI_PM_SOHO_SERVER,
+	ACPI_PM_APPLIANCE_PC,
+	ACPI_PM_PERFORMANCE_SERVER,
+	ACPI_PM_TABLET
 };
 
-struct acpi_mcfg_mmconfig {
-	u32 base_address;
-	u32 base_reserved;
-	u16 pci_segment_group_number;
-	u8 start_bus_number;
-	u8 end_bus_number;
-	u8 reserved[4];
+/* FADT flags for p_lvl2_lat and p_lvl3_lat */
+#define ACPI_FADT_C2_NOT_SUPPORTED	101
+#define ACPI_FADT_C3_NOT_SUPPORTED	1001
+
+/* FADT Boot Architecture Flags */
+#define ACPI_FADT_LEGACY_FREE		0x00
+#define ACPI_FADT_LEGACY_DEVICES	(1 << 0)
+#define ACPI_FADT_8042			(1 << 1)
+#define ACPI_FADT_VGA_NOT_PRESENT	(1 << 2)
+#define ACPI_FADT_MSI_NOT_SUPPORTED	(1 << 3)
+#define ACPI_FADT_NO_PCIE_ASPM_CONTROL	(1 << 4)
+
+/* FADT Feature Flags */
+#define ACPI_FADT_WBINVD		(1 << 0)
+#define ACPI_FADT_WBINVD_FLUSH		(1 << 1)
+#define ACPI_FADT_C1_SUPPORTED		(1 << 2)
+#define ACPI_FADT_C2_MP_SUPPORTED	(1 << 3)
+#define ACPI_FADT_POWER_BUTTON		(1 << 4)
+#define ACPI_FADT_SLEEP_BUTTON		(1 << 5)
+#define ACPI_FADT_FIXED_RTC		(1 << 6)
+#define ACPI_FADT_S4_RTC_WAKE		(1 << 7)
+#define ACPI_FADT_32BIT_TIMER		(1 << 8)
+#define ACPI_FADT_DOCKING_SUPPORTED	(1 << 9)
+#define ACPI_FADT_RESET_REGISTER	(1 << 10)
+#define ACPI_FADT_SEALED_CASE		(1 << 11)
+#define ACPI_FADT_HEADLESS		(1 << 12)
+#define ACPI_FADT_SLEEP_TYPE		(1 << 13)
+#define ACPI_FADT_PCI_EXPRESS_WAKE	(1 << 14)
+#define ACPI_FADT_PLATFORM_CLOCK	(1 << 15)
+#define ACPI_FADT_S4_RTC_VALID		(1 << 16)
+#define ACPI_FADT_REMOTE_POWER_ON	(1 << 17)
+#define ACPI_FADT_APIC_CLUSTER		(1 << 18)
+#define ACPI_FADT_APIC_PHYSICAL		(1 << 19)
+#define ACPI_FADT_HW_REDUCED_ACPI	(1 << 20)
+#define ACPI_FADT_LOW_PWR_IDLE_S0	(1 << 21)
+
+enum acpi_address_space_type {
+	ACPI_ADDRESS_SPACE_MEMORY = 0,	/* System memory */
+	ACPI_ADDRESS_SPACE_IO,		/* System I/O */
+	ACPI_ADDRESS_SPACE_PCI,		/* PCI config space */
+	ACPI_ADDRESS_SPACE_EC,		/* Embedded controller */
+	ACPI_ADDRESS_SPACE_SMBUS,	/* SMBus */
+	ACPI_ADDRESS_SPACE_PCC = 0x0a,	/* Platform Comm. Channel */
+	ACPI_ADDRESS_SPACE_FIXED = 0x7f	/* Functional fixed hardware */
 };
 
-/* MADT (Multiple APIC Description Table) */
-struct acpi_madt {
-	struct acpi_table_header header;
-	u32 lapic_addr;			/* Local APIC address */
-	u32 flags;			/* Multiple APIC flags */
-} acpi_madt_t;
-
-enum dev_scope_type {
-	SCOPE_PCI_ENDPOINT = 1,
-	SCOPE_PCI_SUB = 2,
-	SCOPE_IOAPIC = 3,
-	SCOPE_MSI_HPET = 4
+enum acpi_address_space_size {
+	ACPI_ACCESS_SIZE_UNDEFINED = 0,
+	ACPI_ACCESS_SIZE_BYTE_ACCESS,
+	ACPI_ACCESS_SIZE_WORD_ACCESS,
+	ACPI_ACCESS_SIZE_DWORD_ACCESS,
+	ACPI_ACCESS_SIZE_QWORD_ACCESS
 };
 
-typedef struct dev_scope {
-	u8 type;
-	u8 length;
-	u8 reserved[2];
-	u8 enumeration;
-	u8 start_bus;
-	struct {
-		u8 dev;
-		u8 fn;
-	} path[0];
-} __packed dev_scope_t;
-
-/* MADT: APIC Structure Type*/
-enum acpi_apic_types {
-	LOCALAPIC	= 0,	/* Processor local APIC */
-	IOAPIC,			/* I/O APIC */
-	IRQSOURCEOVERRIDE,	/* Interrupt source override */
-	NMITYPE,		/* NMI source */
-	LOCALNMITYPE, 		/* Local APIC NMI */
-	LAPICADDRESSOVERRIDE,	/* Local APIC address override */
-	IOSAPIC,		/* I/O SAPIC */
-	LOCALSAPIC,		/* Local SAPIC */
-	PLATFORMIRQSOURCES,	/* Platform interrupt sources */
-	LOCALX2SAPIC,		/* Processor local x2APIC */
-	LOCALX2APICNMI,		/* Local x2APIC NMI */
-};
-
-/* MADT: Processor Local APIC Structure */
-struct acpi_madt_lapic {
-	u8 type;		/* Type (0) */
-	u8 length;		/* Length in bytes (8) */
-	u8 processor_id;	/* ACPI processor ID */
-	u8 apic_id;		/* Local APIC ID */
-	u32 flags;		/* Local APIC flags */
-};
-
-#define LOCAL_APIC_FLAG_ENABLED	(1 << 0)
-/* bits 1-31: reserved */
-#define PCAT_COMPAT		(1 << 0)
-/* bits 1-31: reserved */
-
-/* MADT: Local APIC NMI Structure */
-struct acpi_madt_lapic_nmi {
-	u8 type;		/* Type (4) */
-	u8 length;		/* Length in bytes (6) */
-	u8 processor_id;	/* ACPI processor ID */
-	u16 flags;		/* MPS INTI flags */
-	u8 lint;		/* Local APIC LINT# */
-};
-
-/* MADT: I/O APIC Structure */
-struct acpi_madt_ioapic {
-	u8 type;		/* Type (1) */
-	u8 length;		/* Length in bytes (12) */
-	u8 ioapic_id;		/* I/O APIC ID */
-	u8 reserved;
-	u32 ioapic_addr;	/* I/O APIC address */
-	u32 gsi_base;		/* Global system interrupt base */
-};
-
-/* MADT: Interrupt Source Override Structure */
-struct acpi_madt_irqoverride {
-	u8 type;		/* Type (2) */
-	u8 length;		/* Length in bytes (10) */
-	u8 bus;			/* ISA (0) */
-	u8 source;		/* Bus-relative int. source (IRQ) */
-	u32 gsirq;		/* Global system interrupt */
-	u16 flags;		/* MPS INTI flags */
+struct acpi_gen_regaddr {
+	u8 space_id;	/* Address space ID */
+	u8 bit_width;	/* Register size in bits */
+	u8 bit_offset;	/* Register bit offset */
+	u8 access_size;	/* Access size */
+	u32 addrl;	/* Register address, low 32 bits */
+	u32 addrh;	/* Register address, high 32 bits */
 };
 
 /* FADT (Fixed ACPI Description Table) */
@@ -254,7 +140,7 @@
 	struct acpi_table_header header;
 	u32 firmware_ctrl;
 	u32 dsdt;
-	u8 model;
+	u8 res1;
 	u8 preferred_pm_profile;
 	u16 sci_int;
 	u32 smi_cmd;
@@ -309,85 +195,121 @@
 	struct acpi_gen_regaddr x_gpe1_blk;
 };
 
-/* Flags for p_lvl2_lat and p_lvl3_lat */
-#define ACPI_FADT_C2_NOT_SUPPORTED	101
-#define ACPI_FADT_C3_NOT_SUPPORTED	1001
-
-/* FADT Feature Flags */
-#define ACPI_FADT_WBINVD		(1 << 0)
-#define ACPI_FADT_WBINVD_FLUSH		(1 << 1)
-#define ACPI_FADT_C1_SUPPORTED		(1 << 2)
-#define ACPI_FADT_C2_MP_SUPPORTED	(1 << 3)
-#define ACPI_FADT_POWER_BUTTON		(1 << 4)
-#define ACPI_FADT_SLEEP_BUTTON		(1 << 5)
-#define ACPI_FADT_FIXED_RTC		(1 << 6)
-#define ACPI_FADT_S4_RTC_WAKE		(1 << 7)
-#define ACPI_FADT_32BIT_TIMER		(1 << 8)
-#define ACPI_FADT_DOCKING_SUPPORTED	(1 << 9)
-#define ACPI_FADT_RESET_REGISTER	(1 << 10)
-#define ACPI_FADT_SEALED_CASE		(1 << 11)
-#define ACPI_FADT_HEADLESS		(1 << 12)
-#define ACPI_FADT_SLEEP_TYPE		(1 << 13)
-#define ACPI_FADT_PCI_EXPRESS_WAKE	(1 << 14)
-#define ACPI_FADT_PLATFORM_CLOCK	(1 << 15)
-#define ACPI_FADT_S4_RTC_VALID		(1 << 16)
-#define ACPI_FADT_REMOTE_POWER_ON	(1 << 17)
-#define ACPI_FADT_APIC_CLUSTER		(1 << 18)
-#define ACPI_FADT_APIC_PHYSICAL		(1 << 19)
-/* Bits 20-31: reserved ACPI 3.0 & 4.0 */
-#define ACPI_FADT_HW_REDUCED_ACPI	(1 << 20)
-#define ACPI_FADT_LOW_PWR_IDLE_S0	(1 << 21)
-/* bits 22-31: reserved ACPI 5.0 */
-
-/* FADT Boot Architecture Flags */
-#define ACPI_FADT_LEGACY_DEVICES	(1 << 0)
-#define ACPI_FADT_8042			(1 << 1)
-#define ACPI_FADT_VGA_NOT_PRESENT	(1 << 2)
-#define ACPI_FADT_MSI_NOT_SUPPORTED	(1 << 3)
-#define ACPI_FADT_NO_PCIE_ASPM_CONTROL	(1 << 4)
-/* No legacy devices (including 8042) */
-#define ACPI_FADT_LEGACY_FREE		0x00
-
-/* FADT Preferred Power Management Profile */
-#define PM_UNSPECIFIED		0
-#define PM_DESKTOP		1
-#define PM_MOBILE		2
-#define PM_WORKSTATION		3
-#define PM_ENTERPRISE_SERVER	4
-#define PM_SOHO_SERVER		5
-#define PM_APPLIANCE_PC		6
-#define PM_PERFORMANCE_SERVER	7
-#define PM_TABLET		8	/* ACPI 5.0 */
-
-/* FACS (Firmware ACPI Control Structure) */
-struct acpi_facs {
-	char signature[4];			/* "FACS" */
-	u32 length;				/* Length in bytes (>= 64) */
-	u32 hardware_signature;			/* Hardware signature */
-	u32 firmware_waking_vector;		/* Firmware waking vector */
-	u32 global_lock;			/* Global lock */
-	u32 flags;				/* FACS flags */
-	u32 x_firmware_waking_vector_l;		/* X FW waking vector, low */
-	u32 x_firmware_waking_vector_h;		/* X FW waking vector, high */
-	u8 version;				/* ACPI 4.0: 2 */
-	u8 resv[31];				/* FIXME: 4.0: ospm_flags */
-};
-
 /* FACS flags */
 #define ACPI_FACS_S4BIOS_F	(1 << 0)
 #define ACPI_FACS_64BIT_WAKE_F	(1 << 1)
-/* Bits 31..2: reserved */
+
+/* FACS (Firmware ACPI Control Structure) */
+struct acpi_facs {
+	char signature[4];		/* "FACS" */
+	u32 length;			/* Length in bytes (>= 64) */
+	u32 hardware_signature;		/* Hardware signature */
+	u32 firmware_waking_vector;	/* Firmware waking vector */
+	u32 global_lock;		/* Global lock */
+	u32 flags;			/* FACS flags */
+	u32 x_firmware_waking_vector_l;	/* X FW waking vector, low */
+	u32 x_firmware_waking_vector_h;	/* X FW waking vector, high */
+	u8 version;			/* Version 2 */
+	u8 res1[3];
+	u32 ospm_flags;			/* OSPM enabled flags */
+	u8 res2[24];
+};
+
+/* MADT flags */
+#define ACPI_MADT_PCAT_COMPAT	(1 << 0)
+
+/* MADT (Multiple APIC Description Table) */
+struct acpi_madt {
+	struct acpi_table_header header;
+	u32 lapic_addr;			/* Local APIC address */
+	u32 flags;			/* Multiple APIC flags */
+};
+
+/* MADT: APIC Structure Type*/
+enum acpi_apic_types {
+	ACPI_APIC_LAPIC	= 0,		/* Processor local APIC */
+	ACPI_APIC_IOAPIC,		/* I/O APIC */
+	ACPI_APIC_IRQ_SRC_OVERRIDE,	/* Interrupt source override */
+	ACPI_APIC_NMI_SRC,		/* NMI source */
+	ACPI_APIC_LAPIC_NMI,		/* Local APIC NMI */
+	ACPI_APIC_LAPIC_ADDR_OVERRIDE,	/* Local APIC address override */
+	ACPI_APIC_IOSAPIC,		/* I/O SAPIC */
+	ACPI_APIC_LSAPIC,		/* Local SAPIC */
+	ACPI_APIC_PLATFORM_IRQ_SRC,	/* Platform interrupt sources */
+	ACPI_APIC_LX2APIC,		/* Processor local x2APIC */
+	ACPI_APIC_LX2APIC_NMI,		/* Local x2APIC NMI */
+};
+
+/* MADT: Processor Local APIC Structure */
+
+#define LOCAL_APIC_FLAG_ENABLED	(1 << 0)
+
+struct acpi_madt_lapic {
+	u8 type;		/* Type (0) */
+	u8 length;		/* Length in bytes (8) */
+	u8 processor_id;	/* ACPI processor ID */
+	u8 apic_id;		/* Local APIC ID */
+	u32 flags;		/* Local APIC flags */
+};
+
+/* MADT: I/O APIC Structure */
+struct acpi_madt_ioapic {
+	u8 type;		/* Type (1) */
+	u8 length;		/* Length in bytes (12) */
+	u8 ioapic_id;		/* I/O APIC ID */
+	u8 reserved;
+	u32 ioapic_addr;	/* I/O APIC address */
+	u32 gsi_base;		/* Global system interrupt base */
+};
+
+/* MADT: Interrupt Source Override Structure */
+struct __packed acpi_madt_irqoverride {
+	u8 type;		/* Type (2) */
+	u8 length;		/* Length in bytes (10) */
+	u8 bus;			/* ISA (0) */
+	u8 source;		/* Bus-relative int. source (IRQ) */
+	u32 gsirq;		/* Global system interrupt */
+	u16 flags;		/* MPS INTI flags */
+};
+
+/* MADT: Local APIC NMI Structure */
+struct __packed acpi_madt_lapic_nmi {
+	u8 type;		/* Type (4) */
+	u8 length;		/* Length in bytes (6) */
+	u8 processor_id;	/* ACPI processor ID */
+	u16 flags;		/* MPS INTI flags */
+	u8 lint;		/* Local APIC LINT# */
+};
+
+/* MCFG (PCI Express MMIO config space BAR description table) */
+struct acpi_mcfg {
+	struct acpi_table_header header;
+	u8 reserved[8];
+};
+
+struct acpi_mcfg_mmconfig {
+	u32 base_address_l;
+	u32 base_address_h;
+	u16 pci_segment_group_number;
+	u8 start_bus_number;
+	u8 end_bus_number;
+	u8 reserved[4];
+};
+
+/* PM1_CNT bit defines */
+#define PM1_CNT_SCI_EN		(1 << 0)
 
 /* These can be used by the target port */
 
-unsigned long acpi_create_madt_lapics(unsigned long current);
-int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id, u32 addr,
-			 u32 gsi_base);
-int acpi_create_madt_irqoverride(struct acpi_madt_irqoverride *irqoverride,
-			 u8 bus, u8 source, u32 gsirq, u16 flags);
-unsigned long acpi_fill_madt(unsigned long current);
+void acpi_fill_header(struct acpi_table_header *header, char *signature);
 void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
-			 void *dsdt);
-int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi, u8 cpu,
-			 u16 flags, u8 lint);
+		      void *dsdt);
+int acpi_create_madt_lapics(u32 current);
+int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id,
+			    u32 addr, u32 gsi_base);
+int acpi_create_madt_irqoverride(struct acpi_madt_irqoverride *irqoverride,
+				 u8 bus, u8 source, u32 gsirq, u16 flags);
+int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi,
+			       u8 cpu, u16 flags, u8 lint);
+u32 acpi_fill_madt(u32 current);
 u32 write_acpi_tables(u32 start);
diff --git a/arch/x86/include/asm/arch-baytrail/acpi/gpio.asl b/arch/x86/include/asm/arch-baytrail/acpi/gpio.asl
new file mode 100644
index 0000000..ef340f3
--- /dev/null
+++ b/arch/x86/include/asm/arch-baytrail/acpi/gpio.asl
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2013 Google Inc.
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/soc/intel/baytrail/acpi/gpio.asl
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/* SouthCluster GPIO */
+Device (GPSC)
+{
+	Name(_HID, "INT33FC")
+	Name(_CID, "INT33FC")
+	Name(_UID, 1)
+
+	Name(RBUF, ResourceTemplate()
+	{
+		Memory32Fixed(ReadWrite, 0, 0x1000, RMEM)
+		Interrupt(ResourceConsumer, Level, ActiveLow, Shared, , ,)
+		{
+			GPIO_SC_IRQ
+		}
+	})
+
+	Method(_CRS)
+	{
+		CreateDwordField(^RBUF, ^RMEM._BAS, RBAS)
+		Add(IO_BASE_ADDRESS, IO_BASE_OFFSET_GPSCORE, RBAS)
+		Return (^RBUF)
+	}
+
+	Method(_STA)
+	{
+		Return (STA_VISIBLE)
+	}
+}
+
+/* NorthCluster GPIO */
+Device (GPNC)
+{
+	Name(_HID, "INT33FC")
+	Name(_CID, "INT33FC")
+	Name(_UID, 2)
+
+	Name(RBUF, ResourceTemplate()
+	{
+		Memory32Fixed(ReadWrite, 0, 0x1000, RMEM)
+		Interrupt(ResourceConsumer, Level, ActiveLow, Shared, , ,)
+		{
+			GPIO_NC_IRQ
+		}
+	})
+
+	Method(_CRS)
+	{
+		CreateDwordField(^RBUF, ^RMEM._BAS, RBAS)
+		Add(IO_BASE_ADDRESS, IO_BASE_OFFSET_GPNCORE, RBAS)
+		Return (^RBUF)
+	}
+
+	Method(_STA)
+	{
+		Return (STA_VISIBLE)
+	}
+}
+
+/* SUS GPIO */
+Device (GPSS)
+{
+	Name(_HID, "INT33FC")
+	Name(_CID, "INT33FC")
+	Name(_UID, 3)
+
+	Name(RBUF, ResourceTemplate()
+	{
+		Memory32Fixed(ReadWrite, 0, 0x1000, RMEM)
+		Interrupt(ResourceConsumer, Level, ActiveLow, Shared, , ,)
+		{
+			GPIO_SUS_IRQ
+		}
+	})
+
+	Method(_CRS)
+	{
+		CreateDwordField(^RBUF, ^RMEM._BAS, RBAS)
+		Add(IO_BASE_ADDRESS, IO_BASE_OFFSET_GPSSUS, RBAS)
+		Return (^RBUF)
+	}
+
+	Method(_STA)
+	{
+		Return (STA_VISIBLE)
+	}
+}
diff --git a/arch/x86/include/asm/arch-baytrail/acpi/irq_helper.h b/arch/x86/include/asm/arch-baytrail/acpi/irq_helper.h
new file mode 100644
index 0000000..2c3585a
--- /dev/null
+++ b/arch/x86/include/asm/arch-baytrail/acpi/irq_helper.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2013 Google Inc.
+ * Copyright (C) 2014 Sage Electronics Engineering, LLC.
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/soc/intel/baytrail/include/soc/irq_helper.h
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/*
+ * This file intentionally gets included multiple times, to set pic and apic
+ * modes, so should not have guard statements added.
+ */
+
+/*
+ * This file will use irqroute.asl and irqroute.h to generate the ACPI IRQ
+ * routing for the platform being compiled.
+ *
+ * This method uses #defines in irqroute.h along with the macros contained
+ * in this file to generate an IRQ routing for each PCI device in the system.
+ */
+
+#undef PCI_DEV_PIRQ_ROUTES
+#undef PCI_DEV_PIRQ_ROUTE
+#undef ACPI_DEV_IRQ
+#undef PCIE_BRIDGE_DEV
+#undef RP_IRQ_ROUTES
+#undef ROOTPORT_METHODS
+#undef ROOTPORT_IRQ_ROUTES
+#undef RP_METHOD
+
+#if defined(PIC_MODE)
+
+#define ACPI_DEV_IRQ(dev_, pin_, pin_name_) \
+	Package() { ## dev_ ## ffff, pin_, \_SB.PCI0.LPCB.LNK ## pin_name_, 0 }
+
+#define RP_IRQ_ROUTES(prefix_, func_, a_, b_, c_, d_) \
+Name(prefix_ ## func_ ## P, Package() \
+{ \
+	ACPI_DEV_IRQ(0x0000, 0, a_), \
+	ACPI_DEV_IRQ(0x0000, 1, b_), \
+	ACPI_DEV_IRQ(0x0000, 2, c_), \
+	ACPI_DEV_IRQ(0x0000, 3, d_), \
+})
+
+/* define as blank so ROOTPORT_METHODS only gets inserted once */
+#define ROOTPORT_METHODS(prefix_, dev_)
+
+#else /* defined(PIC_MODE) */
+
+#define ACPI_DEV_IRQ(dev_, pin_, pin_name_) \
+	Package() { ## dev_ ## ffff, pin_, 0, PIRQ ## pin_name_ ## _APIC_IRQ }
+
+#define RP_IRQ_ROUTES(prefix_, func_, a_, b_, c_, d_) \
+Name(prefix_ ## func_ ## A, Package() \
+{ \
+	ACPI_DEV_IRQ(0x0000, 0, a_), \
+	ACPI_DEV_IRQ(0x0000, 1, b_), \
+	ACPI_DEV_IRQ(0x0000, 2, c_), \
+	ACPI_DEV_IRQ(0x0000, 3, d_), \
+})
+
+#define ROOTPORT_METHODS(prefix_, dev_) \
+	RP_METHOD(prefix_, dev_, 0) \
+	RP_METHOD(prefix_, dev_, 1) \
+	RP_METHOD(prefix_, dev_, 2) \
+	RP_METHOD(prefix_, dev_, 3) \
+	RP_METHOD(prefix_, dev_, 4) \
+	RP_METHOD(prefix_, dev_, 5) \
+	RP_METHOD(prefix_, dev_, 6) \
+	RP_METHOD(prefix_, dev_, 7)
+
+#endif /* defined(PIC_MODE) */
+
+#define PCI_DEV_PIRQ_ROUTE(dev_, a_, b_, c_, d_) \
+	ACPI_DEV_IRQ(dev_, 0, a_), \
+	ACPI_DEV_IRQ(dev_, 1, b_), \
+	ACPI_DEV_IRQ(dev_, 2, c_), \
+	ACPI_DEV_IRQ(dev_, 3, d_)
+
+#define PCIE_BRIDGE_DEV(prefix_, dev_, a_, b_, c_, d_) \
+	ROOTPORT_IRQ_ROUTES(prefix_, a_, b_, c_, d_) \
+	ROOTPORT_METHODS(prefix_, dev_)
+
+#define ROOTPORT_IRQ_ROUTES(prefix_, a_, b_, c_, d_) \
+	RP_IRQ_ROUTES(prefix_, 0, a_, b_, c_, d_) \
+	RP_IRQ_ROUTES(prefix_, 1, b_, c_, d_, a_) \
+	RP_IRQ_ROUTES(prefix_, 2, c_, d_, a_, b_) \
+	RP_IRQ_ROUTES(prefix_, 3, d_, a_, b_, c_) \
+	RP_IRQ_ROUTES(prefix_, 4, a_, b_, c_, d_) \
+	RP_IRQ_ROUTES(prefix_, 5, b_, c_, d_, a_) \
+	RP_IRQ_ROUTES(prefix_, 6, c_, d_, a_, b_) \
+	RP_IRQ_ROUTES(prefix_, 7, d_, a_, b_, c_)
+
+#define RP_METHOD(prefix_, dev_, func_)\
+Device (prefix_ ## 0 ## func_) \
+{ \
+	Name(_ADR, dev_ ## 000 ## func_) \
+	Name(_PRW, Package() { 0, 0 }) \
+	Method(_PRT) { \
+		If (PICM) { \
+			Return (prefix_ ## func_ ## A) \
+		} Else { \
+			Return (prefix_ ## func_ ## P) \
+		} \
+	} \
+}
+
+/* SoC specific PIRQ route configuration */
+#include "irqroute.h"
diff --git a/arch/x86/include/asm/arch-baytrail/acpi/irqlinks.asl b/arch/x86/include/asm/arch-baytrail/acpi/irqlinks.asl
new file mode 100644
index 0000000..0affa23
--- /dev/null
+++ b/arch/x86/include/asm/arch-baytrail/acpi/irqlinks.asl
@@ -0,0 +1,493 @@
+/*
+ * Copyright (C) 2007-2009 coresystems GmbH
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/soc/intel/baytrail/acpi/irqlinks.asl
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+Scope (\)
+{
+	/* Intel Legacy Block */
+	OperationRegion(ILBS, SystemMemory, ILB_BASE_ADDRESS, ILB_BASE_SIZE)
+	Field(ILBS, AnyAcc, NoLock, Preserve) {
+		Offset (0x8),
+		PRTA, 8,
+		PRTB, 8,
+		PRTC, 8,
+		PRTD, 8,
+		PRTE, 8,
+		PRTF, 8,
+		PRTG, 8,
+		PRTH, 8,
+		Offset (0x88),
+		    , 3,
+		UI3E, 1,
+		UI4E, 1
+	}
+}
+
+Device (LNKA)
+{
+	Name(_HID, EISAID("PNP0C0F"))
+	Name(_UID, 1)
+
+	/* Disable method */
+	Method(_DIS, 0, Serialized)
+	{
+		Store(0x80, PRTA)
+	}
+
+	/* Possible Resource Settings for this Link */
+	Name(_PRS, ResourceTemplate()
+	{
+		IRQ(Level, ActiveLow, Shared) { 5, 6, 7, 10, 11, 12, 14, 15 }
+	})
+
+	/* Current Resource Settings for this link */
+	Method(_CRS, 0, Serialized)
+	{
+		Name(RTLA, ResourceTemplate()
+		{
+			IRQ(Level, ActiveLow, Shared) {}
+		})
+		CreateWordField(RTLA, 1, IRQ0)
+
+		/* Clear the WordField */
+		Store(Zero, IRQ0)
+
+		/* Set the bit from PRTA */
+		ShiftLeft(1, And(PRTA, 0x0f), IRQ0)
+
+		Return (RTLA)
+	}
+
+	/* Set Resource Setting for this IRQ link */
+	Method(_SRS, 1, Serialized)
+	{
+		CreateWordField(Arg0, 1, IRQ0)
+
+		/* Which bit is set? */
+		FindSetRightBit(IRQ0, Local0)
+
+		Decrement(Local0)
+		Store(Local0, PRTA)
+	}
+
+	/* Status */
+	Method(_STA, 0, Serialized)
+	{
+		If (And(PRTA, 0x80)) {
+			Return (STA_DISABLED)
+		} Else {
+			Return (STA_INVISIBLE)
+		}
+	}
+}
+
+Device (LNKB)
+{
+	Name(_HID, EISAID("PNP0C0F"))
+	Name(_UID, 2)
+
+	/* Disable method */
+	Method(_DIS, 0, Serialized)
+	{
+		Store(0x80, PRTB)
+	}
+
+	/* Possible Resource Settings for this Link */
+	Name(_PRS, ResourceTemplate()
+	{
+		IRQ(Level, ActiveLow, Shared) { 5, 6, 7, 10, 11, 12, 14, 15 }
+	})
+
+	/* Current Resource Settings for this link */
+	Method(_CRS, 0, Serialized)
+	{
+		Name(RTLB, ResourceTemplate()
+		{
+			IRQ(Level, ActiveLow, Shared) {}
+		})
+		CreateWordField(RTLB, 1, IRQ0)
+
+		/* Clear the WordField */
+		Store(Zero, IRQ0)
+
+		/* Set the bit from PRTB */
+		ShiftLeft(1, And(PRTB, 0x0f), IRQ0)
+
+		Return (RTLB)
+	}
+
+	/* Set Resource Setting for this IRQ link */
+	Method(_SRS, 1, Serialized)
+	{
+		CreateWordField(Arg0, 1, IRQ0)
+
+		/* Which bit is set? */
+		FindSetRightBit(IRQ0, Local0)
+
+		Decrement(Local0)
+		Store(Local0, PRTB)
+	}
+
+	/* Status */
+	Method(_STA, 0, Serialized)
+	{
+		If (And(PRTB, 0x80)) {
+			Return (STA_DISABLED)
+		} Else {
+			Return (STA_INVISIBLE)
+		}
+	}
+}
+
+Device (LNKC)
+{
+	Name(_HID, EISAID("PNP0C0F"))
+	Name(_UID, 3)
+
+	/* Disable method */
+	Method(_DIS, 0, Serialized)
+	{
+		Store(0x80, PRTC)
+	}
+
+	/* Possible Resource Settings for this Link */
+	Name(_PRS, ResourceTemplate()
+	{
+		IRQ(Level, ActiveLow, Shared) { 5, 6, 7, 10, 11, 12, 14, 15 }
+	})
+
+	/* Current Resource Settings for this link */
+	Method(_CRS, 0, Serialized)
+	{
+		Name(RTLC, ResourceTemplate()
+		{
+			IRQ(Level, ActiveLow, Shared) {}
+		})
+		CreateWordField(RTLC, 1, IRQ0)
+
+		/* Clear the WordField */
+		Store(Zero, IRQ0)
+
+		/* Set the bit from PRTC */
+		ShiftLeft(1, And(PRTC, 0x0f), IRQ0)
+
+		Return (RTLC)
+	}
+
+	/* Set Resource Setting for this IRQ link */
+	Method(_SRS, 1, Serialized)
+	{
+		CreateWordField(Arg0, 1, IRQ0)
+
+		/* Which bit is set? */
+		FindSetRightBit(IRQ0, Local0)
+
+		Decrement(Local0)
+		Store(Local0, PRTC)
+	}
+
+	/* Status */
+	Method(_STA, 0, Serialized)
+	{
+		If (And(PRTC, 0x80)) {
+			Return (STA_DISABLED)
+		} Else {
+			Return (STA_INVISIBLE)
+		}
+	}
+}
+
+Device (LNKD)
+{
+	Name(_HID, EISAID("PNP0C0F"))
+	Name(_UID, 4)
+
+	/* Disable method */
+	Method(_DIS, 0, Serialized)
+	{
+		Store(0x80, PRTD)
+	}
+
+	/* Possible Resource Settings for this Link */
+	Name(_PRS, ResourceTemplate()
+	{
+		IRQ(Level, ActiveLow, Shared) { 5, 6, 7, 10, 11, 12, 14, 15 }
+	})
+
+	/* Current Resource Settings for this link */
+	Method(_CRS, 0, Serialized)
+	{
+		Name(RTLD, ResourceTemplate()
+		{
+			IRQ(Level, ActiveLow, Shared) {}
+		})
+		CreateWordField(RTLD, 1, IRQ0)
+
+		/* Clear the WordField */
+		Store(Zero, IRQ0)
+
+		/* Set the bit from PRTD */
+		ShiftLeft(1, And(PRTD, 0x0f), IRQ0)
+
+		Return (RTLD)
+	}
+
+	/* Set Resource Setting for this IRQ link */
+	Method(_SRS, 1, Serialized)
+	{
+		CreateWordField(Arg0, 1, IRQ0)
+
+		/* Which bit is set? */
+		FindSetRightBit(IRQ0, Local0)
+
+		Decrement(Local0)
+		Store(Local0, PRTD)
+	}
+
+	/* Status */
+	Method(_STA, 0, Serialized)
+	{
+		If (And(PRTD, 0x80)) {
+			Return (STA_DISABLED)
+		} Else {
+			Return (STA_INVISIBLE)
+		}
+	}
+}
+
+Device (LNKE)
+{
+	Name(_HID, EISAID("PNP0C0F"))
+	Name(_UID, 5)
+
+	/* Disable method */
+	Method(_DIS, 0, Serialized)
+	{
+		Store(0x80, PRTE)
+	}
+
+	/* Possible Resource Settings for this Link */
+	Name(_PRS, ResourceTemplate()
+	{
+		IRQ(Level, ActiveLow, Shared) { 5, 6, 7, 10, 11, 12, 14, 15 }
+	})
+
+	/* Current Resource Settings for this link */
+	Method(_CRS, 0, Serialized)
+	{
+		Name(RTLE, ResourceTemplate()
+		{
+			IRQ(Level, ActiveLow, Shared) {}
+		})
+		CreateWordField(RTLE, 1, IRQ0)
+
+		/* Clear the WordField */
+		Store(Zero, IRQ0)
+
+		/* Set the bit from PRTE */
+		ShiftLeft(1, And(PRTE, 0x0f), IRQ0)
+
+		Return (RTLE)
+	}
+
+	/* Set Resource Setting for this IRQ link */
+	Method(_SRS, 1, Serialized)
+	{
+		CreateWordField(Arg0, 1, IRQ0)
+
+		/* Which bit is set? */
+		FindSetRightBit(IRQ0, Local0)
+
+		Decrement(Local0)
+		Store(Local0, PRTE)
+	}
+
+	/* Status */
+	Method(_STA, 0, Serialized)
+	{
+		If (And(PRTE, 0x80)) {
+			Return (STA_DISABLED)
+		} Else {
+			Return (STA_INVISIBLE)
+		}
+	}
+}
+
+Device (LNKF)
+{
+	Name(_HID, EISAID("PNP0C0F"))
+	Name(_UID, 6)
+
+	/* Disable method */
+	Method(_DIS, 0, Serialized)
+	{
+		Store(0x80, PRTF)
+	}
+
+	/* Possible Resource Settings for this Link */
+	Name(_PRS, ResourceTemplate()
+	{
+		IRQ(Level, ActiveLow, Shared) { 5, 6, 7, 10, 11, 12, 14, 15 }
+	})
+
+	/* Current Resource Settings for this link */
+	Method(_CRS, 0, Serialized)
+	{
+		Name(RTLF, ResourceTemplate()
+		{
+			IRQ(Level, ActiveLow, Shared) {}
+		})
+		CreateWordField(RTLF, 1, IRQ0)
+
+		/* Clear the WordField */
+		Store(Zero, IRQ0)
+
+		/* Set the bit from PRTF */
+		ShiftLeft(1, And(PRTF, 0x0f), IRQ0)
+
+		Return (RTLF)
+	}
+
+	/* Set Resource Setting for this IRQ link */
+	Method(_SRS, 1, Serialized)
+	{
+		CreateWordField(Arg0, 1, IRQ0)
+
+		/* Which bit is set? */
+		FindSetRightBit(IRQ0, Local0)
+
+		Decrement(Local0)
+		Store(Local0, PRTF)
+	}
+
+	/* Status */
+	Method(_STA, 0, Serialized)
+	{
+		If (And(PRTF, 0x80)) {
+			Return (STA_DISABLED)
+		} Else {
+			Return (STA_INVISIBLE)
+		}
+	}
+}
+
+Device (LNKG)
+{
+	Name(_HID, EISAID("PNP0C0F"))
+	Name(_UID, 7)
+
+	/* Disable method */
+	Method(_DIS, 0, Serialized)
+	{
+		Store(0x80, PRTG)
+	}
+
+	/* Possible Resource Settings for this Link */
+	Name(_PRS, ResourceTemplate()
+	{
+		IRQ(Level, ActiveLow, Shared) { 5, 6, 7, 10, 11, 12, 14, 15 }
+	})
+
+	/* Current Resource Settings for this link */
+	Method(_CRS, 0, Serialized)
+	{
+		Name(RTLG, ResourceTemplate()
+		{
+			IRQ(Level, ActiveLow, Shared) {}
+		})
+		CreateWordField(RTLG, 1, IRQ0)
+
+		/* Clear the WordField */
+		Store(Zero, IRQ0)
+
+		/* Set the bit from PRTG */
+		ShiftLeft(1, And(PRTG, 0x0f), IRQ0)
+
+		Return (RTLG)
+	}
+
+	/* Set Resource Setting for this IRQ link */
+	Method(_SRS, 1, Serialized)
+	{
+		CreateWordField(Arg0, 1, IRQ0)
+
+		/* Which bit is set? */
+		FindSetRightBit(IRQ0, Local0)
+
+		Decrement(Local0)
+		Store(Local0, PRTG)
+	}
+
+	/* Status */
+	Method(_STA, 0, Serialized)
+	{
+		If (And(PRTG, 0x80)) {
+			Return (STA_DISABLED)
+		} Else {
+			Return (STA_INVISIBLE)
+		}
+	}
+}
+
+Device (LNKH)
+{
+	Name(_HID, EISAID("PNP0C0F"))
+	Name(_UID, 8)
+
+	/* Disable method */
+	Method(_DIS, 0, Serialized)
+	{
+		Store(0x80, PRTH)
+	}
+
+	/* Possible Resource Settings for this Link */
+	Name(_PRS, ResourceTemplate()
+	{
+		IRQ(Level, ActiveLow, Shared) { 5, 6, 7, 10, 11, 12, 14, 15 }
+	})
+
+	/* Current Resource Settings for this link */
+	Method(_CRS, 0, Serialized)
+	{
+		Name(RTLH, ResourceTemplate()
+		{
+			IRQ(Level, ActiveLow, Shared) {}
+		})
+		CreateWordField(RTLH, 1, IRQ0)
+
+		/* Clear the WordField */
+		Store(Zero, IRQ0)
+
+		/* Set the bit from PRTH */
+		ShiftLeft(1, And(PRTH, 0x0f), IRQ0)
+
+		Return (RTLH)
+	}
+
+	/* Set Resource Setting for this IRQ link */
+	Method(_SRS, 1, Serialized)
+	{
+		CreateWordField(Arg0, 1, IRQ0)
+
+		/* Which bit is set? */
+		FindSetRightBit(IRQ0, Local0)
+
+		Decrement(Local0)
+		Store(Local0, PRTH)
+	}
+
+	/* Status */
+	Method(_STA, 0, Serialized)
+	{
+		If (And(PRTH, 0x80)) {
+			Return (STA_DISABLED)
+		} Else {
+			Return (STA_INVISIBLE)
+		}
+	}
+}
diff --git a/arch/x86/include/asm/arch-baytrail/acpi/irqroute.asl b/arch/x86/include/asm/arch-baytrail/acpi/irqroute.asl
new file mode 100644
index 0000000..64d3820
--- /dev/null
+++ b/arch/x86/include/asm/arch-baytrail/acpi/irqroute.asl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2007-2009 coresystems GmbH
+ * Copyright (C) 2013 Google Inc.
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/soc/intel/baytrail/acpi/irqroute.asl
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+Name(\PICM, 0)
+
+/*
+ * The _PIC method is called by the OS to choose between interrupt
+ * routing via the i8259 interrupt controller or the APIC.
+ *
+ * _PIC is called with a parameter of 0 for i8259 configuration and
+ * with a parameter of 1 for Local APIC/IOAPIC configuration.
+ */
+Method(\_PIC, 1)
+{
+	/* Remember the OS' IRQ routing choice */
+	Store(Arg0, PICM)
+}
+
+/* PCI interrupt routing */
+Method(_PRT) {
+	If (PICM) {
+		Return (Package() {
+			#undef PIC_MODE
+			#include "irq_helper.h"
+			PCI_DEV_PIRQ_ROUTES
+		})
+	} Else {
+		Return (Package() {
+			#define PIC_MODE
+			#include "irq_helper.h"
+			PCI_DEV_PIRQ_ROUTES
+		})
+	}
+
+}
+
+/* PCIe downstream ports interrupt routing */
+PCIE_BRIDGE_IRQ_ROUTES
+#undef PIC_MODE
+#include "irq_helper.h"
+PCIE_BRIDGE_IRQ_ROUTES
diff --git a/arch/x86/include/asm/arch-baytrail/acpi/irqroute.h b/arch/x86/include/asm/arch-baytrail/acpi/irqroute.h
new file mode 100644
index 0000000..d746314
--- /dev/null
+++ b/arch/x86/include/asm/arch-baytrail/acpi/irqroute.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2016, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <asm/arch/device.h>
+
+#define PCI_DEV_PIRQ_ROUTES \
+	PCI_DEV_PIRQ_ROUTE(GFX_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(EMMC_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(SDIO_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(SD_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(SATA_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(XHCI_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(LPE_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(MMC45_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(SIO1_DEV,	A, B, C, D), \
+	PCI_DEV_PIRQ_ROUTE(TXE_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(HDA_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(PCIE_DEV,	A, B, C, D), \
+	PCI_DEV_PIRQ_ROUTE(EHCI_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(SIO2_DEV,	A, B, C, D), \
+	PCI_DEV_PIRQ_ROUTE(PCU_DEV,	A, B, C, D)
+
+#define PCIE_BRIDGE_IRQ_ROUTES \
+	PCIE_BRIDGE_DEV(RP, PCIE_DEV,	A, B, C, D)
diff --git a/arch/x86/include/asm/arch-baytrail/acpi/lpc.asl b/arch/x86/include/asm/arch-baytrail/acpi/lpc.asl
new file mode 100644
index 0000000..385671c
--- /dev/null
+++ b/arch/x86/include/asm/arch-baytrail/acpi/lpc.asl
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2007-2009 coresystems GmbH
+ * Copyright (C) 2013 Google Inc.
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/soc/intel/baytrail/acpi/lpc.asl
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/* Intel LPC Bus Device - 0:1f.0 */
+
+Device (LPCB)
+{
+	Name(_ADR, 0x001f0000)
+
+	OperationRegion(LPC0, PCI_Config, 0x00, 0x100)
+	Field(LPC0, AnyAcc, NoLock, Preserve) {
+		Offset(0x08),
+		SRID, 8,
+		Offset(0x80),
+		C1EN, 1,
+		Offset(0x84)
+	}
+
+	#include "irqlinks.asl"
+
+	/* Firmware Hub */
+	Device (FWH)
+	{
+		Name(_HID, EISAID("INT0800"))
+		Name(_CRS, ResourceTemplate()
+		{
+			Memory32Fixed(ReadOnly, 0xff000000, 0x01000000)
+		})
+	}
+
+	/* 8259 Interrupt Controller */
+	Device (PIC)
+	{
+		Name(_HID, EISAID("PNP0000"))
+		Name(_CRS, ResourceTemplate()
+		{
+			IO(Decode16, 0x20, 0x20, 0x01, 0x02)
+			IO(Decode16, 0x24, 0x24, 0x01, 0x02)
+			IO(Decode16, 0x28, 0x28, 0x01, 0x02)
+			IO(Decode16, 0x2c, 0x2c, 0x01, 0x02)
+			IO(Decode16, 0x30, 0x30, 0x01, 0x02)
+			IO(Decode16, 0x34, 0x34, 0x01, 0x02)
+			IO(Decode16, 0x38, 0x38, 0x01, 0x02)
+			IO(Decode16, 0x3c, 0x3c, 0x01, 0x02)
+			IO(Decode16, 0xa0, 0xa0, 0x01, 0x02)
+			IO(Decode16, 0xa4, 0xa4, 0x01, 0x02)
+			IO(Decode16, 0xa8, 0xa8, 0x01, 0x02)
+			IO(Decode16, 0xac, 0xac, 0x01, 0x02)
+			IO(Decode16, 0xb0, 0xb0, 0x01, 0x02)
+			IO(Decode16, 0xb4, 0xb4, 0x01, 0x02)
+			IO(Decode16, 0xb8, 0xb8, 0x01, 0x02)
+			IO(Decode16, 0xbc, 0xbc, 0x01, 0x02)
+			IO(Decode16, 0x4d0, 0x4d0, 0x01, 0x02)
+			IRQNoFlags () { 2 }
+		})
+	}
+
+	/* 8254 timer */
+	Device (TIMR)
+	{
+		Name(_HID, EISAID("PNP0100"))
+		Name(_CRS, ResourceTemplate()
+		{
+			IO(Decode16, 0x40, 0x40, 0x01, 0x04)
+			IO(Decode16, 0x50, 0x50, 0x10, 0x04)
+			IRQNoFlags() { 0 }
+		})
+	}
+
+	/* HPET */
+	Device (HPET)
+	{
+		Name(_HID, EISAID("PNP0103"))
+		Name(_CID, 0x010CD041)
+		Name(_CRS, ResourceTemplate()
+		{
+			Memory32Fixed(ReadOnly, HPET_BASE_ADDRESS, HPET_BASE_SIZE)
+		})
+
+		Method(_STA)
+		{
+			Return (STA_VISIBLE)
+		}
+	}
+
+	/* Internal UART */
+	Device (IURT)
+	{
+		Name(_HID, EISAID("PNP0501"))
+		Name(_UID, 1)
+
+		Method(_STA, 0, Serialized)
+		{
+			/*
+			 * TODO:
+			 *
+			 * Need to hide the internal UART depending on whether
+			 * internal UART is enabled or not so that external
+			 * SuperIO UART can be exposed to system.
+			 */
+			Store(1, UI3E)
+			Store(1, UI4E)
+			Store(1, C1EN)
+			Return (STA_VISIBLE)
+
+		}
+
+		Method(_DIS, 0, Serialized)
+		{
+			Store(0, UI3E)
+			Store(0, UI4E)
+			Store(0, C1EN)
+		}
+
+		Method(_CRS, 0, Serialized)
+		{
+			Name(BUF0, ResourceTemplate()
+			{
+				IO(Decode16, 0x03f8, 0x03f8, 0x01, 0x08)
+				IRQNoFlags() { 3 }
+			})
+
+			Name(BUF1, ResourceTemplate()
+			{
+				IO(Decode16, 0x03f8, 0x03f8, 0x01, 0x08)
+				IRQNoFlags() { 4 }
+			})
+
+			If (LLessEqual(SRID, 0x04)) {
+				Return (BUF0)
+			} Else {
+				Return (BUF1)
+			}
+		}
+	}
+
+	/* Real Time Clock */
+	Device (RTC)
+	{
+		Name(_HID, EISAID("PNP0B00"))
+		Name(_CRS, ResourceTemplate()
+		{
+			IO(Decode16, 0x70, 0x70, 1, 8)
+			/*
+			 * Disable as Windows doesn't like it, and systems
+			 * don't seem to use it
+			 */
+			/* IRQNoFlags() { 8 } */
+		})
+	}
+
+	/* LPC device: Resource consumption */
+	Device (LDRC)
+	{
+		Name(_HID, EISAID("PNP0C02"))
+		Name(_UID, 2)
+
+		Name(RBUF, ResourceTemplate()
+		{
+			IO(Decode16, 0x61, 0x61, 0x1, 0x01) /* NMI Status */
+			IO(Decode16, 0x63, 0x63, 0x1, 0x01) /* CPU Reserved */
+			IO(Decode16, 0x65, 0x65, 0x1, 0x01) /* CPU Reserved */
+			IO(Decode16, 0x67, 0x67, 0x1, 0x01) /* CPU Reserved */
+			IO(Decode16, 0x80, 0x80, 0x1, 0x01) /* Port 80 Post */
+			IO(Decode16, 0x92, 0x92, 0x1, 0x01) /* CPU Reserved */
+			IO(Decode16, 0xb2, 0xb2, 0x1, 0x02) /* SWSMI */
+		})
+
+		Method(_CRS, 0, NotSerialized)
+		{
+			Return (RBUF)
+		}
+	}
+}
diff --git a/arch/x86/include/asm/arch-baytrail/acpi/platform.asl b/arch/x86/include/asm/arch-baytrail/acpi/platform.asl
new file mode 100644
index 0000000..6bc82ec
--- /dev/null
+++ b/arch/x86/include/asm/arch-baytrail/acpi/platform.asl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2016, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <asm/acpi/statdef.asl>
+#include <asm/arch/iomap.h>
+#include <asm/arch/irq.h>
+
+/*
+ * The _PTS method (Prepare To Sleep) is called before the OS is
+ * entering a sleep state. The sleep state number is passed in Arg0.
+ */
+Method(_PTS, 1)
+{
+}
+
+/* The _WAK method is called on system wakeup */
+Method(_WAK, 1)
+{
+	Return (Package() {0, 0})
+}
+
+/* TODO: add CPU ASL support */
+
+Scope (\_SB)
+{
+	#include "southcluster.asl"
+
+	/* ACPI devices */
+	#include "gpio.asl"
+}
+
+/* Chipset specific sleep states */
+#include "sleepstates.asl"
diff --git a/arch/x86/include/asm/arch-baytrail/acpi/sleepstates.asl b/arch/x86/include/asm/arch-baytrail/acpi/sleepstates.asl
new file mode 100644
index 0000000..eb5ae76
--- /dev/null
+++ b/arch/x86/include/asm/arch-baytrail/acpi/sleepstates.asl
@@ -0,0 +1,13 @@
+/*
+ * Copyright (C) 2007-2009 coresystems GmbH
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/soc/intel/baytrail/acpi/sleepstates.asl
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+Name(\_S0, Package() {0x0, 0x0, 0x0, 0x0})
+Name(\_S3, Package() {0x5, 0x0, 0x0, 0x0})
+Name(\_S4, Package() {0x6, 0x0, 0x0, 0x0})
+Name(\_S5, Package() {0x7, 0x0, 0x0, 0x0})
diff --git a/arch/x86/include/asm/arch-baytrail/acpi/southcluster.asl b/arch/x86/include/asm/arch-baytrail/acpi/southcluster.asl
new file mode 100644
index 0000000..34d3951
--- /dev/null
+++ b/arch/x86/include/asm/arch-baytrail/acpi/southcluster.asl
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2013 Google Inc.
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/soc/intel/baytrail/acpi/southcluster.asl
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+Device (PCI0)
+{
+	Name(_HID, EISAID("PNP0A08"))	/* PCIe */
+	Name(_CID, EISAID("PNP0A03"))	/* PCI */
+
+	Name(_ADR, 0)
+	Name(_BBN, 0)
+
+	Name(MCRS, ResourceTemplate()
+	{
+		/* Bus Numbers */
+		WordBusNumber(ResourceProducer, MinFixed, MaxFixed, PosDecode,
+				0x0000, 0x0000, 0x00ff, 0x0000, 0x0100, , , PB00)
+
+		/* IO Region 0 */
+		WordIO(ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
+				0x0000, 0x0000, 0x0cf7, 0x0000, 0x0cf8, , , PI00)
+
+		/* PCI Config Space */
+		IO(Decode16, 0x0cf8, 0x0cf8, 0x0001, 0x0008)
+
+		/* IO Region 1 */
+		WordIO(ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
+				0x0000, 0x0d00, 0xffff, 0x0000, 0xf300, , , PI01)
+
+		/* VGA memory (0xa0000-0xbffff) */
+		DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
+				Cacheable, ReadWrite,
+				0x00000000, 0x000a0000, 0x000bffff, 0x00000000,
+				0x00020000, , , ASEG)
+
+		/* OPROM reserved (0xc0000-0xc3fff) */
+		DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
+				Cacheable, ReadWrite,
+				0x00000000, 0x000c0000, 0x000c3fff, 0x00000000,
+				0x00004000, , , OPR0)
+
+		/* OPROM reserved (0xc4000-0xc7fff) */
+		DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
+				Cacheable, ReadWrite,
+				0x00000000, 0x000c4000, 0x000c7fff, 0x00000000,
+				0x00004000, , , OPR1)
+
+		/* OPROM reserved (0xc8000-0xcbfff) */
+		DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
+				Cacheable, ReadWrite,
+				0x00000000, 0x000c8000, 0x000cbfff, 0x00000000,
+				0x00004000, , , OPR2)
+
+		/* OPROM reserved (0xcc000-0xcffff) */
+		DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
+				Cacheable, ReadWrite,
+				0x00000000, 0x000cc000, 0x000cffff, 0x00000000,
+				0x00004000, , , OPR3)
+
+		/* OPROM reserved (0xd0000-0xd3fff) */
+		DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
+				Cacheable, ReadWrite,
+				0x00000000, 0x000d0000, 0x000d3fff, 0x00000000,
+				0x00004000, , , OPR4)
+
+		/* OPROM reserved (0xd4000-0xd7fff) */
+		DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
+				Cacheable, ReadWrite,
+				0x00000000, 0x000d4000, 0x000d7fff, 0x00000000,
+				0x00004000, , , OPR5)
+
+		/* OPROM reserved (0xd8000-0xdbfff) */
+		DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
+				Cacheable, ReadWrite,
+				0x00000000, 0x000d8000, 0x000dbfff, 0x00000000,
+				0x00004000, , , OPR6)
+
+		/* OPROM reserved (0xdc000-0xdffff) */
+		DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
+				Cacheable, ReadWrite,
+				0x00000000, 0x000dc000, 0x000dffff, 0x00000000,
+				0x00004000, , , OPR7)
+
+		/* BIOS Extension (0xe0000-0xe3fff) */
+		DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
+				Cacheable, ReadWrite,
+				0x00000000, 0x000e0000, 0x000e3fff, 0x00000000,
+				0x00004000, , , ESG0)
+
+		/* BIOS Extension (0xe4000-0xe7fff) */
+		DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
+				Cacheable, ReadWrite,
+				0x00000000, 0x000e4000, 0x000e7fff, 0x00000000,
+				0x00004000, , , ESG1)
+
+		/* BIOS Extension (0xe8000-0xebfff) */
+		DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
+				Cacheable, ReadWrite,
+				0x00000000, 0x000e8000, 0x000ebfff, 0x00000000,
+				0x00004000, , , ESG2)
+
+		/* BIOS Extension (0xec000-0xeffff) */
+		DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
+				Cacheable, ReadWrite,
+				0x00000000, 0x000ec000, 0x000effff, 0x00000000,
+				0x00004000, , , ESG3)
+
+		/* System BIOS (0xf0000-0xfffff) */
+		DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
+				Cacheable, ReadWrite,
+				0x00000000, 0x000f0000, 0x000fffff, 0x00000000,
+				0x00010000, , , FSEG)
+
+		/* PCI Memory Region (TOLM-CONFIG_MMCONF_BASE_ADDRESS) */
+		DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
+				Cacheable, ReadWrite,
+				0x00000000, 0x00000000, 0x00000000, 0x00000000,
+				0x00000000, , , PMEM)
+
+		/* High PCI Memory Region */
+		QwordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
+				Cacheable, ReadWrite,
+				0x00000000, 0x00000000, 0x00000000, 0x00000000,
+				0x00000000, , , UMEM)
+	})
+
+	Method(_CRS, 0, Serialized)
+	{
+		/* Update PCI resource area */
+		CreateDwordField(MCRS, ^PMEM._MIN, PMIN)
+		CreateDwordField(MCRS, ^PMEM._MAX, PMAX)
+		CreateDwordField(MCRS, ^PMEM._LEN, PLEN)
+
+		/*
+		 * Hardcode TOLM to 2GB for now as BayTrail FSP uses this value.
+		 *
+		 * TODO: for generic usage, read TOLM value from register, or
+		 * from global NVS (not implemented by U-Boot yet).
+		 */
+		Store(0x80000000, PMIN)
+		Store(Subtract(MCFG_BASE_ADDRESS, 1), PMAX)
+		Add(Subtract(PMAX, PMIN), 1, PLEN)
+
+		/* Update High PCI resource area */
+		CreateQwordField(MCRS, ^UMEM._MIN, UMIN)
+		CreateQwordField(MCRS, ^UMEM._MAX, UMAX)
+		CreateQwordField(MCRS, ^UMEM._LEN, ULEN)
+
+		/* Set base address to 48GB and allocate 16GB for PCI space */
+		Store(0xc00000000, UMIN)
+		Store(0x400000000, ULEN)
+		Add(UMIN, Subtract(ULEN, 1), UMAX)
+
+		Return (MCRS)
+	}
+
+	/* Device Resource Consumption */
+	Device (PDRC)
+	{
+		Name(_HID, EISAID("PNP0C02"))
+		Name(_UID, 1)
+
+		Name(PDRS, ResourceTemplate() {
+			Memory32Fixed(ReadWrite, MCFG_BASE_ADDRESS, MCFG_BASE_SIZE)
+			Memory32Fixed(ReadWrite, ABORT_BASE_ADDRESS, ABORT_BASE_SIZE)
+			Memory32Fixed(ReadWrite, SPI_BASE_ADDRESS, SPI_BASE_SIZE)
+			Memory32Fixed(ReadWrite, PMC_BASE_ADDRESS, PMC_BASE_SIZE)
+			Memory32Fixed(ReadWrite, PUNIT_BASE_ADDRESS, PUNIT_BASE_SIZE)
+			Memory32Fixed(ReadWrite, ILB_BASE_ADDRESS, ILB_BASE_SIZE)
+			Memory32Fixed(ReadWrite, RCBA_BASE_ADDRESS, RCBA_BASE_SIZE)
+			Memory32Fixed(ReadWrite, MPHY_BASE_ADDRESS, MPHY_BASE_SIZE)
+		})
+
+		/* Current Resource Settings */
+		Method(_CRS, 0, Serialized)
+		{
+			Return (PDRS)
+		}
+	}
+
+	Method(_OSC, 4)
+	{
+		/* Check for proper GUID */
+		If (LEqual(Arg0, ToUUID("33DB4D5B-1FF7-401C-9657-7441C03DD766"))) {
+			/* Let OS control everything */
+			Return (Arg3)
+		} Else {
+			/* Unrecognized UUID */
+			CreateDWordField(Arg3, 0, CDW1)
+			Or(CDW1, 4, CDW1)
+			Return (Arg3)
+		}
+	}
+
+	/* LPC Bridge 0:1f.0 */
+	#include "lpc.asl"
+
+	/* USB EHCI 0:1d.0 */
+	#include "usb.asl"
+
+	/* USB XHCI 0:14.0 */
+	#include "xhci.asl"
+
+	/* IRQ routing for each PCI device */
+	#include "irqroute.asl"
+}
diff --git a/arch/x86/include/asm/arch-baytrail/acpi/usb.asl b/arch/x86/include/asm/arch-baytrail/acpi/usb.asl
new file mode 100644
index 0000000..311f471
--- /dev/null
+++ b/arch/x86/include/asm/arch-baytrail/acpi/usb.asl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2007-2009 coresystems GmbH
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/soc/intel/baytrail/acpi/usb.asl
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/* EHCI Controller 0:1d.0 */
+
+Device (EHC1)
+{
+	Name(_ADR, 0x001d0000)
+
+	/* Power Resources for Wake */
+	Name(_PRW, Package() { 13, 4 })
+
+	/* Highest D state in S3 state */
+	Name(_S3D, 2)
+
+	/* Highest D state in S4 state */
+	Name(_S4D, 2)
+
+	Device (HUB7)
+	{
+		Name(_ADR, 0x00000000)
+
+		Device(PRT1) { Name(_ADR, 1) }	/* USB Port 0 */
+		Device(PRT2) { Name(_ADR, 2) }	/* USB Port 1 */
+		Device(PRT3) { Name(_ADR, 3) }	/* USB Port 2 */
+		Device(PRT4) { Name(_ADR, 4) }	/* USB Port 3 */
+	}
+}
diff --git a/arch/x86/include/asm/arch-baytrail/acpi/xhci.asl b/arch/x86/include/asm/arch-baytrail/acpi/xhci.asl
new file mode 100644
index 0000000..a5a4404
--- /dev/null
+++ b/arch/x86/include/asm/arch-baytrail/acpi/xhci.asl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2014 Google Inc.
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/soc/intel/baytrail/acpi/xhci.asl
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/* XHCI Controller 0:14.0 */
+
+Device (XHCI)
+{
+	Name(_ADR, 0x00140000)
+
+	/* Power Resources for Wake */
+	Name(_PRW, Package() { 13, 3 })
+
+	/* Highest D state in S3 state */
+	Name(_S3D, 3)
+
+	Device (RHUB)
+	{
+		Name(_ADR, 0x00000000)
+
+		Device (PRT1) { Name(_ADR, 1) }	/* USB Port 0 */
+		Device (PRT2) { Name(_ADR, 2) }	/* USB Port 1 */
+		Device (PRT3) { Name(_ADR, 3) }	/* USB Port 2 */
+		Device (PRT4) { Name(_ADR, 4) }	/* USB Port 3 */
+	}
+}
diff --git a/arch/x86/include/asm/arch-baytrail/device.h b/arch/x86/include/asm/arch-baytrail/device.h
new file mode 100644
index 0000000..798d35b
--- /dev/null
+++ b/arch/x86/include/asm/arch-baytrail/device.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2013 Google Inc.
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/soc/intel/baytrail/include/soc/pci_devs.h
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef _DEVICE_H_
+#define _DEVICE_H_
+
+/*
+ * Internal PCI device numbers within the SoC.
+ *
+ * Note it must start with 0x_ prefix, as the device number macro will be
+ * included in the ACPI ASL files (see irq_helper.h and irq_route.h).
+ */
+
+/* SoC transaction router */
+#define SOC_DEV		0x00
+
+/* Graphics and Display */
+#define GFX_DEV		0x02
+
+/* MIPI */
+#define MIPI_DEV	0x03
+
+/* EMMC Port */
+#define EMMC_DEV	0x10
+
+/* SDIO Port */
+#define SDIO_DEV	0x11
+
+/* SD Port */
+#define SD_DEV		0x12
+
+/* SATA */
+#define SATA_DEV	0x13
+
+/* xHCI */
+#define XHCI_DEV	0x14
+
+/* LPE Audio */
+#define LPE_DEV		0x15
+
+/* OTG */
+#define OTG_DEV		0x16
+
+/* MMC45 Port */
+#define MMC45_DEV	0x17
+
+/* Serial IO 1 */
+#define SIO1_DEV	0x18
+
+/* Trusted Execution Engine */
+#define TXE_DEV		0x1a
+
+/* HD Audio */
+#define HDA_DEV		0x1b
+
+/* PCIe Ports */
+#define PCIE_DEV	0x1c
+
+/* EHCI */
+#define EHCI_DEV	0x1d
+
+/* Serial IO 2 */
+#define SIO2_DEV	0x1e
+
+/* Platform Controller Unit */
+#define PCU_DEV		0x1f
+
+#endif /* _DEVICE_H_ */
diff --git a/arch/x86/include/asm/arch-baytrail/iomap.h b/arch/x86/include/asm/arch-baytrail/iomap.h
new file mode 100644
index 0000000..62a9105
--- /dev/null
+++ b/arch/x86/include/asm/arch-baytrail/iomap.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2013 Google Inc.
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/soc/intel/baytrail/include/soc/iomap.h
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef _BAYTRAIL_IOMAP_H_
+#define _BAYTRAIL_IOMAP_H_
+
+/* Memory Mapped IO bases */
+
+/* PCI Configuration Space */
+#define MCFG_BASE_ADDRESS		CONFIG_PCIE_ECAM_BASE
+#define MCFG_BASE_SIZE			0x10000000
+
+/* Temporary Base Address */
+#define TEMP_BASE_ADDRESS		0xfd000000
+
+/* Transactions in this range will abort */
+#define ABORT_BASE_ADDRESS		0xfeb00000
+#define ABORT_BASE_SIZE			0x00100000
+
+/* High Performance Event Timer */
+#define HPET_BASE_ADDRESS		0xfed00000
+#define HPET_BASE_SIZE			0x400
+
+/* SPI Bus */
+#define SPI_BASE_ADDRESS		0xfed01000
+#define SPI_BASE_SIZE			0x400
+
+/* Power Management Controller */
+#define PMC_BASE_ADDRESS		0xfed03000
+#define PMC_BASE_SIZE			0x400
+
+/* Power Management Unit */
+#define PUNIT_BASE_ADDRESS		0xfed05000
+#define PUNIT_BASE_SIZE			0x800
+
+/* Intel Legacy Block */
+#define ILB_BASE_ADDRESS		0xfed08000
+#define ILB_BASE_SIZE			0x400
+
+/* IO Memory */
+#define IO_BASE_ADDRESS			0xfed0c000
+#define  IO_BASE_OFFSET_GPSCORE		0x0000
+#define  IO_BASE_OFFSET_GPNCORE		0x1000
+#define  IO_BASE_OFFSET_GPSSUS		0x2000
+#define IO_BASE_SIZE			0x4000
+
+/* Root Complex Base Address */
+#define RCBA_BASE_ADDRESS		0xfed1c000
+#define RCBA_BASE_SIZE			0x400
+
+/* MODPHY */
+#define MPHY_BASE_ADDRESS		0xfef00000
+#define MPHY_BASE_SIZE			0x100000
+
+/* IO Port bases */
+#define ACPI_BASE_ADDRESS		0x0400
+#define ACPI_BASE_SIZE			0x80
+
+#define GPIO_BASE_ADDRESS		0x0500
+#define GPIO_BASE_SIZE			0x100
+
+#define SMBUS_BASE_ADDRESS		0xefa0
+
+#endif /* _BAYTRAIL_IOMAP_H_ */
diff --git a/arch/x86/include/asm/arch-baytrail/irq.h b/arch/x86/include/asm/arch-baytrail/irq.h
new file mode 100644
index 0000000..cd66f83
--- /dev/null
+++ b/arch/x86/include/asm/arch-baytrail/irq.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2013 Google Inc.
+ * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
+ *
+ * Modified from coreboot src/soc/intel/baytrail/include/soc/irq.h
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef _BAYTRAIL_IRQ_H_
+#define _BAYTRAIL_IRQ_H_
+
+#define PIRQA_APIC_IRQ			16
+#define PIRQB_APIC_IRQ			17
+#define PIRQC_APIC_IRQ			18
+#define PIRQD_APIC_IRQ			19
+#define PIRQE_APIC_IRQ			20
+#define PIRQF_APIC_IRQ			21
+#define PIRQG_APIC_IRQ			22
+#define PIRQH_APIC_IRQ			23
+
+/* The below IRQs are for when devices are in ACPI mode */
+#define LPE_DMA0_IRQ			24
+#define LPE_DMA1_IRQ			25
+#define LPE_SSP0_IRQ			26
+#define LPE_SSP1_IRQ			27
+#define LPE_SSP2_IRQ			28
+#define LPE_IPC2HOST_IRQ		29
+#define LPSS_I2C1_IRQ			32
+#define LPSS_I2C2_IRQ			33
+#define LPSS_I2C3_IRQ			34
+#define LPSS_I2C4_IRQ			35
+#define LPSS_I2C5_IRQ			36
+#define LPSS_I2C6_IRQ			37
+#define LPSS_I2C7_IRQ			38
+#define LPSS_HSUART1_IRQ		39
+#define LPSS_HSUART2_IRQ		40
+#define LPSS_SPI_IRQ			41
+#define LPSS_DMA1_IRQ			42
+#define LPSS_DMA2_IRQ			43
+#define SCC_EMMC_IRQ			44
+#define SCC_SDIO_IRQ			46
+#define SCC_SD_IRQ			47
+#define GPIO_NC_IRQ			48
+#define GPIO_SC_IRQ			49
+#define GPIO_SUS_IRQ			50
+/* GPIO direct / dedicated IRQs */
+#define GPIO_S0_DED_IRQ_0		51
+#define GPIO_S0_DED_IRQ_1		52
+#define GPIO_S0_DED_IRQ_2		53
+#define GPIO_S0_DED_IRQ_3		54
+#define GPIO_S0_DED_IRQ_4		55
+#define GPIO_S0_DED_IRQ_5		56
+#define GPIO_S0_DED_IRQ_6		57
+#define GPIO_S0_DED_IRQ_7		58
+#define GPIO_S0_DED_IRQ_8		59
+#define GPIO_S0_DED_IRQ_9		60
+#define GPIO_S0_DED_IRQ_10		61
+#define GPIO_S0_DED_IRQ_11		62
+#define GPIO_S0_DED_IRQ_12		63
+#define GPIO_S0_DED_IRQ_13		64
+#define GPIO_S0_DED_IRQ_14		65
+#define GPIO_S0_DED_IRQ_15		66
+#define GPIO_S5_DED_IRQ_0		67
+#define GPIO_S5_DED_IRQ_1		68
+#define GPIO_S5_DED_IRQ_2		69
+#define GPIO_S5_DED_IRQ_3		70
+#define GPIO_S5_DED_IRQ_4		71
+#define GPIO_S5_DED_IRQ_5		72
+#define GPIO_S5_DED_IRQ_6		73
+#define GPIO_S5_DED_IRQ_7		74
+#define GPIO_S5_DED_IRQ_8		75
+#define GPIO_S5_DED_IRQ_9		76
+#define GPIO_S5_DED_IRQ_10		77
+#define GPIO_S5_DED_IRQ_11		78
+#define GPIO_S5_DED_IRQ_12		79
+#define GPIO_S5_DED_IRQ_13		80
+#define GPIO_S5_DED_IRQ_14		81
+#define GPIO_S5_DED_IRQ_15		82
+/* DIRQs - Two levels of expansion to evaluate to numeric constants for ASL */
+#define _GPIO_S0_DED_IRQ(slot)		GPIO_S0_DED_IRQ_##slot
+#define _GPIO_S5_DED_IRQ(slot)		GPIO_S5_DED_IRQ_##slot
+#define GPIO_S0_DED_IRQ(slot)		_GPIO_S0_DED_IRQ(slot)
+#define GPIO_S5_DED_IRQ(slot)		_GPIO_S5_DED_IRQ(slot)
+
+#endif /* _BAYTRAIL_IRQ_H_ */
diff --git a/arch/x86/include/asm/coreboot_tables.h b/arch/x86/include/asm/coreboot_tables.h
index 15ccf9b..e036f74 100644
--- a/arch/x86/include/asm/coreboot_tables.h
+++ b/arch/x86/include/asm/coreboot_tables.h
@@ -295,6 +295,25 @@
 #define CBMEM_ID_NONE			0x00000000
 
 /**
+ * high_table_reserve() - reserve configuration table in high memory
+ *
+ * This reserves configuration table in high memory.
+ *
+ * @return:	always 0
+ */
+int high_table_reserve(void);
+
+/**
+ * high_table_malloc() - allocate configuration table in high memory
+ *
+ * This allocates configuration table in high memory.
+ *
+ * @bytes:	size of configuration table to be allocated
+ * @return:	pointer to configuration table in high memory
+ */
+void *high_table_malloc(size_t bytes);
+
+/**
  * write_coreboot_table() - write coreboot table
  *
  * This writes coreboot table at a given address.
diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
index 3bc2ac2..7434f77 100644
--- a/arch/x86/include/asm/global_data.h
+++ b/arch/x86/include/asm/global_data.h
@@ -93,6 +93,10 @@
 	char *mrc_output;
 	unsigned int mrc_output_len;
 	ulong table;			/* Table pointer from previous loader */
+#ifdef CONFIG_SEABIOS
+	u32 high_table_ptr;
+	u32 high_table_limit;
+#endif
 };
 
 #endif
diff --git a/arch/x86/include/asm/irq.h b/arch/x86/include/asm/irq.h
index 5b9e673..ddb529e 100644
--- a/arch/x86/include/asm/irq.h
+++ b/arch/x86/include/asm/irq.h
@@ -34,6 +34,8 @@
  *		IRQ N is available to be routed
  * @lb_bdf:	irq router's PCI bus/device/function number encoding
  * @ibase:	IBASE register block base address
+ * @actl_8bit:	ACTL register width is 8-bit (for ICH series chipset)
+ * @actl_addr:	ACTL register offset
  */
 struct irq_router {
 	int config;
@@ -41,6 +43,8 @@
 	u16 irq_mask;
 	u32 bdf;
 	u32 ibase;
+	bool actl_8bit;
+	int actl_addr;
 };
 
 struct pirq_routing {
diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
index dc90df2..e17f0bb 100644
--- a/arch/x86/lib/Makefile
+++ b/arch/x86/lib/Makefile
@@ -10,7 +10,7 @@
 obj-y += bios_interrupts.o
 obj-$(CONFIG_CMD_BOOTM) += bootm.o
 obj-y	+= cmd_boot.o
-obj-y	+= coreboot_table.o
+obj-$(CONFIG_SEABIOS) += coreboot_table.o
 obj-$(CONFIG_EFI) += efi/
 obj-y	+= e820.o
 obj-y	+= gcc.o
@@ -31,7 +31,7 @@
 obj-y += sfi.o
 obj-$(CONFIG_GENERATE_SMBIOS_TABLE) += smbios.o
 obj-y	+= string.o
-ifndef CONFIG_QEMU_ACPI_TABLE
+ifndef CONFIG_QEMU
 obj-$(CONFIG_GENERATE_ACPI_TABLE) += acpi_table.o
 endif
 obj-y	+= tables.o
diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c
index 790f6fb..ffb4678 100644
--- a/arch/x86/lib/acpi_table.c
+++ b/arch/x86/lib/acpi_table.c
@@ -2,6 +2,7 @@
  * Based on acpi.c from coreboot
  *
  * Copyright (C) 2015, Saket Sinha <saket.sinha89@gmail.com>
+ * Copyright (C) 2016, Bin Meng <bmeng.cn@gmail.com>
  *
  * SPDX-License-Identifier: GPL-2.0+
  */
@@ -10,25 +11,92 @@
 #include <cpu.h>
 #include <dm.h>
 #include <dm/uclass-internal.h>
-#include <dm/lists.h>
 #include <asm/acpi_table.h>
-#include <asm/cpu.h>
-#include <asm/ioapic.h>
+#include <asm/io.h>
 #include <asm/lapic.h>
 #include <asm/tables.h>
-#include <asm/pci.h>
 
 /*
- * IASL compiles the dsdt entries and
- * writes the hex values to AmlCode array.
- * CamelCase cannot be handled here.
+ * IASL compiles the dsdt entries and writes the hex values
+ * to a C array AmlCode[] (see dsdt.c).
  */
 extern const unsigned char AmlCode[];
 
+static void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
+			    struct acpi_xsdt *xsdt)
+{
+	memset(rsdp, 0, sizeof(struct acpi_rsdp));
+
+	memcpy(rsdp->signature, RSDP_SIG, 8);
+	memcpy(rsdp->oem_id, OEM_ID, 6);
+
+	rsdp->length = sizeof(struct acpi_rsdp);
+	rsdp->rsdt_address = (u32)rsdt;
+
+	/*
+	 * Revision: ACPI 1.0: 0, ACPI 2.0/3.0/4.0: 2
+	 *
+	 * Some OSes expect an XSDT to be present for RSD PTR revisions >= 2.
+	 * If we don't have an ACPI XSDT, force ACPI 1.0 (and thus RSD PTR
+	 * revision 0)
+	 */
+	if (xsdt == NULL) {
+		rsdp->revision = ACPI_RSDP_REV_ACPI_1_0;
+	} else {
+		rsdp->xsdt_address = (u64)(u32)xsdt;
+		rsdp->revision = ACPI_RSDP_REV_ACPI_2_0;
+	}
+
+	/* Calculate checksums */
+	rsdp->checksum = table_compute_checksum((void *)rsdp, 20);
+	rsdp->ext_checksum = table_compute_checksum((void *)rsdp,
+			sizeof(struct acpi_rsdp));
+}
+
+void acpi_fill_header(struct acpi_table_header *header, char *signature)
+{
+	memcpy(header->signature, signature, 4);
+	memcpy(header->oem_id, OEM_ID, 6);
+	memcpy(header->oem_table_id, OEM_TABLE_ID, 8);
+	memcpy(header->aslc_id, ASLC_ID, 4);
+}
+
+static void acpi_write_rsdt(struct acpi_rsdt *rsdt)
+{
+	struct acpi_table_header *header = &(rsdt->header);
+
+	/* Fill out header fields */
+	acpi_fill_header(header, "RSDT");
+	header->length = sizeof(struct acpi_rsdt);
+	header->revision = 1;
+
+	/* Entries are filled in later, we come with an empty set */
+
+	/* Fix checksum */
+	header->checksum = table_compute_checksum((void *)rsdt,
+			sizeof(struct acpi_rsdt));
+}
+
+static void acpi_write_xsdt(struct acpi_xsdt *xsdt)
+{
+	struct acpi_table_header *header = &(xsdt->header);
+
+	/* Fill out header fields */
+	acpi_fill_header(header, "XSDT");
+	header->length = sizeof(struct acpi_xsdt);
+	header->revision = 1;
+
+	/* Entries are filled in later, we come with an empty set */
+
+	/* Fix checksum */
+	header->checksum = table_compute_checksum((void *)xsdt,
+			sizeof(struct acpi_xsdt));
+}
+
 /**
-* Add an ACPI table to the RSDT (and XSDT) structure, recalculate length
-* and checksum.
-*/
+ * Add an ACPI table to the RSDT (and XSDT) structure, recalculate length
+ * and checksum.
+ */
 static void acpi_add_table(struct acpi_rsdp *rsdp, void *table)
 {
 	int i, entries_num;
@@ -50,7 +118,7 @@
 	}
 
 	if (i >= entries_num) {
-		debug("ACPI: Error: too many tables.\n");
+		debug("ACPI: Error: too many tables\n");
 		return;
 	}
 
@@ -58,12 +126,13 @@
 	rsdt->entry[i] = (u32)table;
 
 	/* Fix RSDT length or the kernel will assume invalid entries */
-	rsdt->header.length = sizeof(acpi_header_t) + (sizeof(u32) * (i + 1));
+	rsdt->header.length = sizeof(struct acpi_table_header) +
+				(sizeof(u32) * (i + 1));
 
 	/* Re-calculate checksum */
 	rsdt->header.checksum = 0;
 	rsdt->header.checksum = table_compute_checksum((u8 *)rsdt,
-						       rsdt->header.length);
+			rsdt->header.length);
 
 	/*
 	 * And now the same thing for the XSDT. We use the same index as for
@@ -74,8 +143,8 @@
 		xsdt->entry[i] = (u64)(u32)table;
 
 		/* Fix XSDT length */
-		xsdt->header.length = sizeof(acpi_header_t) +
-			 (sizeof(u64) * (i + 1));
+		xsdt->header.length = sizeof(struct acpi_table_header) +
+			(sizeof(u64) * (i + 1));
 
 		/* Re-calculate checksum */
 		xsdt->header.checksum = 0;
@@ -84,149 +153,6 @@
 	}
 }
 
-static int acpi_create_madt_lapic(struct acpi_madt_lapic *lapic,
-			 u8 cpu, u8 apic)
-{
-	lapic->type = LOCALAPIC; /* Local APIC structure */
-	lapic->length = sizeof(struct acpi_madt_lapic);
-	lapic->flags = LOCAL_APIC_FLAG_ENABLED; /* Processor/LAPIC enabled */
-	lapic->processor_id = cpu;
-	lapic->apic_id = apic;
-
-	return lapic->length;
-}
-
-unsigned long acpi_create_madt_lapics(unsigned long current)
-{
-	struct udevice *dev;
-
-	for (uclass_find_first_device(UCLASS_CPU, &dev);
-	     dev;
-	     uclass_find_next_device(&dev)) {
-		struct cpu_platdata *plat = dev_get_parent_platdata(dev);
-
-		current += acpi_create_madt_lapic(
-			(struct acpi_madt_lapic *)current,
-			plat->cpu_id, plat->cpu_id);
-		}
-		return current;
-}
-
-int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id, u32 addr,
-			 u32 gsi_base)
-{
-	ioapic->type = IOAPIC;
-	ioapic->length = sizeof(struct acpi_madt_ioapic);
-	ioapic->reserved = 0x00;
-	ioapic->gsi_base = gsi_base;
-	ioapic->ioapic_id = id;
-	ioapic->ioapic_addr = addr;
-
-	return ioapic->length;
-}
-
-int acpi_create_madt_irqoverride(struct acpi_madt_irqoverride *irqoverride,
-			 u8 bus, u8 source, u32 gsirq, u16 flags)
-{
-	irqoverride->type = IRQSOURCEOVERRIDE;
-	irqoverride->length = sizeof(struct acpi_madt_irqoverride);
-	irqoverride->bus = bus;
-	irqoverride->source = source;
-	irqoverride->gsirq = gsirq;
-	irqoverride->flags = flags;
-
-	return irqoverride->length;
-}
-
-int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi,
-			 u8 cpu, u16 flags, u8 lint)
-{
-	lapic_nmi->type = LOCALNMITYPE;
-	lapic_nmi->length = sizeof(struct acpi_madt_lapic_nmi);
-	lapic_nmi->flags = flags;
-	lapic_nmi->processor_id = cpu;
-	lapic_nmi->lint = lint;
-
-	return lapic_nmi->length;
-}
-
-static void fill_header(acpi_header_t *header, char *signature, int length)
-{
-	memcpy(header->signature, signature, length);
-	memcpy(header->oem_id, OEM_ID, 6);
-	memcpy(header->oem_table_id, ACPI_TABLE_CREATOR, 8);
-	memcpy(header->asl_compiler_id, ASLC, 4);
-}
-
-static void acpi_create_madt(struct acpi_madt *madt)
-{
-	acpi_header_t *header = &(madt->header);
-	unsigned long current = (unsigned long)madt + sizeof(struct acpi_madt);
-
-	memset((void *)madt, 0, sizeof(struct acpi_madt));
-
-	/* Fill out header fields */
-	fill_header(header, "APIC", 4);
-	header->length = sizeof(struct acpi_madt);
-
-	/* ACPI 1.0/2.0: 1, ACPI 3.0: 2, ACPI 4.0: 3 */
-	header->revision = ACPI_REV_ACPI_2_0;
-
-	madt->lapic_addr = LAPIC_DEFAULT_BASE;
-	madt->flags = PCAT_COMPAT;
-
-	current = acpi_fill_madt(current);
-
-	/* (Re)calculate length and checksum */
-	header->length = current - (unsigned long)madt;
-
-	header->checksum = table_compute_checksum((void *)madt, header->length);
-}
-
-static int acpi_create_mcfg_mmconfig(struct acpi_mcfg_mmconfig *mmconfig,
-			 u32 base, u16 seg_nr, u8 start, u8 end)
-{
-	memset(mmconfig, 0, sizeof(*mmconfig));
-	mmconfig->base_address = base;
-	mmconfig->base_reserved = 0;
-	mmconfig->pci_segment_group_number = seg_nr;
-	mmconfig->start_bus_number = start;
-	mmconfig->end_bus_number = end;
-
-	return sizeof(struct acpi_mcfg_mmconfig);
-}
-
-static unsigned long acpi_fill_mcfg(unsigned long current)
-{
-	current += acpi_create_mcfg_mmconfig
-		((struct acpi_mcfg_mmconfig *)current,
-		 CONFIG_PCIE_ECAM_BASE, 0x0, 0x0, 255);
-
-	return current;
-}
-
-/* MCFG is defined in the PCI Firmware Specification 3.0 */
-static void acpi_create_mcfg(struct acpi_mcfg *mcfg)
-{
-	acpi_header_t *header = &(mcfg->header);
-	unsigned long current = (unsigned long)mcfg + sizeof(struct acpi_mcfg);
-
-	memset((void *)mcfg, 0, sizeof(struct acpi_mcfg));
-
-	/* Fill out header fields */
-	fill_header(header, "MCFG", 4);
-	header->length = sizeof(struct acpi_mcfg);
-
-	/* ACPI 1.0/2.0: 1, ACPI 3.0: 2, ACPI 4.0: 3 */
-	header->revision = ACPI_REV_ACPI_2_0;
-
-	current = acpi_fill_mcfg(current);
-
-	/* (Re)calculate length and checksum */
-	header->length = current - (unsigned long)mcfg;
-	header->checksum = table_compute_checksum((void *)mcfg, header->length);
-}
-
 static void acpi_create_facs(struct acpi_facs *facs)
 {
 	memset((void *)facs, 0, sizeof(struct acpi_facs));
@@ -239,101 +165,165 @@
 	facs->flags = 0;
 	facs->x_firmware_waking_vector_l = 0;
 	facs->x_firmware_waking_vector_h = 0;
-	facs->version = 1; /* ACPI 1.0: 0, ACPI 2.0/3.0: 1, ACPI 4.0: 2 */
+	facs->version = 1;
 }
 
-static void acpi_write_rsdt(struct acpi_rsdt *rsdt)
+static int acpi_create_madt_lapic(struct acpi_madt_lapic *lapic,
+				  u8 cpu, u8 apic)
 {
-	acpi_header_t *header = &(rsdt->header);
+	lapic->type = ACPI_APIC_LAPIC;
+	lapic->length = sizeof(struct acpi_madt_lapic);
+	lapic->flags = LOCAL_APIC_FLAG_ENABLED;
+	lapic->processor_id = cpu;
+	lapic->apic_id = apic;
 
-	/* Fill out header fields */
-	fill_header(header, "RSDT", 4);
-	header->length = sizeof(struct acpi_rsdt);
-
-	/* ACPI 1.0/2.0: 1, ACPI 3.0: 2, ACPI 4.0: 3 */
-	header->revision = ACPI_REV_ACPI_2_0;
-
-	/* Entries are filled in later, we come with an empty set */
-
-	/* Fix checksum */
-	header->checksum = table_compute_checksum((void *)rsdt,
-			sizeof(struct acpi_rsdt));
+	return lapic->length;
 }
 
-static void acpi_write_xsdt(struct acpi_xsdt *xsdt)
+int acpi_create_madt_lapics(u32 current)
 {
-	acpi_header_t *header = &(xsdt->header);
+	struct udevice *dev;
+	int length = 0;
 
-	/* Fill out header fields */
-	fill_header(header, "XSDT", 4);
-	header->length = sizeof(struct acpi_xsdt);
+	for (uclass_find_first_device(UCLASS_CPU, &dev);
+	     dev;
+	     uclass_find_next_device(&dev)) {
+		struct cpu_platdata *plat = dev_get_parent_platdata(dev);
 
-	/* ACPI 1.0/2.0: 1, ACPI 3.0: 2, ACPI 4.0: 3 */
-	header->revision = ACPI_REV_ACPI_2_0;
-
-	/* Entries are filled in later, we come with an empty set */
-
-	/* Fix checksum */
-	header->checksum = table_compute_checksum((void *)xsdt,
-			sizeof(struct acpi_xsdt));
-}
-
-static void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
-			 struct acpi_xsdt *xsdt)
-{
-	memset(rsdp, 0, sizeof(struct acpi_rsdp));
-
-	memcpy(rsdp->signature, RSDP_SIG, 8);
-	memcpy(rsdp->oem_id, OEM_ID, 6);
-
-	rsdp->length = sizeof(struct acpi_rsdp);
-	rsdp->rsdt_address = (u32)rsdt;
-
-	/*
-	* Revision: ACPI 1.0: 0, ACPI 2.0/3.0/4.0: 2
-	*
-	* Some OSes expect an XSDT to be present for RSD PTR revisions >= 2.
-	* If we don't have an ACPI XSDT, force ACPI 1.0 (and thus RSD PTR
-	* revision 0)
-	*/
-	if (xsdt == NULL) {
-		rsdp->revision = ACPI_RSDP_REV_ACPI_1_0;
-	} else {
-		rsdp->xsdt_address = (u64)(u32)xsdt;
-		rsdp->revision = ACPI_RSDP_REV_ACPI_2_0;
+		length += acpi_create_madt_lapic(
+			(struct acpi_madt_lapic *)current,
+			plat->cpu_id, plat->cpu_id);
+		current += length;
 	}
 
-	/* Calculate checksums */
-	rsdp->checksum = table_compute_checksum((void *)rsdp, 20);
-	rsdp->ext_checksum = table_compute_checksum((void *)rsdp,
-			sizeof(struct acpi_rsdp));
+	return length;
 }
 
-static void acpi_create_ssdt_generator(acpi_header_t *ssdt,
-			 const char *oem_table_id)
+int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id,
+			    u32 addr, u32 gsi_base)
 {
-	unsigned long current = (unsigned long)ssdt + sizeof(acpi_header_t);
+	ioapic->type = ACPI_APIC_IOAPIC;
+	ioapic->length = sizeof(struct acpi_madt_ioapic);
+	ioapic->reserved = 0x00;
+	ioapic->gsi_base = gsi_base;
+	ioapic->ioapic_id = id;
+	ioapic->ioapic_addr = addr;
 
-	memset((void *)ssdt, 0, sizeof(acpi_header_t));
+	return ioapic->length;
+}
 
-	memcpy(&ssdt->signature, "SSDT", 4);
-	/* Access size in ACPI 2.0c/3.0/4.0/5.0 */
-	ssdt->revision = ACPI_REV_ACPI_3_0;
-	memcpy(&ssdt->oem_id, OEM_ID, 6);
-	memcpy(&ssdt->oem_table_id, oem_table_id, 8);
-	ssdt->oem_revision = OEM_REVISION;
-	memcpy(&ssdt->asl_compiler_id, ASLC, 4);
-	ssdt->asl_compiler_revision = ASL_COMPILER_REVISION;
-	ssdt->length = sizeof(acpi_header_t);
+int acpi_create_madt_irqoverride(struct acpi_madt_irqoverride *irqoverride,
+				 u8 bus, u8 source, u32 gsirq, u16 flags)
+{
+	irqoverride->type = ACPI_APIC_IRQ_SRC_OVERRIDE;
+	irqoverride->length = sizeof(struct acpi_madt_irqoverride);
+	irqoverride->bus = bus;
+	irqoverride->source = source;
+	irqoverride->gsirq = gsirq;
+	irqoverride->flags = flags;
+
+	return irqoverride->length;
+}
+
+int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi,
+			       u8 cpu, u16 flags, u8 lint)
+{
+	lapic_nmi->type = ACPI_APIC_LAPIC_NMI;
+	lapic_nmi->length = sizeof(struct acpi_madt_lapic_nmi);
+	lapic_nmi->flags = flags;
+	lapic_nmi->processor_id = cpu;
+	lapic_nmi->lint = lint;
+
+	return lapic_nmi->length;
+}
+
+static void acpi_create_madt(struct acpi_madt *madt)
+{
+	struct acpi_table_header *header = &(madt->header);
+	u32 current = (u32)madt + sizeof(struct acpi_madt);
+
+	memset((void *)madt, 0, sizeof(struct acpi_madt));
+
+	/* Fill out header fields */
+	acpi_fill_header(header, "APIC");
+	header->length = sizeof(struct acpi_madt);
+	header->revision = 4;
+
+	madt->lapic_addr = LAPIC_DEFAULT_BASE;
+	madt->flags = ACPI_MADT_PCAT_COMPAT;
+
+	current = acpi_fill_madt(current);
 
 	/* (Re)calculate length and checksum */
-	ssdt->length = current - (unsigned long)ssdt;
-	ssdt->checksum = table_compute_checksum((void *)ssdt, ssdt->length);
+	header->length = current - (u32)madt;
+
+	header->checksum = table_compute_checksum((void *)madt, header->length);
+}
+
+static int acpi_create_mcfg_mmconfig(struct acpi_mcfg_mmconfig *mmconfig,
+				     u32 base, u16 seg_nr, u8 start, u8 end)
+{
+	memset(mmconfig, 0, sizeof(*mmconfig));
+	mmconfig->base_address_l = base;
+	mmconfig->base_address_h = 0;
+	mmconfig->pci_segment_group_number = seg_nr;
+	mmconfig->start_bus_number = start;
+	mmconfig->end_bus_number = end;
+
+	return sizeof(struct acpi_mcfg_mmconfig);
+}
+
+static u32 acpi_fill_mcfg(u32 current)
+{
+	current += acpi_create_mcfg_mmconfig
+		((struct acpi_mcfg_mmconfig *)current,
+		CONFIG_PCIE_ECAM_BASE, 0x0, 0x0, 255);
+
+	return current;
+}
+
+/* MCFG is defined in the PCI Firmware Specification 3.0 */
+static void acpi_create_mcfg(struct acpi_mcfg *mcfg)
+{
+	struct acpi_table_header *header = &(mcfg->header);
+	u32 current = (u32)mcfg + sizeof(struct acpi_mcfg);
+
+	memset((void *)mcfg, 0, sizeof(struct acpi_mcfg));
+
+	/* Fill out header fields */
+	acpi_fill_header(header, "MCFG");
+	header->length = sizeof(struct acpi_mcfg);
+	header->revision = 1;
+
+	current = acpi_fill_mcfg(current);
+
+	/* (Re)calculate length and checksum */
+	header->length = current - (u32)mcfg;
+	header->checksum = table_compute_checksum((void *)mcfg, header->length);
+}
+
+static void enter_acpi_mode(int pm1_cnt)
+{
+	/*
+	 * PM1_CNT register bit0 selects the power management event to be
+	 * either an SCI or SMI interrupt. When this bit is set, then power
+	 * management events will generate an SCI interrupt. When this bit
+	 * is reset power management events will generate an SMI interrupt.
+	 *
+	 * Per ACPI spec, it is the responsibility of the hardware to set
+	 * or reset this bit. OSPM always preserves this bit position.
+	 *
+	 * U-Boot does not support SMI. And we don't have plan to support
+	 * anything running in SMM within U-Boot. To create a legacy-free
+	 * system, and expose ourselves to OSPM as working under ACPI mode
+	 * already, turn this bit on.
+	 */
+	outw(PM1_CNT_SCI_EN, pm1_cnt);
 }
 
 /*
  * QEMU's version of write_acpi_tables is defined in
- * arch/x86/cpu/qemu/fw_cfg.c
+ * arch/x86/cpu/qemu/acpi_table.c
  */
 u32 write_acpi_tables(u32 start)
 {
@@ -342,18 +332,17 @@
 	struct acpi_rsdt *rsdt;
 	struct acpi_xsdt *xsdt;
 	struct acpi_facs *facs;
-	acpi_header_t *dsdt;
+	struct acpi_table_header *dsdt;
 	struct acpi_fadt *fadt;
 	struct acpi_mcfg *mcfg;
 	struct acpi_madt *madt;
-	acpi_header_t *ssdt;
 
 	current = start;
 
-	/* Align ACPI tables to 16byte */
+	/* Align ACPI tables to 16 byte */
 	current = ALIGN(current, 16);
 
-	debug("ACPI: Writing ACPI tables at %lx.\n", start);
+	debug("ACPI: Writing ACPI tables at %x\n", start);
 
 	/* We need at least an RSDP and an RSDT Table */
 	rsdp = (struct acpi_rsdp *)current;
@@ -364,7 +353,11 @@
 	current = ALIGN(current, 16);
 	xsdt = (struct acpi_xsdt *)current;
 	current += sizeof(struct acpi_xsdt);
-	current = ALIGN(current, 16);
+	/*
+	 * Per ACPI spec, the FACS table address must be aligned to a 64 byte
+	 * boundary (Windows checks this, but Linux does not).
+	 */
+	current = ALIGN(current, 64);
 
 	/* clear all table memory */
 	memset((void *)start, 0, current - start);
@@ -381,21 +374,13 @@
 	acpi_create_facs(facs);
 
 	debug("ACPI:    * DSDT\n");
-	dsdt = (acpi_header_t *)current;
-	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-	if (dsdt->length >= sizeof(acpi_header_t)) {
-		current += sizeof(acpi_header_t);
-		memcpy((char *)current,
-				(char *)&AmlCode + sizeof(acpi_header_t),
-				dsdt->length - sizeof(acpi_header_t));
-		current += dsdt->length - sizeof(acpi_header_t);
-
-		/* (Re)calculate length and checksum */
-		dsdt->length = current - (unsigned long)dsdt;
-		dsdt->checksum = 0;
-		dsdt->checksum = table_compute_checksum((void *)dsdt,
-				dsdt->length);
-	}
+	dsdt = (struct acpi_table_header *)current;
+	memcpy(dsdt, &AmlCode, sizeof(struct acpi_table_header));
+	current += sizeof(struct acpi_table_header);
+	memcpy((char *)current,
+	       (char *)&AmlCode + sizeof(struct acpi_table_header),
+	       dsdt->length - sizeof(struct acpi_table_header));
+	current += dsdt->length - sizeof(struct acpi_table_header);
 	current = ALIGN(current, 16);
 
 	debug("ACPI:    * FADT\n");
@@ -405,36 +390,29 @@
 	acpi_create_fadt(fadt, facs, dsdt);
 	acpi_add_table(rsdp, fadt);
 
-	debug("ACPI:    * MCFG\n");
-	mcfg = (struct acpi_mcfg *)current;
-	acpi_create_mcfg(mcfg);
-	if (mcfg->header.length > sizeof(struct acpi_mcfg)) {
-		current += mcfg->header.length;
-		current = ALIGN(current, 16);
-		acpi_add_table(rsdp, mcfg);
-	}
-
 	debug("ACPI:    * MADT\n");
 	madt = (struct acpi_madt *)current;
 	acpi_create_madt(madt);
-	if (madt->header.length > sizeof(struct acpi_madt)) {
-		current += madt->header.length;
-		acpi_add_table(rsdp, madt);
-	}
+	current += madt->header.length;
+	acpi_add_table(rsdp, madt);
 	current = ALIGN(current, 16);
 
-	debug("ACPI:    * SSDT\n");
-	ssdt = (acpi_header_t *)current;
-	acpi_create_ssdt_generator(ssdt, ACPI_TABLE_CREATOR);
-	if (ssdt->length > sizeof(acpi_header_t)) {
-		current += ssdt->length;
-		acpi_add_table(rsdp, ssdt);
-		current = ALIGN(current, 16);
-	}
+	debug("ACPI:    * MCFG\n");
+	mcfg = (struct acpi_mcfg *)current;
+	acpi_create_mcfg(mcfg);
+	current += mcfg->header.length;
+	acpi_add_table(rsdp, mcfg);
+	current = ALIGN(current, 16);
 
-	debug("current = %lx\n", current);
+	debug("current = %x\n", current);
 
-	debug("ACPI: done.\n");
+	debug("ACPI: done\n");
+
+	/*
+	 * Other than waiting for OSPM to request us to switch to ACPI mode,
+	 * do it by ourselves, since SMI will not be triggered.
+	 */
+	enter_acpi_mode(fadt->pm1a_cnt_blk);
 
 	return current;
 }
diff --git a/arch/x86/lib/bootm.c b/arch/x86/lib/bootm.c
index 783be69..7cf9de4 100644
--- a/arch/x86/lib/bootm.c
+++ b/arch/x86/lib/bootm.c
@@ -26,14 +26,6 @@
 
 #define COMMAND_LINE_OFFSET 0x9000
 
-/*
- * Implement a weak default function for boards that optionally
- * need to clean up the system before jumping to the kernel.
- */
-__weak void board_final_cleanup(void)
-{
-}
-
 void bootm_announce_and_cleanup(void)
 {
 	printf("\nStarting kernel ...\n\n");
@@ -45,7 +37,6 @@
 #ifdef CONFIG_BOOTSTAGE_REPORT
 	bootstage_report();
 #endif
-	board_final_cleanup();
 }
 
 #if defined(CONFIG_OF_LIBFDT) && !defined(CONFIG_OF_NO_KERNEL)
diff --git a/arch/x86/lib/coreboot_table.c b/arch/x86/lib/coreboot_table.c
index cb45a79..ceab3cf 100644
--- a/arch/x86/lib/coreboot_table.c
+++ b/arch/x86/lib/coreboot_table.c
@@ -9,6 +9,37 @@
 #include <asm/coreboot_tables.h>
 #include <asm/e820.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
+int high_table_reserve(void)
+{
+	/* adjust stack pointer to reserve space for configuration tables */
+	gd->arch.high_table_limit = gd->start_addr_sp;
+	gd->start_addr_sp -= CONFIG_HIGH_TABLE_SIZE;
+	gd->arch.high_table_ptr = gd->start_addr_sp;
+
+	/* clear the memory */
+	memset((void *)gd->arch.high_table_ptr, 0, CONFIG_HIGH_TABLE_SIZE);
+
+	gd->start_addr_sp &= ~0xf;
+
+	return 0;
+}
+
+void *high_table_malloc(size_t bytes)
+{
+	u32 new_ptr;
+	void *ptr;
+
+	new_ptr = gd->arch.high_table_ptr + bytes;
+	if (new_ptr >= gd->arch.high_table_limit)
+		return NULL;
+	ptr = (void *)gd->arch.high_table_ptr;
+	gd->arch.high_table_ptr = new_ptr;
+
+	return ptr;
+}
+
 /**
  * cb_table_init() - initialize a coreboot table header
  *
diff --git a/arch/x86/lib/pirq_routing.c b/arch/x86/lib/pirq_routing.c
index 3cc6adb..a93d355 100644
--- a/arch/x86/lib/pirq_routing.c
+++ b/arch/x86/lib/pirq_routing.c
@@ -10,7 +10,6 @@
 #include <pci.h>
 #include <asm/pci.h>
 #include <asm/pirq_routing.h>
-#include <asm/tables.h>
 
 static bool irq_already_routed[16];
 
@@ -111,9 +110,6 @@
 {
 	struct irq_routing_table *rom_rt;
 
-	/* Fix up the table checksum */
-	rt->checksum = table_compute_checksum(rt, rt->size);
-
 	/* Align the table to be 16 byte aligned */
 	addr = ALIGN(addr, 16);
 
diff --git a/arch/x86/lib/smbios.c b/arch/x86/lib/smbios.c
index 441fca9..9f30550 100644
--- a/arch/x86/lib/smbios.c
+++ b/arch/x86/lib/smbios.c
@@ -105,8 +105,8 @@
 
 	memset(t, 0, sizeof(struct smbios_type1));
 	fill_smbios_header(t, SMBIOS_SYSTEM_INFORMATION, len, handle);
-	t->manufacturer = smbios_add_string(t->eos, CONFIG_SYS_VENDOR);
-	t->product_name = smbios_add_string(t->eos, CONFIG_SYS_BOARD);
+	t->manufacturer = smbios_add_string(t->eos, CONFIG_SMBIOS_MANUFACTURER);
+	t->product_name = smbios_add_string(t->eos, CONFIG_SMBIOS_PRODUCT_NAME);
 
 	len = t->length + smbios_string_table_len(t->eos);
 	*current += len;
@@ -121,8 +121,8 @@
 
 	memset(t, 0, sizeof(struct smbios_type2));
 	fill_smbios_header(t, SMBIOS_BOARD_INFORMATION, len, handle);
-	t->manufacturer = smbios_add_string(t->eos, CONFIG_SYS_VENDOR);
-	t->product_name = smbios_add_string(t->eos, CONFIG_SYS_BOARD);
+	t->manufacturer = smbios_add_string(t->eos, CONFIG_SMBIOS_MANUFACTURER);
+	t->product_name = smbios_add_string(t->eos, CONFIG_SMBIOS_PRODUCT_NAME);
 	t->feature_flags = SMBIOS_BOARD_FEATURE_HOSTING;
 	t->board_type = SMBIOS_BOARD_MOTHERBOARD;
 
@@ -139,7 +139,7 @@
 
 	memset(t, 0, sizeof(struct smbios_type3));
 	fill_smbios_header(t, SMBIOS_SYSTEM_ENCLOSURE, len, handle);
-	t->manufacturer = smbios_add_string(t->eos, CONFIG_SYS_VENDOR);
+	t->manufacturer = smbios_add_string(t->eos, CONFIG_SMBIOS_MANUFACTURER);
 	t->chassis_type = SMBIOS_ENCLOSURE_DESKTOP;
 	t->bootup_state = SMBIOS_STATE_SAFE;
 	t->power_supply_state = SMBIOS_STATE_SAFE;
diff --git a/arch/x86/lib/tables.c b/arch/x86/lib/tables.c
index a156f2c..f92111e 100644
--- a/arch/x86/lib/tables.c
+++ b/arch/x86/lib/tables.c
@@ -80,9 +80,8 @@
 
 #ifdef CONFIG_SEABIOS
 		table_size = rom_table_end - rom_table_start;
-		high_table = (u32)memalign(ROM_TABLE_ALIGN, table_size);
+		high_table = (u32)high_table_malloc(table_size);
 		if (high_table) {
-			memset((void *)high_table, 0, table_size);
 			table_write_funcs[i](high_table);
 
 			cfg_tables[i].start = high_table;
diff --git a/board/atmel/sama5d2_ptc/Kconfig b/board/atmel/sama5d2_ptc/Kconfig
new file mode 100644
index 0000000..d2661c6
--- /dev/null
+++ b/board/atmel/sama5d2_ptc/Kconfig
@@ -0,0 +1,15 @@
+if TARGET_SAMA5D2_PTC
+
+config SYS_BOARD
+	default "sama5d2_ptc"
+
+config SYS_VENDOR
+	default "atmel"
+
+config SYS_SOC
+	default "at91"
+
+config SYS_CONFIG_NAME
+	default "sama5d2_ptc"
+
+endif
diff --git a/board/atmel/sama5d2_ptc/MAINTAINERS b/board/atmel/sama5d2_ptc/MAINTAINERS
new file mode 100644
index 0000000..7ab03d6
--- /dev/null
+++ b/board/atmel/sama5d2_ptc/MAINTAINERS
@@ -0,0 +1,7 @@
+SAMA5D2 PTC Engineering BOARD
+M:	Wenyou Yang <wenyou.yang@atmel.com>
+S:	Maintained
+F:	board/atmel/sama5d2_ptc/
+F:	include/configs/sama5d2_ptc.h
+F:	configs/sama5d2_ptc_spiflash_defconfig
+F:	configs/sama5d2_ptc_nandflash_defconfig
diff --git a/board/atmel/sama5d2_ptc/Makefile b/board/atmel/sama5d2_ptc/Makefile
new file mode 100644
index 0000000..1fe0392
--- /dev/null
+++ b/board/atmel/sama5d2_ptc/Makefile
@@ -0,0 +1,8 @@
+#
+# Copyright (C) 2016 Atmel
+#		     Wenyou Yang <wenyou.yang@atmel.com>
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y += sama5d2_ptc.o
diff --git a/board/atmel/sama5d2_ptc/sama5d2_ptc.c b/board/atmel/sama5d2_ptc/sama5d2_ptc.c
new file mode 100644
index 0000000..9e6544b
--- /dev/null
+++ b/board/atmel/sama5d2_ptc/sama5d2_ptc.c
@@ -0,0 +1,285 @@
+/*
+ * Copyright (C) 2016 Atmel
+ *		      Wenyou.Yang <wenyou.yang@atmel.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <atmel_hlcdc.h>
+#include <lcd.h>
+#include <mmc.h>
+#include <net.h>
+#include <netdev.h>
+#include <spi.h>
+#include <version.h>
+#include <asm/io.h>
+#include <asm/arch/at91_common.h>
+#include <asm/arch/atmel_pio4.h>
+#include <asm/arch/atmel_mpddrc.h>
+#include <asm/arch/atmel_usba_udc.h>
+#include <asm/arch/atmel_sdhci.h>
+#include <asm/arch/clk.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/sama5_sfr.h>
+#include <asm/arch/sama5d2.h>
+#include <asm/arch/sama5d3_smc.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int spi_cs_is_valid(unsigned int bus, unsigned int cs)
+{
+	return bus == 0 && cs == 0;
+}
+
+void spi_cs_activate(struct spi_slave *slave)
+{
+	atmel_pio4_set_pio_output(AT91_PIO_PORTA, 17, 0);
+}
+
+void spi_cs_deactivate(struct spi_slave *slave)
+{
+	atmel_pio4_set_pio_output(AT91_PIO_PORTA, 17, 1);
+}
+
+static void board_spi0_hw_init(void)
+{
+	atmel_pio4_set_a_periph(AT91_PIO_PORTA, 14, 0);
+	atmel_pio4_set_a_periph(AT91_PIO_PORTA, 15, 0);
+	atmel_pio4_set_a_periph(AT91_PIO_PORTA, 16, 0);
+
+	atmel_pio4_set_pio_output(AT91_PIO_PORTA, 17, 1);
+
+	at91_periph_clk_enable(ATMEL_ID_SPI0);
+}
+
+static void board_nand_hw_init(void)
+{
+	struct at91_smc *smc = (struct at91_smc *)ATMEL_BASE_SMC;
+	struct atmel_sfr *sfr = (struct atmel_sfr *)ATMEL_BASE_SFR;
+
+	at91_periph_clk_enable(ATMEL_ID_HSMC);
+
+	writel(AT91_SFR_EBICFG_DRIVE0_HIGH |
+	       AT91_SFR_EBICFG_PULL0_NONE |
+	       AT91_SFR_EBICFG_DRIVE1_HIGH |
+	       AT91_SFR_EBICFG_PULL1_NONE, &sfr->ebicfg);
+
+	/* Configure SMC CS3 for NAND */
+	writel(AT91_SMC_SETUP_NWE(1) | AT91_SMC_SETUP_NCS_WR(1) |
+	       AT91_SMC_SETUP_NRD(1) | AT91_SMC_SETUP_NCS_RD(1),
+	       &smc->cs[3].setup);
+	writel(AT91_SMC_PULSE_NWE(2) | AT91_SMC_PULSE_NCS_WR(3) |
+	       AT91_SMC_PULSE_NRD(2) | AT91_SMC_PULSE_NCS_RD(3),
+	       &smc->cs[3].pulse);
+	writel(AT91_SMC_CYCLE_NWE(5) | AT91_SMC_CYCLE_NRD(5),
+	       &smc->cs[3].cycle);
+	writel(AT91_SMC_TIMINGS_TCLR(2) | AT91_SMC_TIMINGS_TADL(7) |
+	       AT91_SMC_TIMINGS_TAR(2)  | AT91_SMC_TIMINGS_TRR(3)   |
+	       AT91_SMC_TIMINGS_TWB(7)  | AT91_SMC_TIMINGS_RBNSEL(3) |
+	       AT91_SMC_TIMINGS_NFSEL(1), &smc->cs[3].timings);
+	writel(AT91_SMC_MODE_RM_NRD | AT91_SMC_MODE_WM_NWE |
+	       AT91_SMC_MODE_EXNW_DISABLE |
+	       AT91_SMC_MODE_DBW_8 |
+	       AT91_SMC_MODE_TDF_CYCLE(3),
+	       &smc->cs[3].mode);
+
+	atmel_pio4_set_f_periph(AT91_PIO_PORTA, 0, 0);	/* D0 */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTA, 1, 0);	/* D1 */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTA, 2, 0);	/* D2 */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTA, 3, 0);	/* D3 */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTA, 4, 0);	/* D4 */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTA, 5, 0);	/* D5 */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTA, 6, 0);	/* D6 */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTA, 7, 0);	/* D7 */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTA, 12, 0);	/* RE */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTA, 8, 0);	/* WE */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTA, 9, 1);	/* NCS */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTA, 21, 1);	/* RDY */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTA, 10, 1);	/* ALE */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTA, 11, 1);	/* CLE */
+}
+
+static void board_usb_hw_init(void)
+{
+	atmel_pio4_set_pio_output(AT91_PIO_PORTA, 28, 1);
+}
+
+static void board_gmac_hw_init(void)
+{
+	atmel_pio4_set_f_periph(AT91_PIO_PORTB, 14, 0);	/* GTXCK */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTB, 15, 0);	/* GTXEN */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTB, 16, 0);	/* GRXDV */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTB, 17, 0);	/* GRXER */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTB, 18, 0);	/* GRX0 */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTB, 19, 0);	/* GRX1 */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTB, 20, 0);	/* GTX0 */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTB, 21, 0);	/* GTX1 */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTB, 22, 0);	/* GMDC */
+	atmel_pio4_set_f_periph(AT91_PIO_PORTB, 23, 0);	/* GMDIO */
+
+	at91_periph_clk_enable(ATMEL_ID_GMAC);
+}
+
+static void board_uart0_hw_init(void)
+{
+	atmel_pio4_set_c_periph(AT91_PIO_PORTB, 26, 1);	/* URXD0 */
+	atmel_pio4_set_c_periph(AT91_PIO_PORTB, 27, 0);	/* UTXD0 */
+
+	at91_periph_clk_enable(CONFIG_USART_ID);
+}
+
+int board_early_init_f(void)
+{
+	at91_periph_clk_enable(ATMEL_ID_PIOA);
+	at91_periph_clk_enable(ATMEL_ID_PIOB);
+	at91_periph_clk_enable(ATMEL_ID_PIOC);
+	at91_periph_clk_enable(ATMEL_ID_PIOD);
+
+	board_uart0_hw_init();
+
+	return 0;
+}
+
+int board_init(void)
+{
+	/* address of boot parameters */
+	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
+
+#ifdef CONFIG_ATMEL_SPI
+	board_spi0_hw_init();
+#endif
+#ifdef CONFIG_NAND_ATMEL
+	board_nand_hw_init();
+#endif
+#ifdef CONFIG_MACB
+	board_gmac_hw_init();
+#endif
+#ifdef CONFIG_CMD_USB
+	board_usb_hw_init();
+#endif
+#ifdef CONFIG_USB_GADGET_ATMEL_USBA
+	at91_udp_hw_init();
+#endif
+
+	return 0;
+}
+
+int dram_init(void)
+{
+	gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
+				    CONFIG_SYS_SDRAM_SIZE);
+	return 0;
+}
+
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+
+#ifdef CONFIG_MACB
+	rc = macb_eth_initialize(0, (void *)ATMEL_BASE_GMAC, 0x00);
+	if (rc)
+		printf("GMAC register failed\n");
+#endif
+
+#ifdef CONFIG_USB_GADGET_ATMEL_USBA
+	usba_udc_probe(&pdata);
+#ifdef CONFIG_USB_ETH_RNDIS
+	usb_eth_initialize(bis);
+#endif
+#endif
+
+	return rc;
+}
+
+/* SPL */
+#ifdef CONFIG_SPL_BUILD
+void spl_board_init(void)
+{
+#ifdef CONFIG_SYS_USE_SERIALFLASH
+	board_spi0_hw_init();
+#endif
+
+#ifdef CONFIG_SYS_USE_NANDFLASH
+	board_nand_hw_init();
+#endif
+}
+
+static void ddrc_conf(struct atmel_mpddrc_config *ddrc)
+{
+	ddrc->md = (ATMEL_MPDDRC_MD_DBW_32_BITS | ATMEL_MPDDRC_MD_DDR3_SDRAM);
+
+	ddrc->cr = (ATMEL_MPDDRC_CR_NC_COL_10 |
+		    ATMEL_MPDDRC_CR_NR_ROW_14 |
+		    ATMEL_MPDDRC_CR_CAS_DDR_CAS5 |
+		    ATMEL_MPDDRC_CR_DIC_DS |
+		    ATMEL_MPDDRC_CR_DIS_DLL |
+		    ATMEL_MPDDRC_CR_NB_8BANKS |
+		    ATMEL_MPDDRC_CR_DECOD_INTERLEAVED |
+		    ATMEL_MPDDRC_CR_UNAL_SUPPORTED);
+
+	ddrc->rtr = 0x511;
+
+	ddrc->tpr0 = ((6 << ATMEL_MPDDRC_TPR0_TRAS_OFFSET) |
+		      (3 << ATMEL_MPDDRC_TPR0_TRCD_OFFSET) |
+		      (4 << ATMEL_MPDDRC_TPR0_TWR_OFFSET) |
+		      (9 << ATMEL_MPDDRC_TPR0_TRC_OFFSET) |
+		      (3 << ATMEL_MPDDRC_TPR0_TRP_OFFSET) |
+		      (4 << ATMEL_MPDDRC_TPR0_TRRD_OFFSET) |
+		      (4 << ATMEL_MPDDRC_TPR0_TWTR_OFFSET) |
+		      (4 << ATMEL_MPDDRC_TPR0_TMRD_OFFSET));
+
+	ddrc->tpr1 = ((27 << ATMEL_MPDDRC_TPR1_TRFC_OFFSET) |
+		      (29 << ATMEL_MPDDRC_TPR1_TXSNR_OFFSET) |
+		      (0 << ATMEL_MPDDRC_TPR1_TXSRD_OFFSET) |
+		      (3 << ATMEL_MPDDRC_TPR1_TXP_OFFSET));
+
+	ddrc->tpr2 = ((0 << ATMEL_MPDDRC_TPR2_TXARD_OFFSET) |
+		      (0 << ATMEL_MPDDRC_TPR2_TXARDS_OFFSET) |
+		      (0 << ATMEL_MPDDRC_TPR2_TRPA_OFFSET) |
+		      (4 << ATMEL_MPDDRC_TPR2_TRTP_OFFSET) |
+		      (7 << ATMEL_MPDDRC_TPR2_TFAW_OFFSET));
+}
+
+void mem_init(void)
+{
+	struct atmel_mpddr *mpddrc = (struct atmel_mpddr *)ATMEL_BASE_MPDDRC;
+	struct atmel_mpddrc_config ddrc_config;
+	u32 reg;
+
+	ddrc_conf(&ddrc_config);
+
+	at91_periph_clk_enable(ATMEL_ID_MPDDRC);
+	at91_system_clk_enable(AT91_PMC_DDR);
+
+	reg = readl(&mpddrc->io_calibr);
+	reg &= ~ATMEL_MPDDRC_IO_CALIBR_RDIV;
+	reg |= ATMEL_MPDDRC_IO_CALIBR_DDR3_RZQ_55;
+	reg &= ~ATMEL_MPDDRC_IO_CALIBR_TZQIO;
+	reg |= ATMEL_MPDDRC_IO_CALIBR_TZQIO_(100);
+	writel(reg, &mpddrc->io_calibr);
+
+	writel(ATMEL_MPDDRC_RD_DATA_PATH_SHIFT_TWO_CYCLE,
+	       &mpddrc->rd_data_path);
+
+	ddr3_init(ATMEL_BASE_MPDDRC, ATMEL_BASE_DDRCS, &ddrc_config);
+
+	writel(0x3, &mpddrc->cal_mr4);
+	writel(64, &mpddrc->tim_cal);
+}
+
+void at91_pmc_init(void)
+{
+	at91_plla_init(AT91_PMC_PLLAR_29 |
+		       AT91_PMC_PLLXR_PLLCOUNT(0x3f) |
+		       AT91_PMC_PLLXR_MUL(82) |
+		       AT91_PMC_PLLXR_DIV(1));
+
+	at91_pllicpr_init(0);
+
+	at91_mck_init(AT91_PMC_MCKR_H32MXDIV |
+		      AT91_PMC_MCKR_PLLADIV_2 |
+		      AT91_PMC_MCKR_MDIV_3 |
+		      AT91_PMC_MCKR_CSS_PLLA);
+}
+#endif
diff --git a/board/atmel/sama5d2_xplained/sama5d2_xplained.c b/board/atmel/sama5d2_xplained/sama5d2_xplained.c
index 10edf28..93df7ba 100644
--- a/board/atmel/sama5d2_xplained/sama5d2_xplained.c
+++ b/board/atmel/sama5d2_xplained/sama5d2_xplained.c
@@ -171,10 +171,11 @@
 	atmel_pio4_set_a_periph(AT91_PIO_PORTA, 9, 0);	/* SDMMC0_DAT7 */
 	atmel_pio4_set_a_periph(AT91_PIO_PORTA, 10, 0);	/* SDMMC0_RSTN */
 	atmel_pio4_set_a_periph(AT91_PIO_PORTA, 11, 0);	/* SDMMC0_VDDSEL */
+	atmel_pio4_set_a_periph(AT91_PIO_PORTA, 13, 0);	/* SDMMC0_CD */
 
 	at91_periph_clk_enable(ATMEL_ID_SDMMC0);
 	at91_enable_periph_generated_clk(ATMEL_ID_SDMMC0,
-					 GCK_CSS_PLLA_CLK, 1);
+					 GCK_CSS_UPLL_CLK, 1);
 }
 
 static void board_sdhci1_hw_init(void)
@@ -190,7 +191,7 @@
 
 	at91_periph_clk_enable(ATMEL_ID_SDMMC1);
 	at91_enable_periph_generated_clk(ATMEL_ID_SDMMC1,
-					 GCK_CSS_PLLA_CLK, 1);
+					 GCK_CSS_UPLL_CLK, 1);
 }
 
 int board_mmc_init(bd_t *bis)
diff --git a/board/cm5200/fwupdate.c b/board/cm5200/fwupdate.c
index 2ed90de..4740c83 100644
--- a/board/cm5200/fwupdate.c
+++ b/board/cm5200/fwupdate.c
@@ -105,7 +105,7 @@
 
 	/* Detect storage device */
 	for (devno = 0; devno < USB_MAX_STOR_DEV; devno++) {
-		stor_dev = usb_stor_get_dev(devno);
+		stor_dev = blk_get_devnum_by_type(IF_TYPE_USB, devno);
 		if (stor_dev->type != DEV_TYPE_UNKNOWN)
 			break;
 	}
diff --git a/board/compulab/common/eeprom.c b/board/compulab/common/eeprom.c
index 6304468..b5f1aa6 100644
--- a/board/compulab/common/eeprom.c
+++ b/board/compulab/common/eeprom.c
@@ -9,6 +9,9 @@
 
 #include <common.h>
 #include <i2c.h>
+#include <eeprom_layout.h>
+#include <eeprom_field.h>
+#include <linux/kernel.h>
 #include "eeprom.h"
 
 #ifndef CONFIG_SYS_I2C_EEPROM_ADDR
@@ -181,3 +184,344 @@
 
 	return err;
 }
+
+#ifdef CONFIG_CMD_EEPROM_LAYOUT
+/**
+ * eeprom_field_print_bin_ver() - print a "version field" which contains binary
+ *				  data
+ *
+ * Treat the field data as simple binary data, and print it formatted as a
+ * version number (2 digits after decimal point).
+ * The field size must be exactly 2 bytes.
+ *
+ * Sample output:
+ *      Field Name      123.45
+ *
+ * @field:	an initialized field to print
+ */
+void eeprom_field_print_bin_ver(const struct eeprom_field *field)
+{
+	if ((field->buf[0] == 0xff) && (field->buf[1] == 0xff)) {
+		field->buf[0] = 0;
+		field->buf[1] = 0;
+	}
+
+	printf(PRINT_FIELD_SEGMENT, field->name);
+	int major = (field->buf[1] << 8 | field->buf[0]) / 100;
+	int minor = (field->buf[1] << 8 | field->buf[0]) - major * 100;
+	printf("%d.%02d\n", major, minor);
+}
+
+/**
+ * eeprom_field_update_bin_ver() - update a "version field" which contains
+ *				   binary data
+ *
+ * This function takes a version string in the form of x.y (x and y are both
+ * decimal values, y is limited to two digits), translates it to the binary
+ * form, then writes it to the field. The field size must be exactly 2 bytes.
+ *
+ * This function strictly enforces the data syntax, and will not update the
+ * field if there's any deviation from it. It also protects from overflow.
+ *
+ * @field:	an initialized field
+ * @value:	a version string
+ *
+ * Returns 0 on success, -1 on failure.
+ */
+int eeprom_field_update_bin_ver(struct eeprom_field *field, char *value)
+{
+	char *endptr;
+	char *tok = strtok(value, ".");
+	if (tok == NULL)
+		return -1;
+
+	int num = simple_strtol(tok, &endptr, 0);
+	if (*endptr != '\0')
+		return -1;
+
+	tok = strtok(NULL, "");
+	if (tok == NULL)
+		return -1;
+
+	int remainder = simple_strtol(tok, &endptr, 0);
+	if (*endptr != '\0')
+		return -1;
+
+	num = num * 100 + remainder;
+	if (num >> 16)
+		return -1;
+
+	field->buf[0] = (unsigned char)num;
+	field->buf[1] = num >> 8;
+
+	return 0;
+}
+
+char *months[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
+		    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
+
+/**
+ * eeprom_field_print_date() - print a field which contains date data
+ *
+ * Treat the field data as simple binary data, and print it formatted as a date.
+ * Sample output:
+ *      Field Name      07/Feb/2014
+ *      Field Name      56/BAD/9999
+ *
+ * @field:	an initialized field to print
+ */
+void eeprom_field_print_date(const struct eeprom_field *field)
+{
+	printf(PRINT_FIELD_SEGMENT, field->name);
+	printf("%02d/", field->buf[0]);
+	if (field->buf[1] >= 1 && field->buf[1] <= 12)
+		printf("%s", months[field->buf[1] - 1]);
+	else
+		printf("BAD");
+
+	printf("/%d\n", field->buf[3] << 8 | field->buf[2]);
+}
+
+static int validate_date(unsigned char day, unsigned char month,
+			unsigned int year)
+{
+	int days_in_february;
+
+	switch (month) {
+	case 0:
+	case 2:
+	case 4:
+	case 6:
+	case 7:
+	case 9:
+	case 11:
+		if (day > 31)
+			return -1;
+		break;
+	case 3:
+	case 5:
+	case 8:
+	case 10:
+		if (day > 30)
+			return -1;
+		break;
+	case 1:
+		days_in_february = 28;
+		if (year % 4 == 0) {
+			if (year % 100 != 0)
+				days_in_february = 29;
+			else if (year % 400 == 0)
+				days_in_february = 29;
+		}
+
+		if (day > days_in_february)
+			return -1;
+
+		break;
+	default:
+		return -1;
+	}
+
+	return 0;
+}
+
+/**
+ * eeprom_field_update_date() - update a date field which contains binary data
+ *
+ * This function takes a date string in the form of x/Mon/y (x and y are both
+ * decimal values), translates it to the binary representation, then writes it
+ * to the field.
+ *
+ * This function strictly enforces the data syntax, and will not update the
+ * field if there's any deviation from it. It also protects from overflow in the
+ * year value, and checks the validity of the date.
+ *
+ * @field:	an initialized field
+ * @value:	a date string
+ *
+ * Returns 0 on success, -1 on failure.
+ */
+int eeprom_field_update_date(struct eeprom_field *field, char *value)
+{
+	char *endptr;
+	char *tok1 = strtok(value, "/");
+	char *tok2 = strtok(NULL, "/");
+	char *tok3 = strtok(NULL, "/");
+
+	if (tok1 == NULL || tok2 == NULL || tok3 == NULL) {
+		printf("%s: syntax error\n", field->name);
+		return -1;
+	}
+
+	unsigned char day = (unsigned char)simple_strtol(tok1, &endptr, 0);
+	if (*endptr != '\0' || day == 0) {
+		printf("%s: invalid day\n", field->name);
+		return -1;
+	}
+
+	unsigned char month;
+	for (month = 1; month <= 12; month++)
+		if (!strcmp(tok2, months[month - 1]))
+			break;
+
+	unsigned int year = simple_strtol(tok3, &endptr, 0);
+	if (*endptr != '\0') {
+		printf("%s: invalid year\n", field->name);
+		return -1;
+	}
+
+	if (validate_date(day, month - 1, year)) {
+		printf("%s: invalid date\n", field->name);
+		return -1;
+	}
+
+	if (year >> 16) {
+		printf("%s: year overflow\n", field->name);
+		return -1;
+	}
+
+	field->buf[0] = day;
+	field->buf[1] = month;
+	field->buf[2] = (unsigned char)year;
+	field->buf[3] = (unsigned char)(year >> 8);
+
+	return 0;
+}
+
+#define	LAYOUT_VERSION_LEGACY 1
+#define	LAYOUT_VERSION_VER1 2
+#define	LAYOUT_VERSION_VER2 3
+#define	LAYOUT_VERSION_VER3 4
+
+extern struct eeprom_field layout_unknown[1];
+
+#define DEFINE_PRINT_UPDATE(x) eeprom_field_print_##x, eeprom_field_update_##x
+
+#ifdef CONFIG_CM_T3X
+struct eeprom_field layout_legacy[5] = {
+	{ "MAC address",          6, NULL, DEFINE_PRINT_UPDATE(mac) },
+	{ "Board Revision",       2, NULL, DEFINE_PRINT_UPDATE(bin) },
+	{ "Serial Number",        8, NULL, DEFINE_PRINT_UPDATE(bin) },
+	{ "Board Configuration", 64, NULL, DEFINE_PRINT_UPDATE(ascii) },
+	{ RESERVED_FIELDS,      176, NULL, eeprom_field_print_reserved,
+					   eeprom_field_update_ascii },
+};
+#else
+#define layout_legacy layout_unknown
+#endif
+
+#if defined(CONFIG_CM_T3X) || defined(CONFIG_CM_T3517)
+struct eeprom_field layout_v1[12] = {
+	{ "Major Revision",      2, NULL, DEFINE_PRINT_UPDATE(bin_ver) },
+	{ "Minor Revision",      2, NULL, DEFINE_PRINT_UPDATE(bin_ver) },
+	{ "1st MAC Address",     6, NULL, DEFINE_PRINT_UPDATE(mac) },
+	{ "2nd MAC Address",     6, NULL, DEFINE_PRINT_UPDATE(mac) },
+	{ "Production Date",     4, NULL, DEFINE_PRINT_UPDATE(date) },
+	{ "Serial Number",      12, NULL, DEFINE_PRINT_UPDATE(bin_rev) },
+	{ RESERVED_FIELDS,      96, NULL, DEFINE_PRINT_UPDATE(reserved) },
+	{ "Product Name",       16, NULL, DEFINE_PRINT_UPDATE(ascii) },
+	{ "Product Options #1", 16, NULL, DEFINE_PRINT_UPDATE(ascii) },
+	{ "Product Options #2", 16, NULL, DEFINE_PRINT_UPDATE(ascii) },
+	{ "Product Options #3", 16, NULL, DEFINE_PRINT_UPDATE(ascii) },
+	{ RESERVED_FIELDS,      64, NULL, eeprom_field_print_reserved,
+					  eeprom_field_update_ascii },
+};
+#else
+#define layout_v1 layout_unknown
+#endif
+
+struct eeprom_field layout_v2[15] = {
+	{ "Major Revision",            2, NULL, DEFINE_PRINT_UPDATE(bin_ver) },
+	{ "Minor Revision",            2, NULL, DEFINE_PRINT_UPDATE(bin_ver) },
+	{ "1st MAC Address",           6, NULL, DEFINE_PRINT_UPDATE(mac) },
+	{ "2nd MAC Address",           6, NULL, DEFINE_PRINT_UPDATE(mac) },
+	{ "Production Date",           4, NULL, DEFINE_PRINT_UPDATE(date) },
+	{ "Serial Number",            12, NULL, DEFINE_PRINT_UPDATE(bin_rev) },
+	{ "3rd MAC Address (WIFI)",    6, NULL, DEFINE_PRINT_UPDATE(mac) },
+	{ "4th MAC Address (Bluetooth)", 6, NULL, DEFINE_PRINT_UPDATE(mac) },
+	{ "Layout Version",            1, NULL, DEFINE_PRINT_UPDATE(bin) },
+	{ RESERVED_FIELDS,            83, NULL, DEFINE_PRINT_UPDATE(reserved) },
+	{ "Product Name",             16, NULL, DEFINE_PRINT_UPDATE(ascii) },
+	{ "Product Options #1",       16, NULL, DEFINE_PRINT_UPDATE(ascii) },
+	{ "Product Options #2",       16, NULL, DEFINE_PRINT_UPDATE(ascii) },
+	{ "Product Options #3",       16, NULL, DEFINE_PRINT_UPDATE(ascii) },
+	{ RESERVED_FIELDS,            64, NULL, eeprom_field_print_reserved,
+						eeprom_field_update_ascii },
+};
+
+struct eeprom_field layout_v3[16] = {
+	{ "Major Revision",            2, NULL, DEFINE_PRINT_UPDATE(bin_ver) },
+	{ "Minor Revision",            2, NULL, DEFINE_PRINT_UPDATE(bin_ver) },
+	{ "1st MAC Address",           6, NULL, DEFINE_PRINT_UPDATE(mac) },
+	{ "2nd MAC Address",           6, NULL, DEFINE_PRINT_UPDATE(mac) },
+	{ "Production Date",           4, NULL, DEFINE_PRINT_UPDATE(date) },
+	{ "Serial Number",            12, NULL, DEFINE_PRINT_UPDATE(bin_rev) },
+	{ "3rd MAC Address (WIFI)",    6, NULL, DEFINE_PRINT_UPDATE(mac) },
+	{ "4th MAC Address (Bluetooth)", 6, NULL, DEFINE_PRINT_UPDATE(mac) },
+	{ "Layout Version",            1, NULL, DEFINE_PRINT_UPDATE(bin) },
+	{ "CompuLab EEPROM ID",        3, NULL, DEFINE_PRINT_UPDATE(bin) },
+	{ RESERVED_FIELDS,            80, NULL, DEFINE_PRINT_UPDATE(reserved) },
+	{ "Product Name",             16, NULL, DEFINE_PRINT_UPDATE(ascii) },
+	{ "Product Options #1",       16, NULL, DEFINE_PRINT_UPDATE(ascii) },
+	{ "Product Options #2",       16, NULL, DEFINE_PRINT_UPDATE(ascii) },
+	{ "Product Options #3",       16, NULL, DEFINE_PRINT_UPDATE(ascii) },
+	{ RESERVED_FIELDS,            64, NULL, eeprom_field_print_reserved,
+						eeprom_field_update_ascii },
+};
+
+void eeprom_layout_assign(struct eeprom_layout *layout, int layout_version)
+{
+	switch (layout->layout_version) {
+	case LAYOUT_VERSION_LEGACY:
+		layout->fields = layout_legacy;
+		layout->num_of_fields = ARRAY_SIZE(layout_legacy);
+		break;
+	case LAYOUT_VERSION_VER1:
+		layout->fields = layout_v1;
+		layout->num_of_fields = ARRAY_SIZE(layout_v1);
+		break;
+	case LAYOUT_VERSION_VER2:
+		layout->fields = layout_v2;
+		layout->num_of_fields = ARRAY_SIZE(layout_v2);
+		break;
+	case LAYOUT_VERSION_VER3:
+		layout->fields = layout_v3;
+		layout->num_of_fields = ARRAY_SIZE(layout_v3);
+		break;
+	default:
+		__eeprom_layout_assign(layout, layout_version);
+	}
+}
+
+int eeprom_parse_layout_version(char *str)
+{
+	if (!strcmp(str, "legacy"))
+		return LAYOUT_VERSION_LEGACY;
+	else if (!strcmp(str, "v1"))
+		return LAYOUT_VERSION_VER1;
+	else if (!strcmp(str, "v2"))
+		return LAYOUT_VERSION_VER2;
+	else if (!strcmp(str, "v3"))
+		return LAYOUT_VERSION_VER3;
+	else
+		return LAYOUT_VERSION_UNRECOGNIZED;
+}
+
+int eeprom_layout_detect(unsigned char *data)
+{
+	switch (data[EEPROM_LAYOUT_VER_OFFSET]) {
+	case 0xff:
+	case 0:
+		return LAYOUT_VERSION_VER1;
+	case 2:
+		return LAYOUT_VERSION_VER2;
+	case 3:
+		return LAYOUT_VERSION_VER3;
+	}
+
+	if (data[EEPROM_LAYOUT_VER_OFFSET] >= 0x20)
+		return LAYOUT_VERSION_LEGACY;
+
+	return LAYOUT_VERSION_UNRECOGNIZED;
+}
+#endif
diff --git a/board/congatec/conga-qeval20-qa3-e3845/.gitignore b/board/congatec/conga-qeval20-qa3-e3845/.gitignore
new file mode 100644
index 0000000..6eb8a54
--- /dev/null
+++ b/board/congatec/conga-qeval20-qa3-e3845/.gitignore
@@ -0,0 +1,3 @@
+dsdt.aml
+dsdt.asl.tmp
+dsdt.c
diff --git a/board/congatec/conga-qeval20-qa3-e3845/Makefile b/board/congatec/conga-qeval20-qa3-e3845/Makefile
index 23b8748..b784510 100644
--- a/board/congatec/conga-qeval20-qa3-e3845/Makefile
+++ b/board/congatec/conga-qeval20-qa3-e3845/Makefile
@@ -5,3 +5,4 @@
 #
 
 obj-y	+= conga-qeval20-qa3.o start.o
+obj-$(CONFIG_GENERATE_ACPI_TABLE) += dsdt.o
diff --git a/board/congatec/conga-qeval20-qa3-e3845/acpi/mainboard.asl b/board/congatec/conga-qeval20-qa3-e3845/acpi/mainboard.asl
new file mode 100644
index 0000000..eace459
--- /dev/null
+++ b/board/congatec/conga-qeval20-qa3-e3845/acpi/mainboard.asl
@@ -0,0 +1,13 @@
+/*
+ * Copyright (C) 2016, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/* Power Button */
+Device (PWRB)
+{
+	Name(_HID, EISAID("PNP0C0C"))
+}
+
+/* TODO: Need add Winbond SuperIO chipset W83627 ASL codes */
diff --git a/board/congatec/conga-qeval20-qa3-e3845/dsdt.asl b/board/congatec/conga-qeval20-qa3-e3845/dsdt.asl
new file mode 100644
index 0000000..6042011
--- /dev/null
+++ b/board/congatec/conga-qeval20-qa3-e3845/dsdt.asl
@@ -0,0 +1,14 @@
+/*
+ * Copyright (C) 2016, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+DefinitionBlock("dsdt.aml", "DSDT", 2, "U-BOOT", "U-BOOTBL", 0x00010000)
+{
+	/* platform specific */
+	#include <asm/arch/acpi/platform.asl>
+
+	/* board specific */
+	#include "acpi/mainboard.asl"
+}
diff --git a/board/imgtec/malta/lowlevel_init.S b/board/imgtec/malta/lowlevel_init.S
index ae09c27..534db1d 100644
--- a/board/imgtec/malta/lowlevel_init.S
+++ b/board/imgtec/malta/lowlevel_init.S
@@ -24,7 +24,6 @@
 
 	.text
 	.set noreorder
-	.set mips32
 
 	.globl	lowlevel_init
 lowlevel_init:
diff --git a/board/intel/bayleybay/.gitignore b/board/intel/bayleybay/.gitignore
new file mode 100644
index 0000000..6eb8a54
--- /dev/null
+++ b/board/intel/bayleybay/.gitignore
@@ -0,0 +1,3 @@
+dsdt.aml
+dsdt.asl.tmp
+dsdt.c
diff --git a/board/intel/bayleybay/Makefile b/board/intel/bayleybay/Makefile
index 88b5aad..52dda7d 100644
--- a/board/intel/bayleybay/Makefile
+++ b/board/intel/bayleybay/Makefile
@@ -5,3 +5,4 @@
 #
 
 obj-y	+= bayleybay.o start.o
+obj-$(CONFIG_GENERATE_ACPI_TABLE) += dsdt.o
diff --git a/board/intel/bayleybay/acpi/mainboard.asl b/board/intel/bayleybay/acpi/mainboard.asl
new file mode 100644
index 0000000..21785ea
--- /dev/null
+++ b/board/intel/bayleybay/acpi/mainboard.asl
@@ -0,0 +1,11 @@
+/*
+ * Copyright (C) 2016, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/* Power Button */
+Device (PWRB)
+{
+	Name(_HID, EISAID("PNP0C0C"))
+}
diff --git a/board/intel/bayleybay/dsdt.asl b/board/intel/bayleybay/dsdt.asl
new file mode 100644
index 0000000..6042011
--- /dev/null
+++ b/board/intel/bayleybay/dsdt.asl
@@ -0,0 +1,14 @@
+/*
+ * Copyright (C) 2016, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+DefinitionBlock("dsdt.aml", "DSDT", 2, "U-BOOT", "U-BOOTBL", 0x00010000)
+{
+	/* platform specific */
+	#include <asm/arch/acpi/platform.asl>
+
+	/* board specific */
+	#include "acpi/mainboard.asl"
+}
diff --git a/board/intel/galileo/Kconfig b/board/intel/galileo/Kconfig
index 6515bac..87a0ec4 100644
--- a/board/intel/galileo/Kconfig
+++ b/board/intel/galileo/Kconfig
@@ -21,4 +21,15 @@
 	select INTEL_QUARK
 	select BOARD_ROMSIZE_KB_1024
 
+config SMBIOS_PRODUCT_NAME
+	default "GalileoGen2"
+	help
+	  Override the default product name U-Boot reports in the SMBIOS
+	  table, to be compatible with the Intel provided UEFI BIOS, as
+	  Linux kernel drivers (drivers/mfd/intel_quark_i2c_gpio.c and
+	  drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c) make use of
+	  it to do different board level configuration.
+
+	  This can be "Galileo" for GEN1 Galileo board.
+
 endif
diff --git a/board/intel/minnowmax/.gitignore b/board/intel/minnowmax/.gitignore
new file mode 100644
index 0000000..6eb8a54
--- /dev/null
+++ b/board/intel/minnowmax/.gitignore
@@ -0,0 +1,3 @@
+dsdt.aml
+dsdt.asl.tmp
+dsdt.c
diff --git a/board/intel/minnowmax/Makefile b/board/intel/minnowmax/Makefile
index 1a61432..73e5a8f 100644
--- a/board/intel/minnowmax/Makefile
+++ b/board/intel/minnowmax/Makefile
@@ -5,3 +5,4 @@
 #
 
 obj-y	+= minnowmax.o start.o
+obj-$(CONFIG_GENERATE_ACPI_TABLE) += dsdt.o
diff --git a/board/intel/minnowmax/acpi/mainboard.asl b/board/intel/minnowmax/acpi/mainboard.asl
new file mode 100644
index 0000000..21785ea
--- /dev/null
+++ b/board/intel/minnowmax/acpi/mainboard.asl
@@ -0,0 +1,11 @@
+/*
+ * Copyright (C) 2016, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/* Power Button */
+Device (PWRB)
+{
+	Name(_HID, EISAID("PNP0C0C"))
+}
diff --git a/board/intel/minnowmax/dsdt.asl b/board/intel/minnowmax/dsdt.asl
new file mode 100644
index 0000000..6042011
--- /dev/null
+++ b/board/intel/minnowmax/dsdt.asl
@@ -0,0 +1,14 @@
+/*
+ * Copyright (C) 2016, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+DefinitionBlock("dsdt.aml", "DSDT", 2, "U-BOOT", "U-BOOTBL", 0x00010000)
+{
+	/* platform specific */
+	#include <asm/arch/acpi/platform.asl>
+
+	/* board specific */
+	#include "acpi/mainboard.asl"
+}
diff --git a/board/keymile/km83xx/km83xx_i2c.c b/board/keymile/km83xx/km83xx_i2c.c
index c961937..f0b528d 100644
--- a/board/keymile/km83xx/km83xx_i2c.c
+++ b/board/keymile/km83xx/km83xx_i2c.c
@@ -13,31 +13,33 @@
 
 static void i2c_write_start_seq(void)
 {
-	struct fsl_i2c *dev;
-	dev = (struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_I2C_OFFSET);
+	struct fsl_i2c_base *base;
+	base = (struct fsl_i2c_base *)(CONFIG_SYS_IMMR +
+			CONFIG_SYS_I2C_OFFSET);
 	udelay(DELAY_ABORT_SEQ);
-	out_8(&dev->cr, (I2C_CR_MEN | I2C_CR_MSTA));
+	out_8(&base->cr, (I2C_CR_MEN | I2C_CR_MSTA));
 	udelay(DELAY_ABORT_SEQ);
-	out_8(&dev->cr, (I2C_CR_MEN));
+	out_8(&base->cr, (I2C_CR_MEN));
 }
 
 int i2c_make_abort(void)
 {
-	struct fsl_i2c *dev;
-	dev = (struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_I2C_OFFSET);
+	struct fsl_i2c_base *base;
+	base = (struct fsl_i2c_base *)(CONFIG_SYS_IMMR +
+			CONFIG_SYS_I2C_OFFSET);
 	uchar   last;
 	int     nbr_read = 0;
 	int     i = 0;
 	int	    ret = 0;
 
 	/* wait after each operation to finsh with a delay */
-	out_8(&dev->cr, (I2C_CR_MSTA));
+	out_8(&base->cr, (I2C_CR_MSTA));
 	udelay(DELAY_ABORT_SEQ);
-	out_8(&dev->cr, (I2C_CR_MEN | I2C_CR_MSTA));
+	out_8(&base->cr, (I2C_CR_MEN | I2C_CR_MSTA));
 	udelay(DELAY_ABORT_SEQ);
-	in_8(&dev->dr);
+	in_8(&base->dr);
 	udelay(DELAY_ABORT_SEQ);
-	last = in_8(&dev->dr);
+	last = in_8(&base->dr);
 	nbr_read++;
 
 	/*
@@ -47,7 +49,7 @@
 	while (((last & 0x01) != 0x01) &&
 		(nbr_read < CONFIG_SYS_IVM_EEPROM_MAX_LEN)) {
 		udelay(DELAY_ABORT_SEQ);
-		last = in_8(&dev->dr);
+		last = in_8(&base->dr);
 		nbr_read++;
 	}
 	if ((last & 0x01) != 0x01)
@@ -56,10 +58,10 @@
 		printf("[INFO] i2c abort after %d bytes (0x%02x)\n",
 			nbr_read, last);
 	udelay(DELAY_ABORT_SEQ);
-	out_8(&dev->cr, (I2C_CR_MEN));
+	out_8(&base->cr, (I2C_CR_MEN));
 	udelay(DELAY_ABORT_SEQ);
 	/* clear status reg */
-	out_8(&dev->sr, 0);
+	out_8(&base->sr, 0);
 
 	for (i = 0; i < 5; i++)
 		i2c_write_start_seq();
diff --git a/board/mpl/pip405/README b/board/mpl/pip405/README
index e900c56..f039817 100644
--- a/board/mpl/pip405/README
+++ b/board/mpl/pip405/README
@@ -32,8 +32,8 @@
 - include/cmd_bsp.h		added PIP405 commands definitions
 - include/cmd_condefs.h		added Floppy and SCSI support
 - include/cmd_disk.h		changed to work with block device description
-- include/config_LANTEC.h	excluded CONFIG_CMD_FDC and CONFIG_CMD_SCSI
-- include/config_hymod.h	excluded CONFIG_CMD_FDC and CONFIG_CMD_SCSI
+- include/config_LANTEC.h	excluded CONFIG_CMD_FDC and CONFIG_SCSI
+- include/config_hymod.h	excluded CONFIG_CMD_FDC and CONFIG_SCSI
 - include/flash.h		added INTEL_ID_28F320C3T  0x88C488C4
 - include/i2c.h			added "defined(CONFIG_PIP405)"
 - include/image.h		added IH_OS_U_BOOT, IH_TYPE_FIRMWARE
@@ -86,7 +86,7 @@
 
 New Commands:
 -------------
-CONFIG_CMD_SCSI	SCSI Support
+CONFIG_SCSI	SCSI Support
 CONFIG_CMF_FDC	Floppy disk support
 
 IDE additions:
diff --git a/board/qca/ap121/Kconfig b/board/qca/ap121/Kconfig
new file mode 100644
index 0000000..f7e768a
--- /dev/null
+++ b/board/qca/ap121/Kconfig
@@ -0,0 +1,12 @@
+if TARGET_AP121
+
+config SYS_VENDOR
+	default "qca"
+
+config SYS_BOARD
+	default "ap121"
+
+config SYS_CONFIG_NAME
+	default "ap121"
+
+endif
diff --git a/board/qca/ap121/MAINTAINERS b/board/qca/ap121/MAINTAINERS
new file mode 100644
index 0000000..8b02988
--- /dev/null
+++ b/board/qca/ap121/MAINTAINERS
@@ -0,0 +1,6 @@
+AP121 BOARD
+M:	Wills Wang <wills.wang@live.com>
+S:	Maintained
+F:	board/qca/ap121/
+F:	include/configs/ap121.h
+F:	configs/ap121_defconfig
diff --git a/board/qca/ap121/Makefile b/board/qca/ap121/Makefile
new file mode 100644
index 0000000..ced5432
--- /dev/null
+++ b/board/qca/ap121/Makefile
@@ -0,0 +1,5 @@
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y	= ap121.o
diff --git a/board/qca/ap121/ap121.c b/board/qca/ap121/ap121.c
new file mode 100644
index 0000000..d6c60fe
--- /dev/null
+++ b/board/qca/ap121/ap121.c
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/ddr.h>
+#include <debug_uart.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_DEBUG_UART_BOARD_INIT
+void board_debug_uart_init(void)
+{
+	void __iomem *regs;
+	u32 val;
+
+	regs = map_physmem(AR71XX_GPIO_BASE, AR71XX_GPIO_SIZE,
+			   MAP_NOCACHE);
+
+	/*
+	 * GPIO9 as input, GPIO10 as output
+	 */
+	val = readl(regs + AR71XX_GPIO_REG_OE);
+	val &= ~AR933X_GPIO(9);
+	val |= AR933X_GPIO(10);
+	writel(val, regs + AR71XX_GPIO_REG_OE);
+
+	/*
+	 * Enable UART, GPIO9 as UART_SI, GPIO10 as UART_SO
+	 */
+	val = readl(regs + AR71XX_GPIO_REG_FUNC);
+	val |= AR933X_GPIO_FUNC_UART_EN | AR933X_GPIO_FUNC_RES_TRUE;
+	writel(val, regs + AR71XX_GPIO_REG_FUNC);
+}
+#endif
+
+int board_early_init_f(void)
+{
+#ifdef CONFIG_DEBUG_UART
+	debug_uart_init();
+#endif
+	ddr_init();
+	return 0;
+}
diff --git a/board/qca/ap143/Kconfig b/board/qca/ap143/Kconfig
new file mode 100644
index 0000000..4cdac0d
--- /dev/null
+++ b/board/qca/ap143/Kconfig
@@ -0,0 +1,12 @@
+if TARGET_AP143
+
+config SYS_VENDOR
+	default "qca"
+
+config SYS_BOARD
+	default "ap143"
+
+config SYS_CONFIG_NAME
+	default "ap143"
+
+endif
diff --git a/board/qca/ap143/MAINTAINERS b/board/qca/ap143/MAINTAINERS
new file mode 100644
index 0000000..11cb14f
--- /dev/null
+++ b/board/qca/ap143/MAINTAINERS
@@ -0,0 +1,6 @@
+AP143 BOARD
+M:	Wills Wang <wills.wang@live.com>
+S:	Maintained
+F:	board/qca/ap143/
+F:	include/configs/ap143.h
+F:	configs/ap143_defconfig
diff --git a/board/qca/ap143/Makefile b/board/qca/ap143/Makefile
new file mode 100644
index 0000000..00f7837
--- /dev/null
+++ b/board/qca/ap143/Makefile
@@ -0,0 +1,5 @@
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y	= ap143.o
diff --git a/board/qca/ap143/ap143.c b/board/qca/ap143/ap143.c
new file mode 100644
index 0000000..1572472
--- /dev/null
+++ b/board/qca/ap143/ap143.c
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/ddr.h>
+#include <debug_uart.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_DEBUG_UART_BOARD_INIT
+void board_debug_uart_init(void)
+{
+	void __iomem *regs;
+	u32 val;
+
+	regs = map_physmem(AR71XX_GPIO_BASE, AR71XX_GPIO_SIZE,
+			   MAP_NOCACHE);
+
+	/*
+	 * GPIO9 as input, GPIO10 as output
+	 */
+	val = readl(regs + AR71XX_GPIO_REG_OE);
+	val |= QCA953X_GPIO(9);
+	val &= ~QCA953X_GPIO(10);
+	writel(val, regs + AR71XX_GPIO_REG_OE);
+
+	/*
+	 * Enable GPIO10 as UART0_SOUT
+	 */
+	val = readl(regs + QCA953X_GPIO_REG_OUT_FUNC2);
+	val &= ~QCA953X_GPIO_MUX_MASK(16);
+	val |= QCA953X_GPIO_OUT_MUX_UART0_SOUT << 16;
+	writel(val, regs + QCA953X_GPIO_REG_OUT_FUNC2);
+
+	/*
+	 * Enable GPIO9 as UART0_SIN
+	 */
+	val = readl(regs + QCA953X_GPIO_REG_IN_ENABLE0);
+	val &= ~QCA953X_GPIO_MUX_MASK(8);
+	val |= QCA953X_GPIO_IN_MUX_UART0_SIN << 8;
+	writel(val, regs + QCA953X_GPIO_REG_IN_ENABLE0);
+
+	/*
+	 * Enable GPIO10 output
+	 */
+	val = readl(regs + AR71XX_GPIO_REG_OUT);
+	val |= QCA953X_GPIO(10);
+	writel(val, regs + AR71XX_GPIO_REG_OUT);
+}
+#endif
+
+int board_early_init_f(void)
+{
+#ifdef CONFIG_DEBUG_UART
+	debug_uart_init();
+#endif
+	ddr_init();
+	return 0;
+}
diff --git a/board/sandbox/MAINTAINERS b/board/sandbox/MAINTAINERS
index 10d88a2..f5db773 100644
--- a/board/sandbox/MAINTAINERS
+++ b/board/sandbox/MAINTAINERS
@@ -4,3 +4,10 @@
 F:	board/sandbox/
 F:	include/configs/sandbox.h
 F:	configs/sandbox_defconfig
+
+SANDBOX_NOBLK BOARD
+M:	Simon Glass <sjg@chromium.org>
+S:	Maintained
+F:	board/sandbox/
+F:	include/configs/sandbox.h
+F:	configs/sandbox_noblk_defconfig
diff --git a/board/tplink/wdr4300/Kconfig b/board/tplink/wdr4300/Kconfig
new file mode 100644
index 0000000..902abf5
--- /dev/null
+++ b/board/tplink/wdr4300/Kconfig
@@ -0,0 +1,15 @@
+if BOARD_TPLINK_WDR4300
+
+config SYS_VENDOR
+	default "tplink"
+
+config SYS_SOC
+	default "ath79"
+
+config SYS_BOARD
+	default "wdr4300"
+
+config SYS_CONFIG_NAME
+	default "tplink_wdr4300"
+
+endif
diff --git a/board/tplink/wdr4300/MAINTAINERS b/board/tplink/wdr4300/MAINTAINERS
new file mode 100644
index 0000000..db239c2
--- /dev/null
+++ b/board/tplink/wdr4300/MAINTAINERS
@@ -0,0 +1,6 @@
+TPLINK_WDR4300 BOARD
+M:	Marek Vasut <marex@denx.de>
+S:	Maintained
+F:	board/tplink/wdr4300/
+F:	include/configs/tplink_wdr4300.h
+F:	configs/tplink_wdr4300_defconfig
diff --git a/board/tplink/wdr4300/Makefile b/board/tplink/wdr4300/Makefile
new file mode 100644
index 0000000..4f0c296
--- /dev/null
+++ b/board/tplink/wdr4300/Makefile
@@ -0,0 +1,5 @@
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y	= wdr4300.o
diff --git a/board/tplink/wdr4300/wdr4300.c b/board/tplink/wdr4300/wdr4300.c
new file mode 100644
index 0000000..6e070fd
--- /dev/null
+++ b/board/tplink/wdr4300/wdr4300.c
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2016 Marek Vasut <marex@denx.de>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ath79.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/ddr.h>
+#include <debug_uart.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_USB
+static void wdr4300_usb_start(void)
+{
+	void __iomem *gpio_regs = map_physmem(AR71XX_GPIO_BASE,
+					      AR71XX_GPIO_SIZE, MAP_NOCACHE);
+	if (!gpio_regs)
+		return;
+
+	/* Power up the USB HUB. */
+	clrbits_be32(gpio_regs + AR71XX_GPIO_REG_OE, BIT(21) | BIT(22));
+	writel(BIT(21) | BIT(22), gpio_regs + AR71XX_GPIO_REG_SET);
+	mdelay(1);
+
+	ath79_usb_reset();
+}
+#else
+static inline void wdr4300_usb_start(void) {}
+#endif
+
+#ifdef CONFIG_BOARD_EARLY_INIT_F
+int board_early_init_f(void)
+{
+	void __iomem *regs;
+
+	regs = map_physmem(AR71XX_GPIO_BASE, AR71XX_GPIO_SIZE,
+			   MAP_NOCACHE);
+
+	/* Assure JTAG is not disconnected. */
+	writel(0x40, regs + AR934X_GPIO_REG_FUNC);
+
+	/* Configure default GPIO input/output regs. */
+	writel(0x3031b, regs + AR71XX_GPIO_REG_OE);
+	writel(0x0f804, regs + AR71XX_GPIO_REG_OUT);
+
+	/* Configure pin multiplexing. */
+	writel(0x00000000, regs + AR934X_GPIO_REG_OUT_FUNC0);
+	writel(0x0b0a0980, regs + AR934X_GPIO_REG_OUT_FUNC1);
+	writel(0x00180000, regs + AR934X_GPIO_REG_OUT_FUNC2);
+	writel(0x00000000, regs + AR934X_GPIO_REG_OUT_FUNC3);
+	writel(0x0000004d, regs + AR934X_GPIO_REG_OUT_FUNC4);
+	writel(0x00000000, regs + AR934X_GPIO_REG_OUT_FUNC5);
+
+#ifdef CONFIG_DEBUG_UART
+	debug_uart_init();
+#endif
+
+#ifndef CONFIG_SKIP_LOWLEVEL_INIT
+	ar934x_pll_init(560, 480, 240);
+	ar934x_ddr_init(560, 480, 240);
+#endif
+
+	wdr4300_usb_start();
+	ath79_eth_reset();
+
+	return 0;
+}
+#endif
diff --git a/board/xilinx/zynq/Makefile b/board/xilinx/zynq/Makefile
index eab9303..7de0212 100644
--- a/board/xilinx/zynq/Makefile
+++ b/board/xilinx/zynq/Makefile
@@ -7,17 +7,7 @@
 
 obj-y	:= board.o
 
-# Copied from Xilinx SDK 2014.4
-hw-platform-$(CONFIG_TARGET_ZYNQ_ZED)		:= zed_hw_platform
-hw-platform-$(CONFIG_TARGET_ZYNQ_MICROZED)	:= MicroZed_hw_platform
-hw-platform-$(CONFIG_TARGET_ZYNQ_ZC702)		:= ZC702_hw_platform
-hw-platform-$(CONFIG_TARGET_ZYNQ_ZC706)		:= ZC706_hw_platform
-hw-platform-$(CONFIG_TARGET_ZYNQ_ZYBO)		:= zybo_hw_platform
-# If you want to use customized ps7_init_gpl.c/h,
-# enable CONFIG_ZYNQ_CUSTOM_INIT and put them into custom_hw_platform/.
-# This line must be placed at the bottom of the list because
-# it takes precedence over the default ones.
-hw-platform-$(CONFIG_ZYNQ_CUSTOM_INIT)		:= custom_hw_platform
+hw-platform-y :=$(shell echo $(CONFIG_DEFAULT_DEVICE_TREE))
 
 init-objs := $(if $(wildcard $(srctree)/$(src)/$(hw-platform-y)/ps7_init_gpl.c),\
 	$(hw-platform-y)/ps7_init_gpl.o)
diff --git a/board/xilinx/zynq/custom_hw_platform/.gitignore b/board/xilinx/zynq/custom_hw_platform/.gitignore
deleted file mode 100644
index c455361..0000000
--- a/board/xilinx/zynq/custom_hw_platform/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-ps7_init_gpl.[ch]
diff --git a/board/xilinx/zynq/MicroZed_hw_platform/ps7_init_gpl.c b/board/xilinx/zynq/zynq-microzed/ps7_init_gpl.c
similarity index 100%
rename from board/xilinx/zynq/MicroZed_hw_platform/ps7_init_gpl.c
rename to board/xilinx/zynq/zynq-microzed/ps7_init_gpl.c
diff --git a/board/xilinx/zynq/MicroZed_hw_platform/ps7_init_gpl.h b/board/xilinx/zynq/zynq-microzed/ps7_init_gpl.h
similarity index 100%
rename from board/xilinx/zynq/MicroZed_hw_platform/ps7_init_gpl.h
rename to board/xilinx/zynq/zynq-microzed/ps7_init_gpl.h
diff --git a/board/xilinx/zynq/ZC702_hw_platform/ps7_init_gpl.c b/board/xilinx/zynq/zynq-zc702/ps7_init_gpl.c
similarity index 100%
rename from board/xilinx/zynq/ZC702_hw_platform/ps7_init_gpl.c
rename to board/xilinx/zynq/zynq-zc702/ps7_init_gpl.c
diff --git a/board/xilinx/zynq/ZC702_hw_platform/ps7_init_gpl.h b/board/xilinx/zynq/zynq-zc702/ps7_init_gpl.h
similarity index 100%
rename from board/xilinx/zynq/ZC702_hw_platform/ps7_init_gpl.h
rename to board/xilinx/zynq/zynq-zc702/ps7_init_gpl.h
diff --git a/board/xilinx/zynq/ZC706_hw_platform/ps7_init_gpl.c b/board/xilinx/zynq/zynq-zc706/ps7_init_gpl.c
similarity index 100%
rename from board/xilinx/zynq/ZC706_hw_platform/ps7_init_gpl.c
rename to board/xilinx/zynq/zynq-zc706/ps7_init_gpl.c
diff --git a/board/xilinx/zynq/ZC706_hw_platform/ps7_init_gpl.h b/board/xilinx/zynq/zynq-zc706/ps7_init_gpl.h
similarity index 100%
rename from board/xilinx/zynq/ZC706_hw_platform/ps7_init_gpl.h
rename to board/xilinx/zynq/zynq-zc706/ps7_init_gpl.h
diff --git a/board/xilinx/zynq/zed_hw_platform/ps7_init_gpl.c b/board/xilinx/zynq/zynq-zed/ps7_init_gpl.c
similarity index 100%
rename from board/xilinx/zynq/zed_hw_platform/ps7_init_gpl.c
rename to board/xilinx/zynq/zynq-zed/ps7_init_gpl.c
diff --git a/board/xilinx/zynq/zed_hw_platform/ps7_init_gpl.h b/board/xilinx/zynq/zynq-zed/ps7_init_gpl.h
similarity index 100%
rename from board/xilinx/zynq/zed_hw_platform/ps7_init_gpl.h
rename to board/xilinx/zynq/zynq-zed/ps7_init_gpl.h
diff --git a/board/xilinx/zynq/zybo_hw_platform/ps7_init_gpl.c b/board/xilinx/zynq/zynq-zybo/ps7_init_gpl.c
similarity index 100%
rename from board/xilinx/zynq/zybo_hw_platform/ps7_init_gpl.c
rename to board/xilinx/zynq/zynq-zybo/ps7_init_gpl.c
diff --git a/board/xilinx/zynq/zybo_hw_platform/ps7_init_gpl.h b/board/xilinx/zynq/zynq-zybo/ps7_init_gpl.h
similarity index 100%
rename from board/xilinx/zynq/zybo_hw_platform/ps7_init_gpl.h
rename to board/xilinx/zynq/zynq-zybo/ps7_init_gpl.h
diff --git a/board/xilinx/zynqmp/Makefile b/board/xilinx/zynqmp/Makefile
index 2ab3f19..90f00c6 100644
--- a/board/xilinx/zynqmp/Makefile
+++ b/board/xilinx/zynqmp/Makefile
@@ -1,8 +1,29 @@
 #
-# (C) Copyright 2014 - 2015 Xilinx, Inc.
+# (C) Copyright 2014 - 2016 Xilinx, Inc.
 # Michal Simek <michal.simek@xilinx.com>
 #
 # SPDX-License-Identifier:	GPL-2.0+
 #
 
 obj-y	:= zynqmp.o
+
+hw-platform-y :=$(shell echo $(CONFIG_SYS_CONFIG_NAME))
+
+init-objs := $(if $(wildcard $(srctree)/$(src)/$(hw-platform-y)/psu_init_gpl.c),\
+	$(hw-platform-y)/psu_init_gpl.o)
+
+ifeq ($(init-objs),)
+ifneq ($(wildcard $(srctree)/$(src)/psu_init_gpl.c),)
+init-objs := psu_init_gpl.o
+$(if $(CONFIG_SPL_BUILD),\
+$(warning Put custom psu_init_gpl.c/h to board/xilinx/zynqmp/custom_hw_platform/))
+endif
+endif
+
+obj-$(CONFIG_SPL_BUILD) += $(init-objs)
+
+# Suppress "warning: function declaration isn't a prototype"
+CFLAGS_REMOVE_psu_init_gpl.o := -Wstrict-prototypes
+
+# To include xil_io.h
+CFLAGS_psu_init_gpl.o := -I$(srctree)/$(src)
diff --git a/board/xilinx/zynqmp/xil_io.h b/board/xilinx/zynqmp/xil_io.h
new file mode 100644
index 0000000..57ca4ad
--- /dev/null
+++ b/board/xilinx/zynqmp/xil_io.h
@@ -0,0 +1,35 @@
+/*
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef XIL_IO_H /* prevent circular inclusions */
+#define XIL_IO_H
+
+/* FIXME remove this when vivado is fixed */
+#include <asm/io.h>
+
+#define xil_printf(...)
+
+void Xil_ICacheEnable(void)
+{}
+
+void Xil_DCacheEnable(void)
+{}
+
+void Xil_ICacheDisable(void)
+{}
+
+void Xil_DCacheDisable(void)
+{}
+
+void Xil_Out32(unsigned long addr, unsigned long val)
+{
+	writel(val, addr);
+}
+
+int Xil_In32(unsigned long addr)
+{
+	return readl(addr);
+}
+
+#endif /* XIL_IO_H */
diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
index 132d724..4623cd4 100644
--- a/board/xilinx/zynqmp/zynqmp.c
+++ b/board/xilinx/zynqmp/zynqmp.c
@@ -15,6 +15,7 @@
 #include <asm/io.h>
 #include <usb.h>
 #include <dwc3-uboot.h>
+#include <i2c.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -50,6 +51,22 @@
 	return 0;
 }
 
+int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)
+{
+#if defined(CONFIG_ZYNQ_GEM_EEPROM_ADDR) && \
+    defined(CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET) && \
+    defined(CONFIG_ZYNQ_EEPROM_BUS)
+	i2c_set_bus_num(CONFIG_ZYNQ_EEPROM_BUS);
+
+	if (eeprom_read(CONFIG_ZYNQ_GEM_EEPROM_ADDR,
+			CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET,
+			ethaddr, 6))
+		printf("I2C EEPROM MAC address read failed\n");
+#endif
+
+	return 0;
+}
+
 #if !defined(CONFIG_SYS_SDRAM_BASE) && !defined(CONFIG_SYS_SDRAM_SIZE)
 /*
  * fdt_get_reg - Fill buffer by information from DT
diff --git a/cmd/Kconfig b/cmd/Kconfig
index 9336752..d51645c 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -593,6 +593,13 @@
 	     sound init   - set up sound system
 	     sound play   - play a sound
 
+config CMD_QFW
+	bool "qfw"
+	select QFW
+	help
+	  This provides access to the QEMU firmware interface.  The main
+	  feature is to allow easy loading of files passed to qemu-system
+	  via -kernel / -initrd
 endmenu
 
 config CMD_BOOTSTAGE
diff --git a/cmd/Makefile b/cmd/Makefile
index f95759e..9ce7861 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -105,6 +105,7 @@
 obj-y += pcmcia.o
 obj-$(CONFIG_CMD_PORTIO) += portio.o
 obj-$(CONFIG_CMD_PXE) += pxe.o
+obj-$(CONFIG_CMD_QFW) += qfw.o
 obj-$(CONFIG_CMD_READ) += read.o
 obj-$(CONFIG_CMD_REGINFO) += reginfo.o
 obj-$(CONFIG_CMD_REISER) += reiser.o
@@ -112,7 +113,7 @@
 obj-$(CONFIG_SANDBOX) += host.o
 obj-$(CONFIG_CMD_SATA) += sata.o
 obj-$(CONFIG_CMD_SF) += sf.o
-obj-$(CONFIG_CMD_SCSI) += scsi.o
+obj-$(CONFIG_SCSI) += scsi.o
 obj-$(CONFIG_CMD_SHA1SUM) += sha1sum.o
 obj-$(CONFIG_CMD_SETEXPR) += setexpr.o
 obj-$(CONFIG_CMD_SOFTSWITCH) += softswitch.o
@@ -155,12 +156,6 @@
 obj-$(CONFIG_CMD_REGULATOR) += regulator.o
 endif # !CONFIG_SPL_BUILD
 
-ifdef CONFIG_SPL_BUILD
-ifdef CONFIG_SPL_SATA_SUPPORT
-obj-$(CONFIG_CMD_SCSI) += scsi.o
-endif
-endif # CONFIG_SPL_BUILD
-
 obj-$(CONFIG_CMD_BLOB) += blob.o
 
 # core command
diff --git a/cmd/bdinfo.c b/cmd/bdinfo.c
index 8eda68b..1c4bed9 100644
--- a/cmd/bdinfo.c
+++ b/cmd/bdinfo.c
@@ -341,6 +341,8 @@
 	print_eth(0);
 	printf("ip_addr     = %s\n", getenv("ipaddr"));
 	printf("baudrate    = %u bps\n", gd->baudrate);
+	print_num("relocaddr", gd->relocaddr);
+	print_num("reloc off", gd->reloc_off);
 
 	return 0;
 }
diff --git a/cmd/disk.c b/cmd/disk.c
index 2fd1717..fcc4123 100644
--- a/cmd/disk.c
+++ b/cmd/disk.c
@@ -8,7 +8,7 @@
 #include <command.h>
 #include <part.h>
 
-#if defined(CONFIG_CMD_IDE) || defined(CONFIG_CMD_SCSI) || \
+#if defined(CONFIG_CMD_IDE) || defined(CONFIG_SCSI) || \
 	defined(CONFIG_USB_STORAGE)
 int common_diskboot(cmd_tbl_t *cmdtp, const char *intf, int argc,
 		    char *const argv[])
diff --git a/cmd/eeprom.c b/cmd/eeprom.c
index e5457ba..0a0e4a2 100644
--- a/cmd/eeprom.c
+++ b/cmd/eeprom.c
@@ -24,6 +24,7 @@
 #include <config.h>
 #include <command.h>
 #include <i2c.h>
+#include <eeprom_layout.h>
 
 #ifndef	CONFIG_SYS_I2C_SPEED
 #define	CONFIG_SYS_I2C_SPEED	50000
@@ -72,7 +73,7 @@
 #endif
 
 	/* I2C EEPROM */
-#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C_SOFT)
+#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)
 #if defined(CONFIG_SYS_I2C)
 	if (bus >= 0)
 		i2c_set_bus_num(bus);
@@ -207,63 +208,243 @@
 	return ret;
 }
 
-static int do_eeprom(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+static int parse_numeric_param(char *str)
 {
-	const char *const fmt =
-		"\nEEPROM @0x%lX %s: addr %08lx  off %04lx  count %ld ... ";
-	char * const *args = &argv[2];
-	int rcode;
-	ulong dev_addr, addr, off, cnt;
-	int bus_addr;
+	char *endptr;
+	int value = simple_strtol(str, &endptr, 16);
 
-	switch (argc) {
+	return (*endptr != '\0') ? -1 : value;
+}
+
+/**
+ * parse_i2c_bus_addr - parse the i2c bus and i2c devaddr parameters
+ *
+ * @i2c_bus:	address to store the i2c bus
+ * @i2c_addr:	address to store the device i2c address
+ * @argc:	count of command line arguments left to parse
+ * @argv:	command line arguments left to parse
+ * @argc_no_bus_addr:	argc value we expect to see when bus & addr aren't given
+ *
+ * @returns:	number of arguments parsed or CMD_RET_USAGE if error
+ */
+static int parse_i2c_bus_addr(int *i2c_bus, ulong *i2c_addr, int argc,
+			      char * const argv[], int argc_no_bus_addr)
+{
+	int argc_no_bus = argc_no_bus_addr + 1;
+	int argc_bus_addr = argc_no_bus_addr + 2;
+
 #ifdef CONFIG_SYS_DEF_EEPROM_ADDR
-	case 5:
-		bus_addr = -1;
-		dev_addr = CONFIG_SYS_DEF_EEPROM_ADDR;
-		break;
+	if (argc == argc_no_bus_addr) {
+		*i2c_bus = -1;
+		*i2c_addr = CONFIG_SYS_DEF_EEPROM_ADDR;
+
+		return 0;
+	}
 #endif
-	case 6:
-		bus_addr = -1;
-		dev_addr = simple_strtoul(*args++, NULL, 16);
-		break;
-	case 7:
-		bus_addr = simple_strtoul(*args++, NULL, 16);
-		dev_addr = simple_strtoul(*args++, NULL, 16);
-		break;
-	default:
-		return CMD_RET_USAGE;
+	if (argc == argc_no_bus) {
+		*i2c_bus = -1;
+		*i2c_addr = parse_numeric_param(argv[0]);
+
+		return 1;
 	}
 
-	addr = simple_strtoul(*args++, NULL, 16);
-	off = simple_strtoul(*args++, NULL, 16);
-	cnt = simple_strtoul(*args++, NULL, 16);
+	if (argc == argc_bus_addr) {
+		*i2c_bus = parse_numeric_param(argv[0]);
+		*i2c_addr = parse_numeric_param(argv[1]);
 
-	eeprom_init(bus_addr);
-
-	if (strcmp(argv[1], "read") == 0) {
-		printf(fmt, dev_addr, argv[1], addr, off, cnt);
-
-		rcode = eeprom_read(dev_addr, off, (uchar *)addr, cnt);
-
-		puts("done\n");
-		return rcode;
-	} else if (strcmp(argv[1], "write") == 0) {
-		printf(fmt, dev_addr, argv[1], addr, off, cnt);
-
-		rcode = eeprom_write(dev_addr, off, (uchar *)addr, cnt);
-
-		puts("done\n");
-		return rcode;
+		return 2;
 	}
 
 	return CMD_RET_USAGE;
 }
 
+#ifdef CONFIG_CMD_EEPROM_LAYOUT
+
+__weak int eeprom_parse_layout_version(char *str)
+{
+	return LAYOUT_VERSION_UNRECOGNIZED;
+}
+
+static unsigned char eeprom_buf[CONFIG_SYS_EEPROM_SIZE];
+
+#ifndef CONFIG_EEPROM_LAYOUT_HELP_STRING
+#define CONFIG_EEPROM_LAYOUT_HELP_STRING "<not defined>"
+#endif
+
+#endif
+
+enum eeprom_action {
+	EEPROM_READ,
+	EEPROM_WRITE,
+	EEPROM_PRINT,
+	EEPROM_UPDATE,
+	EEPROM_ACTION_INVALID,
+};
+
+static enum eeprom_action parse_action(char *cmd)
+{
+	if (!strncmp(cmd, "read", 4))
+		return EEPROM_READ;
+	if (!strncmp(cmd, "write", 5))
+		return EEPROM_WRITE;
+#ifdef CONFIG_CMD_EEPROM_LAYOUT
+	if (!strncmp(cmd, "print", 5))
+		return EEPROM_PRINT;
+	if (!strncmp(cmd, "update", 6))
+		return EEPROM_UPDATE;
+#endif
+
+	return EEPROM_ACTION_INVALID;
+}
+
+static int eeprom_execute_command(enum eeprom_action action, int i2c_bus,
+				  ulong i2c_addr, int layout_ver, char *key,
+				  char *value, ulong addr, ulong off, ulong cnt)
+{
+	int rcode = 0;
+	const char *const fmt =
+		"\nEEPROM @0x%lX %s: addr %08lx  off %04lx  count %ld ... ";
+#ifdef CONFIG_CMD_EEPROM_LAYOUT
+	struct eeprom_layout layout;
+#endif
+
+	if (action == EEPROM_ACTION_INVALID)
+		return CMD_RET_USAGE;
+
+	eeprom_init(i2c_bus);
+	if (action == EEPROM_READ) {
+		printf(fmt, i2c_addr, "read", addr, off, cnt);
+
+		rcode = eeprom_read(i2c_addr, off, (uchar *)addr, cnt);
+
+		puts("done\n");
+		return rcode;
+	} else if (action == EEPROM_WRITE) {
+		printf(fmt, i2c_addr, "write", addr, off, cnt);
+
+		rcode = eeprom_write(i2c_addr, off, (uchar *)addr, cnt);
+
+		puts("done\n");
+		return rcode;
+	}
+
+#ifdef CONFIG_CMD_EEPROM_LAYOUT
+	rcode = eeprom_read(i2c_addr, 0, eeprom_buf, CONFIG_SYS_EEPROM_SIZE);
+	if (rcode < 0)
+		return rcode;
+
+	eeprom_layout_setup(&layout, eeprom_buf, CONFIG_SYS_EEPROM_SIZE,
+			    layout_ver);
+
+	if (action == EEPROM_PRINT) {
+		layout.print(&layout);
+		return 0;
+	}
+
+	layout.update(&layout, key, value);
+
+	rcode = eeprom_write(i2c_addr, 0, layout.data, CONFIG_SYS_EEPROM_SIZE);
+#endif
+
+	return rcode;
+}
+
+#define NEXT_PARAM(argc, index)	{ (argc)--; (index)++; }
+int do_eeprom(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	int layout_ver = LAYOUT_VERSION_AUTODETECT;
+	enum eeprom_action action = EEPROM_ACTION_INVALID;
+	int i2c_bus = -1, index = 0;
+	ulong i2c_addr = -1, addr = 0, cnt = 0, off = 0;
+	int ret;
+	char *field_name = "";
+	char *field_value = "";
+
+	if (argc <= 1)
+		return CMD_RET_USAGE;
+
+	NEXT_PARAM(argc, index); /* Skip program name */
+
+	action = parse_action(argv[index]);
+	NEXT_PARAM(argc, index);
+
+	if (action == EEPROM_ACTION_INVALID)
+		return CMD_RET_USAGE;
+
+#ifdef CONFIG_CMD_EEPROM_LAYOUT
+	if (action == EEPROM_PRINT || action == EEPROM_UPDATE) {
+		if (!strcmp(argv[index], "-l")) {
+			NEXT_PARAM(argc, index);
+			layout_ver = eeprom_parse_layout_version(argv[index]);
+			NEXT_PARAM(argc, index);
+		}
+	}
+#endif
+
+	switch (action) {
+	case EEPROM_READ:
+	case EEPROM_WRITE:
+		ret = parse_i2c_bus_addr(&i2c_bus, &i2c_addr, argc,
+					 argv + index, 3);
+		break;
+	case EEPROM_PRINT:
+		ret = parse_i2c_bus_addr(&i2c_bus, &i2c_addr, argc,
+					 argv + index, 0);
+		break;
+	case EEPROM_UPDATE:
+		ret = parse_i2c_bus_addr(&i2c_bus, &i2c_addr, argc,
+					 argv + index, 2);
+		break;
+	default:
+		/* Get compiler to stop whining */
+		return CMD_RET_USAGE;
+	}
+
+	if (ret == CMD_RET_USAGE)
+		return ret;
+
+	while (ret--)
+		NEXT_PARAM(argc, index);
+
+	if (action == EEPROM_READ || action == EEPROM_WRITE) {
+		addr = parse_numeric_param(argv[index]);
+		NEXT_PARAM(argc, index);
+		off = parse_numeric_param(argv[index]);
+		NEXT_PARAM(argc, index);
+		cnt = parse_numeric_param(argv[index]);
+	}
+
+#ifdef CONFIG_CMD_EEPROM_LAYOUT
+	if (action == EEPROM_UPDATE) {
+		field_name = argv[index];
+		NEXT_PARAM(argc, index);
+		field_value = argv[index];
+		NEXT_PARAM(argc, index);
+	}
+#endif
+
+	return eeprom_execute_command(action, i2c_bus, i2c_addr, layout_ver,
+				      field_name, field_value, addr, off, cnt);
+}
+
 U_BOOT_CMD(
-	eeprom,	7,	1,	do_eeprom,
+	eeprom,	8,	1,	do_eeprom,
 	"EEPROM sub-system",
 	"read  <bus> <devaddr> addr off cnt\n"
 	"eeprom write <bus> <devaddr> addr off cnt\n"
 	"       - read/write `cnt' bytes from `devaddr` EEPROM at offset `off'"
+#ifdef CONFIG_CMD_EEPROM_LAYOUT
+	"\n"
+	"eeprom print [-l <layout_version>] <bus> <devaddr>\n"
+	"       - Print layout fields and their data in human readable format\n"
+	"eeprom update [-l <layout_version>] <bus> <devaddr> field_name field_value\n"
+	"       - Update a specific eeprom field with new data.\n"
+	"         The new data must be written in the same human readable format as shown by the print command.\n"
+	"\n"
+	"LAYOUT VERSIONS\n"
+	"The -l option can be used to force the command to interpret the EEPROM data using the chosen layout.\n"
+	"If the -l option is omitted, the command will auto detect the layout based on the data in the EEPROM.\n"
+	"The values which can be provided with the -l option are:\n"
+	CONFIG_EEPROM_LAYOUT_HELP_STRING"\n"
+#endif
 )
diff --git a/cmd/ide.c b/cmd/ide.c
index c4c08c8..c942744 100644
--- a/cmd/ide.c
+++ b/cmd/ide.c
@@ -29,64 +29,9 @@
 # include <status_led.h>
 #endif
 
-#ifdef __PPC__
-# define EIEIO		__asm__ volatile ("eieio")
-# define SYNC		__asm__ volatile ("sync")
-#else
-# define EIEIO		/* nothing */
-# define SYNC		/* nothing */
-#endif
-
-/* ------------------------------------------------------------------------- */
-
 /* Current I/O Device	*/
 static int curr_device = -1;
 
-/* Current offset for IDE0 / IDE1 bus access	*/
-ulong ide_bus_offset[CONFIG_SYS_IDE_MAXBUS] = {
-#if defined(CONFIG_SYS_ATA_IDE0_OFFSET)
-	CONFIG_SYS_ATA_IDE0_OFFSET,
-#endif
-#if defined(CONFIG_SYS_ATA_IDE1_OFFSET) && (CONFIG_SYS_IDE_MAXBUS > 1)
-	CONFIG_SYS_ATA_IDE1_OFFSET,
-#endif
-};
-
-static int ide_bus_ok[CONFIG_SYS_IDE_MAXBUS];
-
-struct blk_desc ide_dev_desc[CONFIG_SYS_IDE_MAXDEVICE];
-/* ------------------------------------------------------------------------- */
-
-#ifdef CONFIG_IDE_RESET
-static void  ide_reset (void);
-#else
-#define ide_reset()	/* dummy */
-#endif
-
-static void ide_ident(struct blk_desc *dev_desc);
-static uchar ide_wait  (int dev, ulong t);
-
-#define IDE_TIME_OUT	2000	/* 2 sec timeout */
-
-#define ATAPI_TIME_OUT	7000	/* 7 sec timeout (5 sec seems to work...) */
-
-#define IDE_SPIN_UP_TIME_OUT 5000 /* 5 sec spin-up timeout */
-
-static void ident_cpy (unsigned char *dest, unsigned char *src, unsigned int len);
-
-#ifndef CONFIG_SYS_ATA_PORT_ADDR
-#define CONFIG_SYS_ATA_PORT_ADDR(port) (port)
-#endif
-
-#ifdef CONFIG_ATAPI
-static void	atapi_inquiry(struct blk_desc *dev_desc);
-static ulong atapi_read(struct blk_desc *block_dev, lbaint_t blknr,
-			lbaint_t blkcnt, void *buffer);
-#endif
-
-
-/* ------------------------------------------------------------------------- */
-
 int do_ide(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 {
 	int rcode = 0;
@@ -106,79 +51,41 @@
 			ide_init();
 			return 0;
 		} else if (strncmp(argv[1], "inf", 3) == 0) {
-			int i;
-
-			putc('\n');
-
-			for (i = 0; i < CONFIG_SYS_IDE_MAXDEVICE; ++i) {
-				if (ide_dev_desc[i].type == DEV_TYPE_UNKNOWN)
-					continue;  /* list only known devices */
-				printf("IDE device %d: ", i);
-				dev_print(&ide_dev_desc[i]);
-			}
+			blk_list_devices(IF_TYPE_IDE);
 			return 0;
 
 		} else if (strncmp(argv[1], "dev", 3) == 0) {
-			if ((curr_device < 0)
-			    || (curr_device >= CONFIG_SYS_IDE_MAXDEVICE)) {
-				puts("\nno IDE devices available\n");
-				return 1;
+			if (blk_print_device_num(IF_TYPE_IDE, curr_device)) {
+				printf("\nno IDE devices available\n");
+				return CMD_RET_FAILURE;
 			}
-			printf("\nIDE device %d: ", curr_device);
-			dev_print(&ide_dev_desc[curr_device]);
+
 			return 0;
 		} else if (strncmp(argv[1], "part", 4) == 0) {
-			int dev, ok;
-
-			for (ok = 0, dev = 0;
-			     dev < CONFIG_SYS_IDE_MAXDEVICE;
-			     ++dev) {
-				if (ide_dev_desc[dev].part_type !=
-				    PART_TYPE_UNKNOWN) {
-					++ok;
-					if (dev)
-						putc('\n');
-					part_print(&ide_dev_desc[dev]);
-				}
-			}
-			if (!ok) {
-				puts("\nno IDE devices available\n");
-				rcode++;
-			}
-			return rcode;
+			if (blk_list_part(IF_TYPE_IDE))
+				printf("\nno IDE devices available\n");
+			return 1;
 		}
 		return CMD_RET_USAGE;
 	case 3:
 		if (strncmp(argv[1], "dev", 3) == 0) {
-			int dev = (int) simple_strtoul(argv[2], NULL, 10);
+			int dev = (int)simple_strtoul(argv[2], NULL, 10);
 
-			printf("\nIDE device %d: ", dev);
-			if (dev >= CONFIG_SYS_IDE_MAXDEVICE) {
-				puts("unknown device\n");
-				return 1;
+			if (!blk_show_device(IF_TYPE_IDE, dev)) {
+				curr_device = dev;
+				printf("... is now current device\n");
+			} else {
+				return CMD_RET_FAILURE;
 			}
-			dev_print(&ide_dev_desc[dev]);
-			/*ide_print (dev); */
-
-			if (ide_dev_desc[dev].type == DEV_TYPE_UNKNOWN)
-				return 1;
-
-			curr_device = dev;
-
-			puts("... is now current device\n");
-
 			return 0;
 		} else if (strncmp(argv[1], "part", 4) == 0) {
-			int dev = (int) simple_strtoul(argv[2], NULL, 10);
+			int dev = (int)simple_strtoul(argv[2], NULL, 10);
 
-			if (ide_dev_desc[dev].part_type != PART_TYPE_UNKNOWN) {
-				part_print(&ide_dev_desc[dev]);
-			} else {
-				printf("\nIDE device %d not available\n",
-				       dev);
-				rcode = 1;
+			if (blk_print_part_devnum(IF_TYPE_IDE, dev)) {
+				printf("\nIDE device %d not available\n", dev);
+				return CMD_RET_FAILURE;
 			}
-			return rcode;
+			return 1;
 		}
 
 		return CMD_RET_USAGE;
@@ -188,26 +95,22 @@
 		if (strcmp(argv[1], "read") == 0) {
 			ulong addr = simple_strtoul(argv[2], NULL, 16);
 			ulong cnt = simple_strtoul(argv[4], NULL, 16);
-			struct blk_desc *dev_desc;
 			ulong n;
 
 #ifdef CONFIG_SYS_64BIT_LBA
 			lbaint_t blk = simple_strtoull(argv[3], NULL, 16);
 
-			printf("\nIDE read: device %d block # %lld, count %ld ... ",
-				curr_device, blk, cnt);
+			printf("\nIDE read: device %d block # %lld, count %ld...",
+			       curr_device, blk, cnt);
 #else
 			lbaint_t blk = simple_strtoul(argv[3], NULL, 16);
 
-			printf("\nIDE read: device %d block # %ld, count %ld ... ",
-				curr_device, blk, cnt);
+			printf("\nIDE read: device %d block # %ld, count %ld...",
+			       curr_device, blk, cnt);
 #endif
 
-			dev_desc = &ide_dev_desc[curr_device];
-			n = blk_dread(dev_desc, blk, cnt, (ulong *)addr);
-			/* flush cache after read */
-			flush_cache(addr,
-				    cnt * ide_dev_desc[curr_device].blksz);
+			n = blk_read_devnum(IF_TYPE_IDE, curr_device, blk, cnt,
+					    (ulong *)addr);
 
 			printf("%ld blocks read: %s\n",
 			       n, (n == cnt) ? "OK" : "ERROR");
@@ -223,19 +126,19 @@
 #ifdef CONFIG_SYS_64BIT_LBA
 			lbaint_t blk = simple_strtoull(argv[3], NULL, 16);
 
-			printf("\nIDE write: device %d block # %lld, count %ld ... ",
-				curr_device, blk, cnt);
+			printf("\nIDE write: device %d block # %lld, count %ld...",
+			       curr_device, blk, cnt);
 #else
 			lbaint_t blk = simple_strtoul(argv[3], NULL, 16);
 
-			printf("\nIDE write: device %d block # %ld, count %ld ... ",
-				curr_device, blk, cnt);
+			printf("\nIDE write: device %d block # %ld, count %ld...",
+			       curr_device, blk, cnt);
 #endif
-			n = ide_write(&ide_dev_desc[curr_device], blk, cnt,
-				      (ulong *)addr);
+			n = blk_write_devnum(IF_TYPE_IDE, curr_device, blk, cnt,
+					     (ulong *)addr);
 
-			printf("%ld blocks written: %s\n",
-				n, (n == cnt) ? "OK" : "ERROR");
+			printf("%ld blocks written: %s\n", n,
+			       n == cnt ? "OK" : "ERROR");
 			if (n == cnt)
 				return 0;
 			else
@@ -253,1195 +156,6 @@
 	return common_diskboot(cmdtp, "ide", argc, argv);
 }
 
-/* ------------------------------------------------------------------------- */
-
-__weak void ide_led(uchar led, uchar status)
-{
-#if defined(CONFIG_IDE_LED) && defined(PER8_BASE) /* required by LED_PORT */
-	static uchar led_buffer;	/* Buffer for current LED status */
-
-	uchar *led_port = LED_PORT;
-
-	if (status)		/* switch LED on        */
-		led_buffer |= led;
-	else			/* switch LED off       */
-		led_buffer &= ~led;
-
-	*led_port = led_buffer;
-#endif
-}
-
-#ifndef CONFIG_IDE_LED	/* define LED macros, they are not used anyways */
-# define DEVICE_LED(x) 0
-# define LED_IDE1 1
-# define LED_IDE2 2
-#endif
-
-/* ------------------------------------------------------------------------- */
-
-__weak void ide_outb(int dev, int port, unsigned char val)
-{
-	debug("ide_outb (dev= %d, port= 0x%x, val= 0x%02x) : @ 0x%08lx\n",
-	      dev, port, val,
-	      (ATA_CURR_BASE(dev) + CONFIG_SYS_ATA_PORT_ADDR(port)));
-
-#if defined(CONFIG_IDE_AHB)
-	if (port) {
-		/* write command */
-		ide_write_register(dev, port, val);
-	} else {
-		/* write data */
-		outb(val, (ATA_CURR_BASE(dev)));
-	}
-#else
-	outb(val, (ATA_CURR_BASE(dev) + CONFIG_SYS_ATA_PORT_ADDR(port)));
-#endif
-}
-
-__weak unsigned char ide_inb(int dev, int port)
-{
-	uchar val;
-
-#if defined(CONFIG_IDE_AHB)
-	val = ide_read_register(dev, port);
-#else
-	val = inb((ATA_CURR_BASE(dev) + CONFIG_SYS_ATA_PORT_ADDR(port)));
-#endif
-
-	debug("ide_inb (dev= %d, port= 0x%x) : @ 0x%08lx -> 0x%02x\n",
-	      dev, port,
-	      (ATA_CURR_BASE(dev) + CONFIG_SYS_ATA_PORT_ADDR(port)), val);
-	return val;
-}
-
-void ide_init(void)
-{
-	unsigned char c;
-	int i, bus;
-
-#ifdef CONFIG_IDE_8xx_PCCARD
-	extern int ide_devices_found;	/* Initialized in check_ide_device() */
-#endif /* CONFIG_IDE_8xx_PCCARD */
-
-#ifdef CONFIG_IDE_PREINIT
-	WATCHDOG_RESET();
-
-	if (ide_preinit()) {
-		puts("ide_preinit failed\n");
-		return;
-	}
-#endif /* CONFIG_IDE_PREINIT */
-
-	WATCHDOG_RESET();
-
-	/*
-	 * Reset the IDE just to be sure.
-	 * Light LED's to show
-	 */
-	ide_led((LED_IDE1 | LED_IDE2), 1);	/* LED's on     */
-
-	/* ATAPI Drives seems to need a proper IDE Reset */
-	ide_reset();
-
-#ifdef CONFIG_IDE_INIT_POSTRESET
-	WATCHDOG_RESET();
-
-	if (ide_init_postreset()) {
-		puts("ide_preinit_postreset failed\n");
-		return;
-	}
-#endif /* CONFIG_IDE_INIT_POSTRESET */
-
-	/*
-	 * Wait for IDE to get ready.
-	 * According to spec, this can take up to 31 seconds!
-	 */
-	for (bus = 0; bus < CONFIG_SYS_IDE_MAXBUS; ++bus) {
-		int dev =
-			bus * (CONFIG_SYS_IDE_MAXDEVICE /
-			       CONFIG_SYS_IDE_MAXBUS);
-
-#ifdef CONFIG_IDE_8xx_PCCARD
-		/* Skip non-ide devices from probing */
-		if ((ide_devices_found & (1 << bus)) == 0) {
-			ide_led((LED_IDE1 | LED_IDE2), 0);	/* LED's off */
-			continue;
-		}
-#endif
-		printf("Bus %d: ", bus);
-
-		ide_bus_ok[bus] = 0;
-
-		/* Select device
-		 */
-		udelay(100000);	/* 100 ms */
-		ide_outb(dev, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(dev));
-		udelay(100000);	/* 100 ms */
-		i = 0;
-		do {
-			udelay(10000);	/* 10 ms */
-
-			c = ide_inb(dev, ATA_STATUS);
-			i++;
-			if (i > (ATA_RESET_TIME * 100)) {
-				puts("** Timeout **\n");
-				/* LED's off */
-				ide_led((LED_IDE1 | LED_IDE2), 0);
-				return;
-			}
-			if ((i >= 100) && ((i % 100) == 0))
-				putc('.');
-
-		} while (c & ATA_STAT_BUSY);
-
-		if (c & (ATA_STAT_BUSY | ATA_STAT_FAULT)) {
-			puts("not available  ");
-			debug("Status = 0x%02X ", c);
-#ifndef CONFIG_ATAPI		/* ATAPI Devices do not set DRDY */
-		} else if ((c & ATA_STAT_READY) == 0) {
-			puts("not available  ");
-			debug("Status = 0x%02X ", c);
-#endif
-		} else {
-			puts("OK ");
-			ide_bus_ok[bus] = 1;
-		}
-		WATCHDOG_RESET();
-	}
-
-	putc('\n');
-
-	ide_led((LED_IDE1 | LED_IDE2), 0);	/* LED's off    */
-
-	curr_device = -1;
-	for (i = 0; i < CONFIG_SYS_IDE_MAXDEVICE; ++i) {
-		int led = (IDE_BUS(i) == 0) ? LED_IDE1 : LED_IDE2;
-		ide_dev_desc[i].type = DEV_TYPE_UNKNOWN;
-		ide_dev_desc[i].if_type = IF_TYPE_IDE;
-		ide_dev_desc[i].devnum = i;
-		ide_dev_desc[i].part_type = PART_TYPE_UNKNOWN;
-		ide_dev_desc[i].blksz = 0;
-		ide_dev_desc[i].log2blksz =
-			LOG2_INVALID(typeof(ide_dev_desc[i].log2blksz));
-		ide_dev_desc[i].lba = 0;
-		ide_dev_desc[i].block_read = ide_read;
-		ide_dev_desc[i].block_write = ide_write;
-		if (!ide_bus_ok[IDE_BUS(i)])
-			continue;
-		ide_led(led, 1);	/* LED on       */
-		ide_ident(&ide_dev_desc[i]);
-		ide_led(led, 0);	/* LED off      */
-		dev_print(&ide_dev_desc[i]);
-
-		if ((ide_dev_desc[i].lba > 0) && (ide_dev_desc[i].blksz > 0)) {
-			/* initialize partition type */
-			part_init(&ide_dev_desc[i]);
-			if (curr_device < 0)
-				curr_device = i;
-		}
-	}
-	WATCHDOG_RESET();
-}
-
-/* ------------------------------------------------------------------------- */
-
-#ifdef CONFIG_PARTITIONS
-struct blk_desc *ide_get_dev(int dev)
-{
-	return (dev < CONFIG_SYS_IDE_MAXDEVICE) ? &ide_dev_desc[dev] : NULL;
-}
-#endif
-
-/* ------------------------------------------------------------------------- */
-
-/* We only need to swap data if we are running on a big endian cpu. */
-#if defined(__LITTLE_ENDIAN)
-__weak void ide_input_swap_data(int dev, ulong *sect_buf, int words)
-{
-	ide_input_data(dev, sect_buf, words);
-}
-#else
-__weak void ide_input_swap_data(int dev, ulong *sect_buf, int words)
-{
-	volatile ushort *pbuf =
-		(ushort *) (ATA_CURR_BASE(dev) + ATA_DATA_REG);
-	ushort *dbuf = (ushort *) sect_buf;
-
-	debug("in input swap data base for read is %lx\n",
-	      (unsigned long) pbuf);
-
-	while (words--) {
-#ifdef __MIPS__
-		*dbuf++ = swab16p((u16 *) pbuf);
-		*dbuf++ = swab16p((u16 *) pbuf);
-#else
-		*dbuf++ = ld_le16(pbuf);
-		*dbuf++ = ld_le16(pbuf);
-#endif /* !MIPS */
-	}
-}
-#endif /* __LITTLE_ENDIAN */
-
-
-#if defined(CONFIG_IDE_SWAP_IO)
-__weak void ide_output_data(int dev, const ulong *sect_buf, int words)
-{
-	ushort *dbuf;
-	volatile ushort *pbuf;
-
-	pbuf = (ushort *) (ATA_CURR_BASE(dev) + ATA_DATA_REG);
-	dbuf = (ushort *) sect_buf;
-	while (words--) {
-		EIEIO;
-		*pbuf = *dbuf++;
-		EIEIO;
-		*pbuf = *dbuf++;
-	}
-}
-#else  /* ! CONFIG_IDE_SWAP_IO */
-__weak void ide_output_data(int dev, const ulong *sect_buf, int words)
-{
-#if defined(CONFIG_IDE_AHB)
-	ide_write_data(dev, sect_buf, words);
-#else
-	outsw(ATA_CURR_BASE(dev) + ATA_DATA_REG, sect_buf, words << 1);
-#endif
-}
-#endif /* CONFIG_IDE_SWAP_IO */
-
-#if defined(CONFIG_IDE_SWAP_IO)
-__weak void ide_input_data(int dev, ulong *sect_buf, int words)
-{
-	ushort *dbuf;
-	volatile ushort *pbuf;
-
-	pbuf = (ushort *) (ATA_CURR_BASE(dev) + ATA_DATA_REG);
-	dbuf = (ushort *) sect_buf;
-
-	debug("in input data base for read is %lx\n", (unsigned long) pbuf);
-
-	while (words--) {
-		EIEIO;
-		*dbuf++ = *pbuf;
-		EIEIO;
-		*dbuf++ = *pbuf;
-	}
-}
-#else  /* ! CONFIG_IDE_SWAP_IO */
-__weak void ide_input_data(int dev, ulong *sect_buf, int words)
-{
-#if defined(CONFIG_IDE_AHB)
-	ide_read_data(dev, sect_buf, words);
-#else
-	insw(ATA_CURR_BASE(dev) + ATA_DATA_REG, sect_buf, words << 1);
-#endif
-}
-
-#endif /* CONFIG_IDE_SWAP_IO */
-
-/* -------------------------------------------------------------------------
- */
-static void ide_ident(struct blk_desc *dev_desc)
-{
-	unsigned char c;
-	hd_driveid_t iop;
-
-#ifdef CONFIG_ATAPI
-	int retries = 0;
-#endif
-	int device;
-
-	device = dev_desc->devnum;
-	printf("  Device %d: ", device);
-
-	ide_led(DEVICE_LED(device), 1);	/* LED on       */
-	/* Select device
-	 */
-	ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
-	dev_desc->if_type = IF_TYPE_IDE;
-#ifdef CONFIG_ATAPI
-
-	retries = 0;
-
-	/* Warning: This will be tricky to read */
-	while (retries <= 1) {
-		/* check signature */
-		if ((ide_inb(device, ATA_SECT_CNT) == 0x01) &&
-		    (ide_inb(device, ATA_SECT_NUM) == 0x01) &&
-		    (ide_inb(device, ATA_CYL_LOW) == 0x14) &&
-		    (ide_inb(device, ATA_CYL_HIGH) == 0xEB)) {
-			/* ATAPI Signature found */
-			dev_desc->if_type = IF_TYPE_ATAPI;
-			/*
-			 * Start Ident Command
-			 */
-			ide_outb(device, ATA_COMMAND, ATAPI_CMD_IDENT);
-			/*
-			 * Wait for completion - ATAPI devices need more time
-			 * to become ready
-			 */
-			c = ide_wait(device, ATAPI_TIME_OUT);
-		} else
-#endif
-		{
-			/*
-			 * Start Ident Command
-			 */
-			ide_outb(device, ATA_COMMAND, ATA_CMD_IDENT);
-
-			/*
-			 * Wait for completion
-			 */
-			c = ide_wait(device, IDE_TIME_OUT);
-		}
-		ide_led(DEVICE_LED(device), 0);	/* LED off      */
-
-		if (((c & ATA_STAT_DRQ) == 0) ||
-		    ((c & (ATA_STAT_FAULT | ATA_STAT_ERR)) != 0)) {
-#ifdef CONFIG_ATAPI
-			{
-				/*
-				 * Need to soft reset the device
-				 * in case it's an ATAPI...
-				 */
-				debug("Retrying...\n");
-				ide_outb(device, ATA_DEV_HD,
-					 ATA_LBA | ATA_DEVICE(device));
-				udelay(100000);
-				ide_outb(device, ATA_COMMAND, 0x08);
-				udelay(500000);	/* 500 ms */
-			}
-			/*
-			 * Select device
-			 */
-			ide_outb(device, ATA_DEV_HD,
-				 ATA_LBA | ATA_DEVICE(device));
-			retries++;
-#else
-			return;
-#endif
-		}
-#ifdef CONFIG_ATAPI
-		else
-			break;
-	}			/* see above - ugly to read */
-
-	if (retries == 2)	/* Not found */
-		return;
-#endif
-
-	ide_input_swap_data(device, (ulong *)&iop, ATA_SECTORWORDS);
-
-	ident_cpy((unsigned char *) dev_desc->revision, iop.fw_rev,
-		  sizeof(dev_desc->revision));
-	ident_cpy((unsigned char *) dev_desc->vendor, iop.model,
-		  sizeof(dev_desc->vendor));
-	ident_cpy((unsigned char *) dev_desc->product, iop.serial_no,
-		  sizeof(dev_desc->product));
-#ifdef __LITTLE_ENDIAN
-	/*
-	 * firmware revision, model, and serial number have Big Endian Byte
-	 * order in Word. Convert all three to little endian.
-	 *
-	 * See CF+ and CompactFlash Specification Revision 2.0:
-	 * 6.2.1.6: Identify Drive, Table 39 for more details
-	 */
-
-	strswab(dev_desc->revision);
-	strswab(dev_desc->vendor);
-	strswab(dev_desc->product);
-#endif /* __LITTLE_ENDIAN */
-
-	if ((iop.config & 0x0080) == 0x0080)
-		dev_desc->removable = 1;
-	else
-		dev_desc->removable = 0;
-
-#ifdef CONFIG_ATAPI
-	if (dev_desc->if_type == IF_TYPE_ATAPI) {
-		atapi_inquiry(dev_desc);
-		return;
-	}
-#endif /* CONFIG_ATAPI */
-
-#ifdef __BIG_ENDIAN
-	/* swap shorts */
-	dev_desc->lba = (iop.lba_capacity << 16) | (iop.lba_capacity >> 16);
-#else  /* ! __BIG_ENDIAN */
-	/*
-	 * do not swap shorts on little endian
-	 *
-	 * See CF+ and CompactFlash Specification Revision 2.0:
-	 * 6.2.1.6: Identfy Drive, Table 39, Word Address 57-58 for details.
-	 */
-	dev_desc->lba = iop.lba_capacity;
-#endif /* __BIG_ENDIAN */
-
-#ifdef CONFIG_LBA48
-	if (iop.command_set_2 & 0x0400) {	/* LBA 48 support */
-		dev_desc->lba48 = 1;
-		dev_desc->lba = (unsigned long long) iop.lba48_capacity[0] |
-			((unsigned long long) iop.lba48_capacity[1] << 16) |
-			((unsigned long long) iop.lba48_capacity[2] << 32) |
-			((unsigned long long) iop.lba48_capacity[3] << 48);
-	} else {
-		dev_desc->lba48 = 0;
-	}
-#endif /* CONFIG_LBA48 */
-	/* assuming HD */
-	dev_desc->type = DEV_TYPE_HARDDISK;
-	dev_desc->blksz = ATA_BLOCKSIZE;
-	dev_desc->log2blksz = LOG2(dev_desc->blksz);
-	dev_desc->lun = 0;	/* just to fill something in... */
-
-#if 0				/* only used to test the powersaving mode,
-				 * if enabled, the drive goes after 5 sec
-				 * in standby mode */
-	ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
-	c = ide_wait(device, IDE_TIME_OUT);
-	ide_outb(device, ATA_SECT_CNT, 1);
-	ide_outb(device, ATA_LBA_LOW, 0);
-	ide_outb(device, ATA_LBA_MID, 0);
-	ide_outb(device, ATA_LBA_HIGH, 0);
-	ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
-	ide_outb(device, ATA_COMMAND, 0xe3);
-	udelay(50);
-	c = ide_wait(device, IDE_TIME_OUT);	/* can't take over 500 ms */
-#endif
-}
-
-
-/* ------------------------------------------------------------------------- */
-
-ulong ide_read(struct blk_desc *block_dev, lbaint_t blknr, lbaint_t blkcnt,
-	       void *buffer)
-{
-	int device = block_dev->devnum;
-	ulong n = 0;
-	unsigned char c;
-	unsigned char pwrsave = 0;	/* power save */
-
-#ifdef CONFIG_LBA48
-	unsigned char lba48 = 0;
-
-	if (blknr & 0x0000fffff0000000ULL) {
-		/* more than 28 bits used, use 48bit mode */
-		lba48 = 1;
-	}
-#endif
-	debug("ide_read dev %d start " LBAF ", blocks " LBAF " buffer at %lX\n",
-	      device, blknr, blkcnt, (ulong) buffer);
-
-	ide_led(DEVICE_LED(device), 1);	/* LED on       */
-
-	/* Select device
-	 */
-	ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
-	c = ide_wait(device, IDE_TIME_OUT);
-
-	if (c & ATA_STAT_BUSY) {
-		printf("IDE read: device %d not ready\n", device);
-		goto IDE_READ_E;
-	}
-
-	/* first check if the drive is in Powersaving mode, if yes,
-	 * increase the timeout value */
-	ide_outb(device, ATA_COMMAND, ATA_CMD_CHK_PWR);
-	udelay(50);
-
-	c = ide_wait(device, IDE_TIME_OUT);	/* can't take over 500 ms */
-
-	if (c & ATA_STAT_BUSY) {
-		printf("IDE read: device %d not ready\n", device);
-		goto IDE_READ_E;
-	}
-	if ((c & ATA_STAT_ERR) == ATA_STAT_ERR) {
-		printf("No Powersaving mode %X\n", c);
-	} else {
-		c = ide_inb(device, ATA_SECT_CNT);
-		debug("Powersaving %02X\n", c);
-		if (c == 0)
-			pwrsave = 1;
-	}
-
-
-	while (blkcnt-- > 0) {
-
-		c = ide_wait(device, IDE_TIME_OUT);
-
-		if (c & ATA_STAT_BUSY) {
-			printf("IDE read: device %d not ready\n", device);
-			break;
-		}
-#ifdef CONFIG_LBA48
-		if (lba48) {
-			/* write high bits */
-			ide_outb(device, ATA_SECT_CNT, 0);
-			ide_outb(device, ATA_LBA_LOW, (blknr >> 24) & 0xFF);
-#ifdef CONFIG_SYS_64BIT_LBA
-			ide_outb(device, ATA_LBA_MID, (blknr >> 32) & 0xFF);
-			ide_outb(device, ATA_LBA_HIGH, (blknr >> 40) & 0xFF);
-#else
-			ide_outb(device, ATA_LBA_MID, 0);
-			ide_outb(device, ATA_LBA_HIGH, 0);
-#endif
-		}
-#endif
-		ide_outb(device, ATA_SECT_CNT, 1);
-		ide_outb(device, ATA_LBA_LOW, (blknr >> 0) & 0xFF);
-		ide_outb(device, ATA_LBA_MID, (blknr >> 8) & 0xFF);
-		ide_outb(device, ATA_LBA_HIGH, (blknr >> 16) & 0xFF);
-
-#ifdef CONFIG_LBA48
-		if (lba48) {
-			ide_outb(device, ATA_DEV_HD,
-				 ATA_LBA | ATA_DEVICE(device));
-			ide_outb(device, ATA_COMMAND, ATA_CMD_READ_EXT);
-
-		} else
-#endif
-		{
-			ide_outb(device, ATA_DEV_HD, ATA_LBA |
-				 ATA_DEVICE(device) | ((blknr >> 24) & 0xF));
-			ide_outb(device, ATA_COMMAND, ATA_CMD_READ);
-		}
-
-		udelay(50);
-
-		if (pwrsave) {
-			/* may take up to 4 sec */
-			c = ide_wait(device, IDE_SPIN_UP_TIME_OUT);
-			pwrsave = 0;
-		} else {
-			/* can't take over 500 ms */
-			c = ide_wait(device, IDE_TIME_OUT);
-		}
-
-		if ((c & (ATA_STAT_DRQ | ATA_STAT_BUSY | ATA_STAT_ERR)) !=
-		    ATA_STAT_DRQ) {
-			printf("Error (no IRQ) dev %d blk " LBAF ": status "
-			       "%#02x\n", device, blknr, c);
-			break;
-		}
-
-		ide_input_data(device, buffer, ATA_SECTORWORDS);
-		(void) ide_inb(device, ATA_STATUS);	/* clear IRQ */
-
-		++n;
-		++blknr;
-		buffer += ATA_BLOCKSIZE;
-	}
-IDE_READ_E:
-	ide_led(DEVICE_LED(device), 0);	/* LED off      */
-	return (n);
-}
-
-/* ------------------------------------------------------------------------- */
-
-
-ulong ide_write(struct blk_desc *block_dev, lbaint_t blknr, lbaint_t blkcnt,
-		const void *buffer)
-{
-	int device = block_dev->devnum;
-	ulong n = 0;
-	unsigned char c;
-
-#ifdef CONFIG_LBA48
-	unsigned char lba48 = 0;
-
-	if (blknr & 0x0000fffff0000000ULL) {
-		/* more than 28 bits used, use 48bit mode */
-		lba48 = 1;
-	}
-#endif
-
-	ide_led(DEVICE_LED(device), 1);	/* LED on       */
-
-	/* Select device
-	 */
-	ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
-
-	while (blkcnt-- > 0) {
-
-		c = ide_wait(device, IDE_TIME_OUT);
-
-		if (c & ATA_STAT_BUSY) {
-			printf("IDE read: device %d not ready\n", device);
-			goto WR_OUT;
-		}
-#ifdef CONFIG_LBA48
-		if (lba48) {
-			/* write high bits */
-			ide_outb(device, ATA_SECT_CNT, 0);
-			ide_outb(device, ATA_LBA_LOW, (blknr >> 24) & 0xFF);
-#ifdef CONFIG_SYS_64BIT_LBA
-			ide_outb(device, ATA_LBA_MID, (blknr >> 32) & 0xFF);
-			ide_outb(device, ATA_LBA_HIGH, (blknr >> 40) & 0xFF);
-#else
-			ide_outb(device, ATA_LBA_MID, 0);
-			ide_outb(device, ATA_LBA_HIGH, 0);
-#endif
-		}
-#endif
-		ide_outb(device, ATA_SECT_CNT, 1);
-		ide_outb(device, ATA_LBA_LOW, (blknr >> 0) & 0xFF);
-		ide_outb(device, ATA_LBA_MID, (blknr >> 8) & 0xFF);
-		ide_outb(device, ATA_LBA_HIGH, (blknr >> 16) & 0xFF);
-
-#ifdef CONFIG_LBA48
-		if (lba48) {
-			ide_outb(device, ATA_DEV_HD,
-				 ATA_LBA | ATA_DEVICE(device));
-			ide_outb(device, ATA_COMMAND, ATA_CMD_WRITE_EXT);
-
-		} else
-#endif
-		{
-			ide_outb(device, ATA_DEV_HD, ATA_LBA |
-				 ATA_DEVICE(device) | ((blknr >> 24) & 0xF));
-			ide_outb(device, ATA_COMMAND, ATA_CMD_WRITE);
-		}
-
-		udelay(50);
-
-		/* can't take over 500 ms */
-		c = ide_wait(device, IDE_TIME_OUT);
-
-		if ((c & (ATA_STAT_DRQ | ATA_STAT_BUSY | ATA_STAT_ERR)) !=
-		    ATA_STAT_DRQ) {
-			printf("Error (no IRQ) dev %d blk " LBAF ": status "
-				"%#02x\n", device, blknr, c);
-			goto WR_OUT;
-		}
-
-		ide_output_data(device, buffer, ATA_SECTORWORDS);
-		c = ide_inb(device, ATA_STATUS);	/* clear IRQ */
-		++n;
-		++blknr;
-		buffer += ATA_BLOCKSIZE;
-	}
-WR_OUT:
-	ide_led(DEVICE_LED(device), 0);	/* LED off      */
-	return (n);
-}
-
-/* ------------------------------------------------------------------------- */
-
-/*
- * copy src to dest, skipping leading and trailing blanks and null
- * terminate the string
- * "len" is the size of available memory including the terminating '\0'
- */
-static void ident_cpy(unsigned char *dst, unsigned char *src,
-		      unsigned int len)
-{
-	unsigned char *end, *last;
-
-	last = dst;
-	end = src + len - 1;
-
-	/* reserve space for '\0' */
-	if (len < 2)
-		goto OUT;
-
-	/* skip leading white space */
-	while ((*src) && (src < end) && (*src == ' '))
-		++src;
-
-	/* copy string, omitting trailing white space */
-	while ((*src) && (src < end)) {
-		*dst++ = *src;
-		if (*src++ != ' ')
-			last = dst;
-	}
-OUT:
-	*last = '\0';
-}
-
-/* ------------------------------------------------------------------------- */
-
-/*
- * Wait until Busy bit is off, or timeout (in ms)
- * Return last status
- */
-static uchar ide_wait(int dev, ulong t)
-{
-	ulong delay = 10 * t;	/* poll every 100 us */
-	uchar c;
-
-	while ((c = ide_inb(dev, ATA_STATUS)) & ATA_STAT_BUSY) {
-		udelay(100);
-		if (delay-- == 0)
-			break;
-	}
-	return (c);
-}
-
-/* ------------------------------------------------------------------------- */
-
-#ifdef CONFIG_IDE_RESET
-extern void ide_set_reset(int idereset);
-
-static void ide_reset(void)
-{
-	int i;
-
-	curr_device = -1;
-	for (i = 0; i < CONFIG_SYS_IDE_MAXBUS; ++i)
-		ide_bus_ok[i] = 0;
-	for (i = 0; i < CONFIG_SYS_IDE_MAXDEVICE; ++i)
-		ide_dev_desc[i].type = DEV_TYPE_UNKNOWN;
-
-	ide_set_reset(1);	/* assert reset */
-
-	/* the reset signal shall be asserted for et least 25 us */
-	udelay(25);
-
-	WATCHDOG_RESET();
-
-	/* de-assert RESET signal */
-	ide_set_reset(0);
-
-	/* wait 250 ms */
-	for (i = 0; i < 250; ++i)
-		udelay(1000);
-}
-
-#endif /* CONFIG_IDE_RESET */
-
-/* ------------------------------------------------------------------------- */
-
-#if defined(CONFIG_OF_IDE_FIXUP)
-int ide_device_present(int dev)
-{
-	if (dev >= CONFIG_SYS_IDE_MAXBUS)
-		return 0;
-	return (ide_dev_desc[dev].type == DEV_TYPE_UNKNOWN ? 0 : 1);
-}
-#endif
-/* ------------------------------------------------------------------------- */
-
-#ifdef CONFIG_ATAPI
-/****************************************************************************
- * ATAPI Support
- */
-
-#if defined(CONFIG_IDE_SWAP_IO)
-/* since ATAPI may use commands with not 4 bytes alligned length
- * we have our own transfer functions, 2 bytes alligned */
-__weak void ide_output_data_shorts(int dev, ushort *sect_buf, int shorts)
-{
-	ushort *dbuf;
-	volatile ushort *pbuf;
-
-	pbuf = (ushort *) (ATA_CURR_BASE(dev) + ATA_DATA_REG);
-	dbuf = (ushort *) sect_buf;
-
-	debug("in output data shorts base for read is %lx\n",
-	      (unsigned long) pbuf);
-
-	while (shorts--) {
-		EIEIO;
-		*pbuf = *dbuf++;
-	}
-}
-
-__weak void ide_input_data_shorts(int dev, ushort *sect_buf, int shorts)
-{
-	ushort *dbuf;
-	volatile ushort *pbuf;
-
-	pbuf = (ushort *) (ATA_CURR_BASE(dev) + ATA_DATA_REG);
-	dbuf = (ushort *) sect_buf;
-
-	debug("in input data shorts base for read is %lx\n",
-	      (unsigned long) pbuf);
-
-	while (shorts--) {
-		EIEIO;
-		*dbuf++ = *pbuf;
-	}
-}
-
-#else  /* ! CONFIG_IDE_SWAP_IO */
-__weak void ide_output_data_shorts(int dev, ushort *sect_buf, int shorts)
-{
-	outsw(ATA_CURR_BASE(dev) + ATA_DATA_REG, sect_buf, shorts);
-}
-
-__weak void ide_input_data_shorts(int dev, ushort *sect_buf, int shorts)
-{
-	insw(ATA_CURR_BASE(dev) + ATA_DATA_REG, sect_buf, shorts);
-}
-
-#endif /* CONFIG_IDE_SWAP_IO */
-
-/*
- * Wait until (Status & mask) == res, or timeout (in ms)
- * Return last status
- * This is used since some ATAPI CD ROMs clears their Busy Bit first
- * and then they set their DRQ Bit
- */
-static uchar atapi_wait_mask(int dev, ulong t, uchar mask, uchar res)
-{
-	ulong delay = 10 * t;	/* poll every 100 us */
-	uchar c;
-
-	/* prevents to read the status before valid */
-	c = ide_inb(dev, ATA_DEV_CTL);
-
-	while (((c = ide_inb(dev, ATA_STATUS)) & mask) != res) {
-		/* break if error occurs (doesn't make sense to wait more) */
-		if ((c & ATA_STAT_ERR) == ATA_STAT_ERR)
-			break;
-		udelay(100);
-		if (delay-- == 0)
-			break;
-	}
-	return (c);
-}
-
-/*
- * issue an atapi command
- */
-unsigned char atapi_issue(int device, unsigned char *ccb, int ccblen,
-			  unsigned char *buffer, int buflen)
-{
-	unsigned char c, err, mask, res;
-	int n;
-
-	ide_led(DEVICE_LED(device), 1);	/* LED on       */
-
-	/* Select device
-	 */
-	mask = ATA_STAT_BUSY | ATA_STAT_DRQ;
-	res = 0;
-	ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
-	c = atapi_wait_mask(device, ATAPI_TIME_OUT, mask, res);
-	if ((c & mask) != res) {
-		printf("ATAPI_ISSUE: device %d not ready status %X\n", device,
-		       c);
-		err = 0xFF;
-		goto AI_OUT;
-	}
-	/* write taskfile */
-	ide_outb(device, ATA_ERROR_REG, 0);	/* no DMA, no overlaped */
-	ide_outb(device, ATA_SECT_CNT, 0);
-	ide_outb(device, ATA_SECT_NUM, 0);
-	ide_outb(device, ATA_CYL_LOW, (unsigned char) (buflen & 0xFF));
-	ide_outb(device, ATA_CYL_HIGH,
-		 (unsigned char) ((buflen >> 8) & 0xFF));
-	ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
-
-	ide_outb(device, ATA_COMMAND, ATAPI_CMD_PACKET);
-	udelay(50);
-
-	mask = ATA_STAT_DRQ | ATA_STAT_BUSY | ATA_STAT_ERR;
-	res = ATA_STAT_DRQ;
-	c = atapi_wait_mask(device, ATAPI_TIME_OUT, mask, res);
-
-	if ((c & mask) != res) {	/* DRQ must be 1, BSY 0 */
-		printf("ATAPI_ISSUE: Error (no IRQ) before sending ccb dev %d status 0x%02x\n",
-			device, c);
-		err = 0xFF;
-		goto AI_OUT;
-	}
-
-	/* write command block */
-	ide_output_data_shorts(device, (unsigned short *) ccb, ccblen / 2);
-
-	/* ATAPI Command written wait for completition */
-	udelay(5000);		/* device must set bsy */
-
-	mask = ATA_STAT_DRQ | ATA_STAT_BUSY | ATA_STAT_ERR;
-	/*
-	 * if no data wait for DRQ = 0 BSY = 0
-	 * if data wait for DRQ = 1 BSY = 0
-	 */
-	res = 0;
-	if (buflen)
-		res = ATA_STAT_DRQ;
-	c = atapi_wait_mask(device, ATAPI_TIME_OUT, mask, res);
-	if ((c & mask) != res) {
-		if (c & ATA_STAT_ERR) {
-			err = (ide_inb(device, ATA_ERROR_REG)) >> 4;
-			debug("atapi_issue 1 returned sense key %X status %02X\n",
-				err, c);
-		} else {
-			printf("ATAPI_ISSUE: (no DRQ) after sending ccb (%x)  status 0x%02x\n",
-				ccb[0], c);
-			err = 0xFF;
-		}
-		goto AI_OUT;
-	}
-	n = ide_inb(device, ATA_CYL_HIGH);
-	n <<= 8;
-	n += ide_inb(device, ATA_CYL_LOW);
-	if (n > buflen) {
-		printf("ERROR, transfer bytes %d requested only %d\n", n,
-		       buflen);
-		err = 0xff;
-		goto AI_OUT;
-	}
-	if ((n == 0) && (buflen < 0)) {
-		printf("ERROR, transfer bytes %d requested %d\n", n, buflen);
-		err = 0xff;
-		goto AI_OUT;
-	}
-	if (n != buflen) {
-		debug("WARNING, transfer bytes %d not equal with requested %d\n",
-			n, buflen);
-	}
-	if (n != 0) {		/* data transfer */
-		debug("ATAPI_ISSUE: %d Bytes to transfer\n", n);
-		/* we transfer shorts */
-		n >>= 1;
-		/* ok now decide if it is an in or output */
-		if ((ide_inb(device, ATA_SECT_CNT) & 0x02) == 0) {
-			debug("Write to device\n");
-			ide_output_data_shorts(device,
-				(unsigned short *) buffer, n);
-		} else {
-			debug("Read from device @ %p shorts %d\n", buffer, n);
-			ide_input_data_shorts(device,
-				(unsigned short *) buffer, n);
-		}
-	}
-	udelay(5000);		/* seems that some CD ROMs need this... */
-	mask = ATA_STAT_BUSY | ATA_STAT_ERR;
-	res = 0;
-	c = atapi_wait_mask(device, ATAPI_TIME_OUT, mask, res);
-	if ((c & ATA_STAT_ERR) == ATA_STAT_ERR) {
-		err = (ide_inb(device, ATA_ERROR_REG) >> 4);
-		debug("atapi_issue 2 returned sense key %X status %X\n", err,
-		      c);
-	} else {
-		err = 0;
-	}
-AI_OUT:
-	ide_led(DEVICE_LED(device), 0);	/* LED off      */
-	return (err);
-}
-
-/*
- * sending the command to atapi_issue. If an status other than good
- * returns, an request_sense will be issued
- */
-
-#define ATAPI_DRIVE_NOT_READY	100
-#define ATAPI_UNIT_ATTN		10
-
-unsigned char atapi_issue_autoreq(int device,
-				  unsigned char *ccb,
-				  int ccblen,
-				  unsigned char *buffer, int buflen)
-{
-	unsigned char sense_data[18], sense_ccb[12];
-	unsigned char res, key, asc, ascq;
-	int notready, unitattn;
-
-	unitattn = ATAPI_UNIT_ATTN;
-	notready = ATAPI_DRIVE_NOT_READY;
-
-retry:
-	res = atapi_issue(device, ccb, ccblen, buffer, buflen);
-	if (res == 0)
-		return 0;	/* Ok */
-
-	if (res == 0xFF)
-		return 0xFF;	/* error */
-
-	debug("(auto_req)atapi_issue returned sense key %X\n", res);
-
-	memset(sense_ccb, 0, sizeof(sense_ccb));
-	memset(sense_data, 0, sizeof(sense_data));
-	sense_ccb[0] = ATAPI_CMD_REQ_SENSE;
-	sense_ccb[4] = 18;	/* allocation Length */
-
-	res = atapi_issue(device, sense_ccb, 12, sense_data, 18);
-	key = (sense_data[2] & 0xF);
-	asc = (sense_data[12]);
-	ascq = (sense_data[13]);
-
-	debug("ATAPI_CMD_REQ_SENSE returned %x\n", res);
-	debug(" Sense page: %02X key %02X ASC %02X ASCQ %02X\n",
-	      sense_data[0], key, asc, ascq);
-
-	if ((key == 0))
-		return 0;	/* ok device ready */
-
-	if ((key == 6) || (asc == 0x29) || (asc == 0x28)) { /* Unit Attention */
-		if (unitattn-- > 0) {
-			udelay(200 * 1000);
-			goto retry;
-		}
-		printf("Unit Attention, tried %d\n", ATAPI_UNIT_ATTN);
-		goto error;
-	}
-	if ((asc == 0x4) && (ascq == 0x1)) {
-		/* not ready, but will be ready soon */
-		if (notready-- > 0) {
-			udelay(200 * 1000);
-			goto retry;
-		}
-		printf("Drive not ready, tried %d times\n",
-		       ATAPI_DRIVE_NOT_READY);
-		goto error;
-	}
-	if (asc == 0x3a) {
-		debug("Media not present\n");
-		goto error;
-	}
-
-	printf("ERROR: Unknown Sense key %02X ASC %02X ASCQ %02X\n", key, asc,
-	       ascq);
-error:
-	debug("ERROR Sense key %02X ASC %02X ASCQ %02X\n", key, asc, ascq);
-	return (0xFF);
-}
-
-
-static void atapi_inquiry(struct blk_desc *dev_desc)
-{
-	unsigned char ccb[12];	/* Command descriptor block */
-	unsigned char iobuf[64];	/* temp buf */
-	unsigned char c;
-	int device;
-
-	device = dev_desc->devnum;
-	dev_desc->type = DEV_TYPE_UNKNOWN;	/* not yet valid */
-	dev_desc->block_read = atapi_read;
-
-	memset(ccb, 0, sizeof(ccb));
-	memset(iobuf, 0, sizeof(iobuf));
-
-	ccb[0] = ATAPI_CMD_INQUIRY;
-	ccb[4] = 40;		/* allocation Legnth */
-	c = atapi_issue_autoreq(device, ccb, 12, (unsigned char *) iobuf, 40);
-
-	debug("ATAPI_CMD_INQUIRY returned %x\n", c);
-	if (c != 0)
-		return;
-
-	/* copy device ident strings */
-	ident_cpy((unsigned char *) dev_desc->vendor, &iobuf[8], 8);
-	ident_cpy((unsigned char *) dev_desc->product, &iobuf[16], 16);
-	ident_cpy((unsigned char *) dev_desc->revision, &iobuf[32], 5);
-
-	dev_desc->lun = 0;
-	dev_desc->lba = 0;
-	dev_desc->blksz = 0;
-	dev_desc->log2blksz = LOG2_INVALID(typeof(dev_desc->log2blksz));
-	dev_desc->type = iobuf[0] & 0x1f;
-
-	if ((iobuf[1] & 0x80) == 0x80)
-		dev_desc->removable = 1;
-	else
-		dev_desc->removable = 0;
-
-	memset(ccb, 0, sizeof(ccb));
-	memset(iobuf, 0, sizeof(iobuf));
-	ccb[0] = ATAPI_CMD_START_STOP;
-	ccb[4] = 0x03;		/* start */
-
-	c = atapi_issue_autoreq(device, ccb, 12, (unsigned char *) iobuf, 0);
-
-	debug("ATAPI_CMD_START_STOP returned %x\n", c);
-	if (c != 0)
-		return;
-
-	memset(ccb, 0, sizeof(ccb));
-	memset(iobuf, 0, sizeof(iobuf));
-	c = atapi_issue_autoreq(device, ccb, 12, (unsigned char *) iobuf, 0);
-
-	debug("ATAPI_CMD_UNIT_TEST_READY returned %x\n", c);
-	if (c != 0)
-		return;
-
-	memset(ccb, 0, sizeof(ccb));
-	memset(iobuf, 0, sizeof(iobuf));
-	ccb[0] = ATAPI_CMD_READ_CAP;
-	c = atapi_issue_autoreq(device, ccb, 12, (unsigned char *) iobuf, 8);
-	debug("ATAPI_CMD_READ_CAP returned %x\n", c);
-	if (c != 0)
-		return;
-
-	debug("Read Cap: LBA %02X%02X%02X%02X blksize %02X%02X%02X%02X\n",
-	      iobuf[0], iobuf[1], iobuf[2], iobuf[3],
-	      iobuf[4], iobuf[5], iobuf[6], iobuf[7]);
-
-	dev_desc->lba = ((unsigned long) iobuf[0] << 24) +
-		((unsigned long) iobuf[1] << 16) +
-		((unsigned long) iobuf[2] << 8) + ((unsigned long) iobuf[3]);
-	dev_desc->blksz = ((unsigned long) iobuf[4] << 24) +
-		((unsigned long) iobuf[5] << 16) +
-		((unsigned long) iobuf[6] << 8) + ((unsigned long) iobuf[7]);
-	dev_desc->log2blksz = LOG2(dev_desc->blksz);
-#ifdef CONFIG_LBA48
-	/* ATAPI devices cannot use 48bit addressing (ATA/ATAPI v7) */
-	dev_desc->lba48 = 0;
-#endif
-	return;
-}
-
-
-/*
- * atapi_read:
- * we transfer only one block per command, since the multiple DRQ per
- * command is not yet implemented
- */
-#define ATAPI_READ_MAX_BYTES	2048	/* we read max 2kbytes */
-#define ATAPI_READ_BLOCK_SIZE	2048	/* assuming CD part */
-#define ATAPI_READ_MAX_BLOCK	(ATAPI_READ_MAX_BYTES/ATAPI_READ_BLOCK_SIZE)
-
-ulong atapi_read(struct blk_desc *block_dev, lbaint_t blknr, lbaint_t blkcnt,
-		 void *buffer)
-{
-	int device = block_dev->devnum;
-	ulong n = 0;
-	unsigned char ccb[12];	/* Command descriptor block */
-	ulong cnt;
-
-	debug("atapi_read dev %d start " LBAF " blocks " LBAF " buffer at %lX\n",
-	      device, blknr, blkcnt, (ulong) buffer);
-
-	do {
-		if (blkcnt > ATAPI_READ_MAX_BLOCK)
-			cnt = ATAPI_READ_MAX_BLOCK;
-		else
-			cnt = blkcnt;
-
-		ccb[0] = ATAPI_CMD_READ_12;
-		ccb[1] = 0;	/* reserved */
-		ccb[2] = (unsigned char) (blknr >> 24) & 0xFF;	/* MSB Block */
-		ccb[3] = (unsigned char) (blknr >> 16) & 0xFF;	/*  */
-		ccb[4] = (unsigned char) (blknr >> 8) & 0xFF;
-		ccb[5] = (unsigned char) blknr & 0xFF;	/* LSB Block */
-		ccb[6] = (unsigned char) (cnt >> 24) & 0xFF; /* MSB Block cnt */
-		ccb[7] = (unsigned char) (cnt >> 16) & 0xFF;
-		ccb[8] = (unsigned char) (cnt >> 8) & 0xFF;
-		ccb[9] = (unsigned char) cnt & 0xFF;	/* LSB Block */
-		ccb[10] = 0;	/* reserved */
-		ccb[11] = 0;	/* reserved */
-
-		if (atapi_issue_autoreq(device, ccb, 12,
-					(unsigned char *) buffer,
-					cnt * ATAPI_READ_BLOCK_SIZE)
-		    == 0xFF) {
-			return (n);
-		}
-		n += cnt;
-		blkcnt -= cnt;
-		blknr += cnt;
-		buffer += (cnt * ATAPI_READ_BLOCK_SIZE);
-	} while (blkcnt > 0);
-	return (n);
-}
-
-/* ------------------------------------------------------------------------- */
-
-#endif /* CONFIG_ATAPI */
-
 U_BOOT_CMD(ide, 5, 1, do_ide,
 	   "IDE sub-system",
 	   "reset - reset IDE controller\n"
diff --git a/cmd/mmc.c b/cmd/mmc.c
index c5454bf..eb4a547 100644
--- a/cmd/mmc.c
+++ b/cmd/mmc.c
@@ -314,12 +314,14 @@
 	}
 	/* Switch to the RPMB partition */
 	original_part = mmc->block_dev.hwpart;
-	if (mmc_select_hwpart(curr_device, MMC_PART_RPMB) != 0)
+	if (blk_select_hwpart_devnum(IF_TYPE_MMC, curr_device, MMC_PART_RPMB) !=
+	    0)
 		return CMD_RET_FAILURE;
 	ret = cp->cmd(cmdtp, flag, argc, argv);
 
 	/* Return to original partition */
-	if (mmc_select_hwpart(curr_device, original_part) != 0)
+	if (blk_select_hwpart_devnum(IF_TYPE_MMC, curr_device, original_part) !=
+	    0)
 		return CMD_RET_FAILURE;
 	return ret;
 }
@@ -346,7 +348,7 @@
 	printf("\nMMC read: dev # %d, block # %d, count %d ... ",
 	       curr_device, blk, cnt);
 
-	n = blk_dread(&mmc->block_dev, blk, cnt, addr);
+	n = blk_dread(mmc_get_blk_desc(mmc), blk, cnt, addr);
 	/* flush cache after read */
 	flush_cache((ulong)addr, cnt * 512); /* FIXME */
 	printf("%d blocks read: %s\n", n, (n == cnt) ? "OK" : "ERROR");
@@ -378,7 +380,7 @@
 		printf("Error: card is write protected!\n");
 		return CMD_RET_FAILURE;
 	}
-	n = blk_dwrite(&mmc->block_dev, blk, cnt, addr);
+	n = blk_dwrite(mmc_get_blk_desc(mmc), blk, cnt, addr);
 	printf("%d blocks written: %s\n", n, (n == cnt) ? "OK" : "ERROR");
 
 	return (n == cnt) ? CMD_RET_SUCCESS : CMD_RET_FAILURE;
@@ -406,7 +408,7 @@
 		printf("Error: card is write protected!\n");
 		return CMD_RET_FAILURE;
 	}
-	n = blk_derase(&mmc->block_dev, blk, cnt);
+	n = blk_derase(mmc_get_blk_desc(mmc), blk, cnt);
 	printf("%d blocks erased: %s\n", n, (n == cnt) ? "OK" : "ERROR");
 
 	return (n == cnt) ? CMD_RET_SUCCESS : CMD_RET_FAILURE;
@@ -432,7 +434,7 @@
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
-	mmc_dev = mmc_get_dev(curr_device);
+	mmc_dev = blk_get_devnum_by_type(IF_TYPE_MMC, curr_device);
 	if (mmc_dev != NULL && mmc_dev->type != DEV_TYPE_UNKNOWN) {
 		part_print(mmc_dev);
 		return CMD_RET_SUCCESS;
@@ -467,7 +469,7 @@
 	if (!mmc)
 		return CMD_RET_FAILURE;
 
-	ret = mmc_select_hwpart(dev, part);
+	ret = blk_select_hwpart_devnum(IF_TYPE_MMC, dev, part);
 	printf("switch to partitions #%d, %s\n",
 	       part, (!ret) ? "OK" : "ERROR");
 	if (ret)
@@ -478,7 +480,7 @@
 		printf("mmc%d is current device\n", curr_device);
 	else
 		printf("mmc%d(part %d) is current device\n",
-		       curr_device, mmc->block_dev.hwpart);
+		       curr_device, mmc_get_blk_desc(mmc)->hwpart);
 
 	return CMD_RET_SUCCESS;
 }
diff --git a/cmd/qfw.c b/cmd/qfw.c
new file mode 100644
index 0000000..12436ec
--- /dev/null
+++ b/cmd/qfw.c
@@ -0,0 +1,194 @@
+/*
+ * (C) Copyright 2015 Miao Yan <yanmiaobest@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <command.h>
+#include <errno.h>
+#include <qfw.h>
+
+/*
+ * This function prepares kernel for zboot. It loads kernel data
+ * to 'load_addr', initrd to 'initrd_addr' and kernel command
+ * line using qemu fw_cfg interface.
+ */
+static int qemu_fwcfg_setup_kernel(void *load_addr, void *initrd_addr)
+{
+	char *data_addr;
+	uint32_t setup_size, kernel_size, cmdline_size, initrd_size;
+
+	qemu_fwcfg_read_entry(FW_CFG_SETUP_SIZE, 4, &setup_size);
+	qemu_fwcfg_read_entry(FW_CFG_KERNEL_SIZE, 4, &kernel_size);
+
+	if (setup_size == 0 || kernel_size == 0) {
+		printf("warning: no kernel available\n");
+		return -1;
+	}
+
+	data_addr = load_addr;
+	qemu_fwcfg_read_entry(FW_CFG_SETUP_DATA,
+			      le32_to_cpu(setup_size), data_addr);
+	data_addr += le32_to_cpu(setup_size);
+
+	qemu_fwcfg_read_entry(FW_CFG_KERNEL_DATA,
+			      le32_to_cpu(kernel_size), data_addr);
+	data_addr += le32_to_cpu(kernel_size);
+
+	data_addr = initrd_addr;
+	qemu_fwcfg_read_entry(FW_CFG_INITRD_SIZE, 4, &initrd_size);
+	if (initrd_size == 0) {
+		printf("warning: no initrd available\n");
+	} else {
+		qemu_fwcfg_read_entry(FW_CFG_INITRD_DATA,
+				      le32_to_cpu(initrd_size), data_addr);
+		data_addr += le32_to_cpu(initrd_size);
+	}
+
+	qemu_fwcfg_read_entry(FW_CFG_CMDLINE_SIZE, 4, &cmdline_size);
+	if (cmdline_size) {
+		qemu_fwcfg_read_entry(FW_CFG_CMDLINE_DATA,
+				      le32_to_cpu(cmdline_size), data_addr);
+		/*
+		 * if kernel cmdline only contains '\0', (e.g. no -append
+		 * when invoking qemu), do not update bootargs
+		 */
+		if (*data_addr != '\0') {
+			if (setenv("bootargs", data_addr) < 0)
+				printf("warning: unable to change bootargs\n");
+		}
+	}
+
+	printf("loading kernel to address %p size %x", load_addr,
+	       le32_to_cpu(kernel_size));
+	if (initrd_size)
+		printf(" initrd %p size %x\n",
+		       initrd_addr,
+		       le32_to_cpu(initrd_size));
+	else
+		printf("\n");
+
+	return 0;
+}
+
+static int qemu_fwcfg_list_firmware(void)
+{
+	int ret;
+	struct fw_cfg_file_iter iter;
+	struct fw_file *file;
+
+	/* make sure fw_list is loaded */
+	ret = qemu_fwcfg_read_firmware_list();
+	if (ret)
+		return ret;
+
+
+	for (file = qemu_fwcfg_file_iter_init(&iter);
+	     !qemu_fwcfg_file_iter_end(&iter);
+	     file = qemu_fwcfg_file_iter_next(&iter)) {
+		printf("%-56s\n", file->cfg.name);
+	}
+
+	return 0;
+}
+
+static int qemu_fwcfg_do_list(cmd_tbl_t *cmdtp, int flag,
+		int argc, char * const argv[])
+{
+	if (qemu_fwcfg_list_firmware() < 0)
+		return CMD_RET_FAILURE;
+
+	return 0;
+}
+
+static int qemu_fwcfg_do_cpus(cmd_tbl_t *cmdtp, int flag,
+		int argc, char * const argv[])
+{
+	int ret = qemu_fwcfg_online_cpus();
+	if (ret < 0) {
+		printf("QEMU fw_cfg interface not found\n");
+		return CMD_RET_FAILURE;
+	}
+
+	printf("%d cpu(s) online\n", qemu_fwcfg_online_cpus());
+
+	return 0;
+}
+
+static int qemu_fwcfg_do_load(cmd_tbl_t *cmdtp, int flag,
+		int argc, char * const argv[])
+{
+	char *env;
+	void *load_addr;
+	void *initrd_addr;
+
+	env = getenv("loadaddr");
+	load_addr = env ?
+		(void *)simple_strtoul(env, NULL, 16) :
+#ifdef CONFIG_LOADADDR
+		(void *)CONFIG_LOADADDR;
+#else
+		NULL;
+#endif
+
+	env = getenv("ramdiskaddr");
+	initrd_addr = env ?
+		(void *)simple_strtoul(env, NULL, 16) :
+#ifdef CONFIG_RAMDISK_ADDR
+		(void *)CONFIG_RAMDISK_ADDR;
+#else
+		NULL;
+#endif
+
+	if (argc == 2) {
+		load_addr = (void *)simple_strtoul(argv[0], NULL, 16);
+		initrd_addr = (void *)simple_strtoul(argv[1], NULL, 16);
+	} else if (argc == 1) {
+		load_addr = (void *)simple_strtoul(argv[0], NULL, 16);
+	}
+
+	if (!load_addr || !initrd_addr) {
+		printf("missing load or initrd address\n");
+		return CMD_RET_FAILURE;
+	}
+
+	return qemu_fwcfg_setup_kernel(load_addr, initrd_addr);
+}
+
+static cmd_tbl_t fwcfg_commands[] = {
+	U_BOOT_CMD_MKENT(list, 0, 1, qemu_fwcfg_do_list, "", ""),
+	U_BOOT_CMD_MKENT(cpus, 0, 1, qemu_fwcfg_do_cpus, "", ""),
+	U_BOOT_CMD_MKENT(load, 2, 1, qemu_fwcfg_do_load, "", ""),
+};
+
+static int do_qemu_fw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	int ret;
+	cmd_tbl_t *fwcfg_cmd;
+
+	if (!qemu_fwcfg_present()) {
+		printf("QEMU fw_cfg interface not found\n");
+		return CMD_RET_USAGE;
+	}
+
+	fwcfg_cmd = find_cmd_tbl(argv[1], fwcfg_commands,
+				 ARRAY_SIZE(fwcfg_commands));
+	argc -= 2;
+	argv += 2;
+	if (!fwcfg_cmd || argc > fwcfg_cmd->maxargs)
+		return CMD_RET_USAGE;
+
+	ret = fwcfg_cmd->cmd(fwcfg_cmd, flag, argc, argv);
+
+	return cmd_process_error(fwcfg_cmd, ret);
+}
+
+U_BOOT_CMD(
+	qfw,	4,	1,	do_qemu_fw,
+	"QEMU firmware interface",
+	"<command>\n"
+	"    - list                             : print firmware(s) currently loaded\n"
+	"    - cpus                             : print online cpu number\n"
+	"    - load <kernel addr> <initrd addr> : load kernel and initrd (if any), and setup for zboot\n"
+)
diff --git a/cmd/sata.c b/cmd/sata.c
index 8748cce..d18b523 100644
--- a/cmd/sata.c
+++ b/cmd/sata.c
@@ -16,70 +16,6 @@
 #include <sata.h>
 
 static int sata_curr_device = -1;
-struct blk_desc sata_dev_desc[CONFIG_SYS_SATA_MAX_DEVICE];
-
-static unsigned long sata_bread(struct blk_desc *block_dev, lbaint_t start,
-				lbaint_t blkcnt, void *dst)
-{
-	return sata_read(block_dev->devnum, start, blkcnt, dst);
-}
-
-static unsigned long sata_bwrite(struct blk_desc *block_dev, lbaint_t start,
-				 lbaint_t blkcnt, const void *buffer)
-{
-	return sata_write(block_dev->devnum, start, blkcnt, buffer);
-}
-
-int __sata_initialize(void)
-{
-	int rc;
-	int i;
-
-	for (i = 0; i < CONFIG_SYS_SATA_MAX_DEVICE; i++) {
-		memset(&sata_dev_desc[i], 0, sizeof(struct blk_desc));
-		sata_dev_desc[i].if_type = IF_TYPE_SATA;
-		sata_dev_desc[i].devnum = i;
-		sata_dev_desc[i].part_type = PART_TYPE_UNKNOWN;
-		sata_dev_desc[i].type = DEV_TYPE_HARDDISK;
-		sata_dev_desc[i].lba = 0;
-		sata_dev_desc[i].blksz = 512;
-		sata_dev_desc[i].log2blksz = LOG2(sata_dev_desc[i].blksz);
-		sata_dev_desc[i].block_read = sata_bread;
-		sata_dev_desc[i].block_write = sata_bwrite;
-
-		rc = init_sata(i);
-		if (!rc) {
-			rc = scan_sata(i);
-			if (!rc && (sata_dev_desc[i].lba > 0) &&
-				(sata_dev_desc[i].blksz > 0))
-				part_init(&sata_dev_desc[i]);
-		}
-	}
-	sata_curr_device = 0;
-	return rc;
-}
-int sata_initialize(void) __attribute__((weak,alias("__sata_initialize")));
-
-__weak int __sata_stop(void)
-{
-	int i, err = 0;
-
-	for (i = 0; i < CONFIG_SYS_SATA_MAX_DEVICE; i++)
-		err |= reset_sata(i);
-
-	if (err)
-		printf("Could not reset some SATA devices\n");
-
-	return err;
-}
-int sata_stop(void) __attribute__((weak, alias("__sata_stop")));
-
-#ifdef CONFIG_PARTITIONS
-struct blk_desc *sata_get_dev(int dev)
-{
-	return (dev < CONFIG_SYS_SATA_MAX_DEVICE) ? &sata_dev_desc[dev] : NULL;
-}
-#endif
 
 static int do_sata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
@@ -105,69 +41,40 @@
 	case 1:
 		return CMD_RET_USAGE;
 	case 2:
-		if (strncmp(argv[1],"inf", 3) == 0) {
-			int i;
-			putc('\n');
-			for (i = 0; i < CONFIG_SYS_SATA_MAX_DEVICE; ++i) {
-				if (sata_dev_desc[i].type == DEV_TYPE_UNKNOWN)
-					continue;
-				printf ("SATA device %d: ", i);
-				dev_print(&sata_dev_desc[i]);
+		if (strncmp(argv[1], "inf", 3) == 0) {
+			blk_list_devices(IF_TYPE_SATA);
+			return 0;
+		} else if (strncmp(argv[1], "dev", 3) == 0) {
+			if (blk_print_device_num(IF_TYPE_SATA,
+						 sata_curr_device)) {
+				printf("\nno SATA devices available\n");
+				return CMD_RET_FAILURE;
 			}
 			return 0;
-		} else if (strncmp(argv[1],"dev", 3) == 0) {
-			if ((sata_curr_device < 0) || (sata_curr_device >= CONFIG_SYS_SATA_MAX_DEVICE)) {
+		} else if (strncmp(argv[1], "part", 4) == 0) {
+			if (blk_list_part(IF_TYPE_SATA))
 				puts("\nno SATA devices available\n");
-				return 1;
-			}
-			printf("\nSATA device %d: ", sata_curr_device);
-			dev_print(&sata_dev_desc[sata_curr_device]);
 			return 0;
-		} else if (strncmp(argv[1],"part",4) == 0) {
-			int dev, ok;
-
-			for (ok = 0, dev = 0; dev < CONFIG_SYS_SATA_MAX_DEVICE; ++dev) {
-				if (sata_dev_desc[dev].part_type != PART_TYPE_UNKNOWN) {
-					++ok;
-					if (dev)
-						putc ('\n');
-					part_print(&sata_dev_desc[dev]);
-				}
-			}
-			if (!ok) {
-				puts("\nno SATA devices available\n");
-				rc ++;
-			}
-			return rc;
 		}
 		return CMD_RET_USAGE;
 	case 3:
 		if (strncmp(argv[1], "dev", 3) == 0) {
 			int dev = (int)simple_strtoul(argv[2], NULL, 10);
 
-			printf("\nSATA device %d: ", dev);
-			if (dev >= CONFIG_SYS_SATA_MAX_DEVICE) {
-				puts ("unknown device\n");
-				return 1;
+			if (!blk_show_device(IF_TYPE_SATA, dev)) {
+				sata_curr_device = dev;
+				printf("... is now current device\n");
+			} else {
+				return CMD_RET_FAILURE;
 			}
-			dev_print(&sata_dev_desc[dev]);
-
-			if (sata_dev_desc[dev].type == DEV_TYPE_UNKNOWN)
-				return 1;
-
-			sata_curr_device = dev;
-
-			puts("... is now current device\n");
-
 			return 0;
 		} else if (strncmp(argv[1], "part", 4) == 0) {
 			int dev = (int)simple_strtoul(argv[2], NULL, 10);
 
-			if (sata_dev_desc[dev].part_type != PART_TYPE_UNKNOWN) {
-				part_print(&sata_dev_desc[dev]);
-			} else {
-				printf("\nSATA device %d not available\n", dev);
-				rc = 1;
+			if (blk_print_part_devnum(IF_TYPE_SATA, dev)) {
+				printf("\nSATA device %d not available\n",
+				       dev);
+				return CMD_RET_FAILURE;
 			}
 			return rc;
 		}
@@ -183,11 +90,8 @@
 			printf("\nSATA read: device %d block # %ld, count %ld ... ",
 				sata_curr_device, blk, cnt);
 
-			n = blk_dread(&sata_dev_desc[sata_curr_device],
-				      blk, cnt, (u32 *)addr);
-
-			/* flush cache after read */
-			flush_cache(addr, cnt * sata_dev_desc[sata_curr_device].blksz);
+			n = blk_read_devnum(IF_TYPE_SATA, sata_curr_device, blk,
+					    cnt, (ulong *)addr);
 
 			printf("%ld blocks read: %s\n",
 				n, (n==cnt) ? "OK" : "ERROR");
@@ -202,8 +106,8 @@
 			printf("\nSATA write: device %d block # %ld, count %ld ... ",
 				sata_curr_device, blk, cnt);
 
-			n = blk_dwrite(&sata_dev_desc[sata_curr_device],
-				       blk, cnt, (u32 *)addr);
+			n = blk_write_devnum(IF_TYPE_SATA, sata_curr_device,
+					     blk, cnt, (ulong *)addr);
 
 			printf("%ld blocks written: %s\n",
 				n, (n == cnt) ? "OK" : "ERROR");
diff --git a/cmd/scsi.c b/cmd/scsi.c
index 8991125..387ca1a 100644
--- a/cmd/scsi.c
+++ b/cmd/scsi.c
@@ -10,361 +10,108 @@
  */
 #include <common.h>
 #include <command.h>
-#include <inttypes.h>
-#include <asm/processor.h>
 #include <scsi.h>
-#include <image.h>
-#include <pci.h>
-
-#ifdef CONFIG_SCSI_DEV_LIST
-#define SCSI_DEV_LIST CONFIG_SCSI_DEV_LIST
-#else
-#ifdef CONFIG_SCSI_SYM53C8XX
-#define SCSI_VEND_ID	0x1000
-#ifndef CONFIG_SCSI_DEV_ID
-#define SCSI_DEV_ID		0x0001
-#else
-#define SCSI_DEV_ID		CONFIG_SCSI_DEV_ID
-#endif
-#elif defined CONFIG_SATA_ULI5288
-
-#define SCSI_VEND_ID 0x10b9
-#define SCSI_DEV_ID  0x5288
-
-#elif !defined(CONFIG_SCSI_AHCI_PLAT)
-#error no scsi device defined
-#endif
-#define SCSI_DEV_LIST {SCSI_VEND_ID, SCSI_DEV_ID}
-#endif
-
-#if defined(CONFIG_PCI) && !defined(CONFIG_SCSI_AHCI_PLAT)
-const struct pci_device_id scsi_device_list[] = { SCSI_DEV_LIST };
-#endif
-static ccb tempccb;	/* temporary scsi command buffer */
-
-static unsigned char tempbuff[512]; /* temporary data buffer */
-
-static int scsi_max_devs; /* number of highest available scsi device */
 
 static int scsi_curr_dev; /* current device */
 
-static struct blk_desc scsi_dev_desc[CONFIG_SYS_SCSI_MAX_DEVICE];
-
-/********************************************************************************
- *  forward declerations of some Setup Routines
- */
-void scsi_setup_test_unit_ready(ccb * pccb);
-void scsi_setup_read6(ccb * pccb, lbaint_t start, unsigned short blocks);
-void scsi_setup_read_ext(ccb * pccb, lbaint_t start, unsigned short blocks);
-void scsi_setup_read16(ccb * pccb, lbaint_t start, unsigned long blocks);
-
-static void scsi_setup_write_ext(ccb *pccb, lbaint_t start,
-				unsigned short blocks);
-void scsi_setup_inquiry(ccb * pccb);
-void scsi_ident_cpy (unsigned char *dest, unsigned char *src, unsigned int len);
-
-
-static int scsi_read_capacity(ccb *pccb, lbaint_t *capacity,
-			      unsigned long *blksz);
-static ulong scsi_read(struct blk_desc *block_dev, lbaint_t blknr,
-		       lbaint_t blkcnt, void *buffer);
-static ulong scsi_write(struct blk_desc *block_dev, lbaint_t blknr,
-			lbaint_t blkcnt, const void *buffer);
-
-
-/*********************************************************************************
- * (re)-scan the scsi bus and reports scsi device info
- * to the user if mode = 1
- */
-void scsi_scan(int mode)
-{
-	unsigned char i,perq,modi,lun;
-	lbaint_t capacity;
-	unsigned long blksz;
-	ccb* pccb=(ccb *)&tempccb;
-
-	if(mode==1) {
-		printf("scanning bus for devices...\n");
-	}
-	for(i=0;i<CONFIG_SYS_SCSI_MAX_DEVICE;i++) {
-		scsi_dev_desc[i].target=0xff;
-		scsi_dev_desc[i].lun=0xff;
-		scsi_dev_desc[i].lba=0;
-		scsi_dev_desc[i].blksz=0;
-		scsi_dev_desc[i].log2blksz =
-			LOG2_INVALID(typeof(scsi_dev_desc[i].log2blksz));
-		scsi_dev_desc[i].type=DEV_TYPE_UNKNOWN;
-		scsi_dev_desc[i].vendor[0]=0;
-		scsi_dev_desc[i].product[0]=0;
-		scsi_dev_desc[i].revision[0]=0;
-		scsi_dev_desc[i].removable = false;
-		scsi_dev_desc[i].if_type=IF_TYPE_SCSI;
-		scsi_dev_desc[i].devnum = i;
-		scsi_dev_desc[i].part_type=PART_TYPE_UNKNOWN;
-		scsi_dev_desc[i].block_read=scsi_read;
-		scsi_dev_desc[i].block_write = scsi_write;
-	}
-	scsi_max_devs=0;
-	for(i=0;i<CONFIG_SYS_SCSI_MAX_SCSI_ID;i++) {
-		pccb->target=i;
-		for(lun=0;lun<CONFIG_SYS_SCSI_MAX_LUN;lun++) {
-			pccb->lun=lun;
-			pccb->pdata=(unsigned char *)&tempbuff;
-			pccb->datalen=512;
-			scsi_setup_inquiry(pccb);
-			if (scsi_exec(pccb) != true) {
-				if(pccb->contr_stat==SCSI_SEL_TIME_OUT) {
-					debug ("Selection timeout ID %d\n",pccb->target);
-					continue; /* selection timeout => assuming no device present */
-				}
-				scsi_print_error(pccb);
-				continue;
-			}
-			perq=tempbuff[0];
-			modi=tempbuff[1];
-			if((perq & 0x1f)==0x1f) {
-				continue; /* skip unknown devices */
-			}
-			if((modi&0x80)==0x80) /* drive is removable */
-				scsi_dev_desc[scsi_max_devs].removable=true;
-			/* get info for this device */
-			scsi_ident_cpy((unsigned char *)&scsi_dev_desc[scsi_max_devs].vendor[0],
-				       &tempbuff[8], 8);
-			scsi_ident_cpy((unsigned char *)&scsi_dev_desc[scsi_max_devs].product[0],
-				       &tempbuff[16], 16);
-			scsi_ident_cpy((unsigned char *)&scsi_dev_desc[scsi_max_devs].revision[0],
-				       &tempbuff[32], 4);
-			scsi_dev_desc[scsi_max_devs].target=pccb->target;
-			scsi_dev_desc[scsi_max_devs].lun=pccb->lun;
-
-			pccb->datalen=0;
-			scsi_setup_test_unit_ready(pccb);
-			if (scsi_exec(pccb) != true) {
-				if (scsi_dev_desc[scsi_max_devs].removable == true) {
-					scsi_dev_desc[scsi_max_devs].type=perq;
-					goto removable;
-				}
-				scsi_print_error(pccb);
-				continue;
-			}
-			if (scsi_read_capacity(pccb, &capacity, &blksz)) {
-				scsi_print_error(pccb);
-				continue;
-			}
-			scsi_dev_desc[scsi_max_devs].lba=capacity;
-			scsi_dev_desc[scsi_max_devs].blksz=blksz;
-			scsi_dev_desc[scsi_max_devs].log2blksz =
-				LOG2(scsi_dev_desc[scsi_max_devs].blksz);
-			scsi_dev_desc[scsi_max_devs].type=perq;
-			part_init(&scsi_dev_desc[scsi_max_devs]);
-removable:
-			if(mode==1) {
-				printf ("  Device %d: ", scsi_max_devs);
-				dev_print(&scsi_dev_desc[scsi_max_devs]);
-			} /* if mode */
-			scsi_max_devs++;
-		} /* next LUN */
-	}
-	if(scsi_max_devs>0)
-		scsi_curr_dev=0;
-	else
-		scsi_curr_dev = -1;
-
-	printf("Found %d device(s).\n", scsi_max_devs);
-#ifndef CONFIG_SPL_BUILD
-	setenv_ulong("scsidevs", scsi_max_devs);
-#endif
-}
-
-int scsi_get_disk_count(void)
-{
-	return scsi_max_devs;
-}
-
-#if defined(CONFIG_PCI) && !defined(CONFIG_SCSI_AHCI_PLAT)
-void scsi_init(void)
-{
-	int busdevfunc = -1;
-	int i;
-	/*
-	 * Find a device from the list, this driver will support a single
-	 * controller.
-	 */
-	for (i = 0; i < ARRAY_SIZE(scsi_device_list); i++) {
-		/* get PCI Device ID */
-#ifdef CONFIG_DM_PCI
-		struct udevice *dev;
-		int ret;
-
-		ret = dm_pci_find_device(scsi_device_list[i].vendor,
-					 scsi_device_list[i].device, 0, &dev);
-		if (!ret) {
-			busdevfunc = dm_pci_get_bdf(dev);
-			break;
-		}
-#else
-		busdevfunc = pci_find_device(scsi_device_list[i].vendor,
-					     scsi_device_list[i].device,
-					     0);
-#endif
-		if (busdevfunc != -1)
-			break;
-	}
-
-	if (busdevfunc == -1) {
-		printf("Error: SCSI Controller(s) ");
-		for (i = 0; i < ARRAY_SIZE(scsi_device_list); i++) {
-			printf("%04X:%04X ",
-			       scsi_device_list[i].vendor,
-			       scsi_device_list[i].device);
-		}
-		printf("not found\n");
-		return;
-	}
-#ifdef DEBUG
-	else {
-		printf("SCSI Controller (%04X,%04X) found (%d:%d:%d)\n",
-		       scsi_device_list[i].vendor,
-		       scsi_device_list[i].device,
-		       (busdevfunc >> 16) & 0xFF,
-		       (busdevfunc >> 11) & 0x1F,
-		       (busdevfunc >> 8) & 0x7);
-	}
-#endif
-	bootstage_start(BOOTSTAGE_ID_ACCUM_SCSI, "ahci");
-	scsi_low_level_init(busdevfunc);
-	scsi_scan(1);
-	bootstage_accum(BOOTSTAGE_ID_ACCUM_SCSI);
-}
-#endif
-
-#ifdef CONFIG_PARTITIONS
-struct blk_desc *scsi_get_dev(int dev)
-{
-	return (dev < CONFIG_SYS_SCSI_MAX_DEVICE) ? &scsi_dev_desc[dev] : NULL;
-}
-#endif
-
-#ifndef CONFIG_SPL_BUILD
-/******************************************************************************
+/*
  * scsi boot command intepreter. Derived from diskboot
  */
-int do_scsiboot (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+int do_scsiboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 {
 	return common_diskboot(cmdtp, "scsi", argc, argv);
 }
 
-/*********************************************************************************
+/*
  * scsi command intepreter
  */
-int do_scsi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+int do_scsi(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 {
 	switch (argc) {
 	case 0:
 	case 1:
 		return CMD_RET_USAGE;
-
 	case 2:
-			if (strncmp(argv[1],"res",3) == 0) {
-				printf("\nReset SCSI\n");
-				scsi_bus_reset();
-				scsi_scan(1);
-				return 0;
+		if (strncmp(argv[1], "res", 3) == 0) {
+			printf("\nReset SCSI\n");
+			scsi_bus_reset();
+			scsi_scan(1);
+			return 0;
+		}
+		if (strncmp(argv[1], "inf", 3) == 0) {
+			blk_list_devices(IF_TYPE_SCSI);
+			return 0;
+		}
+		if (strncmp(argv[1], "dev", 3) == 0) {
+			if (blk_print_device_num(IF_TYPE_SCSI, scsi_curr_dev)) {
+				printf("\nno SCSI devices available\n");
+				return CMD_RET_FAILURE;
 			}
-			if (strncmp(argv[1],"inf",3) == 0) {
-				int i;
-				for (i=0; i<CONFIG_SYS_SCSI_MAX_DEVICE; ++i) {
-					if(scsi_dev_desc[i].type==DEV_TYPE_UNKNOWN)
-						continue; /* list only known devices */
-					printf ("SCSI dev. %d:  ", i);
-					dev_print(&scsi_dev_desc[i]);
-				}
-				return 0;
-			}
-			if (strncmp(argv[1],"dev",3) == 0) {
-				if ((scsi_curr_dev < 0) || (scsi_curr_dev >= CONFIG_SYS_SCSI_MAX_DEVICE)) {
-					printf("\nno SCSI devices available\n");
-					return 1;
-				}
-				printf ("\n    Device %d: ", scsi_curr_dev);
-				dev_print(&scsi_dev_desc[scsi_curr_dev]);
-				return 0;
-			}
-			if (strncmp(argv[1],"scan",4) == 0) {
-				scsi_scan(1);
-				return 0;
-			}
-			if (strncmp(argv[1],"part",4) == 0) {
-				int dev, ok;
-				for (ok=0, dev=0; dev<CONFIG_SYS_SCSI_MAX_DEVICE; ++dev) {
-					if (scsi_dev_desc[dev].type!=DEV_TYPE_UNKNOWN) {
-						ok++;
-						if (dev)
-							printf("\n");
-						debug ("print_part of %x\n",dev);
-						part_print(&scsi_dev_desc[dev]);
-					}
-				}
-				if (!ok)
-					printf("\nno SCSI devices available\n");
-				return 1;
-			}
-			return CMD_RET_USAGE;
+
+			return 0;
+		}
+		if (strncmp(argv[1], "scan", 4) == 0) {
+			scsi_scan(1);
+			return 0;
+		}
+		if (strncmp(argv[1], "part", 4) == 0) {
+			if (blk_list_part(IF_TYPE_SCSI))
+				printf("\nno SCSI devices available\n");
+			return 0;
+		}
+		return CMD_RET_USAGE;
 	case 3:
-			if (strncmp(argv[1],"dev",3) == 0) {
-				int dev = (int)simple_strtoul(argv[2], NULL, 10);
-				printf ("\nSCSI device %d: ", dev);
-				if (dev >= CONFIG_SYS_SCSI_MAX_DEVICE) {
-					printf("unknown device\n");
-					return 1;
-				}
-				printf ("\n    Device %d: ", dev);
-				dev_print(&scsi_dev_desc[dev]);
-				if(scsi_dev_desc[dev].type == DEV_TYPE_UNKNOWN) {
-					return 1;
-				}
+		if (strncmp(argv[1], "dev", 3) == 0) {
+			int dev = (int)simple_strtoul(argv[2], NULL, 10);
+
+			if (!blk_show_device(IF_TYPE_SCSI, dev)) {
 				scsi_curr_dev = dev;
 				printf("... is now current device\n");
-				return 0;
+			} else {
+				return CMD_RET_FAILURE;
 			}
-			if (strncmp(argv[1],"part",4) == 0) {
-				int dev = (int)simple_strtoul(argv[2], NULL, 10);
-				if(scsi_dev_desc[dev].type != DEV_TYPE_UNKNOWN) {
-					part_print(&scsi_dev_desc[dev]);
-				}
-				else {
-					printf ("\nSCSI device %d not available\n", dev);
-				}
-				return 1;
+			return 0;
+		}
+		if (strncmp(argv[1], "part", 4) == 0) {
+			int dev = (int)simple_strtoul(argv[2], NULL, 10);
+
+			if (blk_print_part_devnum(IF_TYPE_SCSI, dev)) {
+				printf("\nSCSI device %d not available\n",
+				       dev);
+				return CMD_RET_FAILURE;
 			}
-			return CMD_RET_USAGE;
-    default:
-			/* at least 4 args */
-			if (strcmp(argv[1],"read") == 0) {
-				ulong addr = simple_strtoul(argv[2], NULL, 16);
-				ulong blk  = simple_strtoul(argv[3], NULL, 16);
-				ulong cnt  = simple_strtoul(argv[4], NULL, 16);
-				ulong n;
-				printf ("\nSCSI read: device %d block # %ld, count %ld ... ",
-						scsi_curr_dev, blk, cnt);
-				n = scsi_read(&scsi_dev_desc[scsi_curr_dev],
-					      blk, cnt, (ulong *)addr);
-				printf ("%ld blocks read: %s\n",n,(n==cnt) ? "OK" : "ERROR");
-				return 0;
-			} else if (strcmp(argv[1], "write") == 0) {
-				ulong addr = simple_strtoul(argv[2], NULL, 16);
-				ulong blk = simple_strtoul(argv[3], NULL, 16);
-				ulong cnt = simple_strtoul(argv[4], NULL, 16);
-				ulong n;
-				printf("\nSCSI write: device %d block # %ld, "
-				       "count %ld ... ",
-				       scsi_curr_dev, blk, cnt);
-				n = scsi_write(&scsi_dev_desc[scsi_curr_dev],
-					       blk, cnt, (ulong *)addr);
-				printf("%ld blocks written: %s\n", n,
-				       (n == cnt) ? "OK" : "ERROR");
-				return 0;
-			}
+			return 0;
+		}
+		return CMD_RET_USAGE;
+	default:
+		/* at least 4 args */
+		if (strcmp(argv[1], "read") == 0) {
+			ulong addr = simple_strtoul(argv[2], NULL, 16);
+			ulong blk  = simple_strtoul(argv[3], NULL, 16);
+			ulong cnt  = simple_strtoul(argv[4], NULL, 16);
+			ulong n;
+
+			printf("\nSCSI read: device %d block # %ld, count %ld ... ",
+			       scsi_curr_dev, blk, cnt);
+			n = blk_read_devnum(IF_TYPE_SCSI, scsi_curr_dev, blk,
+					    cnt, (ulong *)addr);
+			printf("%ld blocks read: %s\n", n,
+			       n == cnt ? "OK" : "ERROR");
+			return 0;
+		} else if (strcmp(argv[1], "write") == 0) {
+			ulong addr = simple_strtoul(argv[2], NULL, 16);
+			ulong blk = simple_strtoul(argv[3], NULL, 16);
+			ulong cnt = simple_strtoul(argv[4], NULL, 16);
+			ulong n;
+
+			printf("\nSCSI write: device %d block # %ld, count %ld ... ",
+			       scsi_curr_dev, blk, cnt);
+			n = blk_write_devnum(IF_TYPE_SCSI, scsi_curr_dev, blk,
+					     cnt, (ulong *)addr);
+			printf("%ld blocks written: %s\n", n,
+			       n == cnt ? "OK" : "ERROR");
+			return 0;
+		}
 	} /* switch */
 	return CMD_RET_USAGE;
 }
@@ -388,347 +135,3 @@
 	"boot from SCSI device",
 	"loadAddr dev:part"
 );
-#endif
-
-/****************************************************************************************
- * scsi_read
- */
-
-/* almost the maximum amount of the scsi_ext command.. */
-#define SCSI_MAX_READ_BLK 0xFFFF
-#define SCSI_LBA48_READ	0xFFFFFFF
-
-static ulong scsi_read(struct blk_desc *block_dev, lbaint_t blknr,
-		       lbaint_t blkcnt, void *buffer)
-{
-	int device = block_dev->devnum;
-	lbaint_t start, blks;
-	uintptr_t buf_addr;
-	unsigned short smallblks = 0;
-	ccb* pccb=(ccb *)&tempccb;
-	device&=0xff;
-	/* Setup  device
-	 */
-	pccb->target=scsi_dev_desc[device].target;
-	pccb->lun=scsi_dev_desc[device].lun;
-	buf_addr=(unsigned long)buffer;
-	start=blknr;
-	blks=blkcnt;
-	debug("\nscsi_read: dev %d startblk " LBAF
-	      ", blccnt " LBAF " buffer %lx\n",
-	      device, start, blks, (unsigned long)buffer);
-	do {
-		pccb->pdata=(unsigned char *)buf_addr;
-#ifdef CONFIG_SYS_64BIT_LBA
-		if (start > SCSI_LBA48_READ) {
-			unsigned long blocks;
-			blocks = min_t(lbaint_t, blks, SCSI_MAX_READ_BLK);
-			pccb->datalen = scsi_dev_desc[device].blksz * blocks;
-			scsi_setup_read16(pccb, start, blocks);
-			start += blocks;
-			blks -= blocks;
-		} else
-#endif
-		if (blks > SCSI_MAX_READ_BLK) {
-			pccb->datalen=scsi_dev_desc[device].blksz * SCSI_MAX_READ_BLK;
-			smallblks=SCSI_MAX_READ_BLK;
-			scsi_setup_read_ext(pccb,start,smallblks);
-			start+=SCSI_MAX_READ_BLK;
-			blks-=SCSI_MAX_READ_BLK;
-		}
-		else {
-			pccb->datalen=scsi_dev_desc[device].blksz * blks;
-			smallblks=(unsigned short) blks;
-			scsi_setup_read_ext(pccb,start,smallblks);
-			start+=blks;
-			blks=0;
-		}
-		debug("scsi_read_ext: startblk " LBAF
-		      ", blccnt %x buffer %" PRIXPTR "\n",
-		      start, smallblks, buf_addr);
-		if (scsi_exec(pccb) != true) {
-			scsi_print_error(pccb);
-			blkcnt-=blks;
-			break;
-		}
-		buf_addr+=pccb->datalen;
-	} while(blks!=0);
-	debug("scsi_read_ext: end startblk " LBAF
-	      ", blccnt %x buffer %" PRIXPTR "\n", start, smallblks, buf_addr);
-	return(blkcnt);
-}
-
-/*******************************************************************************
- * scsi_write
- */
-
-/* Almost the maximum amount of the scsi_ext command.. */
-#define SCSI_MAX_WRITE_BLK 0xFFFF
-
-static ulong scsi_write(struct blk_desc *block_dev, lbaint_t blknr,
-			lbaint_t blkcnt, const void *buffer)
-{
-	int device = block_dev->devnum;
-	lbaint_t start, blks;
-	uintptr_t buf_addr;
-	unsigned short smallblks;
-	ccb* pccb = (ccb *)&tempccb;
-	device &= 0xff;
-	/* Setup  device
-	 */
-	pccb->target = scsi_dev_desc[device].target;
-	pccb->lun = scsi_dev_desc[device].lun;
-	buf_addr = (unsigned long)buffer;
-	start = blknr;
-	blks = blkcnt;
-	debug("\n%s: dev %d startblk " LBAF ", blccnt " LBAF " buffer %lx\n",
-	      __func__, device, start, blks, (unsigned long)buffer);
-	do {
-		pccb->pdata = (unsigned char *)buf_addr;
-		if (blks > SCSI_MAX_WRITE_BLK) {
-			pccb->datalen = (scsi_dev_desc[device].blksz *
-					 SCSI_MAX_WRITE_BLK);
-			smallblks = SCSI_MAX_WRITE_BLK;
-			scsi_setup_write_ext(pccb, start, smallblks);
-			start += SCSI_MAX_WRITE_BLK;
-			blks -= SCSI_MAX_WRITE_BLK;
-		} else {
-			pccb->datalen = scsi_dev_desc[device].blksz * blks;
-			smallblks = (unsigned short)blks;
-			scsi_setup_write_ext(pccb, start, smallblks);
-			start += blks;
-			blks = 0;
-		}
-		debug("%s: startblk " LBAF ", blccnt %x buffer %" PRIXPTR "\n",
-		      __func__, start, smallblks, buf_addr);
-		if (scsi_exec(pccb) != true) {
-			scsi_print_error(pccb);
-			blkcnt -= blks;
-			break;
-		}
-		buf_addr += pccb->datalen;
-	} while (blks != 0);
-	debug("%s: end startblk " LBAF ", blccnt %x buffer %" PRIXPTR "\n",
-	      __func__, start, smallblks, buf_addr);
-	return blkcnt;
-}
-
-/* copy src to dest, skipping leading and trailing blanks
- * and null terminate the string
- */
-void scsi_ident_cpy (unsigned char *dest, unsigned char *src, unsigned int len)
-{
-	int start,end;
-
-	start=0;
-	while(start<len) {
-		if(src[start]!=' ')
-			break;
-		start++;
-	}
-	end=len-1;
-	while(end>start) {
-		if(src[end]!=' ')
-			break;
-		end--;
-	}
-	for( ; start<=end; start++) {
-		*dest++=src[start];
-	}
-	*dest='\0';
-}
-
-
-/* Trim trailing blanks, and NUL-terminate string
- */
-void scsi_trim_trail (unsigned char *str, unsigned int len)
-{
-	unsigned char *p = str + len - 1;
-
-	while (len-- > 0) {
-		*p-- = '\0';
-		if (*p != ' ') {
-			return;
-		}
-	}
-}
-
-int scsi_read_capacity(ccb *pccb, lbaint_t *capacity, unsigned long *blksz)
-{
-	*capacity = 0;
-
-	memset(pccb->cmd, 0, sizeof(pccb->cmd));
-	pccb->cmd[0] = SCSI_RD_CAPAC10;
-	pccb->cmd[1] = pccb->lun << 5;
-	pccb->cmdlen = 10;
-	pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */
-
-	pccb->datalen = 8;
-	if (scsi_exec(pccb) != true)
-		return 1;
-
-	*capacity = ((lbaint_t)pccb->pdata[0] << 24) |
-		    ((lbaint_t)pccb->pdata[1] << 16) |
-		    ((lbaint_t)pccb->pdata[2] << 8)  |
-		    ((lbaint_t)pccb->pdata[3]);
-
-	if (*capacity != 0xffffffff) {
-		/* Read capacity (10) was sufficient for this drive. */
-		*blksz = ((unsigned long)pccb->pdata[4] << 24) |
-			 ((unsigned long)pccb->pdata[5] << 16) |
-			 ((unsigned long)pccb->pdata[6] << 8)  |
-			 ((unsigned long)pccb->pdata[7]);
-		return 0;
-	}
-
-	/* Read capacity (10) was insufficient. Use read capacity (16). */
-
-	memset(pccb->cmd, 0, sizeof(pccb->cmd));
-	pccb->cmd[0] = SCSI_RD_CAPAC16;
-	pccb->cmd[1] = 0x10;
-	pccb->cmdlen = 16;
-	pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */
-
-	pccb->datalen = 16;
-	if (scsi_exec(pccb) != true)
-		return 1;
-
-	*capacity = ((uint64_t)pccb->pdata[0] << 56) |
-		    ((uint64_t)pccb->pdata[1] << 48) |
-		    ((uint64_t)pccb->pdata[2] << 40) |
-		    ((uint64_t)pccb->pdata[3] << 32) |
-		    ((uint64_t)pccb->pdata[4] << 24) |
-		    ((uint64_t)pccb->pdata[5] << 16) |
-		    ((uint64_t)pccb->pdata[6] << 8)  |
-		    ((uint64_t)pccb->pdata[7]);
-
-	*blksz = ((uint64_t)pccb->pdata[8]  << 56) |
-		 ((uint64_t)pccb->pdata[9]  << 48) |
-		 ((uint64_t)pccb->pdata[10] << 40) |
-		 ((uint64_t)pccb->pdata[11] << 32) |
-		 ((uint64_t)pccb->pdata[12] << 24) |
-		 ((uint64_t)pccb->pdata[13] << 16) |
-		 ((uint64_t)pccb->pdata[14] << 8)  |
-		 ((uint64_t)pccb->pdata[15]);
-
-	return 0;
-}
-
-
-/************************************************************************************
- * Some setup (fill-in) routines
- */
-void scsi_setup_test_unit_ready(ccb * pccb)
-{
-	pccb->cmd[0]=SCSI_TST_U_RDY;
-	pccb->cmd[1]=pccb->lun<<5;
-	pccb->cmd[2]=0;
-	pccb->cmd[3]=0;
-	pccb->cmd[4]=0;
-	pccb->cmd[5]=0;
-	pccb->cmdlen=6;
-	pccb->msgout[0]=SCSI_IDENTIFY; /* NOT USED */
-}
-
-#ifdef CONFIG_SYS_64BIT_LBA
-void scsi_setup_read16(ccb * pccb, lbaint_t start, unsigned long blocks)
-{
-	pccb->cmd[0] = SCSI_READ16;
-	pccb->cmd[1] = pccb->lun<<5;
-	pccb->cmd[2] = ((unsigned char) (start >> 56)) & 0xff;
-	pccb->cmd[3] = ((unsigned char) (start >> 48)) & 0xff;
-	pccb->cmd[4] = ((unsigned char) (start >> 40)) & 0xff;
-	pccb->cmd[5] = ((unsigned char) (start >> 32)) & 0xff;
-	pccb->cmd[6] = ((unsigned char) (start >> 24)) & 0xff;
-	pccb->cmd[7] = ((unsigned char) (start >> 16)) & 0xff;
-	pccb->cmd[8] = ((unsigned char) (start >> 8)) & 0xff;
-	pccb->cmd[9] = ((unsigned char) (start)) & 0xff;
-	pccb->cmd[10] = 0;
-	pccb->cmd[11] = ((unsigned char) (blocks >> 24)) & 0xff;
-	pccb->cmd[12] = ((unsigned char) (blocks >> 16)) & 0xff;
-	pccb->cmd[13] = ((unsigned char) (blocks >> 8)) & 0xff;
-	pccb->cmd[14] = (unsigned char) blocks & 0xff;
-	pccb->cmd[15] = 0;
-	pccb->cmdlen = 16;
-	pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */
-	debug ("scsi_setup_read16: cmd: %02X %02X "
-	       "startblk %02X%02X%02X%02X%02X%02X%02X%02X "
-	       "blccnt %02X%02X%02X%02X\n",
-		pccb->cmd[0], pccb->cmd[1],
-		pccb->cmd[2], pccb->cmd[3], pccb->cmd[4], pccb->cmd[5],
-		pccb->cmd[6], pccb->cmd[7], pccb->cmd[8], pccb->cmd[9],
-		pccb->cmd[11], pccb->cmd[12], pccb->cmd[13], pccb->cmd[14]);
-}
-#endif
-
-void scsi_setup_read_ext(ccb * pccb, lbaint_t start, unsigned short blocks)
-{
-	pccb->cmd[0]=SCSI_READ10;
-	pccb->cmd[1]=pccb->lun<<5;
-	pccb->cmd[2]=((unsigned char) (start>>24))&0xff;
-	pccb->cmd[3]=((unsigned char) (start>>16))&0xff;
-	pccb->cmd[4]=((unsigned char) (start>>8))&0xff;
-	pccb->cmd[5]=((unsigned char) (start))&0xff;
-	pccb->cmd[6]=0;
-	pccb->cmd[7]=((unsigned char) (blocks>>8))&0xff;
-	pccb->cmd[8]=(unsigned char) blocks & 0xff;
-	pccb->cmd[6]=0;
-	pccb->cmdlen=10;
-	pccb->msgout[0]=SCSI_IDENTIFY; /* NOT USED */
-	debug ("scsi_setup_read_ext: cmd: %02X %02X startblk %02X%02X%02X%02X blccnt %02X%02X\n",
-		pccb->cmd[0],pccb->cmd[1],
-		pccb->cmd[2],pccb->cmd[3],pccb->cmd[4],pccb->cmd[5],
-		pccb->cmd[7],pccb->cmd[8]);
-}
-
-void scsi_setup_write_ext(ccb *pccb, lbaint_t start, unsigned short blocks)
-{
-	pccb->cmd[0] = SCSI_WRITE10;
-	pccb->cmd[1] = pccb->lun << 5;
-	pccb->cmd[2] = ((unsigned char) (start>>24)) & 0xff;
-	pccb->cmd[3] = ((unsigned char) (start>>16)) & 0xff;
-	pccb->cmd[4] = ((unsigned char) (start>>8)) & 0xff;
-	pccb->cmd[5] = ((unsigned char) (start)) & 0xff;
-	pccb->cmd[6] = 0;
-	pccb->cmd[7] = ((unsigned char) (blocks>>8)) & 0xff;
-	pccb->cmd[8] = (unsigned char)blocks & 0xff;
-	pccb->cmd[9] = 0;
-	pccb->cmdlen = 10;
-	pccb->msgout[0] = SCSI_IDENTIFY;  /* NOT USED */
-	debug("%s: cmd: %02X %02X startblk %02X%02X%02X%02X blccnt %02X%02X\n",
-	      __func__,
-	      pccb->cmd[0], pccb->cmd[1],
-	      pccb->cmd[2], pccb->cmd[3], pccb->cmd[4], pccb->cmd[5],
-	      pccb->cmd[7], pccb->cmd[8]);
-}
-
-void scsi_setup_read6(ccb * pccb, lbaint_t start, unsigned short blocks)
-{
-	pccb->cmd[0]=SCSI_READ6;
-	pccb->cmd[1]=pccb->lun<<5 | (((unsigned char)(start>>16))&0x1f);
-	pccb->cmd[2]=((unsigned char) (start>>8))&0xff;
-	pccb->cmd[3]=((unsigned char) (start))&0xff;
-	pccb->cmd[4]=(unsigned char) blocks & 0xff;
-	pccb->cmd[5]=0;
-	pccb->cmdlen=6;
-	pccb->msgout[0]=SCSI_IDENTIFY; /* NOT USED */
-	debug ("scsi_setup_read6: cmd: %02X %02X startblk %02X%02X blccnt %02X\n",
-		pccb->cmd[0],pccb->cmd[1],
-		pccb->cmd[2],pccb->cmd[3],pccb->cmd[4]);
-}
-
-
-void scsi_setup_inquiry(ccb * pccb)
-{
-	pccb->cmd[0]=SCSI_INQUIRY;
-	pccb->cmd[1]=pccb->lun<<5;
-	pccb->cmd[2]=0;
-	pccb->cmd[3]=0;
-	if(pccb->datalen>255)
-		pccb->cmd[4]=255;
-	else
-		pccb->cmd[4]=(unsigned char)pccb->datalen;
-	pccb->cmd[5]=0;
-	pccb->cmdlen=6;
-	pccb->msgout[0]=SCSI_IDENTIFY; /* NOT USED */
-}
diff --git a/cmd/usb.c b/cmd/usb.c
index f1a7deb..b83d323 100644
--- a/cmd/usb.c
+++ b/cmd/usb.c
@@ -723,7 +723,8 @@
 		int devno, ok = 0;
 		if (argc == 2) {
 			for (devno = 0; ; ++devno) {
-				stor_dev = usb_stor_get_dev(devno);
+				stor_dev = blk_get_devnum_by_type(IF_TYPE_USB,
+								  devno);
 				if (stor_dev == NULL)
 					break;
 				if (stor_dev->type != DEV_TYPE_UNKNOWN) {
@@ -736,7 +737,7 @@
 			}
 		} else {
 			devno = simple_strtoul(argv[2], NULL, 16);
-			stor_dev = usb_stor_get_dev(devno);
+			stor_dev = blk_get_devnum_by_type(IF_TYPE_USB, devno);
 			if (stor_dev != NULL &&
 			    stor_dev->type != DEV_TYPE_UNKNOWN) {
 				ok++;
@@ -762,7 +763,8 @@
 			unsigned long n;
 			printf("\nUSB read: device %d block # %ld, count %ld"
 				" ... ", usb_stor_curr_dev, blk, cnt);
-			stor_dev = usb_stor_get_dev(usb_stor_curr_dev);
+			stor_dev = blk_get_devnum_by_type(IF_TYPE_USB,
+							  usb_stor_curr_dev);
 			n = blk_dread(stor_dev, blk, cnt, (ulong *)addr);
 			printf("%ld blocks read: %s\n", n,
 				(n == cnt) ? "OK" : "ERROR");
@@ -783,7 +785,8 @@
 			unsigned long n;
 			printf("\nUSB write: device %d block # %ld, count %ld"
 				" ... ", usb_stor_curr_dev, blk, cnt);
-			stor_dev = usb_stor_get_dev(usb_stor_curr_dev);
+			stor_dev = blk_get_devnum_by_type(IF_TYPE_USB,
+							  usb_stor_curr_dev);
 			n = blk_dwrite(stor_dev, blk, cnt, (ulong *)addr);
 			printf("%ld blocks write: %s\n", n,
 				(n == cnt) ? "OK" : "ERROR");
@@ -796,7 +799,7 @@
 		if (argc == 3) {
 			int dev = (int)simple_strtoul(argv[2], NULL, 10);
 			printf("\nUSB device %d: ", dev);
-			stor_dev = usb_stor_get_dev(dev);
+			stor_dev = blk_get_devnum_by_type(IF_TYPE_USB, dev);
 			if (stor_dev == NULL) {
 				printf("unknown device\n");
 				return 1;
@@ -810,7 +813,8 @@
 			return 0;
 		} else {
 			printf("\nUSB device %d: ", usb_stor_curr_dev);
-			stor_dev = usb_stor_get_dev(usb_stor_curr_dev);
+			stor_dev = blk_get_devnum_by_type(IF_TYPE_USB,
+							  usb_stor_curr_dev);
 			dev_print(stor_dev);
 			if (stor_dev->type == DEV_TYPE_UNKNOWN)
 				return 1;
diff --git a/common/Makefile b/common/Makefile
index b23f312..0562d5c 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -84,6 +84,8 @@
 obj-$(CONFIG_LCD_DT_SIMPLEFB) += lcd_simplefb.o
 obj-$(CONFIG_LYNXKDI) += lynxkdi.o
 obj-$(CONFIG_MENU) += menu.o
+obj-$(CONFIG_CMD_SATA) += sata.o
+obj-$(CONFIG_SCSI) += scsi.o
 obj-$(CONFIG_UPDATE_TFTP) += update.o
 obj-$(CONFIG_DFU_TFTP) += update.o
 obj-$(CONFIG_USB_KEYBOARD) += usb_kbd.o
@@ -112,6 +114,9 @@
 obj-$(CONFIG_ENV_IS_IN_SPI_FLASH) += env_sf.o
 obj-$(CONFIG_ENV_IS_IN_FLASH) += env_flash.o
 endif
+ifdef CONFIG_SPL_SATA_SUPPORT
+obj-$(CONFIG_SCSI) += scsi.o
+endif
 endif
 #environment
 obj-y += env_common.o
@@ -130,6 +135,7 @@
 ifdef CONFIG_SYS_MALLOC_F_LEN
 obj-y += malloc_simple.o
 endif
+obj-$(CONFIG_CMD_IDE) += ide.o
 obj-y += image.o
 obj-$(CONFIG_ANDROID_BOOT_IMAGE) += image-android.o
 obj-$(CONFIG_$(SPL_)OF_LIBFDT) += image-fdt.o
@@ -150,6 +156,9 @@
 endif
 endif
 
+ifdef CONFIG_CMD_EEPROM_LAYOUT
+obj-y += eeprom/eeprom_field.o eeprom/eeprom_layout.o
+endif
 # We always have this since drivers/ddr/fs/interactive.c needs it
 obj-$(CONFIG_CMDLINE) += cli_simple.o
 
diff --git a/common/board_r.c b/common/board_r.c
index ad02549..d959ad3 100644
--- a/common/board_r.c
+++ b/common/board_r.c
@@ -620,7 +620,7 @@
 }
 #endif
 
-#if defined(CONFIG_CMD_SCSI)
+#if defined(CONFIG_SCSI)
 static int initr_scsi(void)
 {
 	puts("SCSI:  ");
@@ -923,7 +923,7 @@
 	initr_ambapp_print,
 #endif
 #endif
-#ifdef CONFIG_CMD_SCSI
+#ifdef CONFIG_SCSI
 	INIT_FUNC_WATCHDOG_RESET
 	initr_scsi,
 #endif
diff --git a/common/bootm.c b/common/bootm.c
index c965326..4941414 100644
--- a/common/bootm.c
+++ b/common/bootm.c
@@ -246,6 +246,16 @@
 #endif
 
 #if IMAGE_ENABLE_FIT
+#if defined(CONFIG_FPGA) && defined(CONFIG_FPGA_XILINX)
+	/* find bitstreams */
+	ret = boot_get_fpga(argc, argv, &images, IH_ARCH_DEFAULT,
+			    NULL, NULL);
+	if (ret) {
+		printf("FPGA image is corrupted or invalid\n");
+		return 1;
+	}
+#endif
+
 	/* find all of the loadables */
 	ret = boot_get_loadable(argc, argv, &images, IH_ARCH_DEFAULT,
 			       NULL, NULL);
diff --git a/common/dlmalloc.c b/common/dlmalloc.c
index b09f524..adc680e 100644
--- a/common/dlmalloc.c
+++ b/common/dlmalloc.c
@@ -1909,6 +1909,7 @@
   * fulfill the user's request.
   */
   if (m == NULL) {
+    size_t extra, extra2;
     /*
      * Use bytes not nb, since mALLOc internally calls request2size too, and
      * each call increases the size to allocate, to account for the header.
@@ -1917,9 +1918,27 @@
     /* Aligned -> return it */
     if ((((unsigned long)(m)) % alignment) == 0)
       return m;
-    /* Otherwise, fail */
+    /*
+     * Otherwise, try again, requesting enough extra space to be able to
+     * acquire alignment.
+     */
     fREe(m);
-    m = NULL;
+    /* Add in extra bytes to match misalignment of unexpanded allocation */
+    extra = alignment - (((unsigned long)(m)) % alignment);
+    m  = (char*)(mALLOc(bytes + extra));
+    /*
+     * m might not be the same as before. Validate that the previous value of
+     * extra still works for the current value of m.
+     * If (!m), extra2=alignment so 
+     */
+    if (m) {
+      extra2 = alignment - (((unsigned long)(m)) % alignment);
+      if (extra2 > extra) {
+        fREe(m);
+        m = NULL;
+      }
+    }
+    /* Fall through to original NULL check and chunk splitting logic */
   }
 
   if (m == NULL) return NULL; /* propagate failure */
diff --git a/common/eeprom/eeprom_field.c b/common/eeprom/eeprom_field.c
new file mode 100644
index 0000000..7f095a6
--- /dev/null
+++ b/common/eeprom/eeprom_field.c
@@ -0,0 +1,250 @@
+/*
+ * (C) Copyright 2009-2016 CompuLab, Ltd.
+ *
+ * Authors: Nikita Kiryanov <nikita@compulab.co.il>
+ *	    Igor Grinberg <grinberg@compulab.co.il>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <linux/string.h>
+#include <eeprom_field.h>
+
+static void __eeprom_field_print_bin(const struct eeprom_field *field,
+				     char *delimiter, bool reverse)
+{
+	int i;
+	int from = reverse ? field->size - 1 : 0;
+	int to = reverse ? 0 : field->size - 1;
+
+	printf(PRINT_FIELD_SEGMENT, field->name);
+	for (i = from; i != to; reverse ? i-- : i++)
+		printf("%02x%s", field->buf[i], delimiter);
+
+	printf("%02x\n", field->buf[i]);
+}
+
+static int __eeprom_field_update_bin(struct eeprom_field *field,
+				     const char *value, bool reverse)
+{
+	int len = strlen(value);
+	int k, j, i = reverse ? len - 1 : 0;
+	unsigned char byte;
+	char *endptr;
+
+	/* each two characters in the string fit in one byte */
+	if (len > field->size * 2)
+		return -1;
+
+	memset(field->buf, 0, field->size);
+
+	/* i - string iterator, j - buf iterator */
+	for (j = 0; j < field->size; j++) {
+		byte = 0;
+		char tmp[3] = { 0, 0, 0 };
+
+		if ((reverse && i < 0) || (!reverse && i >= len))
+			break;
+
+		for (k = 0; k < 2; k++) {
+			if (reverse && i == 0) {
+				tmp[k] = value[i];
+				break;
+			}
+
+			tmp[k] = value[reverse ? i - 1 + k : i + k];
+		}
+
+		byte = simple_strtoul(tmp, &endptr, 0);
+		if (*endptr != '\0' || byte < 0)
+			return -1;
+
+		field->buf[j] = byte;
+		i = reverse ? i - 2 : i + 2;
+	}
+
+	return 0;
+}
+
+static int __eeprom_field_update_bin_delim(struct eeprom_field *field,
+					   char *value, char *delimiter)
+{
+	int count = 0;
+	int i, val;
+	const char *tmp = value;
+	char *tok;
+	char *endptr;
+
+	tmp = strstr(tmp, delimiter);
+	while (tmp != NULL) {
+		count++;
+		tmp++;
+		tmp = strstr(tmp, delimiter);
+	}
+
+	if (count > field->size)
+		return -1;
+
+	tok = strtok(value, delimiter);
+	for (i = 0; tok && i < field->size; i++) {
+		val = simple_strtoul(tok, &endptr, 0);
+		if (*endptr != '\0')
+			return -1;
+
+		/* here we assume that each tok is no more than byte long */
+		field->buf[i] = (unsigned char)val;
+		tok = strtok(NULL, delimiter);
+	}
+
+	return 0;
+}
+
+/**
+ * eeprom_field_print_bin() - print a field which contains binary data
+ *
+ * Treat the field data as simple binary data, and print it as two digit
+ * hexadecimal values.
+ * Sample output:
+ *      Field Name       0102030405060708090a
+ *
+ * @field:	an initialized field to print
+ */
+void eeprom_field_print_bin(const struct eeprom_field *field)
+{
+	__eeprom_field_print_bin(field, "", false);
+}
+
+/**
+ * eeprom_field_update_bin() - Update field with new data in binary form
+ *
+ * @field:	an initialized field
+ * @value:	a string of values (i.e. "10b234a")
+ */
+int eeprom_field_update_bin(struct eeprom_field *field, char *value)
+{
+	return __eeprom_field_update_bin(field, value, false);
+}
+
+/**
+ * eeprom_field_update_reserved() - Update reserved field with new data in
+ *				    binary form
+ *
+ * @field:	an initialized field
+ * @value:	a space delimited string of byte values (i.e. "1 02 3 0x4")
+ */
+int eeprom_field_update_reserved(struct eeprom_field *field, char *value)
+{
+	return __eeprom_field_update_bin_delim(field, value, " ");
+}
+
+/**
+ * eeprom_field_print_bin_rev() - print a field which contains binary data in
+ *				  reverse order
+ *
+ * Treat the field data as simple binary data, and print it in reverse order
+ * as two digit hexadecimal values.
+ *
+ * Data in field:
+ *                      0102030405060708090a
+ * Sample output:
+ *      Field Name      0a090807060504030201
+ *
+ * @field:	an initialized field to print
+ */
+void eeprom_field_print_bin_rev(const struct eeprom_field *field)
+{
+	__eeprom_field_print_bin(field, "", true);
+}
+
+/**
+ * eeprom_field_update_bin_rev() - Update field with new data in binary form,
+ *				   storing it in reverse
+ *
+ * This function takes a string of byte values, and stores them
+ * in the field in the reverse order. i.e. if the input string was "1234",
+ * "3412" will be written to the field.
+ *
+ * @field:	an initialized field
+ * @value:	a string of byte values
+ */
+int eeprom_field_update_bin_rev(struct eeprom_field *field, char *value)
+{
+	return __eeprom_field_update_bin(field, value, true);
+}
+
+/**
+ * eeprom_field_print_mac_addr() - print a field which contains a mac address
+ *
+ * Treat the field data as simple binary data, and print it formatted as a MAC
+ * address.
+ * Sample output:
+ *      Field Name     01:02:03:04:05:06
+ *
+ * @field:	an initialized field to print
+ */
+void eeprom_field_print_mac(const struct eeprom_field *field)
+{
+	__eeprom_field_print_bin(field, ":", false);
+}
+
+/**
+ * eeprom_field_update_mac() - Update a mac address field which contains binary
+ *			       data
+ *
+ * @field:	an initialized field
+ * @value:	a colon delimited string of byte values (i.e. "1:02:3:ff")
+ */
+int eeprom_field_update_mac(struct eeprom_field *field, char *value)
+{
+	return __eeprom_field_update_bin_delim(field, value, ":");
+}
+
+/**
+ * eeprom_field_print_ascii() - print a field which contains ASCII data
+ * @field:	an initialized field to print
+ */
+void eeprom_field_print_ascii(const struct eeprom_field *field)
+{
+	char format[8];
+
+	sprintf(format, "%%.%ds\n", field->size);
+	printf(PRINT_FIELD_SEGMENT, field->name);
+	printf(format, field->buf);
+}
+
+/**
+ * eeprom_field_update_ascii() - Update field with new data in ASCII form
+ * @field:	an initialized field
+ * @value:	the new string data
+ *
+ * Returns 0 on success, -1 of failure (new string too long).
+ */
+int eeprom_field_update_ascii(struct eeprom_field *field, char *value)
+{
+	if (strlen(value) >= field->size) {
+		printf("%s: new data too long\n", field->name);
+		return -1;
+	}
+
+	strncpy((char *)field->buf, value, field->size - 1);
+	field->buf[field->size - 1] = '\0';
+
+	return 0;
+}
+
+/**
+ * eeprom_field_print_reserved() - print the "Reserved fields" field
+ *
+ * Print a notice that the following field_size bytes are reserved.
+ *
+ * Sample output:
+ *      Reserved fields              (64 bytes)
+ *
+ * @field:	an initialized field to print
+ */
+void eeprom_field_print_reserved(const struct eeprom_field *field)
+{
+	printf(PRINT_FIELD_SEGMENT, "Reserved fields\t");
+	printf("(%d bytes)\n", field->size);
+}
diff --git a/common/eeprom/eeprom_layout.c b/common/eeprom/eeprom_layout.c
new file mode 100644
index 0000000..c059233
--- /dev/null
+++ b/common/eeprom/eeprom_layout.c
@@ -0,0 +1,125 @@
+/*
+ * (C) Copyright 2009-2016 CompuLab, Ltd.
+ *
+ * Authors: Nikita Kiryanov <nikita@compulab.co.il>
+ *	    Igor Grinberg <grinberg@compulab.co.il>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <linux/kernel.h>
+#include <eeprom_layout.h>
+#include <eeprom_field.h>
+
+#define NO_LAYOUT_FIELDS	"Unknown layout. Dumping raw data\n"
+
+struct eeprom_field layout_unknown[1] = {
+	{ NO_LAYOUT_FIELDS, 256, NULL, eeprom_field_print_bin,
+				       eeprom_field_update_bin },
+};
+
+/*
+ * eeprom_layout_detect() - detect layout based on the contents of the data.
+ * @data: Pointer to the data to be analyzed.
+ *
+ * Returns: the detected layout version.
+ */
+__weak int eeprom_layout_detect(unsigned char *data)
+{
+	return LAYOUT_VERSION_UNRECOGNIZED;
+}
+
+/*
+ * __eeprom_layout_assign() - set the layout fields
+ * @layout:		A pointer to an existing struct layout.
+ * @layout_version:	The version number of the desired layout
+ */
+__weak void __eeprom_layout_assign(struct eeprom_layout *layout,
+				   int layout_version)
+{
+	layout->fields = layout_unknown;
+	layout->num_of_fields = ARRAY_SIZE(layout_unknown);
+}
+void eeprom_layout_assign(struct eeprom_layout *layout, int layout_version) \
+		__attribute__((weak, alias("__eeprom_layout_assign")));
+
+/*
+ * eeprom_layout_print() - print the layout and the data which is assigned to it
+ * @layout: A pointer to an existing struct layout.
+ */
+static void eeprom_layout_print(const struct eeprom_layout *layout)
+{
+	int i;
+	struct eeprom_field *fields = layout->fields;
+
+	for (i = 0; i < layout->num_of_fields; i++)
+		fields[i].print(&fields[i]);
+}
+
+/*
+ * eeprom_layout_update_field() - update a single field in the layout data.
+ * @layout:	A pointer to an existing struct layout.
+ * @field_name:	The name of the field to update.
+ * @new_data:	The new field data (a string. Format depends on the field)
+ *
+ * Returns: 0 on success, negative error value on failure.
+ */
+static int eeprom_layout_update_field(struct eeprom_layout *layout,
+				      char *field_name, char *new_data)
+{
+	int i, err;
+	struct eeprom_field *fields = layout->fields;
+
+	if (new_data == NULL)
+		return 0;
+
+	if (field_name == NULL)
+		return -1;
+
+	for (i = 0; i < layout->num_of_fields; i++) {
+		if (fields[i].name == RESERVED_FIELDS ||
+		    strcmp(fields[i].name, field_name))
+			continue;
+
+		err = fields[i].update(&fields[i], new_data);
+		if (err)
+			printf("Invalid data for field %s\n", field_name);
+
+		return err;
+	}
+
+	printf("No such field '%s'\n", field_name);
+
+	return -1;
+}
+
+/*
+ * eeprom_layout_setup() - setup layout struct with the layout data and
+ *			   metadata as dictated by layout_version
+ * @layout:	A pointer to an existing struct layout.
+ * @buf:	A buffer initialized with the eeprom data.
+ * @buf_size:	Size of buf in bytes.
+ * @layout version: The version number of the layout.
+ */
+void eeprom_layout_setup(struct eeprom_layout *layout, unsigned char *buf,
+			 unsigned int buf_size, int layout_version)
+{
+	int i;
+
+	if (layout_version == LAYOUT_VERSION_AUTODETECT)
+		layout->layout_version = eeprom_layout_detect(buf);
+	else
+		layout->layout_version = layout_version;
+
+	eeprom_layout_assign(layout, layout_version);
+	layout->data = buf;
+	for (i = 0; i < layout->num_of_fields; i++) {
+		layout->fields[i].buf = buf;
+		buf += layout->fields[i].size;
+	}
+
+	layout->data_size = buf_size;
+	layout->print = eeprom_layout_print;
+	layout->update = eeprom_layout_update_field;
+}
diff --git a/common/env_mmc.c b/common/env_mmc.c
index bdb452e..c7fef18 100644
--- a/common/env_mmc.c
+++ b/common/env_mmc.c
@@ -86,8 +86,8 @@
 	dev = 0;
 #endif
 
-	env_mmc_orig_hwpart = mmc->block_dev.hwpart;
-	ret = mmc_select_hwpart(dev, part);
+	env_mmc_orig_hwpart = mmc_get_blk_desc(mmc)->hwpart;
+	ret = blk_select_hwpart_devnum(IF_TYPE_MMC, dev, part);
 	if (ret)
 		puts("MMC partition switch failed\n");
 
@@ -119,7 +119,7 @@
 #ifdef CONFIG_SPL_BUILD
 	dev = 0;
 #endif
-	mmc_select_hwpart(dev, env_mmc_orig_hwpart);
+	blk_select_hwpart_devnum(IF_TYPE_MMC, dev, env_mmc_orig_hwpart);
 #endif
 }
 
diff --git a/common/ide.c b/common/ide.c
new file mode 100644
index 0000000..ac5b91c
--- /dev/null
+++ b/common/ide.c
@@ -0,0 +1,1231 @@
+/*
+ * (C) Copyright 2000-2011
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <ata.h>
+#include <dm.h>
+#include <ide.h>
+#include <watchdog.h>
+#include <asm/io.h>
+
+#ifdef __PPC__
+# define EIEIO		__asm__ volatile ("eieio")
+# define SYNC		__asm__ volatile ("sync")
+#else
+# define EIEIO		/* nothing */
+# define SYNC		/* nothing */
+#endif
+
+/* Current offset for IDE0 / IDE1 bus access	*/
+ulong ide_bus_offset[CONFIG_SYS_IDE_MAXBUS] = {
+#if defined(CONFIG_SYS_ATA_IDE0_OFFSET)
+	CONFIG_SYS_ATA_IDE0_OFFSET,
+#endif
+#if defined(CONFIG_SYS_ATA_IDE1_OFFSET) && (CONFIG_SYS_IDE_MAXBUS > 1)
+	CONFIG_SYS_ATA_IDE1_OFFSET,
+#endif
+};
+
+static int ide_bus_ok[CONFIG_SYS_IDE_MAXBUS];
+
+struct blk_desc ide_dev_desc[CONFIG_SYS_IDE_MAXDEVICE];
+
+#define IDE_TIME_OUT	2000	/* 2 sec timeout */
+
+#define ATAPI_TIME_OUT	7000	/* 7 sec timeout (5 sec seems to work...) */
+
+#define IDE_SPIN_UP_TIME_OUT 5000 /* 5 sec spin-up timeout */
+
+#ifndef CONFIG_SYS_ATA_PORT_ADDR
+#define CONFIG_SYS_ATA_PORT_ADDR(port) (port)
+#endif
+
+#ifndef CONFIG_IDE_LED	/* define LED macros, they are not used anyways */
+# define DEVICE_LED(x) 0
+# define LED_IDE1 1
+# define LED_IDE2 2
+#endif
+
+#ifdef CONFIG_IDE_RESET
+extern void ide_set_reset(int idereset);
+
+static void ide_reset(void)
+{
+	int i;
+
+	for (i = 0; i < CONFIG_SYS_IDE_MAXBUS; ++i)
+		ide_bus_ok[i] = 0;
+	for (i = 0; i < CONFIG_SYS_IDE_MAXDEVICE; ++i)
+		ide_dev_desc[i].type = DEV_TYPE_UNKNOWN;
+
+	ide_set_reset(1);	/* assert reset */
+
+	/* the reset signal shall be asserted for et least 25 us */
+	udelay(25);
+
+	WATCHDOG_RESET();
+
+	/* de-assert RESET signal */
+	ide_set_reset(0);
+
+	/* wait 250 ms */
+	for (i = 0; i < 250; ++i)
+		udelay(1000);
+}
+#else
+#define ide_reset()	/* dummy */
+#endif /* CONFIG_IDE_RESET */
+
+/*
+ * Wait until Busy bit is off, or timeout (in ms)
+ * Return last status
+ */
+static uchar ide_wait(int dev, ulong t)
+{
+	ulong delay = 10 * t;	/* poll every 100 us */
+	uchar c;
+
+	while ((c = ide_inb(dev, ATA_STATUS)) & ATA_STAT_BUSY) {
+		udelay(100);
+		if (delay-- == 0)
+			break;
+	}
+	return c;
+}
+
+/*
+ * copy src to dest, skipping leading and trailing blanks and null
+ * terminate the string
+ * "len" is the size of available memory including the terminating '\0'
+ */
+static void ident_cpy(unsigned char *dst, unsigned char *src,
+		      unsigned int len)
+{
+	unsigned char *end, *last;
+
+	last = dst;
+	end = src + len - 1;
+
+	/* reserve space for '\0' */
+	if (len < 2)
+		goto OUT;
+
+	/* skip leading white space */
+	while ((*src) && (src < end) && (*src == ' '))
+		++src;
+
+	/* copy string, omitting trailing white space */
+	while ((*src) && (src < end)) {
+		*dst++ = *src;
+		if (*src++ != ' ')
+			last = dst;
+	}
+OUT:
+	*last = '\0';
+}
+
+#ifdef CONFIG_ATAPI
+/****************************************************************************
+ * ATAPI Support
+ */
+
+#if defined(CONFIG_IDE_SWAP_IO)
+/* since ATAPI may use commands with not 4 bytes alligned length
+ * we have our own transfer functions, 2 bytes alligned */
+__weak void ide_output_data_shorts(int dev, ushort *sect_buf, int shorts)
+{
+	ushort *dbuf;
+	volatile ushort *pbuf;
+
+	pbuf = (ushort *)(ATA_CURR_BASE(dev) + ATA_DATA_REG);
+	dbuf = (ushort *)sect_buf;
+
+	debug("in output data shorts base for read is %lx\n",
+	      (unsigned long) pbuf);
+
+	while (shorts--) {
+		EIEIO;
+		*pbuf = *dbuf++;
+	}
+}
+
+__weak void ide_input_data_shorts(int dev, ushort *sect_buf, int shorts)
+{
+	ushort *dbuf;
+	volatile ushort *pbuf;
+
+	pbuf = (ushort *)(ATA_CURR_BASE(dev) + ATA_DATA_REG);
+	dbuf = (ushort *)sect_buf;
+
+	debug("in input data shorts base for read is %lx\n",
+	      (unsigned long) pbuf);
+
+	while (shorts--) {
+		EIEIO;
+		*dbuf++ = *pbuf;
+	}
+}
+
+#else  /* ! CONFIG_IDE_SWAP_IO */
+__weak void ide_output_data_shorts(int dev, ushort *sect_buf, int shorts)
+{
+	outsw(ATA_CURR_BASE(dev) + ATA_DATA_REG, sect_buf, shorts);
+}
+
+__weak void ide_input_data_shorts(int dev, ushort *sect_buf, int shorts)
+{
+	insw(ATA_CURR_BASE(dev) + ATA_DATA_REG, sect_buf, shorts);
+}
+
+#endif /* CONFIG_IDE_SWAP_IO */
+
+/*
+ * Wait until (Status & mask) == res, or timeout (in ms)
+ * Return last status
+ * This is used since some ATAPI CD ROMs clears their Busy Bit first
+ * and then they set their DRQ Bit
+ */
+static uchar atapi_wait_mask(int dev, ulong t, uchar mask, uchar res)
+{
+	ulong delay = 10 * t;	/* poll every 100 us */
+	uchar c;
+
+	/* prevents to read the status before valid */
+	c = ide_inb(dev, ATA_DEV_CTL);
+
+	while (((c = ide_inb(dev, ATA_STATUS)) & mask) != res) {
+		/* break if error occurs (doesn't make sense to wait more) */
+		if ((c & ATA_STAT_ERR) == ATA_STAT_ERR)
+			break;
+		udelay(100);
+		if (delay-- == 0)
+			break;
+	}
+	return c;
+}
+
+/*
+ * issue an atapi command
+ */
+unsigned char atapi_issue(int device, unsigned char *ccb, int ccblen,
+			  unsigned char *buffer, int buflen)
+{
+	unsigned char c, err, mask, res;
+	int n;
+
+	ide_led(DEVICE_LED(device), 1);	/* LED on       */
+
+	/* Select device
+	 */
+	mask = ATA_STAT_BUSY | ATA_STAT_DRQ;
+	res = 0;
+	ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
+	c = atapi_wait_mask(device, ATAPI_TIME_OUT, mask, res);
+	if ((c & mask) != res) {
+		printf("ATAPI_ISSUE: device %d not ready status %X\n", device,
+		       c);
+		err = 0xFF;
+		goto AI_OUT;
+	}
+	/* write taskfile */
+	ide_outb(device, ATA_ERROR_REG, 0);	/* no DMA, no overlaped */
+	ide_outb(device, ATA_SECT_CNT, 0);
+	ide_outb(device, ATA_SECT_NUM, 0);
+	ide_outb(device, ATA_CYL_LOW, (unsigned char) (buflen & 0xFF));
+	ide_outb(device, ATA_CYL_HIGH,
+		 (unsigned char) ((buflen >> 8) & 0xFF));
+	ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
+
+	ide_outb(device, ATA_COMMAND, ATAPI_CMD_PACKET);
+	udelay(50);
+
+	mask = ATA_STAT_DRQ | ATA_STAT_BUSY | ATA_STAT_ERR;
+	res = ATA_STAT_DRQ;
+	c = atapi_wait_mask(device, ATAPI_TIME_OUT, mask, res);
+
+	if ((c & mask) != res) {	/* DRQ must be 1, BSY 0 */
+		printf("ATAPI_ISSUE: Error (no IRQ) before sending ccb dev %d status 0x%02x\n",
+		       device, c);
+		err = 0xFF;
+		goto AI_OUT;
+	}
+
+	/* write command block */
+	ide_output_data_shorts(device, (unsigned short *)ccb, ccblen / 2);
+
+	/* ATAPI Command written wait for completition */
+	udelay(5000);		/* device must set bsy */
+
+	mask = ATA_STAT_DRQ | ATA_STAT_BUSY | ATA_STAT_ERR;
+	/*
+	 * if no data wait for DRQ = 0 BSY = 0
+	 * if data wait for DRQ = 1 BSY = 0
+	 */
+	res = 0;
+	if (buflen)
+		res = ATA_STAT_DRQ;
+	c = atapi_wait_mask(device, ATAPI_TIME_OUT, mask, res);
+	if ((c & mask) != res) {
+		if (c & ATA_STAT_ERR) {
+			err = (ide_inb(device, ATA_ERROR_REG)) >> 4;
+			debug("atapi_issue 1 returned sense key %X status %02X\n",
+			      err, c);
+		} else {
+			printf("ATAPI_ISSUE: (no DRQ) after sending ccb (%x)  status 0x%02x\n",
+			       ccb[0], c);
+			err = 0xFF;
+		}
+		goto AI_OUT;
+	}
+	n = ide_inb(device, ATA_CYL_HIGH);
+	n <<= 8;
+	n += ide_inb(device, ATA_CYL_LOW);
+	if (n > buflen) {
+		printf("ERROR, transfer bytes %d requested only %d\n", n,
+		       buflen);
+		err = 0xff;
+		goto AI_OUT;
+	}
+	if ((n == 0) && (buflen < 0)) {
+		printf("ERROR, transfer bytes %d requested %d\n", n, buflen);
+		err = 0xff;
+		goto AI_OUT;
+	}
+	if (n != buflen) {
+		debug("WARNING, transfer bytes %d not equal with requested %d\n",
+		      n, buflen);
+	}
+	if (n != 0) {		/* data transfer */
+		debug("ATAPI_ISSUE: %d Bytes to transfer\n", n);
+		/* we transfer shorts */
+		n >>= 1;
+		/* ok now decide if it is an in or output */
+		if ((ide_inb(device, ATA_SECT_CNT) & 0x02) == 0) {
+			debug("Write to device\n");
+			ide_output_data_shorts(device, (unsigned short *)buffer,
+					       n);
+		} else {
+			debug("Read from device @ %p shorts %d\n", buffer, n);
+			ide_input_data_shorts(device, (unsigned short *)buffer,
+					      n);
+		}
+	}
+	udelay(5000);		/* seems that some CD ROMs need this... */
+	mask = ATA_STAT_BUSY | ATA_STAT_ERR;
+	res = 0;
+	c = atapi_wait_mask(device, ATAPI_TIME_OUT, mask, res);
+	if ((c & ATA_STAT_ERR) == ATA_STAT_ERR) {
+		err = (ide_inb(device, ATA_ERROR_REG) >> 4);
+		debug("atapi_issue 2 returned sense key %X status %X\n", err,
+		      c);
+	} else {
+		err = 0;
+	}
+AI_OUT:
+	ide_led(DEVICE_LED(device), 0);	/* LED off      */
+	return err;
+}
+
+/*
+ * sending the command to atapi_issue. If an status other than good
+ * returns, an request_sense will be issued
+ */
+
+#define ATAPI_DRIVE_NOT_READY	100
+#define ATAPI_UNIT_ATTN		10
+
+unsigned char atapi_issue_autoreq(int device,
+				  unsigned char *ccb,
+				  int ccblen,
+				  unsigned char *buffer, int buflen)
+{
+	unsigned char sense_data[18], sense_ccb[12];
+	unsigned char res, key, asc, ascq;
+	int notready, unitattn;
+
+	unitattn = ATAPI_UNIT_ATTN;
+	notready = ATAPI_DRIVE_NOT_READY;
+
+retry:
+	res = atapi_issue(device, ccb, ccblen, buffer, buflen);
+	if (res == 0)
+		return 0;	/* Ok */
+
+	if (res == 0xFF)
+		return 0xFF;	/* error */
+
+	debug("(auto_req)atapi_issue returned sense key %X\n", res);
+
+	memset(sense_ccb, 0, sizeof(sense_ccb));
+	memset(sense_data, 0, sizeof(sense_data));
+	sense_ccb[0] = ATAPI_CMD_REQ_SENSE;
+	sense_ccb[4] = 18;	/* allocation Length */
+
+	res = atapi_issue(device, sense_ccb, 12, sense_data, 18);
+	key = (sense_data[2] & 0xF);
+	asc = (sense_data[12]);
+	ascq = (sense_data[13]);
+
+	debug("ATAPI_CMD_REQ_SENSE returned %x\n", res);
+	debug(" Sense page: %02X key %02X ASC %02X ASCQ %02X\n",
+	      sense_data[0], key, asc, ascq);
+
+	if ((key == 0))
+		return 0;	/* ok device ready */
+
+	if ((key == 6) || (asc == 0x29) || (asc == 0x28)) { /* Unit Attention */
+		if (unitattn-- > 0) {
+			udelay(200 * 1000);
+			goto retry;
+		}
+		printf("Unit Attention, tried %d\n", ATAPI_UNIT_ATTN);
+		goto error;
+	}
+	if ((asc == 0x4) && (ascq == 0x1)) {
+		/* not ready, but will be ready soon */
+		if (notready-- > 0) {
+			udelay(200 * 1000);
+			goto retry;
+		}
+		printf("Drive not ready, tried %d times\n",
+		       ATAPI_DRIVE_NOT_READY);
+		goto error;
+	}
+	if (asc == 0x3a) {
+		debug("Media not present\n");
+		goto error;
+	}
+
+	printf("ERROR: Unknown Sense key %02X ASC %02X ASCQ %02X\n", key, asc,
+	       ascq);
+error:
+	debug("ERROR Sense key %02X ASC %02X ASCQ %02X\n", key, asc, ascq);
+	return 0xFF;
+}
+
+/*
+ * atapi_read:
+ * we transfer only one block per command, since the multiple DRQ per
+ * command is not yet implemented
+ */
+#define ATAPI_READ_MAX_BYTES	2048	/* we read max 2kbytes */
+#define ATAPI_READ_BLOCK_SIZE	2048	/* assuming CD part */
+#define ATAPI_READ_MAX_BLOCK	(ATAPI_READ_MAX_BYTES/ATAPI_READ_BLOCK_SIZE)
+
+ulong atapi_read(struct blk_desc *block_dev, lbaint_t blknr, lbaint_t blkcnt,
+		 void *buffer)
+{
+	int device = block_dev->devnum;
+	ulong n = 0;
+	unsigned char ccb[12];	/* Command descriptor block */
+	ulong cnt;
+
+	debug("atapi_read dev %d start " LBAF " blocks " LBAF
+	      " buffer at %lX\n", device, blknr, blkcnt, (ulong) buffer);
+
+	do {
+		if (blkcnt > ATAPI_READ_MAX_BLOCK)
+			cnt = ATAPI_READ_MAX_BLOCK;
+		else
+			cnt = blkcnt;
+
+		ccb[0] = ATAPI_CMD_READ_12;
+		ccb[1] = 0;	/* reserved */
+		ccb[2] = (unsigned char) (blknr >> 24) & 0xFF;	/* MSB Block */
+		ccb[3] = (unsigned char) (blknr >> 16) & 0xFF;	/*  */
+		ccb[4] = (unsigned char) (blknr >> 8) & 0xFF;
+		ccb[5] = (unsigned char) blknr & 0xFF;	/* LSB Block */
+		ccb[6] = (unsigned char) (cnt >> 24) & 0xFF; /* MSB Block cnt */
+		ccb[7] = (unsigned char) (cnt >> 16) & 0xFF;
+		ccb[8] = (unsigned char) (cnt >> 8) & 0xFF;
+		ccb[9] = (unsigned char) cnt & 0xFF;	/* LSB Block */
+		ccb[10] = 0;	/* reserved */
+		ccb[11] = 0;	/* reserved */
+
+		if (atapi_issue_autoreq(device, ccb, 12,
+					(unsigned char *)buffer,
+					cnt * ATAPI_READ_BLOCK_SIZE)
+		    == 0xFF) {
+			return n;
+		}
+		n += cnt;
+		blkcnt -= cnt;
+		blknr += cnt;
+		buffer += (cnt * ATAPI_READ_BLOCK_SIZE);
+	} while (blkcnt > 0);
+	return n;
+}
+
+static void atapi_inquiry(struct blk_desc *dev_desc)
+{
+	unsigned char ccb[12];	/* Command descriptor block */
+	unsigned char iobuf[64];	/* temp buf */
+	unsigned char c;
+	int device;
+
+	device = dev_desc->devnum;
+	dev_desc->type = DEV_TYPE_UNKNOWN;	/* not yet valid */
+	dev_desc->block_read = atapi_read;
+
+	memset(ccb, 0, sizeof(ccb));
+	memset(iobuf, 0, sizeof(iobuf));
+
+	ccb[0] = ATAPI_CMD_INQUIRY;
+	ccb[4] = 40;		/* allocation Legnth */
+	c = atapi_issue_autoreq(device, ccb, 12, (unsigned char *)iobuf, 40);
+
+	debug("ATAPI_CMD_INQUIRY returned %x\n", c);
+	if (c != 0)
+		return;
+
+	/* copy device ident strings */
+	ident_cpy((unsigned char *)dev_desc->vendor, &iobuf[8], 8);
+	ident_cpy((unsigned char *)dev_desc->product, &iobuf[16], 16);
+	ident_cpy((unsigned char *)dev_desc->revision, &iobuf[32], 5);
+
+	dev_desc->lun = 0;
+	dev_desc->lba = 0;
+	dev_desc->blksz = 0;
+	dev_desc->log2blksz = LOG2_INVALID(typeof(dev_desc->log2blksz));
+	dev_desc->type = iobuf[0] & 0x1f;
+
+	if ((iobuf[1] & 0x80) == 0x80)
+		dev_desc->removable = 1;
+	else
+		dev_desc->removable = 0;
+
+	memset(ccb, 0, sizeof(ccb));
+	memset(iobuf, 0, sizeof(iobuf));
+	ccb[0] = ATAPI_CMD_START_STOP;
+	ccb[4] = 0x03;		/* start */
+
+	c = atapi_issue_autoreq(device, ccb, 12, (unsigned char *)iobuf, 0);
+
+	debug("ATAPI_CMD_START_STOP returned %x\n", c);
+	if (c != 0)
+		return;
+
+	memset(ccb, 0, sizeof(ccb));
+	memset(iobuf, 0, sizeof(iobuf));
+	c = atapi_issue_autoreq(device, ccb, 12, (unsigned char *)iobuf, 0);
+
+	debug("ATAPI_CMD_UNIT_TEST_READY returned %x\n", c);
+	if (c != 0)
+		return;
+
+	memset(ccb, 0, sizeof(ccb));
+	memset(iobuf, 0, sizeof(iobuf));
+	ccb[0] = ATAPI_CMD_READ_CAP;
+	c = atapi_issue_autoreq(device, ccb, 12, (unsigned char *)iobuf, 8);
+	debug("ATAPI_CMD_READ_CAP returned %x\n", c);
+	if (c != 0)
+		return;
+
+	debug("Read Cap: LBA %02X%02X%02X%02X blksize %02X%02X%02X%02X\n",
+	      iobuf[0], iobuf[1], iobuf[2], iobuf[3],
+	      iobuf[4], iobuf[5], iobuf[6], iobuf[7]);
+
+	dev_desc->lba = ((unsigned long) iobuf[0] << 24) +
+		((unsigned long) iobuf[1] << 16) +
+		((unsigned long) iobuf[2] << 8) + ((unsigned long) iobuf[3]);
+	dev_desc->blksz = ((unsigned long) iobuf[4] << 24) +
+		((unsigned long) iobuf[5] << 16) +
+		((unsigned long) iobuf[6] << 8) + ((unsigned long) iobuf[7]);
+	dev_desc->log2blksz = LOG2(dev_desc->blksz);
+#ifdef CONFIG_LBA48
+	/* ATAPI devices cannot use 48bit addressing (ATA/ATAPI v7) */
+	dev_desc->lba48 = 0;
+#endif
+	return;
+}
+
+#endif /* CONFIG_ATAPI */
+
+static void ide_ident(struct blk_desc *dev_desc)
+{
+	unsigned char c;
+	hd_driveid_t iop;
+
+#ifdef CONFIG_ATAPI
+	int retries = 0;
+#endif
+	int device;
+
+	device = dev_desc->devnum;
+	printf("  Device %d: ", device);
+
+	ide_led(DEVICE_LED(device), 1);	/* LED on       */
+	/* Select device
+	 */
+	ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
+	dev_desc->if_type = IF_TYPE_IDE;
+#ifdef CONFIG_ATAPI
+
+	retries = 0;
+
+	/* Warning: This will be tricky to read */
+	while (retries <= 1) {
+		/* check signature */
+		if ((ide_inb(device, ATA_SECT_CNT) == 0x01) &&
+		    (ide_inb(device, ATA_SECT_NUM) == 0x01) &&
+		    (ide_inb(device, ATA_CYL_LOW) == 0x14) &&
+		    (ide_inb(device, ATA_CYL_HIGH) == 0xEB)) {
+			/* ATAPI Signature found */
+			dev_desc->if_type = IF_TYPE_ATAPI;
+			/*
+			 * Start Ident Command
+			 */
+			ide_outb(device, ATA_COMMAND, ATAPI_CMD_IDENT);
+			/*
+			 * Wait for completion - ATAPI devices need more time
+			 * to become ready
+			 */
+			c = ide_wait(device, ATAPI_TIME_OUT);
+		} else
+#endif
+		{
+			/*
+			 * Start Ident Command
+			 */
+			ide_outb(device, ATA_COMMAND, ATA_CMD_IDENT);
+
+			/*
+			 * Wait for completion
+			 */
+			c = ide_wait(device, IDE_TIME_OUT);
+		}
+		ide_led(DEVICE_LED(device), 0);	/* LED off      */
+
+		if (((c & ATA_STAT_DRQ) == 0) ||
+		    ((c & (ATA_STAT_FAULT | ATA_STAT_ERR)) != 0)) {
+#ifdef CONFIG_ATAPI
+			{
+				/*
+				 * Need to soft reset the device
+				 * in case it's an ATAPI...
+				 */
+				debug("Retrying...\n");
+				ide_outb(device, ATA_DEV_HD,
+					 ATA_LBA | ATA_DEVICE(device));
+				udelay(100000);
+				ide_outb(device, ATA_COMMAND, 0x08);
+				udelay(500000);	/* 500 ms */
+			}
+			/*
+			 * Select device
+			 */
+			ide_outb(device, ATA_DEV_HD,
+				 ATA_LBA | ATA_DEVICE(device));
+			retries++;
+#else
+			return;
+#endif
+		}
+#ifdef CONFIG_ATAPI
+		else
+			break;
+	}			/* see above - ugly to read */
+
+	if (retries == 2)	/* Not found */
+		return;
+#endif
+
+	ide_input_swap_data(device, (ulong *)&iop, ATA_SECTORWORDS);
+
+	ident_cpy((unsigned char *)dev_desc->revision, iop.fw_rev,
+		  sizeof(dev_desc->revision));
+	ident_cpy((unsigned char *)dev_desc->vendor, iop.model,
+		  sizeof(dev_desc->vendor));
+	ident_cpy((unsigned char *)dev_desc->product, iop.serial_no,
+		  sizeof(dev_desc->product));
+#ifdef __LITTLE_ENDIAN
+	/*
+	 * firmware revision, model, and serial number have Big Endian Byte
+	 * order in Word. Convert all three to little endian.
+	 *
+	 * See CF+ and CompactFlash Specification Revision 2.0:
+	 * 6.2.1.6: Identify Drive, Table 39 for more details
+	 */
+
+	strswab(dev_desc->revision);
+	strswab(dev_desc->vendor);
+	strswab(dev_desc->product);
+#endif /* __LITTLE_ENDIAN */
+
+	if ((iop.config & 0x0080) == 0x0080)
+		dev_desc->removable = 1;
+	else
+		dev_desc->removable = 0;
+
+#ifdef CONFIG_ATAPI
+	if (dev_desc->if_type == IF_TYPE_ATAPI) {
+		atapi_inquiry(dev_desc);
+		return;
+	}
+#endif /* CONFIG_ATAPI */
+
+#ifdef __BIG_ENDIAN
+	/* swap shorts */
+	dev_desc->lba = (iop.lba_capacity << 16) | (iop.lba_capacity >> 16);
+#else  /* ! __BIG_ENDIAN */
+	/*
+	 * do not swap shorts on little endian
+	 *
+	 * See CF+ and CompactFlash Specification Revision 2.0:
+	 * 6.2.1.6: Identfy Drive, Table 39, Word Address 57-58 for details.
+	 */
+	dev_desc->lba = iop.lba_capacity;
+#endif /* __BIG_ENDIAN */
+
+#ifdef CONFIG_LBA48
+	if (iop.command_set_2 & 0x0400) {	/* LBA 48 support */
+		dev_desc->lba48 = 1;
+		dev_desc->lba = (unsigned long long) iop.lba48_capacity[0] |
+			((unsigned long long) iop.lba48_capacity[1] << 16) |
+			((unsigned long long) iop.lba48_capacity[2] << 32) |
+			((unsigned long long) iop.lba48_capacity[3] << 48);
+	} else {
+		dev_desc->lba48 = 0;
+	}
+#endif /* CONFIG_LBA48 */
+	/* assuming HD */
+	dev_desc->type = DEV_TYPE_HARDDISK;
+	dev_desc->blksz = ATA_BLOCKSIZE;
+	dev_desc->log2blksz = LOG2(dev_desc->blksz);
+	dev_desc->lun = 0;	/* just to fill something in... */
+
+#if 0				/* only used to test the powersaving mode,
+				 * if enabled, the drive goes after 5 sec
+				 * in standby mode */
+	ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
+	c = ide_wait(device, IDE_TIME_OUT);
+	ide_outb(device, ATA_SECT_CNT, 1);
+	ide_outb(device, ATA_LBA_LOW, 0);
+	ide_outb(device, ATA_LBA_MID, 0);
+	ide_outb(device, ATA_LBA_HIGH, 0);
+	ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
+	ide_outb(device, ATA_COMMAND, 0xe3);
+	udelay(50);
+	c = ide_wait(device, IDE_TIME_OUT);	/* can't take over 500 ms */
+#endif
+}
+
+__weak void ide_led(uchar led, uchar status)
+{
+#if defined(CONFIG_IDE_LED) && defined(PER8_BASE) /* required by LED_PORT */
+	static uchar led_buffer;	/* Buffer for current LED status */
+
+	uchar *led_port = LED_PORT;
+
+	if (status)		/* switch LED on        */
+		led_buffer |= led;
+	else			/* switch LED off       */
+		led_buffer &= ~led;
+
+	*led_port = led_buffer;
+#endif
+}
+
+__weak void ide_outb(int dev, int port, unsigned char val)
+{
+	debug("ide_outb (dev= %d, port= 0x%x, val= 0x%02x) : @ 0x%08lx\n",
+	      dev, port, val,
+	      (ATA_CURR_BASE(dev) + CONFIG_SYS_ATA_PORT_ADDR(port)));
+
+#if defined(CONFIG_IDE_AHB)
+	if (port) {
+		/* write command */
+		ide_write_register(dev, port, val);
+	} else {
+		/* write data */
+		outb(val, (ATA_CURR_BASE(dev)));
+	}
+#else
+	outb(val, (ATA_CURR_BASE(dev) + CONFIG_SYS_ATA_PORT_ADDR(port)));
+#endif
+}
+
+__weak unsigned char ide_inb(int dev, int port)
+{
+	uchar val;
+
+#if defined(CONFIG_IDE_AHB)
+	val = ide_read_register(dev, port);
+#else
+	val = inb((ATA_CURR_BASE(dev) + CONFIG_SYS_ATA_PORT_ADDR(port)));
+#endif
+
+	debug("ide_inb (dev= %d, port= 0x%x) : @ 0x%08lx -> 0x%02x\n",
+	      dev, port,
+	      (ATA_CURR_BASE(dev) + CONFIG_SYS_ATA_PORT_ADDR(port)), val);
+	return val;
+}
+
+void ide_init(void)
+{
+	unsigned char c;
+	int i, bus;
+
+#ifdef CONFIG_IDE_8xx_PCCARD
+	extern int ide_devices_found;	/* Initialized in check_ide_device() */
+#endif /* CONFIG_IDE_8xx_PCCARD */
+
+#ifdef CONFIG_IDE_PREINIT
+	WATCHDOG_RESET();
+
+	if (ide_preinit()) {
+		puts("ide_preinit failed\n");
+		return;
+	}
+#endif /* CONFIG_IDE_PREINIT */
+
+	WATCHDOG_RESET();
+
+	/*
+	 * Reset the IDE just to be sure.
+	 * Light LED's to show
+	 */
+	ide_led((LED_IDE1 | LED_IDE2), 1);	/* LED's on     */
+
+	/* ATAPI Drives seems to need a proper IDE Reset */
+	ide_reset();
+
+#ifdef CONFIG_IDE_INIT_POSTRESET
+	WATCHDOG_RESET();
+
+	if (ide_init_postreset()) {
+		puts("ide_preinit_postreset failed\n");
+		return;
+	}
+#endif /* CONFIG_IDE_INIT_POSTRESET */
+
+	/*
+	 * Wait for IDE to get ready.
+	 * According to spec, this can take up to 31 seconds!
+	 */
+	for (bus = 0; bus < CONFIG_SYS_IDE_MAXBUS; ++bus) {
+		int dev =
+			bus * (CONFIG_SYS_IDE_MAXDEVICE /
+			       CONFIG_SYS_IDE_MAXBUS);
+
+#ifdef CONFIG_IDE_8xx_PCCARD
+		/* Skip non-ide devices from probing */
+		if ((ide_devices_found & (1 << bus)) == 0) {
+			ide_led((LED_IDE1 | LED_IDE2), 0);	/* LED's off */
+			continue;
+		}
+#endif
+		printf("Bus %d: ", bus);
+
+		ide_bus_ok[bus] = 0;
+
+		/* Select device
+		 */
+		udelay(100000);	/* 100 ms */
+		ide_outb(dev, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(dev));
+		udelay(100000);	/* 100 ms */
+		i = 0;
+		do {
+			udelay(10000);	/* 10 ms */
+
+			c = ide_inb(dev, ATA_STATUS);
+			i++;
+			if (i > (ATA_RESET_TIME * 100)) {
+				puts("** Timeout **\n");
+				/* LED's off */
+				ide_led((LED_IDE1 | LED_IDE2), 0);
+				return;
+			}
+			if ((i >= 100) && ((i % 100) == 0))
+				putc('.');
+
+		} while (c & ATA_STAT_BUSY);
+
+		if (c & (ATA_STAT_BUSY | ATA_STAT_FAULT)) {
+			puts("not available  ");
+			debug("Status = 0x%02X ", c);
+#ifndef CONFIG_ATAPI		/* ATAPI Devices do not set DRDY */
+		} else if ((c & ATA_STAT_READY) == 0) {
+			puts("not available  ");
+			debug("Status = 0x%02X ", c);
+#endif
+		} else {
+			puts("OK ");
+			ide_bus_ok[bus] = 1;
+		}
+		WATCHDOG_RESET();
+	}
+
+	putc('\n');
+
+	ide_led((LED_IDE1 | LED_IDE2), 0);	/* LED's off    */
+
+	for (i = 0; i < CONFIG_SYS_IDE_MAXDEVICE; ++i) {
+		int led = (IDE_BUS(i) == 0) ? LED_IDE1 : LED_IDE2;
+		ide_dev_desc[i].type = DEV_TYPE_UNKNOWN;
+		ide_dev_desc[i].if_type = IF_TYPE_IDE;
+		ide_dev_desc[i].devnum = i;
+		ide_dev_desc[i].part_type = PART_TYPE_UNKNOWN;
+		ide_dev_desc[i].blksz = 0;
+		ide_dev_desc[i].log2blksz =
+			LOG2_INVALID(typeof(ide_dev_desc[i].log2blksz));
+		ide_dev_desc[i].lba = 0;
+#ifndef CONFIG_BLK
+		ide_dev_desc[i].block_read = ide_read;
+		ide_dev_desc[i].block_write = ide_write;
+#endif
+		if (!ide_bus_ok[IDE_BUS(i)])
+			continue;
+		ide_led(led, 1);	/* LED on       */
+		ide_ident(&ide_dev_desc[i]);
+		ide_led(led, 0);	/* LED off      */
+		dev_print(&ide_dev_desc[i]);
+
+		if ((ide_dev_desc[i].lba > 0) && (ide_dev_desc[i].blksz > 0)) {
+			/* initialize partition type */
+			part_init(&ide_dev_desc[i]);
+		}
+	}
+	WATCHDOG_RESET();
+}
+
+/* We only need to swap data if we are running on a big endian cpu. */
+#if defined(__LITTLE_ENDIAN)
+__weak void ide_input_swap_data(int dev, ulong *sect_buf, int words)
+{
+	ide_input_data(dev, sect_buf, words);
+}
+#else
+__weak void ide_input_swap_data(int dev, ulong *sect_buf, int words)
+{
+	volatile ushort *pbuf =
+		(ushort *)(ATA_CURR_BASE(dev) + ATA_DATA_REG);
+	ushort *dbuf = (ushort *)sect_buf;
+
+	debug("in input swap data base for read is %lx\n",
+	      (unsigned long) pbuf);
+
+	while (words--) {
+#ifdef __MIPS__
+		*dbuf++ = swab16p((u16 *)pbuf);
+		*dbuf++ = swab16p((u16 *)pbuf);
+#else
+		*dbuf++ = ld_le16(pbuf);
+		*dbuf++ = ld_le16(pbuf);
+#endif /* !MIPS */
+	}
+}
+#endif /* __LITTLE_ENDIAN */
+
+
+#if defined(CONFIG_IDE_SWAP_IO)
+__weak void ide_output_data(int dev, const ulong *sect_buf, int words)
+{
+	ushort *dbuf;
+	volatile ushort *pbuf;
+
+	pbuf = (ushort *)(ATA_CURR_BASE(dev) + ATA_DATA_REG);
+	dbuf = (ushort *)sect_buf;
+	while (words--) {
+		EIEIO;
+		*pbuf = *dbuf++;
+		EIEIO;
+		*pbuf = *dbuf++;
+	}
+}
+#else  /* ! CONFIG_IDE_SWAP_IO */
+__weak void ide_output_data(int dev, const ulong *sect_buf, int words)
+{
+#if defined(CONFIG_IDE_AHB)
+	ide_write_data(dev, sect_buf, words);
+#else
+	outsw(ATA_CURR_BASE(dev) + ATA_DATA_REG, sect_buf, words << 1);
+#endif
+}
+#endif /* CONFIG_IDE_SWAP_IO */
+
+#if defined(CONFIG_IDE_SWAP_IO)
+__weak void ide_input_data(int dev, ulong *sect_buf, int words)
+{
+	ushort *dbuf;
+	volatile ushort *pbuf;
+
+	pbuf = (ushort *)(ATA_CURR_BASE(dev) + ATA_DATA_REG);
+	dbuf = (ushort *)sect_buf;
+
+	debug("in input data base for read is %lx\n", (unsigned long) pbuf);
+
+	while (words--) {
+		EIEIO;
+		*dbuf++ = *pbuf;
+		EIEIO;
+		*dbuf++ = *pbuf;
+	}
+}
+#else  /* ! CONFIG_IDE_SWAP_IO */
+__weak void ide_input_data(int dev, ulong *sect_buf, int words)
+{
+#if defined(CONFIG_IDE_AHB)
+	ide_read_data(dev, sect_buf, words);
+#else
+	insw(ATA_CURR_BASE(dev) + ATA_DATA_REG, sect_buf, words << 1);
+#endif
+}
+
+#endif /* CONFIG_IDE_SWAP_IO */
+
+#ifdef CONFIG_BLK
+ulong ide_read(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
+	       void *buffer)
+#else
+ulong ide_read(struct blk_desc *block_dev, lbaint_t blknr, lbaint_t blkcnt,
+	       void *buffer)
+#endif
+{
+#ifdef CONFIG_BLK
+	struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
+#endif
+	int device = block_dev->devnum;
+	ulong n = 0;
+	unsigned char c;
+	unsigned char pwrsave = 0;	/* power save */
+
+#ifdef CONFIG_LBA48
+	unsigned char lba48 = 0;
+
+	if (blknr & 0x0000fffff0000000ULL) {
+		/* more than 28 bits used, use 48bit mode */
+		lba48 = 1;
+	}
+#endif
+	debug("ide_read dev %d start " LBAF ", blocks " LBAF " buffer at %lX\n",
+	      device, blknr, blkcnt, (ulong) buffer);
+
+	ide_led(DEVICE_LED(device), 1);	/* LED on       */
+
+	/* Select device
+	 */
+	ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
+	c = ide_wait(device, IDE_TIME_OUT);
+
+	if (c & ATA_STAT_BUSY) {
+		printf("IDE read: device %d not ready\n", device);
+		goto IDE_READ_E;
+	}
+
+	/* first check if the drive is in Powersaving mode, if yes,
+	 * increase the timeout value */
+	ide_outb(device, ATA_COMMAND, ATA_CMD_CHK_PWR);
+	udelay(50);
+
+	c = ide_wait(device, IDE_TIME_OUT);	/* can't take over 500 ms */
+
+	if (c & ATA_STAT_BUSY) {
+		printf("IDE read: device %d not ready\n", device);
+		goto IDE_READ_E;
+	}
+	if ((c & ATA_STAT_ERR) == ATA_STAT_ERR) {
+		printf("No Powersaving mode %X\n", c);
+	} else {
+		c = ide_inb(device, ATA_SECT_CNT);
+		debug("Powersaving %02X\n", c);
+		if (c == 0)
+			pwrsave = 1;
+	}
+
+
+	while (blkcnt-- > 0) {
+		c = ide_wait(device, IDE_TIME_OUT);
+
+		if (c & ATA_STAT_BUSY) {
+			printf("IDE read: device %d not ready\n", device);
+			break;
+		}
+#ifdef CONFIG_LBA48
+		if (lba48) {
+			/* write high bits */
+			ide_outb(device, ATA_SECT_CNT, 0);
+			ide_outb(device, ATA_LBA_LOW, (blknr >> 24) & 0xFF);
+#ifdef CONFIG_SYS_64BIT_LBA
+			ide_outb(device, ATA_LBA_MID, (blknr >> 32) & 0xFF);
+			ide_outb(device, ATA_LBA_HIGH, (blknr >> 40) & 0xFF);
+#else
+			ide_outb(device, ATA_LBA_MID, 0);
+			ide_outb(device, ATA_LBA_HIGH, 0);
+#endif
+		}
+#endif
+		ide_outb(device, ATA_SECT_CNT, 1);
+		ide_outb(device, ATA_LBA_LOW, (blknr >> 0) & 0xFF);
+		ide_outb(device, ATA_LBA_MID, (blknr >> 8) & 0xFF);
+		ide_outb(device, ATA_LBA_HIGH, (blknr >> 16) & 0xFF);
+
+#ifdef CONFIG_LBA48
+		if (lba48) {
+			ide_outb(device, ATA_DEV_HD,
+				 ATA_LBA | ATA_DEVICE(device));
+			ide_outb(device, ATA_COMMAND, ATA_CMD_READ_EXT);
+
+		} else
+#endif
+		{
+			ide_outb(device, ATA_DEV_HD, ATA_LBA |
+				 ATA_DEVICE(device) | ((blknr >> 24) & 0xF));
+			ide_outb(device, ATA_COMMAND, ATA_CMD_READ);
+		}
+
+		udelay(50);
+
+		if (pwrsave) {
+			/* may take up to 4 sec */
+			c = ide_wait(device, IDE_SPIN_UP_TIME_OUT);
+			pwrsave = 0;
+		} else {
+			/* can't take over 500 ms */
+			c = ide_wait(device, IDE_TIME_OUT);
+		}
+
+		if ((c & (ATA_STAT_DRQ | ATA_STAT_BUSY | ATA_STAT_ERR)) !=
+		    ATA_STAT_DRQ) {
+			printf("Error (no IRQ) dev %d blk " LBAF
+			       ": status %#02x\n", device, blknr, c);
+			break;
+		}
+
+		ide_input_data(device, buffer, ATA_SECTORWORDS);
+		(void) ide_inb(device, ATA_STATUS);	/* clear IRQ */
+
+		++n;
+		++blknr;
+		buffer += ATA_BLOCKSIZE;
+	}
+IDE_READ_E:
+	ide_led(DEVICE_LED(device), 0);	/* LED off      */
+	return n;
+}
+
+#ifdef CONFIG_BLK
+ulong ide_write(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
+		const void *buffer)
+#else
+ulong ide_write(struct blk_desc *block_dev, lbaint_t blknr, lbaint_t blkcnt,
+		const void *buffer)
+#endif
+{
+#ifdef CONFIG_BLK
+	struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
+#endif
+	int device = block_dev->devnum;
+	ulong n = 0;
+	unsigned char c;
+
+#ifdef CONFIG_LBA48
+	unsigned char lba48 = 0;
+
+	if (blknr & 0x0000fffff0000000ULL) {
+		/* more than 28 bits used, use 48bit mode */
+		lba48 = 1;
+	}
+#endif
+
+	ide_led(DEVICE_LED(device), 1);	/* LED on       */
+
+	/* Select device
+	 */
+	ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
+
+	while (blkcnt-- > 0) {
+		c = ide_wait(device, IDE_TIME_OUT);
+
+		if (c & ATA_STAT_BUSY) {
+			printf("IDE read: device %d not ready\n", device);
+			goto WR_OUT;
+		}
+#ifdef CONFIG_LBA48
+		if (lba48) {
+			/* write high bits */
+			ide_outb(device, ATA_SECT_CNT, 0);
+			ide_outb(device, ATA_LBA_LOW, (blknr >> 24) & 0xFF);
+#ifdef CONFIG_SYS_64BIT_LBA
+			ide_outb(device, ATA_LBA_MID, (blknr >> 32) & 0xFF);
+			ide_outb(device, ATA_LBA_HIGH, (blknr >> 40) & 0xFF);
+#else
+			ide_outb(device, ATA_LBA_MID, 0);
+			ide_outb(device, ATA_LBA_HIGH, 0);
+#endif
+		}
+#endif
+		ide_outb(device, ATA_SECT_CNT, 1);
+		ide_outb(device, ATA_LBA_LOW, (blknr >> 0) & 0xFF);
+		ide_outb(device, ATA_LBA_MID, (blknr >> 8) & 0xFF);
+		ide_outb(device, ATA_LBA_HIGH, (blknr >> 16) & 0xFF);
+
+#ifdef CONFIG_LBA48
+		if (lba48) {
+			ide_outb(device, ATA_DEV_HD,
+				 ATA_LBA | ATA_DEVICE(device));
+			ide_outb(device, ATA_COMMAND, ATA_CMD_WRITE_EXT);
+
+		} else
+#endif
+		{
+			ide_outb(device, ATA_DEV_HD, ATA_LBA |
+				 ATA_DEVICE(device) | ((blknr >> 24) & 0xF));
+			ide_outb(device, ATA_COMMAND, ATA_CMD_WRITE);
+		}
+
+		udelay(50);
+
+		/* can't take over 500 ms */
+		c = ide_wait(device, IDE_TIME_OUT);
+
+		if ((c & (ATA_STAT_DRQ | ATA_STAT_BUSY | ATA_STAT_ERR)) !=
+		    ATA_STAT_DRQ) {
+			printf("Error (no IRQ) dev %d blk " LBAF
+			       ": status %#02x\n", device, blknr, c);
+			goto WR_OUT;
+		}
+
+		ide_output_data(device, buffer, ATA_SECTORWORDS);
+		c = ide_inb(device, ATA_STATUS);	/* clear IRQ */
+		++n;
+		++blknr;
+		buffer += ATA_BLOCKSIZE;
+	}
+WR_OUT:
+	ide_led(DEVICE_LED(device), 0);	/* LED off      */
+	return n;
+}
+
+#if defined(CONFIG_OF_IDE_FIXUP)
+int ide_device_present(int dev)
+{
+	if (dev >= CONFIG_SYS_IDE_MAXBUS)
+		return 0;
+	return ide_dev_desc[dev].type == DEV_TYPE_UNKNOWN ? 0 : 1;
+}
+#endif
+
+#ifdef CONFIG_BLK
+static const struct blk_ops ide_blk_ops = {
+	.read	= ide_read,
+	.write	= ide_write,
+};
+
+U_BOOT_DRIVER(ide_blk) = {
+	.name		= "ide_blk",
+	.id		= UCLASS_BLK,
+	.ops		= &ide_blk_ops,
+};
+#else
+U_BOOT_LEGACY_BLK(ide) = {
+	.if_typename	= "ide",
+	.if_type	= IF_TYPE_IDE,
+	.max_devs	= CONFIG_SYS_IDE_MAXDEVICE,
+	.desc		= ide_dev_desc,
+};
+#endif
diff --git a/common/image-fit.c b/common/image-fit.c
index 25f8a11..9873957 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -422,7 +422,8 @@
 	}
 
 	if ((type == IH_TYPE_KERNEL) || (type == IH_TYPE_STANDALONE) ||
-	    (type == IH_TYPE_FIRMWARE) || (type == IH_TYPE_RAMDISK)) {
+	    (type == IH_TYPE_FIRMWARE) || (type == IH_TYPE_RAMDISK) ||
+	    (type == IH_TYPE_FPGA)) {
 		ret = fit_image_get_load(fit, image_noffset, &load);
 		printf("%s  Load Address: ", p);
 		if (ret)
@@ -886,9 +887,9 @@
 	ret = fdt_setprop(fit, noffset, FIT_TIMESTAMP_PROP, &t,
 				sizeof(uint32_t));
 	if (ret) {
-		printf("Can't set '%s' property for '%s' node (%s)\n",
-		       FIT_TIMESTAMP_PROP, fit_get_name(fit, noffset, NULL),
-		       fdt_strerror(ret));
+		debug("Can't set '%s' property for '%s' node (%s)\n",
+		      FIT_TIMESTAMP_PROP, fit_get_name(fit, noffset, NULL),
+		      fdt_strerror(ret));
 		return ret == -FDT_ERR_NOSPACE ? -ENOSPC : -1;
 	}
 
@@ -1483,6 +1484,10 @@
 	if (uname)
 		printf("%s  FDT:          %s\n", p, uname);
 
+	uname = (char *)fdt_getprop(fit, noffset, FIT_FPGA_PROP, NULL);
+	if (uname)
+		printf("%s  FPGA:         %s\n", p, uname);
+
 	/* Print out all of the specified loadables */
 	for (loadables_index = 0;
 	     fdt_get_string_index(fit, noffset,
@@ -1567,6 +1572,8 @@
 		return FIT_SETUP_PROP;
 	case IH_TYPE_LOADABLE:
 		return FIT_LOADABLE_PROP;
+	case IH_TYPE_FPGA:
+		return FIT_FPGA_PROP;
 	}
 
 	return "unknown";
@@ -1681,7 +1688,7 @@
 			fit_image_check_type(fit, noffset,
 					     IH_TYPE_KERNEL_NOLOAD));
 
-	os_ok = image_type == IH_TYPE_FLATDT ||
+	os_ok = image_type == IH_TYPE_FLATDT || IH_TYPE_FPGA ||
 		fit_image_check_os(fit, noffset, IH_OS_LINUX) ||
 		fit_image_check_os(fit, noffset, IH_OS_OPENRTOS);
 
diff --git a/common/image.c b/common/image.c
index 26d6c9a..0be09e5 100644
--- a/common/image.c
+++ b/common/image.c
@@ -32,6 +32,8 @@
 #if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT
 #include <libfdt.h>
 #include <fdt_support.h>
+#include <fpga.h>
+#include <xilinx.h>
 #endif
 
 #include <u-boot/md5.h>
@@ -159,6 +161,8 @@
 	{	IH_TYPE_RKSD,       "rksd",       "Rockchip SD Boot Image" },
 	{	IH_TYPE_RKSPI,      "rkspi",      "Rockchip SPI Boot Image" },
 	{	IH_TYPE_ZYNQIMAGE,  "zynqimage",  "Xilinx Zynq Boot Image" },
+	{	IH_TYPE_ZYNQMPIMAGE, "zynqmpimage", "Xilinx ZynqMP Boot Image" },
+	{	IH_TYPE_FPGA,       "fpga",       "FPGA Image" },
 	{	-1,		    "",		  "",			},
 };
 
@@ -1210,6 +1214,96 @@
 }
 
 #if IMAGE_ENABLE_FIT
+#if defined(CONFIG_FPGA) && defined(CONFIG_FPGA_XILINX)
+int boot_get_fpga(int argc, char * const argv[], bootm_headers_t *images,
+		  uint8_t arch, const ulong *ld_start, ulong * const ld_len)
+{
+	ulong tmp_img_addr, img_data, img_len;
+	void *buf;
+	int conf_noffset;
+	int fit_img_result;
+	char *uname, *name;
+	int err;
+	int devnum = 0; /* TODO support multi fpga platforms */
+	const fpga_desc * const desc = fpga_get_desc(devnum);
+	xilinx_desc *desc_xilinx = desc->devdesc;
+
+	/* Check to see if the images struct has a FIT configuration */
+	if (!genimg_has_config(images)) {
+		debug("## FIT configuration was not specified\n");
+		return 0;
+	}
+
+	/*
+	 * Obtain the os FIT header from the images struct
+	 * copy from dataflash if needed
+	 */
+	tmp_img_addr = map_to_sysmem(images->fit_hdr_os);
+	tmp_img_addr = genimg_get_image(tmp_img_addr);
+	buf = map_sysmem(tmp_img_addr, 0);
+	/*
+	 * Check image type. For FIT images get FIT node
+	 * and attempt to locate a generic binary.
+	 */
+	switch (genimg_get_format(buf)) {
+	case IMAGE_FORMAT_FIT:
+		conf_noffset = fit_conf_get_node(buf, images->fit_uname_cfg);
+
+		err = fdt_get_string_index(buf, conf_noffset, FIT_FPGA_PROP, 0,
+					   (const char **)&uname);
+		if (err < 0) {
+			debug("## FPGA image is not specified\n");
+			return 0;
+		}
+		fit_img_result = fit_image_load(images,
+						tmp_img_addr,
+						(const char **)&uname,
+						&(images->fit_uname_cfg),
+						arch,
+						IH_TYPE_FPGA,
+						BOOTSTAGE_ID_FPGA_INIT,
+						FIT_LOAD_OPTIONAL_NON_ZERO,
+						&img_data, &img_len);
+
+		debug("FPGA image (%s) loaded to 0x%lx/size 0x%lx\n",
+		      uname, img_data, img_len);
+
+		if (fit_img_result < 0) {
+			/* Something went wrong! */
+			return fit_img_result;
+		}
+
+		if (img_len >= desc_xilinx->size) {
+			name = "full";
+			err = fpga_loadbitstream(devnum, (char *)img_data,
+						 img_len, BIT_FULL);
+			if (err)
+				err = fpga_load(devnum, (const void *)img_data,
+						img_len, BIT_FULL);
+		} else {
+			name = "partial";
+			err = fpga_loadbitstream(devnum, (char *)img_data,
+						 img_len, BIT_PARTIAL);
+			if (err)
+				err = fpga_load(devnum, (const void *)img_data,
+						img_len, BIT_PARTIAL);
+		}
+
+		printf("   Programming %s bitstream... ", name);
+		if (err)
+			printf("failed\n");
+		else
+			printf("OK\n");
+		break;
+	default:
+		printf("The given image format is not supported (corrupt?)\n");
+		return 1;
+	}
+
+	return 0;
+}
+#endif
+
 int boot_get_loadable(int argc, char * const argv[], bootm_headers_t *images,
 		uint8_t arch, const ulong *ld_start, ulong * const ld_len)
 {
diff --git a/common/sata.c b/common/sata.c
new file mode 100644
index 0000000..88f08c9
--- /dev/null
+++ b/common/sata.c
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2000-2005, DENX Software Engineering
+ *		Wolfgang Denk <wd@denx.de>
+ * Copyright (C) Procsys. All rights reserved.
+ *		Mushtaq Khan <mushtaq_k@procsys.com>
+ *			<mushtaqk_921@yahoo.co.in>
+ * Copyright (C) 2008 Freescale Semiconductor, Inc.
+ *		Dave Liu <daveliu@freescale.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <sata.h>
+
+struct blk_desc sata_dev_desc[CONFIG_SYS_SATA_MAX_DEVICE];
+
+#ifdef CONFIG_PARTITIONS
+struct blk_desc *sata_get_dev(int dev)
+{
+	return (dev < CONFIG_SYS_SATA_MAX_DEVICE) ? &sata_dev_desc[dev] : NULL;
+}
+#endif
+
+#ifdef CONFIG_BLK
+static unsigned long sata_bread(struct udevice *dev, lbaint_t start,
+				lbaint_t blkcnt, void *dst)
+{
+	return -ENOSYS;
+}
+
+static unsigned long sata_bwrite(struct udevice *dev, lbaint_t start,
+				 lbaint_t blkcnt, const void *buffer)
+{
+	return -ENOSYS;
+}
+#else
+static unsigned long sata_bread(struct blk_desc *block_dev, lbaint_t start,
+				lbaint_t blkcnt, void *dst)
+{
+	return sata_read(block_dev->devnum, start, blkcnt, dst);
+}
+
+static unsigned long sata_bwrite(struct blk_desc *block_dev, lbaint_t start,
+				 lbaint_t blkcnt, const void *buffer)
+{
+	return sata_write(block_dev->devnum, start, blkcnt, buffer);
+}
+#endif
+
+int __sata_initialize(void)
+{
+	int rc;
+	int i;
+
+	for (i = 0; i < CONFIG_SYS_SATA_MAX_DEVICE; i++) {
+		memset(&sata_dev_desc[i], 0, sizeof(struct blk_desc));
+		sata_dev_desc[i].if_type = IF_TYPE_SATA;
+		sata_dev_desc[i].devnum = i;
+		sata_dev_desc[i].part_type = PART_TYPE_UNKNOWN;
+		sata_dev_desc[i].type = DEV_TYPE_HARDDISK;
+		sata_dev_desc[i].lba = 0;
+		sata_dev_desc[i].blksz = 512;
+		sata_dev_desc[i].log2blksz = LOG2(sata_dev_desc[i].blksz);
+#ifndef CONFIG_BLK
+		sata_dev_desc[i].block_read = sata_bread;
+		sata_dev_desc[i].block_write = sata_bwrite;
+#endif
+		rc = init_sata(i);
+		if (!rc) {
+			rc = scan_sata(i);
+			if (!rc && sata_dev_desc[i].lba > 0 &&
+			    sata_dev_desc[i].blksz > 0)
+				part_init(&sata_dev_desc[i]);
+		}
+	}
+
+	return rc;
+}
+int sata_initialize(void) __attribute__((weak, alias("__sata_initialize")));
+
+__weak int __sata_stop(void)
+{
+	int i, err = 0;
+
+	for (i = 0; i < CONFIG_SYS_SATA_MAX_DEVICE; i++)
+		err |= reset_sata(i);
+
+	if (err)
+		printf("Could not reset some SATA devices\n");
+
+	return err;
+}
+int sata_stop(void) __attribute__((weak, alias("__sata_stop")));
+
+#ifdef CONFIG_BLK
+static const struct blk_ops sata_blk_ops = {
+	.read	= sata_bread,
+	.write	= sata_bwrite,
+};
+
+U_BOOT_DRIVER(sata_blk) = {
+	.name		= "sata_blk",
+	.id		= UCLASS_BLK,
+	.ops		= &sata_blk_ops,
+};
+#else
+U_BOOT_LEGACY_BLK(sata) = {
+	.if_typename	= "sata",
+	.if_type	= IF_TYPE_SATA,
+	.max_devs	= CONFIG_SYS_SATA_MAX_DEVICE,
+	.desc		= sata_dev_desc,
+};
+#endif
diff --git a/common/scsi.c b/common/scsi.c
new file mode 100644
index 0000000..8ac28dd
--- /dev/null
+++ b/common/scsi.c
@@ -0,0 +1,592 @@
+/*
+ * (C) Copyright 2001
+ * Denis Peter, MPL AG Switzerland
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <inttypes.h>
+#include <pci.h>
+#include <scsi.h>
+
+#ifdef CONFIG_SCSI_DEV_LIST
+#define SCSI_DEV_LIST CONFIG_SCSI_DEV_LIST
+#else
+#ifdef CONFIG_SCSI_SYM53C8XX
+#define SCSI_VEND_ID	0x1000
+#ifndef CONFIG_SCSI_DEV_ID
+#define SCSI_DEV_ID		0x0001
+#else
+#define SCSI_DEV_ID		CONFIG_SCSI_DEV_ID
+#endif
+#elif defined CONFIG_SATA_ULI5288
+
+#define SCSI_VEND_ID 0x10b9
+#define SCSI_DEV_ID  0x5288
+
+#elif !defined(CONFIG_SCSI_AHCI_PLAT)
+#error no scsi device defined
+#endif
+#define SCSI_DEV_LIST {SCSI_VEND_ID, SCSI_DEV_ID}
+#endif
+
+#if defined(CONFIG_PCI) && !defined(CONFIG_SCSI_AHCI_PLAT)
+const struct pci_device_id scsi_device_list[] = { SCSI_DEV_LIST };
+#endif
+static ccb tempccb;	/* temporary scsi command buffer */
+
+static unsigned char tempbuff[512]; /* temporary data buffer */
+
+static int scsi_max_devs; /* number of highest available scsi device */
+
+static int scsi_curr_dev; /* current device */
+
+static struct blk_desc scsi_dev_desc[CONFIG_SYS_SCSI_MAX_DEVICE];
+
+/* almost the maximum amount of the scsi_ext command.. */
+#define SCSI_MAX_READ_BLK 0xFFFF
+#define SCSI_LBA48_READ	0xFFFFFFF
+
+#ifdef CONFIG_SYS_64BIT_LBA
+void scsi_setup_read16(ccb *pccb, lbaint_t start, unsigned long blocks)
+{
+	pccb->cmd[0] = SCSI_READ16;
+	pccb->cmd[1] = pccb->lun << 5;
+	pccb->cmd[2] = (unsigned char)(start >> 56) & 0xff;
+	pccb->cmd[3] = (unsigned char)(start >> 48) & 0xff;
+	pccb->cmd[4] = (unsigned char)(start >> 40) & 0xff;
+	pccb->cmd[5] = (unsigned char)(start >> 32) & 0xff;
+	pccb->cmd[6] = (unsigned char)(start >> 24) & 0xff;
+	pccb->cmd[7] = (unsigned char)(start >> 16) & 0xff;
+	pccb->cmd[8] = (unsigned char)(start >> 8) & 0xff;
+	pccb->cmd[9] = (unsigned char)start & 0xff;
+	pccb->cmd[10] = 0;
+	pccb->cmd[11] = (unsigned char)(blocks >> 24) & 0xff;
+	pccb->cmd[12] = (unsigned char)(blocks >> 16) & 0xff;
+	pccb->cmd[13] = (unsigned char)(blocks >> 8) & 0xff;
+	pccb->cmd[14] = (unsigned char)blocks & 0xff;
+	pccb->cmd[15] = 0;
+	pccb->cmdlen = 16;
+	pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */
+	debug("scsi_setup_read16: cmd: %02X %02X startblk %02X%02X%02X%02X%02X%02X%02X%02X blccnt %02X%02X%02X%02X\n",
+	      pccb->cmd[0], pccb->cmd[1],
+	      pccb->cmd[2], pccb->cmd[3], pccb->cmd[4], pccb->cmd[5],
+	      pccb->cmd[6], pccb->cmd[7], pccb->cmd[8], pccb->cmd[9],
+	      pccb->cmd[11], pccb->cmd[12], pccb->cmd[13], pccb->cmd[14]);
+}
+#endif
+
+void scsi_setup_read_ext(ccb *pccb, lbaint_t start, unsigned short blocks)
+{
+	pccb->cmd[0] = SCSI_READ10;
+	pccb->cmd[1] = pccb->lun << 5;
+	pccb->cmd[2] = (unsigned char)(start >> 24) & 0xff;
+	pccb->cmd[3] = (unsigned char)(start >> 16) & 0xff;
+	pccb->cmd[4] = (unsigned char)(start >> 8) & 0xff;
+	pccb->cmd[5] = (unsigned char)start & 0xff;
+	pccb->cmd[6] = 0;
+	pccb->cmd[7] = (unsigned char)(blocks >> 8) & 0xff;
+	pccb->cmd[8] = (unsigned char)blocks & 0xff;
+	pccb->cmd[6] = 0;
+	pccb->cmdlen = 10;
+	pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */
+	debug("scsi_setup_read_ext: cmd: %02X %02X startblk %02X%02X%02X%02X blccnt %02X%02X\n",
+	      pccb->cmd[0], pccb->cmd[1],
+	      pccb->cmd[2], pccb->cmd[3], pccb->cmd[4], pccb->cmd[5],
+	      pccb->cmd[7], pccb->cmd[8]);
+}
+
+void scsi_setup_write_ext(ccb *pccb, lbaint_t start, unsigned short blocks)
+{
+	pccb->cmd[0] = SCSI_WRITE10;
+	pccb->cmd[1] = pccb->lun << 5;
+	pccb->cmd[2] = (unsigned char)(start >> 24) & 0xff;
+	pccb->cmd[3] = (unsigned char)(start >> 16) & 0xff;
+	pccb->cmd[4] = (unsigned char)(start >> 8) & 0xff;
+	pccb->cmd[5] = (unsigned char)start & 0xff;
+	pccb->cmd[6] = 0;
+	pccb->cmd[7] = ((unsigned char)(blocks >> 8)) & 0xff;
+	pccb->cmd[8] = (unsigned char)blocks & 0xff;
+	pccb->cmd[9] = 0;
+	pccb->cmdlen = 10;
+	pccb->msgout[0] = SCSI_IDENTIFY;  /* NOT USED */
+	debug("%s: cmd: %02X %02X startblk %02X%02X%02X%02X blccnt %02X%02X\n",
+	      __func__,
+	      pccb->cmd[0], pccb->cmd[1],
+	      pccb->cmd[2], pccb->cmd[3], pccb->cmd[4], pccb->cmd[5],
+	      pccb->cmd[7], pccb->cmd[8]);
+}
+
+void scsi_setup_read6(ccb *pccb, lbaint_t start, unsigned short blocks)
+{
+	pccb->cmd[0] = SCSI_READ6;
+	pccb->cmd[1] = pccb->lun << 5 | ((unsigned char)(start >> 16) & 0x1f);
+	pccb->cmd[2] = (unsigned char)(start >> 8) & 0xff;
+	pccb->cmd[3] = (unsigned char)start & 0xff;
+	pccb->cmd[4] = (unsigned char)blocks & 0xff;
+	pccb->cmd[5] = 0;
+	pccb->cmdlen = 6;
+	pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */
+	debug("scsi_setup_read6: cmd: %02X %02X startblk %02X%02X blccnt %02X\n",
+	      pccb->cmd[0], pccb->cmd[1],
+	      pccb->cmd[2], pccb->cmd[3], pccb->cmd[4]);
+}
+
+
+void scsi_setup_inquiry(ccb *pccb)
+{
+	pccb->cmd[0] = SCSI_INQUIRY;
+	pccb->cmd[1] = pccb->lun << 5;
+	pccb->cmd[2] = 0;
+	pccb->cmd[3] = 0;
+	if (pccb->datalen > 255)
+		pccb->cmd[4] = 255;
+	else
+		pccb->cmd[4] = (unsigned char)pccb->datalen;
+	pccb->cmd[5] = 0;
+	pccb->cmdlen = 6;
+	pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */
+}
+
+#ifdef CONFIG_BLK
+static ulong scsi_read(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
+		       void *buffer)
+#else
+static ulong scsi_read(struct blk_desc *block_dev, lbaint_t blknr,
+		       lbaint_t blkcnt, void *buffer)
+#endif
+{
+#ifdef CONFIG_BLK
+	struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
+#endif
+	int device = block_dev->devnum;
+	lbaint_t start, blks;
+	uintptr_t buf_addr;
+	unsigned short smallblks = 0;
+	ccb *pccb = (ccb *)&tempccb;
+	device &= 0xff;
+
+	/* Setup device */
+	pccb->target = scsi_dev_desc[device].target;
+	pccb->lun = scsi_dev_desc[device].lun;
+	buf_addr = (unsigned long)buffer;
+	start = blknr;
+	blks = blkcnt;
+	debug("\nscsi_read: dev %d startblk " LBAF
+	      ", blccnt " LBAF " buffer %lx\n",
+	      device, start, blks, (unsigned long)buffer);
+	do {
+		pccb->pdata = (unsigned char *)buf_addr;
+#ifdef CONFIG_SYS_64BIT_LBA
+		if (start > SCSI_LBA48_READ) {
+			unsigned long blocks;
+			blocks = min_t(lbaint_t, blks, SCSI_MAX_READ_BLK);
+			pccb->datalen = scsi_dev_desc[device].blksz * blocks;
+			scsi_setup_read16(pccb, start, blocks);
+			start += blocks;
+			blks -= blocks;
+		} else
+#endif
+		if (blks > SCSI_MAX_READ_BLK) {
+			pccb->datalen = scsi_dev_desc[device].blksz *
+				SCSI_MAX_READ_BLK;
+			smallblks = SCSI_MAX_READ_BLK;
+			scsi_setup_read_ext(pccb, start, smallblks);
+			start += SCSI_MAX_READ_BLK;
+			blks -= SCSI_MAX_READ_BLK;
+		} else {
+			pccb->datalen = scsi_dev_desc[device].blksz * blks;
+			smallblks = (unsigned short)blks;
+			scsi_setup_read_ext(pccb, start, smallblks);
+			start += blks;
+			blks = 0;
+		}
+		debug("scsi_read_ext: startblk " LBAF
+		      ", blccnt %x buffer %" PRIXPTR "\n",
+		      start, smallblks, buf_addr);
+		if (scsi_exec(pccb) != true) {
+			scsi_print_error(pccb);
+			blkcnt -= blks;
+			break;
+		}
+		buf_addr += pccb->datalen;
+	} while (blks != 0);
+	debug("scsi_read_ext: end startblk " LBAF
+	      ", blccnt %x buffer %" PRIXPTR "\n", start, smallblks, buf_addr);
+	return blkcnt;
+}
+
+/*******************************************************************************
+ * scsi_write
+ */
+
+/* Almost the maximum amount of the scsi_ext command.. */
+#define SCSI_MAX_WRITE_BLK 0xFFFF
+
+#ifdef CONFIG_BLK
+static ulong scsi_write(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
+			const void *buffer)
+#else
+static ulong scsi_write(struct blk_desc *block_dev, lbaint_t blknr,
+			lbaint_t blkcnt, const void *buffer)
+#endif
+{
+#ifdef CONFIG_BLK
+	struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
+#endif
+	int device = block_dev->devnum;
+	lbaint_t start, blks;
+	uintptr_t buf_addr;
+	unsigned short smallblks;
+	ccb *pccb = (ccb *)&tempccb;
+
+	device &= 0xff;
+
+	/* Setup device */
+	pccb->target = scsi_dev_desc[device].target;
+	pccb->lun = scsi_dev_desc[device].lun;
+	buf_addr = (unsigned long)buffer;
+	start = blknr;
+	blks = blkcnt;
+	debug("\n%s: dev %d startblk " LBAF ", blccnt " LBAF " buffer %lx\n",
+	      __func__, device, start, blks, (unsigned long)buffer);
+	do {
+		pccb->pdata = (unsigned char *)buf_addr;
+		if (blks > SCSI_MAX_WRITE_BLK) {
+			pccb->datalen = (scsi_dev_desc[device].blksz *
+					 SCSI_MAX_WRITE_BLK);
+			smallblks = SCSI_MAX_WRITE_BLK;
+			scsi_setup_write_ext(pccb, start, smallblks);
+			start += SCSI_MAX_WRITE_BLK;
+			blks -= SCSI_MAX_WRITE_BLK;
+		} else {
+			pccb->datalen = scsi_dev_desc[device].blksz * blks;
+			smallblks = (unsigned short)blks;
+			scsi_setup_write_ext(pccb, start, smallblks);
+			start += blks;
+			blks = 0;
+		}
+		debug("%s: startblk " LBAF ", blccnt %x buffer %" PRIXPTR "\n",
+		      __func__, start, smallblks, buf_addr);
+		if (scsi_exec(pccb) != true) {
+			scsi_print_error(pccb);
+			blkcnt -= blks;
+			break;
+		}
+		buf_addr += pccb->datalen;
+	} while (blks != 0);
+	debug("%s: end startblk " LBAF ", blccnt %x buffer %" PRIXPTR "\n",
+	      __func__, start, smallblks, buf_addr);
+	return blkcnt;
+}
+
+int scsi_get_disk_count(void)
+{
+	return scsi_max_devs;
+}
+
+#if defined(CONFIG_PCI) && !defined(CONFIG_SCSI_AHCI_PLAT)
+void scsi_init(void)
+{
+	int busdevfunc = -1;
+	int i;
+	/*
+	 * Find a device from the list, this driver will support a single
+	 * controller.
+	 */
+	for (i = 0; i < ARRAY_SIZE(scsi_device_list); i++) {
+		/* get PCI Device ID */
+#ifdef CONFIG_DM_PCI
+		struct udevice *dev;
+		int ret;
+
+		ret = dm_pci_find_device(scsi_device_list[i].vendor,
+					 scsi_device_list[i].device, 0, &dev);
+		if (!ret) {
+			busdevfunc = dm_pci_get_bdf(dev);
+			break;
+		}
+#else
+		busdevfunc = pci_find_device(scsi_device_list[i].vendor,
+					     scsi_device_list[i].device,
+					     0);
+#endif
+		if (busdevfunc != -1)
+			break;
+	}
+
+	if (busdevfunc == -1) {
+		printf("Error: SCSI Controller(s) ");
+		for (i = 0; i < ARRAY_SIZE(scsi_device_list); i++) {
+			printf("%04X:%04X ",
+			       scsi_device_list[i].vendor,
+			       scsi_device_list[i].device);
+		}
+		printf("not found\n");
+		return;
+	}
+#ifdef DEBUG
+	else {
+		printf("SCSI Controller (%04X,%04X) found (%d:%d:%d)\n",
+		       scsi_device_list[i].vendor,
+		       scsi_device_list[i].device,
+		       (busdevfunc >> 16) & 0xFF,
+		       (busdevfunc >> 11) & 0x1F,
+		       (busdevfunc >> 8) & 0x7);
+	}
+#endif
+	bootstage_start(BOOTSTAGE_ID_ACCUM_SCSI, "ahci");
+	scsi_low_level_init(busdevfunc);
+	scsi_scan(1);
+	bootstage_accum(BOOTSTAGE_ID_ACCUM_SCSI);
+}
+#endif
+
+/* copy src to dest, skipping leading and trailing blanks
+ * and null terminate the string
+ */
+void scsi_ident_cpy(unsigned char *dest, unsigned char *src, unsigned int len)
+{
+	int start, end;
+
+	start = 0;
+	while (start < len) {
+		if (src[start] != ' ')
+			break;
+		start++;
+	}
+	end = len-1;
+	while (end > start) {
+		if (src[end] != ' ')
+			break;
+		end--;
+	}
+	for (; start <= end; start++)
+		*dest ++= src[start];
+	*dest = '\0';
+}
+
+
+/* Trim trailing blanks, and NUL-terminate string
+ */
+void scsi_trim_trail(unsigned char *str, unsigned int len)
+{
+	unsigned char *p = str + len - 1;
+
+	while (len-- > 0) {
+		*p-- = '\0';
+		if (*p != ' ')
+			return;
+	}
+}
+
+int scsi_read_capacity(ccb *pccb, lbaint_t *capacity, unsigned long *blksz)
+{
+	*capacity = 0;
+
+	memset(pccb->cmd, '\0', sizeof(pccb->cmd));
+	pccb->cmd[0] = SCSI_RD_CAPAC10;
+	pccb->cmd[1] = pccb->lun << 5;
+	pccb->cmdlen = 10;
+	pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */
+
+	pccb->datalen = 8;
+	if (scsi_exec(pccb) != true)
+		return 1;
+
+	*capacity = ((lbaint_t)pccb->pdata[0] << 24) |
+		    ((lbaint_t)pccb->pdata[1] << 16) |
+		    ((lbaint_t)pccb->pdata[2] << 8)  |
+		    ((lbaint_t)pccb->pdata[3]);
+
+	if (*capacity != 0xffffffff) {
+		/* Read capacity (10) was sufficient for this drive. */
+		*blksz = ((unsigned long)pccb->pdata[4] << 24) |
+			 ((unsigned long)pccb->pdata[5] << 16) |
+			 ((unsigned long)pccb->pdata[6] << 8)  |
+			 ((unsigned long)pccb->pdata[7]);
+		return 0;
+	}
+
+	/* Read capacity (10) was insufficient. Use read capacity (16). */
+	memset(pccb->cmd, '\0', sizeof(pccb->cmd));
+	pccb->cmd[0] = SCSI_RD_CAPAC16;
+	pccb->cmd[1] = 0x10;
+	pccb->cmdlen = 16;
+	pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */
+
+	pccb->datalen = 16;
+	if (scsi_exec(pccb) != true)
+		return 1;
+
+	*capacity = ((uint64_t)pccb->pdata[0] << 56) |
+		    ((uint64_t)pccb->pdata[1] << 48) |
+		    ((uint64_t)pccb->pdata[2] << 40) |
+		    ((uint64_t)pccb->pdata[3] << 32) |
+		    ((uint64_t)pccb->pdata[4] << 24) |
+		    ((uint64_t)pccb->pdata[5] << 16) |
+		    ((uint64_t)pccb->pdata[6] << 8)  |
+		    ((uint64_t)pccb->pdata[7]);
+
+	*blksz = ((uint64_t)pccb->pdata[8]  << 56) |
+		 ((uint64_t)pccb->pdata[9]  << 48) |
+		 ((uint64_t)pccb->pdata[10] << 40) |
+		 ((uint64_t)pccb->pdata[11] << 32) |
+		 ((uint64_t)pccb->pdata[12] << 24) |
+		 ((uint64_t)pccb->pdata[13] << 16) |
+		 ((uint64_t)pccb->pdata[14] << 8)  |
+		 ((uint64_t)pccb->pdata[15]);
+
+	return 0;
+}
+
+
+/*
+ * Some setup (fill-in) routines
+ */
+void scsi_setup_test_unit_ready(ccb *pccb)
+{
+	pccb->cmd[0] = SCSI_TST_U_RDY;
+	pccb->cmd[1] = pccb->lun << 5;
+	pccb->cmd[2] = 0;
+	pccb->cmd[3] = 0;
+	pccb->cmd[4] = 0;
+	pccb->cmd[5] = 0;
+	pccb->cmdlen = 6;
+	pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */
+}
+
+/*
+ * (re)-scan the scsi bus and reports scsi device info
+ * to the user if mode = 1
+ */
+void scsi_scan(int mode)
+{
+	unsigned char i, perq, modi, lun;
+	lbaint_t capacity;
+	unsigned long blksz;
+	ccb *pccb = (ccb *)&tempccb;
+
+	if (mode == 1)
+		printf("scanning bus for devices...\n");
+	for (i = 0; i < CONFIG_SYS_SCSI_MAX_DEVICE; i++) {
+		scsi_dev_desc[i].target = 0xff;
+		scsi_dev_desc[i].lun = 0xff;
+		scsi_dev_desc[i].lba = 0;
+		scsi_dev_desc[i].blksz = 0;
+		scsi_dev_desc[i].log2blksz =
+			LOG2_INVALID(typeof(scsi_dev_desc[i].log2blksz));
+		scsi_dev_desc[i].type = DEV_TYPE_UNKNOWN;
+		scsi_dev_desc[i].vendor[0] = 0;
+		scsi_dev_desc[i].product[0] = 0;
+		scsi_dev_desc[i].revision[0] = 0;
+		scsi_dev_desc[i].removable = false;
+		scsi_dev_desc[i].if_type = IF_TYPE_SCSI;
+		scsi_dev_desc[i].devnum = i;
+		scsi_dev_desc[i].part_type = PART_TYPE_UNKNOWN;
+#ifndef CONFIG_BLK
+		scsi_dev_desc[i].block_read = scsi_read;
+		scsi_dev_desc[i].block_write = scsi_write;
+#endif
+	}
+	scsi_max_devs = 0;
+	for (i = 0; i < CONFIG_SYS_SCSI_MAX_SCSI_ID; i++) {
+		pccb->target = i;
+		for (lun = 0; lun < CONFIG_SYS_SCSI_MAX_LUN; lun++) {
+			pccb->lun = lun;
+			pccb->pdata = (unsigned char *)&tempbuff;
+			pccb->datalen = 512;
+			scsi_setup_inquiry(pccb);
+			if (scsi_exec(pccb) != true) {
+				if (pccb->contr_stat == SCSI_SEL_TIME_OUT) {
+					/*
+					 * selection timeout => assuming no
+					 * device present
+					 */
+					debug("Selection timeout ID %d\n",
+					      pccb->target);
+					continue;
+				}
+				scsi_print_error(pccb);
+				continue;
+			}
+			perq = tempbuff[0];
+			modi = tempbuff[1];
+			if ((perq & 0x1f) == 0x1f)
+				continue; /* skip unknown devices */
+			if ((modi & 0x80) == 0x80) /* drive is removable */
+				scsi_dev_desc[scsi_max_devs].removable = true;
+			/* get info for this device */
+			scsi_ident_cpy((unsigned char *)&scsi_dev_desc
+						[scsi_max_devs].vendor[0],
+				       &tempbuff[8], 8);
+			scsi_ident_cpy((unsigned char *)&scsi_dev_desc
+						[scsi_max_devs].product[0],
+				       &tempbuff[16], 16);
+			scsi_ident_cpy((unsigned char *)&scsi_dev_desc
+						[scsi_max_devs].revision[0],
+				       &tempbuff[32], 4);
+			scsi_dev_desc[scsi_max_devs].target = pccb->target;
+			scsi_dev_desc[scsi_max_devs].lun = pccb->lun;
+
+			pccb->datalen = 0;
+			scsi_setup_test_unit_ready(pccb);
+			if (scsi_exec(pccb) != true) {
+				if (scsi_dev_desc[scsi_max_devs].removable) {
+					scsi_dev_desc[scsi_max_devs].type =
+							perq;
+					goto removable;
+				}
+				scsi_print_error(pccb);
+				continue;
+			}
+			if (scsi_read_capacity(pccb, &capacity, &blksz)) {
+				scsi_print_error(pccb);
+				continue;
+			}
+			scsi_dev_desc[scsi_max_devs].lba = capacity;
+			scsi_dev_desc[scsi_max_devs].blksz = blksz;
+			scsi_dev_desc[scsi_max_devs].log2blksz =
+				LOG2(scsi_dev_desc[scsi_max_devs].blksz);
+			scsi_dev_desc[scsi_max_devs].type = perq;
+			part_init(&scsi_dev_desc[scsi_max_devs]);
+removable:
+			if (mode == 1) {
+				printf("  Device %d: ", scsi_max_devs);
+				dev_print(&scsi_dev_desc[scsi_max_devs]);
+			} /* if mode */
+			scsi_max_devs++;
+		} /* next LUN */
+	}
+	if (scsi_max_devs > 0)
+		scsi_curr_dev = 0;
+	else
+		scsi_curr_dev = -1;
+
+	printf("Found %d device(s).\n", scsi_max_devs);
+#ifndef CONFIG_SPL_BUILD
+	setenv_ulong("scsidevs", scsi_max_devs);
+#endif
+}
+
+#ifdef CONFIG_BLK
+static const struct blk_ops scsi_blk_ops = {
+	.read	= scsi_read,
+	.write	= scsi_write,
+};
+
+U_BOOT_DRIVER(scsi_blk) = {
+	.name		= "scsi_blk",
+	.id		= UCLASS_BLK,
+	.ops		= &scsi_blk_ops,
+};
+#else
+U_BOOT_LEGACY_BLK(scsi) = {
+	.if_typename	= "sata",
+	.if_type	= IF_TYPE_SCSI,
+	.max_devs	= CONFIG_SYS_SCSI_MAX_DEVICE,
+	.desc		= scsi_dev_desc,
+};
+#endif
diff --git a/common/spl/spl.c b/common/spl/spl.c
index 82e7f58..bdde716 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -64,6 +64,11 @@
 	/* Nothing to do! */
 }
 
+__weak void spl_board_prepare_for_boot(void)
+{
+	/* Nothing to do! */
+}
+
 void spl_set_header_raw_uboot(void)
 {
 	spl_image.size = CONFIG_SYS_MONITOR_LEN;
@@ -73,7 +78,7 @@
 	spl_image.name = "U-Boot";
 }
 
-void spl_parse_image_header(const struct image_header *header)
+int spl_parse_image_header(const struct image_header *header)
 {
 	u32 header_size = sizeof(struct image_header);
 
@@ -111,6 +116,9 @@
 		 * is bad, and thus should be skipped silently.
 		 */
 		panic("** no mkimage signature but raw image not supported");
+#elif defined(CONFIG_SPL_ABORT_ON_RAW_IMAGE)
+		/* Signature not found, proceed to other boot methods. */
+		return -EINVAL;
 #else
 		/* Signature not found - assume u-boot.bin */
 		debug("mkimage signature not found - ih_magic = %x\n",
@@ -118,6 +126,7 @@
 		spl_set_header_raw_uboot();
 #endif
 	}
+	return 0;
 }
 
 __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
@@ -131,20 +140,47 @@
 	image_entry();
 }
 
+#ifndef CONFIG_SPL_LOAD_FIT_ADDRESS
+# define CONFIG_SPL_LOAD_FIT_ADDRESS	0
+#endif
+
 #ifdef CONFIG_SPL_RAM_DEVICE
+static ulong spl_ram_load_read(struct spl_load_info *load, ulong sector,
+			       ulong count, void *buf)
+{
+	debug("%s: sector %lx, count %lx, buf %lx\n",
+	      __func__, sector, count, (ulong)buf);
+	memcpy(buf, (void *)(CONFIG_SPL_LOAD_FIT_ADDRESS + sector), count);
+	return count;
+}
+
 static int spl_ram_load_image(void)
 {
-	const struct image_header *header;
+	struct image_header *header;
 
-	/*
-	 * Get the header.  It will point to an address defined by handoff
-	 * which will tell where the image located inside the flash. For
-	 * now, it will temporary fixed to address pointed by U-Boot.
-	 */
-	header = (struct image_header *)
-		(CONFIG_SYS_TEXT_BASE -	sizeof(struct image_header));
+	header = (struct image_header *)CONFIG_SPL_LOAD_FIT_ADDRESS;
 
-	spl_parse_image_header(header);
+	if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
+	    image_get_magic(header) == FDT_MAGIC) {
+		struct spl_load_info load;
+
+		debug("Found FIT\n");
+		load.bl_len = 1;
+		load.read = spl_ram_load_read;
+		spl_load_simple_fit(&load, 0, header);
+	} else {
+		debug("Legacy image\n");
+		/*
+		 * Get the header.  It will point to an address defined by
+		 * handoff which will tell where the image located inside
+		 * the flash. For now, it will temporary fixed to address
+		 * pointed by U-Boot.
+		 */
+		header = (struct image_header *)
+			(CONFIG_SYS_TEXT_BASE -	sizeof(struct image_header));
+
+		spl_parse_image_header(header);
+	}
 
 	return 0;
 }
@@ -400,6 +436,7 @@
 #endif
 
 	debug("loaded - jumping to U-Boot...");
+	spl_board_prepare_for_boot();
 	jump_to_image_no_args(&spl_image);
 }
 
diff --git a/common/spl/spl_ext.c b/common/spl/spl_ext.c
index b77dbf4..ade5496 100644
--- a/common/spl/spl_ext.c
+++ b/common/spl/spl_ext.c
@@ -48,7 +48,11 @@
 		goto end;
 	}
 
-	spl_parse_image_header(header);
+	err = spl_parse_image_header(header);
+	if (err < 0) {
+		puts("spl: ext4fs_read failed\n");
+		goto end;
+	}
 
 	err = ext4fs_read((char *)spl_image.load_addr, filelen, &actlen);
 
diff --git a/common/spl/spl_fat.c b/common/spl/spl_fat.c
index d761b26..5b0d969 100644
--- a/common/spl/spl_fat.c
+++ b/common/spl/spl_fat.c
@@ -57,7 +57,9 @@
 	if (err <= 0)
 		goto end;
 
-	spl_parse_image_header(header);
+	err = spl_parse_image_header(header);
+	if (err)
+		goto end;
 
 	err = file_fat_read(filename, (u8 *)spl_image.load_addr, 0);
 
diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index 1a5c027..26842ba 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -39,8 +39,13 @@
 	     node >= 0;
 	     node = fdt_next_subnode(fdt, node)) {
 		name = fdt_getprop(fdt, node, "description", &len);
-		if (!name)
+		if (!name) {
+#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
+			printf("%s: Missing FDT description in DTB\n",
+			       __func__);
+#endif
 			return -EINVAL;
+		}
 		if (board_fit_config_name_match(name))
 			continue;
 
diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
index 8d588d1..5676acd 100644
--- a/common/spl/spl_mmc.c
+++ b/common/spl/spl_mmc.c
@@ -23,8 +23,12 @@
 {
 	u32 image_size_sectors;
 	unsigned long count;
+	int ret;
 
-	spl_parse_image_header(header);
+	ret = spl_parse_image_header(header);
+	if (ret)
+		return ret;
+
 	/* convert size to sectors - round up */
 	image_size_sectors = (spl_image.size + mmc->read_bl_len - 1) /
 			     mmc->read_bl_len;
@@ -296,7 +300,7 @@
 			if (part == 7)
 				part = 0;
 
-			err = mmc_switch_part(0, part);
+			err = blk_dselect_hwpart(mmc_get_blk_desc(mmc), part);
 			if (err) {
 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
 				puts("spl: mmc partition switch failed\n");
diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
index 79388ff..bbd9546 100644
--- a/common/spl/spl_nand.c
+++ b/common/spl/spl_nand.c
@@ -32,7 +32,10 @@
 	if (err)
 		return err;
 
-	spl_parse_image_header(header);
+	err = spl_parse_image_header(header);
+	if (err)
+		return err;
+
 	return nand_spl_load_image(offset, spl_image.size,
 				   (void *)(unsigned long)spl_image.load_addr);
 }
@@ -77,7 +80,9 @@
 		/* load linux */
 		nand_spl_load_image(CONFIG_SYS_NAND_SPL_KERNEL_OFFS,
 			sizeof(*header), (void *)header);
-		spl_parse_image_header(header);
+		err = spl_parse_image_header(header);
+		if (err)
+			return err;
 		if (header->ih_os == IH_OS_LINUX) {
 			/* happy - was a linux */
 			err = nand_spl_load_image(
diff --git a/common/spl/spl_net.c b/common/spl/spl_net.c
index 63b20d8..ae71d26 100644
--- a/common/spl/spl_net.c
+++ b/common/spl/spl_net.c
@@ -34,7 +34,5 @@
 		printf("Problem booting with BOOTP\n");
 		return rv;
 	}
-	spl_parse_image_header((struct image_header *)load_addr);
-
-	return 0;
+	return spl_parse_image_header((struct image_header *)load_addr);
 }
diff --git a/common/spl/spl_nor.c b/common/spl/spl_nor.c
index d0bd0b0..da2422f 100644
--- a/common/spl/spl_nor.c
+++ b/common/spl/spl_nor.c
@@ -9,6 +9,7 @@
 
 int spl_nor_load_image(void)
 {
+	int ret;
 	/*
 	 * Loading of the payload to SDRAM is done with skipping of
 	 * the mkimage header in this SPL NOR driver
@@ -28,7 +29,9 @@
 		if (image_get_os(header) == IH_OS_LINUX) {
 			/* happy - was a Linux */
 
-			spl_parse_image_header(header);
+			ret = spl_parse_image_header(header);
+			if (ret)
+				return ret;
 
 			memcpy((void *)spl_image.load_addr,
 			       (void *)(CONFIG_SYS_OS_BASE +
@@ -56,8 +59,10 @@
 	 * Load real U-Boot from its location in NOR flash to its
 	 * defined location in SDRAM
 	 */
-	spl_parse_image_header(
+	ret = spl_parse_image_header(
 			(const struct image_header *)CONFIG_SYS_UBOOT_BASE);
+	if (ret)
+		return ret;
 
 	memcpy((void *)(unsigned long)spl_image.load_addr,
 	       (void *)(CONFIG_SYS_UBOOT_BASE + sizeof(struct image_header)),
diff --git a/common/spl/spl_onenand.c b/common/spl/spl_onenand.c
index af7d82e..1a28a84 100644
--- a/common/spl/spl_onenand.c
+++ b/common/spl/spl_onenand.c
@@ -17,6 +17,7 @@
 int spl_onenand_load_image(void)
 {
 	struct image_header *header;
+	int ret;
 
 	debug("spl: onenand\n");
 
@@ -25,7 +26,9 @@
 	/* Load u-boot */
 	onenand_spl_load_image(CONFIG_SYS_ONENAND_U_BOOT_OFFS,
 		CONFIG_SYS_ONENAND_PAGE_SIZE, (void *)header);
-	spl_parse_image_header(header);
+	ret = spl_parse_image_header(header);
+	if (ret)
+		return ret;
 	onenand_spl_load_image(CONFIG_SYS_ONENAND_U_BOOT_OFFS,
 		spl_image.size, (void *)spl_image.load_addr);
 
diff --git a/common/spl/spl_sata.c b/common/spl/spl_sata.c
index 1719946..9d8cc7c 100644
--- a/common/spl/spl_sata.c
+++ b/common/spl/spl_sata.c
@@ -34,7 +34,7 @@
 	} else {
 		/* try to recognize storage devices immediately */
 		scsi_scan(0);
-		stor_dev = scsi_get_dev(0);
+		stor_dev = blk_get_devnum_by_type(IF_TYPE_SCSI, 0);
 		if (!stor_dev)
 			return -ENODEV;
 	}
diff --git a/common/spl/spl_usb.c b/common/spl/spl_usb.c
index c42848e..04fa667 100644
--- a/common/spl/spl_usb.c
+++ b/common/spl/spl_usb.c
@@ -39,7 +39,7 @@
 #ifdef CONFIG_USB_STORAGE
 	/* try to recognize storage devices immediately */
 	usb_stor_curr_dev = usb_stor_scan(1);
-	stor_dev = usb_stor_get_dev(usb_stor_curr_dev);
+	stor_dev = blk_get_devnum_by_type(IF_TYPE_USB, usb_stor_curr_dev);
 	if (!stor_dev)
 		return -ENODEV;
 #endif
diff --git a/common/spl/spl_ymodem.c b/common/spl/spl_ymodem.c
index 380d8dd..4f26ea5 100644
--- a/common/spl/spl_ymodem.c
+++ b/common/spl/spl_ymodem.c
@@ -40,8 +40,11 @@
 	if (!ret) {
 		while ((res =
 			xyzModem_stream_read(buf, BUF_SIZE, &err)) > 0) {
-			if (addr == 0)
-				spl_parse_image_header((struct image_header *)buf);
+			if (addr == 0) {
+				ret = spl_parse_image_header((struct image_header *)buf);
+				if (ret)
+					return ret;
+			}
 			store_addr = addr + spl_image.load_addr;
 			size += res;
 			addr += res;
diff --git a/common/usb_storage.c b/common/usb_storage.c
index 9285c95..7e6e52d 100644
--- a/common/usb_storage.c
+++ b/common/usb_storage.c
@@ -136,23 +136,6 @@
 #endif
 void uhci_show_temp_int_td(void);
 
-#ifdef CONFIG_PARTITIONS
-struct blk_desc *usb_stor_get_dev(int index)
-{
-#ifdef CONFIG_BLK
-	struct udevice *dev;
-	int ret;
-
-	ret = blk_get_device(IF_TYPE_USB, index, &dev);
-	if (ret)
-		return NULL;
-	return dev_get_uclass_platdata(dev);
-#else
-	return (index < usb_max_devs) ? &usb_dev_desc[index] : NULL;
-#endif
-}
-#endif
-
 static void usb_show_progress(void)
 {
 	debug(".");
@@ -217,7 +200,6 @@
 
 #ifdef CONFIG_BLK
 	struct us_data *data;
-	char dev_name[30], *str;
 	int ret;
 #else
 	int start;
@@ -240,14 +222,12 @@
 	for (lun = 0; lun <= max_lun; lun++) {
 		struct blk_desc *blkdev;
 		struct udevice *dev;
+		char str[10];
 
-		snprintf(dev_name, sizeof(dev_name), "%s.lun%d",
-			 udev->dev->name, lun);
-		str = strdup(dev_name);
-		if (!str)
-			return -ENOMEM;
-		ret = blk_create_device(udev->dev, "usb_storage_blk", str,
-				IF_TYPE_USB, usb_max_devs, 512, 0, &dev);
+		snprintf(str, sizeof(str), "lun%d", lun);
+		ret = blk_create_devicef(udev->dev, "usb_storage_blk", str,
+					 IF_TYPE_USB, usb_max_devs, 512, 0,
+					 &dev);
 		if (ret) {
 			debug("Cannot bind driver\n");
 			return ret;
@@ -1555,4 +1535,11 @@
 	.id		= UCLASS_BLK,
 	.ops		= &usb_storage_ops,
 };
+#else
+U_BOOT_LEGACY_BLK(usb) = {
+	.if_typename	= "usb",
+	.if_type	= IF_TYPE_USB,
+	.max_devs	= USB_MAX_STOR_DEV,
+	.desc		= usb_dev_desc,
+};
 #endif
diff --git a/configs/am437x_gp_evm_defconfig b/configs/am437x_gp_evm_defconfig
index 03b02ac..f098fd3 100644
--- a/configs/am437x_gp_evm_defconfig
+++ b/configs/am437x_gp_evm_defconfig
@@ -47,3 +47,4 @@
 CONFIG_G_DNL_MANUFACTURER="Texas Instruments"
 CONFIG_G_DNL_VENDOR_NUM=0x0403
 CONFIG_G_DNL_PRODUCT_NUM=0xbd00
+CONFIG_DM_ETH=y
diff --git a/configs/am437x_sk_evm_defconfig b/configs/am437x_sk_evm_defconfig
index 48ec91f..8be0412 100644
--- a/configs/am437x_sk_evm_defconfig
+++ b/configs/am437x_sk_evm_defconfig
@@ -51,3 +51,4 @@
 CONFIG_G_DNL_MANUFACTURER="Texas Instruments"
 CONFIG_G_DNL_VENDOR_NUM=0x0403
 CONFIG_G_DNL_PRODUCT_NUM=0xbd00
+CONFIG_DM_ETH=y
diff --git a/configs/ap121_defconfig b/configs/ap121_defconfig
new file mode 100644
index 0000000..7604e2e
--- /dev/null
+++ b/configs/ap121_defconfig
@@ -0,0 +1,47 @@
+CONFIG_MIPS=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_DM_SERIAL=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_ARCH_ATH79=y
+CONFIG_DEFAULT_DEVICE_TREE="ap121"
+CONFIG_SYS_PROMPT="ap121 # "
+# CONFIG_CMD_BDI is not set
+# CONFIG_CMD_CONSOLE is not set
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_XIMG is not set
+# CONFIG_CMD_EXPORTENV is not set
+# CONFIG_CMD_IMPORTENV is not set
+# CONFIG_CMD_EDITENV is not set
+# CONFIG_CMD_CRC32 is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+# CONFIG_CMD_FPGA is not set
+# CONFIG_CMD_NET is not set
+# CONFIG_CMD_NFS is not set
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_BAR=y
+CONFIG_SPI_FLASH_ATMEL=y
+CONFIG_SPI_FLASH_EON=y
+CONFIG_SPI_FLASH_GIGADEVICE=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_SST=y
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_SPI_FLASH_DATAFLASH=y
+CONFIG_SPI_FLASH_MTD=y
+CONFIG_PINCTRL=y
+CONFIG_PINCONF=y
+CONFIG_AR933X_PINCTRL=y
+CONFIG_DEBUG_UART=y
+CONFIG_DEBUG_UART_AR933X=y
+CONFIG_DEBUG_UART_BASE=0xb8020000
+CONFIG_DEBUG_UART_CLOCK=25000000
+CONFIG_DEBUG_UART_BOARD_INIT=y
+CONFIG_AR933X_UART=y
+CONFIG_ATH79_SPI=y
+CONFIG_USE_PRIVATE_LIBGCC=y
+CONFIG_OF_LIBFDT=y
diff --git a/configs/ap143_defconfig b/configs/ap143_defconfig
new file mode 100644
index 0000000..1aa6e5d
--- /dev/null
+++ b/configs/ap143_defconfig
@@ -0,0 +1,47 @@
+CONFIG_MIPS=y
+CONFIG_SYS_MALLOC_F_LEN=0x800
+CONFIG_DM_SERIAL=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_ARCH_ATH79=y
+CONFIG_TARGET_AP143=y
+CONFIG_DEFAULT_DEVICE_TREE="ap143"
+CONFIG_SYS_PROMPT="ap143 # "
+# CONFIG_CMD_BDI is not set
+# CONFIG_CMD_CONSOLE is not set
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_XIMG is not set
+# CONFIG_CMD_EXPORTENV is not set
+# CONFIG_CMD_IMPORTENV is not set
+# CONFIG_CMD_EDITENV is not set
+# CONFIG_CMD_CRC32 is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+# CONFIG_CMD_FPGA is not set
+# CONFIG_CMD_NET is not set
+# CONFIG_CMD_NFS is not set
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_BAR=y
+CONFIG_SPI_FLASH_ATMEL=y
+CONFIG_SPI_FLASH_EON=y
+CONFIG_SPI_FLASH_GIGADEVICE=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_SST=y
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_SPI_FLASH_DATAFLASH=y
+CONFIG_SPI_FLASH_MTD=y
+CONFIG_PINCTRL=y
+CONFIG_QCA953X_PINCTRL=y
+CONFIG_DEBUG_UART=y
+CONFIG_DEBUG_UART_BASE=0xb8020000
+CONFIG_DEBUG_UART_CLOCK=25000000
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_DEBUG_UART_BOARD_INIT=y
+CONFIG_SYS_NS16550=y
+CONFIG_ATH79_SPI=y
+CONFIG_USE_PRIVATE_LIBGCC=y
+CONFIG_OF_LIBFDT=y
diff --git a/configs/axs101_defconfig b/configs/axs101_defconfig
index 85af09e..07a6a18 100644
--- a/configs/axs101_defconfig
+++ b/configs/axs101_defconfig
@@ -18,6 +18,7 @@
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM=y
 CONFIG_CLK=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_DM_ETH=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_SYS_NS16550=y
diff --git a/configs/axs103_defconfig b/configs/axs103_defconfig
index aa9bf33..01a5143 100644
--- a/configs/axs103_defconfig
+++ b/configs/axs103_defconfig
@@ -18,6 +18,7 @@
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM=y
 CONFIG_CLK=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_DM_ETH=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_SYS_NS16550=y
diff --git a/configs/bayleybay_defconfig b/configs/bayleybay_defconfig
index ce1f519..9f1d7fb 100644
--- a/configs/bayleybay_defconfig
+++ b/configs/bayleybay_defconfig
@@ -9,6 +9,8 @@
 CONFIG_VGA_BIOS_ADDR=0xfffa0000
 CONFIG_GENERATE_PIRQ_TABLE=y
 CONFIG_GENERATE_MP_TABLE=y
+CONFIG_GENERATE_ACPI_TABLE=y
+CONFIG_SEABIOS=y
 CONFIG_FIT=y
 CONFIG_BOOTSTAGE=y
 CONFIG_BOOTSTAGE_REPORT=y
diff --git a/configs/conga-qeval20-qa3-e3845_defconfig b/configs/conga-qeval20-qa3-e3845_defconfig
index 5186345..64fd7c9 100644
--- a/configs/conga-qeval20-qa3-e3845_defconfig
+++ b/configs/conga-qeval20-qa3-e3845_defconfig
@@ -8,6 +8,8 @@
 CONFIG_HAVE_VGA_BIOS=y
 CONFIG_GENERATE_PIRQ_TABLE=y
 CONFIG_GENERATE_MP_TABLE=y
+CONFIG_GENERATE_ACPI_TABLE=y
+CONFIG_SEABIOS=y
 CONFIG_FIT=y
 CONFIG_FIT_SIGNATURE=y
 CONFIG_BOOTSTAGE=y
diff --git a/configs/crownbay_defconfig b/configs/crownbay_defconfig
index 7c6b692..8e086c5 100644
--- a/configs/crownbay_defconfig
+++ b/configs/crownbay_defconfig
@@ -8,8 +8,6 @@
 CONFIG_GENERATE_PIRQ_TABLE=y
 CONFIG_GENERATE_MP_TABLE=y
 CONFIG_FIT=y
-CONFIG_BOOTSTAGE=y
-CONFIG_BOOTSTAGE_REPORT=y
 CONFIG_HUSH_PARSER=y
 CONFIG_CMD_CPU=y
 # CONFIG_CMD_IMLS is not set
@@ -24,7 +22,6 @@
 # CONFIG_CMD_NFS is not set
 CONFIG_CMD_PING=y
 CONFIG_CMD_TIME=y
-CONFIG_CMD_BOOTSTAGE=y
 CONFIG_CMD_EXT2=y
 CONFIG_CMD_EXT4=y
 CONFIG_CMD_EXT4_WRITE=y
diff --git a/configs/dra74_evm_defconfig b/configs/dra74_evm_defconfig
index a11dcd5..32ffce7 100644
--- a/configs/dra74_evm_defconfig
+++ b/configs/dra74_evm_defconfig
@@ -50,3 +50,4 @@
 CONFIG_G_DNL_MANUFACTURER="Texas Instruments"
 CONFIG_G_DNL_VENDOR_NUM=0x0451
 CONFIG_G_DNL_PRODUCT_NUM=0xd022
+CONFIG_DM_ETH=y
diff --git a/configs/galileo_defconfig b/configs/galileo_defconfig
index 17b1458..f8d3c3b8 100644
--- a/configs/galileo_defconfig
+++ b/configs/galileo_defconfig
@@ -4,10 +4,12 @@
 CONFIG_TARGET_GALILEO=y
 CONFIG_ENABLE_MRC_CACHE=y
 CONFIG_GENERATE_PIRQ_TABLE=y
+CONFIG_GENERATE_MP_TABLE=y
 CONFIG_FIT=y
 CONFIG_BOOTSTAGE=y
 CONFIG_BOOTSTAGE_REPORT=y
 CONFIG_HUSH_PARSER=y
+CONFIG_CMD_CPU=y
 # CONFIG_CMD_IMLS is not set
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_MMC=y
@@ -30,6 +32,7 @@
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_REGMAP=y
 CONFIG_SYSCON=y
+CONFIG_CPU=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_GIGADEVICE=y
 CONFIG_SPI_FLASH_MACRONIX=y
diff --git a/configs/minnowmax_defconfig b/configs/minnowmax_defconfig
index 9930d56..28b837d 100644
--- a/configs/minnowmax_defconfig
+++ b/configs/minnowmax_defconfig
@@ -8,6 +8,8 @@
 CONFIG_HAVE_VGA_BIOS=y
 CONFIG_GENERATE_PIRQ_TABLE=y
 CONFIG_GENERATE_MP_TABLE=y
+CONFIG_GENERATE_ACPI_TABLE=y
+CONFIG_SEABIOS=y
 CONFIG_FIT=y
 CONFIG_FIT_SIGNATURE=y
 CONFIG_BOOTSTAGE=y
diff --git a/configs/pico-imx6ul_defconfig b/configs/pico-imx6ul_defconfig
index cc49dc9..d46cd3b 100644
--- a/configs/pico-imx6ul_defconfig
+++ b/configs/pico-imx6ul_defconfig
@@ -2,6 +2,7 @@
 CONFIG_ARCH_MX6=y
 CONFIG_TARGET_PICO_IMX6UL=y
 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/technexion/pico-imx6ul/imximage.cfg"
+CONFIG_HUSH_PARSER=y
 CONFIG_CMD_BOOTZ=y
 # CONFIG_CMD_IMLS is not set
 CONFIG_CMD_MEMTEST=y
diff --git a/configs/qemu-x86_defconfig b/configs/qemu-x86_defconfig
index 53b1ff6..45bb3ec 100644
--- a/configs/qemu-x86_defconfig
+++ b/configs/qemu-x86_defconfig
@@ -20,6 +20,7 @@
 # CONFIG_CMD_NFS is not set
 CONFIG_CMD_PING=y
 CONFIG_CMD_TIME=y
+CONFIG_CMD_QFW=y
 CONFIG_CMD_BOOTSTAGE=y
 CONFIG_CMD_EXT2=y
 CONFIG_CMD_EXT4=y
diff --git a/configs/sama5d2_ptc_nandflash_defconfig b/configs/sama5d2_ptc_nandflash_defconfig
new file mode 100644
index 0000000..7425184
--- /dev/null
+++ b/configs/sama5d2_ptc_nandflash_defconfig
@@ -0,0 +1,12 @@
+CONFIG_ARM=y
+CONFIG_ARCH_AT91=y
+CONFIG_TARGET_SAMA5D2_PTC=y
+CONFIG_SPL=y
+CONFIG_SYS_EXTRA_OPTIONS="SAMA5D2,SYS_USE_NANDFLASH"
+# CONFIG_CMD_IMI is not set
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_LOADS is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_SF=y
+# CONFIG_CMD_FPGA is not set
+CONFIG_SPI_FLASH=y
diff --git a/configs/sama5d2_ptc_spiflash_defconfig b/configs/sama5d2_ptc_spiflash_defconfig
new file mode 100644
index 0000000..27fc394
--- /dev/null
+++ b/configs/sama5d2_ptc_spiflash_defconfig
@@ -0,0 +1,12 @@
+CONFIG_ARM=y
+CONFIG_ARCH_AT91=y
+CONFIG_TARGET_SAMA5D2_PTC=y
+CONFIG_SPL=y
+CONFIG_SYS_EXTRA_OPTIONS="SAMA5D2,SYS_USE_SERIALFLASH"
+# CONFIG_CMD_IMI is not set
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_LOADS is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_SF=y
+# CONFIG_CMD_FPGA is not set
+CONFIG_SPI_FLASH=y
diff --git a/configs/sama5d2_xplained_mmc_defconfig b/configs/sama5d2_xplained_mmc_defconfig
index 7fd37d6..1880256 100644
--- a/configs/sama5d2_xplained_mmc_defconfig
+++ b/configs/sama5d2_xplained_mmc_defconfig
@@ -21,3 +21,4 @@
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_ATMEL_USBA=y
 CONFIG_OF_LIBFDT=y
+CONFIG_FIT=y
diff --git a/configs/sama5d2_xplained_spiflash_defconfig b/configs/sama5d2_xplained_spiflash_defconfig
index de4e6bc..de8f4d9 100644
--- a/configs/sama5d2_xplained_spiflash_defconfig
+++ b/configs/sama5d2_xplained_spiflash_defconfig
@@ -21,3 +21,4 @@
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_ATMEL_USBA=y
 CONFIG_OF_LIBFDT=y
+CONFIG_FIT=y
diff --git a/configs/sama5d3_xplained_mmc_defconfig b/configs/sama5d3_xplained_mmc_defconfig
index 189a3e9..1dabc5f 100644
--- a/configs/sama5d3_xplained_mmc_defconfig
+++ b/configs/sama5d3_xplained_mmc_defconfig
@@ -19,3 +19,4 @@
 CONFIG_CMD_EXT4_WRITE=y
 CONFIG_CMD_FAT=y
 CONFIG_OF_LIBFDT=y
+CONFIG_FIT=y
diff --git a/configs/sama5d3_xplained_nandflash_defconfig b/configs/sama5d3_xplained_nandflash_defconfig
index 16e3f22..458a486 100644
--- a/configs/sama5d3_xplained_nandflash_defconfig
+++ b/configs/sama5d3_xplained_nandflash_defconfig
@@ -19,3 +19,4 @@
 CONFIG_CMD_EXT4_WRITE=y
 CONFIG_CMD_FAT=y
 CONFIG_OF_LIBFDT=y
+CONFIG_FIT=y
diff --git a/configs/sama5d3xek_mmc_defconfig b/configs/sama5d3xek_mmc_defconfig
index 8d3c3cf..488d950 100644
--- a/configs/sama5d3xek_mmc_defconfig
+++ b/configs/sama5d3xek_mmc_defconfig
@@ -21,3 +21,4 @@
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_ATMEL_USBA=y
 CONFIG_OF_LIBFDT=y
+CONFIG_FIT=y
diff --git a/configs/sama5d3xek_nandflash_defconfig b/configs/sama5d3xek_nandflash_defconfig
index 8e15286..12f28f2 100644
--- a/configs/sama5d3xek_nandflash_defconfig
+++ b/configs/sama5d3xek_nandflash_defconfig
@@ -21,3 +21,4 @@
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_ATMEL_USBA=y
 CONFIG_OF_LIBFDT=y
+CONFIG_FIT=y
diff --git a/configs/sama5d3xek_spiflash_defconfig b/configs/sama5d3xek_spiflash_defconfig
index ffbafae..42fcc1e 100644
--- a/configs/sama5d3xek_spiflash_defconfig
+++ b/configs/sama5d3xek_spiflash_defconfig
@@ -21,3 +21,4 @@
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_ATMEL_USBA=y
 CONFIG_OF_LIBFDT=y
+CONFIG_FIT=y
diff --git a/configs/sama5d4_xplained_mmc_defconfig b/configs/sama5d4_xplained_mmc_defconfig
index 1ea5cda..3110269 100644
--- a/configs/sama5d4_xplained_mmc_defconfig
+++ b/configs/sama5d4_xplained_mmc_defconfig
@@ -22,3 +22,4 @@
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_ATMEL_USBA=y
 CONFIG_OF_LIBFDT=y
+CONFIG_FIT=y
diff --git a/configs/sama5d4_xplained_nandflash_defconfig b/configs/sama5d4_xplained_nandflash_defconfig
index 5384917..3ea4bd7 100644
--- a/configs/sama5d4_xplained_nandflash_defconfig
+++ b/configs/sama5d4_xplained_nandflash_defconfig
@@ -22,3 +22,4 @@
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_ATMEL_USBA=y
 CONFIG_OF_LIBFDT=y
+CONFIG_FIT=y
diff --git a/configs/sama5d4_xplained_spiflash_defconfig b/configs/sama5d4_xplained_spiflash_defconfig
index b709cf6..dbec4ad 100644
--- a/configs/sama5d4_xplained_spiflash_defconfig
+++ b/configs/sama5d4_xplained_spiflash_defconfig
@@ -22,3 +22,4 @@
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_ATMEL_USBA=y
 CONFIG_OF_LIBFDT=y
+CONFIG_FIT=y
diff --git a/configs/sama5d4ek_mmc_defconfig b/configs/sama5d4ek_mmc_defconfig
index 45128e9..f2a5844 100644
--- a/configs/sama5d4ek_mmc_defconfig
+++ b/configs/sama5d4ek_mmc_defconfig
@@ -22,3 +22,4 @@
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_ATMEL_USBA=y
 CONFIG_OF_LIBFDT=y
+CONFIG_FIT=y
diff --git a/configs/sama5d4ek_nandflash_defconfig b/configs/sama5d4ek_nandflash_defconfig
index 9c1c232..58186ce 100644
--- a/configs/sama5d4ek_nandflash_defconfig
+++ b/configs/sama5d4ek_nandflash_defconfig
@@ -22,3 +22,4 @@
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_ATMEL_USBA=y
 CONFIG_OF_LIBFDT=y
+CONFIG_FIT=y
diff --git a/configs/sama5d4ek_spiflash_defconfig b/configs/sama5d4ek_spiflash_defconfig
index 59eb4dd..ab23e95 100644
--- a/configs/sama5d4ek_spiflash_defconfig
+++ b/configs/sama5d4ek_spiflash_defconfig
@@ -22,3 +22,4 @@
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_ATMEL_USBA=y
 CONFIG_OF_LIBFDT=y
+CONFIG_FIT=y
diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig
index afdf4a3..9e4a92d 100644
--- a/configs/sandbox_defconfig
+++ b/configs/sandbox_defconfig
@@ -1,4 +1,5 @@
 CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_MMC=y
 CONFIG_PCI=y
 CONFIG_DEFAULT_DEVICE_TREE="sandbox"
 CONFIG_I8042_KEYB=y
@@ -47,6 +48,7 @@
 CONFIG_CMD_TIME=y
 CONFIG_CMD_TIMER=y
 CONFIG_CMD_SOUND=y
+CONFIG_CMD_QFW=y
 CONFIG_CMD_BOOTSTAGE=y
 CONFIG_CMD_PMIC=y
 CONFIG_CMD_REGULATOR=y
@@ -97,6 +99,7 @@
 CONFIG_SPL_PWRSEQ=y
 CONFIG_RESET=y
 CONFIG_DM_MMC=y
+CONFIG_SANDBOX_MMC=y
 CONFIG_SPI_FLASH_SANDBOX=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_ATMEL=y
diff --git a/configs/sandbox_noblk_defconfig b/configs/sandbox_noblk_defconfig
new file mode 100644
index 0000000..93167c2
--- /dev/null
+++ b/configs/sandbox_noblk_defconfig
@@ -0,0 +1,168 @@
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_PCI=y
+CONFIG_DEFAULT_DEVICE_TREE="sandbox"
+CONFIG_I8042_KEYB=y
+CONFIG_FIT=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_FIT_SIGNATURE=y
+CONFIG_SPL_LOAD_FIT=y
+CONFIG_BOOTSTAGE=y
+CONFIG_BOOTSTAGE_REPORT=y
+CONFIG_BOOTSTAGE_USER_COUNT=0x20
+CONFIG_BOOTSTAGE_FDT=y
+CONFIG_BOOTSTAGE_STASH=y
+CONFIG_BOOTSTAGE_STASH_ADDR=0x0
+CONFIG_BOOTSTAGE_STASH_SIZE=0x4096
+CONFIG_CONSOLE_RECORD=y
+CONFIG_CONSOLE_RECORD_OUT_SIZE=0x1000
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_CPU=y
+CONFIG_CMD_LICENSE=y
+CONFIG_CMD_BOOTZ=y
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_IMLS is not set
+CONFIG_CMD_ASKENV=y
+CONFIG_CMD_GREPENV=y
+CONFIG_LOOPW=y
+CONFIG_CMD_MEMTEST=y
+CONFIG_CMD_MX_CYCLIC=y
+CONFIG_CMD_MEMINFO=y
+CONFIG_CMD_DEMO=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_REMOTEPROC=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_TFTPPUT=y
+CONFIG_CMD_TFTPSRV=y
+CONFIG_CMD_RARP=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_MII=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_CDP=y
+CONFIG_CMD_SNTP=y
+CONFIG_CMD_DNS=y
+CONFIG_CMD_LINK_LOCAL=y
+CONFIG_CMD_TIME=y
+CONFIG_CMD_TIMER=y
+CONFIG_CMD_SOUND=y
+CONFIG_CMD_BOOTSTAGE=y
+CONFIG_CMD_PMIC=y
+CONFIG_CMD_REGULATOR=y
+CONFIG_CMD_TPM=y
+CONFIG_CMD_TPM_TEST=y
+CONFIG_CMD_EXT2=y
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_EXT4_WRITE=y
+CONFIG_CMD_FAT=y
+CONFIG_CMD_FS_GENERIC=y
+CONFIG_OF_CONTROL=y
+CONFIG_OF_HOSTFILE=y
+CONFIG_NETCONSOLE=y
+CONFIG_REGMAP=y
+CONFIG_SPL_REGMAP=y
+CONFIG_SYSCON=y
+CONFIG_SPL_SYSCON=y
+CONFIG_DEVRES=y
+CONFIG_DEBUG_DEVRES=y
+CONFIG_ADC=y
+CONFIG_ADC_SANDBOX=y
+CONFIG_CLK=y
+CONFIG_CPU=y
+CONFIG_DM_DEMO=y
+CONFIG_DM_DEMO_SIMPLE=y
+CONFIG_DM_DEMO_SHAPE=y
+CONFIG_PM8916_GPIO=y
+CONFIG_SANDBOX_GPIO=y
+CONFIG_DM_I2C_COMPAT=y
+CONFIG_I2C_CROS_EC_TUNNEL=y
+CONFIG_I2C_CROS_EC_LDO=y
+CONFIG_DM_I2C_GPIO=y
+CONFIG_SYS_I2C_SANDBOX=y
+CONFIG_I2C_MUX=y
+CONFIG_SPL_I2C_MUX=y
+CONFIG_I2C_ARB_GPIO_CHALLENGE=y
+CONFIG_CROS_EC_KEYB=y
+CONFIG_LED=y
+CONFIG_LED_GPIO=y
+CONFIG_CMD_CROS_EC=y
+CONFIG_CROS_EC=y
+CONFIG_CROS_EC_I2C=y
+CONFIG_CROS_EC_LPC=y
+CONFIG_CROS_EC_SANDBOX=y
+CONFIG_CROS_EC_SPI=y
+CONFIG_PWRSEQ=y
+CONFIG_SPL_PWRSEQ=y
+CONFIG_RESET=y
+CONFIG_DM_MMC=y
+CONFIG_SPI_FLASH_SANDBOX=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_ATMEL=y
+CONFIG_SPI_FLASH_EON=y
+CONFIG_SPI_FLASH_GIGADEVICE=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_SST=y
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_DM_ETH=y
+CONFIG_DM_PCI=y
+CONFIG_DM_PCI_COMPAT=y
+CONFIG_PCI_SANDBOX=y
+CONFIG_PINCTRL=y
+CONFIG_PINCONF=y
+CONFIG_ROCKCHIP_PINCTRL=y
+CONFIG_ROCKCHIP_3036_PINCTRL=y
+CONFIG_PINCTRL_SANDBOX=y
+CONFIG_DM_PMIC=y
+CONFIG_PMIC_ACT8846=y
+CONFIG_DM_PMIC_PFUZE100=y
+CONFIG_DM_PMIC_MAX77686=y
+CONFIG_PMIC_PM8916=y
+CONFIG_PMIC_RK808=y
+CONFIG_PMIC_S2MPS11=y
+CONFIG_DM_PMIC_SANDBOX=y
+CONFIG_PMIC_S5M8767=y
+CONFIG_PMIC_TPS65090=y
+CONFIG_DM_REGULATOR=y
+CONFIG_REGULATOR_ACT8846=y
+CONFIG_DM_REGULATOR_PFUZE100=y
+CONFIG_DM_REGULATOR_MAX77686=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_REGULATOR_RK808=y
+CONFIG_REGULATOR_S5M8767=y
+CONFIG_DM_REGULATOR_SANDBOX=y
+CONFIG_REGULATOR_TPS65090=y
+CONFIG_RAM=y
+CONFIG_REMOTEPROC_SANDBOX=y
+CONFIG_DM_RTC=y
+CONFIG_SANDBOX_SERIAL=y
+CONFIG_SOUND=y
+CONFIG_SOUND_SANDBOX=y
+CONFIG_SANDBOX_SPI=y
+CONFIG_SPMI=y
+CONFIG_SPMI_SANDBOX=y
+CONFIG_TIMER=y
+CONFIG_TIMER_EARLY=y
+CONFIG_SANDBOX_TIMER=y
+CONFIG_TPM_TIS_SANDBOX=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_EMUL=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_KEYBOARD=y
+CONFIG_SYS_USB_EVENT_POLL=y
+CONFIG_DM_VIDEO=y
+CONFIG_CONSOLE_ROTATION=y
+CONFIG_CONSOLE_TRUETYPE=y
+CONFIG_CONSOLE_TRUETYPE_CANTORAONE=y
+CONFIG_VIDEO_SANDBOX_SDL=y
+CONFIG_CMD_DHRYSTONE=y
+CONFIG_TPM=y
+CONFIG_LZ4=y
+CONFIG_ERRNO_STR=y
+CONFIG_UNIT_TEST=y
+CONFIG_UT_TIME=y
+CONFIG_UT_DM=y
+CONFIG_UT_ENV=y
diff --git a/configs/socfpga_arria5_defconfig b/configs/socfpga_arria5_defconfig
index 9a7c091..a662e72 100644
--- a/configs/socfpga_arria5_defconfig
+++ b/configs/socfpga_arria5_defconfig
@@ -33,6 +33,7 @@
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_DWAPB_GPIO=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_DM_MMC=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_BAR=y
diff --git a/configs/socfpga_cyclone5_defconfig b/configs/socfpga_cyclone5_defconfig
index ac81854..b2933f7 100644
--- a/configs/socfpga_cyclone5_defconfig
+++ b/configs/socfpga_cyclone5_defconfig
@@ -33,6 +33,7 @@
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_DWAPB_GPIO=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_DM_MMC=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_BAR=y
diff --git a/configs/socfpga_de0_nano_soc_defconfig b/configs/socfpga_de0_nano_soc_defconfig
index 405d9d4..f197b6d 100644
--- a/configs/socfpga_de0_nano_soc_defconfig
+++ b/configs/socfpga_de0_nano_soc_defconfig
@@ -32,6 +32,7 @@
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_DWAPB_GPIO=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_DM_MMC=y
 CONFIG_DM_ETH=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/socfpga_mcvevk_defconfig b/configs/socfpga_mcvevk_defconfig
index 3615490..6624f9e 100644
--- a/configs/socfpga_mcvevk_defconfig
+++ b/configs/socfpga_mcvevk_defconfig
@@ -32,6 +32,7 @@
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_DWAPB_GPIO=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_DM_MMC=y
 CONFIG_DM_ETH=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/socfpga_sockit_defconfig b/configs/socfpga_sockit_defconfig
index bdc8e6b..c6414f8 100644
--- a/configs/socfpga_sockit_defconfig
+++ b/configs/socfpga_sockit_defconfig
@@ -33,6 +33,7 @@
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_DWAPB_GPIO=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_DM_MMC=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_BAR=y
diff --git a/configs/socfpga_socrates_defconfig b/configs/socfpga_socrates_defconfig
index a17e9d0..b47a560 100644
--- a/configs/socfpga_socrates_defconfig
+++ b/configs/socfpga_socrates_defconfig
@@ -34,6 +34,7 @@
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_DWAPB_GPIO=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_DM_MMC=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_BAR=y
diff --git a/configs/socfpga_sr1500_defconfig b/configs/socfpga_sr1500_defconfig
index c4b215a..aab4498 100644
--- a/configs/socfpga_sr1500_defconfig
+++ b/configs/socfpga_sr1500_defconfig
@@ -32,6 +32,7 @@
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_DWAPB_GPIO=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_DM_MMC=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_BAR=y
diff --git a/configs/spear300_defconfig b/configs/spear300_defconfig
index af2f544..db3b6ea 100644
--- a/configs/spear300_defconfig
+++ b/configs/spear300_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear300_nand_defconfig b/configs/spear300_nand_defconfig
index 6c53e1f..ea4e8d7 100644
--- a/configs/spear300_nand_defconfig
+++ b/configs/spear300_nand_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear300_usbtty_defconfig b/configs/spear300_usbtty_defconfig
index 6827701..a2b56f3 100644
--- a/configs/spear300_usbtty_defconfig
+++ b/configs/spear300_usbtty_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear300_usbtty_nand_defconfig b/configs/spear300_usbtty_nand_defconfig
index 477a226..1738489 100644
--- a/configs/spear300_usbtty_nand_defconfig
+++ b/configs/spear300_usbtty_nand_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear310_defconfig b/configs/spear310_defconfig
index 0991f8e..a6064a5 100644
--- a/configs/spear310_defconfig
+++ b/configs/spear310_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear310_nand_defconfig b/configs/spear310_nand_defconfig
index ef30a67..85944c6 100644
--- a/configs/spear310_nand_defconfig
+++ b/configs/spear310_nand_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear310_pnor_defconfig b/configs/spear310_pnor_defconfig
index 6cfe220..48efe3d 100644
--- a/configs/spear310_pnor_defconfig
+++ b/configs/spear310_pnor_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear310_usbtty_defconfig b/configs/spear310_usbtty_defconfig
index c0d8edf..8edbe0c 100644
--- a/configs/spear310_usbtty_defconfig
+++ b/configs/spear310_usbtty_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear310_usbtty_nand_defconfig b/configs/spear310_usbtty_nand_defconfig
index e9d14ce..b622f74 100644
--- a/configs/spear310_usbtty_nand_defconfig
+++ b/configs/spear310_usbtty_nand_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear310_usbtty_pnor_defconfig b/configs/spear310_usbtty_pnor_defconfig
index 2e46e64..241a72a 100644
--- a/configs/spear310_usbtty_pnor_defconfig
+++ b/configs/spear310_usbtty_pnor_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear320_defconfig b/configs/spear320_defconfig
index 8dba79a..49d7c04 100644
--- a/configs/spear320_defconfig
+++ b/configs/spear320_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear320_nand_defconfig b/configs/spear320_nand_defconfig
index 7f33c78..70b3025 100644
--- a/configs/spear320_nand_defconfig
+++ b/configs/spear320_nand_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear320_pnor_defconfig b/configs/spear320_pnor_defconfig
index f7d3725..5ced0e1 100644
--- a/configs/spear320_pnor_defconfig
+++ b/configs/spear320_pnor_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear320_usbtty_defconfig b/configs/spear320_usbtty_defconfig
index 9e41253..de75b17 100644
--- a/configs/spear320_usbtty_defconfig
+++ b/configs/spear320_usbtty_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear320_usbtty_nand_defconfig b/configs/spear320_usbtty_nand_defconfig
index e61c74e..2202d2e 100644
--- a/configs/spear320_usbtty_nand_defconfig
+++ b/configs/spear320_usbtty_nand_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear320_usbtty_pnor_defconfig b/configs/spear320_usbtty_pnor_defconfig
index 7410093..35bb036 100644
--- a/configs/spear320_usbtty_pnor_defconfig
+++ b/configs/spear320_usbtty_pnor_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear600_defconfig b/configs/spear600_defconfig
index f0e041f..f540839 100644
--- a/configs/spear600_defconfig
+++ b/configs/spear600_defconfig
@@ -9,5 +9,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear600_nand_defconfig b/configs/spear600_nand_defconfig
index cc4067d..de416d9 100644
--- a/configs/spear600_nand_defconfig
+++ b/configs/spear600_nand_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear600_usbtty_defconfig b/configs/spear600_usbtty_defconfig
index df21355..8b6e0d0 100644
--- a/configs/spear600_usbtty_defconfig
+++ b/configs/spear600_usbtty_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/spear600_usbtty_nand_defconfig b/configs/spear600_usbtty_nand_defconfig
index 48140aa..e8b4b0a 100644
--- a/configs/spear600_usbtty_nand_defconfig
+++ b/configs/spear600_usbtty_nand_defconfig
@@ -6,5 +6,6 @@
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
diff --git a/configs/tplink_wdr4300_defconfig b/configs/tplink_wdr4300_defconfig
new file mode 100644
index 0000000..b1af2f6
--- /dev/null
+++ b/configs/tplink_wdr4300_defconfig
@@ -0,0 +1,43 @@
+CONFIG_MIPS=y
+CONFIG_ARCH_ATH79=y
+CONFIG_BOARD_TPLINK_WDR4300=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_SYS_NS16550=y
+CONFIG_DM_SERIAL=y
+CONFIG_DEFAULT_DEVICE_TREE="tplink_wdr4300"
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_XIMG is not set
+# CONFIG_CMD_FLASH is not set
+# CONFIG_CMD_FPGA is not set
+CONFIG_CMD_NET=y
+CONFIG_CMD_NFS=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_PING=y
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_DM_ETH=y
+CONFIG_AG7XXX=y
+CONFIG_CLK=y
+CONFIG_CMD_USB=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_GENERIC=y
+CONFIG_USB_STORAGE=y
+CONFIG_ATH79_SPI=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_ATMEL=y
+CONFIG_SPI_FLASH_EON=y
+CONFIG_SPI_FLASH_GIGADEVICE=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_SST=y
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_SPI_FLASH_DATAFLASH=y
+CONFIG_SPI_FLASH_MTD=y
+CONFIG_PINCTRL=y
diff --git a/configs/x600_defconfig b/configs/x600_defconfig
index 1a07b9d..ace620b 100644
--- a/configs/x600_defconfig
+++ b/configs/x600_defconfig
@@ -17,6 +17,7 @@
 CONFIG_CMD_CACHE=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
+CONFIG_SYS_I2C_DW=y
 CONFIG_NETDEVICES=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_USE_TINY_PRINTF=y
diff --git a/configs/xilinx_zynqmp_ep_defconfig b/configs/xilinx_zynqmp_ep_defconfig
index b185593..37b8052 100644
--- a/configs/xilinx_zynqmp_ep_defconfig
+++ b/configs/xilinx_zynqmp_ep_defconfig
@@ -40,12 +40,21 @@
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_OF_EMBED=y
 CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_CLK=y
+CONFIG_SPL_CLK=y
 CONFIG_SYS_I2C_CADENCE=y
 CONFIG_DM_MMC=y
 CONFIG_ZYNQ_SDHCI=y
 CONFIG_NAND_ARASAN=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_BAR=y
 CONFIG_DM_ETH=y
 CONFIG_ZYNQ_GEM=y
+CONFIG_DEBUG_UART=y
+CONFIG_DEBUG_UART_ZYNQ=y
+CONFIG_DEBUG_UART_BASE=0xff000000
+CONFIG_DEBUG_UART_CLOCK=25000000
+CONFIG_DEBUG_UART_ANNOUNCE=y
 CONFIG_USB=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
diff --git a/configs/xilinx_zynqmp_zc1751_xm015_dc1_defconfig b/configs/xilinx_zynqmp_zc1751_xm015_dc1_defconfig
index cc08b03..fa761e5 100644
--- a/configs/xilinx_zynqmp_zc1751_xm015_dc1_defconfig
+++ b/configs/xilinx_zynqmp_zc1751_xm015_dc1_defconfig
@@ -8,6 +8,7 @@
 CONFIG_DEFAULT_DEVICE_TREE="zynqmp-zc1751-xm015-dc1"
 CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
+CONFIG_HUSH_PARSER=y
 CONFIG_SYS_PROMPT="ZynqMP> "
 # CONFIG_CMD_IMLS is not set
 CONFIG_CMD_MEMTEST=y
@@ -30,6 +31,8 @@
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_OF_EMBED=y
 CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_CLK=y
+CONFIG_SPL_CLK=y
 CONFIG_SYS_I2C_CADENCE=y
 CONFIG_DM_MMC=y
 CONFIG_ZYNQ_SDHCI=y
@@ -40,6 +43,11 @@
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_DM_ETH=y
 CONFIG_ZYNQ_GEM=y
+CONFIG_DEBUG_UART=y
+CONFIG_DEBUG_UART_ZYNQ=y
+CONFIG_DEBUG_UART_BASE=0xff000000
+CONFIG_DEBUG_UART_CLOCK=100000000
+CONFIG_DEBUG_UART_ANNOUNCE=y
 CONFIG_USB=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
diff --git a/configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig b/configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig
index 14d24a0..2811d4b 100644
--- a/configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig
+++ b/configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig
@@ -8,6 +8,7 @@
 CONFIG_DEFAULT_DEVICE_TREE="zynqmp-zc1751-xm016-dc2"
 CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
+CONFIG_HUSH_PARSER=y
 CONFIG_SYS_PROMPT="ZynqMP> "
 # CONFIG_CMD_IMLS is not set
 CONFIG_CMD_MEMTEST=y
@@ -29,6 +30,8 @@
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_OF_EMBED=y
 CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_CLK=y
+CONFIG_SPL_CLK=y
 CONFIG_SYS_I2C_CADENCE=y
 CONFIG_DM_MMC=y
 CONFIG_NAND_ARASAN=y
diff --git a/configs/xilinx_zynqmp_zc1751_xm019_dc5_defconfig b/configs/xilinx_zynqmp_zc1751_xm019_dc5_defconfig
index e1e11b7..3711084 100644
--- a/configs/xilinx_zynqmp_zc1751_xm019_dc5_defconfig
+++ b/configs/xilinx_zynqmp_zc1751_xm019_dc5_defconfig
@@ -7,6 +7,7 @@
 CONFIG_DEFAULT_DEVICE_TREE="zynqmp-zc1751-xm019-dc5"
 CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
+CONFIG_HUSH_PARSER=y
 CONFIG_SYS_PROMPT="ZynqMP> "
 # CONFIG_CMD_IMLS is not set
 CONFIG_CMD_MEMTEST=y
@@ -25,6 +26,8 @@
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_OF_EMBED=y
+CONFIG_CLK=y
+CONFIG_SPL_CLK=y
 CONFIG_SYS_I2C_CADENCE=y
 CONFIG_DM_MMC=y
 CONFIG_ZYNQ_SDHCI=y
diff --git a/configs/xilinx_zynqmp_zcu102_defconfig b/configs/xilinx_zynqmp_zcu102_defconfig
index 6f1cff8..46a5dd0 100644
--- a/configs/xilinx_zynqmp_zcu102_defconfig
+++ b/configs/xilinx_zynqmp_zcu102_defconfig
@@ -7,6 +7,7 @@
 CONFIG_DEFAULT_DEVICE_TREE="zynqmp-zcu102"
 CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
+CONFIG_HUSH_PARSER=y
 CONFIG_SYS_PROMPT="ZynqMP> "
 # CONFIG_CMD_IMLS is not set
 CONFIG_CMD_MEMTEST=y
@@ -29,6 +30,8 @@
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_OF_EMBED=y
 CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_CLK=y
+CONFIG_SPL_CLK=y
 CONFIG_DM_MMC=y
 CONFIG_ZYNQ_SDHCI=y
 CONFIG_SPI_FLASH=y
@@ -38,6 +41,11 @@
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_DM_ETH=y
 CONFIG_ZYNQ_GEM=y
+CONFIG_DEBUG_UART=y
+CONFIG_DEBUG_UART_ZYNQ=y
+CONFIG_DEBUG_UART_BASE=0xff000000
+CONFIG_DEBUG_UART_CLOCK=100000000
+CONFIG_DEBUG_UART_ANNOUNCE=y
 CONFIG_USB=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
diff --git a/configs/xilinx_zynqmp_zcu102_revB_defconfig b/configs/xilinx_zynqmp_zcu102_revB_defconfig
index a8982a0..96a2be1 100644
--- a/configs/xilinx_zynqmp_zcu102_revB_defconfig
+++ b/configs/xilinx_zynqmp_zcu102_revB_defconfig
@@ -7,6 +7,7 @@
 CONFIG_DEFAULT_DEVICE_TREE="zynqmp-zcu102-revB"
 CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
+CONFIG_HUSH_PARSER=y
 CONFIG_SYS_PROMPT="ZynqMP> "
 # CONFIG_CMD_IMLS is not set
 CONFIG_CMD_MEMTEST=y
@@ -29,6 +30,8 @@
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_OF_EMBED=y
 CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_CLK=y
+CONFIG_SPL_CLK=y
 CONFIG_DM_MMC=y
 CONFIG_ZYNQ_SDHCI=y
 CONFIG_SPI_FLASH=y
@@ -38,6 +41,11 @@
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_DM_ETH=y
 CONFIG_ZYNQ_GEM=y
+CONFIG_DEBUG_UART=y
+CONFIG_DEBUG_UART_ZYNQ=y
+CONFIG_DEBUG_UART_BASE=0xff000000
+CONFIG_DEBUG_UART_CLOCK=100000000
+CONFIG_DEBUG_UART_ANNOUNCE=y
 CONFIG_USB=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
diff --git a/configs/zynq_microzed_defconfig b/configs/zynq_microzed_defconfig
index 7c66247..d0b1ec9 100644
--- a/configs/zynq_microzed_defconfig
+++ b/configs/zynq_microzed_defconfig
@@ -1,6 +1,6 @@
 CONFIG_ARM=y
+CONFIG_SYS_CONFIG_NAME="zynq_microzed"
 CONFIG_ARCH_ZYNQ=y
-CONFIG_TARGET_ZYNQ_MICROZED=y
 CONFIG_DEFAULT_DEVICE_TREE="zynq-microzed"
 CONFIG_SPL=y
 CONFIG_FIT=y
diff --git a/configs/zynq_picozed_defconfig b/configs/zynq_picozed_defconfig
index b46ab44..3624424 100644
--- a/configs/zynq_picozed_defconfig
+++ b/configs/zynq_picozed_defconfig
@@ -1,6 +1,6 @@
 CONFIG_ARM=y
+CONFIG_SYS_CONFIG_NAME="zynq_picozed"
 CONFIG_ARCH_ZYNQ=y
-CONFIG_TARGET_ZYNQ_PICOZED=y
 CONFIG_DEFAULT_DEVICE_TREE="zynq-picozed"
 CONFIG_SPL=y
 CONFIG_HUSH_PARSER=y
diff --git a/configs/zynq_zc702_defconfig b/configs/zynq_zc702_defconfig
index 052679a..e1b1fc9 100644
--- a/configs/zynq_zc702_defconfig
+++ b/configs/zynq_zc702_defconfig
@@ -1,4 +1,5 @@
 CONFIG_ARM=y
+CONFIG_SYS_CONFIG_NAME="zynq_zc70x"
 CONFIG_ARCH_ZYNQ=y
 CONFIG_DEFAULT_DEVICE_TREE="zynq-zc702"
 CONFIG_SPL=y
diff --git a/configs/zynq_zc706_defconfig b/configs/zynq_zc706_defconfig
index 3539f05..63d32d9 100644
--- a/configs/zynq_zc706_defconfig
+++ b/configs/zynq_zc706_defconfig
@@ -1,6 +1,6 @@
 CONFIG_ARM=y
+CONFIG_SYS_CONFIG_NAME="zynq_zc70x"
 CONFIG_ARCH_ZYNQ=y
-CONFIG_TARGET_ZYNQ_ZC706=y
 CONFIG_DEFAULT_DEVICE_TREE="zynq-zc706"
 CONFIG_SPL=y
 CONFIG_FIT=y
diff --git a/configs/zynq_zc770_xm010_defconfig b/configs/zynq_zc770_xm010_defconfig
index 6a4726c..6ccbb8c 100644
--- a/configs/zynq_zc770_xm010_defconfig
+++ b/configs/zynq_zc770_xm010_defconfig
@@ -1,6 +1,6 @@
 CONFIG_ARM=y
+CONFIG_SYS_CONFIG_NAME="zynq_zc770"
 CONFIG_ARCH_ZYNQ=y
-CONFIG_TARGET_ZYNQ_ZC770=y
 CONFIG_DEFAULT_DEVICE_TREE="zynq-zc770-xm010"
 CONFIG_SPL=y
 CONFIG_FIT=y
diff --git a/configs/zynq_zc770_xm011_defconfig b/configs/zynq_zc770_xm011_defconfig
index 46dd6be..e6c646b 100644
--- a/configs/zynq_zc770_xm011_defconfig
+++ b/configs/zynq_zc770_xm011_defconfig
@@ -1,6 +1,6 @@
 CONFIG_ARM=y
+CONFIG_SYS_CONFIG_NAME="zynq_zc770"
 CONFIG_ARCH_ZYNQ=y
-CONFIG_TARGET_ZYNQ_ZC770=y
 CONFIG_DEFAULT_DEVICE_TREE="zynq-zc770-xm011"
 CONFIG_SPL=y
 CONFIG_FIT=y
diff --git a/configs/zynq_zc770_xm012_defconfig b/configs/zynq_zc770_xm012_defconfig
index 12f0e2c..a8cfeb8 100644
--- a/configs/zynq_zc770_xm012_defconfig
+++ b/configs/zynq_zc770_xm012_defconfig
@@ -1,6 +1,6 @@
 CONFIG_ARM=y
+CONFIG_SYS_CONFIG_NAME="zynq_zc770"
 CONFIG_ARCH_ZYNQ=y
-CONFIG_TARGET_ZYNQ_ZC770=y
 CONFIG_DEFAULT_DEVICE_TREE="zynq-zc770-xm012"
 CONFIG_SPL=y
 CONFIG_FIT=y
diff --git a/configs/zynq_zc770_xm013_defconfig b/configs/zynq_zc770_xm013_defconfig
index 8c7efe5..f2d00ca 100644
--- a/configs/zynq_zc770_xm013_defconfig
+++ b/configs/zynq_zc770_xm013_defconfig
@@ -1,6 +1,6 @@
 CONFIG_ARM=y
+CONFIG_SYS_CONFIG_NAME="zynq_zc770"
 CONFIG_ARCH_ZYNQ=y
-CONFIG_TARGET_ZYNQ_ZC770=y
 CONFIG_DEFAULT_DEVICE_TREE="zynq-zc770-xm013"
 CONFIG_SPL=y
 CONFIG_FIT=y
diff --git a/configs/zynq_zed_defconfig b/configs/zynq_zed_defconfig
index 7976e07..7783eeb 100644
--- a/configs/zynq_zed_defconfig
+++ b/configs/zynq_zed_defconfig
@@ -1,6 +1,6 @@
 CONFIG_ARM=y
+CONFIG_SYS_CONFIG_NAME="zynq_zed"
 CONFIG_ARCH_ZYNQ=y
-CONFIG_TARGET_ZYNQ_ZED=y
 CONFIG_DEFAULT_DEVICE_TREE="zynq-zed"
 CONFIG_SPL=y
 CONFIG_FIT=y
diff --git a/configs/zynq_zybo_defconfig b/configs/zynq_zybo_defconfig
index cd222c5..9236c5e 100644
--- a/configs/zynq_zybo_defconfig
+++ b/configs/zynq_zybo_defconfig
@@ -1,6 +1,6 @@
 CONFIG_ARM=y
+CONFIG_SYS_CONFIG_NAME="zynq_zybo"
 CONFIG_ARCH_ZYNQ=y
-CONFIG_TARGET_ZYNQ_ZYBO=y
 CONFIG_DEFAULT_DEVICE_TREE="zynq-zybo"
 CONFIG_SPL=y
 CONFIG_FIT=y
diff --git a/disk/part.c b/disk/part.c
index 543cab8..6a1c02d 100644
--- a/disk/part.c
+++ b/disk/part.c
@@ -21,35 +21,6 @@
 #define PRINTF(fmt,args...)
 #endif
 
-const struct block_drvr block_drvr[] = {
-#if defined(CONFIG_CMD_IDE)
-	{ .name = "ide", .get_dev = ide_get_dev, },
-#endif
-#if defined(CONFIG_CMD_SATA)
-	{.name = "sata", .get_dev = sata_get_dev, },
-#endif
-#if defined(CONFIG_CMD_SCSI)
-	{ .name = "scsi", .get_dev = scsi_get_dev, },
-#endif
-#if defined(CONFIG_CMD_USB) && defined(CONFIG_USB_STORAGE)
-	{ .name = "usb", .get_dev = usb_stor_get_dev, },
-#endif
-#if defined(CONFIG_MMC)
-	{
-		.name = "mmc",
-		.get_dev = mmc_get_dev,
-		.select_hwpart = mmc_select_hwpart,
-	},
-#endif
-#if defined(CONFIG_SYSTEMACE)
-	{ .name = "ace", .get_dev = systemace_get_dev, },
-#endif
-#if defined(CONFIG_SANDBOX)
-	{ .name = "host", .get_dev = host_get_dev, },
-#endif
-	{ },
-};
-
 DECLARE_GLOBAL_DATA_PTR;
 
 #ifdef HAVE_BLOCK_DEVICE
@@ -71,45 +42,23 @@
 
 static struct blk_desc *get_dev_hwpart(const char *ifname, int dev, int hwpart)
 {
-	const struct block_drvr *drvr = block_drvr;
-	struct blk_desc* (*reloc_get_dev)(int dev);
-	int (*select_hwpart)(int dev_num, int hwpart);
-	char *name;
+	struct blk_desc *dev_desc;
 	int ret;
 
-	if (!ifname)
+	dev_desc = blk_get_devnum_by_typename(ifname, dev);
+	if (!dev_desc) {
+		debug("%s: No device for iface '%s', dev %d\n", __func__,
+		      ifname, dev);
 		return NULL;
-
-	name = drvr->name;
-#ifdef CONFIG_NEEDS_MANUAL_RELOC
-	name += gd->reloc_off;
-#endif
-	while (drvr->name) {
-		name = drvr->name;
-		reloc_get_dev = drvr->get_dev;
-		select_hwpart = drvr->select_hwpart;
-#ifdef CONFIG_NEEDS_MANUAL_RELOC
-		name += gd->reloc_off;
-		reloc_get_dev += gd->reloc_off;
-		if (select_hwpart)
-			select_hwpart += gd->reloc_off;
-#endif
-		if (strncmp(ifname, name, strlen(name)) == 0) {
-			struct blk_desc *dev_desc = reloc_get_dev(dev);
-			if (!dev_desc)
-				return NULL;
-			if (hwpart == 0 && !select_hwpart)
-				return dev_desc;
-			if (!select_hwpart)
-				return NULL;
-			ret = select_hwpart(dev_desc->devnum, hwpart);
-			if (ret < 0)
-				return NULL;
-			return dev_desc;
-		}
-		drvr++;
 	}
-	return NULL;
+	ret = blk_dselect_hwpart(dev_desc, hwpart);
+	if (ret) {
+		debug("%s: Failed to select h/w partition: err-%d\n", __func__,
+		      ret);
+		return NULL;
+	}
+
+	return dev_desc;
 }
 
 struct blk_desc *blk_get_dev(const char *ifname, int dev)
@@ -401,7 +350,7 @@
 	if (*ep) {
 		printf("** Bad device specification %s %s **\n",
 		       ifname, dev_str);
-		dev = -1;
+		dev = -EINVAL;
 		goto cleanup;
 	}
 
@@ -410,7 +359,7 @@
 		if (*ep) {
 			printf("** Bad HW partition specification %s %s **\n",
 			    ifname, hwpart_str);
-			dev = -1;
+			dev = -EINVAL;
 			goto cleanup;
 		}
 	}
@@ -418,7 +367,7 @@
 	*dev_desc = get_dev_hwpart(ifname, dev, hwpart);
 	if (!(*dev_desc) || ((*dev_desc)->type == DEV_TYPE_UNKNOWN)) {
 		printf("** Bad device %s %s **\n", ifname, dev_hwpart_str);
-		dev = -1;
+		dev = -ENOENT;
 		goto cleanup;
 	}
 
diff --git a/doc/README.x86 b/doc/README.x86
index c5c3010..4d50feb 100644
--- a/doc/README.x86
+++ b/doc/README.x86
@@ -23,7 +23,8 @@
 'bare metal', U-Boot acts like a BIOS replacement. The following platforms
 are supported:
 
-   - Bayley Bay
+   - Bayley Bay CRB
+   - Congatec QEVAL 2.0 & conga-QA3/E3845
    - Cougar Canyon 2 CRB
    - Crown Bay CRB
    - Galileo
@@ -303,12 +304,12 @@
 000000   descriptor.bin      Hard-coded to 0 in ifdtool
 001000   me.bin              Set by the descriptor
 500000   <spare>
+6ef000   Environment         CONFIG_ENV_OFFSET
 6f0000   MRC cache           CONFIG_ENABLE_MRC_CACHE
 700000   u-boot-dtb.bin      CONFIG_SYS_TEXT_BASE
 790000   vga.bin             CONFIG_VGA_BIOS_ADDR
 7c0000   fsp.bin             CONFIG_FSP_ADDR
 7f8000   <spare>             (depends on size of fsp.bin)
-7fe000   Environment         CONFIG_ENV_OFFSET
 7ff800   U-Boot 16-bit boot  CONFIG_SYS_X86_START16
 
 Overall ROM image size is controlled by CONFIG_ROM_SIZE.
@@ -412,18 +413,19 @@
 Multicore is also supported by QEMU via '-smp n' where n is the number of cores
 to instantiate. Note, the maximum supported CPU number in QEMU is 255.
 
-The fw_cfg interface in QEMU also provides information about kernel data, initrd,
-command-line arguments and more. U-Boot supports directly accessing these informtion
-from fw_cfg interface, this saves the time of loading them from hard disk or
-network again, through emulated devices. To use it , simply providing them in
-QEMU command line:
+The fw_cfg interface in QEMU also provides information about kernel data,
+initrd, command-line arguments and more. U-Boot supports directly accessing
+these informtion from fw_cfg interface, which saves the time of loading them
+from hard disk or network again, through emulated devices. To use it , simply
+providing them in QEMU command line:
 
 $ qemu-system-i386 -nographic -bios path/to/u-boot.rom -m 1024 -kernel /path/to/bzImage
     -append 'root=/dev/ram console=ttyS0' -initrd /path/to/initrd -smp 8
 
 Note: -initrd and -smp are both optional
 
-Then start QEMU, in U-Boot command line use the following U-Boot command to setup kernel:
+Then start QEMU, in U-Boot command line use the following U-Boot command to
+setup kernel:
 
  => qfw
 qfw - QEMU firmware interface
@@ -437,8 +439,8 @@
 => qfw load
 loading kernel to address 01000000 size 5d9d30 initrd 04000000 size 1b1ab50
 
-Here the kernel (bzImage) is loaded to 01000000 and initrd is to 04000000. Then, 'zboot'
-can be used to boot the kernel:
+Here the kernel (bzImage) is loaded to 01000000 and initrd is to 04000000. Then,
+'zboot' can be used to boot the kernel:
 
 => zboot 02000000 - 04000000 1b1ab50
 
@@ -490,8 +492,8 @@
 --------------
 As an example of how to set up your boot flow with U-Boot, here are
 instructions for starting Ubuntu from U-Boot. These instructions have been
-tested on Minnowboard MAX with a SATA driver but are equally applicable on
-other platforms and other media. There are really only four steps and its a
+tested on Minnowboard MAX with a SATA drive but are equally applicable on
+other platforms and other media. There are really only four steps and it's a
 very simple script, but a more detailed explanation is provided here for
 completeness.
 
@@ -499,7 +501,7 @@
 It could also use the grub.cfg file (/efi/ubuntu/grub.cfg) to obtain the
 GUID. If you figure these out, please post patches to this README.
 
-Firstly, you will need Ubunutu installed on an available disk. It should be
+Firstly, you will need Ubuntu installed on an available disk. It should be
 possible to make U-Boot start a USB start-up disk but for now let's assume
 that you used another boot loader to install Ubuntu.
 
@@ -659,7 +661,7 @@
    Loading bzImage at address 100000 (5805728 bytes)
    Magic signature found
    Initial RAM disk at linear address 0x04000000, size 19215259 bytes
-   Kernel command line: "console=ttyS0,115200 root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro"
+   Kernel command line: "root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro"
 
    Starting kernel ...
 
@@ -679,13 +681,14 @@
                   240,329  ahci
                 1,422,704  vesa display
 
-Now the kernel actually starts:
+Now the kernel actually starts: (if you want to examine kernel boot up message
+on the serial console, append "console=ttyS0,115200" to the kernel command line)
 
    [    0.000000] Initializing cgroup subsys cpuset
    [    0.000000] Initializing cgroup subsys cpu
    [    0.000000] Initializing cgroup subsys cpuacct
    [    0.000000] Linux version 3.13.0-58-generic (buildd@allspice) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #97-Ubuntu SMP Wed Jul 8 02:56:15 UTC 2015 (Ubuntu 3.13.0-58.97-generic 3.13.11-ckt22)
-   [    0.000000] Command line: console=ttyS0,115200 root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro
+   [    0.000000] Command line: root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro console=ttyS0,115200
 
 It continues for a long time. Along the way you will see it pick up your
 ramdisk:
@@ -736,14 +739,6 @@
 The \ is to tell the shell not to evaluate ${filesize} as part of the setenv
 command.
 
-You will also need to add this to your board configuration file, e.g.
-include/configs/minnowmax.h:
-
-   #define CONFIG_BOOTDELAY	2
-
-Now when you reset your board it wait a few seconds (in case you want to
-interrupt) and then should boot straight into Ubuntu.
-
 You can also bake this behaviour into your build by hard-coding the
 environment variables if you add this to minnowmax.h:
 
@@ -812,6 +807,30 @@
 This is also tested on Intel Crown Bay board with a PCIe graphics card, booting
 SeaBIOS then chain-loading a GRUB on a USB drive, then Linux kernel finally.
 
+If you are using Intel Integrated Graphics Device (IGD) as the primary display
+device on your board, SeaBIOS needs to be patched manually to get its VGA ROM
+loaded and run by SeaBIOS. SeaBIOS locates VGA ROM via the PCI expansion ROM
+register, but IGD device does not have its VGA ROM mapped by this register.
+Its VGA ROM is packaged as part of u-boot.rom at a configurable flash address
+which is unknown to SeaBIOS. An example patch is needed for SeaBIOS below:
+
+diff --git a/src/optionroms.c b/src/optionroms.c
+index 65f7fe0..c7b6f5e 100644
+--- a/src/optionroms.c
++++ b/src/optionroms.c
+@@ -324,6 +324,8 @@ init_pcirom(struct pci_device *pci, int isvga, u64 *sources)
+         rom = deploy_romfile(file);
+     else if (RunPCIroms > 1 || (RunPCIroms == 1 && isvga))
+         rom = map_pcirom(pci);
++    if (pci->bdf == pci_to_bdf(0, 2, 0))
++        rom = (struct rom_header *)0xfff90000;
+     if (! rom)
+         // No ROM present.
+         return;
+
+Note: the patch above expects IGD device is at PCI b.d.f 0.2.0 and its VGA ROM
+is at 0xfff90000 which corresponds to CONFIG_VGA_BIOS_ADDR on Minnowboard MAX.
+Change these two accordingly if this is not the case on your board.
 
 Development Flow
 ----------------
@@ -963,12 +982,62 @@
 to U-Boot. This should go at the top of each file and list the coreboot
 filename where the code originated.
 
+Debugging ACPI issues with Windows:
+
+Windows might cache system information and only detect ACPI changes if you
+modify the ACPI table versions. So tweak them liberally when debugging ACPI
+issues with Windows.
+
+ACPI Support Status
+-------------------
+Advanced Configuration and Power Interface (ACPI) [16] aims to establish
+industry-standard interfaces enabling OS-directed configuration, power
+management, and thermal management of mobile, desktop, and server platforms.
+
+Linux can boot without ACPI with "acpi=off" command line parameter, but
+with ACPI the kernel gains the capabilities to handle power management.
+For Windows, ACPI is a must-have firmware feature since Windows Vista.
+CONFIG_GENERATE_ACPI_TABLE is the config option to turn on ACPI support in
+U-Boot. This requires Intel ACPI compiler to be installed on your host to
+compile ACPI DSDT table written in ASL format to AML format. You can get
+the compiler via "apt-get install iasl" if you are on Ubuntu or download
+the source from [17] to compile one by yourself.
+
+Current ACPI support in U-Boot is not complete. More features will be added
+in the future. The status as of today is:
+
+ * Support generating RSDT, XSDT, FACS, FADT, MADT, MCFG tables.
+ * Support one static DSDT table only, compiled by Intel ACPI compiler.
+ * Support S0/S5, reboot and shutdown from OS.
+ * Support booting a pre-installed Ubuntu distribution via 'zboot' command.
+ * Support installing and booting Ubuntu 14.04 (or above) from U-Boot with
+   the help of SeaBIOS using legacy interface (non-UEFI mode).
+ * Support installing and booting Windows 8.1/10 from U-Boot with the help
+   of SeaBIOS using legacy interface (non-UEFI mode).
+ * Support ACPI interrupts with SCI only.
+
+Features not supported so far (to make it a complete ACPI solution):
+ * S3 (Suspend to RAM), S4 (Suspend to Disk).
+
+Features that are optional:
+ * ACPI global NVS support. We may need it to simplify ASL code logic if
+   utilizing NVS variables. Most likely we will need this sooner or later.
+ * Dynamic AML bytecodes insertion at run-time. We may need this to support
+   SSDT table generation and DSDT fix up.
+ * SMI support. Since U-Boot is a modern bootloader, we don't want to bring
+   those legacy stuff into U-Boot. ACPI spec allows a system that does not
+   support SMI (a legacy-free system).
+
+So far ACPI is enabled on BayTrail based boards. Testing was done by booting
+a pre-installed Ubuntu 14.04 from a SATA drive. Installing Ubuntu 14.04 and
+Windows 8.1/10 to a SATA drive and booting from there is also tested. Most
+devices seem to work correctly and the board can respond a reboot/shutdown
+command from the OS.
 
 TODO List
 ---------
 - Audio
 - Chrome OS verified boot
-- SMI and ACPI support, to provide platform info and facilities to Linux
 
 References
 ----------
@@ -987,3 +1056,5 @@
 [13] http://events.linuxfoundation.org/sites/events/files/slides/elce-2014.pdf
 [14] http://www.seabios.org/SeaBIOS
 [15] doc/device-tree-bindings/misc/intel,irq-router.txt
+[16] http://www.acpi.info
+[17] https://www.acpica.org/downloads
diff --git a/doc/device-tree-bindings/misc/intel,irq-router.txt b/doc/device-tree-bindings/misc/intel,irq-router.txt
index e4d8ead..04ad346 100644
--- a/doc/device-tree-bindings/misc/intel,irq-router.txt
+++ b/doc/device-tree-bindings/misc/intel,irq-router.txt
@@ -14,6 +14,11 @@
       "ibase": IRQ routing is in the memory-mapped IBASE register block
 - intel,ibase-offset : IBASE register offset in the interrupt router's PCI
     configuration space, required only if intel,pirq-config = "ibase".
+- intel,actl-8bit : If ACTL (ACPI control) register width is 8-bit, this must
+    be specified. The 8-bit ACTL register is seen on ICH series chipset, like
+    ICH9/Panther Point/etc. On Atom chipset it is a 32-bit register.
+- intel,actl-addr : ACTL (ACPI control) register offset. ACTL can be either
+    in the interrupt router's PCI configuration space, or IBASE.
 - intel,pirq-link : Specifies the PIRQ link information with two cells. The
     first cell is the register offset that controls the first PIRQ link routing.
     The second cell is the total number of PIRQ links the router supports.
diff --git a/doc/device-tree-bindings/net/ti,dp83867.txt b/doc/device-tree-bindings/net/ti,dp83867.txt
new file mode 100644
index 0000000..cb77fdf
--- /dev/null
+++ b/doc/device-tree-bindings/net/ti,dp83867.txt
@@ -0,0 +1,25 @@
+* Texas Instruments - dp83867 Giga bit ethernet phy
+
+Required properties:
+	- reg - The ID number for the phy, usually a small integer
+	- ti,rx-internal-delay - RGMII Recieve Clock Delay - see dt-bindings/net/ti-dp83867.h
+		for applicable values
+	- ti,tx-internal-delay - RGMII Transmit Clock Delay - see dt-bindings/net/ti-dp83867.h
+		for applicable values
+	- ti,fifo-depth - Transmitt FIFO depth- see dt-bindings/net/ti-dp83867.h
+		for applicable values
+
+Default child nodes are standard Ethernet PHY device
+nodes as described in doc/devicetree/bindings/net/ethernet.txt
+
+Example:
+
+	ethernet-phy@0 {
+		reg = <0>;
+		ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_25_NS>;
+		ti,tx-internal-delay = <DP83867_RGMIIDCTL_2_75_NS>;
+		ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>;
+	};
+
+Datasheet can be found:
+http://www.ti.com/product/DP83867IR/datasheet
diff --git a/doc/device-tree-bindings/serial/qca,ar9330-uart.txt b/doc/device-tree-bindings/serial/qca,ar9330-uart.txt
new file mode 100644
index 0000000..ec576a1
--- /dev/null
+++ b/doc/device-tree-bindings/serial/qca,ar9330-uart.txt
@@ -0,0 +1,24 @@
+* Qualcomm Atheros AR9330 High-Speed UART
+
+Required properties:
+
+- compatible: Must be "qca,ar9330-uart"
+
+- reg: Specifies the physical base address of the controller and
+  the length of the memory mapped region.
+
+Additional requirements:
+
+  Each UART port must have an alias correctly numbered in "aliases"
+  node.
+
+Example:
+
+	aliases {
+		serial0 = &uart0;
+	};
+
+	uart0: uart@18020000 {
+		compatible = "qca,ar9330-uart";
+		reg = <0x18020000 0x14>;
+	};
diff --git a/doc/device-tree-bindings/spi/spi-ath79.txt b/doc/device-tree-bindings/spi/spi-ath79.txt
new file mode 100644
index 0000000..3fd9d67
--- /dev/null
+++ b/doc/device-tree-bindings/spi/spi-ath79.txt
@@ -0,0 +1,19 @@
+Binding for Qualcomm Atheros AR7xxx/AR9xxx SPI controller
+
+Required properties:
+- compatible: has to be "qca,<soc-type>-spi", "qca,ar7100-spi" as fallback.
+- reg: Base address and size of the controllers memory area
+- #address-cells: <1>, as required by generic SPI binding.
+- #size-cells: <0>, also as required by generic SPI binding.
+
+Child nodes as per the generic SPI binding.
+
+Example:
+
+	spi@1f000000 {
+		compatible = "qca,ar9132-spi", "qca,ar7100-spi";
+		reg = <0x1f000000 0x10>;
+
+		#address-cells = <1>;
+		#size-cells = <0>;
+	};
diff --git a/doc/uImage.FIT/multi-with-fpga.its b/doc/uImage.FIT/multi-with-fpga.its
new file mode 100644
index 0000000..0cdb31f
--- /dev/null
+++ b/doc/uImage.FIT/multi-with-fpga.its
@@ -0,0 +1,67 @@
+/*
+ * U-Boot uImage source file with multiple kernels, ramdisks and FDT blobs
+ * This example makes use of the 'loadables' field
+ */
+
+/dts-v1/;
+
+/ {
+	description = "Configuration to load fpga before Kernel";
+	#address-cells = <1>;
+
+	images {
+		fdt@1 {
+			description = "zc706";
+			data = /incbin/("/tftpboot/devicetree.dtb");
+			type = "flat_dt";
+			arch = "arm";
+			compression = "none";
+			load = <0x10000000>;
+			hash@1 {
+				algo = "md5";
+			};
+		};
+
+		fpga@1 {
+			description = "FPGA";
+			data = /incbin/("/tftpboot/download.bit");
+			type = "fpga";
+			arch = "arm";
+			compression = "none";
+			load = <0x30000000>;
+			hash@1 {
+				algo = "md5";
+			};
+		};
+
+		linux_kernel@1 {
+			description = "Linux";
+			data = /incbin/("/tftpboot/zImage");
+			type = "kernel";
+			arch = "arm";
+			os = "linux";
+			compression = "none";
+			load = <0x8000>;
+			entry = <0x8000>;
+			hash@1 {
+				algo = "md5";
+			};
+		};
+	};
+
+	configurations {
+		default = "config@2";
+		config@1 {
+			description = "Linux";
+			kernel = "linux_kernel@1";
+			fdt = "fdt@1";
+		};
+
+		config@2 {
+			description = "Linux with fpga";
+			kernel = "linux_kernel@1";
+			fdt = "fdt@1";
+			fpga = "fpga@1";
+		};
+	};
+};
diff --git a/doc/uImage.FIT/source_file_format.txt b/doc/uImage.FIT/source_file_format.txt
index 9c527c3..3f54180 100644
--- a/doc/uImage.FIT/source_file_format.txt
+++ b/doc/uImage.FIT/source_file_format.txt
@@ -236,6 +236,7 @@
   |- kernel = "kernel sub-node unit name"
   |- ramdisk = "ramdisk sub-node unit name"
   |- fdt = "fdt sub-node unit-name"
+  |- fpga = "fpga sub-node unit-name"
   |- loadables = "loadables sub-node unit-name"
 
 
@@ -251,6 +252,8 @@
     "fdt type").
   - setup : Unit name of the corresponding setup binary (used for booting
     an x86 kernel). This contains the setup.bin file built by the kernel.
+  - fpga : Unit name of the corresponding fpga bitstream blob
+    (component image node of a "fpga type").
   - loadables : Unit name containing a list of additional binaries to be
     loaded at their given locations.  "loadables" is a comma-separated list
     of strings. U-Boot will load each binary at its given start-address.
diff --git a/drivers/Makefile b/drivers/Makefile
index 6900097..99dd07f 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -36,6 +36,8 @@
 obj-$(CONFIG_SPL_USB_HOST_SUPPORT) += usb/host/
 obj-$(CONFIG_OMAP_USB_PHY) += usb/phy/
 obj-$(CONFIG_SPL_SATA_SUPPORT) += block/
+obj-$(CONFIG_SPL_USB_HOST_SUPPORT) += block/
+obj-$(CONFIG_SPL_MMC_SUPPORT) += block/
 
 else
 
diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig
index fcc9ccd..80eea84 100644
--- a/drivers/block/Kconfig
+++ b/drivers/block/Kconfig
@@ -9,10 +9,9 @@
 	  be partitioned into several areas, called 'partitions' in U-Boot.
 	  A filesystem can be placed in each partition.
 
-config DISK
-	bool "Support disk controllers with driver model"
+config AHCI
+	bool "Support SATA controllers with driver model"
 	depends on DM
-	default y if DM
 	help
 	  This enables a uclass for disk controllers in U-Boot. Various driver
 	  types can use this, such as AHCI/SATA. It does not provide any standard
diff --git a/drivers/block/Makefile b/drivers/block/Makefile
index a43492f..436b79f 100644
--- a/drivers/block/Makefile
+++ b/drivers/block/Makefile
@@ -7,7 +7,11 @@
 
 obj-$(CONFIG_BLK) += blk-uclass.o
 
-obj-$(CONFIG_DISK) += disk-uclass.o
+ifndef CONFIG_BLK
+obj-y += blk_legacy.o
+endif
+
+obj-$(CONFIG_AHCI) += ahci-uclass.o
 obj-$(CONFIG_SCSI_AHCI) += ahci.o
 obj-$(CONFIG_DWC_AHSATA) += dwc_ahsata.o
 obj-$(CONFIG_FSL_SATA) += fsl_sata.o
@@ -22,7 +26,7 @@
 obj-$(CONFIG_SATA_SIL3114) += sata_sil3114.o
 obj-$(CONFIG_SATA_SIL) += sata_sil.o
 obj-$(CONFIG_IDE_SIL680) += sil680.o
-obj-$(CONFIG_SANDBOX) += sandbox.o
+obj-$(CONFIG_SANDBOX) += sandbox.o sandbox_scsi.o sata_sandbox.o
 obj-$(CONFIG_SCSI_SYM53C8XX) += sym53c8xx.o
 obj-$(CONFIG_SYSTEMACE) += systemace.o
 obj-$(CONFIG_BLOCK_CACHE) += blkcache.o
diff --git a/drivers/block/disk-uclass.c b/drivers/block/ahci-uclass.c
similarity index 72%
rename from drivers/block/disk-uclass.c
rename to drivers/block/ahci-uclass.c
index d665b35..7b8c326 100644
--- a/drivers/block/disk-uclass.c
+++ b/drivers/block/ahci-uclass.c
@@ -8,7 +8,7 @@
 #include <common.h>
 #include <dm.h>
 
-UCLASS_DRIVER(disk) = {
-	.id		= UCLASS_DISK,
-	.name		= "disk",
+UCLASS_DRIVER(ahci) = {
+	.id		= UCLASS_AHCI,
+	.name		= "ahci",
 };
diff --git a/drivers/block/blk-uclass.c b/drivers/block/blk-uclass.c
index 617db22..6ba1026 100644
--- a/drivers/block/blk-uclass.c
+++ b/drivers/block/blk-uclass.c
@@ -11,6 +11,315 @@
 #include <dm/device-internal.h>
 #include <dm/lists.h>
 
+static const char *if_typename_str[IF_TYPE_COUNT] = {
+	[IF_TYPE_IDE]		= "ide",
+	[IF_TYPE_SCSI]		= "scsi",
+	[IF_TYPE_ATAPI]		= "atapi",
+	[IF_TYPE_USB]		= "usb",
+	[IF_TYPE_DOC]		= "doc",
+	[IF_TYPE_MMC]		= "mmc",
+	[IF_TYPE_SD]		= "sd",
+	[IF_TYPE_SATA]		= "sata",
+	[IF_TYPE_HOST]		= "host",
+	[IF_TYPE_SYSTEMACE]	= "ace",
+};
+
+static enum uclass_id if_type_uclass_id[IF_TYPE_COUNT] = {
+	[IF_TYPE_IDE]		= UCLASS_INVALID,
+	[IF_TYPE_SCSI]		= UCLASS_INVALID,
+	[IF_TYPE_ATAPI]		= UCLASS_INVALID,
+	[IF_TYPE_USB]		= UCLASS_MASS_STORAGE,
+	[IF_TYPE_DOC]		= UCLASS_INVALID,
+	[IF_TYPE_MMC]		= UCLASS_MMC,
+	[IF_TYPE_SD]		= UCLASS_INVALID,
+	[IF_TYPE_SATA]		= UCLASS_AHCI,
+	[IF_TYPE_HOST]		= UCLASS_ROOT,
+	[IF_TYPE_SYSTEMACE]	= UCLASS_INVALID,
+};
+
+static enum if_type if_typename_to_iftype(const char *if_typename)
+{
+	int i;
+
+	for (i = 0; i < IF_TYPE_COUNT; i++) {
+		if (if_typename_str[i] &&
+		    !strcmp(if_typename, if_typename_str[i]))
+			return i;
+	}
+
+	return IF_TYPE_UNKNOWN;
+}
+
+static enum uclass_id if_type_to_uclass_id(enum if_type if_type)
+{
+	return if_type_uclass_id[if_type];
+}
+
+struct blk_desc *blk_get_devnum_by_type(enum if_type if_type, int devnum)
+{
+	struct blk_desc *desc;
+	struct udevice *dev;
+	int ret;
+
+	ret = blk_get_device(if_type, devnum, &dev);
+	if (ret)
+		return NULL;
+	desc = dev_get_uclass_platdata(dev);
+
+	return desc;
+}
+
+/*
+ * This function is complicated with driver model. We look up the interface
+ * name in a local table. This gives us an interface type which we can match
+ * against the uclass of the block device's parent.
+ */
+struct blk_desc *blk_get_devnum_by_typename(const char *if_typename, int devnum)
+{
+	enum uclass_id uclass_id;
+	enum if_type if_type;
+	struct udevice *dev;
+	struct uclass *uc;
+	int ret;
+
+	if_type = if_typename_to_iftype(if_typename);
+	if (if_type == IF_TYPE_UNKNOWN) {
+		debug("%s: Unknown interface type '%s'\n", __func__,
+		      if_typename);
+		return NULL;
+	}
+	uclass_id = if_type_to_uclass_id(if_type);
+	if (uclass_id == UCLASS_INVALID) {
+		debug("%s: Unknown uclass for interface type'\n",
+		      if_typename_str[if_type]);
+		return NULL;
+	}
+
+	ret = uclass_get(UCLASS_BLK, &uc);
+	if (ret)
+		return NULL;
+	uclass_foreach_dev(dev, uc) {
+		struct blk_desc *desc = dev_get_uclass_platdata(dev);
+
+		debug("%s: if_type=%d, devnum=%d: %s, %d, %d\n", __func__,
+		      if_type, devnum, dev->name, desc->if_type, desc->devnum);
+		if (desc->devnum != devnum)
+			continue;
+
+		/* Find out the parent device uclass */
+		if (device_get_uclass_id(dev->parent) != uclass_id) {
+			debug("%s: parent uclass %d, this dev %d\n", __func__,
+			      device_get_uclass_id(dev->parent), uclass_id);
+			continue;
+		}
+
+		if (device_probe(dev))
+			return NULL;
+
+		debug("%s: Device desc %p\n", __func__, desc);
+		return desc;
+	}
+	debug("%s: No device found\n", __func__);
+
+	return NULL;
+}
+
+/**
+ * get_desc() - Get the block device descriptor for the given device number
+ *
+ * @if_type:	Interface type
+ * @devnum:	Device number (0 = first)
+ * @descp:	Returns block device descriptor on success
+ * @return 0 on success, -ENODEV if there is no such device and no device
+ * with a higher device number, -ENOENT if there is no such device but there
+ * is one with a higher number, or other -ve on other error.
+ */
+static int get_desc(enum if_type if_type, int devnum, struct blk_desc **descp)
+{
+	bool found_more = false;
+	struct udevice *dev;
+	struct uclass *uc;
+	int ret;
+
+	*descp = NULL;
+	ret = uclass_get(UCLASS_BLK, &uc);
+	if (ret)
+		return ret;
+	uclass_foreach_dev(dev, uc) {
+		struct blk_desc *desc = dev_get_uclass_platdata(dev);
+
+		debug("%s: if_type=%d, devnum=%d: %s, %d, %d\n", __func__,
+		      if_type, devnum, dev->name, desc->if_type, desc->devnum);
+		if (desc->if_type == if_type) {
+			if (desc->devnum == devnum) {
+				ret = device_probe(dev);
+				if (ret)
+					return ret;
+
+			} else if (desc->devnum > devnum) {
+				found_more = true;
+			}
+		}
+	}
+
+	return found_more ? -ENOENT : -ENODEV;
+}
+
+int blk_select_hwpart_devnum(enum if_type if_type, int devnum, int hwpart)
+{
+	struct udevice *dev;
+	int ret;
+
+	ret = blk_get_device(if_type, devnum, &dev);
+	if (ret)
+		return ret;
+
+	return blk_select_hwpart(dev, hwpart);
+}
+
+int blk_list_part(enum if_type if_type)
+{
+	struct blk_desc *desc;
+	int devnum, ok;
+	int ret;
+
+	for (ok = 0, devnum = 0;; ++devnum) {
+		ret = get_desc(if_type, devnum, &desc);
+		if (ret == -ENODEV)
+			break;
+		else if (ret)
+			continue;
+		if (desc->part_type != PART_TYPE_UNKNOWN) {
+			++ok;
+			if (devnum)
+				putc('\n');
+			part_print(desc);
+		}
+	}
+	if (!ok)
+		return -ENODEV;
+
+	return 0;
+}
+
+int blk_print_part_devnum(enum if_type if_type, int devnum)
+{
+	struct blk_desc *desc;
+	int ret;
+
+	ret = get_desc(if_type, devnum, &desc);
+	if (ret)
+		return ret;
+	if (desc->type == DEV_TYPE_UNKNOWN)
+		return -ENOENT;
+	part_print(desc);
+
+	return 0;
+}
+
+void blk_list_devices(enum if_type if_type)
+{
+	struct blk_desc *desc;
+	int ret;
+	int i;
+
+	for (i = 0;; ++i) {
+		ret = get_desc(if_type, i, &desc);
+		if (ret == -ENODEV)
+			break;
+		else if (ret)
+			continue;
+		if (desc->type == DEV_TYPE_UNKNOWN)
+			continue;  /* list only known devices */
+		printf("Device %d: ", i);
+		dev_print(desc);
+	}
+}
+
+int blk_print_device_num(enum if_type if_type, int devnum)
+{
+	struct blk_desc *desc;
+	int ret;
+
+	ret = get_desc(if_type, devnum, &desc);
+	if (ret)
+		return ret;
+	printf("\nIDE device %d: ", devnum);
+	dev_print(desc);
+
+	return 0;
+}
+
+int blk_show_device(enum if_type if_type, int devnum)
+{
+	struct blk_desc *desc;
+	int ret;
+
+	printf("\nDevice %d: ", devnum);
+	ret = get_desc(if_type, devnum, &desc);
+	if (ret == -ENODEV || ret == -ENOENT) {
+		printf("unknown device\n");
+		return -ENODEV;
+	}
+	if (ret)
+		return ret;
+	dev_print(desc);
+
+	if (desc->type == DEV_TYPE_UNKNOWN)
+		return -ENOENT;
+
+	return 0;
+}
+
+ulong blk_read_devnum(enum if_type if_type, int devnum, lbaint_t start,
+		      lbaint_t blkcnt, void *buffer)
+{
+	struct blk_desc *desc;
+	ulong n;
+	int ret;
+
+	ret = get_desc(if_type, devnum, &desc);
+	if (ret)
+		return ret;
+	n = blk_dread(desc, start, blkcnt, buffer);
+	if (IS_ERR_VALUE(n))
+		return n;
+
+	/* flush cache after read */
+	flush_cache((ulong)buffer, blkcnt * desc->blksz);
+
+	return n;
+}
+
+ulong blk_write_devnum(enum if_type if_type, int devnum, lbaint_t start,
+		       lbaint_t blkcnt, const void *buffer)
+{
+	struct blk_desc *desc;
+	int ret;
+
+	ret = get_desc(if_type, devnum, &desc);
+	if (ret)
+		return ret;
+	return blk_dwrite(desc, start, blkcnt, buffer);
+}
+
+int blk_select_hwpart(struct udevice *dev, int hwpart)
+{
+	const struct blk_ops *ops = blk_get_ops(dev);
+
+	if (!ops)
+		return -ENOSYS;
+	if (!ops->select_hwpart)
+		return 0;
+
+	return ops->select_hwpart(dev, hwpart);
+}
+
+int blk_dselect_hwpart(struct blk_desc *desc, int hwpart)
+{
+	return blk_select_hwpart(desc->bdev, hwpart);
+}
+
 int blk_first_device(int if_type, struct udevice **devp)
 {
 	struct blk_desc *desc;
@@ -131,6 +440,26 @@
 	return 0;
 }
 
+int blk_find_max_devnum(enum if_type if_type)
+{
+	struct udevice *dev;
+	int max_devnum = -ENODEV;
+	struct uclass *uc;
+	int ret;
+
+	ret = uclass_get(UCLASS_BLK, &uc);
+	if (ret)
+		return ret;
+	uclass_foreach_dev(dev, uc) {
+		struct blk_desc *desc = dev_get_uclass_platdata(dev);
+
+		if (desc->if_type == if_type && desc->devnum > max_devnum)
+			max_devnum = desc->devnum;
+	}
+
+	return max_devnum;
+}
+
 int blk_create_device(struct udevice *parent, const char *drv_name,
 		      const char *name, int if_type, int devnum, int blksz,
 		      lbaint_t size, struct udevice **devp)
@@ -139,6 +468,15 @@
 	struct udevice *dev;
 	int ret;
 
+	if (devnum == -1) {
+		ret = blk_find_max_devnum(if_type);
+		if (ret == -ENODEV)
+			devnum = 0;
+		else if (ret < 0)
+			return ret;
+		else
+			devnum = ret + 1;
+	}
 	ret = device_bind_driver(parent, drv_name, name, &dev);
 	if (ret)
 		return ret;
@@ -154,6 +492,29 @@
 	return 0;
 }
 
+int blk_create_devicef(struct udevice *parent, const char *drv_name,
+		       const char *name, int if_type, int devnum, int blksz,
+		       lbaint_t size, struct udevice **devp)
+{
+	char dev_name[30], *str;
+	int ret;
+
+	snprintf(dev_name, sizeof(dev_name), "%s.%s", parent->name, name);
+	str = strdup(dev_name);
+	if (!str)
+		return -ENOMEM;
+
+	ret = blk_create_device(parent, drv_name, str, if_type, devnum,
+				blksz, size, devp);
+	if (ret) {
+		free(str);
+		return ret;
+	}
+	device_set_name_alloced(*devp);
+
+	return ret;
+}
+
 int blk_unbind_all(int if_type)
 {
 	struct uclass *uc;
diff --git a/drivers/block/blk_legacy.c b/drivers/block/blk_legacy.c
new file mode 100644
index 0000000..7b90a8a
--- /dev/null
+++ b/drivers/block/blk_legacy.c
@@ -0,0 +1,261 @@
+/*
+ * Copyright (C) 2016 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <linux/err.h>
+
+struct blk_driver *blk_driver_lookup_type(int if_type)
+{
+	struct blk_driver *drv = ll_entry_start(struct blk_driver, blk_driver);
+	const int n_ents = ll_entry_count(struct blk_driver, blk_driver);
+	struct blk_driver *entry;
+
+	for (entry = drv; entry != drv + n_ents; entry++) {
+		if (if_type == entry->if_type)
+			return entry;
+	}
+
+	/* Not found */
+	return NULL;
+}
+
+static struct blk_driver *blk_driver_lookup_typename(const char *if_typename)
+{
+	struct blk_driver *drv = ll_entry_start(struct blk_driver, blk_driver);
+	const int n_ents = ll_entry_count(struct blk_driver, blk_driver);
+	struct blk_driver *entry;
+
+	for (entry = drv; entry != drv + n_ents; entry++) {
+		if (!strcmp(if_typename, entry->if_typename))
+			return entry;
+	}
+
+	/* Not found */
+	return NULL;
+}
+
+/**
+ * get_desc() - Get the block device descriptor for the given device number
+ *
+ * @drv:	Legacy block driver
+ * @devnum:	Device number (0 = first)
+ * @descp:	Returns block device descriptor on success
+ * @return 0 on success, -ENODEV if there is no such device, -ENOSYS if the
+ * driver does not provide a way to find a device, or other -ve on other
+ * error.
+ */
+static int get_desc(struct blk_driver *drv, int devnum, struct blk_desc **descp)
+{
+	if (drv->desc) {
+		if (devnum < 0 || devnum >= drv->max_devs)
+			return -ENODEV;
+		*descp = &drv->desc[devnum];
+		return 0;
+	}
+	if (!drv->get_dev)
+		return -ENOSYS;
+
+	return drv->get_dev(devnum, descp);
+}
+
+#ifdef HAVE_BLOCK_DEVICE
+int blk_list_part(enum if_type if_type)
+{
+	struct blk_driver *drv;
+	struct blk_desc *desc;
+	int devnum, ok;
+	bool first = true;
+
+	drv = blk_driver_lookup_type(if_type);
+	if (!drv)
+		return -ENOSYS;
+	for (ok = 0, devnum = 0; devnum < drv->max_devs; ++devnum) {
+		if (get_desc(drv, devnum, &desc))
+			continue;
+		if (desc->part_type != PART_TYPE_UNKNOWN) {
+			++ok;
+			if (!first)
+				putc('\n');
+			part_print(desc);
+			first = false;
+		}
+	}
+	if (!ok)
+		return -ENODEV;
+
+	return 0;
+}
+
+int blk_print_part_devnum(enum if_type if_type, int devnum)
+{
+	struct blk_driver *drv = blk_driver_lookup_type(if_type);
+	struct blk_desc *desc;
+	int ret;
+
+	if (!drv)
+		return -ENOSYS;
+	ret = get_desc(drv, devnum, &desc);
+	if (ret)
+		return ret;
+	if (desc->type == DEV_TYPE_UNKNOWN)
+		return -ENOENT;
+	part_print(desc);
+
+	return 0;
+}
+
+void blk_list_devices(enum if_type if_type)
+{
+	struct blk_driver *drv = blk_driver_lookup_type(if_type);
+	struct blk_desc *desc;
+	int i;
+
+	if (!drv)
+		return;
+	for (i = 0; i < drv->max_devs; ++i) {
+		if (get_desc(drv, i, &desc))
+			continue;
+		if (desc->type == DEV_TYPE_UNKNOWN)
+			continue;  /* list only known devices */
+		printf("Device %d: ", i);
+		dev_print(desc);
+	}
+}
+
+int blk_print_device_num(enum if_type if_type, int devnum)
+{
+	struct blk_driver *drv = blk_driver_lookup_type(if_type);
+	struct blk_desc *desc;
+	int ret;
+
+	if (!drv)
+		return -ENOSYS;
+	ret = get_desc(drv, devnum, &desc);
+	if (ret)
+		return ret;
+	printf("\n%s device %d: ", drv->if_typename, devnum);
+	dev_print(desc);
+
+	return 0;
+}
+
+int blk_show_device(enum if_type if_type, int devnum)
+{
+	struct blk_driver *drv = blk_driver_lookup_type(if_type);
+	struct blk_desc *desc;
+	int ret;
+
+	if (!drv)
+		return -ENOSYS;
+	printf("\nDevice %d: ", devnum);
+	if (devnum >= drv->max_devs) {
+		puts("unknown device\n");
+		return -ENODEV;
+	}
+	ret = get_desc(drv, devnum, &desc);
+	if (ret)
+		return ret;
+	dev_print(desc);
+
+	if (desc->type == DEV_TYPE_UNKNOWN)
+		return -ENOENT;
+
+	return 0;
+}
+#endif /* HAVE_BLOCK_DEVICE */
+
+struct blk_desc *blk_get_devnum_by_type(enum if_type if_type, int devnum)
+{
+	struct blk_driver *drv = blk_driver_lookup_type(if_type);
+	struct blk_desc *desc;
+
+	if (!drv)
+		return NULL;
+
+	if (get_desc(drv, devnum, &desc))
+		return NULL;
+
+	return desc;
+}
+
+int blk_dselect_hwpart(struct blk_desc *desc, int hwpart)
+{
+	struct blk_driver *drv = blk_driver_lookup_type(desc->if_type);
+
+	if (!drv)
+		return -ENOSYS;
+	if (drv->select_hwpart)
+		return drv->select_hwpart(desc, hwpart);
+
+	return 0;
+}
+
+struct blk_desc *blk_get_devnum_by_typename(const char *if_typename, int devnum)
+{
+	struct blk_driver *drv = blk_driver_lookup_typename(if_typename);
+	struct blk_desc *desc;
+
+	if (!drv)
+		return NULL;
+
+	if (get_desc(drv, devnum, &desc))
+		return NULL;
+
+	return desc;
+}
+
+ulong blk_read_devnum(enum if_type if_type, int devnum, lbaint_t start,
+		      lbaint_t blkcnt, void *buffer)
+{
+	struct blk_driver *drv = blk_driver_lookup_type(if_type);
+	struct blk_desc *desc;
+	ulong n;
+	int ret;
+
+	if (!drv)
+		return -ENOSYS;
+	ret = get_desc(drv, devnum, &desc);
+	if (ret)
+		return ret;
+	n = desc->block_read(desc, start, blkcnt, buffer);
+	if (IS_ERR_VALUE(n))
+		return n;
+
+	/* flush cache after read */
+	flush_cache((ulong)buffer, blkcnt * desc->blksz);
+
+	return n;
+}
+
+ulong blk_write_devnum(enum if_type if_type, int devnum, lbaint_t start,
+		       lbaint_t blkcnt, const void *buffer)
+{
+	struct blk_driver *drv = blk_driver_lookup_type(if_type);
+	struct blk_desc *desc;
+	int ret;
+
+	if (!drv)
+		return -ENOSYS;
+	ret = get_desc(drv, devnum, &desc);
+	if (ret)
+		return ret;
+	return desc->block_write(desc, start, blkcnt, buffer);
+}
+
+int blk_select_hwpart_devnum(enum if_type if_type, int devnum, int hwpart)
+{
+	struct blk_driver *drv = blk_driver_lookup_type(if_type);
+	struct blk_desc *desc;
+	int ret;
+
+	if (!drv)
+		return -ENOSYS;
+	ret = get_desc(drv, devnum, &desc);
+	if (ret)
+		return ret;
+	return drv->select_hwpart(desc, hwpart);
+}
diff --git a/drivers/block/sandbox.c b/drivers/block/sandbox.c
index 2d340ef..ac28f83 100644
--- a/drivers/block/sandbox.c
+++ b/drivers/block/sandbox.c
@@ -17,6 +17,19 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#ifndef CONFIG_BLK
+static struct host_block_dev host_devices[CONFIG_HOST_MAX_DEVICES];
+
+static struct host_block_dev *find_host_device(int dev)
+{
+	if (dev >= 0 && dev < CONFIG_HOST_MAX_DEVICES)
+		return &host_devices[dev];
+
+	return NULL;
+}
+#endif
+
+#ifdef CONFIG_BLK
 static unsigned long host_block_read(struct udevice *dev,
 				     unsigned long start, lbaint_t blkcnt,
 				     void *buffer)
@@ -24,6 +37,18 @@
 	struct host_block_dev *host_dev = dev_get_priv(dev);
 	struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
 
+#else
+static unsigned long host_block_read(struct blk_desc *block_dev,
+				     unsigned long start, lbaint_t blkcnt,
+				     void *buffer)
+{
+	int dev = block_dev->devnum;
+	struct host_block_dev *host_dev = find_host_device(dev);
+
+	if (!host_dev)
+		return -1;
+#endif
+
 	if (os_lseek(host_dev->fd, start * block_dev->blksz, OS_SEEK_SET) ==
 			-1) {
 		printf("ERROR: Invalid block %lx\n", start);
@@ -35,12 +60,21 @@
 	return -1;
 }
 
+#ifdef CONFIG_BLK
 static unsigned long host_block_write(struct udevice *dev,
 				      unsigned long start, lbaint_t blkcnt,
 				      const void *buffer)
 {
 	struct host_block_dev *host_dev = dev_get_priv(dev);
 	struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
+#else
+static unsigned long host_block_write(struct blk_desc *block_dev,
+				      unsigned long start, lbaint_t blkcnt,
+				      const void *buffer)
+{
+	int dev = block_dev->devnum;
+	struct host_block_dev *host_dev = find_host_device(dev);
+#endif
 
 	if (os_lseek(host_dev->fd, start * block_dev->blksz, OS_SEEK_SET) ==
 			-1) {
@@ -53,6 +87,7 @@
 	return -1;
 }
 
+#ifdef CONFIG_BLK
 int host_dev_bind(int devnum, char *filename)
 {
 	struct host_block_dev *host_dev;
@@ -115,9 +150,51 @@
 	free(str);
 	return ret;
 }
+#else
+int host_dev_bind(int dev, char *filename)
+{
+	struct host_block_dev *host_dev = find_host_device(dev);
+
+	if (!host_dev)
+		return -1;
+	if (host_dev->blk_dev.priv) {
+		os_close(host_dev->fd);
+		host_dev->blk_dev.priv = NULL;
+	}
+	if (host_dev->filename)
+		free(host_dev->filename);
+	if (filename && *filename) {
+		host_dev->filename = strdup(filename);
+	} else {
+		host_dev->filename = NULL;
+		return 0;
+	}
+
+	host_dev->fd = os_open(host_dev->filename, OS_O_RDWR);
+	if (host_dev->fd == -1) {
+		printf("Failed to access host backing file '%s'\n",
+		       host_dev->filename);
+		return 1;
+	}
+
+	struct blk_desc *blk_dev = &host_dev->blk_dev;
+	blk_dev->if_type = IF_TYPE_HOST;
+	blk_dev->priv = host_dev;
+	blk_dev->blksz = 512;
+	blk_dev->lba = os_lseek(host_dev->fd, 0, OS_SEEK_END) / blk_dev->blksz;
+	blk_dev->block_read = host_block_read;
+	blk_dev->block_write = host_block_write;
+	blk_dev->devnum = dev;
+	blk_dev->part_type = PART_TYPE_UNKNOWN;
+	part_init(blk_dev);
+
+	return 0;
+}
+#endif
 
 int host_get_dev_err(int devnum, struct blk_desc **blk_devp)
 {
+#ifdef CONFIG_BLK
 	struct udevice *dev;
 	int ret;
 
@@ -125,20 +202,22 @@
 	if (ret)
 		return ret;
 	*blk_devp = dev_get_uclass_platdata(dev);
+#else
+	struct host_block_dev *host_dev = find_host_device(devnum);
+
+	if (!host_dev)
+		return -ENODEV;
+
+	if (!host_dev->blk_dev.priv)
+		return -ENOENT;
+
+	*blk_devp = &host_dev->blk_dev;
+#endif
 
 	return 0;
 }
 
-struct blk_desc *host_get_dev(int dev)
-{
-	struct blk_desc *blk_dev;
-
-	if (host_get_dev_err(dev, &blk_dev))
-		return NULL;
-
-	return blk_dev;
-}
-
+#ifdef CONFIG_BLK
 static const struct blk_ops sandbox_host_blk_ops = {
 	.read	= host_block_read,
 	.write	= host_block_write,
@@ -150,3 +229,11 @@
 	.ops		= &sandbox_host_blk_ops,
 	.priv_auto_alloc_size	= sizeof(struct host_block_dev),
 };
+#else
+U_BOOT_LEGACY_BLK(sandbox_host) = {
+	.if_typename	= "host",
+	.if_type	= IF_TYPE_HOST,
+	.max_devs	= CONFIG_HOST_MAX_DEVICES,
+	.get_dev	= host_get_dev_err,
+};
+#endif
diff --git a/drivers/block/sandbox_scsi.c b/drivers/block/sandbox_scsi.c
new file mode 100644
index 0000000..ad961bd
--- /dev/null
+++ b/drivers/block/sandbox_scsi.c
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2015 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ *
+ * This file contains dummy implementations of SCSI functions requried so
+ * that CONFIG_SCSI can be enabled for sandbox.
+ */
+
+#include <common.h>
+#include <scsi.h>
+
+void scsi_bus_reset(void)
+{
+}
+
+void scsi_init(void)
+{
+}
+
+int scsi_exec(ccb *pccb)
+{
+	return 0;
+}
+
+void scsi_print_error(ccb *pccb)
+{
+}
diff --git a/drivers/block/sata_sandbox.c b/drivers/block/sata_sandbox.c
new file mode 100644
index 0000000..bd967d2
--- /dev/null
+++ b/drivers/block/sata_sandbox.c
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2015 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+
+int init_sata(int dev)
+{
+	return 0;
+}
+
+int reset_sata(int dev)
+{
+	return 0;
+}
+
+int scan_sata(int dev)
+{
+	return 0;
+}
+
+ulong sata_read(int dev, ulong blknr, lbaint_t blkcnt, void *buffer)
+{
+	return 0;
+}
+
+ulong sata_write(int dev, ulong blknr, lbaint_t blkcnt, const void *buffer)
+{
+	return 0;
+}
diff --git a/drivers/block/sym53c8xx.c b/drivers/block/sym53c8xx.c
index c7c40af..5daede7 100644
--- a/drivers/block/sym53c8xx.c
+++ b/drivers/block/sym53c8xx.c
@@ -33,7 +33,7 @@
 #define PRINTF(fmt,args...)
 #endif
 
-#if defined(CONFIG_CMD_SCSI) && defined(CONFIG_SCSI_SYM53C8XX)
+#if defined(CONFIG_SCSI) && defined(CONFIG_SCSI_SYM53C8XX)
 
 #undef SCSI_SINGLE_STEP
 /*
diff --git a/drivers/block/systemace.c b/drivers/block/systemace.c
index 09fe834..9392bea 100644
--- a/drivers/block/systemace.c
+++ b/drivers/block/systemace.c
@@ -27,7 +27,7 @@
 
 #include <common.h>
 #include <command.h>
-#include <systemace.h>
+#include <dm.h>
 #include <part.h>
 #include <asm/io.h>
 
@@ -69,11 +69,9 @@
 	return in16(base + off);
 }
 
-static unsigned long systemace_read(struct blk_desc *block_dev,
-				    unsigned long start, lbaint_t blkcnt,
-				    void *buffer);
-
+#ifndef CONFIG_BLK
 static struct blk_desc systemace_dev = { 0 };
+#endif
 
 static int get_cf_lock(void)
 {
@@ -104,42 +102,19 @@
 	ace_writew((val & 0xffff), 0x18);
 }
 
-#ifdef CONFIG_PARTITIONS
-struct blk_desc *systemace_get_dev(int dev)
-{
-	/* The first time through this, the systemace_dev object is
-	   not yet initialized. In that case, fill it in. */
-	if (systemace_dev.blksz == 0) {
-		systemace_dev.if_type = IF_TYPE_UNKNOWN;
-		systemace_dev.devnum = 0;
-		systemace_dev.part_type = PART_TYPE_UNKNOWN;
-		systemace_dev.type = DEV_TYPE_HARDDISK;
-		systemace_dev.blksz = 512;
-		systemace_dev.log2blksz = LOG2(systemace_dev.blksz);
-		systemace_dev.removable = 1;
-		systemace_dev.block_read = systemace_read;
-
-		/*
-		 * Ensure the correct bus mode (8/16 bits) gets enabled
-		 */
-		ace_writew(width == 8 ? 0 : 0x0001, 0);
-
-		part_init(&systemace_dev);
-
-	}
-
-	return &systemace_dev;
-}
-#endif
-
 /*
  * This function is called (by dereferencing the block_read pointer in
  * the dev_desc) to read blocks of data. The return value is the
  * number of blocks read. A zero return indicates an error.
  */
+#ifdef CONFIG_BLK
+static unsigned long systemace_read(struct udevice *dev, unsigned long start,
+				    lbaint_t blkcnt, void *buffer)
+#else
 static unsigned long systemace_read(struct blk_desc *block_dev,
 				    unsigned long start, lbaint_t blkcnt,
 				    void *buffer)
+#endif
 {
 	int retry;
 	unsigned blk_countdown;
@@ -257,3 +232,72 @@
 
 	return blkcnt;
 }
+
+#ifdef CONFIG_BLK
+static int systemace_bind(struct udevice *dev)
+{
+	struct blk_desc *bdesc;
+	struct udevice *bdev;
+	int ret;
+
+	ret = blk_create_devicef(dev, "systemace_blk", "blk", IF_TYPE_SYSTEMACE,
+				 -1, 512, 0, &bdev);
+	if (ret) {
+		debug("Cannot create block device\n");
+		return ret;
+	}
+	bdesc = dev_get_uclass_platdata(bdev);
+	bdesc->removable = 1;
+	bdesc->part_type = PART_TYPE_UNKNOWN;
+	bdesc->log2blksz = LOG2(bdesc->blksz);
+
+	/* Ensure the correct bus mode (8/16 bits) gets enabled */
+	ace_writew(width == 8 ? 0 : 0x0001, 0);
+
+	return 0;
+}
+
+static const struct blk_ops systemace_blk_ops = {
+	.read	= systemace_read,
+};
+
+U_BOOT_DRIVER(systemace_blk) = {
+	.name		= "systemace_blk",
+	.id		= UCLASS_BLK,
+	.ops		= &systemace_blk_ops,
+	.bind		= systemace_bind,
+};
+#else
+static int systemace_get_dev(int dev, struct blk_desc **descp)
+{
+	/* The first time through this, the systemace_dev object is
+	   not yet initialized. In that case, fill it in. */
+	if (systemace_dev.blksz == 0) {
+		systemace_dev.if_type = IF_TYPE_UNKNOWN;
+		systemace_dev.devnum = 0;
+		systemace_dev.part_type = PART_TYPE_UNKNOWN;
+		systemace_dev.type = DEV_TYPE_HARDDISK;
+		systemace_dev.blksz = 512;
+		systemace_dev.log2blksz = LOG2(systemace_dev.blksz);
+		systemace_dev.removable = 1;
+		systemace_dev.block_read = systemace_read;
+
+		/*
+		 * Ensure the correct bus mode (8/16 bits) gets enabled
+		 */
+		ace_writew(width == 8 ? 0 : 0x0001, 0);
+
+		part_init(&systemace_dev);
+	}
+	*descp = &systemace_dev;
+
+	return 0;
+}
+
+U_BOOT_LEGACY_BLK(systemace) = {
+	.if_typename	= "ace",
+	.if_type	= IF_TYPE_SYSTEMACE,
+	.max_devs	= 1,
+	.get_dev	= systemace_get_dev,
+};
+#endif
diff --git a/drivers/core/device-remove.c b/drivers/core/device-remove.c
index e1714b2..0e56b23 100644
--- a/drivers/core/device-remove.c
+++ b/drivers/core/device-remove.c
@@ -112,6 +112,8 @@
 
 	devres_release_all(dev);
 
+	if (dev->flags & DM_NAME_ALLOCED)
+		free((char *)dev->name);
 	free(dev);
 
 	return 0;
diff --git a/drivers/core/device.c b/drivers/core/device.c
index 1322991..45d5e3e 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -657,8 +657,8 @@
 #if CONFIG_IS_ENABLED(OF_CONTROL)
 	int index;
 
-	index = fdt_find_string(gd->fdt_blob, dev->parent->of_offset,
-				"reg-names", name);
+	index = fdt_find_string(gd->fdt_blob, dev->of_offset, "reg-names",
+				name);
 	if (index < 0)
 		return index;
 
@@ -706,12 +706,32 @@
 	return list_is_last(&dev->sibling_node, &parent->child_head);
 }
 
+void device_set_name_alloced(struct udevice *dev)
+{
+	dev->flags |= DM_NAME_ALLOCED;
+}
+
 int device_set_name(struct udevice *dev, const char *name)
 {
 	name = strdup(name);
 	if (!name)
 		return -ENOMEM;
 	dev->name = name;
+	device_set_name_alloced(dev);
 
 	return 0;
 }
+
+bool of_device_is_compatible(struct udevice *dev, const char *compat)
+{
+	const void *fdt = gd->fdt_blob;
+
+	return !fdt_node_check_compatible(fdt, dev->of_offset, compat);
+}
+
+bool of_machine_is_compatible(const char *compat)
+{
+	const void *fdt = gd->fdt_blob;
+
+	return !fdt_node_check_compatible(fdt, 0, compat);
+}
diff --git a/drivers/core/lists.c b/drivers/core/lists.c
index c4fc216..a72db13 100644
--- a/drivers/core/lists.c
+++ b/drivers/core/lists.c
@@ -171,6 +171,10 @@
 
 		dm_dbg("   - found match at '%s'\n", entry->name);
 		ret = device_bind(parent, entry, name, NULL, offset, &dev);
+		if (ret == -ENODEV) {
+			dm_dbg("Driver '%s' refuses to bind\n", entry->name);
+			continue;
+		}
 		if (ret) {
 			dm_warn("Error binding driver '%s': %d\n", entry->name,
 				ret);
diff --git a/drivers/ddr/marvell/a38x/ddr3_init.c b/drivers/ddr/marvell/a38x/ddr3_init.c
index ee05f57..55baad4 100644
--- a/drivers/ddr/marvell/a38x/ddr3_init.c
+++ b/drivers/ddr/marvell/a38x/ddr3_init.c
@@ -678,7 +678,7 @@
 	return (device_width == 0) ? 8 : 16;
 }
 
-float ddr3_get_device_size(u32 cs)
+static int ddr3_get_device_size(u32 cs)
 {
 	u32 device_size_low, device_size_high, device_size;
 	u32 data, cs_low_offset, cs_high_offset;
@@ -695,15 +695,15 @@
 
 	switch (device_size) {
 	case 0:
-		return 2;
+		return 2048;
 	case 2:
-		return 0.5;
+		return 512;
 	case 3:
-		return 1;
+		return 1024;
 	case 4:
-		return 4;
+		return 4096;
 	case 5:
-		return 8;
+		return 8192;
 	case 1:
 	default:
 		DEBUG_INIT_C("Error: Wrong device size of Cs: ", cs, 1);
@@ -711,13 +711,13 @@
 		 * Small value will give wrong emem size in
 		 * ddr3_calc_mem_cs_size
 		 */
-		return 0.01;
+		return 0;
 	}
 }
 
 int ddr3_calc_mem_cs_size(u32 cs, u32 *cs_size)
 {
-	float cs_mem_size;
+	int cs_mem_size;
 
 	/* Calculate in GiB */
 	cs_mem_size = ((ddr3_get_bus_width() / ddr3_get_device_width(cs)) *
@@ -731,21 +731,12 @@
 	 */
 	cs_mem_size *= DDR_CONTROLLER_BUS_WIDTH_MULTIPLIER;
 
-	if (cs_mem_size == 0.125) {
-		*cs_size = 128 << 20;
-	} else if (cs_mem_size == 0.25) {
-		*cs_size = 256 << 20;
-	} else if (cs_mem_size == 0.5) {
-		*cs_size = 512 << 20;
-	} else if (cs_mem_size == 1) {
-		*cs_size = 1 << 30;
-	} else if (cs_mem_size == 2) {
-		*cs_size = 2 << 30;
-	} else {
+	if (!cs_mem_size || (cs_mem_size == 64) || (cs_mem_size == 4096)) {
 		DEBUG_INIT_C("Error: Wrong Memory size of Cs: ", cs, 1);
 		return MV_BAD_VALUE;
 	}
 
+	*cs_size = cs_mem_size << 20;
 	return MV_OK;
 }
 
diff --git a/drivers/dfu/dfu_mmc.c b/drivers/dfu/dfu_mmc.c
index faece88..78724e4 100644
--- a/drivers/dfu/dfu_mmc.c
+++ b/drivers/dfu/dfu_mmc.c
@@ -50,8 +50,9 @@
 
 	if (dfu->data.mmc.hw_partition >= 0) {
 		part_num_bkp = mmc->block_dev.hwpart;
-		ret = mmc_select_hwpart(dfu->data.mmc.dev_num,
-					dfu->data.mmc.hw_partition);
+		ret = blk_select_hwpart_devnum(IF_TYPE_MMC,
+					       dfu->data.mmc.dev_num,
+					       dfu->data.mmc.hw_partition);
 		if (ret)
 			return ret;
 	}
@@ -75,12 +76,16 @@
 	if (n != blk_count) {
 		error("MMC operation failed");
 		if (dfu->data.mmc.hw_partition >= 0)
-			mmc_select_hwpart(dfu->data.mmc.dev_num, part_num_bkp);
+			blk_select_hwpart_devnum(IF_TYPE_MMC,
+						 dfu->data.mmc.dev_num,
+						 part_num_bkp);
 		return -EIO;
 	}
 
 	if (dfu->data.mmc.hw_partition >= 0) {
-		ret = mmc_select_hwpart(dfu->data.mmc.dev_num, part_num_bkp);
+		ret = blk_select_hwpart_devnum(IF_TYPE_MMC,
+					       dfu->data.mmc.dev_num,
+					       part_num_bkp);
 		if (ret)
 			return ret;
 	}
diff --git a/drivers/fpga/fpga.c b/drivers/fpga/fpga.c
index d94eb5c..7e2f3e1 100644
--- a/drivers/fpga/fpga.c
+++ b/drivers/fpga/fpga.c
@@ -120,7 +120,7 @@
 }
 
 /*
- * fgpa_init is usually called from misc_init_r() and MUST be called
+ * fpga_init is usually called from misc_init_r() and MUST be called
  * before any of the other fpga functions are used.
  */
 void fpga_init(void)
diff --git a/drivers/gpio/74x164_gpio.c b/drivers/gpio/74x164_gpio.c
new file mode 100644
index 0000000..9ac10a7
--- /dev/null
+++ b/drivers/gpio/74x164_gpio.c
@@ -0,0 +1,193 @@
+/*
+ * Take drivers/gpio/gpio-74x164.c as reference.
+ *
+ * 74Hx164 - Generic serial-in/parallel-out 8-bits shift register GPIO driver
+ *
+ * Copyright (C) 2016 Peng Fan <van.freenix@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ *
+ */
+
+#include <common.h>
+#include <errno.h>
+#include <dm.h>
+#include <fdtdec.h>
+#include <malloc.h>
+#include <asm/gpio.h>
+#include <asm/io.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <spi.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * struct gen_74x164_chip - Data for 74Hx164
+ *
+ * @oe: OE pin
+ * @nregs: number of registers
+ * @buffer: buffer for chained chips
+ */
+#define GEN_74X164_NUMBER_GPIOS 8
+
+struct gen_74x164_priv {
+	struct gpio_desc oe;
+	u32 nregs;
+	/*
+	 * Since the nregs are chained, every byte sent will make
+	 * the previous byte shift to the next register in the
+	 * chain. Thus, the first byte sent will end up in the last
+	 * register at the end of the transfer. So, to have a logical
+	 * numbering, store the bytes in reverse order.
+	 */
+	u8 *buffer;
+};
+
+static int gen_74x164_write_conf(struct udevice *dev)
+{
+	struct gen_74x164_priv *priv = dev_get_priv(dev);
+	int ret;
+
+	ret = dm_spi_claim_bus(dev);
+	if (ret)
+		return ret;
+
+	ret = dm_spi_xfer(dev, priv->nregs * 8, priv->buffer, NULL,
+			  SPI_XFER_BEGIN | SPI_XFER_END);
+
+	dm_spi_release_bus(dev);
+
+	return ret;
+}
+
+static int gen_74x164_get_value(struct udevice *dev, unsigned offset)
+{
+	struct gen_74x164_priv *priv = dev_get_priv(dev);
+	uint bank = priv->nregs - 1 - offset / 8;
+	uint pin = offset % 8;
+
+	return (priv->buffer[bank] >> pin) & 0x1;
+}
+
+static int gen_74x164_set_value(struct udevice *dev, unsigned offset,
+				int value)
+{
+	struct gen_74x164_priv *priv = dev_get_priv(dev);
+	uint bank = priv->nregs - 1 - offset / 8;
+	uint pin = offset % 8;
+	int ret;
+
+	if (value)
+		priv->buffer[bank] |= 1 << pin;
+	else
+		priv->buffer[bank] &= ~(1 << pin);
+
+	ret = gen_74x164_write_conf(dev);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+
+static int gen_74x164_direction_input(struct udevice *dev, unsigned offset)
+{
+	return -ENOSYS;
+}
+
+static int gen_74x164_direction_output(struct udevice *dev, unsigned offset,
+				      int value)
+{
+	return gen_74x164_set_value(dev, offset, value);
+}
+
+static int gen_74x164_get_function(struct udevice *dev, unsigned offset)
+{
+	return GPIOF_OUTPUT;
+}
+
+static int gen_74x164_xlate(struct udevice *dev, struct gpio_desc *desc,
+			    struct fdtdec_phandle_args *args)
+{
+	desc->offset = args->args[0];
+	desc->flags = args->args[1] & GPIO_ACTIVE_LOW ? GPIOD_ACTIVE_LOW : 0;
+
+	return 0;
+}
+
+static const struct dm_gpio_ops gen_74x164_ops = {
+	.direction_input	= gen_74x164_direction_input,
+	.direction_output	= gen_74x164_direction_output,
+	.get_value		= gen_74x164_get_value,
+	.set_value		= gen_74x164_set_value,
+	.get_function		= gen_74x164_get_function,
+	.xlate			= gen_74x164_xlate,
+};
+
+static int gen_74x164_probe(struct udevice *dev)
+{
+	struct gen_74x164_priv *priv = dev_get_priv(dev);
+	struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
+	char *str, name[32];
+	int ret;
+	const void *fdt = gd->fdt_blob;
+	int node = dev->of_offset;
+
+	snprintf(name, sizeof(name), "%s_", dev->name);
+	str = strdup(name);
+	if (!str)
+		return -ENOMEM;
+
+	/*
+	 * See Linux kernel:
+	 * Documentation/devicetree/bindings/gpio/gpio-74x164.txt
+	 */
+	priv->nregs = fdtdec_get_int(fdt, node, "registers-number", 1);
+	priv->buffer = calloc(priv->nregs, sizeof(u8));
+	if (!priv->buffer) {
+		ret = -ENOMEM;
+		goto free_str;
+	}
+
+	ret = fdtdec_get_byte_array(fdt, node, "registers-default",
+				    priv->buffer, priv->nregs);
+	if (ret)
+		dev_dbg(dev, "No registers-default property\n");
+
+	ret = gpio_request_by_name(dev, "oe-gpios", 0, &priv->oe,
+				   GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
+	if (ret) {
+		dev_err(dev, "No oe-pins property\n");
+		goto free_buf;
+	}
+
+	uc_priv->bank_name = str;
+	uc_priv->gpio_count = priv->nregs * 8;
+
+	ret = gen_74x164_write_conf(dev);
+	if (ret)
+		goto free_buf;
+
+	dev_dbg(dev, "%s is ready\n", dev->name);
+
+	return 0;
+
+free_buf:
+	free(priv->buffer);
+free_str:
+	free(str);
+	return ret;
+}
+
+static const struct udevice_id gen_74x164_ids[] = {
+	{ .compatible = "fairchild,74hc595" },
+	{ }
+};
+
+U_BOOT_DRIVER(74x164) = {
+	.name		= "74x164",
+	.id		= UCLASS_GPIO,
+	.ops		= &gen_74x164_ops,
+	.probe		= gen_74x164_probe,
+	.priv_auto_alloc_size = sizeof(struct gen_74x164_priv),
+	.of_match	= gen_74x164_ids,
+};
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 2b4624d..93a7e8c 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -143,4 +143,34 @@
 	help
 	  Supports GPIO access on Zynq SoC.
 
+config DM_74X164
+	bool "74x164 serial-in/parallel-out 8-bits shift register"
+	depends on DM_GPIO
+	help
+	  Driver for 74x164 compatible serial-in/parallel-out 8-outputs
+	  shift registers, such as 74lv165, 74hc595.
+	  This driver can be used to provide access to more gpio outputs.
+
+config DM_PCA953X
+	bool "PCA95[357]x, PCA9698, TCA64xx, and MAX7310 I/O ports"
+	depends on DM_GPIO
+	help
+	  Say yes here to provide access to several register-oriented
+	  SMBus I/O expanders, made mostly by NXP or TI.  Compatible
+	  models include:
+
+	  4 bits:	pca9536, pca9537
+
+	  8 bits:	max7310, max7315, pca6107, pca9534, pca9538, pca9554,
+			pca9556, pca9557, pca9574, tca6408, xra1202
+
+	  16 bits:	max7312, max7313, pca9535, pca9539, pca9555, pca9575,
+			tca6416
+
+	  24 bits:	tca6424
+
+	  40 bits:	pca9505, pca9698
+
+	  Now, max 24 bits chips and PCA953X compatible chips are
+	  supported
 endmenu
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 4f071c4..ddec1ef 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -11,6 +11,9 @@
 endif
 obj-$(CONFIG_DM_GPIO)		+= gpio-uclass.o
 
+obj-$(CONFIG_DM_PCA953X)	+= pca953x_gpio.o
+obj-$(CONFIG_DM_74X164)		+= 74x164_gpio.o
+
 obj-$(CONFIG_AT91_GPIO)	+= at91_gpio.o
 obj-$(CONFIG_ATMEL_PIO4)	+= atmel_pio4.o
 obj-$(CONFIG_INTEL_ICH6_GPIO)	+= intel_ich6_gpio.o
diff --git a/drivers/gpio/gpio-uclass.c b/drivers/gpio/gpio-uclass.c
index b58d4e6..732b6c2 100644
--- a/drivers/gpio/gpio-uclass.c
+++ b/drivers/gpio/gpio-uclass.c
@@ -6,6 +6,7 @@
 
 #include <common.h>
 #include <dm.h>
+#include <dt-bindings/gpio/gpio.h>
 #include <errno.h>
 #include <fdtdec.h>
 #include <malloc.h>
@@ -113,19 +114,33 @@
 	return 0;
 }
 
+int gpio_xlate_offs_flags(struct udevice *dev,
+					 struct gpio_desc *desc,
+					 struct fdtdec_phandle_args *args)
+{
+	if (args->args_count < 1)
+		return -EINVAL;
+
+	desc->offset = args->args[0];
+
+	if (args->args_count < 2)
+		return 0;
+
+	if (args->args[1] & GPIO_ACTIVE_LOW)
+		desc->flags = GPIOD_ACTIVE_LOW;
+
+	return 0;
+}
+
 static int gpio_find_and_xlate(struct gpio_desc *desc,
 			       struct fdtdec_phandle_args *args)
 {
 	struct dm_gpio_ops *ops = gpio_get_ops(desc->dev);
 
-	/* Use the first argument as the offset by default */
-	if (args->args_count > 0)
-		desc->offset = args->args[0];
+	if (ops->xlate)
+		return ops->xlate(desc->dev, desc, args);
 	else
-		desc->offset = -1;
-	desc->flags = 0;
-
-	return ops->xlate ? ops->xlate(desc->dev, desc, args) : 0;
+		return gpio_xlate_offs_flags(desc->dev, desc, args);
 }
 
 int dm_gpio_request(struct gpio_desc *desc, const char *label)
@@ -605,6 +620,7 @@
 
 	desc->dev = NULL;
 	desc->offset = 0;
+	desc->flags = 0;
 	ret = fdtdec_parse_phandle_with_args(blob, node, list_name,
 					     "#gpio-cells", 0, index, &args);
 	if (ret) {
diff --git a/drivers/gpio/intel_broadwell_gpio.c b/drivers/gpio/intel_broadwell_gpio.c
index 8cf76f9..81ce446 100644
--- a/drivers/gpio/intel_broadwell_gpio.c
+++ b/drivers/gpio/intel_broadwell_gpio.c
@@ -162,15 +162,6 @@
 	return 0;
 }
 
-static int broadwell_gpio_xlate(struct udevice *dev, struct gpio_desc *desc,
-				struct fdtdec_phandle_args *args)
-{
-	desc->offset = args->args[0];
-	desc->flags = args->args[1] & GPIO_ACTIVE_LOW ? GPIOD_ACTIVE_LOW : 0;
-
-	return 0;
-}
-
 static const struct dm_gpio_ops gpio_broadwell_ops = {
 	.request		= broadwell_gpio_request,
 	.direction_input	= broadwell_gpio_direction_input,
@@ -178,7 +169,6 @@
 	.get_value		= broadwell_gpio_get_value,
 	.set_value		= broadwell_gpio_set_value,
 	.get_function		= broadwell_gpio_get_function,
-	.xlate			= broadwell_gpio_xlate,
 };
 
 static const struct udevice_id intel_broadwell_gpio_ids[] = {
diff --git a/drivers/gpio/omap_gpio.c b/drivers/gpio/omap_gpio.c
index 93d18e4..cd960dc 100644
--- a/drivers/gpio/omap_gpio.c
+++ b/drivers/gpio/omap_gpio.c
@@ -25,7 +25,6 @@
 #include <asm/io.h>
 #include <asm/errno.h>
 #include <malloc.h>
-#include <dt-bindings/gpio/gpio.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -277,22 +276,12 @@
 		return GPIOF_INPUT;
 }
 
-static int omap_gpio_xlate(struct udevice *dev, struct gpio_desc *desc,
-			   struct fdtdec_phandle_args *args)
-{
-	desc->offset = args->args[0];
-	desc->flags = args->args[1] & GPIO_ACTIVE_LOW ? GPIOD_ACTIVE_LOW : 0;
-
-	return 0;
-}
-
 static const struct dm_gpio_ops gpio_omap_ops = {
 	.direction_input	= omap_gpio_direction_input,
 	.direction_output	= omap_gpio_direction_output,
 	.get_value		= omap_gpio_get_value,
 	.set_value		= omap_gpio_set_value,
 	.get_function		= omap_gpio_get_function,
-	.xlate			= omap_gpio_xlate,
 };
 
 static int omap_gpio_probe(struct udevice *dev)
diff --git a/drivers/gpio/pca953x_gpio.c b/drivers/gpio/pca953x_gpio.c
new file mode 100644
index 0000000..987d10e
--- /dev/null
+++ b/drivers/gpio/pca953x_gpio.c
@@ -0,0 +1,351 @@
+/*
+ * Take linux kernel driver drivers/gpio/gpio-pca953x.c for reference.
+ *
+ * Copyright (C) 2016 Peng Fan <van.freenix@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ *
+ */
+
+/*
+ * Note:
+ * The driver's compatible table is borrowed from Linux Kernel,
+ * but now max supported gpio pins is 24 and only PCA953X_TYPE
+ * is supported. PCA957X_TYPE is not supported now.
+ * Also the Polarity Inversion feature is not supported now.
+ *
+ * TODO:
+ * 1. Support PCA957X_TYPE
+ * 2. Support max 40 gpio pins
+ * 3. Support Plolarity Inversion
+ */
+
+#include <common.h>
+#include <errno.h>
+#include <dm.h>
+#include <fdtdec.h>
+#include <i2c.h>
+#include <malloc.h>
+#include <asm/gpio.h>
+#include <asm/io.h>
+#include <dt-bindings/gpio/gpio.h>
+
+#define PCA953X_INPUT           0
+#define PCA953X_OUTPUT          1
+#define PCA953X_INVERT          2
+#define PCA953X_DIRECTION       3
+
+#define PCA_GPIO_MASK           0x00FF
+#define PCA_INT                 0x0100
+#define PCA953X_TYPE            0x1000
+#define PCA957X_TYPE            0x2000
+#define PCA_TYPE_MASK           0xF000
+#define PCA_CHIP_TYPE(x)        ((x) & PCA_TYPE_MASK)
+
+enum {
+	PCA953X_DIRECTION_IN,
+	PCA953X_DIRECTION_OUT,
+};
+
+#define MAX_BANK 3
+#define BANK_SZ 8
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * struct pca953x_info - Data for pca953x
+ *
+ * @dev: udevice structure for the device
+ * @addr: i2c slave address
+ * @invert: Polarity inversion or not
+ * @gpio_count: the number of gpio pins that the device supports
+ * @chip_type: indicate the chip type,PCA953X or PCA957X
+ * @bank_count: the number of banks that the device supports
+ * @reg_output: array to hold the value of output registers
+ * @reg_direction: array to hold the value of direction registers
+ */
+struct pca953x_info {
+	struct udevice *dev;
+	int addr;
+	int invert;
+	int gpio_count;
+	int chip_type;
+	int bank_count;
+	u8 reg_output[MAX_BANK];
+	u8 reg_direction[MAX_BANK];
+};
+
+static int pca953x_write_single(struct udevice *dev, int reg, u8 val,
+				int offset)
+{
+	struct pca953x_info *info = dev_get_platdata(dev);
+	int bank_shift = fls((info->gpio_count - 1) / BANK_SZ);
+	int off = offset / BANK_SZ;
+	int ret = 0;
+
+	ret = dm_i2c_write(dev, (reg << bank_shift) + off, &val, 1);
+	if (ret) {
+		dev_err(dev, "%s error\n", __func__);
+		return ret;
+	}
+
+	return 0;
+}
+
+static int pca953x_read_single(struct udevice *dev, int reg, u8 *val,
+			       int offset)
+{
+	struct pca953x_info *info = dev_get_platdata(dev);
+	int bank_shift = fls((info->gpio_count - 1) / BANK_SZ);
+	int off = offset / BANK_SZ;
+	int ret;
+	u8 byte;
+
+	ret = dm_i2c_read(dev, (reg << bank_shift) + off, &byte, 1);
+	if (ret) {
+		dev_err(dev, "%s error\n", __func__);
+		return ret;
+	}
+
+	*val = byte;
+
+	return 0;
+}
+
+static int pca953x_read_regs(struct udevice *dev, int reg, u8 *val)
+{
+	struct pca953x_info *info = dev_get_platdata(dev);
+	int ret = 0;
+
+	if (info->gpio_count <= 8) {
+		ret = dm_i2c_read(dev, reg, val, 1);
+	} else if (info->gpio_count <= 16) {
+		ret = dm_i2c_read(dev, reg << 1, val, info->bank_count);
+	} else {
+		dev_err(dev, "Unsupported now\n");
+		return -EINVAL;
+	}
+
+	return ret;
+}
+
+static int pca953x_is_output(struct udevice *dev, int offset)
+{
+	struct pca953x_info *info = dev_get_platdata(dev);
+
+	int bank = offset / BANK_SZ;
+	int off = offset % BANK_SZ;
+
+	/*0: output; 1: input */
+	return !(info->reg_direction[bank] & (1 << off));
+}
+
+static int pca953x_get_value(struct udevice *dev, unsigned offset)
+{
+	int ret;
+	u8 val = 0;
+
+	ret = pca953x_read_single(dev, PCA953X_INPUT, &val, offset);
+	if (ret)
+		return ret;
+
+	return (val >> offset) & 0x1;
+}
+
+static int pca953x_set_value(struct udevice *dev, unsigned offset,
+			     int value)
+{
+	struct pca953x_info *info = dev_get_platdata(dev);
+	int bank = offset / BANK_SZ;
+	int off = offset % BANK_SZ;
+	u8 val;
+	int ret;
+
+	if (value)
+		val = info->reg_output[bank] | (1 << off);
+	else
+		val = info->reg_output[bank] & ~(1 << off);
+
+	ret = pca953x_write_single(dev, PCA953X_OUTPUT, val, offset);
+	if (ret)
+		return ret;
+
+	info->reg_output[bank] = val;
+
+	return 0;
+}
+
+static int pca953x_set_direction(struct udevice *dev, unsigned offset, int dir)
+{
+	struct pca953x_info *info = dev_get_platdata(dev);
+	int bank = offset / BANK_SZ;
+	int off = offset % BANK_SZ;
+	u8 val;
+	int ret;
+
+	if (dir == PCA953X_DIRECTION_IN)
+		val = info->reg_direction[bank] | (1 << off);
+	else
+		val = info->reg_direction[bank] & ~(1 << off);
+
+	ret = pca953x_write_single(dev, PCA953X_DIRECTION, val, offset);
+	if (ret)
+		return ret;
+
+	info->reg_direction[bank] = val;
+
+	return 0;
+}
+
+static int pca953x_direction_input(struct udevice *dev, unsigned offset)
+{
+	return pca953x_set_direction(dev, offset, PCA953X_DIRECTION_IN);
+}
+
+static int pca953x_direction_output(struct udevice *dev, unsigned offset,
+				    int value)
+{
+	/* Configure output value. */
+	pca953x_set_value(dev, offset, value);
+
+	/* Configure direction as output. */
+	pca953x_set_direction(dev, offset, PCA953X_DIRECTION_OUT);
+
+	return 0;
+}
+
+static int pca953x_get_function(struct udevice *dev, unsigned offset)
+{
+	if (pca953x_is_output(dev, offset))
+		return GPIOF_OUTPUT;
+	else
+		return GPIOF_INPUT;
+}
+
+static int pca953x_xlate(struct udevice *dev, struct gpio_desc *desc,
+			 struct fdtdec_phandle_args *args)
+{
+	desc->offset = args->args[0];
+	desc->flags = args->args[1] & GPIO_ACTIVE_LOW ? GPIOD_ACTIVE_LOW : 0;
+
+	return 0;
+}
+
+static const struct dm_gpio_ops pca953x_ops = {
+	.direction_input	= pca953x_direction_input,
+	.direction_output	= pca953x_direction_output,
+	.get_value		= pca953x_get_value,
+	.set_value		= pca953x_set_value,
+	.get_function		= pca953x_get_function,
+	.xlate			= pca953x_xlate,
+};
+
+static int pca953x_probe(struct udevice *dev)
+{
+	struct pca953x_info *info = dev_get_platdata(dev);
+	struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
+	struct dm_i2c_chip *chip = dev_get_parent_platdata(dev);
+	char name[32], *str;
+	int addr;
+	ulong driver_data;
+	int ret;
+
+	if (!info) {
+		dev_err(dev, "platdata not ready\n");
+		return -ENOMEM;
+	}
+
+	if (!chip) {
+		dev_err(dev, "i2c not ready\n");
+		return -ENODEV;
+	}
+
+	addr = fdtdec_get_int(gd->fdt_blob, dev->of_offset, "reg", 0);
+	if (addr == 0)
+		return -ENODEV;
+
+	info->addr = addr;
+
+	driver_data = dev_get_driver_data(dev);
+
+	info->gpio_count = driver_data & PCA_GPIO_MASK;
+	if (info->gpio_count > MAX_BANK * BANK_SZ) {
+		dev_err(dev, "Max support %d pins now\n", MAX_BANK * BANK_SZ);
+		return -EINVAL;
+	}
+
+	info->chip_type = PCA_CHIP_TYPE(driver_data);
+	if (info->chip_type != PCA953X_TYPE) {
+		dev_err(dev, "Only support PCA953X chip type now.\n");
+		return -EINVAL;
+	}
+
+	info->bank_count = DIV_ROUND_UP(info->gpio_count, BANK_SZ);
+
+	ret = pca953x_read_regs(dev, PCA953X_OUTPUT, info->reg_output);
+	if (ret) {
+		dev_err(dev, "Error reading output register\n");
+		return ret;
+	}
+
+	ret = pca953x_read_regs(dev, PCA953X_DIRECTION, info->reg_direction);
+	if (ret) {
+		dev_err(dev, "Error reading direction register\n");
+		return ret;
+	}
+
+	snprintf(name, sizeof(name), "gpio@%x_", info->addr);
+	str = strdup(name);
+	if (!str)
+		return -ENOMEM;
+	uc_priv->bank_name = str;
+	uc_priv->gpio_count = info->gpio_count;
+
+	dev_dbg(dev, "%s is ready\n", str);
+
+	return 0;
+}
+
+#define OF_953X(__nrgpio, __int) (ulong)(__nrgpio | PCA953X_TYPE | __int)
+#define OF_957X(__nrgpio, __int) (ulong)(__nrgpio | PCA957X_TYPE | __int)
+
+static const struct udevice_id pca953x_ids[] = {
+	{ .compatible = "nxp,pca9505", .data = OF_953X(40, PCA_INT), },
+	{ .compatible = "nxp,pca9534", .data = OF_953X(8, PCA_INT), },
+	{ .compatible = "nxp,pca9535", .data = OF_953X(16, PCA_INT), },
+	{ .compatible = "nxp,pca9536", .data = OF_953X(4, 0), },
+	{ .compatible = "nxp,pca9537", .data = OF_953X(4, PCA_INT), },
+	{ .compatible = "nxp,pca9538", .data = OF_953X(8, PCA_INT), },
+	{ .compatible = "nxp,pca9539", .data = OF_953X(16, PCA_INT), },
+	{ .compatible = "nxp,pca9554", .data = OF_953X(8, PCA_INT), },
+	{ .compatible = "nxp,pca9555", .data = OF_953X(16, PCA_INT), },
+	{ .compatible = "nxp,pca9556", .data = OF_953X(8, 0), },
+	{ .compatible = "nxp,pca9557", .data = OF_953X(8, 0), },
+	{ .compatible = "nxp,pca9574", .data = OF_957X(8, PCA_INT), },
+	{ .compatible = "nxp,pca9575", .data = OF_957X(16, PCA_INT), },
+	{ .compatible = "nxp,pca9698", .data = OF_953X(40, 0), },
+
+	{ .compatible = "maxim,max7310", .data = OF_953X(8, 0), },
+	{ .compatible = "maxim,max7312", .data = OF_953X(16, PCA_INT), },
+	{ .compatible = "maxim,max7313", .data = OF_953X(16, PCA_INT), },
+	{ .compatible = "maxim,max7315", .data = OF_953X(8, PCA_INT), },
+
+	{ .compatible = "ti,pca6107", .data = OF_953X(8, PCA_INT), },
+	{ .compatible = "ti,tca6408", .data = OF_953X(8, PCA_INT), },
+	{ .compatible = "ti,tca6416", .data = OF_953X(16, PCA_INT), },
+	{ .compatible = "ti,tca6424", .data = OF_953X(24, PCA_INT), },
+
+	{ .compatible = "onsemi,pca9654", .data = OF_953X(8, PCA_INT), },
+
+	{ .compatible = "exar,xra1202", .data = OF_953X(8, 0), },
+	{ }
+};
+
+U_BOOT_DRIVER(pca953x) = {
+	.name		= "pca953x",
+	.id		= UCLASS_GPIO,
+	.ops		= &pca953x_ops,
+	.probe		= pca953x_probe,
+	.platdata_auto_alloc_size = sizeof(struct pca953x_info),
+	.of_match	= pca953x_ids,
+};
diff --git a/drivers/gpio/pic32_gpio.c b/drivers/gpio/pic32_gpio.c
index 499b4fa..7a037f3 100644
--- a/drivers/gpio/pic32_gpio.c
+++ b/drivers/gpio/pic32_gpio.c
@@ -12,7 +12,6 @@
 #include <asm/io.h>
 #include <asm/gpio.h>
 #include <linux/compat.h>
-#include <dt-bindings/gpio/gpio.h>
 #include <mach/pic32.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -99,14 +98,6 @@
 	return 0;
 }
 
-static int pic32_gpio_xlate(struct udevice *dev, struct gpio_desc *desc,
-			    struct fdtdec_phandle_args *args)
-{
-	desc->flags = args->args[1] & GPIO_ACTIVE_LOW ? GPIOD_ACTIVE_LOW : 0;
-
-	return 0;
-}
-
 static int pic32_gpio_get_function(struct udevice *dev, unsigned offset)
 {
 	int ret = GPIOF_UNUSED;
@@ -131,7 +122,6 @@
 	.get_value		= pic32_gpio_get_value,
 	.set_value		= pic32_gpio_set_value,
 	.get_function		= pic32_gpio_get_function,
-	.xlate			= pic32_gpio_xlate,
 };
 
 static int pic32_gpio_probe(struct udevice *dev)
diff --git a/drivers/gpio/rk_gpio.c b/drivers/gpio/rk_gpio.c
index 40e87bd..fefe3ca 100644
--- a/drivers/gpio/rk_gpio.c
+++ b/drivers/gpio/rk_gpio.c
@@ -16,7 +16,6 @@
 #include <asm/io.h>
 #include <asm/arch/clock.h>
 #include <dm/pinctrl.h>
-#include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/clock/rk3288-cru.h>
 
 enum {
@@ -98,15 +97,6 @@
 #endif
 }
 
-static int rockchip_gpio_xlate(struct udevice *dev, struct gpio_desc *desc,
-			    struct fdtdec_phandle_args *args)
-{
-	desc->offset = args->args[0];
-	desc->flags = args->args[1] & GPIO_ACTIVE_LOW ? GPIOD_ACTIVE_LOW : 0;
-
-	return 0;
-}
-
 static int rockchip_gpio_probe(struct udevice *dev)
 {
 	struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
@@ -135,7 +125,6 @@
 	.get_value		= rockchip_gpio_get_value,
 	.set_value		= rockchip_gpio_set_value,
 	.get_function		= rockchip_gpio_get_function,
-	.xlate			= rockchip_gpio_xlate,
 };
 
 static const struct udevice_id rockchip_gpio_ids[] = {
diff --git a/drivers/gpio/s5p_gpio.c b/drivers/gpio/s5p_gpio.c
index 0f22b23..377fed4 100644
--- a/drivers/gpio/s5p_gpio.c
+++ b/drivers/gpio/s5p_gpio.c
@@ -13,7 +13,6 @@
 #include <asm/io.h>
 #include <asm/gpio.h>
 #include <dm/device-internal.h>
-#include <dt-bindings/gpio/gpio.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -276,22 +275,12 @@
 		return GPIOF_FUNC;
 }
 
-static int exynos_gpio_xlate(struct udevice *dev, struct gpio_desc *desc,
-			     struct fdtdec_phandle_args *args)
-{
-	desc->offset = args->args[0];
-	desc->flags = args->args[1] & GPIO_ACTIVE_LOW ? GPIOD_ACTIVE_LOW : 0;
-
-	return 0;
-}
-
 static const struct dm_gpio_ops gpio_exynos_ops = {
 	.direction_input	= exynos_gpio_direction_input,
 	.direction_output	= exynos_gpio_direction_output,
 	.get_value		= exynos_gpio_get_value,
 	.set_value		= exynos_gpio_set_value,
 	.get_function		= exynos_gpio_get_function,
-	.xlate			= exynos_gpio_xlate,
 };
 
 static int gpio_exynos_probe(struct udevice *dev)
diff --git a/drivers/gpio/zynq_gpio.c b/drivers/gpio/zynq_gpio.c
index 3a995f6..4ab2356 100644
--- a/drivers/gpio/zynq_gpio.c
+++ b/drivers/gpio/zynq_gpio.c
@@ -299,11 +299,33 @@
 	return 0;
 }
 
+static int zynq_gpio_get_function(struct udevice *dev, unsigned offset)
+{
+	u32 reg;
+	unsigned int bank_num, bank_pin_num;
+	struct zynq_gpio_privdata *priv = dev_get_priv(dev);
+
+	if (check_gpio(offset, dev) < 0)
+		return -1;
+
+	zynq_gpio_get_bank_pin(offset, &bank_num, &bank_pin_num, dev);
+
+	/* set the GPIO pin as output */
+	reg = readl(priv->base + ZYNQ_GPIO_DIRM_OFFSET(bank_num));
+	reg &= BIT(bank_pin_num);
+	if (reg)
+		return GPIOF_OUTPUT;
+	else
+		return GPIOF_INPUT;
+}
+
 static const struct dm_gpio_ops gpio_zynq_ops = {
 	.direction_input	= zynq_gpio_direction_input,
 	.direction_output	= zynq_gpio_direction_output,
 	.get_value		= zynq_gpio_get_value,
 	.set_value		= zynq_gpio_set_value,
+	.get_function		= zynq_gpio_get_function,
+
 };
 
 static const struct udevice_id zynq_gpio_ids[] = {
diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig
index 9324c6c..6e22bba 100644
--- a/drivers/i2c/Kconfig
+++ b/drivers/i2c/Kconfig
@@ -58,6 +58,13 @@
 	  bindings are supported.
 	  Binding info: doc/device-tree-bindings/i2c/i2c-gpio.txt
 
+config SYS_I2C_FSL
+       bool "Freescale I2C bus driver"
+       depends on DM_I2C
+       help
+	  Add support for Freescale I2C busses as used on MPC8240, MPC8245, and
+	  MPC85xx processors.
+
 config SYS_I2C_CADENCE
 	tristate "Cadence I2C Controller"
 	depends on DM_I2C && (ARCH_ZYNQ || ARM64)
@@ -65,6 +72,24 @@
 	  Say yes here to select Cadence I2C Host Controller. This controller is
 	  e.g. used by Xilinx Zynq.
 
+config SYS_I2C_DW
+	bool "Designware I2C Controller"
+	default n
+	help
+	  Say yes here to select the Designware I2C Host Controller. This
+	  controller is used in various SoCs, e.g. the ST SPEAr, Altera
+	  SoCFPGA, Synopsys ARC700 and some Intel x86 SoCs.
+
+config SYS_I2C_DW_ENABLE_STATUS_UNSUPPORTED
+	bool "DW I2C Enable Status Register not supported"
+	depends on SYS_I2C_DW && (TARGET_SPEAR300 || TARGET_SPEAR310 || \
+		TARGET_SPEAR320 || TARGET_SPEAR600 || TARGET_X600)
+	default y
+	help
+	  Some versions of the Designware I2C controller do not support the
+	  enable status register. This config option can be enabled in such
+	  cases.
+
 config SYS_I2C_INTEL
 	bool "Intel I2C/SMBUS driver"
 	depends on DM_I2C
diff --git a/drivers/i2c/designware_i2c.c b/drivers/i2c/designware_i2c.c
index 0c7cd0b..e60fd0a 100644
--- a/drivers/i2c/designware_i2c.c
+++ b/drivers/i2c/designware_i2c.c
@@ -36,6 +36,14 @@
 	struct dw_scl_sda_cfg *scl_sda_cfg;
 };
 
+#ifdef CONFIG_SYS_I2C_DW_ENABLE_STATUS_UNSUPPORTED
+static void dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
+{
+	u32 ena = enable ? IC_ENABLE_0B : 0;
+
+	writel(ena, &i2c_base->ic_enable);
+}
+#else
 static void dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
 {
 	u32 ena = enable ? IC_ENABLE_0B : 0;
@@ -56,6 +64,7 @@
 
 	printf("timeout in %sabling I2C adapter\n", enable ? "en" : "dis");
 }
+#endif
 
 /*
  * i2c_set_bus_speed - Set the i2c speed
diff --git a/drivers/i2c/fsl_i2c.c b/drivers/i2c/fsl_i2c.c
index b56a1c2..b8cc647 100644
--- a/drivers/i2c/fsl_i2c.c
+++ b/drivers/i2c/fsl_i2c.c
@@ -12,6 +12,8 @@
 #include <i2c.h>		/* Functional interface */
 #include <asm/io.h>
 #include <asm/fsl_i2c.h>	/* HW definitions */
+#include <dm.h>
+#include <mapmem.h>
 
 /* The maximum number of microseconds we will wait until another master has
  * released the bus.  If not defined in the board header file, then use a
@@ -34,18 +36,20 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static const struct fsl_i2c *i2c_dev[4] = {
-	(struct fsl_i2c *)(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_I2C_OFFSET),
+#ifndef CONFIG_DM_I2C
+static const struct fsl_i2c_base *i2c_base[4] = {
+	(struct fsl_i2c_base *)(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_I2C_OFFSET),
 #ifdef CONFIG_SYS_FSL_I2C2_OFFSET
-	(struct fsl_i2c *)(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_I2C2_OFFSET),
+	(struct fsl_i2c_base *)(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_I2C2_OFFSET),
 #endif
 #ifdef CONFIG_SYS_FSL_I2C3_OFFSET
-	(struct fsl_i2c *)(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_I2C3_OFFSET),
+	(struct fsl_i2c_base *)(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_I2C3_OFFSET),
 #endif
 #ifdef CONFIG_SYS_FSL_I2C4_OFFSET
-	(struct fsl_i2c *)(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_I2C4_OFFSET)
+	(struct fsl_i2c_base *)(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_I2C4_OFFSET)
 #endif
 };
+#endif
 
 /* I2C speed map for a DFSR value of 1 */
 
@@ -104,7 +108,7 @@
 /**
  * Set the I2C bus speed for a given I2C device
  *
- * @param dev: the I2C device
+ * @param base: the I2C device registers
  * @i2c_clk: I2C bus clock frequency
  * @speed: the desired speed of the bus
  *
@@ -112,7 +116,7 @@
  *
  * The return value is the actual bus speed that is set.
  */
-static unsigned int set_i2c_bus_speed(const struct fsl_i2c *dev,
+static unsigned int set_i2c_bus_speed(const struct fsl_i2c_base *base,
 	unsigned int i2c_clk, unsigned int speed)
 {
 	unsigned short divider = min(i2c_clk / speed, (unsigned int)USHRT_MAX);
@@ -173,8 +177,8 @@
 	debug("divider:%d, est_div:%ld, DFSR:%d\n", divider, est_div, dfsr);
 	debug("FDR:0x%.2x, speed:%d\n", fdr, speed);
 #endif
-	writeb(dfsr, &dev->dfsrr);	/* set default filter */
-	writeb(fdr, &dev->fdr);		/* set bus speed */
+	writeb(dfsr, &base->dfsrr);	/* set default filter */
+	writeb(fdr, &base->fdr);	/* set bus speed */
 #else
 	unsigned int i;
 
@@ -184,7 +188,7 @@
 
 			fdr = fsl_i2c_speed_map[i].fdr;
 			speed = i2c_clk / fsl_i2c_speed_map[i].divider;
-			writeb(fdr, &dev->fdr);		/* set bus speed */
+			writeb(fdr, &base->fdr);	/* set bus speed */
 
 			break;
 		}
@@ -192,6 +196,7 @@
 	return speed;
 }
 
+#ifndef CONFIG_DM_I2C
 static unsigned int get_i2c_clock(int bus)
 {
 	if (bus)
@@ -199,8 +204,9 @@
 	else
 		return gd->arch.i2c1_clk;	/* I2C1 clock */
 }
+#endif
 
-static int fsl_i2c_fixup(const struct fsl_i2c *dev)
+static int fsl_i2c_fixup(const struct fsl_i2c_base *base)
 {
 	const unsigned long long timeout = usec2ticks(CONFIG_I2C_MBB_TIMEOUT);
 	unsigned long long timeval = 0;
@@ -214,42 +220,42 @@
 		flags = I2C_CR_BIT6;
 #endif
 
-	writeb(I2C_CR_MEN | I2C_CR_MSTA, &dev->cr);
+	writeb(I2C_CR_MEN | I2C_CR_MSTA, &base->cr);
 
 	timeval = get_ticks();
-	while (!(readb(&dev->sr) & I2C_SR_MBB)) {
+	while (!(readb(&base->sr) & I2C_SR_MBB)) {
 		if ((get_ticks() - timeval) > timeout)
 			goto err;
 	}
 
-	if (readb(&dev->sr) & I2C_SR_MAL) {
+	if (readb(&base->sr) & I2C_SR_MAL) {
 		/* SDA is stuck low */
-		writeb(0, &dev->cr);
+		writeb(0, &base->cr);
 		udelay(100);
-		writeb(I2C_CR_MSTA | flags, &dev->cr);
-		writeb(I2C_CR_MEN | I2C_CR_MSTA | flags, &dev->cr);
+		writeb(I2C_CR_MSTA | flags, &base->cr);
+		writeb(I2C_CR_MEN | I2C_CR_MSTA | flags, &base->cr);
 	}
 
-	readb(&dev->dr);
+	readb(&base->dr);
 
 	timeval = get_ticks();
-	while (!(readb(&dev->sr) & I2C_SR_MIF)) {
+	while (!(readb(&base->sr) & I2C_SR_MIF)) {
 		if ((get_ticks() - timeval) > timeout)
 			goto err;
 	}
 	ret = 0;
 
 err:
-	writeb(I2C_CR_MEN | flags, &dev->cr);
-	writeb(0, &dev->sr);
+	writeb(I2C_CR_MEN | flags, &base->cr);
+	writeb(0, &base->sr);
 	udelay(100);
 
 	return ret;
 }
 
-static void fsl_i2c_init(struct i2c_adapter *adap, int speed, int slaveadd)
+static void __i2c_init(const struct fsl_i2c_base *base, int speed, int
+		       slaveadd, int i2c_clk, int busnum)
 {
-	const struct fsl_i2c *dev;
 	const unsigned long long timeout = usec2ticks(CONFIG_I2C_MBB_TIMEOUT);
 	unsigned long long timeval;
 
@@ -260,23 +266,21 @@
 	*/
 	i2c_init_board();
 #endif
-	dev = (struct fsl_i2c *)i2c_dev[adap->hwadapnr];
-
-	writeb(0, &dev->cr);		/* stop I2C controller */
+	writeb(0, &base->cr);		/* stop I2C controller */
 	udelay(5);			/* let it shutdown in peace */
-	set_i2c_bus_speed(dev, get_i2c_clock(adap->hwadapnr), speed);
-	writeb(slaveadd << 1, &dev->adr);/* write slave address */
-	writeb(0x0, &dev->sr);		/* clear status register */
-	writeb(I2C_CR_MEN, &dev->cr);	/* start I2C controller */
+	set_i2c_bus_speed(base, i2c_clk, speed);
+	writeb(slaveadd << 1, &base->adr);/* write slave address */
+	writeb(0x0, &base->sr);		/* clear status register */
+	writeb(I2C_CR_MEN, &base->cr);	/* start I2C controller */
 
 	timeval = get_ticks();
-	while (readb(&dev->sr) & I2C_SR_MBB) {
+	while (readb(&base->sr) & I2C_SR_MBB) {
 		if ((get_ticks() - timeval) < timeout)
 			continue;
 
-		if (fsl_i2c_fixup(dev))
+		if (fsl_i2c_fixup(base))
 			debug("i2c_init: BUS#%d failed to init\n",
-			      adap->hwadapnr);
+			      busnum);
 
 		break;
 	}
@@ -292,13 +296,12 @@
 }
 
 static int
-i2c_wait4bus(struct i2c_adapter *adap)
+i2c_wait4bus(const struct fsl_i2c_base *base)
 {
-	struct fsl_i2c *dev = (struct fsl_i2c *)i2c_dev[adap->hwadapnr];
 	unsigned long long timeval = get_ticks();
 	const unsigned long long timeout = usec2ticks(CONFIG_I2C_MBB_TIMEOUT);
 
-	while (readb(&dev->sr) & I2C_SR_MBB) {
+	while (readb(&base->sr) & I2C_SR_MBB) {
 		if ((get_ticks() - timeval) > timeout)
 			return -1;
 	}
@@ -306,22 +309,21 @@
 	return 0;
 }
 
-static __inline__ int
-i2c_wait(struct i2c_adapter *adap, int write)
+static inline int
+i2c_wait(const struct fsl_i2c_base *base, int write)
 {
 	u32 csr;
 	unsigned long long timeval = get_ticks();
 	const unsigned long long timeout = usec2ticks(CONFIG_I2C_TIMEOUT);
-	struct fsl_i2c *dev = (struct fsl_i2c *)i2c_dev[adap->hwadapnr];
 
 	do {
-		csr = readb(&dev->sr);
+		csr = readb(&base->sr);
 		if (!(csr & I2C_SR_MIF))
 			continue;
 		/* Read again to allow register to stabilise */
-		csr = readb(&dev->sr);
+		csr = readb(&base->sr);
 
-		writeb(0x0, &dev->sr);
+		writeb(0x0, &base->sr);
 
 		if (csr & I2C_SR_MAL) {
 			debug("i2c_wait: MAL\n");
@@ -345,203 +347,318 @@
 	return -1;
 }
 
-static __inline__ int
-i2c_write_addr(struct i2c_adapter *adap, u8 dev, u8 dir, int rsta)
+static inline int
+i2c_write_addr(const struct fsl_i2c_base *base, u8 dev, u8 dir, int rsta)
 {
-	struct fsl_i2c *device = (struct fsl_i2c *)i2c_dev[adap->hwadapnr];
-
 	writeb(I2C_CR_MEN | I2C_CR_MSTA | I2C_CR_MTX
 	       | (rsta ? I2C_CR_RSTA : 0),
-	       &device->cr);
+	       &base->cr);
 
-	writeb((dev << 1) | dir, &device->dr);
+	writeb((dev << 1) | dir, &base->dr);
 
-	if (i2c_wait(adap, I2C_WRITE_BIT) < 0)
+	if (i2c_wait(base, I2C_WRITE_BIT) < 0)
 		return 0;
 
 	return 1;
 }
 
-static __inline__ int
-__i2c_write(struct i2c_adapter *adap, u8 *data, int length)
+static inline int
+__i2c_write_data(const struct fsl_i2c_base *base, u8 *data, int length)
 {
-	struct fsl_i2c *dev = (struct fsl_i2c *)i2c_dev[adap->hwadapnr];
 	int i;
 
 	for (i = 0; i < length; i++) {
-		writeb(data[i], &dev->dr);
+		writeb(data[i], &base->dr);
 
-		if (i2c_wait(adap, I2C_WRITE_BIT) < 0)
+		if (i2c_wait(base, I2C_WRITE_BIT) < 0)
 			break;
 	}
 
 	return i;
 }
 
-static __inline__ int
-__i2c_read(struct i2c_adapter *adap, u8 *data, int length)
+static inline int
+__i2c_read_data(const struct fsl_i2c_base *base, u8 *data, int length)
 {
-	struct fsl_i2c *dev = (struct fsl_i2c *)i2c_dev[adap->hwadapnr];
 	int i;
 
 	writeb(I2C_CR_MEN | I2C_CR_MSTA | ((length == 1) ? I2C_CR_TXAK : 0),
-	       &dev->cr);
+	       &base->cr);
 
 	/* dummy read */
-	readb(&dev->dr);
+	readb(&base->dr);
 
 	for (i = 0; i < length; i++) {
-		if (i2c_wait(adap, I2C_READ_BIT) < 0)
+		if (i2c_wait(base, I2C_READ_BIT) < 0)
 			break;
 
 		/* Generate ack on last next to last byte */
 		if (i == length - 2)
 			writeb(I2C_CR_MEN | I2C_CR_MSTA | I2C_CR_TXAK,
-			       &dev->cr);
+			       &base->cr);
 
 		/* Do not generate stop on last byte */
 		if (i == length - 1)
 			writeb(I2C_CR_MEN | I2C_CR_MSTA | I2C_CR_MTX,
-			       &dev->cr);
+			       &base->cr);
 
-		data[i] = readb(&dev->dr);
+		data[i] = readb(&base->dr);
 	}
 
 	return i;
 }
 
 static int
-fsl_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr, int alen, u8 *data,
-	     int length)
+__i2c_read(const struct fsl_i2c_base *base, u8 chip_addr, u8 *offset, int olen,
+	   u8 *data, int dlen)
 {
-	struct fsl_i2c *device = (struct fsl_i2c *)i2c_dev[adap->hwadapnr];
-	int i = -1; /* signal error */
-	u8 *a = (u8*)&addr;
-	int len = alen * -1;
+	int ret = -1; /* signal error */
 
-	if (i2c_wait4bus(adap) < 0)
+	if (i2c_wait4bus(base) < 0)
 		return -1;
 
-	/* To handle the need of I2C devices that require to write few bytes
-	 * (more than 4 bytes of address as in the case of else part)
-	 * of data before reading, Negative equivalent of length(bytes to write)
-	 * is passed, but used the +ve part of len for writing data
+	/* Some drivers use offset lengths in excess of 4 bytes. These drivers
+	 * adhere to the following convention:
+	 * - the offset length is passed as negative (that is, the absolute
+	 *   value of olen is the actual offset length)
+	 * - the offset itself is passed in data, which is overwritten by the
+	 *   subsequent read operation
 	 */
-	if (alen < 0) {
-		/* Generate a START and send the Address and
-		 * the Tx Bytes to the slave.
-		 * "START: Address: Write bytes data[len]"
-		 * IF part supports writing any number of bytes in contrast
-		 * to the else part, which supports writing address offset
-		 * of upto 4 bytes only.
-		 * bytes that need to be written are passed in
-		 * "data", which will eventually keep the data READ,
-		 * after writing the len bytes out of it
-		 */
-		if (i2c_write_addr(adap, dev, I2C_WRITE_BIT, 0) != 0)
-			i = __i2c_write(adap, data, len);
+	if (olen < 0) {
+		if (i2c_write_addr(base, chip_addr, I2C_WRITE_BIT, 0) != 0)
+			ret = __i2c_write_data(base, data, -olen);
 
-		if (i != len)
+		if (ret != -olen)
 			return -1;
 
-		if (length && i2c_write_addr(adap, dev, I2C_READ_BIT, 1) != 0)
-			i = __i2c_read(adap, data, length);
+		if (dlen && i2c_write_addr(base, chip_addr,
+					   I2C_READ_BIT, 1) != 0)
+			ret = __i2c_read_data(base, data, dlen);
 	} else {
-		if ((!length || alen > 0) &&
-		    i2c_write_addr(adap, dev, I2C_WRITE_BIT, 0) != 0  &&
-		    __i2c_write(adap, &a[4 - alen], alen) == alen)
-			i = 0; /* No error so far */
+		if ((!dlen || olen > 0) &&
+		    i2c_write_addr(base, chip_addr, I2C_WRITE_BIT, 0) != 0  &&
+		    __i2c_write_data(base, offset, olen) == olen)
+			ret = 0; /* No error so far */
 
-		if (length &&
-		    i2c_write_addr(adap, dev, I2C_READ_BIT, alen ? 1 : 0) != 0)
-			i = __i2c_read(adap, data, length);
+		if (dlen && i2c_write_addr(base, chip_addr, I2C_READ_BIT,
+					   olen ? 1 : 0) != 0)
+			ret = __i2c_read_data(base, data, dlen);
 	}
 
-	writeb(I2C_CR_MEN, &device->cr);
+	writeb(I2C_CR_MEN, &base->cr);
 
-	if (i2c_wait4bus(adap)) /* Wait until STOP */
+	if (i2c_wait4bus(base)) /* Wait until STOP */
 		debug("i2c_read: wait4bus timed out\n");
 
-	if (i == length)
-	    return 0;
+	if (ret == dlen)
+		return 0;
 
 	return -1;
 }
 
 static int
-fsl_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr, int alen,
-	      u8 *data, int length)
+__i2c_write(const struct fsl_i2c_base *base, u8 chip_addr, u8 *offset, int olen,
+	    u8 *data, int dlen)
 {
-	struct fsl_i2c *device = (struct fsl_i2c *)i2c_dev[adap->hwadapnr];
-	int i = -1; /* signal error */
-	u8 *a = (u8*)&addr;
+	int ret = -1; /* signal error */
 
-	if (i2c_wait4bus(adap) < 0)
+	if (i2c_wait4bus(base) < 0)
 		return -1;
 
-	if (i2c_write_addr(adap, dev, I2C_WRITE_BIT, 0) != 0 &&
-	    __i2c_write(adap, &a[4 - alen], alen) == alen) {
-		i = __i2c_write(adap, data, length);
+	if (i2c_write_addr(base, chip_addr, I2C_WRITE_BIT, 0) != 0 &&
+	    __i2c_write_data(base, offset, olen) == olen) {
+		ret = __i2c_write_data(base, data, dlen);
 	}
 
-	writeb(I2C_CR_MEN, &device->cr);
-	if (i2c_wait4bus(adap)) /* Wait until STOP */
+	writeb(I2C_CR_MEN, &base->cr);
+	if (i2c_wait4bus(base)) /* Wait until STOP */
 		debug("i2c_write: wait4bus timed out\n");
 
-	if (i == length)
-	    return 0;
+	if (ret == dlen)
+		return 0;
 
 	return -1;
 }
 
 static int
-fsl_i2c_probe(struct i2c_adapter *adap, uchar chip)
+__i2c_probe_chip(const struct fsl_i2c_base *base, uchar chip)
 {
-	struct fsl_i2c *dev = (struct fsl_i2c *)i2c_dev[adap->hwadapnr];
 	/* For unknow reason the controller will ACK when
 	 * probing for a slave with the same address, so skip
 	 * it.
 	 */
-	if (chip == (readb(&dev->adr) >> 1))
+	if (chip == (readb(&base->adr) >> 1))
 		return -1;
 
-	return fsl_i2c_read(adap, chip, 0, 0, NULL, 0);
+	return __i2c_read(base, chip, 0, 0, NULL, 0);
+}
+
+static unsigned int __i2c_set_bus_speed(const struct fsl_i2c_base *base,
+			unsigned int speed, int i2c_clk)
+{
+	writeb(0, &base->cr);		/* stop controller */
+	set_i2c_bus_speed(base, i2c_clk, speed);
+	writeb(I2C_CR_MEN, &base->cr);	/* start controller */
+
+	return 0;
+}
+
+#ifndef CONFIG_DM_I2C
+static void fsl_i2c_init(struct i2c_adapter *adap, int speed, int slaveadd)
+{
+	__i2c_init(i2c_base[adap->hwadapnr], speed, slaveadd,
+		   get_i2c_clock(adap->hwadapnr), adap->hwadapnr);
+}
+
+static int
+fsl_i2c_probe_chip(struct i2c_adapter *adap, uchar chip)
+{
+	return __i2c_probe_chip(i2c_base[adap->hwadapnr], chip);
+}
+
+static int
+fsl_i2c_read(struct i2c_adapter *adap, u8 chip_addr, uint offset, int olen,
+	     u8 *data, int dlen)
+{
+	u8 *o = (u8 *)&offset;
+	return __i2c_read(i2c_base[adap->hwadapnr], chip_addr, &o[4 - olen],
+			  olen, data, dlen);
+}
+
+static int
+fsl_i2c_write(struct i2c_adapter *adap, u8 chip_addr, uint offset, int olen,
+	      u8 *data, int dlen)
+{
+	u8 *o = (u8 *)&offset;
+	return __i2c_write(i2c_base[adap->hwadapnr], chip_addr, &o[4 - olen],
+			   olen, data, dlen);
 }
 
 static unsigned int fsl_i2c_set_bus_speed(struct i2c_adapter *adap,
-			unsigned int speed)
+					  unsigned int speed)
 {
-	struct fsl_i2c *dev = (struct fsl_i2c *)i2c_dev[adap->hwadapnr];
-
-	writeb(0, &dev->cr);		/* stop controller */
-	set_i2c_bus_speed(dev, get_i2c_clock(adap->hwadapnr), speed);
-	writeb(I2C_CR_MEN, &dev->cr);	/* start controller */
-
-	return 0;
+	return __i2c_set_bus_speed(i2c_base[adap->hwadapnr], speed,
+				   get_i2c_clock(adap->hwadapnr));
 }
 
 /*
  * Register fsl i2c adapters
  */
-U_BOOT_I2C_ADAP_COMPLETE(fsl_0, fsl_i2c_init, fsl_i2c_probe, fsl_i2c_read,
+U_BOOT_I2C_ADAP_COMPLETE(fsl_0, fsl_i2c_init, fsl_i2c_probe_chip, fsl_i2c_read,
 			 fsl_i2c_write, fsl_i2c_set_bus_speed,
 			 CONFIG_SYS_FSL_I2C_SPEED, CONFIG_SYS_FSL_I2C_SLAVE,
 			 0)
 #ifdef CONFIG_SYS_FSL_I2C2_OFFSET
-U_BOOT_I2C_ADAP_COMPLETE(fsl_1, fsl_i2c_init, fsl_i2c_probe, fsl_i2c_read,
+U_BOOT_I2C_ADAP_COMPLETE(fsl_1, fsl_i2c_init, fsl_i2c_probe_chip, fsl_i2c_read,
 			 fsl_i2c_write, fsl_i2c_set_bus_speed,
 			 CONFIG_SYS_FSL_I2C2_SPEED, CONFIG_SYS_FSL_I2C2_SLAVE,
 			 1)
 #endif
 #ifdef CONFIG_SYS_FSL_I2C3_OFFSET
-U_BOOT_I2C_ADAP_COMPLETE(fsl_2, fsl_i2c_init, fsl_i2c_probe, fsl_i2c_read,
+U_BOOT_I2C_ADAP_COMPLETE(fsl_2, fsl_i2c_init, fsl_i2c_probe_chip, fsl_i2c_read,
 			 fsl_i2c_write, fsl_i2c_set_bus_speed,
 			 CONFIG_SYS_FSL_I2C3_SPEED, CONFIG_SYS_FSL_I2C3_SLAVE,
 			 2)
 #endif
 #ifdef CONFIG_SYS_FSL_I2C4_OFFSET
-U_BOOT_I2C_ADAP_COMPLETE(fsl_3, fsl_i2c_init, fsl_i2c_probe, fsl_i2c_read,
+U_BOOT_I2C_ADAP_COMPLETE(fsl_3, fsl_i2c_init, fsl_i2c_probe_chip, fsl_i2c_read,
 			 fsl_i2c_write, fsl_i2c_set_bus_speed,
 			 CONFIG_SYS_FSL_I2C4_SPEED, CONFIG_SYS_FSL_I2C4_SLAVE,
 			 3)
 #endif
+#else /* CONFIG_DM_I2C */
+static int fsl_i2c_probe_chip(struct udevice *bus, u32 chip_addr,
+			      u32 chip_flags)
+{
+	struct fsl_i2c_dev *dev = dev_get_priv(bus);
+	return __i2c_probe_chip(dev->base, chip_addr);
+}
+
+static int fsl_i2c_set_bus_speed(struct udevice *bus, unsigned int speed)
+{
+	struct fsl_i2c_dev *dev = dev_get_priv(bus);
+	return __i2c_set_bus_speed(dev->base, speed, dev->i2c_clk);
+}
+
+static int fsl_i2c_ofdata_to_platdata(struct udevice *bus)
+{
+	struct fsl_i2c_dev *dev = dev_get_priv(bus);
+	u64 reg;
+	u32 addr, size;
+
+	reg = fdtdec_get_addr(gd->fdt_blob, bus->of_offset, "reg");
+	addr = reg >> 32;
+	size = reg & 0xFFFFFFFF;
+
+	dev->base = map_sysmem(CONFIG_SYS_IMMR + addr, size);
+
+	if (!dev->base)
+		return -ENOMEM;
+
+	dev->index = fdtdec_get_int(gd->fdt_blob, bus->of_offset,
+				    "cell-index", -1);
+	dev->slaveadd = fdtdec_get_int(gd->fdt_blob, bus->of_offset,
+				       "u-boot,i2c-slave-addr", 0x7f);
+	dev->speed = fdtdec_get_int(gd->fdt_blob, bus->of_offset,
+				    "clock-frequency", 400000);
+
+	dev->i2c_clk = dev->index ? gd->arch.i2c2_clk : gd->arch.i2c1_clk;
+
+	return 0;
+}
+
+static int fsl_i2c_probe(struct udevice *bus)
+{
+	struct fsl_i2c_dev *dev = dev_get_priv(bus);
+	__i2c_init(dev->base, dev->speed, dev->slaveadd, dev->i2c_clk,
+		   dev->index);
+	return 0;
+}
+
+static int fsl_i2c_xfer(struct udevice *bus, struct i2c_msg *msg, int nmsgs)
+{
+	struct fsl_i2c_dev *dev = dev_get_priv(bus);
+	struct i2c_msg *dmsg, *omsg, dummy;
+
+	memset(&dummy, 0, sizeof(struct i2c_msg));
+
+	/* We expect either two messages (one with an offset and one with the
+	 * actucal data) or one message (just data) */
+	if (nmsgs > 2 || nmsgs == 0) {
+		debug("%s: Only one or two messages are supported.", __func__);
+		return -1;
+	}
+
+	omsg = nmsgs == 1 ? &dummy : msg;
+	dmsg = nmsgs == 1 ? msg : msg + 1;
+
+	if (dmsg->flags & I2C_M_RD)
+		return __i2c_read(dev->base, dmsg->addr, omsg->buf, omsg->len,
+				  dmsg->buf, dmsg->len);
+	else
+		return __i2c_write(dev->base, dmsg->addr, omsg->buf, omsg->len,
+				   dmsg->buf, dmsg->len);
+}
+
+static const struct dm_i2c_ops fsl_i2c_ops = {
+	.xfer           = fsl_i2c_xfer,
+	.probe_chip     = fsl_i2c_probe_chip,
+	.set_bus_speed  = fsl_i2c_set_bus_speed,
+};
+
+static const struct udevice_id fsl_i2c_ids[] = {
+	{ .compatible = "fsl-i2c", },
+	{ /* sentinel */ }
+};
+
+U_BOOT_DRIVER(i2c_fsl) = {
+	.name = "i2c_fsl",
+	.id = UCLASS_I2C,
+	.of_match = fsl_i2c_ids,
+	.probe = fsl_i2c_probe,
+	.ofdata_to_platdata = fsl_i2c_ofdata_to_platdata,
+	.priv_auto_alloc_size = sizeof(struct fsl_i2c_dev),
+	.ops = &fsl_i2c_ops,
+};
+
+#endif /* CONFIG_DM_I2C */
diff --git a/drivers/i2c/i2c-cdns.c b/drivers/i2c/i2c-cdns.c
index 909cea2..5642cd9 100644
--- a/drivers/i2c/i2c-cdns.c
+++ b/drivers/i2c/i2c-cdns.c
@@ -112,48 +112,10 @@
 
 struct i2c_cdns_bus {
 	int id;
+	unsigned int input_freq;
 	struct cdns_i2c_regs __iomem *regs;	/* register base */
 };
 
-
-/** cdns_i2c_probe() - Probe method
- * @dev: udevice pointer
- *
- * DM callback called when device is probed
- */
-static int cdns_i2c_probe(struct udevice *dev)
-{
-	struct i2c_cdns_bus *bus = dev_get_priv(dev);
-
-	bus->regs = (struct cdns_i2c_regs *)dev_get_addr(dev);
-	if (!bus->regs)
-		return -ENOMEM;
-
-	/* TODO: Calculate dividers based on CPU_CLK_1X */
-	/* 111MHz / ( (3 * 17) * 22 ) = ~100KHz */
-	writel((16 << CDNS_I2C_CONTROL_DIV_B_SHIFT) |
-		(2 << CDNS_I2C_CONTROL_DIV_A_SHIFT), &bus->regs->control);
-
-	/* Enable master mode, ack, and 7-bit addressing */
-	setbits_le32(&bus->regs->control, CDNS_I2C_CONTROL_MS |
-		CDNS_I2C_CONTROL_ACKEN | CDNS_I2C_CONTROL_NEA);
-
-	debug("%s bus %d at %p\n", __func__, dev->seq, bus->regs);
-
-	return 0;
-}
-
-static int cdns_i2c_remove(struct udevice *dev)
-{
-	struct i2c_cdns_bus *bus = dev_get_priv(dev);
-
-	debug("%s bus %d at %p\n", __func__, dev->seq, bus->regs);
-
-	unmap_sysmem(bus->regs);
-
-	return 0;
-}
-
 /* Wait for an interrupt */
 static u32 cdns_i2c_wait(struct cdns_i2c_regs *cdns_i2c, u32 mask)
 {
@@ -172,14 +134,84 @@
 	return int_status & mask;
 }
 
+#define CDNS_I2C_DIVA_MAX	4
+#define CDNS_I2C_DIVB_MAX	64
+
+static int cdns_i2c_calc_divs(unsigned long *f, unsigned long input_clk,
+		unsigned int *a, unsigned int *b)
+{
+	unsigned long fscl = *f, best_fscl = *f, actual_fscl, temp;
+	unsigned int div_a, div_b, calc_div_a = 0, calc_div_b = 0;
+	unsigned int last_error, current_error;
+
+	/* calculate (divisor_a+1) x (divisor_b+1) */
+	temp = input_clk / (22 * fscl);
+
+	/*
+	 * If the calculated value is negative or 0CDNS_I2C_DIVA_MAX,
+	 * the fscl input is out of range. Return error.
+	 */
+	if (!temp || (temp > (CDNS_I2C_DIVA_MAX * CDNS_I2C_DIVB_MAX)))
+		return -EINVAL;
+
+	last_error = -1;
+	for (div_a = 0; div_a < CDNS_I2C_DIVA_MAX; div_a++) {
+		div_b = DIV_ROUND_UP(input_clk, 22 * fscl * (div_a + 1));
+
+		if ((div_b < 1) || (div_b > CDNS_I2C_DIVB_MAX))
+			continue;
+		div_b--;
+
+		actual_fscl = input_clk / (22 * (div_a + 1) * (div_b + 1));
+
+		if (actual_fscl > fscl)
+			continue;
+
+		current_error = ((actual_fscl > fscl) ? (actual_fscl - fscl) :
+							(fscl - actual_fscl));
+
+		if (last_error > current_error) {
+			calc_div_a = div_a;
+			calc_div_b = div_b;
+			best_fscl = actual_fscl;
+			last_error = current_error;
+		}
+	}
+
+	*a = calc_div_a;
+	*b = calc_div_b;
+	*f = best_fscl;
+
+	return 0;
+}
+
 static int cdns_i2c_set_bus_speed(struct udevice *dev, unsigned int speed)
 {
-	if (speed != 100000) {
-		printf("%s, failed to set clock speed to %u\n", __func__,
-		       speed);
+	struct i2c_cdns_bus *bus = dev_get_priv(dev);
+	u32 div_a = 0, div_b = 0;
+	unsigned long speed_p = speed;
+	int ret = 0;
+
+	if (speed > 400000) {
+		debug("%s, failed to set clock speed to %u\n", __func__,
+		      speed);
 		return -EINVAL;
 	}
 
+	ret = cdns_i2c_calc_divs(&speed_p, bus->input_freq, &div_a, &div_b);
+	if (ret)
+		return ret;
+
+	debug("%s: div_a: %d, div_b: %d, input freq: %d, speed: %d/%ld\n",
+	      __func__, div_a, div_b, bus->input_freq, speed, speed_p);
+
+	writel((div_b << CDNS_I2C_CONTROL_DIV_B_SHIFT) |
+	       (div_a << CDNS_I2C_CONTROL_DIV_A_SHIFT), &bus->regs->control);
+
+	/* Enable master mode, ack, and 7-bit addressing */
+	setbits_le32(&bus->regs->control, CDNS_I2C_CONTROL_MS |
+		CDNS_I2C_CONTROL_ACKEN | CDNS_I2C_CONTROL_NEA);
+
 	return 0;
 }
 
@@ -313,6 +345,19 @@
 	return 0;
 }
 
+static int cdns_i2c_ofdata_to_platdata(struct udevice *dev)
+{
+	struct i2c_cdns_bus *i2c_bus = dev_get_priv(dev);
+
+	i2c_bus->regs = (struct cdns_i2c_regs *)dev_get_addr(dev);
+	if (!i2c_bus->regs)
+		return -ENOMEM;
+
+	i2c_bus->input_freq = 100000000; /* TODO hardcode input freq for now */
+
+	return 0;
+}
+
 static const struct dm_i2c_ops cdns_i2c_ops = {
 	.xfer = cdns_i2c_xfer,
 	.probe_chip = cdns_i2c_probe_chip,
@@ -328,8 +373,7 @@
 	.name = "i2c-cdns",
 	.id = UCLASS_I2C,
 	.of_match = cdns_i2c_of_match,
-	.probe = cdns_i2c_probe,
-	.remove = cdns_i2c_remove,
+	.ofdata_to_platdata = cdns_i2c_ofdata_to_platdata,
 	.priv_auto_alloc_size = sizeof(struct i2c_cdns_bus),
 	.ops = &cdns_i2c_ops,
 };
diff --git a/drivers/i2c/muxes/Kconfig b/drivers/i2c/muxes/Kconfig
index f959d9d..48900ed 100644
--- a/drivers/i2c/muxes/Kconfig
+++ b/drivers/i2c/muxes/Kconfig
@@ -24,3 +24,13 @@
 	  I2C multimaster arbitration scheme using GPIOs and a challenge &
 	  response mechanism where masters have to claim the bus by asserting
 	  a GPIO.
+
+config I2C_MUX_PCA954x
+	tristate "TI PCA954x I2C Mux/switches"
+	depends on I2C_MUX
+	help
+	  If you say yes here you get support for the TI PCA954x
+	  I2C mux/switch devices. It is x width I2C multiplexer which enables to
+	  paritioning I2C bus and connect multiple devices with the same address
+	  to the same I2C controller where driver handles proper routing to
+	  target i2c device. PCA9544 and PCA9548 are supported.
diff --git a/drivers/i2c/muxes/Makefile b/drivers/i2c/muxes/Makefile
index 47c1240..0811add 100644
--- a/drivers/i2c/muxes/Makefile
+++ b/drivers/i2c/muxes/Makefile
@@ -5,3 +5,4 @@
 #
 obj-$(CONFIG_I2C_ARB_GPIO_CHALLENGE) += i2c-arb-gpio-challenge.o
 obj-$(CONFIG_$(SPL_)I2C_MUX) += i2c-mux-uclass.o
+obj-$(CONFIG_I2C_MUX_PCA954x) += pca954x.o
diff --git a/drivers/i2c/muxes/pca954x.c b/drivers/i2c/muxes/pca954x.c
new file mode 100644
index 0000000..7e0d2da
--- /dev/null
+++ b/drivers/i2c/muxes/pca954x.c
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2015 - 2016 Xilinx, Inc.
+ * Written by Michal Simek
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <i2c.h>
+#include <asm/gpio.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+struct pca954x_priv {
+	u32 addr; /* I2C mux address */
+	u32 width; /* I2C mux width - number of busses */
+};
+
+static int pca954x_deselect(struct udevice *mux, struct udevice *bus,
+			    uint channel)
+{
+	struct pca954x_priv *priv = dev_get_priv(mux);
+	uchar byte = 0;
+
+	return dm_i2c_write(mux, priv->addr, &byte, 1);
+}
+
+static int pca954x_select(struct udevice *mux, struct udevice *bus,
+			  uint channel)
+{
+	struct pca954x_priv *priv = dev_get_priv(mux);
+	uchar byte = 1 << channel;
+
+	return dm_i2c_write(mux, priv->addr, &byte, 1);
+}
+
+static const struct i2c_mux_ops pca954x_ops = {
+	.select = pca954x_select,
+	.deselect = pca954x_deselect,
+};
+
+static const struct udevice_id pca954x_ids[] = {
+	{ .compatible = "nxp,pca9548", .data = (ulong)8 },
+	{ .compatible = "nxp,pca9544", .data = (ulong)4 },
+	{ }
+};
+
+static int pca954x_ofdata_to_platdata(struct udevice *dev)
+{
+	struct pca954x_priv *priv = dev_get_priv(dev);
+
+	priv->addr = fdtdec_get_int(gd->fdt_blob, dev->of_offset, "reg", 0);
+	if (!priv->addr) {
+		debug("MUX not found\n");
+		return -ENODEV;
+	}
+	priv->width = dev_get_driver_data(dev);
+
+	if (!priv->width) {
+		debug("No I2C MUX width specified\n");
+		return -EINVAL;
+	}
+
+	debug("Device %s at 0x%x with width %d\n",
+	      dev->name, priv->addr, priv->width);
+
+	return 0;
+}
+
+U_BOOT_DRIVER(pca954x) = {
+	.name = "pca954x",
+	.id = UCLASS_I2C_MUX,
+	.of_match = pca954x_ids,
+	.ops = &pca954x_ops,
+	.ofdata_to_platdata = pca954x_ofdata_to_platdata,
+	.priv_auto_alloc_size = sizeof(struct pca954x_priv),
+};
diff --git a/drivers/i2c/mvtwsi.c b/drivers/i2c/mvtwsi.c
index 221ff4f..bf44432 100644
--- a/drivers/i2c/mvtwsi.c
+++ b/drivers/i2c/mvtwsi.c
@@ -185,26 +185,17 @@
 }
 
 /*
- * These flags are ORed to any write to the control register
- * They allow global setting of TWSIEN and ACK.
- * By default none are set.
- * twsi_start() sets TWSIEN (in case the controller was disabled)
- * twsi_recv() sets ACK or resets it depending on expected status.
- */
-static u8 twsi_control_flags = MVTWSI_CONTROL_TWSIEN;
-
-/*
  * Assert the START condition, either in a single I2C transaction
  * or inside back-to-back ones (repeated starts).
  */
-static int twsi_start(struct i2c_adapter *adap, int expected_status)
+static int twsi_start(struct i2c_adapter *adap, int expected_status, u8 *flags)
 {
 	struct mvtwsi_registers *twsi = twsi_get_base(adap);
 
 	/* globally set TWSIEN in case it was not */
-	twsi_control_flags |= MVTWSI_CONTROL_TWSIEN;
+	*flags |= MVTWSI_CONTROL_TWSIEN;
 	/* assert START */
-	writel(twsi_control_flags | MVTWSI_CONTROL_START |
+	writel(*flags | MVTWSI_CONTROL_START |
 				    MVTWSI_CONTROL_CLEAR_IFLG, &twsi->control);
 	/* wait for controller to process START */
 	return twsi_wait(adap, expected_status);
@@ -213,14 +204,15 @@
 /*
  * Send a byte (i2c address or data).
  */
-static int twsi_send(struct i2c_adapter *adap, u8 byte, int expected_status)
+static int twsi_send(struct i2c_adapter *adap, u8 byte, int expected_status,
+		     u8 *flags)
 {
 	struct mvtwsi_registers *twsi = twsi_get_base(adap);
 
 	/* put byte in data register for sending */
 	writel(byte, &twsi->data);
 	/* clear any pending interrupt -- that'll cause sending */
-	writel(twsi_control_flags | MVTWSI_CONTROL_CLEAR_IFLG, &twsi->control);
+	writel(*flags | MVTWSI_CONTROL_CLEAR_IFLG, &twsi->control);
 	/* wait for controller to receive byte and check ACK */
 	return twsi_wait(adap, expected_status);
 }
@@ -229,18 +221,18 @@
  * Receive a byte.
  * Global mvtwsi_control_flags variable says if we should ack or nak.
  */
-static int twsi_recv(struct i2c_adapter *adap, u8 *byte)
+static int twsi_recv(struct i2c_adapter *adap, u8 *byte, u8 *flags)
 {
 	struct mvtwsi_registers *twsi = twsi_get_base(adap);
 	int expected_status, status;
 
 	/* compute expected status based on ACK bit in global control flags */
-	if (twsi_control_flags & MVTWSI_CONTROL_ACK)
+	if (*flags & MVTWSI_CONTROL_ACK)
 		expected_status = MVTWSI_STATUS_DATA_R_ACK;
 	else
 		expected_status = MVTWSI_STATUS_DATA_R_NAK;
 	/* acknowledge *previous state* and launch receive */
-	writel(twsi_control_flags | MVTWSI_CONTROL_CLEAR_IFLG, &twsi->control);
+	writel(*flags | MVTWSI_CONTROL_CLEAR_IFLG, &twsi->control);
 	/* wait for controller to receive byte and assert ACK or NAK */
 	status = twsi_wait(adap, expected_status);
 	/* if we did receive expected byte then store it */
@@ -296,8 +288,7 @@
 static void twsi_reset(struct i2c_adapter *adap)
 {
 	struct mvtwsi_registers *twsi = twsi_get_base(adap);
-	/* ensure controller will be enabled by any twsi*() function */
-	twsi_control_flags = MVTWSI_CONTROL_TWSIEN;
+
 	/* reset controller */
 	writel(0, &twsi->soft_reset);
 	/* wait 2 ms -- this is what the Marvell LSP does */
@@ -353,7 +344,7 @@
  * Expected address status will derive from direction bit (bit 0) in addr.
  */
 static int i2c_begin(struct i2c_adapter *adap, int expected_start_status,
-		     u8 addr)
+		     u8 addr, u8 *flags)
 {
 	int status, expected_addr_status;
 
@@ -363,10 +354,11 @@
 	else /* writing */
 		expected_addr_status = MVTWSI_STATUS_ADDR_W_ACK;
 	/* assert START */
-	status = twsi_start(adap, expected_start_status);
+	status = twsi_start(adap, expected_start_status, flags);
 	/* send out the address if the start went well */
 	if (status == 0)
-		status = twsi_send(adap, addr, expected_addr_status);
+		status = twsi_send(adap, addr, expected_addr_status,
+				   flags);
 	/* return ok or status of first failure to caller */
 	return status;
 }
@@ -378,13 +370,14 @@
 static int twsi_i2c_probe(struct i2c_adapter *adap, uchar chip)
 {
 	u8 dummy_byte;
+	u8 flags = 0;
 	int status;
 
 	/* begin i2c read */
-	status = i2c_begin(adap, MVTWSI_STATUS_START, (chip << 1) | 1);
+	status = i2c_begin(adap, MVTWSI_STATUS_START, (chip << 1) | 1, &flags);
 	/* dummy read was accepted: receive byte but NAK it. */
 	if (status == 0)
-		status = twsi_recv(adap, &dummy_byte);
+		status = twsi_recv(adap, &dummy_byte, &flags);
 	/* Stop transaction */
 	twsi_stop(adap, 0);
 	/* return 0 or status of first failure */
@@ -405,27 +398,28 @@
 			int alen, uchar *data, int length)
 {
 	int status;
+	u8 flags = 0;
 
 	/* begin i2c write to send the address bytes */
-	status = i2c_begin(adap, MVTWSI_STATUS_START, (chip << 1));
+	status = i2c_begin(adap, MVTWSI_STATUS_START, (chip << 1), &flags);
 	/* send addr bytes */
 	while ((status == 0) && alen--)
 		status = twsi_send(adap, addr >> (8*alen),
-			MVTWSI_STATUS_DATA_W_ACK);
+			MVTWSI_STATUS_DATA_W_ACK, &flags);
 	/* begin i2c read to receive eeprom data bytes */
 	if (status == 0)
 		status = i2c_begin(adap, MVTWSI_STATUS_REPEATED_START,
-				   (chip << 1) | 1);
+				   (chip << 1) | 1, &flags);
 	/* prepare ACK if at least one byte must be received */
 	if (length > 0)
-		twsi_control_flags |= MVTWSI_CONTROL_ACK;
+		flags |= MVTWSI_CONTROL_ACK;
 	/* now receive actual bytes */
 	while ((status == 0) && length--) {
 		/* reset NAK if we if no more to read now */
 		if (length == 0)
-			twsi_control_flags &= ~MVTWSI_CONTROL_ACK;
+			flags &= ~MVTWSI_CONTROL_ACK;
 		/* read current byte */
-		status = twsi_recv(adap, data++);
+		status = twsi_recv(adap, data++, &flags);
 	}
 	/* Stop transaction */
 	status = twsi_stop(adap, status);
@@ -441,16 +435,18 @@
 			int alen, uchar *data, int length)
 {
 	int status;
+	u8 flags = 0;
 
 	/* begin i2c write to send the eeprom adress bytes then data bytes */
-	status = i2c_begin(adap, MVTWSI_STATUS_START, (chip << 1));
+	status = i2c_begin(adap, MVTWSI_STATUS_START, (chip << 1), &flags);
 	/* send addr bytes */
 	while ((status == 0) && alen--)
 		status = twsi_send(adap, addr >> (8*alen),
-			MVTWSI_STATUS_DATA_W_ACK);
+			MVTWSI_STATUS_DATA_W_ACK, &flags);
 	/* send data bytes */
 	while ((status == 0) && (length-- > 0))
-		status = twsi_send(adap, *(data++), MVTWSI_STATUS_DATA_W_ACK);
+		status = twsi_send(adap, *(data++), MVTWSI_STATUS_DATA_W_ACK,
+				   &flags);
 	/* Stop transaction */
 	status = twsi_stop(adap, status);
 	/* return 0 or status of first failure */
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index af8667f..c40f6b5 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -138,4 +138,10 @@
 	  legacy UART or other devices in the Winbond Super IO chips
 	  on X86 platforms.
 
+config QFW
+	bool
+	help
+	  Hidden option to enable QEMU fw_cfg interface. This will be selected by
+	  either CONFIG_CMD_QFW or CONFIG_GENERATE_ACPI_TABLE.
+
 endmenu
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index 5969d34..98704f2 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -43,3 +43,4 @@
 obj-$(CONFIG_RESET) += reset-uclass.o
 obj-$(CONFIG_FSL_DEVICE_DISABLE) += fsl_devdis.o
 obj-$(CONFIG_WINBOND_W83627) += winbond_w83627.o
+obj-$(CONFIG_QFW) += qfw.o
diff --git a/drivers/misc/qfw.c b/drivers/misc/qfw.c
new file mode 100644
index 0000000..d43d1d3
--- /dev/null
+++ b/drivers/misc/qfw.c
@@ -0,0 +1,386 @@
+/*
+ * (C) Copyright 2015 Miao Yan <yanmiaobest@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <command.h>
+#include <errno.h>
+#include <malloc.h>
+#include <qfw.h>
+#include <asm/io.h>
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+#include <asm/tables.h>
+#endif
+#include <linux/list.h>
+
+static bool fwcfg_present;
+static bool fwcfg_dma_present;
+static struct fw_cfg_arch_ops *fwcfg_arch_ops;
+
+static LIST_HEAD(fw_list);
+
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+/*
+ * This function allocates memory for ACPI tables
+ *
+ * @entry : BIOS linker command entry which tells where to allocate memory
+ *          (either high memory or low memory)
+ * @addr  : The address that should be used for low memory allcation. If the
+ *          memory allocation request is 'ZONE_HIGH' then this parameter will
+ *          be ignored.
+ * @return: 0 on success, or negative value on failure
+ */
+static int bios_linker_allocate(struct bios_linker_entry *entry, u32 *addr)
+{
+	uint32_t size, align;
+	struct fw_file *file;
+	unsigned long aligned_addr;
+
+	align = le32_to_cpu(entry->alloc.align);
+	/* align must be power of 2 */
+	if (align & (align - 1)) {
+		printf("error: wrong alignment %u\n", align);
+		return -EINVAL;
+	}
+
+	file = qemu_fwcfg_find_file(entry->alloc.file);
+	if (!file) {
+		printf("error: can't find file %s\n", entry->alloc.file);
+		return -ENOENT;
+	}
+
+	size = be32_to_cpu(file->cfg.size);
+
+	/*
+	 * ZONE_HIGH means we need to allocate from high memory, since
+	 * malloc space is already at the end of RAM, so we directly use it.
+	 * If allocation zone is ZONE_FSEG, then we use the 'addr' passed
+	 * in which is low memory
+	 */
+	if (entry->alloc.zone == BIOS_LINKER_LOADER_ALLOC_ZONE_HIGH) {
+		aligned_addr = (unsigned long)memalign(align, size);
+		if (!aligned_addr) {
+			printf("error: allocating resource\n");
+			return -ENOMEM;
+		}
+	} else if (entry->alloc.zone == BIOS_LINKER_LOADER_ALLOC_ZONE_FSEG) {
+		aligned_addr = ALIGN(*addr, align);
+	} else {
+		printf("error: invalid allocation zone\n");
+		return -EINVAL;
+	}
+
+	debug("bios_linker_allocate: allocate file %s, size %u, zone %d, align %u, addr 0x%lx\n",
+	      file->cfg.name, size, entry->alloc.zone, align, aligned_addr);
+
+	qemu_fwcfg_read_entry(be16_to_cpu(file->cfg.select),
+			      size, (void *)aligned_addr);
+	file->addr = aligned_addr;
+
+	/* adjust address for low memory allocation */
+	if (entry->alloc.zone == BIOS_LINKER_LOADER_ALLOC_ZONE_FSEG)
+		*addr = (aligned_addr + size);
+
+	return 0;
+}
+
+/*
+ * This function patches ACPI tables previously loaded
+ * by bios_linker_allocate()
+ *
+ * @entry : BIOS linker command entry which tells how to patch
+ *          ACPI tables
+ * @return: 0 on success, or negative value on failure
+ */
+static int bios_linker_add_pointer(struct bios_linker_entry *entry)
+{
+	struct fw_file *dest, *src;
+	uint32_t offset = le32_to_cpu(entry->pointer.offset);
+	uint64_t pointer = 0;
+
+	dest = qemu_fwcfg_find_file(entry->pointer.dest_file);
+	if (!dest || !dest->addr)
+		return -ENOENT;
+	src = qemu_fwcfg_find_file(entry->pointer.src_file);
+	if (!src || !src->addr)
+		return -ENOENT;
+
+	debug("bios_linker_add_pointer: dest->addr 0x%lx, src->addr 0x%lx, offset 0x%x size %u, 0x%llx\n",
+	      dest->addr, src->addr, offset, entry->pointer.size, pointer);
+
+	memcpy(&pointer, (char *)dest->addr + offset, entry->pointer.size);
+	pointer	= le64_to_cpu(pointer);
+	pointer += (unsigned long)src->addr;
+	pointer	= cpu_to_le64(pointer);
+	memcpy((char *)dest->addr + offset, &pointer, entry->pointer.size);
+
+	return 0;
+}
+
+/*
+ * This function updates checksum fields of ACPI tables previously loaded
+ * by bios_linker_allocate()
+ *
+ * @entry : BIOS linker command entry which tells where to update ACPI table
+ *          checksums
+ * @return: 0 on success, or negative value on failure
+ */
+static int bios_linker_add_checksum(struct bios_linker_entry *entry)
+{
+	struct fw_file *file;
+	uint8_t *data, cksum = 0;
+	uint8_t *cksum_start;
+
+	file = qemu_fwcfg_find_file(entry->cksum.file);
+	if (!file || !file->addr)
+		return -ENOENT;
+
+	data = (uint8_t *)(file->addr + le32_to_cpu(entry->cksum.offset));
+	cksum_start = (uint8_t *)(file->addr + le32_to_cpu(entry->cksum.start));
+	cksum = table_compute_checksum(cksum_start,
+				       le32_to_cpu(entry->cksum.length));
+	*data = cksum;
+
+	return 0;
+}
+
+/* This function loads and patches ACPI tables provided by QEMU */
+u32 write_acpi_tables(u32 addr)
+{
+	int i, ret = 0;
+	struct fw_file *file;
+	struct bios_linker_entry *table_loader;
+	struct bios_linker_entry *entry;
+	uint32_t size;
+
+	/* make sure fw_list is loaded */
+	ret = qemu_fwcfg_read_firmware_list();
+	if (ret) {
+		printf("error: can't read firmware file list\n");
+		return addr;
+	}
+
+	file = qemu_fwcfg_find_file("etc/table-loader");
+	if (!file) {
+		printf("error: can't find etc/table-loader\n");
+		return addr;
+	}
+
+	size = be32_to_cpu(file->cfg.size);
+	if ((size % sizeof(*entry)) != 0) {
+		printf("error: table-loader maybe corrupted\n");
+		return addr;
+	}
+
+	table_loader = malloc(size);
+	if (!table_loader) {
+		printf("error: no memory for table-loader\n");
+		return addr;
+	}
+
+	qemu_fwcfg_read_entry(be16_to_cpu(file->cfg.select),
+			      size, table_loader);
+
+	for (i = 0; i < (size / sizeof(*entry)); i++) {
+		entry = table_loader + i;
+		switch (le32_to_cpu(entry->command)) {
+		case BIOS_LINKER_LOADER_COMMAND_ALLOCATE:
+			ret = bios_linker_allocate(entry, &addr);
+			if (ret)
+				goto out;
+			break;
+		case BIOS_LINKER_LOADER_COMMAND_ADD_POINTER:
+			ret = bios_linker_add_pointer(entry);
+			if (ret)
+				goto out;
+			break;
+		case BIOS_LINKER_LOADER_COMMAND_ADD_CHECKSUM:
+			ret = bios_linker_add_checksum(entry);
+			if (ret)
+				goto out;
+			break;
+		default:
+			break;
+		}
+	}
+
+out:
+	if (ret) {
+		struct fw_cfg_file_iter iter;
+		for (file = qemu_fwcfg_file_iter_init(&iter);
+		     !qemu_fwcfg_file_iter_end(&iter);
+		     file = qemu_fwcfg_file_iter_next(&iter)) {
+			if (file->addr) {
+				free((void *)file->addr);
+				file->addr = 0;
+			}
+		}
+	}
+
+	free(table_loader);
+	return addr;
+}
+#endif
+
+/* Read configuration item using fw_cfg PIO interface */
+static void qemu_fwcfg_read_entry_pio(uint16_t entry,
+		uint32_t size, void *address)
+{
+	debug("qemu_fwcfg_read_entry_pio: entry 0x%x, size %u address %p\n",
+	      entry, size, address);
+
+	return fwcfg_arch_ops->arch_read_pio(entry, size, address);
+}
+
+/* Read configuration item using fw_cfg DMA interface */
+static void qemu_fwcfg_read_entry_dma(uint16_t entry,
+		uint32_t size, void *address)
+{
+	struct fw_cfg_dma_access dma;
+
+	dma.length = cpu_to_be32(size);
+	dma.address = cpu_to_be64((uintptr_t)address);
+	dma.control = cpu_to_be32(FW_CFG_DMA_READ);
+
+	/*
+	 * writting FW_CFG_INVALID will cause read operation to resume at
+	 * last offset, otherwise read will start at offset 0
+	 */
+	if (entry != FW_CFG_INVALID)
+		dma.control |= cpu_to_be32(FW_CFG_DMA_SELECT | (entry << 16));
+
+	barrier();
+
+	debug("qemu_fwcfg_read_entry_dma: entry 0x%x, size %u address %p, control 0x%x\n",
+	      entry, size, address, be32_to_cpu(dma.control));
+
+	fwcfg_arch_ops->arch_read_dma(&dma);
+}
+
+bool qemu_fwcfg_present(void)
+{
+	return fwcfg_present;
+}
+
+bool qemu_fwcfg_dma_present(void)
+{
+	return fwcfg_dma_present;
+}
+
+void qemu_fwcfg_read_entry(uint16_t entry, uint32_t length, void *address)
+{
+	if (fwcfg_dma_present)
+		qemu_fwcfg_read_entry_dma(entry, length, address);
+	else
+		qemu_fwcfg_read_entry_pio(entry, length, address);
+}
+
+int qemu_fwcfg_online_cpus(void)
+{
+	uint16_t nb_cpus;
+
+	if (!fwcfg_present)
+		return -ENODEV;
+
+	qemu_fwcfg_read_entry(FW_CFG_NB_CPUS, 2, &nb_cpus);
+
+	return le16_to_cpu(nb_cpus);
+}
+
+int qemu_fwcfg_read_firmware_list(void)
+{
+	int i;
+	uint32_t count;
+	struct fw_file *file;
+	struct list_head *entry;
+
+	/* don't read it twice */
+	if (!list_empty(&fw_list))
+		return 0;
+
+	qemu_fwcfg_read_entry(FW_CFG_FILE_DIR, 4, &count);
+	if (!count)
+		return 0;
+
+	count = be32_to_cpu(count);
+	for (i = 0; i < count; i++) {
+		file = malloc(sizeof(*file));
+		if (!file) {
+			printf("error: allocating resource\n");
+			goto err;
+		}
+		qemu_fwcfg_read_entry(FW_CFG_INVALID,
+				      sizeof(struct fw_cfg_file), &file->cfg);
+		file->addr = 0;
+		list_add_tail(&file->list, &fw_list);
+	}
+
+	return 0;
+
+err:
+	list_for_each(entry, &fw_list) {
+		file = list_entry(entry, struct fw_file, list);
+		free(file);
+	}
+
+	return -ENOMEM;
+}
+
+struct fw_file *qemu_fwcfg_find_file(const char *name)
+{
+	struct list_head *entry;
+	struct fw_file *file;
+
+	list_for_each(entry, &fw_list) {
+		file = list_entry(entry, struct fw_file, list);
+		if (!strcmp(file->cfg.name, name))
+			return file;
+	}
+
+	return NULL;
+}
+
+struct fw_file *qemu_fwcfg_file_iter_init(struct fw_cfg_file_iter *iter)
+{
+	iter->entry = fw_list.next;
+	return list_entry((struct list_head *)iter->entry,
+			  struct fw_file, list);
+}
+
+struct fw_file *qemu_fwcfg_file_iter_next(struct fw_cfg_file_iter *iter)
+{
+	iter->entry = ((struct list_head *)iter->entry)->next;
+	return list_entry((struct list_head *)iter->entry,
+			  struct fw_file, list);
+}
+
+bool qemu_fwcfg_file_iter_end(struct fw_cfg_file_iter *iter)
+{
+	return iter->entry == &fw_list;
+}
+
+void qemu_fwcfg_init(struct fw_cfg_arch_ops *ops)
+{
+	uint32_t qemu;
+	uint32_t dma_enabled;
+
+	fwcfg_present = false;
+	fwcfg_dma_present = false;
+	fwcfg_arch_ops = NULL;
+
+	if (!ops || !ops->arch_read_pio || !ops->arch_read_dma)
+		return;
+	fwcfg_arch_ops = ops;
+
+	qemu_fwcfg_read_entry_pio(FW_CFG_SIGNATURE, 4, &qemu);
+	if (be32_to_cpu(qemu) == QEMU_FW_CFG_SIGNATURE)
+		fwcfg_present = true;
+
+	if (fwcfg_present) {
+		qemu_fwcfg_read_entry_pio(FW_CFG_ID, 1, &dma_enabled);
+		if (dma_enabled & FW_CFG_DMA_ENABLED)
+			fwcfg_dma_present = true;
+	}
+}
diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig
index 4d3df11..c80efc3 100644
--- a/drivers/mmc/Kconfig
+++ b/drivers/mmc/Kconfig
@@ -2,7 +2,7 @@
 
 config MMC
 	bool "Enable MMC support"
-	depends on ARCH_SUNXI
+	depends on ARCH_SUNXI || SANDBOX
 	help
 	  TODO: Move all architectures to use this option
 
@@ -58,4 +58,13 @@
 	help
 	  This selects support for the SD/MMC Host Controller on UniPhier SoCs.
 
+config SANDBOX_MMC
+	bool "Sandbox MMC support"
+	depends on MMC && SANDBOX
+	help
+	  This select a dummy sandbox MMC driver. At present this does nothing
+	  other than allow sandbox to be build with MMC support. This
+	  improves build coverage for sandbox and makes it easier to detect
+	  MMC build errors with sandbox.
+
 endmenu
diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile
index 585aaf3..3da4817 100644
--- a/drivers/mmc/Makefile
+++ b/drivers/mmc/Makefile
@@ -5,7 +5,13 @@
 # SPDX-License-Identifier:	GPL-2.0+
 #
 
-obj-$(CONFIG_DM_MMC) += mmc-uclass.o
+ifdef CONFIG_DM_MMC
+obj-$(CONFIG_GENERIC_MMC) += mmc-uclass.o
+endif
+
+ifndef CONFIG_BLK
+obj-$(CONFIG_GENERIC_MMC) += mmc_legacy.o
+endif
 
 obj-$(CONFIG_ARM_PL180_MMCI) += arm_pl180_mmci.o
 obj-$(CONFIG_ATMEL_SDHCI) += atmel_sdhci.o
@@ -34,7 +40,11 @@
 obj-$(CONFIG_SUPPORT_EMMC_RPMB) += rpmb.o
 obj-$(CONFIG_S3C_SDI) += s3c_sdi.o
 obj-$(CONFIG_S5P_SDHCI) += s5p_sdhci.o
+ifdef CONFIG_BLK
+ifdef CONFIG_GENERIC_MMC
 obj-$(CONFIG_SANDBOX) += sandbox_mmc.o
+endif
+endif
 obj-$(CONFIG_SDHCI) += sdhci.o
 obj-$(CONFIG_SH_MMCIF) += sh_mmcif.o
 obj-$(CONFIG_SH_SDHI) += sh_sdhi.o
diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c
index 777489f..1b967d9 100644
--- a/drivers/mmc/mmc-uclass.c
+++ b/drivers/mmc/mmc-uclass.c
@@ -21,6 +21,112 @@
 	return upriv->mmc;
 }
 
+#ifdef CONFIG_BLK
+struct mmc *find_mmc_device(int dev_num)
+{
+	struct udevice *dev, *mmc_dev;
+	int ret;
+
+	ret = blk_get_device(IF_TYPE_MMC, dev_num, &dev);
+
+	if (ret) {
+#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
+		printf("MMC Device %d not found\n", dev_num);
+#endif
+		return NULL;
+	}
+
+	mmc_dev = dev_get_parent(dev);
+
+	return mmc_get_mmc_dev(mmc_dev);
+}
+
+int get_mmc_num(void)
+{
+	return max(blk_find_max_devnum(IF_TYPE_MMC), 0);
+}
+
+int mmc_get_next_devnum(void)
+{
+	int ret;
+
+	ret = get_mmc_num();
+	if (ret < 0)
+		return ret;
+
+	return ret + 1;
+}
+
+struct blk_desc *mmc_get_blk_desc(struct mmc *mmc)
+{
+	struct blk_desc *desc;
+	struct udevice *dev;
+
+	device_find_first_child(mmc->dev, &dev);
+	if (!dev)
+		return NULL;
+	desc = dev_get_uclass_platdata(dev);
+
+	return desc;
+}
+
+void mmc_do_preinit(void)
+{
+	struct udevice *dev;
+	struct uclass *uc;
+	int ret;
+
+	ret = uclass_get(UCLASS_MMC, &uc);
+	if (ret)
+		return;
+	uclass_foreach_dev(dev, uc) {
+		struct mmc *m = mmc_get_mmc_dev(dev);
+
+		if (!m)
+			continue;
+#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
+		mmc_set_preinit(m, 1);
+#endif
+		if (m->preinit)
+			mmc_start_init(m);
+	}
+}
+
+#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
+void print_mmc_devices(char separator)
+{
+	struct udevice *dev;
+	char *mmc_type;
+	bool first = true;
+
+	for (uclass_first_device(UCLASS_MMC, &dev);
+	     dev;
+	     uclass_next_device(&dev)) {
+		struct mmc *m = mmc_get_mmc_dev(dev);
+
+		if (!first) {
+			printf("%c", separator);
+			if (separator != '\n')
+				puts(" ");
+		}
+		if (m->has_init)
+			mmc_type = IS_SD(m) ? "SD" : "eMMC";
+		else
+			mmc_type = NULL;
+
+		printf("%s: %d", m->cfg->name, mmc_get_blk_desc(m)->devnum);
+		if (mmc_type)
+			printf(" (%s)", mmc_type);
+	}
+
+	printf("\n");
+}
+
+#else
+void print_mmc_devices(char separator) { }
+#endif
+#endif /* CONFIG_BLK */
+
 U_BOOT_DRIVER(mmc) = {
 	.name	= "mmc",
 	.id	= UCLASS_MMC,
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index d3c22ab..74b3d68 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -21,9 +21,6 @@
 #include <div64.h>
 #include "mmc_private.h"
 
-static struct list_head mmc_devices;
-static int cur_dev_num = -1;
-
 __weak int board_mmc_getwp(struct mmc *mmc)
 {
 	return -1;
@@ -178,25 +175,6 @@
 	return mmc_send_cmd(mmc, &cmd, NULL);
 }
 
-struct mmc *find_mmc_device(int dev_num)
-{
-	struct mmc *m;
-	struct list_head *entry;
-
-	list_for_each(entry, &mmc_devices) {
-		m = list_entry(entry, struct mmc, link);
-
-		if (m->block_dev.devnum == dev_num)
-			return m;
-	}
-
-#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
-	printf("MMC Device %d not found\n", dev_num);
-#endif
-
-	return NULL;
-}
-
 static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
 			   lbaint_t blkcnt)
 {
@@ -238,9 +216,17 @@
 	return blkcnt;
 }
 
+#ifdef CONFIG_BLK
+static ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
+		       void *dst)
+#else
 static ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start,
 		       lbaint_t blkcnt, void *dst)
+#endif
 {
+#ifdef CONFIG_BLK
+	struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
+#endif
 	int dev_num = block_dev->devnum;
 	int err;
 	lbaint_t cur, blocks_todo = blkcnt;
@@ -252,14 +238,14 @@
 	if (!mmc)
 		return 0;
 
-	err = mmc_select_hwpart(dev_num, block_dev->hwpart);
+	err = blk_dselect_hwpart(block_dev, block_dev->hwpart);
 	if (err < 0)
 		return 0;
 
-	if ((start + blkcnt) > mmc->block_dev.lba) {
+	if ((start + blkcnt) > block_dev->lba) {
 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
 		printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
-			start + blkcnt, mmc->block_dev.lba);
+			start + blkcnt, block_dev->lba);
 #endif
 		return 0;
 	}
@@ -577,43 +563,15 @@
 		return -1;
 	}
 
-	mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
+	mmc_get_blk_desc(mmc)->lba = lldiv(mmc->capacity, mmc->read_bl_len);
 
 	return 0;
 }
 
-int mmc_select_hwpart(int dev_num, int hwpart)
+static int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
 {
-	struct mmc *mmc = find_mmc_device(dev_num);
 	int ret;
 
-	if (!mmc)
-		return -ENODEV;
-
-	if (mmc->block_dev.hwpart == hwpart)
-		return 0;
-
-	if (mmc->part_config == MMCPART_NOAVAILABLE) {
-		printf("Card doesn't support part_switch\n");
-		return -EMEDIUMTYPE;
-	}
-
-	ret = mmc_switch_part(dev_num, hwpart);
-	if (ret)
-		return ret;
-
-	return 0;
-}
-
-
-int mmc_switch_part(int dev_num, unsigned int part_num)
-{
-	struct mmc *mmc = find_mmc_device(dev_num);
-	int ret;
-
-	if (!mmc)
-		return -1;
-
 	ret = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
 			 (mmc->part_config & ~PART_ACCESS_MASK)
 			 | (part_num & PART_ACCESS_MASK));
@@ -624,12 +582,55 @@
 	 */
 	if ((ret == 0) || ((ret == -ENODEV) && (part_num == 0))) {
 		ret = mmc_set_capacity(mmc, part_num);
-		mmc->block_dev.hwpart = part_num;
+		mmc_get_blk_desc(mmc)->hwpart = part_num;
 	}
 
 	return ret;
 }
 
+#ifdef CONFIG_BLK
+static int mmc_select_hwpart(struct udevice *bdev, int hwpart)
+{
+	struct udevice *mmc_dev = dev_get_parent(bdev);
+	struct mmc *mmc = mmc_get_mmc_dev(mmc_dev);
+	struct blk_desc *desc = dev_get_uclass_platdata(bdev);
+	int ret;
+
+	if (desc->hwpart == hwpart)
+		return 0;
+
+	if (mmc->part_config == MMCPART_NOAVAILABLE)
+		return -EMEDIUMTYPE;
+
+	ret = mmc_switch_part(mmc, hwpart);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+#else
+static int mmc_select_hwpartp(struct blk_desc *desc, int hwpart)
+{
+	struct mmc *mmc = find_mmc_device(desc->devnum);
+	int ret;
+
+	if (!mmc)
+		return -ENODEV;
+
+	if (mmc->block_dev.hwpart == hwpart)
+		return 0;
+
+	if (mmc->part_config == MMCPART_NOAVAILABLE)
+		return -EMEDIUMTYPE;
+
+	ret = mmc_switch_part(mmc, hwpart);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+#endif
+
 int mmc_hwpart_config(struct mmc *mmc,
 		      const struct mmc_hwpart_conf *conf,
 		      enum mmc_hwpart_conf_mode mode)
@@ -1039,6 +1040,7 @@
 	int timeout = 1000;
 	bool has_parts = false;
 	bool part_completed;
+	struct blk_desc *bdesc;
 
 #ifdef CONFIG_MMC_SPI_CRC_ON
 	if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
@@ -1335,7 +1337,7 @@
 		mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
 	}
 
-	err = mmc_set_capacity(mmc, mmc->block_dev.hwpart);
+	err = mmc_set_capacity(mmc, mmc_get_blk_desc(mmc)->hwpart);
 	if (err)
 		return err;
 
@@ -1475,31 +1477,32 @@
 	}
 
 	/* fill in device description */
-	mmc->block_dev.lun = 0;
-	mmc->block_dev.hwpart = 0;
-	mmc->block_dev.type = 0;
-	mmc->block_dev.blksz = mmc->read_bl_len;
-	mmc->block_dev.log2blksz = LOG2(mmc->block_dev.blksz);
-	mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
+	bdesc = mmc_get_blk_desc(mmc);
+	bdesc->lun = 0;
+	bdesc->hwpart = 0;
+	bdesc->type = 0;
+	bdesc->blksz = mmc->read_bl_len;
+	bdesc->log2blksz = LOG2(bdesc->blksz);
+	bdesc->lba = lldiv(mmc->capacity, mmc->read_bl_len);
 #if !defined(CONFIG_SPL_BUILD) || \
 		(defined(CONFIG_SPL_LIBCOMMON_SUPPORT) && \
 		!defined(CONFIG_USE_TINY_PRINTF))
-	sprintf(mmc->block_dev.vendor, "Man %06x Snr %04x%04x",
+	sprintf(bdesc->vendor, "Man %06x Snr %04x%04x",
 		mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
 		(mmc->cid[3] >> 16) & 0xffff);
-	sprintf(mmc->block_dev.product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
+	sprintf(bdesc->product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
 		(mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
 		(mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff,
 		(mmc->cid[2] >> 24) & 0xff);
-	sprintf(mmc->block_dev.revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
+	sprintf(bdesc->revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
 		(mmc->cid[2] >> 16) & 0xf);
 #else
-	mmc->block_dev.vendor[0] = 0;
-	mmc->block_dev.product[0] = 0;
-	mmc->block_dev.revision[0] = 0;
+	bdesc->vendor[0] = 0;
+	bdesc->product[0] = 0;
+	bdesc->revision[0] = 0;
 #endif
 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
-	part_init(&mmc->block_dev);
+	part_init(bdesc);
 #endif
 
 	return 0;
@@ -1537,8 +1540,55 @@
 	return -1;
 }
 
+#ifdef CONFIG_BLK
+int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
+{
+	struct blk_desc *bdesc;
+	struct udevice *bdev;
+	int ret;
+
+	ret = blk_create_devicef(dev, "mmc_blk", "blk", IF_TYPE_MMC, -1, 512,
+				 0, &bdev);
+	if (ret) {
+		debug("Cannot create block device\n");
+		return ret;
+	}
+	bdesc = dev_get_uclass_platdata(bdev);
+	mmc->cfg = cfg;
+	mmc->priv = dev;
+
+	/* the following chunk was from mmc_register() */
+
+	/* Setup dsr related values */
+	mmc->dsr_imp = 0;
+	mmc->dsr = 0xffffffff;
+	/* Setup the universal parts of the block interface just once */
+	bdesc->removable = 1;
+
+	/* setup initial part type */
+	bdesc->part_type = mmc->cfg->part_type;
+	mmc->dev = dev;
+
+	return 0;
+}
+
+int mmc_unbind(struct udevice *dev)
+{
+	struct udevice *bdev;
+
+	device_find_first_child(dev, &bdev);
+	if (bdev) {
+		device_remove(bdev);
+		device_unbind(bdev);
+	}
+
+	return 0;
+}
+
+#else
 struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
 {
+	struct blk_desc *bdesc;
 	struct mmc *mmc;
 
 	/* quick validation */
@@ -1559,19 +1609,17 @@
 	mmc->dsr_imp = 0;
 	mmc->dsr = 0xffffffff;
 	/* Setup the universal parts of the block interface just once */
-	mmc->block_dev.if_type = IF_TYPE_MMC;
-	mmc->block_dev.devnum = cur_dev_num++;
-	mmc->block_dev.removable = 1;
-	mmc->block_dev.block_read = mmc_bread;
-	mmc->block_dev.block_write = mmc_bwrite;
-	mmc->block_dev.block_erase = mmc_berase;
+	bdesc = mmc_get_blk_desc(mmc);
+	bdesc->if_type = IF_TYPE_MMC;
+	bdesc->removable = 1;
+	bdesc->devnum = mmc_get_next_devnum();
+	bdesc->block_read = mmc_bread;
+	bdesc->block_write = mmc_bwrite;
+	bdesc->block_erase = mmc_berase;
 
 	/* setup initial part type */
-	mmc->block_dev.part_type = mmc->cfg->part_type;
-
-	INIT_LIST_HEAD(&mmc->link);
-
-	list_add_tail(&mmc->link, &mmc_devices);
+	bdesc->part_type = mmc->cfg->part_type;
+	mmc_list_add(mmc);
 
 	return mmc;
 }
@@ -1581,15 +1629,23 @@
 	/* only freeing memory for now */
 	free(mmc);
 }
+#endif
 
-#ifdef CONFIG_PARTITIONS
-struct blk_desc *mmc_get_dev(int dev)
+#ifndef CONFIG_BLK
+static int mmc_get_dev(int dev, struct blk_desc **descp)
 {
 	struct mmc *mmc = find_mmc_device(dev);
-	if (!mmc || mmc_init(mmc))
-		return NULL;
+	int ret;
 
-	return &mmc->block_dev;
+	if (!mmc)
+		return -ENODEV;
+	ret = mmc_init(mmc);
+	if (ret)
+		return ret;
+
+	*descp = &mmc->block_dev;
+
+	return 0;
 }
 #endif
 
@@ -1636,7 +1692,7 @@
 		return err;
 
 	/* The internal partition reset to user partition(0) at every CMD0*/
-	mmc->block_dev.hwpart = 0;
+	mmc_get_blk_desc(mmc)->hwpart = 0;
 
 	/* Test for SD version 2 */
 	err = mmc_send_if_cond(mmc);
@@ -1683,7 +1739,11 @@
 {
 	int err = 0;
 	unsigned start;
+#ifdef CONFIG_DM_MMC
+	struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc->dev);
 
+	upriv->mmc = mmc;
+#endif
 	if (mmc->has_init)
 		return 0;
 
@@ -1716,66 +1776,11 @@
 	return -1;
 }
 
-#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
-
-void print_mmc_devices(char separator)
-{
-	struct mmc *m;
-	struct list_head *entry;
-	char *mmc_type;
-
-	list_for_each(entry, &mmc_devices) {
-		m = list_entry(entry, struct mmc, link);
-
-		if (m->has_init)
-			mmc_type = IS_SD(m) ? "SD" : "eMMC";
-		else
-			mmc_type = NULL;
-
-		printf("%s: %d", m->cfg->name, m->block_dev.devnum);
-		if (mmc_type)
-			printf(" (%s)", mmc_type);
-
-		if (entry->next != &mmc_devices) {
-			printf("%c", separator);
-			if (separator != '\n')
-				puts (" ");
-		}
-	}
-
-	printf("\n");
-}
-
-#else
-void print_mmc_devices(char separator) { }
-#endif
-
-int get_mmc_num(void)
-{
-	return cur_dev_num;
-}
-
 void mmc_set_preinit(struct mmc *mmc, int preinit)
 {
 	mmc->preinit = preinit;
 }
 
-static void do_preinit(void)
-{
-	struct mmc *m;
-	struct list_head *entry;
-
-	list_for_each(entry, &mmc_devices) {
-		m = list_entry(entry, struct mmc, link);
-
-#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
-		mmc_set_preinit(m, 1);
-#endif
-		if (m->preinit)
-			mmc_start_init(m);
-	}
-}
-
 #if defined(CONFIG_DM_MMC) && defined(CONFIG_SPL_BUILD)
 static int mmc_probe(bd_t *bis)
 {
@@ -1828,9 +1833,9 @@
 		return 0;
 	initialized = 1;
 
-	INIT_LIST_HEAD (&mmc_devices);
-	cur_dev_num = 0;
-
+#ifndef CONFIG_BLK
+	mmc_list_init();
+#endif
 	ret = mmc_probe(bis);
 	if (ret)
 		return ret;
@@ -1839,7 +1844,7 @@
 	print_mmc_devices(',');
 #endif
 
-	do_preinit();
+	mmc_do_preinit();
 	return 0;
 }
 
@@ -1965,3 +1970,25 @@
 			  enable);
 }
 #endif
+
+#ifdef CONFIG_BLK
+static const struct blk_ops mmc_blk_ops = {
+	.read	= mmc_bread,
+	.write	= mmc_bwrite,
+	.select_hwpart	= mmc_select_hwpart,
+};
+
+U_BOOT_DRIVER(mmc_blk) = {
+	.name		= "mmc_blk",
+	.id		= UCLASS_BLK,
+	.ops		= &mmc_blk_ops,
+};
+#else
+U_BOOT_LEGACY_BLK(mmc) = {
+	.if_typename	= "mmc",
+	.if_type	= IF_TYPE_MMC,
+	.max_devs	= -1,
+	.get_dev	= mmc_get_dev,
+	.select_hwpart	= mmc_select_hwpartp,
+};
+#endif
diff --git a/drivers/mmc/mmc_legacy.c b/drivers/mmc/mmc_legacy.c
new file mode 100644
index 0000000..3ec649f
--- /dev/null
+++ b/drivers/mmc/mmc_legacy.c
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2016 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <mmc.h>
+
+static struct list_head mmc_devices;
+static int cur_dev_num = -1;
+
+struct mmc *find_mmc_device(int dev_num)
+{
+	struct mmc *m;
+	struct list_head *entry;
+
+	list_for_each(entry, &mmc_devices) {
+		m = list_entry(entry, struct mmc, link);
+
+		if (m->block_dev.devnum == dev_num)
+			return m;
+	}
+
+#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
+	printf("MMC Device %d not found\n", dev_num);
+#endif
+
+	return NULL;
+}
+
+int mmc_get_next_devnum(void)
+{
+	return cur_dev_num++;
+}
+
+struct blk_desc *mmc_get_blk_desc(struct mmc *mmc)
+{
+	return &mmc->block_dev;
+}
+
+int get_mmc_num(void)
+{
+	return cur_dev_num;
+}
+
+void mmc_do_preinit(void)
+{
+	struct mmc *m;
+	struct list_head *entry;
+
+	list_for_each(entry, &mmc_devices) {
+		m = list_entry(entry, struct mmc, link);
+
+#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
+		mmc_set_preinit(m, 1);
+#endif
+		if (m->preinit)
+			mmc_start_init(m);
+	}
+}
+
+void mmc_list_init(void)
+{
+	INIT_LIST_HEAD(&mmc_devices);
+	cur_dev_num = 0;
+}
+
+void mmc_list_add(struct mmc *mmc)
+{
+	INIT_LIST_HEAD(&mmc->link);
+
+	list_add_tail(&mmc->link, &mmc_devices);
+}
+
+#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
+void print_mmc_devices(char separator)
+{
+	struct mmc *m;
+	struct list_head *entry;
+	char *mmc_type;
+
+	list_for_each(entry, &mmc_devices) {
+		m = list_entry(entry, struct mmc, link);
+
+		if (m->has_init)
+			mmc_type = IS_SD(m) ? "SD" : "eMMC";
+		else
+			mmc_type = NULL;
+
+		printf("%s: %d", m->cfg->name, m->block_dev.devnum);
+		if (mmc_type)
+			printf(" (%s)", mmc_type);
+
+		if (entry->next != &mmc_devices) {
+			printf("%c", separator);
+			if (separator != '\n')
+				puts(" ");
+		}
+	}
+
+	printf("\n");
+}
+
+#else
+void print_mmc_devices(char separator) { }
+#endif
diff --git a/drivers/mmc/mmc_private.h b/drivers/mmc/mmc_private.h
index d3f6bfe..27b9e5f 100644
--- a/drivers/mmc/mmc_private.h
+++ b/drivers/mmc/mmc_private.h
@@ -25,8 +25,13 @@
 unsigned long mmc_berase(struct blk_desc *block_dev, lbaint_t start,
 			 lbaint_t blkcnt);
 
-unsigned long mmc_bwrite(struct blk_desc *block_dev, lbaint_t start,
-			 lbaint_t blkcnt, const void *src);
+#ifdef CONFIG_BLK
+ulong mmc_bwrite(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
+		 const void *src);
+#else
+ulong mmc_bwrite(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
+		 const void *src);
+#endif
 
 #else /* CONFIG_SPL_BUILD */
 
@@ -46,4 +51,28 @@
 
 #endif /* CONFIG_SPL_BUILD */
 
+/**
+ * mmc_get_next_devnum() - Get the next available MMC device number
+ *
+ * @return next available device number (0 = first), or -ve on error
+ */
+int mmc_get_next_devnum(void);
+
+/**
+ * mmc_do_preinit() - Get an MMC device ready for use
+ */
+void mmc_do_preinit(void);
+
+/**
+ * mmc_list_init() - Set up the list of MMC devices
+ */
+void mmc_list_init(void);
+
+/**
+ * mmc_list_add() - Add a new MMC device to the list of devices
+ *
+ * @mmc:	Device to add
+ */
+void mmc_list_add(struct mmc *mmc);
+
 #endif /* _MMC_PRIVATE_H_ */
diff --git a/drivers/mmc/mmc_write.c b/drivers/mmc/mmc_write.c
index 7b186f8..0f8b5c7 100644
--- a/drivers/mmc/mmc_write.c
+++ b/drivers/mmc/mmc_write.c
@@ -9,6 +9,7 @@
 
 #include <config.h>
 #include <common.h>
+#include <dm.h>
 #include <part.h>
 #include <div64.h>
 #include <linux/math64.h>
@@ -78,7 +79,8 @@
 	if (!mmc)
 		return -1;
 
-	err = mmc_select_hwpart(dev_num, block_dev->hwpart);
+	err = blk_select_hwpart_devnum(IF_TYPE_MMC, dev_num,
+				       block_dev->hwpart);
 	if (err < 0)
 		return -1;
 
@@ -121,9 +123,9 @@
 	struct mmc_data data;
 	int timeout = 1000;
 
-	if ((start + blkcnt) > mmc->block_dev.lba) {
+	if ((start + blkcnt) > mmc_get_blk_desc(mmc)->lba) {
 		printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
-		       start + blkcnt, mmc->block_dev.lba);
+		       start + blkcnt, mmc_get_blk_desc(mmc)->lba);
 		return 0;
 	}
 
@@ -171,9 +173,17 @@
 	return blkcnt;
 }
 
+#ifdef CONFIG_BLK
+ulong mmc_bwrite(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
+		 const void *src)
+#else
 ulong mmc_bwrite(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
 		 const void *src)
+#endif
 {
+#ifdef CONFIG_BLK
+	struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
+#endif
 	int dev_num = block_dev->devnum;
 	lbaint_t cur, blocks_todo = blkcnt;
 	int err;
@@ -182,7 +192,7 @@
 	if (!mmc)
 		return 0;
 
-	err = mmc_select_hwpart(dev_num, block_dev->hwpart);
+	err = blk_select_hwpart_devnum(IF_TYPE_MMC, dev_num, block_dev->hwpart);
 	if (err < 0)
 		return 0;
 
diff --git a/drivers/mmc/omap_hsmmc.c b/drivers/mmc/omap_hsmmc.c
index 85a832b..be34057 100644
--- a/drivers/mmc/omap_hsmmc.c
+++ b/drivers/mmc/omap_hsmmc.c
@@ -825,6 +825,7 @@
 	gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio, GPIOD_IS_IN);
 #endif
 
+	mmc->dev = dev;
 	upriv->mmc = mmc;
 
 	return 0;
diff --git a/drivers/mmc/pic32_sdhci.c b/drivers/mmc/pic32_sdhci.c
index e03d6dd..abe7429 100644
--- a/drivers/mmc/pic32_sdhci.c
+++ b/drivers/mmc/pic32_sdhci.c
@@ -41,7 +41,12 @@
 		return ret;
 	}
 
-	return add_sdhci(host, f_min_max[1], f_min_max[0]);
+	ret = add_sdhci(host, f_min_max[1], f_min_max[0]);
+	if (ret)
+		return ret;
+	host->mmc->dev = dev;
+
+	return 0;
 }
 
 static const struct udevice_id pic32_sdhci_ids[] = {
diff --git a/drivers/mmc/rockchip_dw_mmc.c b/drivers/mmc/rockchip_dw_mmc.c
index cb9e104..0a261c5 100644
--- a/drivers/mmc/rockchip_dw_mmc.c
+++ b/drivers/mmc/rockchip_dw_mmc.c
@@ -104,6 +104,7 @@
 	if (ret)
 		return ret;
 
+	host->mmc->dev = dev;
 	upriv->mmc = host->mmc;
 
 	return 0;
diff --git a/drivers/mmc/sandbox_mmc.c b/drivers/mmc/sandbox_mmc.c
index f4646a8..7da059c 100644
--- a/drivers/mmc/sandbox_mmc.c
+++ b/drivers/mmc/sandbox_mmc.c
@@ -8,18 +8,150 @@
 #include <common.h>
 #include <dm.h>
 #include <errno.h>
+#include <fdtdec.h>
 #include <mmc.h>
 #include <asm/test.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+struct sandbox_mmc_plat {
+	struct mmc_config cfg;
+	struct mmc mmc;
+};
+
+/**
+ * sandbox_mmc_send_cmd() - Emulate SD commands
+ *
+ * This emulate an SD card version 2. Single-block reads result in zero data.
+ * Multiple-block reads return a test string.
+ */
+static int sandbox_mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
+				struct mmc_data *data)
+{
+	switch (cmd->cmdidx) {
+	case MMC_CMD_ALL_SEND_CID:
+		break;
+	case SD_CMD_SEND_RELATIVE_ADDR:
+		cmd->response[0] = 0 << 16; /* mmc->rca */
+	case MMC_CMD_GO_IDLE_STATE:
+		break;
+	case SD_CMD_SEND_IF_COND:
+		cmd->response[0] = 0xaa;
+		break;
+	case MMC_CMD_SEND_STATUS:
+		cmd->response[0] = MMC_STATUS_RDY_FOR_DATA;
+		break;
+	case MMC_CMD_SELECT_CARD:
+		break;
+	case MMC_CMD_SEND_CSD:
+		cmd->response[0] = 0;
+		cmd->response[1] = 10 << 16;	/* 1 << block_len */
+		break;
+	case SD_CMD_SWITCH_FUNC: {
+		u32 *resp = (u32 *)data->dest;
+
+		resp[7] = cpu_to_be32(SD_HIGHSPEED_BUSY);
+		break;
+	}
+	case MMC_CMD_READ_SINGLE_BLOCK:
+		memset(data->dest, '\0', data->blocksize);
+		break;
+	case MMC_CMD_READ_MULTIPLE_BLOCK:
+		strcpy(data->dest, "this is a test");
+		break;
+	case MMC_CMD_STOP_TRANSMISSION:
+		break;
+	case SD_CMD_APP_SEND_OP_COND:
+		cmd->response[0] = OCR_BUSY | OCR_HCS;
+		cmd->response[1] = 0;
+		cmd->response[2] = 0;
+		break;
+	case MMC_CMD_APP_CMD:
+		break;
+	case MMC_CMD_SET_BLOCKLEN:
+		debug("block len %d\n", cmd->cmdarg);
+		break;
+	case SD_CMD_APP_SEND_SCR: {
+		u32 *scr = (u32 *)data->dest;
+
+		scr[0] = cpu_to_be32(2 << 24 | 1 << 15);  /* SD version 3 */
+		break;
+	}
+	default:
+		debug("%s: Unknown command %d\n", __func__, cmd->cmdidx);
+		break;
+	}
+
+	return 0;
+}
+
+static void sandbox_mmc_set_ios(struct mmc *mmc)
+{
+}
+
+static int sandbox_mmc_init(struct mmc *mmc)
+{
+	return 0;
+}
+
+static int sandbox_mmc_getcd(struct mmc *mmc)
+{
+	return 1;
+}
+
+static const struct mmc_ops sandbox_mmc_ops = {
+	.send_cmd = sandbox_mmc_send_cmd,
+	.set_ios = sandbox_mmc_set_ios,
+	.init = sandbox_mmc_init,
+	.getcd = sandbox_mmc_getcd,
+};
+
+int sandbox_mmc_probe(struct udevice *dev)
+{
+	struct sandbox_mmc_plat *plat = dev_get_platdata(dev);
+
+	return mmc_init(&plat->mmc);
+}
+
+int sandbox_mmc_bind(struct udevice *dev)
+{
+	struct sandbox_mmc_plat *plat = dev_get_platdata(dev);
+	struct mmc_config *cfg = &plat->cfg;
+	int ret;
+
+	cfg->name = dev->name;
+	cfg->ops = &sandbox_mmc_ops;
+	cfg->host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS | MMC_MODE_8BIT;
+	cfg->voltages = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34;
+	cfg->f_min = 1000000;
+	cfg->f_max = 52000000;
+	cfg->b_max = U32_MAX;
+
+	ret = mmc_bind(dev, &plat->mmc, cfg);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+
+int sandbox_mmc_unbind(struct udevice *dev)
+{
+	mmc_unbind(dev);
+
+	return 0;
+}
+
 static const struct udevice_id sandbox_mmc_ids[] = {
 	{ .compatible = "sandbox,mmc" },
 	{ }
 };
 
-U_BOOT_DRIVER(warm_mmc_sandbox) = {
+U_BOOT_DRIVER(mmc_sandbox) = {
 	.name		= "mmc_sandbox",
 	.id		= UCLASS_MMC,
 	.of_match	= sandbox_mmc_ids,
+	.bind		= sandbox_mmc_bind,
+	.unbind		= sandbox_mmc_unbind,
+	.probe		= sandbox_mmc_probe,
+	.platdata_auto_alloc_size = sizeof(struct sandbox_mmc_plat),
 };
diff --git a/drivers/mmc/socfpga_dw_mmc.c b/drivers/mmc/socfpga_dw_mmc.c
index 097db81..6a0e971 100644
--- a/drivers/mmc/socfpga_dw_mmc.c
+++ b/drivers/mmc/socfpga_dw_mmc.c
@@ -108,6 +108,7 @@
 		return ret;
 
 	upriv->mmc = host->mmc;
+	host->mmc->dev = dev;
 
 	return 0;
 }
diff --git a/drivers/mmc/uniphier-sd.c b/drivers/mmc/uniphier-sd.c
index 81a80cd..4978cca 100644
--- a/drivers/mmc/uniphier-sd.c
+++ b/drivers/mmc/uniphier-sd.c
@@ -725,6 +725,7 @@
 		return -EIO;
 
 	upriv->mmc = priv->mmc;
+	priv->mmc->dev = dev;
 
 	return 0;
 }
diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c
index b59feca..d405929 100644
--- a/drivers/mmc/zynq_sdhci.c
+++ b/drivers/mmc/zynq_sdhci.c
@@ -35,6 +35,7 @@
 		  CONFIG_ZYNQ_SDHCI_MIN_FREQ);
 
 	upriv->mmc = host->mmc;
+	host->mmc->dev = dev;
 
 	return 0;
 }
diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
index c58841e..390e9e4 100644
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
@@ -28,6 +28,13 @@
 	  NOR flash to parallel flash interface. Please find details on the
 	  "Embedded Peripherals IP User Guide" of Altera.
 
+config FLASH_PIC32
+	bool "Microchip PIC32 Flash driver"
+	depends on MACH_PIC32 && MTD
+	help
+	  This enables access to Microchip PIC32 internal non-CFI flash
+	  chips through PIC32 Non-Volatile-Memory Controller.
+
 endmenu
 
 source "drivers/mtd/nand/Kconfig"
diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile
index 703700a..bd680a7 100644
--- a/drivers/mtd/Makefile
+++ b/drivers/mtd/Makefile
@@ -19,5 +19,6 @@
 obj-$(CONFIG_FTSMC020) += ftsmc020.o
 obj-$(CONFIG_FLASH_CFI_LEGACY) += jedec_flash.o
 obj-$(CONFIG_MW_EEPROM) += mw_eeprom.o
+obj-$(CONFIG_FLASH_PIC32) += pic32_flash.o
 obj-$(CONFIG_ST_SMI) += st_smi.o
 obj-$(CONFIG_STM32_FLASH) += stm32_flash.o
diff --git a/drivers/mtd/pic32_flash.c b/drivers/mtd/pic32_flash.c
new file mode 100644
index 0000000..9166fcd
--- /dev/null
+++ b/drivers/mtd/pic32_flash.c
@@ -0,0 +1,444 @@
+/*
+ * Copyright (C) 2015
+ * Cristian Birsan <cristian.birsan@microchip.com>
+ * Purna Chandra Mandal <purna.mandal@microchip.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <fdt_support.h>
+#include <flash.h>
+#include <mach/pic32.h>
+#include <wait_bit.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/* NVM Controller registers */
+struct pic32_reg_nvm {
+	struct pic32_reg_atomic ctrl;
+	struct pic32_reg_atomic key;
+	struct pic32_reg_atomic addr;
+	struct pic32_reg_atomic data;
+};
+
+/* NVM operations */
+#define NVMOP_NOP		0
+#define NVMOP_WORD_WRITE	1
+#define NVMOP_PAGE_ERASE	4
+
+/* NVM control bits */
+#define NVM_WR			BIT(15)
+#define NVM_WREN		BIT(14)
+#define NVM_WRERR		BIT(13)
+#define NVM_LVDERR		BIT(12)
+
+/* NVM programming unlock register */
+#define LOCK_KEY		0x0
+#define UNLOCK_KEY1		0xaa996655
+#define UNLOCK_KEY2		0x556699aa
+
+/*
+ * PIC32 flash banks consist of number of pages, each page
+ * into number of rows and rows into number of words.
+ * Here we will maintain page information instead of sector.
+ */
+flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS];
+static struct pic32_reg_nvm *nvm_regs_p;
+
+static inline void flash_initiate_operation(u32 nvmop)
+{
+	/* set operation */
+	writel(nvmop, &nvm_regs_p->ctrl.raw);
+
+	/* enable flash write */
+	writel(NVM_WREN, &nvm_regs_p->ctrl.set);
+
+	/* unlock sequence */
+	writel(LOCK_KEY, &nvm_regs_p->key.raw);
+	writel(UNLOCK_KEY1, &nvm_regs_p->key.raw);
+	writel(UNLOCK_KEY2, &nvm_regs_p->key.raw);
+
+	/* initiate operation */
+	writel(NVM_WR, &nvm_regs_p->ctrl.set);
+}
+
+static int flash_wait_till_busy(const char *func, ulong timeout)
+{
+	int ret = wait_for_bit(__func__, &nvm_regs_p->ctrl.raw,
+			       NVM_WR, false, timeout, false);
+
+	return ret ? ERR_TIMOUT : ERR_OK;
+}
+
+static inline int flash_complete_operation(void)
+{
+	u32 tmp;
+
+	tmp = readl(&nvm_regs_p->ctrl.raw);
+	if (tmp & NVM_WRERR) {
+		printf("Error in Block Erase - Lock Bit may be set!\n");
+		flash_initiate_operation(NVMOP_NOP);
+		return ERR_PROTECTED;
+	}
+
+	if (tmp & NVM_LVDERR) {
+		printf("Error in Block Erase - low-vol detected!\n");
+		flash_initiate_operation(NVMOP_NOP);
+		return ERR_NOT_ERASED;
+	}
+
+	/* disable flash write or erase operation */
+	writel(NVM_WREN, &nvm_regs_p->ctrl.clr);
+
+	return ERR_OK;
+}
+
+/*
+ * Erase flash sectors, returns:
+ * ERR_OK - OK
+ * ERR_INVAL - invalid sector arguments
+ * ERR_TIMOUT - write timeout
+ * ERR_NOT_ERASED - Flash not erased
+ * ERR_UNKNOWN_FLASH_VENDOR - incorrect flash
+ */
+int flash_erase(flash_info_t *info, int s_first, int s_last)
+{
+	ulong sect_start, sect_end, flags;
+	int prot, sect;
+	int rc;
+
+	if ((info->flash_id & FLASH_VENDMASK) != FLASH_MAN_MCHP) {
+		printf("Can't erase unknown flash type %08lx - aborted\n",
+		       info->flash_id);
+		return ERR_UNKNOWN_FLASH_VENDOR;
+	}
+
+	if ((s_first < 0) || (s_first > s_last)) {
+		printf("- no sectors to erase\n");
+		return ERR_INVAL;
+	}
+
+	prot = 0;
+	for (sect = s_first; sect <= s_last; ++sect) {
+		if (info->protect[sect])
+			prot++;
+	}
+
+	if (prot)
+		printf("- Warning: %d protected sectors will not be erased!\n",
+		       prot);
+	else
+		printf("\n");
+
+	/* erase on unprotected sectors */
+	for (sect = s_first; sect <= s_last; sect++) {
+		if (info->protect[sect])
+			continue;
+
+		/* disable interrupts */
+		flags = disable_interrupts();
+
+		/* write destination page address (physical) */
+		sect_start = CPHYSADDR(info->start[sect]);
+		writel(sect_start, &nvm_regs_p->addr.raw);
+
+		/* page erase */
+		flash_initiate_operation(NVMOP_PAGE_ERASE);
+
+		/* wait */
+		rc = flash_wait_till_busy(__func__,
+					  CONFIG_SYS_FLASH_ERASE_TOUT);
+
+		/* re-enable interrupts if necessary */
+		if (flags)
+			enable_interrupts();
+
+		if (rc != ERR_OK)
+			return rc;
+
+		rc = flash_complete_operation();
+		if (rc != ERR_OK)
+			return rc;
+
+		/*
+		 * flash content is updated but cache might contain stale
+		 * data, so invalidate dcache.
+		 */
+		sect_end = info->start[sect] + info->size / info->sector_count;
+		invalidate_dcache_range(info->start[sect], sect_end);
+	}
+
+	printf(" done\n");
+	return ERR_OK;
+}
+
+int page_erase(flash_info_t *info, int sect)
+{
+	return 0;
+}
+
+/* Write a word to flash */
+static int write_word(flash_info_t *info, ulong dest, ulong word)
+{
+	ulong flags;
+	int rc;
+
+	/* read flash to check if it is sufficiently erased */
+	if ((readl((void __iomem *)dest) & word) != word) {
+		printf("Error, Flash not erased!\n");
+		return ERR_NOT_ERASED;
+	}
+
+	/* disable interrupts */
+	flags = disable_interrupts();
+
+	/* update destination page address (physical) */
+	writel(CPHYSADDR(dest), &nvm_regs_p->addr.raw);
+	writel(word, &nvm_regs_p->data.raw);
+
+	/* word write */
+	flash_initiate_operation(NVMOP_WORD_WRITE);
+
+	/* wait for operation to complete */
+	rc = flash_wait_till_busy(__func__, CONFIG_SYS_FLASH_WRITE_TOUT);
+
+	/* re-enable interrupts if necessary */
+	if (flags)
+		enable_interrupts();
+
+	if (rc != ERR_OK)
+		return rc;
+
+	return flash_complete_operation();
+}
+
+/*
+ * Copy memory to flash, returns:
+ * ERR_OK - OK
+ * ERR_TIMOUT - write timeout
+ * ERR_NOT_ERASED - Flash not erased
+ */
+int write_buff(flash_info_t *info, uchar *src, ulong addr, ulong cnt)
+{
+	ulong dst, tmp_le, len = cnt;
+	int i, l, rc;
+	uchar *cp;
+
+	/* get lower word aligned address */
+	dst = (addr & ~3);
+
+	/* handle unaligned start bytes */
+	l = addr - dst;
+	if (l != 0) {
+		tmp_le = 0;
+		for (i = 0, cp = (uchar *)dst; i < l; ++i, ++cp)
+			tmp_le |= *cp << (i * 8);
+
+		for (; (i < 4) && (cnt > 0); ++i, ++src, --cnt, ++cp)
+			tmp_le |= *src << (i * 8);
+
+		for (; (cnt == 0) && (i < 4); ++i, ++cp)
+			tmp_le |= *cp << (i * 8);
+
+		rc = write_word(info, dst, tmp_le);
+		if (rc)
+			goto out;
+
+		dst += 4;
+	}
+
+	/* handle word aligned part */
+	while (cnt >= 4) {
+		tmp_le = src[0] | src[1] << 8 | src[2] << 16 | src[3] << 24;
+		rc = write_word(info, dst, tmp_le);
+		if (rc)
+			goto out;
+		src += 4;
+		dst += 4;
+		cnt -= 4;
+	}
+
+	if (cnt == 0) {
+		rc = ERR_OK;
+		goto out;
+	}
+
+	/* handle unaligned tail bytes */
+	tmp_le = 0;
+	for (i = 0, cp = (uchar *)dst; (i < 4) && (cnt > 0); ++i, ++cp) {
+		tmp_le |= *src++ << (i * 8);
+		--cnt;
+	}
+
+	for (; i < 4; ++i, ++cp)
+		tmp_le |= *cp << (i * 8);
+
+	rc = write_word(info, dst, tmp_le);
+out:
+	/*
+	 * flash content updated by nvm controller but CPU cache might
+	 * have stale data, so invalidate dcache.
+	 */
+	invalidate_dcache_range(addr, addr + len);
+
+	printf(" done\n");
+	return rc;
+}
+
+void flash_print_info(flash_info_t *info)
+{
+	int i;
+
+	if (info->flash_id == FLASH_UNKNOWN) {
+		printf("missing or unknown FLASH type\n");
+		return;
+	}
+
+	switch (info->flash_id & FLASH_VENDMASK) {
+	case FLASH_MAN_MCHP:
+		printf("Microchip Technology ");
+		break;
+	default:
+		printf("Unknown Vendor ");
+		break;
+	}
+
+	switch (info->flash_id & FLASH_TYPEMASK) {
+	case FLASH_MCHP100T:
+		printf("Internal (8 Mbit, 64 x 16k)\n");
+		break;
+	default:
+		printf("Unknown Chip Type\n");
+		break;
+	}
+
+	printf("  Size: %ld MB in %d Sectors\n",
+	       info->size >> 20, info->sector_count);
+
+	printf("  Sector Start Addresses:");
+	for (i = 0; i < info->sector_count; ++i) {
+		if ((i % 5) == 0)
+			printf("\n   ");
+
+		printf(" %08lX%s", info->start[i],
+		       info->protect[i] ? " (RO)" : "     ");
+	}
+	printf("\n");
+}
+
+unsigned long flash_init(void)
+{
+	unsigned long size = 0;
+	struct udevice *dev;
+	int bank;
+
+	/* probe every MTD device */
+	for (uclass_first_device(UCLASS_MTD, &dev); dev;
+	     uclass_next_device(&dev)) {
+		/* nop */
+	}
+
+	/* calc total flash size */
+	for (bank = 0; bank < CONFIG_SYS_MAX_FLASH_BANKS; ++bank)
+		size += flash_info[bank].size;
+
+	return size;
+}
+
+static void pic32_flash_bank_init(flash_info_t *info,
+				  ulong base, ulong size)
+{
+	ulong sect_size;
+	int sect;
+
+	/* device & manufacturer code */
+	info->flash_id = FLASH_MAN_MCHP | FLASH_MCHP100T;
+	info->sector_count = CONFIG_SYS_MAX_FLASH_SECT;
+	info->size = size;
+
+	/* update sector (i.e page) info */
+	sect_size = info->size / info->sector_count;
+	for (sect = 0; sect < info->sector_count; sect++) {
+		info->start[sect] = base;
+		/* protect each sector by default */
+		info->protect[sect] = 1;
+		base += sect_size;
+	}
+}
+
+static int pic32_flash_probe(struct udevice *dev)
+{
+	void *blob = (void *)gd->fdt_blob;
+	int node = dev->of_offset;
+	const char *list, *end;
+	const fdt32_t *cell;
+	unsigned long addr, size;
+	int parent, addrc, sizec;
+	flash_info_t *info;
+	int len, idx;
+
+	/*
+	 * decode regs. there are multiple reg tuples, and they need to
+	 * match with reg-names.
+	 */
+	parent = fdt_parent_offset(blob, node);
+	of_bus_default_count_cells(blob, parent, &addrc, &sizec);
+	list = fdt_getprop(blob, node, "reg-names", &len);
+	if (!list)
+		return -ENOENT;
+
+	end = list + len;
+	cell = fdt_getprop(blob, node, "reg", &len);
+	if (!cell)
+		return -ENOENT;
+
+	for (idx = 0, info = &flash_info[0]; list < end;) {
+		addr = fdt_translate_address((void *)blob, node, cell + idx);
+		size = fdt_addr_to_cpu(cell[idx + addrc]);
+		len = strlen(list);
+		if (!strncmp(list, "nvm", len)) {
+			/* NVM controller */
+			nvm_regs_p = ioremap(addr, size);
+		} else if (!strncmp(list, "bank", 4)) {
+			/* Flash bank: use kseg0 cached address */
+			pic32_flash_bank_init(info, CKSEG0ADDR(addr), size);
+			info++;
+		}
+		idx += addrc + sizec;
+		list += len + 1;
+	}
+
+	/* disable flash write/erase operations */
+	writel(NVM_WREN, &nvm_regs_p->ctrl.clr);
+
+#if (CONFIG_SYS_MONITOR_BASE >= CONFIG_SYS_FLASH_BASE)
+	/* monitor protection ON by default */
+	flash_protect(FLAG_PROTECT_SET,
+		      CONFIG_SYS_MONITOR_BASE,
+		      CONFIG_SYS_MONITOR_BASE + monitor_flash_len - 1,
+		      &flash_info[0]);
+#endif
+
+#ifdef CONFIG_ENV_IS_IN_FLASH
+	/* ENV protection ON by default */
+	flash_protect(FLAG_PROTECT_SET,
+		      CONFIG_ENV_ADDR,
+		      CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE - 1,
+		      &flash_info[0]);
+#endif
+	return 0;
+}
+
+static const struct udevice_id pic32_flash_ids[] = {
+	{ .compatible = "microchip,pic32mzda-flash" },
+	{}
+};
+
+U_BOOT_DRIVER(pic32_flash) = {
+	.name	= "pic32_flash",
+	.id	= UCLASS_MTD,
+	.of_match = pic32_flash_ids,
+	.probe	= pic32_flash_probe,
+};
diff --git a/drivers/mtd/spi/spi_spl_load.c b/drivers/mtd/spi/spi_spl_load.c
index ca56fe9..46c98a9 100644
--- a/drivers/mtd/spi/spi_spl_load.c
+++ b/drivers/mtd/spi/spi_spl_load.c
@@ -23,6 +23,8 @@
 static int spi_load_image_os(struct spi_flash *flash,
 			     struct image_header *header)
 {
+	int err;
+
 	/* Read for a header, parse or error out. */
 	spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS, 0x40,
 		       (void *)header);
@@ -30,7 +32,9 @@
 	if (image_get_magic(header) != IH_MAGIC)
 		return -1;
 
-	spl_parse_image_header(header);
+	err = spl_parse_image_header(header);
+	if (err)
+		return err;
 
 	spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS,
 		       spl_image.size, (void *)spl_image.load_addr);
@@ -81,7 +85,9 @@
 		if (err)
 			return err;
 
-		spl_parse_image_header(header);
+		err = spl_parse_image_header(header);
+		if (err)
+			return err;
 		err = spi_flash_read(flash, CONFIG_SYS_SPI_U_BOOT_OFFS,
 			       spl_image.size, (void *)spl_image.load_addr);
 	}
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index fbedd04..d5e4a97 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -59,7 +59,7 @@
 obj-$(CONFIG_SMC911X) += smc911x.o
 obj-$(CONFIG_DRIVER_TI_EMAC) += davinci_emac.o
 obj-$(CONFIG_TSEC_ENET) += tsec.o fsl_mdio.o
-obj-$(CONFIG_DRIVER_TI_CPSW) += cpsw.o
+obj-$(CONFIG_DRIVER_TI_CPSW) += cpsw.o cpsw-common.o
 obj-$(CONFIG_FMAN_ENET) += fsl_mdio.o
 obj-$(CONFIG_TSI108_ETH) += tsi108_eth.o
 obj-$(CONFIG_ULI526X) += uli526x.o
diff --git a/drivers/net/cpsw-common.c b/drivers/net/cpsw-common.c
new file mode 100644
index 0000000..e828e85
--- /dev/null
+++ b/drivers/net/cpsw-common.c
@@ -0,0 +1,121 @@
+/*
+ * CPSW common - libs used across TI ethernet devices.
+ *
+ * Copyright (C) 2016, Texas Instruments, Incorporated
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <fdt_support.h>
+#include <asm/io.h>
+#include <cpsw.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define CTRL_MAC_REG(offset, id) ((offset) + 0x8 * (id))
+
+static int davinci_emac_3517_get_macid(struct udevice *dev, u16 offset,
+				       int slave, u8 *mac_addr)
+{
+	void *fdt = (void *)gd->fdt_blob;
+	int node = dev->of_offset;
+	u32 macid_lsb;
+	u32 macid_msb;
+	fdt32_t gmii = 0;
+	int syscon;
+	u32 addr;
+
+	syscon = fdtdec_lookup_phandle(fdt, node, "syscon");
+	if (syscon < 0) {
+		error("Syscon offset not found\n");
+		return -ENOENT;
+	}
+
+	addr = (u32)map_physmem(fdt_translate_address(fdt, syscon, &gmii),
+				sizeof(u32), MAP_NOCACHE);
+	if (addr == FDT_ADDR_T_NONE) {
+		error("Not able to get syscon address to get mac efuse address\n");
+		return -ENOENT;
+	}
+
+	addr += CTRL_MAC_REG(offset, slave);
+
+	/* try reading mac address from efuse */
+	macid_lsb = readl(addr);
+	macid_msb = readl(addr + 4);
+
+	mac_addr[0] = (macid_msb >> 16) & 0xff;
+	mac_addr[1] = (macid_msb >> 8)  & 0xff;
+	mac_addr[2] = macid_msb & 0xff;
+	mac_addr[3] = (macid_lsb >> 16) & 0xff;
+	mac_addr[4] = (macid_lsb >> 8)  & 0xff;
+	mac_addr[5] = macid_lsb & 0xff;
+
+	return 0;
+}
+
+static int cpsw_am33xx_cm_get_macid(struct udevice *dev, u16 offset, int slave,
+				    u8 *mac_addr)
+{
+	void *fdt = (void *)gd->fdt_blob;
+	int node = dev->of_offset;
+	u32 macid_lo;
+	u32 macid_hi;
+	fdt32_t gmii = 0;
+	int syscon;
+	u32 addr;
+
+	syscon = fdtdec_lookup_phandle(fdt, node, "syscon");
+	if (syscon < 0) {
+		error("Syscon offset not found\n");
+		return -ENOENT;
+	}
+
+	addr = (u32)map_physmem(fdt_translate_address(fdt, syscon, &gmii),
+				sizeof(u32), MAP_NOCACHE);
+	if (addr == FDT_ADDR_T_NONE) {
+		error("Not able to get syscon address to get mac efuse address\n");
+		return -ENOENT;
+	}
+
+	addr += CTRL_MAC_REG(offset, slave);
+
+	/* try reading mac address from efuse */
+	macid_lo = readl(addr);
+	macid_hi = readl(addr + 4);
+
+	mac_addr[5] = (macid_lo >> 8) & 0xff;
+	mac_addr[4] = macid_lo & 0xff;
+	mac_addr[3] = (macid_hi >> 24) & 0xff;
+	mac_addr[2] = (macid_hi >> 16) & 0xff;
+	mac_addr[1] = (macid_hi >> 8) & 0xff;
+	mac_addr[0] = macid_hi & 0xff;
+
+	return 0;
+}
+
+int ti_cm_get_macid(struct udevice *dev, int slave, u8 *mac_addr)
+{
+	if (of_machine_is_compatible("ti,dm8148"))
+		return cpsw_am33xx_cm_get_macid(dev, 0x630, slave, mac_addr);
+
+	if (of_machine_is_compatible("ti,am33xx"))
+		return cpsw_am33xx_cm_get_macid(dev, 0x630, slave, mac_addr);
+
+	if (of_device_is_compatible(dev, "ti,am3517-emac"))
+		return davinci_emac_3517_get_macid(dev, 0x110, slave, mac_addr);
+
+	if (of_device_is_compatible(dev, "ti,dm816-emac"))
+		return cpsw_am33xx_cm_get_macid(dev, 0x30, slave, mac_addr);
+
+	if (of_machine_is_compatible("ti,am4372"))
+		return cpsw_am33xx_cm_get_macid(dev, 0x630, slave, mac_addr);
+
+	if (of_machine_is_compatible("ti,dra7"))
+		return davinci_emac_3517_get_macid(dev, 0x514, slave, mac_addr);
+
+	dev_err(dev, "incompatible machine/device type for reading mac address\n");
+	return -ENOENT;
+}
diff --git a/drivers/net/cpsw.c b/drivers/net/cpsw.c
index 7104754..2ce4ec6 100644
--- a/drivers/net/cpsw.c
+++ b/drivers/net/cpsw.c
@@ -26,6 +26,7 @@
 #include <phy.h>
 #include <asm/arch/cpu.h>
 #include <dm.h>
+#include <fdt_support.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -965,6 +966,11 @@
 	phydev->supported &= supported;
 	phydev->advertising = phydev->supported;
 
+#ifdef CONFIG_DM_ETH
+	if (slave->data->phy_of_handle)
+		phydev->dev->of_offset = slave->data->phy_of_handle;
+#endif
+
 	priv->phydev = phydev;
 	phy_config(phydev);
 
@@ -1137,6 +1143,11 @@
 	.stop		= cpsw_eth_stop,
 };
 
+static inline fdt_addr_t cpsw_get_addr_by_node(const void *fdt, int node)
+{
+	return fdtdec_get_addr_size_auto_noparent(fdt, node, "reg", 0, NULL);
+}
+
 static int cpsw_eth_ofdata_to_platdata(struct udevice *dev)
 {
 	struct eth_pdata *pdata = dev_get_platdata(dev);
@@ -1146,9 +1157,8 @@
 	int node = dev->of_offset;
 	int subnode;
 	int slave_index = 0;
-	uint32_t mac_hi, mac_lo;
-	fdt32_t gmii = 0;
 	int active_slave;
+	int ret;
 
 	pdata->iobase = dev_get_addr(dev);
 	priv->data.version = CPSW_CTRL_VERSION_2;
@@ -1202,29 +1212,52 @@
 
 		name = fdt_get_name(fdt, subnode, &len);
 		if (!strncmp(name, "mdio", 4)) {
-			priv->data.mdio_base = fdtdec_get_addr(fdt, subnode,
-							       "reg");
+			u32 mdio_base;
+
+			mdio_base = cpsw_get_addr_by_node(fdt, subnode);
+			if (mdio_base == FDT_ADDR_T_NONE) {
+				error("Not able to get MDIO address space\n");
+				return -ENOENT;
+			}
+			priv->data.mdio_base = mdio_base;
 		}
 
 		if (!strncmp(name, "slave", 5)) {
 			u32 phy_id[2];
 
-			if (slave_index >= priv->data.slaves) {
-				printf("error: num slaves and slave nodes did not match\n");
-				return -EINVAL;
-			}
+			if (slave_index >= priv->data.slaves)
+				continue;
 			phy_mode = fdt_getprop(fdt, subnode, "phy-mode", NULL);
 			if (phy_mode)
 				priv->data.slave_data[slave_index].phy_if =
 					phy_get_interface_by_name(phy_mode);
-			fdtdec_get_int_array(fdt, subnode, "phy_id", phy_id, 2);
-			priv->data.slave_data[slave_index].phy_addr = phy_id[1];
+
+			priv->data.slave_data[slave_index].phy_of_handle =
+				fdtdec_lookup_phandle(fdt, subnode,
+						      "phy-handle");
+
+			if (priv->data.slave_data[slave_index].phy_of_handle >= 0) {
+				priv->data.slave_data[slave_index].phy_addr =
+						fdtdec_get_int(gd->fdt_blob,
+							       priv->data.slave_data[slave_index].phy_of_handle,
+							       "reg", -1);
+			} else {
+				fdtdec_get_int_array(fdt, subnode, "phy_id",
+						     phy_id, 2);
+				priv->data.slave_data[slave_index].phy_addr =
+						phy_id[1];
+			}
 			slave_index++;
 		}
 
 		if (!strncmp(name, "cpsw-phy-sel", 12)) {
-			priv->data.gmii_sel = fdtdec_get_addr(fdt, subnode,
-							      "reg");
+			priv->data.gmii_sel = cpsw_get_addr_by_node(fdt,
+								    subnode);
+
+			if (priv->data.gmii_sel == FDT_ADDR_T_NONE) {
+				error("Not able to get gmii_sel reg address\n");
+				return -ENOENT;
+			}
 		}
 	}
 
@@ -1236,20 +1269,11 @@
 		priv->data.slave_data[1].sliver_reg_ofs = CPSW_SLIVER1_OFFSET;
 	}
 
-	subnode = fdtdec_lookup_phandle(fdt, node, "syscon");
-	priv->data.mac_id = fdt_translate_address((void *)fdt, subnode, &gmii);
-	priv->data.mac_id += AM335X_GMII_SEL_OFFSET;
-	priv->data.mac_id += active_slave * 8;
-
-	/* try reading mac address from efuse */
-	mac_lo = readl(priv->data.mac_id);
-	mac_hi = readl(priv->data.mac_id + 4);
-	pdata->enetaddr[0] = mac_hi & 0xFF;
-	pdata->enetaddr[1] = (mac_hi & 0xFF00) >> 8;
-	pdata->enetaddr[2] = (mac_hi & 0xFF0000) >> 16;
-	pdata->enetaddr[3] = (mac_hi & 0xFF000000) >> 24;
-	pdata->enetaddr[4] = mac_lo & 0xFF;
-	pdata->enetaddr[5] = (mac_lo & 0xFF00) >> 8;
+	ret = ti_cm_get_macid(dev, active_slave, pdata->enetaddr);
+	if (ret < 0) {
+		error("cpsw read efuse mac failed\n");
+		return ret;
+	}
 
 	pdata->phy_interface = priv->data.slave_data[active_slave].phy_if;
 	if (pdata->phy_interface == -1) {
@@ -1270,6 +1294,7 @@
 		writel(RGMII_MODE_ENABLE, priv->data.gmii_sel);
 		break;
 	}
+
 	return 0;
 }
 
diff --git a/drivers/net/phy/broadcom.c b/drivers/net/phy/broadcom.c
index 4b2808e..9871cc3 100644
--- a/drivers/net/phy/broadcom.c
+++ b/drivers/net/phy/broadcom.c
@@ -84,11 +84,14 @@
 
 static int bcm54xx_startup(struct phy_device *phydev)
 {
-	/* Read the Status (2x to make sure link is right) */
-	genphy_update_link(phydev);
-	bcm54xx_parse_status(phydev);
+	int ret;
 
-	return 0;
+	/* Read the Status (2x to make sure link is right) */
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+
+	return bcm54xx_parse_status(phydev);
 }
 
 /* Broadcom BCM5482S */
@@ -139,11 +142,14 @@
 
 static int bcm_cygnus_startup(struct phy_device *phydev)
 {
-	/* Read the Status (2x to make sure link is right) */
-	genphy_update_link(phydev);
-	genphy_parse_link(phydev);
+	int ret;
 
-	return 0;
+	/* Read the Status (2x to make sure link is right) */
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+
+	return genphy_parse_link(phydev);
 }
 
 static int bcm_cygnus_config(struct phy_device *phydev)
@@ -239,17 +245,21 @@
  */
 static int bcm5482_startup(struct phy_device *phydev)
 {
+	int ret;
+
 	if (bcm5482_is_serdes(phydev)) {
 		bcm5482_parse_serdes_sr(phydev);
 		phydev->port = PORT_FIBRE;
-	} else {
-		/* Wait for auto-negotiation to complete or fail */
-		genphy_update_link(phydev);
-		/* Parse BCM54xx copper aux status register */
-		bcm54xx_parse_status(phydev);
+		return 0;
 	}
 
-	return 0;
+	/* Wait for auto-negotiation to complete or fail */
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+
+	/* Parse BCM54xx copper aux status register */
+	return bcm54xx_parse_status(phydev);
 }
 
 static struct phy_driver BCM5461S_driver = {
diff --git a/drivers/net/phy/davicom.c b/drivers/net/phy/davicom.c
index 0c039fe..0a6e410 100644
--- a/drivers/net/phy/davicom.c
+++ b/drivers/net/phy/davicom.c
@@ -60,10 +60,13 @@
 
 static int dm9161_startup(struct phy_device *phydev)
 {
-	genphy_update_link(phydev);
-	dm9161_parse_status(phydev);
+	int ret;
 
-	return 0;
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+
+	return dm9161_parse_status(phydev);
 }
 
 static struct phy_driver DM9161_driver = {
diff --git a/drivers/net/phy/et1011c.c b/drivers/net/phy/et1011c.c
index 70c15e2..2fe0132 100644
--- a/drivers/net/phy/et1011c.c
+++ b/drivers/net/phy/et1011c.c
@@ -79,9 +79,13 @@
 
 static int et1011c_startup(struct phy_device *phydev)
 {
-	genphy_update_link(phydev);
-	et1011c_parse_status(phydev);
-	return 0;
+	int ret;
+
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+
+	return et1011c_parse_status(phydev);
 }
 
 static struct phy_driver et1011c_driver = {
diff --git a/drivers/net/phy/lxt.c b/drivers/net/phy/lxt.c
index 91838ce..9abc2a8 100644
--- a/drivers/net/phy/lxt.c
+++ b/drivers/net/phy/lxt.c
@@ -49,10 +49,13 @@
 
 static int lxt971_startup(struct phy_device *phydev)
 {
-	genphy_update_link(phydev);
-	lxt971_parse_status(phydev);
+	int ret;
 
-	return 0;
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+
+	return lxt971_parse_status(phydev);
 }
 
 static struct phy_driver LXT971_driver = {
diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
index b8b1157..d2e68d4 100644
--- a/drivers/net/phy/marvell.c
+++ b/drivers/net/phy/marvell.c
@@ -103,7 +103,7 @@
 /* Parse the 88E1011's status register for speed and duplex
  * information
  */
-static uint m88e1xxx_parse_status(struct phy_device *phydev)
+static int m88e1xxx_parse_status(struct phy_device *phydev)
 {
 	unsigned int speed;
 	unsigned int mii_reg;
@@ -120,7 +120,7 @@
 			if (i > PHY_AUTONEGOTIATE_TIMEOUT) {
 				puts(" TIMEOUT !\n");
 				phydev->link = 0;
-				break;
+				return -ETIMEDOUT;
 			}
 
 			if ((i++ % 1000) == 0)
@@ -162,10 +162,13 @@
 
 static int m88e1011s_startup(struct phy_device *phydev)
 {
-	genphy_update_link(phydev);
-	m88e1xxx_parse_status(phydev);
+	int ret;
 
-	return 0;
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+
+	return m88e1xxx_parse_status(phydev);
 }
 
 /* Marvell 88E1111S */
@@ -349,22 +352,21 @@
 	/* Change Page Number */
 	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0000);
 
-	genphy_config_aneg(phydev);
-
-	phy_reset(phydev);
-
-	return 0;
+	return genphy_config_aneg(phydev);
 }
 
 static int m88e1118_startup(struct phy_device *phydev)
 {
+	int ret;
+
 	/* Change Page Number */
 	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0000);
 
-	genphy_update_link(phydev);
-	m88e1xxx_parse_status(phydev);
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
 
-	return 0;
+	return m88e1xxx_parse_status(phydev);
 }
 
 /* Marvell 88E1121R */
@@ -421,12 +423,15 @@
 
 static int m88e1145_startup(struct phy_device *phydev)
 {
-	genphy_update_link(phydev);
+	int ret;
+
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+
 	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1145_PHY_LED_CONTROL,
 			MIIM_88E1145_PHY_LED_DIRECT);
-	m88e1xxx_parse_status(phydev);
-
-	return 0;
+	return m88e1xxx_parse_status(phydev);
 }
 
 /* Marvell 88E1149S */
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c
index 8fcf737..b08788a 100644
--- a/drivers/net/phy/micrel.c
+++ b/drivers/net/phy/micrel.c
@@ -181,7 +181,12 @@
 static int ksz90xx_startup(struct phy_device *phydev)
 {
 	unsigned phy_ctl;
-	genphy_update_link(phydev);
+	int ret;
+
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+
 	phy_ctl = phy_read(phydev, MDIO_DEVAD_NONE, MII_KSZ90xx_PHY_CTL);
 
 	if (phy_ctl & MIIM_KSZ90xx_PHYCTL_DUPLEX)
diff --git a/drivers/net/phy/mv88e61xx.c b/drivers/net/phy/mv88e61xx.c
index 302abe8..74d5609 100644
--- a/drivers/net/phy/mv88e61xx.c
+++ b/drivers/net/phy/mv88e61xx.c
@@ -1,4 +1,9 @@
 /*
+ * (C) Copyright 2015
+ * Elecsys Corporation <www.elecsyscorp.com>
+ * Kevin Smith <kevin.smith@elecsyscorp.com>
+ *
+ * Original driver:
  * (C) Copyright 2009
  * Marvell Semiconductor <www.marvell.com>
  * Prafulla Wadaskar <prafulla@marvell.com>
@@ -6,532 +11,1007 @@
  * SPDX-License-Identifier:	GPL-2.0+
  */
 
+/*
+ * PHY driver for mv88e61xx ethernet switches.
+ *
+ * This driver configures the mv88e61xx for basic use as a PHY.  The switch
+ * supports a VLAN configuration that determines how traffic will be routed
+ * between the ports.  This driver uses a simple configuration that routes
+ * traffic from each PHY port only to the CPU port, and from the CPU port to
+ * any PHY port.
+ *
+ * The configuration determines which PHY ports to activate using the
+ * CONFIG_MV88E61XX_PHY_PORTS bitmask.  Setting bit 0 will activate port 0, bit
+ * 1 activates port 1, etc.  Do not set the bit for the port the CPU is
+ * connected to unless it is connected over a PHY interface (not MII).
+ *
+ * This driver was written for and tested on the mv88e6176 with an SGMII
+ * connection.  Other configurations should be supported, but some additions or
+ * changes may be required.
+ */
+
 #include <common.h>
+
+#include <bitfield.h>
+#include <errno.h>
+#include <malloc.h>
+#include <miiphy.h>
 #include <netdev.h>
-#include "mv88e61xx.h"
+
+#define PHY_AUTONEGOTIATE_TIMEOUT	5000
+
+#define PORT_COUNT			7
+#define PORT_MASK			((1 << PORT_COUNT) - 1)
+
+/* Device addresses */
+#define DEVADDR_PHY(p)			(p)
+#define DEVADDR_PORT(p)			(0x10 + (p))
+#define DEVADDR_SERDES			0x0F
+#define DEVADDR_GLOBAL_1		0x1B
+#define DEVADDR_GLOBAL_2		0x1C
+
+/* SMI indirection registers for multichip addressing mode */
+#define SMI_CMD_REG			0x00
+#define SMI_DATA_REG			0x01
+
+/* Global registers */
+#define GLOBAL1_STATUS			0x00
+#define GLOBAL1_CTRL			0x04
+#define GLOBAL1_MON_CTRL		0x1A
+
+/* Global 2 registers */
+#define GLOBAL2_REG_PHY_CMD		0x18
+#define GLOBAL2_REG_PHY_DATA		0x19
+
+/* Port registers */
+#define PORT_REG_STATUS			0x00
+#define PORT_REG_PHYS_CTRL		0x01
+#define PORT_REG_SWITCH_ID		0x03
+#define PORT_REG_CTRL			0x04
+#define PORT_REG_VLAN_MAP		0x06
+#define PORT_REG_VLAN_ID		0x07
+
+/* Phy registers */
+#define PHY_REG_CTRL1			0x10
+#define PHY_REG_STATUS1			0x11
+#define PHY_REG_PAGE			0x16
+
+/* Serdes registers */
+#define SERDES_REG_CTRL_1		0x10
+
+/* Phy page numbers */
+#define PHY_PAGE_COPPER			0
+#define PHY_PAGE_SERDES			1
+
+/* Register fields */
+#define GLOBAL1_CTRL_SWRESET		BIT(15)
+
+#define GLOBAL1_MON_CTRL_CPUDEST_SHIFT	4
+#define GLOBAL1_MON_CTRL_CPUDEST_WIDTH	4
+
+#define PORT_REG_STATUS_LINK		BIT(11)
+#define PORT_REG_STATUS_DUPLEX		BIT(10)
+
+#define PORT_REG_STATUS_SPEED_SHIFT	8
+#define PORT_REG_STATUS_SPEED_WIDTH	2
+#define PORT_REG_STATUS_SPEED_10	0
+#define PORT_REG_STATUS_SPEED_100	1
+#define PORT_REG_STATUS_SPEED_1000	2
+
+#define PORT_REG_STATUS_CMODE_MASK		0xF
+#define PORT_REG_STATUS_CMODE_100BASE_X		0x8
+#define PORT_REG_STATUS_CMODE_1000BASE_X	0x9
+#define PORT_REG_STATUS_CMODE_SGMII		0xa
+
+#define PORT_REG_PHYS_CTRL_LINK_VALUE	BIT(5)
+#define PORT_REG_PHYS_CTRL_LINK_FORCE	BIT(4)
+
+#define PORT_REG_CTRL_PSTATE_SHIFT	0
+#define PORT_REG_CTRL_PSTATE_WIDTH	2
+
+#define PORT_REG_VLAN_ID_DEF_VID_SHIFT	0
+#define PORT_REG_VLAN_ID_DEF_VID_WIDTH	12
+
+#define PORT_REG_VLAN_MAP_TABLE_SHIFT	0
+#define PORT_REG_VLAN_MAP_TABLE_WIDTH	11
+
+#define SERDES_REG_CTRL_1_FORCE_LINK	BIT(10)
+
+#define PHY_REG_CTRL1_ENERGY_DET_SHIFT	8
+#define PHY_REG_CTRL1_ENERGY_DET_WIDTH	2
+
+/* Field values */
+#define PORT_REG_CTRL_PSTATE_DISABLED	0
+#define PORT_REG_CTRL_PSTATE_FORWARD	3
+
+#define PHY_REG_CTRL1_ENERGY_DET_OFF	0
+#define PHY_REG_CTRL1_ENERGY_DET_SENSE_ONLY	2
+#define PHY_REG_CTRL1_ENERGY_DET_SENSE_XMIT	3
+
+/* PHY Status Register */
+#define PHY_REG_STATUS1_SPEED		0xc000
+#define PHY_REG_STATUS1_GBIT		0x8000
+#define PHY_REG_STATUS1_100		0x4000
+#define PHY_REG_STATUS1_DUPLEX		0x2000
+#define PHY_REG_STATUS1_SPDDONE		0x0800
+#define PHY_REG_STATUS1_LINK		0x0400
+#define PHY_REG_STATUS1_ENERGY		0x0010
 
 /*
- * Uncomment either of the following line for local debug control;
- * otherwise global debug control will apply.
+ * Macros for building commands for indirect addressing modes.  These are valid
+ * for both the indirect multichip addressing mode and the PHY indirection
+ * required for the writes to any PHY register.
  */
+#define SMI_BUSY			BIT(15)
+#define SMI_CMD_CLAUSE_22		BIT(12)
+#define SMI_CMD_CLAUSE_22_OP_READ	(2 << 10)
+#define SMI_CMD_CLAUSE_22_OP_WRITE	(1 << 10)
 
-/* #undef DEBUG */
-/* #define DEBUG */
+#define SMI_CMD_READ			(SMI_BUSY | SMI_CMD_CLAUSE_22 | \
+					 SMI_CMD_CLAUSE_22_OP_READ)
+#define SMI_CMD_WRITE			(SMI_BUSY | SMI_CMD_CLAUSE_22 | \
+					 SMI_CMD_CLAUSE_22_OP_WRITE)
 
-#ifdef CONFIG_MV88E61XX_MULTICHIP_ADRMODE
-/* Chip Address mode
- * The Switch support two modes of operation
- * 1. single chip mode and
- * 2. Multi-chip mode
- * Refer section 9.2 &9.3 in chip datasheet-02 for more details
- *
- * By default single chip mode is configured
- * multichip mode operation can be configured in board header
- */
-static int mv88e61xx_busychk_multic(char *name, u32 devaddr)
-{
-	u16 reg = 0;
-	u32 timeout = MV88E61XX_PHY_TIMEOUT;
+#define SMI_CMD_ADDR_SHIFT		5
+#define SMI_CMD_ADDR_WIDTH		5
+#define SMI_CMD_REG_SHIFT		0
+#define SMI_CMD_REG_WIDTH		5
 
-	/* Poll till SMIBusy bit is clear */
-	do {
-		miiphy_read(name, devaddr, 0x0, &reg);
-		if (timeout-- == 0) {
-			printf("SMI busy timeout\n");
-			return -1;
-		}
-	} while (reg & (1 << 15));
-	return 0;
-}
-
-static void mv88e61xx_switch_write(char *name, u32 phy_adr,
-	u32 reg_ofs, u16 data)
-{
-	u16 mii_dev_addr;
-
-	/* command to read PHY dev address */
-	if (miiphy_read(name, 0xEE, 0xEE, &mii_dev_addr)) {
-		printf("Error..could not read PHY dev address\n");
-		return;
-	}
-	mv88e61xx_busychk_multic(name, mii_dev_addr);
-	/* Write data to Switch indirect data register */
-	miiphy_write(name, mii_dev_addr, 0x1, data);
-	/* Write command to Switch indirect command register (write) */
-	miiphy_write(name, mii_dev_addr, 0x0,
-		     reg_ofs | (phy_adr << 5) | (1 << 10) | (1 << 12) | (1 <<
-									 15));
-}
-
-static void mv88e61xx_switch_read(char *name, u32 phy_adr,
-	u32 reg_ofs, u16 *data)
-{
-	u16 mii_dev_addr;
-
-	/* command to read PHY dev address */
-	if (miiphy_read(name, 0xEE, 0xEE, &mii_dev_addr)) {
-		printf("Error..could not read PHY dev address\n");
-		return;
-	}
-	mv88e61xx_busychk_multic(name, mii_dev_addr);
-	/* Write command to Switch indirect command register (read) */
-	miiphy_write(name, mii_dev_addr, 0x0,
-		     reg_ofs | (phy_adr << 5) | (1 << 11) | (1 << 12) | (1 <<
-									 15));
-	mv88e61xx_busychk_multic(name, mii_dev_addr);
-	/* Read data from Switch indirect data register */
-	miiphy_read(name, mii_dev_addr, 0x1, data);
-}
-#endif /* CONFIG_MV88E61XX_MULTICHIP_ADRMODE */
-
-/*
- * Convenience macros for switch device/port reads/writes
- * These macros output valid 'mv88e61xx' U_BOOT_CMDs
- */
-
-#ifndef DEBUG
-#define WR_SWITCH_REG wr_switch_reg
-#define RD_SWITCH_REG rd_switch_reg
-#define WR_SWITCH_PORT_REG(n, p, r, d) \
-	WR_SWITCH_REG(n, (MV88E61XX_PRT_OFST+p), r, d)
-#define RD_SWITCH_PORT_REG(n, p, r, d) \
-	RD_SWITCH_REG(n, (MV88E61XX_PRT_OFST+p), r, d)
-#else
-static void WR_SWITCH_REG(char *name, u32 dev_adr, u32 reg_ofs, u16 data)
-{
-	printf("mv88e61xx %s dev %02x reg %02x write %04x\n",
-		name, dev_adr, reg_ofs, data);
-	wr_switch_reg(name, dev_adr, reg_ofs, data);
-}
-static void RD_SWITCH_REG(char *name, u32 dev_adr, u32 reg_ofs, u16 *data)
-{
-	rd_switch_reg(name, dev_adr, reg_ofs, data);
-	printf("mv88e61xx %s dev %02x reg %02x read %04x\n",
-		name, dev_adr, reg_ofs, *data);
-}
-static void WR_SWITCH_PORT_REG(char *name, u32 prt_adr, u32 reg_ofs,
-	u16 data)
-{
-	printf("mv88e61xx %s port %02x reg %02x write %04x\n",
-		name, prt_adr, reg_ofs, data);
-	wr_switch_reg(name, (MV88E61XX_PRT_OFST+prt_adr), reg_ofs, data);
-}
-static void RD_SWITCH_PORT_REG(char *name, u32 prt_adr, u32 reg_ofs,
-	u16 *data)
-{
-	rd_switch_reg(name, (MV88E61XX_PRT_OFST+prt_adr), reg_ofs, data);
-	printf("mv88e61xx %s port %02x reg %02x read %04x\n",
-		name, prt_adr, reg_ofs, *data);
-}
+/* Check for required macros */
+#ifndef CONFIG_MV88E61XX_PHY_PORTS
+#error Define CONFIG_MV88E61XX_PHY_PORTS to indicate which physical ports \
+	to activate
+#endif
+#ifndef CONFIG_MV88E61XX_CPU_PORT
+#error Define CONFIG_MV88E61XX_CPU_PORT to the port the CPU is attached to
 #endif
 
-/*
- * Local functions to read/write registers on the switch PHYs.
- * NOTE! This goes through switch, not direct miiphy, writes and reads!
- */
+/* ID register values for different switch models */
+#define PORT_SWITCH_ID_6172		0x1720
+#define PORT_SWITCH_ID_6176		0x1760
+#define PORT_SWITCH_ID_6240		0x2400
+#define PORT_SWITCH_ID_6352		0x3520
 
-/*
- * Make sure SMIBusy bit cleared before another
- * SMI operation can take place
- */
-static int mv88e61xx_busychk(char *name)
+struct mv88e61xx_phy_priv {
+	struct mii_dev *mdio_bus;
+	int smi_addr;
+	int id;
+};
+
+static inline int smi_cmd(int cmd, int addr, int reg)
 {
-	u16 reg = 0;
-	u32 timeout = MV88E61XX_PHY_TIMEOUT;
+	cmd = bitfield_replace(cmd, SMI_CMD_ADDR_SHIFT, SMI_CMD_ADDR_WIDTH,
+			       addr);
+	cmd = bitfield_replace(cmd, SMI_CMD_REG_SHIFT, SMI_CMD_REG_WIDTH, reg);
+	return cmd;
+}
+
+static inline int smi_cmd_read(int addr, int reg)
+{
+	return smi_cmd(SMI_CMD_READ, addr, reg);
+}
+
+static inline int smi_cmd_write(int addr, int reg)
+{
+	return smi_cmd(SMI_CMD_WRITE, addr, reg);
+}
+
+__weak int mv88e61xx_hw_reset(struct phy_device *phydev)
+{
+	return 0;
+}
+
+/* Wait for the current SMI indirect command to complete */
+static int mv88e61xx_smi_wait(struct mii_dev *bus, int smi_addr)
+{
+	int val;
+	u32 timeout = 100;
+
 	do {
-		rd_switch_reg(name, MV88E61XX_GLB2REG_DEVADR,
-		       MV88E61XX_PHY_CMD, &reg);
-		if (timeout-- == 0) {
-			printf("SMI busy timeout\n");
-			return -1;
-		}
-	} while (reg & 1 << 15);	/* busy mask */
-	return 0;
-}
+		val = bus->read(bus, smi_addr, MDIO_DEVAD_NONE, SMI_CMD_REG);
+		if (val >= 0 && (val & SMI_BUSY) == 0)
+			return 0;
 
-static inline int mv88e61xx_switch_miiphy_write(char *name, u32 phy,
-	u32 reg, u16 data)
-{
-	/* write switch data reg then cmd reg then check completion */
-	wr_switch_reg(name, MV88E61XX_GLB2REG_DEVADR, MV88E61XX_PHY_DATA,
-		data);
-	wr_switch_reg(name, MV88E61XX_GLB2REG_DEVADR, MV88E61XX_PHY_CMD,
-		(MV88E61XX_PHY_WRITE_CMD | (phy << 5)  | reg));
-	return mv88e61xx_busychk(name);
-}
+		mdelay(1);
+	} while (--timeout);
 
-static inline int mv88e61xx_switch_miiphy_read(char *name, u32 phy,
-	u32 reg, u16 *data)
-{
-	/* write switch cmd reg, check for completion */
-	wr_switch_reg(name, MV88E61XX_GLB2REG_DEVADR, MV88E61XX_PHY_CMD,
-		(MV88E61XX_PHY_READ_CMD | (phy << 5)  | reg));
-	if (mv88e61xx_busychk(name))
-		return -1;
-	/* read switch data reg and return success */
-	rd_switch_reg(name, MV88E61XX_GLB2REG_DEVADR, MV88E61XX_PHY_DATA, data);
-	return 0;
+	puts("SMI busy timeout\n");
+	return -ETIMEDOUT;
 }
 
 /*
- * Convenience macros for switch PHY reads/writes
- */
-
-#ifndef DEBUG
-#define WR_SWITCH_PHY_REG mv88e61xx_switch_miiphy_write
-#define RD_SWITCH_PHY_REG mv88e61xx_switch_miiphy_read
-#else
-static inline int WR_SWITCH_PHY_REG(char *name, u32 phy_adr,
-	u32 reg_ofs, u16 data)
-{
-	int r = mv88e61xx_switch_miiphy_write(name, phy_adr, reg_ofs, data);
-	if (r)
-		printf("** ERROR writing mv88e61xx %s phy %02x reg %02x\n",
-			name, phy_adr, reg_ofs);
-	else
-		printf("mv88e61xx %s phy %02x reg %02x write %04x\n",
-			name, phy_adr, reg_ofs, data);
-	return r;
-}
-static inline int RD_SWITCH_PHY_REG(char *name, u32 phy_adr,
-	u32 reg_ofs, u16 *data)
-{
-	int r = mv88e61xx_switch_miiphy_read(name, phy_adr, reg_ofs, data);
-	if (r)
-		printf("** ERROR reading mv88e61xx %s phy %02x reg %02x\n",
-			name, phy_adr, reg_ofs);
-	else
-		printf("mv88e61xx %s phy %02x reg %02x read %04x\n",
-			name, phy_adr, reg_ofs, *data);
-	return r;
-}
-#endif
-
-static void mv88e61xx_port_vlan_config(struct mv88e61xx_config *swconfig)
-{
-	u32 prt;
-	u16 reg;
-	char *name = swconfig->name;
-	u32 port_mask = swconfig->ports_enabled;
-
-	/* apply internal vlan config */
-	for (prt = 0; prt < MV88E61XX_MAX_PORTS_NUM; prt++) {
-		/* only for enabled ports */
-		if ((1 << prt) & port_mask) {
-			/* take vlan map from swconfig */
-			u8 vlanmap = swconfig->vlancfg[prt];
-			/* remove disabled ports from vlan map */
-			vlanmap &= swconfig->ports_enabled;
-			/* apply vlan map to port */
-			RD_SWITCH_PORT_REG(name, prt,
-				MV88E61XX_PRT_VMAP_REG, &reg);
-			reg &= ~((1 << MV88E61XX_MAX_PORTS_NUM) - 1);
-			reg |= vlanmap;
-			WR_SWITCH_PORT_REG(name, prt,
-				MV88E61XX_PRT_VMAP_REG, reg);
-		}
-	}
-}
-
-/*
- * Power up the specified port and reset PHY
- */
-static int mv88361xx_powerup(struct mv88e61xx_config *swconfig, u32 phy)
-{
-	char *name = swconfig->name;
-
-	/* Write Copper Specific control reg1 (0x10) for-
-	 * Enable Phy power up
-	 * Energy Detect on (sense&Xmit NLP Periodically
-	 * reset other settings default
-	 */
-	if (WR_SWITCH_PHY_REG(name, phy, 0x10, 0x3360))
-		return -1;
-
-	/* Write PHY ctrl reg (0x0) to apply
-	 * Phy reset (set bit 15 low)
-	 * reset other default values
-	 */
-	if (WR_SWITCH_PHY_REG(name, phy, 0x00, 0x9140))
-		return -1;
-
-	return 0;
-}
-
-/*
- * Default Setup for LED[0]_Control (ref: Table 46 Datasheet-3)
- * is set to "On-1000Mb/s Link, Off Else"
- * This function sets it to "On-Link, Blink-Activity, Off-NoLink"
+ * The mv88e61xx has three types of addresses: the smi bus address, the device
+ * address, and the register address.  The smi bus address distinguishes it on
+ * the smi bus from other PHYs or switches.  The device address determines
+ * which on-chip register set you are reading/writing (the various PHYs, their
+ * associated ports, or global configuration registers).  The register address
+ * is the offset of the register you are reading/writing.
  *
- * This is optional settings may be needed on some boards
- * to setup PHY LEDs default configuration to detect 10/100/1000Mb/s
- * Link status
+ * When the mv88e61xx is hardware configured to have address zero, it behaves in
+ * single-chip addressing mode, where it responds to all SMI addresses, using
+ * the smi address as its device address.  This obviously only works when this
+ * is the only chip on the SMI bus.  This allows the driver to access device
+ * registers without using indirection.  When the chip is configured to a
+ * non-zero address, it only responds to that SMI address and requires indirect
+ * writes to access the different device addresses.
  */
-static int mv88361xx_led_init(struct mv88e61xx_config *swconfig, u32 phy)
+static int mv88e61xx_reg_read(struct phy_device *phydev, int dev, int reg)
 {
-	char *name = swconfig->name;
+	struct mv88e61xx_phy_priv *priv = phydev->priv;
+	struct mii_dev *mdio_bus = priv->mdio_bus;
+	int smi_addr = priv->smi_addr;
+	int res;
 
-	if (swconfig->led_init != MV88E61XX_LED_INIT_EN)
-		return 0;
+	/* In single-chip mode, the device can be addressed directly */
+	if (smi_addr == 0)
+		return mdio_bus->read(mdio_bus, dev, MDIO_DEVAD_NONE, reg);
 
-	/* set page address to 3 */
-	if (WR_SWITCH_PHY_REG(name, phy, 0x16, 0x0003))
-		return -1;
+	/* Wait for the bus to become free */
+	res = mv88e61xx_smi_wait(mdio_bus, smi_addr);
+	if (res < 0)
+		return res;
 
-	/*
-	 * set LED Func Ctrl reg
-	 * value 0x0001 = LED[0] On-Link, Blink-Activity, Off-NoLink
-	 */
-	if (WR_SWITCH_PHY_REG(name, phy, 0x10, 0x0001))
-		return -1;
+	/* Issue the read command */
+	res = mdio_bus->write(mdio_bus, smi_addr, MDIO_DEVAD_NONE, SMI_CMD_REG,
+			 smi_cmd_read(dev, reg));
+	if (res < 0)
+		return res;
 
-	/* set page address to 0 */
-	if (WR_SWITCH_PHY_REG(name, phy, 0x16, 0x0000))
-		return -1;
+	/* Wait for the read command to complete */
+	res = mv88e61xx_smi_wait(mdio_bus, smi_addr);
+	if (res < 0)
+		return res;
+
+	/* Read the data */
+	res = mdio_bus->read(mdio_bus, smi_addr, MDIO_DEVAD_NONE, SMI_DATA_REG);
+	if (res < 0)
+		return res;
+
+	return bitfield_extract(res, 0, 16);
+}
+
+/* See the comment above mv88e61xx_reg_read */
+static int mv88e61xx_reg_write(struct phy_device *phydev, int dev, int reg,
+			       u16 val)
+{
+	struct mv88e61xx_phy_priv *priv = phydev->priv;
+	struct mii_dev *mdio_bus = priv->mdio_bus;
+	int smi_addr = priv->smi_addr;
+	int res;
+
+	/* In single-chip mode, the device can be addressed directly */
+	if (smi_addr == 0) {
+		return mdio_bus->write(mdio_bus, dev, MDIO_DEVAD_NONE, reg,
+				val);
+	}
+
+	/* Wait for the bus to become free */
+	res = mv88e61xx_smi_wait(mdio_bus, smi_addr);
+	if (res < 0)
+		return res;
+
+	/* Set the data to write */
+	res = mdio_bus->write(mdio_bus, smi_addr, MDIO_DEVAD_NONE,
+				SMI_DATA_REG, val);
+	if (res < 0)
+		return res;
+
+	/* Issue the write command */
+	res = mdio_bus->write(mdio_bus, smi_addr, MDIO_DEVAD_NONE, SMI_CMD_REG,
+				smi_cmd_write(dev, reg));
+	if (res < 0)
+		return res;
+
+	/* Wait for the write command to complete */
+	res = mv88e61xx_smi_wait(mdio_bus, smi_addr);
+	if (res < 0)
+		return res;
 
 	return 0;
 }
 
-/*
- * Reverse Transmit polarity for Media Dependent Interface
- * Pins (MDIP) bits in Copper Specific Control Register 3
- * (Page 0, Reg 20 for each phy (except cpu port)
- * Reference: Section 1.1 Switch datasheet-3
- *
- * This is optional settings may be needed on some boards
- * for PHY<->magnetics h/w tuning
- */
-static int mv88361xx_reverse_mdipn(struct mv88e61xx_config *swconfig, u32 phy)
+static int mv88e61xx_phy_wait(struct phy_device *phydev)
 {
-	char *name = swconfig->name;
+	int val;
+	u32 timeout = 100;
 
-	if (swconfig->mdip != MV88E61XX_MDIP_REVERSE)
-		return 0;
+	do {
+		val = mv88e61xx_reg_read(phydev, DEVADDR_GLOBAL_2,
+					 GLOBAL2_REG_PHY_CMD);
+		if (val >= 0 && (val & SMI_BUSY) == 0)
+			return 0;
 
-	/*Reverse MDIP/N[3:0] bits */
-	if (WR_SWITCH_PHY_REG(name, phy, 0x14, 0x000f))
-		return -1;
+		mdelay(1);
+	} while (--timeout);
 
-	return 0;
+	return -ETIMEDOUT;
 }
 
-/*
- * Marvell 88E61XX Switch initialization
- */
-int mv88e61xx_switch_initialize(struct mv88e61xx_config *swconfig)
+static int mv88e61xx_phy_read_indirect(struct mii_dev *smi_wrapper, int dev,
+		int devad, int reg)
 {
-	u32 prt;
-	u16 reg;
-	char *idstr;
-	char *name = swconfig->name;
-	int time;
+	struct phy_device *phydev;
+	int res;
 
-	if (miiphy_set_current_dev(name)) {
-		printf("%s failed\n", __FUNCTION__);
-		return -1;
+	phydev = (struct phy_device *)smi_wrapper->priv;
+
+	/* Issue command to read */
+	res = mv88e61xx_reg_write(phydev, DEVADDR_GLOBAL_2,
+				  GLOBAL2_REG_PHY_CMD,
+				  smi_cmd_read(dev, reg));
+
+	/* Wait for data to be read */
+	res = mv88e61xx_phy_wait(phydev);
+	if (res < 0)
+		return res;
+
+	/* Read retrieved data */
+	return mv88e61xx_reg_read(phydev, DEVADDR_GLOBAL_2,
+				  GLOBAL2_REG_PHY_DATA);
+}
+
+static int mv88e61xx_phy_write_indirect(struct mii_dev *smi_wrapper, int dev,
+		int devad, int reg, u16 data)
+{
+	struct phy_device *phydev;
+	int res;
+
+	phydev = (struct phy_device *)smi_wrapper->priv;
+
+	/* Set the data to write */
+	res = mv88e61xx_reg_write(phydev, DEVADDR_GLOBAL_2,
+				  GLOBAL2_REG_PHY_DATA, data);
+	if (res < 0)
+		return res;
+	/* Issue the write command */
+	res = mv88e61xx_reg_write(phydev, DEVADDR_GLOBAL_2,
+				  GLOBAL2_REG_PHY_CMD,
+				  smi_cmd_write(dev, reg));
+	if (res < 0)
+		return res;
+
+	/* Wait for command to complete */
+	return mv88e61xx_phy_wait(phydev);
+}
+
+/* Wrapper function to make calls to phy_read_indirect simpler */
+static int mv88e61xx_phy_read(struct phy_device *phydev, int phy, int reg)
+{
+	return mv88e61xx_phy_read_indirect(phydev->bus, DEVADDR_PHY(phy),
+					   MDIO_DEVAD_NONE, reg);
+}
+
+/* Wrapper function to make calls to phy_read_indirect simpler */
+static int mv88e61xx_phy_write(struct phy_device *phydev, int phy,
+		int reg, u16 val)
+{
+	return mv88e61xx_phy_write_indirect(phydev->bus, DEVADDR_PHY(phy),
+					    MDIO_DEVAD_NONE, reg, val);
+}
+
+static int mv88e61xx_port_read(struct phy_device *phydev, u8 port, u8 reg)
+{
+	return mv88e61xx_reg_read(phydev, DEVADDR_PORT(port), reg);
+}
+
+static int mv88e61xx_port_write(struct phy_device *phydev, u8 port, u8 reg,
+								u16 val)
+{
+	return mv88e61xx_reg_write(phydev, DEVADDR_PORT(port), reg, val);
+}
+
+static int mv88e61xx_set_page(struct phy_device *phydev, u8 phy, u8 page)
+{
+	return mv88e61xx_phy_write(phydev, phy, PHY_REG_PAGE, page);
+}
+
+static int mv88e61xx_get_switch_id(struct phy_device *phydev)
+{
+	int res;
+
+	res = mv88e61xx_port_read(phydev, 0, PORT_REG_SWITCH_ID);
+	if (res < 0)
+		return res;
+	return res & 0xfff0;
+}
+
+static bool mv88e61xx_6352_family(struct phy_device *phydev)
+{
+	struct mv88e61xx_phy_priv *priv = phydev->priv;
+
+	switch (priv->id) {
+	case PORT_SWITCH_ID_6172:
+	case PORT_SWITCH_ID_6176:
+	case PORT_SWITCH_ID_6240:
+	case PORT_SWITCH_ID_6352:
+		return true;
+	}
+	return false;
+}
+
+static int mv88e61xx_get_cmode(struct phy_device *phydev, u8 port)
+{
+	int res;
+
+	res = mv88e61xx_port_read(phydev, port, PORT_REG_STATUS);
+	if (res < 0)
+		return res;
+	return res & PORT_REG_STATUS_CMODE_MASK;
+}
+
+static int mv88e61xx_parse_status(struct phy_device *phydev)
+{
+	unsigned int speed;
+	unsigned int mii_reg;
+
+	mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, PHY_REG_STATUS1);
+
+	if ((mii_reg & PHY_REG_STATUS1_LINK) &&
+	    !(mii_reg & PHY_REG_STATUS1_SPDDONE)) {
+		int i = 0;
+
+		puts("Waiting for PHY realtime link");
+		while (!(mii_reg & PHY_REG_STATUS1_SPDDONE)) {
+			/* Timeout reached ? */
+			if (i > PHY_AUTONEGOTIATE_TIMEOUT) {
+				puts(" TIMEOUT !\n");
+				phydev->link = 0;
+				break;
+			}
+
+			if ((i++ % 1000) == 0)
+				putc('.');
+			udelay(1000);
+			mii_reg = phy_read(phydev, MDIO_DEVAD_NONE,
+					PHY_REG_STATUS1);
+		}
+		puts(" done\n");
+		udelay(500000);	/* another 500 ms (results in faster booting) */
+	} else {
+		if (mii_reg & PHY_REG_STATUS1_LINK)
+			phydev->link = 1;
+		else
+			phydev->link = 0;
 	}
 
-	if (!(swconfig->cpuport & ((1 << 4) | (1 << 5)))) {
-		swconfig->cpuport = (1 << 5);
-		printf("Invalid cpu port config, using default port5\n");
-	}
+	if (mii_reg & PHY_REG_STATUS1_DUPLEX)
+		phydev->duplex = DUPLEX_FULL;
+	else
+		phydev->duplex = DUPLEX_HALF;
 
-	RD_SWITCH_PORT_REG(name, 0, MII_PHYSID2, &reg);
-	switch (reg &= 0xfff0) {
-	case 0x1610:
-		idstr = "88E6161";
+	speed = mii_reg & PHY_REG_STATUS1_SPEED;
+
+	switch (speed) {
+	case PHY_REG_STATUS1_GBIT:
+		phydev->speed = SPEED_1000;
 		break;
-	case 0x1650:
-		idstr = "88E6165";
-		break;
-	case 0x1210:
-		idstr = "88E6123";
-		/* ports 2,3,4 not available */
-		swconfig->ports_enabled &= 0x023;
+	case PHY_REG_STATUS1_100:
+		phydev->speed = SPEED_100;
 		break;
 	default:
-		/* Could not detect switch id */
-		idstr = "88E61??";
+		phydev->speed = SPEED_10;
 		break;
 	}
 
-	/* be sure all ports are disabled */
-	for (prt = 0; prt < MV88E61XX_MAX_PORTS_NUM; prt++) {
-		RD_SWITCH_PORT_REG(name, prt, MV88E61XX_PRT_CTRL_REG, &reg);
-		reg &= ~0x3;
-		WR_SWITCH_PORT_REG(name, prt, MV88E61XX_PRT_CTRL_REG, reg);
+	return 0;
+}
+
+static int mv88e61xx_switch_reset(struct phy_device *phydev)
+{
+	int time;
+	int val;
+	u8 port;
+
+	/* Disable all ports */
+	for (port = 0; port < PORT_COUNT; port++) {
+		val = mv88e61xx_port_read(phydev, port, PORT_REG_CTRL);
+		if (val < 0)
+			return val;
+		val = bitfield_replace(val, PORT_REG_CTRL_PSTATE_SHIFT,
+				       PORT_REG_CTRL_PSTATE_WIDTH,
+				       PORT_REG_CTRL_PSTATE_DISABLED);
+		val = mv88e61xx_port_write(phydev, port, PORT_REG_CTRL, val);
+		if (val < 0)
+			return val;
 	}
 
-	/* wait 2 ms for queues to drain */
+	/* Wait 2 ms for queues to drain */
 	udelay(2000);
 
-	/* reset switch */
-	RD_SWITCH_REG(name, MV88E61XX_GLBREG_DEVADR, MV88E61XX_SGCR, &reg);
-	reg |= 0x8000;
-	WR_SWITCH_REG(name, MV88E61XX_GLBREG_DEVADR, MV88E61XX_SGCR, reg);
+	/* Reset switch */
+	val = mv88e61xx_reg_read(phydev, DEVADDR_GLOBAL_1, GLOBAL1_CTRL);
+	if (val < 0)
+		return val;
+	val |= GLOBAL1_CTRL_SWRESET;
+	val = mv88e61xx_reg_write(phydev, DEVADDR_GLOBAL_1,
+				     GLOBAL1_CTRL, val);
+	if (val < 0)
+		return val;
 
-	/* wait up to 1 second for switch reset complete */
+	/* Wait up to 1 second for switch reset complete */
 	for (time = 1000; time; time--) {
-		RD_SWITCH_REG(name, MV88E61XX_GLBREG_DEVADR, MV88E61XX_SGSR,
-			&reg);
-		if ((reg & 0xc800) == 0xc800)
+		val = mv88e61xx_reg_read(phydev, DEVADDR_GLOBAL_1,
+					    GLOBAL1_CTRL);
+		if (val >= 0 && ((val & GLOBAL1_CTRL_SWRESET) == 0))
 			break;
 		udelay(1000);
 	}
 	if (!time)
-		return -1;
+		return -ETIMEDOUT;
 
-	/* Port based VLANs configuration */
-	mv88e61xx_port_vlan_config(swconfig);
-
-	if (swconfig->rgmii_delay == MV88E61XX_RGMII_DELAY_EN) {
-		/*
-		 * Enable RGMII delay on Tx and Rx for CPU port
-		 * Ref: sec 9.5 of chip datasheet-02
-		 */
-		/*Force port link down */
-		WR_SWITCH_PORT_REG(name, 5, MV88E61XX_PCS_CTRL_REG, 0x10);
-		/* configure port RGMII delay */
-		WR_SWITCH_PORT_REG(name, 4,
-			MV88E61XX_RGMII_TIMECTRL_REG, 0x81e7);
-		RD_SWITCH_PORT_REG(name, 5,
-			MV88E61XX_RGMII_TIMECTRL_REG, &reg);
-		WR_SWITCH_PORT_REG(name, 5,
-			MV88E61XX_RGMII_TIMECTRL_REG, reg | 0x18);
-		WR_SWITCH_PORT_REG(name, 4,
-			MV88E61XX_RGMII_TIMECTRL_REG, 0xc1e7);
-		/* Force port to RGMII FDX 1000Base then up */
-		WR_SWITCH_PORT_REG(name, 5, MV88E61XX_PCS_CTRL_REG, 0x1e);
-		WR_SWITCH_PORT_REG(name, 5, MV88E61XX_PCS_CTRL_REG, 0x3e);
-	}
-
-	for (prt = 0; prt < MV88E61XX_MAX_PORTS_NUM; prt++) {
-
-		/* configure port's PHY */
-		if (!((1 << prt) & swconfig->cpuport)) {
-			/* port 4 has phy 6, not 4 */
-			int phy = (prt == 4) ? 6 : prt;
-			if (mv88361xx_powerup(swconfig, phy))
-				return -1;
-			if (mv88361xx_reverse_mdipn(swconfig, phy))
-				return -1;
-			if (mv88361xx_led_init(swconfig, phy))
-				return -1;
-		}
-
-		/* set port VID to port+1 except for cpu port */
-		if (!((1 << prt) & swconfig->cpuport)) {
-			RD_SWITCH_PORT_REG(name, prt,
-				MV88E61XX_PRT_VID_REG, &reg);
-			WR_SWITCH_PORT_REG(name, prt,
-				MV88E61XX_PRT_VID_REG,
-				(reg & ~1023) | (prt+1));
-		}
-
-		/*Program port state */
-		RD_SWITCH_PORT_REG(name, prt,
-			MV88E61XX_PRT_CTRL_REG, &reg);
-		WR_SWITCH_PORT_REG(name, prt,
-			MV88E61XX_PRT_CTRL_REG,
-			reg | (swconfig->portstate & 0x03));
-
-	}
-
-	printf("%s Initialized on %s\n", idstr, name);
 	return 0;
 }
 
-#ifdef CONFIG_MV88E61XX_CMD
-static int
-do_switch(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+static int mv88e61xx_serdes_init(struct phy_device *phydev)
 {
-	char *name, *endp;
-	int write = 0;
-	enum { dev, prt, phy } target = dev;
-	u32 addrlo, addrhi, addr;
-	u32 reglo, reghi, reg;
-	u16 data, rdata;
+	int val;
 
-	if (argc < 7)
-		return -1;
+	val = mv88e61xx_set_page(phydev, DEVADDR_SERDES, PHY_PAGE_SERDES);
+	if (val < 0)
+		return val;
 
-	name = argv[1];
+	/* Power up serdes module */
+	val = mv88e61xx_phy_read(phydev, DEVADDR_SERDES, MII_BMCR);
+	if (val < 0)
+		return val;
+	val &= ~(BMCR_PDOWN);
+	val = mv88e61xx_phy_write(phydev, DEVADDR_SERDES, MII_BMCR, val);
+	if (val < 0)
+		return val;
 
-	if (strcmp(argv[2], "phy") == 0)
-		target = phy;
-	else if (strcmp(argv[2], "port") == 0)
-		target = prt;
-	else if (strcmp(argv[2], "dev") != 0)
-		return 1;
-
-	addrlo = simple_strtoul(argv[3], &endp, 16);
-
-	if (!*endp) {
-		addrhi = addrlo;
-	} else {
-		while (*endp < '0' || *endp > '9')
-			endp++;
-		addrhi = simple_strtoul(endp, NULL, 16);
-	}
-
-	reglo = simple_strtoul(argv[5], &endp, 16);
-	if (!*endp) {
-		reghi = reglo;
-	} else {
-		while (*endp < '0' || *endp > '9')
-			endp++;
-		reghi = simple_strtoul(endp, NULL, 16);
-	}
-
-	if (strcmp(argv[6], "write") == 0)
-		write = 1;
-	else if (strcmp(argv[6], "read") != 0)
-		return 1;
-
-	data = simple_strtoul(argv[7], NULL, 16);
-
-	for (addr = addrlo; addr <= addrhi; addr++) {
-		for (reg = reglo; reg <= reghi; reg++) {
-			if (write) {
-				if (target == phy)
-					mv88e61xx_switch_miiphy_write(
-						name, addr, reg, data);
-				else if (target == prt)
-					wr_switch_reg(name,
-						addr+MV88E61XX_PRT_OFST,
-						reg, data);
-				else
-					wr_switch_reg(name, addr, reg, data);
-			} else {
-				if (target == phy)
-					mv88e61xx_switch_miiphy_read(
-						name, addr, reg, &rdata);
-				else if (target == prt)
-					rd_switch_reg(name,
-						addr+MV88E61XX_PRT_OFST,
-						reg, &rdata);
-				else
-					rd_switch_reg(name, addr, reg, &rdata);
-				printf("%s %s %s %02x %s %02x %s %04x\n",
-					argv[0], argv[1], argv[2], addr,
-					argv[4], reg, argv[6], rdata);
-				if (write && argc == 7 && rdata != data)
-					return 1;
-			}
-		}
-	}
 	return 0;
 }
 
-U_BOOT_CMD(mv88e61xx, 8, 0, do_switch,
-	"Read or write mv88e61xx switch registers",
-	"<ethdevice> dev|port|phy <addr> reg <reg> write <data>\n"
-	"<ethdevice> dev|port|phy <addr> reg <reg> read [<data>]\n"
-	"    - read/write switch device, port or phy at (addr,reg)\n"
-	"      addr=0..0x1C for dev, 0..5 for port or phy.\n"
-	"      reg=0..0x1F.\n"
-	"      data=0..0xFFFF (tested if present against actual read).\n"
-	"      All numeric parameters are assumed to be hex.\n"
-	"      <addr> and <<reg> arguments can be ranges (x..y)"
-);
-#endif /* CONFIG_MV88E61XX_CMD */
+static int mv88e61xx_port_enable(struct phy_device *phydev, u8 port)
+{
+	int val;
+
+	val = mv88e61xx_port_read(phydev, port, PORT_REG_CTRL);
+	if (val < 0)
+		return val;
+	val = bitfield_replace(val, PORT_REG_CTRL_PSTATE_SHIFT,
+			       PORT_REG_CTRL_PSTATE_WIDTH,
+			       PORT_REG_CTRL_PSTATE_FORWARD);
+	val = mv88e61xx_port_write(phydev, port, PORT_REG_CTRL, val);
+	if (val < 0)
+		return val;
+
+	return 0;
+}
+
+static int mv88e61xx_port_set_vlan(struct phy_device *phydev, u8 port,
+							u8 mask)
+{
+	int val;
+
+	/* Set VID to port number plus one */
+	val = mv88e61xx_port_read(phydev, port, PORT_REG_VLAN_ID);
+	if (val < 0)
+		return val;
+	val = bitfield_replace(val, PORT_REG_VLAN_ID_DEF_VID_SHIFT,
+			       PORT_REG_VLAN_ID_DEF_VID_WIDTH,
+			       port + 1);
+	val = mv88e61xx_port_write(phydev, port, PORT_REG_VLAN_ID, val);
+	if (val < 0)
+		return val;
+
+	/* Set VID mask */
+	val = mv88e61xx_port_read(phydev, port, PORT_REG_VLAN_MAP);
+	if (val < 0)
+		return val;
+	val = bitfield_replace(val, PORT_REG_VLAN_MAP_TABLE_SHIFT,
+			       PORT_REG_VLAN_MAP_TABLE_WIDTH,
+			       mask);
+	val = mv88e61xx_port_write(phydev, port, PORT_REG_VLAN_MAP, val);
+	if (val < 0)
+		return val;
+
+	return 0;
+}
+
+static int mv88e61xx_read_port_config(struct phy_device *phydev, u8 port)
+{
+	int res;
+	int val;
+	bool forced = false;
+
+	val = mv88e61xx_port_read(phydev, port, PORT_REG_STATUS);
+	if (val < 0)
+		return val;
+	if (!(val & PORT_REG_STATUS_LINK)) {
+		/* Temporarily force link to read port configuration */
+		u32 timeout = 100;
+		forced = true;
+
+		val = mv88e61xx_port_read(phydev, port, PORT_REG_PHYS_CTRL);
+		if (val < 0)
+			return val;
+		val |= (PORT_REG_PHYS_CTRL_LINK_FORCE |
+				PORT_REG_PHYS_CTRL_LINK_VALUE);
+		val = mv88e61xx_port_write(phydev, port, PORT_REG_PHYS_CTRL,
+					   val);
+		if (val < 0)
+			return val;
+
+		/* Wait for status register to reflect forced link */
+		do {
+			val = mv88e61xx_port_read(phydev, port,
+						  PORT_REG_STATUS);
+			if (val < 0)
+				goto unforce;
+			if (val & PORT_REG_STATUS_LINK)
+				break;
+		} while (--timeout);
+
+		if (timeout == 0) {
+			res = -ETIMEDOUT;
+			goto unforce;
+		}
+	}
+
+	if (val & PORT_REG_STATUS_DUPLEX)
+		phydev->duplex = DUPLEX_FULL;
+	else
+		phydev->duplex = DUPLEX_HALF;
+
+	val = bitfield_extract(val, PORT_REG_STATUS_SPEED_SHIFT,
+			       PORT_REG_STATUS_SPEED_WIDTH);
+	switch (val) {
+	case PORT_REG_STATUS_SPEED_1000:
+		phydev->speed = SPEED_1000;
+		break;
+	case PORT_REG_STATUS_SPEED_100:
+		phydev->speed = SPEED_100;
+		break;
+	default:
+		phydev->speed = SPEED_10;
+		break;
+	}
+
+	res = 0;
+
+unforce:
+	if (forced) {
+		val = mv88e61xx_port_read(phydev, port, PORT_REG_PHYS_CTRL);
+		if (val < 0)
+			return val;
+		val &= ~(PORT_REG_PHYS_CTRL_LINK_FORCE |
+				PORT_REG_PHYS_CTRL_LINK_VALUE);
+		val = mv88e61xx_port_write(phydev, port, PORT_REG_PHYS_CTRL,
+					   val);
+		if (val < 0)
+			return val;
+	}
+
+	return res;
+}
+
+static int mv88e61xx_set_cpu_port(struct phy_device *phydev)
+{
+	int val;
+
+	/* Set CPUDest */
+	val = mv88e61xx_reg_read(phydev, DEVADDR_GLOBAL_1, GLOBAL1_MON_CTRL);
+	if (val < 0)
+		return val;
+	val = bitfield_replace(val, GLOBAL1_MON_CTRL_CPUDEST_SHIFT,
+			       GLOBAL1_MON_CTRL_CPUDEST_WIDTH,
+			       CONFIG_MV88E61XX_CPU_PORT);
+	val = mv88e61xx_reg_write(phydev, DEVADDR_GLOBAL_1,
+				     GLOBAL1_MON_CTRL, val);
+	if (val < 0)
+		return val;
+
+	/* Allow CPU to route to any port */
+	val = PORT_MASK & ~(1 << CONFIG_MV88E61XX_CPU_PORT);
+	val = mv88e61xx_port_set_vlan(phydev, CONFIG_MV88E61XX_CPU_PORT, val);
+	if (val < 0)
+		return val;
+
+	/* Enable CPU port */
+	val = mv88e61xx_port_enable(phydev, CONFIG_MV88E61XX_CPU_PORT);
+	if (val < 0)
+		return val;
+
+	val = mv88e61xx_read_port_config(phydev, CONFIG_MV88E61XX_CPU_PORT);
+	if (val < 0)
+		return val;
+
+	/* If CPU is connected to serdes, initialize serdes */
+	if (mv88e61xx_6352_family(phydev)) {
+		val = mv88e61xx_get_cmode(phydev, CONFIG_MV88E61XX_CPU_PORT);
+		if (val < 0)
+			return val;
+		if (val == PORT_REG_STATUS_CMODE_100BASE_X ||
+		    val == PORT_REG_STATUS_CMODE_1000BASE_X ||
+		    val == PORT_REG_STATUS_CMODE_SGMII) {
+			val = mv88e61xx_serdes_init(phydev);
+			if (val < 0)
+				return val;
+		}
+	}
+
+	return 0;
+}
+
+static int mv88e61xx_switch_init(struct phy_device *phydev)
+{
+	static int init;
+	int res;
+
+	if (init)
+		return 0;
+
+	res = mv88e61xx_switch_reset(phydev);
+	if (res < 0)
+		return res;
+
+	res = mv88e61xx_set_cpu_port(phydev);
+	if (res < 0)
+		return res;
+
+	init = 1;
+
+	return 0;
+}
+
+static int mv88e61xx_phy_enable(struct phy_device *phydev, u8 phy)
+{
+	int val;
+
+	val = mv88e61xx_phy_read(phydev, phy, MII_BMCR);
+	if (val < 0)
+		return val;
+	val &= ~(BMCR_PDOWN);
+	val = mv88e61xx_phy_write(phydev, phy, MII_BMCR, val);
+	if (val < 0)
+		return val;
+
+	return 0;
+}
+
+static int mv88e61xx_phy_setup(struct phy_device *phydev, u8 phy)
+{
+	int val;
+
+	/*
+	 * Enable energy-detect sensing on PHY, used to determine when a PHY
+	 * port is physically connected
+	 */
+	val = mv88e61xx_phy_read(phydev, phy, PHY_REG_CTRL1);
+	if (val < 0)
+		return val;
+	val = bitfield_replace(val, PHY_REG_CTRL1_ENERGY_DET_SHIFT,
+			       PHY_REG_CTRL1_ENERGY_DET_WIDTH,
+			       PHY_REG_CTRL1_ENERGY_DET_SENSE_XMIT);
+	val = mv88e61xx_phy_write(phydev, phy, PHY_REG_CTRL1, val);
+	if (val < 0)
+		return val;
+
+	return 0;
+}
+
+static int mv88e61xx_phy_config_port(struct phy_device *phydev, u8 phy)
+{
+	int val;
+
+	val = mv88e61xx_port_enable(phydev, phy);
+	if (val < 0)
+		return val;
+
+	val = mv88e61xx_port_set_vlan(phydev, phy,
+			1 << CONFIG_MV88E61XX_CPU_PORT);
+	if (val < 0)
+		return val;
+
+	return 0;
+}
+
+static int mv88e61xx_probe(struct phy_device *phydev)
+{
+	struct mii_dev *smi_wrapper;
+	struct mv88e61xx_phy_priv *priv;
+	int res;
+
+	res = mv88e61xx_hw_reset(phydev);
+	if (res < 0)
+		return res;
+
+	priv = malloc(sizeof(*priv));
+	if (!priv)
+		return -ENOMEM;
+
+	memset(priv, 0, sizeof(*priv));
+
+	/*
+	 * This device requires indirect reads/writes to the PHY registers
+	 * which the generic PHY code can't handle.  Make a wrapper MII device
+	 * to handle reads/writes
+	 */
+	smi_wrapper = mdio_alloc();
+	if (!smi_wrapper) {
+		free(priv);
+		return -ENOMEM;
+	}
+
+	/*
+	 * Store the mdio bus in the private data, as we are going to replace
+	 * the bus with the wrapper bus
+	 */
+	priv->mdio_bus = phydev->bus;
+
+	/*
+	 * Store the smi bus address in private data.  This lets us use the
+	 * phydev addr field for device address instead, as the genphy code
+	 * expects.
+	 */
+	priv->smi_addr = phydev->addr;
+
+	/*
+	 * Store the phy_device in the wrapper mii device. This lets us get it
+	 * back when genphy functions call phy_read/phy_write.
+	 */
+	smi_wrapper->priv = phydev;
+	strncpy(smi_wrapper->name, "indirect mii", sizeof(smi_wrapper->name));
+	smi_wrapper->read = mv88e61xx_phy_read_indirect;
+	smi_wrapper->write = mv88e61xx_phy_write_indirect;
+
+	/* Replace the bus with the wrapper device */
+	phydev->bus = smi_wrapper;
+
+	phydev->priv = priv;
+
+	priv->id = mv88e61xx_get_switch_id(phydev);
+
+	return 0;
+}
+
+static int mv88e61xx_phy_config(struct phy_device *phydev)
+{
+	int res;
+	int i;
+	int ret = -1;
+
+	res = mv88e61xx_switch_init(phydev);
+	if (res < 0)
+		return res;
+
+	for (i = 0; i < PORT_COUNT; i++) {
+		if ((1 << i) & CONFIG_MV88E61XX_PHY_PORTS) {
+			phydev->addr = i;
+
+			res = mv88e61xx_phy_enable(phydev, i);
+			if (res < 0) {
+				printf("Error enabling PHY %i\n", i);
+				continue;
+			}
+			res = mv88e61xx_phy_setup(phydev, i);
+			if (res < 0) {
+				printf("Error setting up PHY %i\n", i);
+				continue;
+			}
+			res = mv88e61xx_phy_config_port(phydev, i);
+			if (res < 0) {
+				printf("Error configuring PHY %i\n", i);
+				continue;
+			}
+
+			res = genphy_config_aneg(phydev);
+			if (res < 0) {
+				printf("Error setting PHY %i autoneg\n", i);
+				continue;
+			}
+			res = phy_reset(phydev);
+			if (res < 0) {
+				printf("Error resetting PHY %i\n", i);
+				continue;
+			}
+
+			/* Return success if any PHY succeeds */
+			ret = 0;
+		}
+	}
+
+	return ret;
+}
+
+static int mv88e61xx_phy_is_connected(struct phy_device *phydev)
+{
+	int val;
+
+	val = mv88e61xx_phy_read(phydev, phydev->addr, PHY_REG_STATUS1);
+	if (val < 0)
+		return 0;
+
+	/*
+	 * After reset, the energy detect signal remains high for a few seconds
+	 * regardless of whether a cable is connected.  This function will
+	 * return false positives during this time.
+	 */
+	return (val & PHY_REG_STATUS1_ENERGY) == 0;
+}
+
+static int mv88e61xx_phy_startup(struct phy_device *phydev)
+{
+	int i;
+	int link = 0;
+	int res;
+	int speed = phydev->speed;
+	int duplex = phydev->duplex;
+
+	for (i = 0; i < PORT_COUNT; i++) {
+		if ((1 << i) & CONFIG_MV88E61XX_PHY_PORTS) {
+			phydev->addr = i;
+			if (!mv88e61xx_phy_is_connected(phydev))
+				continue;
+			res = genphy_update_link(phydev);
+			if (res < 0)
+				continue;
+			res = mv88e61xx_parse_status(phydev);
+			if (res < 0)
+				continue;
+			link = (link || phydev->link);
+		}
+	}
+	phydev->link = link;
+
+	/* Restore CPU interface speed and duplex after it was changed for
+	 * other ports */
+	phydev->speed = speed;
+	phydev->duplex = duplex;
+
+	return 0;
+}
+
+static struct phy_driver mv88e61xx_driver = {
+	.name = "Marvell MV88E61xx",
+	.uid = 0x01410eb1,
+	.mask = 0xfffffff0,
+	.features = PHY_GBIT_FEATURES,
+	.probe = mv88e61xx_probe,
+	.config = mv88e61xx_phy_config,
+	.startup = mv88e61xx_phy_startup,
+	.shutdown = &genphy_shutdown,
+};
+
+int phy_mv88e61xx_init(void)
+{
+	phy_register(&mv88e61xx_driver);
+
+	return 0;
+}
+
+/*
+ * Overload weak get_phy_id definition since we need non-standard functions
+ * to read PHY registers
+ */
+int get_phy_id(struct mii_dev *bus, int smi_addr, int devad, u32 *phy_id)
+{
+	struct phy_device temp_phy;
+	struct mv88e61xx_phy_priv temp_priv;
+	struct mii_dev temp_mii;
+	int val;
+
+	/*
+	 * Buid temporary data structures that the chip reading code needs to
+	 * read the ID
+	 */
+	temp_priv.mdio_bus = bus;
+	temp_priv.smi_addr = smi_addr;
+	temp_phy.priv = &temp_priv;
+	temp_mii.priv = &temp_phy;
+
+	val = mv88e61xx_phy_read_indirect(&temp_mii, 0, devad, MII_PHYSID1);
+	if (val < 0)
+		return -EIO;
+
+	*phy_id = val << 16;
+
+	val = mv88e61xx_phy_read_indirect(&temp_mii, 0, devad, MII_PHYSID2);
+	if (val < 0)
+		return -EIO;
+
+	*phy_id |= (val & 0xffff);
+
+	return 0;
+}
diff --git a/drivers/net/phy/mv88e61xx.h b/drivers/net/phy/mv88e61xx.h
deleted file mode 100644
index 9c62e4a..0000000
--- a/drivers/net/phy/mv88e61xx.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * (C) Copyright 2009
- * Marvell Semiconductor <www.marvell.com>
- * Prafulla Wadaskar <prafulla@marvell.com>
- *
- * SPDX-License-Identifier:	GPL-2.0+
- */
-
-#ifndef _MV88E61XX_H
-#define _MV88E61XX_H
-
-#include <miiphy.h>
-
-#define MV88E61XX_CPU_PORT		0x5
-
-#define MV88E61XX_PHY_TIMEOUT		100000
-
-/* port dev-addr (= port + 0x10) */
-#define MV88E61XX_PRT_OFST		0x10
-/* port registers */
-#define MV88E61XX_PCS_CTRL_REG		0x1
-#define MV88E61XX_PRT_CTRL_REG		0x4
-#define MV88E61XX_PRT_VMAP_REG		0x6
-#define MV88E61XX_PRT_VID_REG		0x7
-#define MV88E61XX_RGMII_TIMECTRL_REG	0x1A
-
-/* global registers dev-addr */
-#define MV88E61XX_GLBREG_DEVADR	0x1B
-/* global registers */
-#define MV88E61XX_SGSR			0x00
-#define MV88E61XX_SGCR			0x04
-
-/* global 2 registers dev-addr */
-#define MV88E61XX_GLB2REG_DEVADR	0x1C
-/* global 2 registers */
-#define MV88E61XX_PHY_CMD		0x18
-#define MV88E61XX_PHY_DATA		0x19
-/* global 2 phy commands */
-#define MV88E61XX_PHY_WRITE_CMD		0x9400
-#define MV88E61XX_PHY_READ_CMD		0x9800
-
-#define MV88E61XX_BUSY_OFST		15
-#define MV88E61XX_MODE_OFST		12
-#define MV88E61XX_OP_OFST		10
-#define MV88E61XX_ADDR_OFST		5
-
-#ifdef CONFIG_MV88E61XX_MULTICHIP_ADRMODE
-static int mv88e61xx_busychk_multic(char *name, u32 devaddr);
-static void mv88e61xx_switch_write(char *name, u32 phy_adr,
-	u32 reg_ofs, u16 data);
-static void mv88e61xx_switch_read(char *name, u32 phy_adr,
-	u32 reg_ofs, u16 *data);
-#define wr_switch_reg mv88e61xx_switch_write
-#define rd_switch_reg mv88e61xx_switch_read
-#else
-/* switch appears a s simple PHY and can thus use miiphy */
-#define wr_switch_reg miiphy_write
-#define rd_switch_reg miiphy_read
-#endif /* CONFIG_MV88E61XX_MULTICHIP_ADRMODE */
-
-#endif /* _MV88E61XX_H */
diff --git a/drivers/net/phy/natsemi.c b/drivers/net/phy/natsemi.c
index d2e4c3c..1592e9b 100644
--- a/drivers/net/phy/natsemi.c
+++ b/drivers/net/phy/natsemi.c
@@ -93,10 +93,13 @@
 
 static int dp83865_startup(struct phy_device *phydev)
 {
-	genphy_update_link(phydev);
-	dp83865_parse_status(phydev);
+	int ret;
 
-	return 0;
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+
+	return dp83865_parse_status(phydev);
 }
 
 
@@ -134,10 +137,13 @@
 
 static int dp83848_startup(struct phy_device *phydev)
 {
-	genphy_update_link(phydev);
-	dp83848_parse_status(phydev);
+	int ret;
 
-	return 0;
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+
+	return dp83848_parse_status(phydev);
 }
 
 static struct phy_driver DP83848_driver = {
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 23c82bb..80bdfb6 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -248,7 +248,7 @@
 			if (i > PHY_ANEG_TIMEOUT) {
 				printf(" TIMEOUT !\n");
 				phydev->link = 0;
-				return 0;
+				return -ETIMEDOUT;
 			}
 
 			if (ctrlc()) {
@@ -431,10 +431,13 @@
 
 int genphy_startup(struct phy_device *phydev)
 {
-	genphy_update_link(phydev);
-	genphy_parse_link(phydev);
+	int ret;
 
-	return 0;
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+
+	return genphy_parse_link(phydev);
 }
 
 int genphy_shutdown(struct phy_device *phydev)
@@ -458,6 +461,9 @@
 
 int phy_init(void)
 {
+#ifdef CONFIG_MV88E61XX_SWITCH
+	phy_mv88e61xx_init();
+#endif
 #ifdef CONFIG_PHY_AQUANTIA
 	phy_aquantia_init();
 #endif
@@ -876,9 +882,7 @@
 int phy_config(struct phy_device *phydev)
 {
 	/* Invoke an optional board-specific helper */
-	board_phy_config(phydev);
-
-	return 0;
+	return board_phy_config(phydev);
 }
 
 int phy_shutdown(struct phy_device *phydev)
diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c
index 9d7f55b..7a99cb0 100644
--- a/drivers/net/phy/realtek.c
+++ b/drivers/net/phy/realtek.c
@@ -208,28 +208,38 @@
 
 static int rtl8211x_startup(struct phy_device *phydev)
 {
-	/* Read the Status (2x to make sure link is right) */
-	genphy_update_link(phydev);
-	rtl8211x_parse_status(phydev);
+	int ret;
 
-	return 0;
+	/* Read the Status (2x to make sure link is right) */
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+
+	return rtl8211x_parse_status(phydev);
 }
 
 static int rtl8211e_startup(struct phy_device *phydev)
 {
-	genphy_update_link(phydev);
-	genphy_parse_link(phydev);
+	int ret;
 
-	return 0;
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+
+	return genphy_parse_link(phydev);
 }
 
 static int rtl8211f_startup(struct phy_device *phydev)
 {
-	/* Read the Status (2x to make sure link is right) */
-	genphy_update_link(phydev);
-	rtl8211f_parse_status(phydev);
+	int ret;
 
-	return 0;
+	/* Read the Status (2x to make sure link is right) */
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+	/* Read the Status (2x to make sure link is right) */
+
+	return rtl8211f_parse_status(phydev);
 }
 
 /* Support for RTL8211B PHY */
diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c
index 34986a2..313fcdf 100644
--- a/drivers/net/phy/smsc.c
+++ b/drivers/net/phy/smsc.c
@@ -34,9 +34,13 @@
 
 static int smsc_startup(struct phy_device *phydev)
 {
-	genphy_update_link(phydev);
-	smsc_parse_status(phydev);
-	return 0;
+	int ret;
+
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+
+	return smsc_parse_status(phydev);
 }
 
 static struct phy_driver lan8700_driver = {
diff --git a/drivers/net/phy/ti.c b/drivers/net/phy/ti.c
index 937426b..c55dd97 100644
--- a/drivers/net/phy/ti.c
+++ b/drivers/net/phy/ti.c
@@ -6,6 +6,14 @@
  */
 #include <common.h>
 #include <phy.h>
+#include <linux/compat.h>
+#include <malloc.h>
+
+#include <fdtdec.h>
+#include <dm.h>
+#include <dt-bindings/net/ti-dp83867.h>
+
+DECLARE_GLOBAL_DATA_PTR;
 
 /* TI DP83867 */
 #define DP83867_DEVADDR		0x1f
@@ -71,6 +79,17 @@
 #define MII_MMD_CTRL_INCR_RDWT	0x8000 /* post increment on reads & writes */
 #define MII_MMD_CTRL_INCR_ON_WT	0xC000 /* post increment on writes only */
 
+/* User setting - can be taken from DTS */
+#define DEFAULT_RX_ID_DELAY	DP83867_RGMIIDCTL_2_25_NS
+#define DEFAULT_TX_ID_DELAY	DP83867_RGMIIDCTL_2_75_NS
+#define DEFAULT_FIFO_DEPTH	DP83867_PHYCR_FIFO_DEPTH_4_B_NIB
+
+struct dp83867_private {
+	int rx_id_delay;
+	int tx_id_delay;
+	int fifo_depth;
+};
+
 /**
  * phy_read_mmd_indirect - reads data from the MMD registers
  * @phydev: The PHY device bus
@@ -137,27 +156,60 @@
 	phy_write(phydev, addr, MII_MMD_DATA, data);
 }
 
+#if defined(CONFIG_DM_ETH)
 /**
- * phy_interface_is_rgmii - Convenience function for testing if a PHY interface
- * is RGMII (all variants)
+ * dp83867_data_init - Convenience function for setting PHY specific data
+ *
  * @phydev: the phy_device struct
  */
-static inline bool phy_interface_is_rgmii(struct phy_device *phydev)
+static int dp83867_of_init(struct phy_device *phydev)
 {
-	return phydev->interface >= PHY_INTERFACE_MODE_RGMII &&
-		phydev->interface <= PHY_INTERFACE_MODE_RGMII_TXID;
-}
+	struct dp83867_private *dp83867 = phydev->priv;
+	struct udevice *dev = phydev->dev;
 
-/* User setting - can be taken from DTS */
-#define RX_ID_DELAY	8
-#define TX_ID_DELAY	0xa
-#define FIFO_DEPTH	1
+	dp83867->rx_id_delay = fdtdec_get_uint(gd->fdt_blob, dev->of_offset,
+				 "ti,rx-internal-delay", -1);
+
+	dp83867->tx_id_delay = fdtdec_get_uint(gd->fdt_blob, dev->of_offset,
+				 "ti,tx-internal-delay", -1);
+
+	dp83867->fifo_depth = fdtdec_get_uint(gd->fdt_blob, dev->of_offset,
+				 "ti,fifo-depth", -1);
+
+	return 0;
+}
+#else
+static int dp83867_of_init(struct phy_device *phydev)
+{
+	struct dp83867_private *dp83867 = phydev->priv;
+
+	dp83867->rx_id_delay = DEFAULT_RX_ID_DELAY;
+	dp83867->tx_id_delay = DEFAULT_TX_ID_DELAY;
+	dp83867->fifo_depth = DEFAULT_FIFO_DEPTH;
+
+	return 0;
+}
+#endif
 
 static int dp83867_config(struct phy_device *phydev)
 {
+	struct dp83867_private *dp83867;
 	unsigned int val, delay, cfg2;
 	int ret;
 
+	if (!phydev->priv) {
+		dp83867 = kzalloc(sizeof(*dp83867), GFP_KERNEL);
+		if (!dp83867)
+			return -ENOMEM;
+
+		phydev->priv = dp83867;
+		ret = dp83867_of_init(phydev);
+		if (ret)
+			goto err_out;
+	} else {
+		dp83867 = (struct dp83867_private *)phydev->priv;
+	}
+
 	/* Restart the PHY.  */
 	val = phy_read(phydev, MDIO_DEVAD_NONE, DP83867_CTRL);
 	phy_write(phydev, MDIO_DEVAD_NONE, DP83867_CTRL,
@@ -166,10 +218,10 @@
 	if (phy_interface_is_rgmii(phydev)) {
 		ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_DP83867_PHYCTRL,
 			(DP83867_MDI_CROSSOVER_AUTO << DP83867_MDI_CROSSOVER) |
-			(FIFO_DEPTH << DP83867_PHYCR_FIFO_DEPTH_SHIFT));
+			(dp83867->fifo_depth << DP83867_PHYCR_FIFO_DEPTH_SHIFT));
 		if (ret)
-			return ret;
-	} else {
+			goto err_out;
+	} else if (phy_interface_is_sgmii(phydev)) {
 		phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR,
 			  (BMCR_ANENABLE | BMCR_FULLDPLX | BMCR_SPEED1000));
 
@@ -189,8 +241,8 @@
 			  DP83867_PHYCTRL_SGMIIEN |
 			  (DP83867_MDI_CROSSOVER_MDIX <<
 			  DP83867_MDI_CROSSOVER) |
-			  (FIFO_DEPTH << DP83867_PHYCTRL_RXFIFO_SHIFT) |
-			  (FIFO_DEPTH  << DP83867_PHYCTRL_TXFIFO_SHIFT));
+			  (dp83867->fifo_depth << DP83867_PHYCTRL_RXFIFO_SHIFT) |
+			  (dp83867->fifo_depth << DP83867_PHYCTRL_TXFIFO_SHIFT));
 		phy_write(phydev, MDIO_DEVAD_NONE, MII_DP83867_BISCR, 0x0);
 	}
 
@@ -212,8 +264,8 @@
 		phy_write_mmd_indirect(phydev, DP83867_RGMIICTL,
 				       DP83867_DEVADDR, phydev->addr, val);
 
-		delay = (RX_ID_DELAY |
-			 (TX_ID_DELAY << DP83867_RGMII_TX_CLK_DELAY_SHIFT));
+		delay = (dp83867->rx_id_delay |
+			 (dp83867->tx_id_delay << DP83867_RGMII_TX_CLK_DELAY_SHIFT));
 
 		phy_write_mmd_indirect(phydev, DP83867_RGMIIDCTL,
 				       DP83867_DEVADDR, phydev->addr, delay);
@@ -221,6 +273,10 @@
 
 	genphy_config_aneg(phydev);
 	return 0;
+
+err_out:
+	kfree(dp83867);
+	return ret;
 }
 
 static struct phy_driver DP83867_driver = {
diff --git a/drivers/net/phy/vitesse.c b/drivers/net/phy/vitesse.c
index 941d076..2635b82 100644
--- a/drivers/net/phy/vitesse.c
+++ b/drivers/net/phy/vitesse.c
@@ -112,10 +112,12 @@
 
 static int vitesse_startup(struct phy_device *phydev)
 {
-	genphy_update_link(phydev);
-	vitesse_parse_status(phydev);
+	int ret;
 
-	return 0;
+	ret = genphy_update_link(phydev);
+	if (ret)
+		return ret;
+	return vitesse_parse_status(phydev);
 }
 
 static int cis8204_config(struct phy_device *phydev)
diff --git a/drivers/net/xilinx_emaclite.c b/drivers/net/xilinx_emaclite.c
index 5862bf0..7b85aa0 100644
--- a/drivers/net/xilinx_emaclite.c
+++ b/drivers/net/xilinx_emaclite.c
@@ -250,7 +250,7 @@
 
 static int setup_phy(struct udevice *dev)
 {
-	int i;
+	int i, ret;
 	u16 phyreg;
 	struct xemaclite *emaclite = dev_get_priv(dev);
 	struct phy_device *phydev;
@@ -302,7 +302,9 @@
 	phydev->advertising = supported;
 	emaclite->phydev = phydev;
 	phy_config(phydev);
-	phy_startup(phydev);
+	ret = phy_startup(phydev);
+	if (ret)
+		return ret;
 
 	if (!phydev->link) {
 		printf("%s: No link.\n", phydev->dev->name);
diff --git a/drivers/net/zynq_gem.c b/drivers/net/zynq_gem.c
index aec8077..519699d 100644
--- a/drivers/net/zynq_gem.c
+++ b/drivers/net/zynq_gem.c
@@ -179,6 +179,7 @@
 	struct zynq_gem_regs *iobase;
 	phy_interface_t interface;
 	struct phy_device *phydev;
+	int phy_of_handle;
 	struct mii_dev *bus;
 };
 
@@ -352,14 +353,17 @@
 	priv->phydev->supported = supported | ADVERTISED_Pause |
 				  ADVERTISED_Asym_Pause;
 	priv->phydev->advertising = priv->phydev->supported;
-	phy_config(priv->phydev);
 
-	return 0;
+	if (priv->phy_of_handle > 0)
+		priv->phydev->dev->of_offset = priv->phy_of_handle;
+
+	return phy_config(priv->phydev);
 }
 
 static int zynq_gem_init(struct udevice *dev)
 {
 	u32 i, nwconfig;
+	int ret;
 	unsigned long clk_rate = 0;
 	struct zynq_gem_priv *priv = dev_get_priv(dev);
 	struct zynq_gem_regs *regs = priv->iobase;
@@ -427,7 +431,9 @@
 		priv->init++;
 	}
 
-	phy_startup(priv->phydev);
+	ret = phy_startup(priv->phydev);
+	if (ret)
+		return ret;
 
 	if (!priv->phydev->link) {
 		printf("%s: No link.\n", priv->phydev->dev->name);
@@ -675,7 +681,6 @@
 {
 	struct eth_pdata *pdata = dev_get_platdata(dev);
 	struct zynq_gem_priv *priv = dev_get_priv(dev);
-	int offset = 0;
 	const char *phy_mode;
 
 	pdata->iobase = (phys_addr_t)dev_get_addr(dev);
@@ -684,10 +689,11 @@
 	priv->emio = 0;
 	priv->phyaddr = -1;
 
-	offset = fdtdec_lookup_phandle(gd->fdt_blob, dev->of_offset,
-				       "phy-handle");
-	if (offset > 0)
-		priv->phyaddr = fdtdec_get_int(gd->fdt_blob, offset, "reg", -1);
+	priv->phy_of_handle = fdtdec_lookup_phandle(gd->fdt_blob,
+					dev->of_offset, "phy-handle");
+	if (priv->phy_of_handle > 0)
+		priv->phyaddr = fdtdec_get_int(gd->fdt_blob,
+					priv->phy_of_handle, "reg", -1);
 
 	phy_mode = fdt_getprop(gd->fdt_blob, dev->of_offset, "phy-mode", NULL);
 	if (phy_mode)
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 4619089..4b73a0f 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -175,11 +175,7 @@
 	int bus;
 
 	for (hose = pci_get_hose_head(); hose; hose = hose->next) {
-#ifdef CONFIG_SYS_SCSI_SCAN_BUS_REVERSE
-		for (bus = hose->last_busno; bus >= hose->first_busno; bus--) {
-#else
 		for (bus = hose->first_busno; bus <= hose->last_busno; bus++) {
-#endif
 			bdf = pci_hose_find_devices(hose, bus, ids, &index);
 			if (bdf != -1)
 				return bdf;
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
index 2a69bab..567b766 100644
--- a/drivers/pinctrl/Kconfig
+++ b/drivers/pinctrl/Kconfig
@@ -105,6 +105,24 @@
 
 if PINCTRL || SPL_PINCTRL
 
+config AR933X_PINCTRL
+	bool "QCA/Athores ar933x pin control driver"
+	depends on DM && SOC_AR933X
+	help
+	  Support pin multiplexing control on QCA/Athores ar933x SoCs.
+	  The driver is controlled by a device tree node which contains
+	  both the GPIO definitions and pin control functions for each
+	  available multiplex function.
+
+config QCA953X_PINCTRL
+	bool "QCA/Athores qca953x pin control driver"
+	depends on DM && SOC_QCA953X
+	help
+	  Support pin multiplexing control on QCA/Athores qca953x SoCs.
+	  The driver is controlled by a device tree node which contains
+	  both the GPIO definitions and pin control functions for each
+	  available multiplex function.
+
 config ROCKCHIP_PINCTRL
 	bool "Rockchip pin control driver"
 	depends on DM
diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile
index 37dc904..b99ed2f 100644
--- a/drivers/pinctrl/Makefile
+++ b/drivers/pinctrl/Makefile
@@ -6,6 +6,7 @@
 obj-$(CONFIG_$(SPL_)PINCTRL_GENERIC)	+= pinctrl-generic.o
 
 obj-y					+= nxp/
+obj-$(CONFIG_ARCH_ATH79) += ath79/
 obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/
 obj-$(CONFIG_PINCTRL_SANDBOX)	+= pinctrl-sandbox.o
 
diff --git a/drivers/pinctrl/ath79/Makefile b/drivers/pinctrl/ath79/Makefile
new file mode 100644
index 0000000..dcea10a
--- /dev/null
+++ b/drivers/pinctrl/ath79/Makefile
@@ -0,0 +1,6 @@
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-$(CONFIG_AR933X_PINCTRL) += pinctrl_ar933x.o
+obj-$(CONFIG_QCA953x_PINCTRL) += pinctrl_qca953x.o
diff --git a/drivers/pinctrl/ath79/pinctrl_ar933x.c b/drivers/pinctrl/ath79/pinctrl_ar933x.c
new file mode 100644
index 0000000..e3f64b6
--- /dev/null
+++ b/drivers/pinctrl/ath79/pinctrl_ar933x.c
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <dm/pinctrl.h>
+#include <mach/ar71xx_regs.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+enum periph_id {
+	PERIPH_ID_UART0,
+	PERIPH_ID_SPI0,
+	PERIPH_ID_NONE = -1,
+};
+
+struct ar933x_pinctrl_priv {
+	void __iomem *regs;
+};
+
+static void pinctrl_ar933x_spi_config(struct ar933x_pinctrl_priv *priv, int cs)
+{
+	switch (cs) {
+	case 0:
+		clrsetbits_be32(priv->regs + AR71XX_GPIO_REG_OE,
+				AR933X_GPIO(4), AR933X_GPIO(3) |
+				AR933X_GPIO(5) | AR933X_GPIO(2));
+		setbits_be32(priv->regs + AR71XX_GPIO_REG_FUNC,
+			     AR933X_GPIO_FUNC_SPI_EN |
+			     AR933X_GPIO_FUNC_RES_TRUE);
+		break;
+	}
+}
+
+static void pinctrl_ar933x_uart_config(struct ar933x_pinctrl_priv *priv, int uart_id)
+{
+	switch (uart_id) {
+	case PERIPH_ID_UART0:
+		clrsetbits_be32(priv->regs + AR71XX_GPIO_REG_OE,
+				AR933X_GPIO(9), AR933X_GPIO(10));
+		setbits_be32(priv->regs + AR71XX_GPIO_REG_FUNC,
+			     AR933X_GPIO_FUNC_UART_EN |
+			     AR933X_GPIO_FUNC_RES_TRUE);
+		break;
+	}
+}
+
+static int ar933x_pinctrl_request(struct udevice *dev, int func, int flags)
+{
+	struct ar933x_pinctrl_priv *priv = dev_get_priv(dev);
+
+	debug("%s: func=%x, flags=%x\n", __func__, func, flags);
+	switch (func) {
+	case PERIPH_ID_SPI0:
+		pinctrl_ar933x_spi_config(priv, flags);
+		break;
+	case PERIPH_ID_UART0:
+		pinctrl_ar933x_uart_config(priv, func);
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static int ar933x_pinctrl_get_periph_id(struct udevice *dev,
+					struct udevice *periph)
+{
+	u32 cell[2];
+	int ret;
+
+	ret = fdtdec_get_int_array(gd->fdt_blob, periph->of_offset,
+				   "interrupts", cell, ARRAY_SIZE(cell));
+	if (ret < 0)
+		return -EINVAL;
+
+	switch (cell[0]) {
+	case 128:
+		return PERIPH_ID_UART0;
+	case 129:
+		return PERIPH_ID_SPI0;
+	}
+	return -ENOENT;
+}
+
+static int ar933x_pinctrl_set_state_simple(struct udevice *dev,
+					   struct udevice *periph)
+{
+	int func;
+
+	func = ar933x_pinctrl_get_periph_id(dev, periph);
+	if (func < 0)
+		return func;
+	return ar933x_pinctrl_request(dev, func, 0);
+}
+
+static struct pinctrl_ops ar933x_pinctrl_ops = {
+	.set_state_simple	= ar933x_pinctrl_set_state_simple,
+	.request	= ar933x_pinctrl_request,
+	.get_periph_id	= ar933x_pinctrl_get_periph_id,
+};
+
+static int ar933x_pinctrl_probe(struct udevice *dev)
+{
+	struct ar933x_pinctrl_priv *priv = dev_get_priv(dev);
+	fdt_addr_t addr;
+
+	addr = dev_get_addr(dev);
+	if (addr == FDT_ADDR_T_NONE)
+		return -EINVAL;
+
+	priv->regs = map_physmem(addr,
+				 AR71XX_GPIO_SIZE,
+				 MAP_NOCACHE);
+	return 0;
+}
+
+static const struct udevice_id ar933x_pinctrl_ids[] = {
+	{ .compatible = "qca,ar933x-pinctrl" },
+	{ }
+};
+
+U_BOOT_DRIVER(pinctrl_ar933x) = {
+	.name		= "pinctrl_ar933x",
+	.id		= UCLASS_PINCTRL,
+	.of_match	= ar933x_pinctrl_ids,
+	.priv_auto_alloc_size = sizeof(struct ar933x_pinctrl_priv),
+	.ops		= &ar933x_pinctrl_ops,
+	.probe		= ar933x_pinctrl_probe,
+};
diff --git a/drivers/pinctrl/ath79/pinctrl_qca953x.c b/drivers/pinctrl/ath79/pinctrl_qca953x.c
new file mode 100644
index 0000000..d02597e
--- /dev/null
+++ b/drivers/pinctrl/ath79/pinctrl_qca953x.c
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <dm/pinctrl.h>
+#include <mach/ar71xx_regs.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+enum periph_id {
+	PERIPH_ID_UART0,
+	PERIPH_ID_SPI0,
+	PERIPH_ID_NONE = -1,
+};
+
+struct qca953x_pinctrl_priv {
+	void __iomem *regs;
+};
+
+static void pinctrl_qca953x_spi_config(struct qca953x_pinctrl_priv *priv, int cs)
+{
+	switch (cs) {
+	case 0:
+		clrsetbits_be32(priv->regs + AR71XX_GPIO_REG_OE,
+				QCA953X_GPIO(5) | QCA953X_GPIO(6) |
+				QCA953X_GPIO(7), QCA953X_GPIO(8));
+
+		clrsetbits_be32(priv->regs + QCA953X_GPIO_REG_OUT_FUNC1,
+				QCA953X_GPIO_MUX_MASK(8) |
+				QCA953X_GPIO_MUX_MASK(16) |
+				QCA953X_GPIO_MUX_MASK(24),
+				(QCA953X_GPIO_OUT_MUX_SPI_CS0 << 8) |
+				(QCA953X_GPIO_OUT_MUX_SPI_CLK << 16) |
+				(QCA953X_GPIO_OUT_MUX_SPI_MOSI << 24));
+
+		clrsetbits_be32(priv->regs + QCA953X_GPIO_REG_IN_ENABLE0,
+				QCA953X_GPIO_MUX_MASK(0),
+				QCA953X_GPIO_IN_MUX_SPI_DATA_IN);
+
+		setbits_be32(priv->regs + AR71XX_GPIO_REG_OUT,
+			     QCA953X_GPIO(8));
+		break;
+	}
+}
+
+static void pinctrl_qca953x_uart_config(struct qca953x_pinctrl_priv *priv, int uart_id)
+{
+	switch (uart_id) {
+	case PERIPH_ID_UART0:
+		clrsetbits_be32(priv->regs + AR71XX_GPIO_REG_OE,
+				QCA953X_GPIO(9), QCA953X_GPIO(10));
+
+		clrsetbits_be32(priv->regs + QCA953X_GPIO_REG_OUT_FUNC2,
+				QCA953X_GPIO_MUX_MASK(16),
+				QCA953X_GPIO_OUT_MUX_UART0_SOUT << 16);
+
+		clrsetbits_be32(priv->regs + QCA953X_GPIO_REG_IN_ENABLE0,
+				QCA953X_GPIO_MUX_MASK(8),
+				QCA953X_GPIO_IN_MUX_UART0_SIN << 8);
+
+		setbits_be32(priv->regs + AR71XX_GPIO_REG_OUT,
+			     QCA953X_GPIO(10));
+		break;
+	}
+}
+
+static int qca953x_pinctrl_request(struct udevice *dev, int func, int flags)
+{
+	struct qca953x_pinctrl_priv *priv = dev_get_priv(dev);
+
+	debug("%s: func=%x, flags=%x\n", __func__, func, flags);
+	switch (func) {
+	case PERIPH_ID_SPI0:
+		pinctrl_qca953x_spi_config(priv, flags);
+		break;
+	case PERIPH_ID_UART0:
+		pinctrl_qca953x_uart_config(priv, func);
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static int qca953x_pinctrl_get_periph_id(struct udevice *dev,
+					struct udevice *periph)
+{
+	u32 cell[2];
+	int ret;
+
+	ret = fdtdec_get_int_array(gd->fdt_blob, periph->of_offset,
+				   "interrupts", cell, ARRAY_SIZE(cell));
+	if (ret < 0)
+		return -EINVAL;
+
+	switch (cell[0]) {
+	case 128:
+		return PERIPH_ID_UART0;
+	case 129:
+		return PERIPH_ID_SPI0;
+	}
+	return -ENOENT;
+}
+
+static int qca953x_pinctrl_set_state_simple(struct udevice *dev,
+					   struct udevice *periph)
+{
+	int func;
+
+	func = qca953x_pinctrl_get_periph_id(dev, periph);
+	if (func < 0)
+		return func;
+	return qca953x_pinctrl_request(dev, func, 0);
+}
+
+static struct pinctrl_ops qca953x_pinctrl_ops = {
+	.set_state_simple	= qca953x_pinctrl_set_state_simple,
+	.request	= qca953x_pinctrl_request,
+	.get_periph_id	= qca953x_pinctrl_get_periph_id,
+};
+
+static int qca953x_pinctrl_probe(struct udevice *dev)
+{
+	struct qca953x_pinctrl_priv *priv = dev_get_priv(dev);
+	fdt_addr_t addr;
+
+	addr = dev_get_addr(dev);
+	if (addr == FDT_ADDR_T_NONE)
+		return -EINVAL;
+
+	priv->regs = map_physmem(addr,
+				 AR71XX_GPIO_SIZE,
+				 MAP_NOCACHE);
+	return 0;
+}
+
+static const struct udevice_id qca953x_pinctrl_ids[] = {
+	{ .compatible = "qca,qca953x-pinctrl" },
+	{ }
+};
+
+U_BOOT_DRIVER(pinctrl_qca953x) = {
+	.name		= "pinctrl_qca953x",
+	.id		= UCLASS_PINCTRL,
+	.of_match	= qca953x_pinctrl_ids,
+	.priv_auto_alloc_size = sizeof(struct qca953x_pinctrl_priv),
+	.ops		= &qca953x_pinctrl_ops,
+	.probe		= qca953x_pinctrl_probe,
+};
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index a9a5d47..2497ae9 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -89,6 +89,15 @@
 	  You will need to provide parameters to make this work. The driver will
 	  be available until the real driver model serial is running.
 
+config DEBUG_UART_AR933X
+	bool "QCA/Atheros ar933x"
+	depends on AR933X_UART
+	help
+	  Select this to enable a debug UART using the ar933x uart driver.
+	  You will need to provide parameters to make this work. The
+	  driver will be available until the real driver model serial is
+	  running.
+
 config DEBUG_UART_NS16550
 	bool "ns16550"
 	help
@@ -263,6 +272,15 @@
 	  Select this to enable an UART for Altera devices. Please find
 	  details on the "Embedded Peripherals IP User Guide" of Altera.
 
+config AR933X_UART
+	bool "QCA/Atheros ar933x UART support"
+	depends on DM_SERIAL && SOC_AR933X
+	help
+	  Select this to enable UART support for QCA/Atheros ar933x
+	  devices. This driver uses driver model and requires a device
+	  tree binding to operate, please refer to the document at
+	  doc/device-tree-bindings/serial/qca,ar9330-uart.txt.
+
 config FSL_LPUART
 	bool "Freescale LPUART support"
 	help
diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
index b0ac9d8..9def128 100644
--- a/drivers/serial/Makefile
+++ b/drivers/serial/Makefile
@@ -17,6 +17,7 @@
 
 obj-$(CONFIG_ALTERA_UART) += altera_uart.o
 obj-$(CONFIG_ALTERA_JTAG_UART) += altera_jtag_uart.o
+obj-$(CONFIG_AR933X_UART) += serial_ar933x.o
 obj-$(CONFIG_ARM_DCC) += arm_dcc.o
 obj-$(CONFIG_ATMEL_USART) += atmel_usart.o
 obj-$(CONFIG_EFI_APP) += serial_efi.o
diff --git a/drivers/serial/mcfuart.c b/drivers/serial/mcfuart.c
index 407354f..059cb0f 100644
--- a/drivers/serial/mcfuart.c
+++ b/drivers/serial/mcfuart.c
@@ -2,6 +2,9 @@
  * (C) Copyright 2004-2007 Freescale Semiconductor, Inc.
  * TsiChung Liew, Tsi-Chung.Liew@freescale.com.
  *
+ * Modified to add device model (DM) support
+ * (C) Copyright 2015  Angelo Dureghello <angelo@sysam.it>
+ *
  * SPDX-License-Identifier:	GPL-2.0+
  */
 
@@ -11,9 +14,10 @@
  */
 
 #include <common.h>
+#include <dm.h>
+#include <dm/platform_data/serial_coldfire.h>
 #include <serial.h>
 #include <linux/compiler.h>
-
 #include <asm/immap.h>
 #include <asm/uart.h>
 
@@ -21,91 +25,110 @@
 
 extern void uart_port_conf(int port);
 
-static int mcf_serial_init(void)
+static int mcf_serial_init_common(uart_t *uart, int port_idx, int baudrate)
 {
-	volatile uart_t *uart;
 	u32 counter;
 
-	uart = (volatile uart_t *)(CONFIG_SYS_UART_BASE);
-
-	uart_port_conf(CONFIG_SYS_UART_PORT);
+	uart_port_conf(port_idx);
 
 	/* write to SICR: SIM2 = uart mode,dcd does not affect rx */
-	uart->ucr = UART_UCR_RESET_RX;
-	uart->ucr = UART_UCR_RESET_TX;
-	uart->ucr = UART_UCR_RESET_ERROR;
-	uart->ucr = UART_UCR_RESET_MR;
+	writeb(UART_UCR_RESET_RX, &uart->ucr);
+	writeb(UART_UCR_RESET_TX, &uart->ucr);
+	writeb(UART_UCR_RESET_ERROR, &uart->ucr);
+	writeb(UART_UCR_RESET_MR, &uart->ucr);
 	__asm__("nop");
 
-	uart->uimr = 0;
+	writeb(0, &uart->uimr);
 
 	/* write to CSR: RX/TX baud rate from timers */
-	uart->ucsr = (UART_UCSR_RCS_SYS_CLK | UART_UCSR_TCS_SYS_CLK);
+	writeb(UART_UCSR_RCS_SYS_CLK | UART_UCSR_TCS_SYS_CLK, &uart->ucsr);
 
-	uart->umr = (UART_UMR_BC_8 | UART_UMR_PM_NONE);
-	uart->umr = UART_UMR_SB_STOP_BITS_1;
+	writeb(UART_UMR_BC_8 | UART_UMR_PM_NONE, &uart->umr);
+	writeb(UART_UMR_SB_STOP_BITS_1, &uart->umr);
 
 	/* Setting up BaudRate */
-	counter = (u32) ((gd->bus_clk / 32) + (gd->baudrate / 2));
-	counter = counter / gd->baudrate;
+	counter = (u32) ((gd->bus_clk / 32) + (baudrate / 2));
+	counter = counter / baudrate;
 
 	/* write to CTUR: divide counter upper byte */
-	uart->ubg1 = (u8) ((counter & 0xff00) >> 8);
+	writeb((u8)((counter & 0xff00) >> 8), &uart->ubg1);
 	/* write to CTLR: divide counter lower byte */
-	uart->ubg2 = (u8) (counter & 0x00ff);
+	writeb((u8)(counter & 0x00ff), &uart->ubg2);
 
-	uart->ucr = (UART_UCR_RX_ENABLED | UART_UCR_TX_ENABLED);
+	writeb(UART_UCR_RX_ENABLED | UART_UCR_TX_ENABLED, &uart->ucr);
 
 	return (0);
 }
 
+static void mcf_serial_setbrg_common(uart_t *uart, int baudrate)
+{
+	u32 counter;
+
+	/* Setting up BaudRate */
+	counter = (u32) ((gd->bus_clk / 32) + (baudrate / 2));
+	counter = counter / baudrate;
+
+	/* write to CTUR: divide counter upper byte */
+	writeb(((counter & 0xff00) >> 8), &uart->ubg1);
+	/* write to CTLR: divide counter lower byte */
+	writeb((counter & 0x00ff), &uart->ubg2);
+
+	writeb(UART_UCR_RESET_RX, &uart->ucr);
+	writeb(UART_UCR_RESET_TX, &uart->ucr);
+
+	writeb(UART_UCR_RX_ENABLED | UART_UCR_TX_ENABLED, &uart->ucr);
+}
+
+#ifndef CONFIG_DM_SERIAL
+
+static int mcf_serial_init(void)
+{
+	uart_t *uart_base;
+	int port_idx;
+
+	uart_base = (uart_t *)CONFIG_SYS_UART_BASE;
+	port_idx = CONFIG_SYS_UART_PORT;
+
+	return mcf_serial_init_common(uart_base, port_idx, gd->baudrate);
+}
+
 static void mcf_serial_putc(const char c)
 {
-	volatile uart_t *uart = (volatile uart_t *)(CONFIG_SYS_UART_BASE);
+	uart_t *uart = (uart_t *)CONFIG_SYS_UART_BASE;
 
 	if (c == '\n')
 		serial_putc('\r');
 
 	/* Wait for last character to go. */
-	while (!(uart->usr & UART_USR_TXRDY)) ;
+	while (!(readb(&uart->usr) & UART_USR_TXRDY))
+		;
 
-	uart->utb = c;
+	writeb(c, &uart->utb);
 }
 
 static int mcf_serial_getc(void)
 {
-	volatile uart_t *uart = (volatile uart_t *)(CONFIG_SYS_UART_BASE);
+	uart_t *uart = (uart_t *)CONFIG_SYS_UART_BASE;
 
 	/* Wait for a character to arrive. */
-	while (!(uart->usr & UART_USR_RXRDY)) ;
-	return uart->urb;
-}
+	while (!(readb(&uart->usr) & UART_USR_RXRDY))
+		;
 
-static int mcf_serial_tstc(void)
-{
-	volatile uart_t *uart = (volatile uart_t *)(CONFIG_SYS_UART_BASE);
-
-	return (uart->usr & UART_USR_RXRDY);
+	return readb(&uart->urb);
 }
 
 static void mcf_serial_setbrg(void)
 {
-	volatile uart_t *uart = (volatile uart_t *)(CONFIG_SYS_UART_BASE);
-	u32 counter;
+	uart_t *uart = (uart_t *)CONFIG_SYS_UART_BASE;
 
-	/* Setting up BaudRate */
-	counter = (u32) ((gd->bus_clk / 32) + (gd->baudrate / 2));
-	counter = counter / gd->baudrate;
+	mcf_serial_setbrg_common(uart, gd->baudrate);
+}
 
-	/* write to CTUR: divide counter upper byte */
-	uart->ubg1 = ((counter & 0xff00) >> 8);
-	/* write to CTLR: divide counter lower byte */
-	uart->ubg2 = (counter & 0x00ff);
+static int mcf_serial_tstc(void)
+{
+	uart_t *uart = (uart_t *)CONFIG_SYS_UART_BASE;
 
-	uart->ucr = UART_UCR_RESET_RX;
-	uart->ucr = UART_UCR_RESET_TX;
-
-	uart->ucr = UART_UCR_RX_ENABLED | UART_UCR_TX_ENABLED;
+	return readb(&uart->usr) & UART_USR_RXRDY;
 }
 
 static struct serial_device mcf_serial_drv = {
@@ -128,3 +151,80 @@
 {
 	return &mcf_serial_drv;
 }
+
+#endif
+
+#ifdef CONFIG_DM_SERIAL
+
+static int coldfire_serial_probe(struct udevice *dev)
+{
+	struct coldfire_serial_platdata *plat = dev->platdata;
+
+	return mcf_serial_init_common((uart_t *)plat->base,
+						plat->port, plat->baudrate);
+}
+
+static int coldfire_serial_putc(struct udevice *dev, const char ch)
+{
+	struct coldfire_serial_platdata *plat = dev->platdata;
+	uart_t *uart = (uart_t *)plat->base;
+
+	/* Wait for last character to go. */
+	if (!(readb(&uart->usr) & UART_USR_TXRDY))
+		return -EAGAIN;
+
+	writeb(ch, &uart->utb);
+
+	return 0;
+}
+
+static int coldfire_serial_getc(struct udevice *dev)
+{
+	struct coldfire_serial_platdata *plat = dev->platdata;
+	uart_t *uart = (uart_t *)(plat->base);
+
+	/* Wait for a character to arrive. */
+	if (!(readb(&uart->usr) & UART_USR_RXRDY))
+		return -EAGAIN;
+
+	return readb(&uart->urb);
+}
+
+int coldfire_serial_setbrg(struct udevice *dev, int baudrate)
+{
+	struct coldfire_serial_platdata *plat = dev->platdata;
+	uart_t *uart = (uart_t *)(plat->base);
+
+	mcf_serial_setbrg_common(uart, baudrate);
+
+	return 0;
+}
+
+static int coldfire_serial_pending(struct udevice *dev, bool input)
+{
+	struct coldfire_serial_platdata *plat = dev->platdata;
+	uart_t *uart = (uart_t *)(plat->base);
+
+	if (input)
+		return readb(&uart->usr) & UART_USR_RXRDY ? 1 : 0;
+	else
+		return readb(&uart->usr) & UART_USR_TXRDY ? 0 : 1;
+
+	return 0;
+}
+
+static const struct dm_serial_ops coldfire_serial_ops = {
+	.putc = coldfire_serial_putc,
+	.pending = coldfire_serial_pending,
+	.getc = coldfire_serial_getc,
+	.setbrg = coldfire_serial_setbrg,
+};
+
+U_BOOT_DRIVER(serial_coldfire) = {
+	.name = "serial_coldfire",
+	.id = UCLASS_SERIAL,
+	.probe = coldfire_serial_probe,
+	.ops = &coldfire_serial_ops,
+	.flags = DM_FLAG_PRE_RELOC,
+};
+#endif
diff --git a/drivers/serial/serial_ar933x.c b/drivers/serial/serial_ar933x.c
new file mode 100644
index 0000000..aae66dc
--- /dev/null
+++ b/drivers/serial/serial_ar933x.c
@@ -0,0 +1,243 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <div64.h>
+#include <errno.h>
+#include <serial.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <dm/pinctrl.h>
+#include <mach/ar71xx_regs.h>
+
+#define AR933X_UART_DATA_REG            0x00
+#define AR933X_UART_CS_REG              0x04
+#define AR933X_UART_CLK_REG             0x08
+
+#define AR933X_UART_DATA_TX_RX_MASK     0xff
+#define AR933X_UART_DATA_RX_CSR         BIT(8)
+#define AR933X_UART_DATA_TX_CSR         BIT(9)
+#define AR933X_UART_CS_IF_MODE_S        2
+#define AR933X_UART_CS_IF_MODE_M        0x3
+#define AR933X_UART_CS_IF_MODE_DTE      1
+#define AR933X_UART_CS_IF_MODE_DCE      2
+#define AR933X_UART_CS_TX_RDY_ORIDE     BIT(7)
+#define AR933X_UART_CS_RX_RDY_ORIDE     BIT(8)
+#define AR933X_UART_CLK_STEP_M          0xffff
+#define AR933X_UART_CLK_SCALE_M         0xfff
+#define AR933X_UART_CLK_SCALE_S         16
+#define AR933X_UART_CLK_STEP_S          0
+
+struct ar933x_serial_priv {
+	void __iomem *regs;
+};
+
+/*
+ * Baudrate algorithm come from Linux/drivers/tty/serial/ar933x_uart.c
+ * baudrate = (clk / (scale + 1)) * (step * (1 / 2^17))
+ */
+static u32 ar933x_serial_get_baud(u32 clk, u32 scale, u32 step)
+{
+	u64 t;
+	u32 div;
+
+	div = (2 << 16) * (scale + 1);
+	t = clk;
+	t *= step;
+	t += (div / 2);
+	do_div(t, div);
+
+	return t;
+}
+
+static void ar933x_serial_get_scale_step(u32 clk, u32 baud,
+					 u32 *scale, u32 *step)
+{
+	u32 tscale, baudrate;
+	long min_diff;
+
+	*scale = 0;
+	*step = 0;
+
+	min_diff = baud;
+	for (tscale = 0; tscale < AR933X_UART_CLK_SCALE_M; tscale++) {
+		u64 tstep;
+		int diff;
+
+		tstep = baud * (tscale + 1);
+		tstep *= (2 << 16);
+		do_div(tstep, clk);
+
+		if (tstep > AR933X_UART_CLK_STEP_M)
+			break;
+
+		baudrate = ar933x_serial_get_baud(clk, tscale, tstep);
+		diff = abs(baudrate - baud);
+		if (diff < min_diff) {
+			min_diff = diff;
+			*scale = tscale;
+			*step = tstep;
+		}
+	}
+}
+
+static int ar933x_serial_setbrg(struct udevice *dev, int baudrate)
+{
+	struct ar933x_serial_priv *priv = dev_get_priv(dev);
+	u32 val, scale, step;
+
+	val = get_serial_clock();
+	ar933x_serial_get_scale_step(val, baudrate, &scale, &step);
+
+	val  = (scale & AR933X_UART_CLK_SCALE_M)
+			<< AR933X_UART_CLK_SCALE_S;
+	val |= (step & AR933X_UART_CLK_STEP_M)
+			<< AR933X_UART_CLK_STEP_S;
+	writel(val, priv->regs + AR933X_UART_CLK_REG);
+
+	return 0;
+}
+
+static int ar933x_serial_putc(struct udevice *dev, const char c)
+{
+	struct ar933x_serial_priv *priv = dev_get_priv(dev);
+	u32 data;
+
+	data = readl(priv->regs + AR933X_UART_DATA_REG);
+	if (!(data & AR933X_UART_DATA_TX_CSR))
+		return -EAGAIN;
+
+	data  = (u32)c | AR933X_UART_DATA_TX_CSR;
+	writel(data, priv->regs + AR933X_UART_DATA_REG);
+
+	return 0;
+}
+
+static int ar933x_serial_getc(struct udevice *dev)
+{
+	struct ar933x_serial_priv *priv = dev_get_priv(dev);
+	u32 data;
+
+	data = readl(priv->regs + AR933X_UART_DATA_REG);
+	if (!(data & AR933X_UART_DATA_RX_CSR))
+		return -EAGAIN;
+
+	writel(AR933X_UART_DATA_RX_CSR, priv->regs + AR933X_UART_DATA_REG);
+	return data & AR933X_UART_DATA_TX_RX_MASK;
+}
+
+static int ar933x_serial_pending(struct udevice *dev, bool input)
+{
+	struct ar933x_serial_priv *priv = dev_get_priv(dev);
+	u32 data;
+
+	data = readl(priv->regs + AR933X_UART_DATA_REG);
+	if (input)
+		return (data & AR933X_UART_DATA_RX_CSR) ? 1 : 0;
+	else
+		return (data & AR933X_UART_DATA_TX_CSR) ? 0 : 1;
+}
+
+static int ar933x_serial_probe(struct udevice *dev)
+{
+	struct ar933x_serial_priv *priv = dev_get_priv(dev);
+	fdt_addr_t addr;
+	u32 val;
+
+	addr = dev_get_addr(dev);
+	if (addr == FDT_ADDR_T_NONE)
+		return -EINVAL;
+
+	priv->regs = map_physmem(addr, AR933X_UART_SIZE,
+				 MAP_NOCACHE);
+
+	/*
+	 * UART controller configuration:
+	 * - no DMA
+	 * - no interrupt
+	 * - DCE mode
+	 * - no flow control
+	 * - set RX ready oride
+	 * - set TX ready oride
+	 */
+	val = (AR933X_UART_CS_IF_MODE_DCE << AR933X_UART_CS_IF_MODE_S) |
+	      AR933X_UART_CS_TX_RDY_ORIDE | AR933X_UART_CS_RX_RDY_ORIDE;
+	writel(val, priv->regs + AR933X_UART_CS_REG);
+	return 0;
+}
+
+static const struct dm_serial_ops ar933x_serial_ops = {
+	.putc = ar933x_serial_putc,
+	.pending = ar933x_serial_pending,
+	.getc = ar933x_serial_getc,
+	.setbrg = ar933x_serial_setbrg,
+};
+
+static const struct udevice_id ar933x_serial_ids[] = {
+	{ .compatible = "qca,ar9330-uart" },
+	{ }
+};
+
+U_BOOT_DRIVER(serial_ar933x) = {
+	.name   = "serial_ar933x",
+	.id = UCLASS_SERIAL,
+	.of_match = ar933x_serial_ids,
+	.priv_auto_alloc_size = sizeof(struct ar933x_serial_priv),
+	.probe = ar933x_serial_probe,
+	.ops    = &ar933x_serial_ops,
+	.flags = DM_FLAG_PRE_RELOC,
+};
+
+#ifdef CONFIG_DEBUG_UART_AR933X
+
+#include <debug_uart.h>
+
+static inline void _debug_uart_init(void)
+{
+	void __iomem *regs = (void *)CONFIG_DEBUG_UART_BASE;
+	u32 val, scale, step;
+
+	/*
+	 * UART controller configuration:
+	 * - no DMA
+	 * - no interrupt
+	 * - DCE mode
+	 * - no flow control
+	 * - set RX ready oride
+	 * - set TX ready oride
+	 */
+	val = (AR933X_UART_CS_IF_MODE_DCE << AR933X_UART_CS_IF_MODE_S) |
+	      AR933X_UART_CS_TX_RDY_ORIDE | AR933X_UART_CS_RX_RDY_ORIDE;
+	writel(val, regs + AR933X_UART_CS_REG);
+
+	ar933x_serial_get_scale_step(CONFIG_DEBUG_UART_CLOCK,
+				     CONFIG_BAUDRATE, &scale, &step);
+
+	val  = (scale & AR933X_UART_CLK_SCALE_M)
+			<< AR933X_UART_CLK_SCALE_S;
+	val |= (step & AR933X_UART_CLK_STEP_M)
+			<< AR933X_UART_CLK_STEP_S;
+	writel(val, regs + AR933X_UART_CLK_REG);
+}
+
+static inline void _debug_uart_putc(int c)
+{
+	void __iomem *regs = (void *)CONFIG_DEBUG_UART_BASE;
+	u32 data;
+
+	do {
+		data = readl(regs + AR933X_UART_DATA_REG);
+	} while (!(data & AR933X_UART_DATA_TX_CSR));
+
+	data  = (u32)c | AR933X_UART_DATA_TX_CSR;
+	writel(data, regs + AR933X_UART_DATA_REG);
+}
+
+DEBUG_UART_FUNCS
+
+#endif
diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
index f0258f8..b7fd8e5 100644
--- a/drivers/spi/Kconfig
+++ b/drivers/spi/Kconfig
@@ -23,6 +23,15 @@
 	  IP core. Please find details on the "Embedded Peripherals IP
 	  User Guide" of Altera.
 
+config ATH79_SPI
+	bool "Atheros SPI driver"
+	depends on ARCH_ATH79
+	help
+	  Enable the Atheros ar7xxx/ar9xxx SoC SPI driver, it was used
+	  to access SPI NOR flash and other SPI peripherals. This driver
+	  uses driver model and requires a device tree binding to operate.
+	  please refer to doc/device-tree-bindings/spi/spi-ath79.txt.
+
 config CADENCE_QSPI
 	bool "Cadence QSPI driver"
 	help
diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile
index 3eca745..7fb2926 100644
--- a/drivers/spi/Makefile
+++ b/drivers/spi/Makefile
@@ -17,6 +17,7 @@
 
 obj-$(CONFIG_ALTERA_SPI) += altera_spi.o
 obj-$(CONFIG_ARMADA100_SPI) += armada100_spi.o
+obj-$(CONFIG_ATH79_SPI) += ath79_spi.o
 obj-$(CONFIG_ATMEL_DATAFLASH_SPI) += atmel_dataflash_spi.o
 obj-$(CONFIG_ATMEL_SPI) += atmel_spi.o
 obj-$(CONFIG_BFIN_SPI) += bfin_spi.o
diff --git a/drivers/spi/ath79_spi.c b/drivers/spi/ath79_spi.c
new file mode 100644
index 0000000..b18c733
--- /dev/null
+++ b/drivers/spi/ath79_spi.c
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <spi.h>
+#include <dm.h>
+#include <div64.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <dm/pinctrl.h>
+#include <mach/ar71xx_regs.h>
+
+/* CLOCK_DIVIDER = 3 (SPI clock = 200 / 8 ~ 25 MHz) */
+#define ATH79_SPI_CLK_DIV(x)           (((x) >> 1) - 1)
+#define ATH79_SPI_RRW_DELAY_FACTOR     12000
+#define ATH79_SPI_MHZ                  (1000 * 1000)
+
+struct ath79_spi_priv {
+	void __iomem *regs;
+	u32 rrw_delay;
+};
+
+static void spi_cs_activate(struct udevice *dev)
+{
+	struct udevice *bus = dev_get_parent(dev);
+	struct ath79_spi_priv *priv = dev_get_priv(bus);
+
+	writel(AR71XX_SPI_FS_GPIO, priv->regs + AR71XX_SPI_REG_FS);
+	writel(AR71XX_SPI_IOC_CS_ALL, priv->regs + AR71XX_SPI_REG_IOC);
+}
+
+static void spi_cs_deactivate(struct udevice *dev)
+{
+	struct udevice *bus = dev_get_parent(dev);
+	struct ath79_spi_priv *priv = dev_get_priv(bus);
+
+	writel(AR71XX_SPI_IOC_CS_ALL, priv->regs + AR71XX_SPI_REG_IOC);
+	writel(0, priv->regs + AR71XX_SPI_REG_FS);
+}
+
+static int ath79_spi_claim_bus(struct udevice *dev)
+{
+	return 0;
+}
+
+static int ath79_spi_release_bus(struct udevice *dev)
+{
+	return 0;
+}
+
+static int ath79_spi_xfer(struct udevice *dev, unsigned int bitlen,
+		const void *dout, void *din, unsigned long flags)
+{
+	struct udevice *bus = dev_get_parent(dev);
+	struct ath79_spi_priv *priv = dev_get_priv(bus);
+	struct dm_spi_slave_platdata *slave = dev_get_parent_platdata(dev);
+	u8 *rx = din;
+	const u8 *tx = dout;
+	u8 curbyte, curbitlen, restbits;
+	u32 bytes = bitlen / 8;
+	u32 out, in;
+	u64 tick;
+
+	if (flags & SPI_XFER_BEGIN)
+		spi_cs_activate(dev);
+
+	restbits = (bitlen % 8);
+	if (restbits)
+		bytes++;
+
+	out = AR71XX_SPI_IOC_CS_ALL & ~(AR71XX_SPI_IOC_CS(slave->cs));
+	while (bytes > 0) {
+		bytes--;
+		curbyte = 0;
+		if (tx)
+			curbyte = *tx++;
+
+		if (restbits && !bytes) {
+			curbitlen = restbits;
+			curbyte <<= 8 - restbits;
+		} else {
+			curbitlen = 8;
+		}
+
+		for (curbyte <<= (8 - curbitlen); curbitlen; curbitlen--) {
+			if (curbyte & 0x80)
+				out |= AR71XX_SPI_IOC_DO;
+			else
+				out &= ~(AR71XX_SPI_IOC_DO);
+
+			writel(out, priv->regs + AR71XX_SPI_REG_IOC);
+
+			/* delay for low level */
+			if (priv->rrw_delay) {
+				tick = get_ticks() + priv->rrw_delay;
+				while (get_ticks() < tick)
+					/*NOP*/;
+			}
+
+			writel(out | AR71XX_SPI_IOC_CLK,
+			       priv->regs + AR71XX_SPI_REG_IOC);
+
+			/* delay for high level */
+			if (priv->rrw_delay) {
+				tick = get_ticks() + priv->rrw_delay;
+				while (get_ticks() < tick)
+					/*NOP*/;
+			}
+
+			curbyte <<= 1;
+		}
+
+		if (!bytes)
+			writel(out, priv->regs + AR71XX_SPI_REG_IOC);
+
+		in = readl(priv->regs + AR71XX_SPI_REG_RDS);
+		if (rx) {
+			if (restbits && !bytes)
+				*rx++ = (in << (8 - restbits));
+			else
+				*rx++ = in;
+		}
+	}
+
+	if (flags & SPI_XFER_END)
+		spi_cs_deactivate(dev);
+
+	return 0;
+}
+
+
+static int ath79_spi_set_speed(struct udevice *bus, uint speed)
+{
+	struct ath79_spi_priv *priv = dev_get_priv(bus);
+	u32 val, div = 0;
+	u64 time;
+
+	if (speed)
+		div = get_bus_freq(0) / speed;
+
+	if (div > 63)
+		div = 63;
+
+	if (div < 5)
+		div = 5;
+
+	/* calculate delay */
+	time = get_tbclk();
+	do_div(time, speed / 2);
+	val = get_bus_freq(0) / ATH79_SPI_MHZ;
+	val = ATH79_SPI_RRW_DELAY_FACTOR / val;
+	if (time > val)
+		priv->rrw_delay = time - val + 1;
+	else
+		priv->rrw_delay = 0;
+
+	writel(AR71XX_SPI_FS_GPIO, priv->regs + AR71XX_SPI_REG_FS);
+	clrsetbits_be32(priv->regs + AR71XX_SPI_REG_CTRL,
+			AR71XX_SPI_CTRL_DIV_MASK,
+			ATH79_SPI_CLK_DIV(div));
+	writel(0, priv->regs + AR71XX_SPI_REG_FS);
+	return 0;
+}
+
+static int ath79_spi_set_mode(struct udevice *bus, uint mode)
+{
+	return 0;
+}
+
+static int ath79_spi_probe(struct udevice *bus)
+{
+	struct ath79_spi_priv *priv = dev_get_priv(bus);
+	fdt_addr_t addr;
+
+	addr = dev_get_addr(bus);
+	if (addr == FDT_ADDR_T_NONE)
+		return -EINVAL;
+
+	priv->regs = map_physmem(addr,
+				 AR71XX_SPI_SIZE,
+				 MAP_NOCACHE);
+
+	/* Init SPI Hardware, disable remap, set clock */
+	writel(AR71XX_SPI_FS_GPIO, priv->regs + AR71XX_SPI_REG_FS);
+	writel(AR71XX_SPI_CTRL_RD | ATH79_SPI_CLK_DIV(8),
+	       priv->regs + AR71XX_SPI_REG_CTRL);
+	writel(0, priv->regs + AR71XX_SPI_REG_FS);
+
+	return 0;
+}
+
+static int ath79_cs_info(struct udevice *bus, uint cs,
+			   struct spi_cs_info *info)
+{
+	/* Always allow activity on CS 0/1/2 */
+	if (cs >= 3)
+		return -ENODEV;
+
+	return 0;
+}
+
+static const struct dm_spi_ops ath79_spi_ops = {
+	.claim_bus  = ath79_spi_claim_bus,
+	.release_bus    = ath79_spi_release_bus,
+	.xfer       = ath79_spi_xfer,
+	.set_speed  = ath79_spi_set_speed,
+	.set_mode   = ath79_spi_set_mode,
+	.cs_info    = ath79_cs_info,
+};
+
+static const struct udevice_id ath79_spi_ids[] = {
+	{ .compatible = "qca,ar7100-spi" },
+	{}
+};
+
+U_BOOT_DRIVER(ath79_spi) = {
+	.name   = "ath79_spi",
+	.id = UCLASS_SPI,
+	.of_match = ath79_spi_ids,
+	.ops    = &ath79_spi_ops,
+	.priv_auto_alloc_size = sizeof(struct ath79_spi_priv),
+	.probe  = ath79_spi_probe,
+};
diff --git a/drivers/spi/omap3_spi.c b/drivers/spi/omap3_spi.c
index 2fe34c9..60e9d6e 100644
--- a/drivers/spi/omap3_spi.c
+++ b/drivers/spi/omap3_spi.c
@@ -35,6 +35,12 @@
 #define OMAP3_MCSPI4_BASE	0x480BA000
 #endif
 
+#define OMAP4_MCSPI_REG_OFFSET	0x100
+
+struct omap2_mcspi_platform_config {
+	unsigned int regs_offset;
+};
+
 /* per-register bitmasks */
 #define OMAP3_MCSPI_SYSCONFIG_SMARTIDLE (2 << 3)
 #define OMAP3_MCSPI_SYSCONFIG_ENAWAKEUP BIT(2)
@@ -623,7 +629,10 @@
 	const void *blob = gd->fdt_blob;
 	int node = dev->of_offset;
 
-	priv->regs = (struct mcspi *)dev_get_addr(dev);
+	struct omap2_mcspi_platform_config* data =
+		(struct omap2_mcspi_platform_config*)dev_get_driver_data(dev);
+
+	priv->regs = (struct mcspi *)(dev_get_addr(dev) + data->regs_offset);
 	priv->pin_dir = fdtdec_get_uint(blob, node, "ti,pindir-d0-out-d1-in",
 					    MCSPI_PINDIR_D0_IN_D1_OUT);
 	priv->wordlen = SPI_DEFAULT_WORDLEN;
@@ -662,9 +671,17 @@
 	 */
 };
 
+static struct omap2_mcspi_platform_config omap2_pdata = {
+	.regs_offset = 0,
+};
+
+static struct omap2_mcspi_platform_config omap4_pdata = {
+	.regs_offset = OMAP4_MCSPI_REG_OFFSET,
+};
+
 static const struct udevice_id omap3_spi_ids[] = {
-	{ .compatible = "ti,omap2-mcspi" },
-	{ .compatible = "ti,omap4-mcspi" },
+	{ .compatible = "ti,omap2-mcspi", .data = (ulong)&omap2_pdata },
+	{ .compatible = "ti,omap4-mcspi", .data = (ulong)&omap4_pdata },
 	{ }
 };
 
diff --git a/drivers/spi/soft_spi.c b/drivers/spi/soft_spi.c
index aa4abcc..d23dc81 100644
--- a/drivers/spi/soft_spi.c
+++ b/drivers/spi/soft_spi.c
@@ -26,15 +26,20 @@
 	struct gpio_desc mosi;
 	struct gpio_desc miso;
 	int spi_delay_us;
+	int flags;
 };
 
+#define SPI_MASTER_NO_RX        BIT(0)
+#define SPI_MASTER_NO_TX        BIT(1)
+
 struct soft_spi_priv {
 	unsigned int mode;
 };
 
 static int soft_spi_scl(struct udevice *dev, int bit)
 {
-	struct soft_spi_platdata *plat = dev->platdata;
+	struct udevice *bus = dev_get_parent(dev);
+	struct soft_spi_platdata *plat = dev_get_platdata(bus);
 
 	dm_gpio_set_value(&plat->sclk, bit);
 
@@ -43,7 +48,8 @@
 
 static int soft_spi_sda(struct udevice *dev, int bit)
 {
-	struct soft_spi_platdata *plat = dev->platdata;
+	struct udevice *bus = dev_get_parent(dev);
+	struct soft_spi_platdata *plat = dev_get_platdata(bus);
 
 	dm_gpio_set_value(&plat->mosi, bit);
 
@@ -52,7 +58,8 @@
 
 static int soft_spi_cs_activate(struct udevice *dev)
 {
-	struct soft_spi_platdata *plat = dev->platdata;
+	struct udevice *bus = dev_get_parent(dev);
+	struct soft_spi_platdata *plat = dev_get_platdata(bus);
 
 	dm_gpio_set_value(&plat->cs, 0);
 	dm_gpio_set_value(&plat->sclk, 0);
@@ -63,7 +70,8 @@
 
 static int soft_spi_cs_deactivate(struct udevice *dev)
 {
-	struct soft_spi_platdata *plat = dev->platdata;
+	struct udevice *bus = dev_get_parent(dev);
+	struct soft_spi_platdata *plat = dev_get_platdata(bus);
 
 	dm_gpio_set_value(&plat->cs, 0);
 
@@ -100,8 +108,9 @@
 static int soft_spi_xfer(struct udevice *dev, unsigned int bitlen,
 			 const void *dout, void *din, unsigned long flags)
 {
-	struct soft_spi_priv *priv = dev_get_priv(dev);
-	struct soft_spi_platdata *plat = dev->platdata;
+	struct udevice *bus = dev_get_parent(dev);
+	struct soft_spi_priv *priv = dev_get_priv(bus);
+	struct soft_spi_platdata *plat = dev_get_platdata(bus);
 	uchar		tmpdin  = 0;
 	uchar		tmpdout = 0;
 	const u8	*txd = dout;
@@ -134,14 +143,16 @@
 
 		if (!cpha)
 			soft_spi_scl(dev, 0);
-		soft_spi_sda(dev, tmpdout & 0x80);
+		if ((plat->flags & SPI_MASTER_NO_TX) == 0)
+			soft_spi_sda(dev, !!(tmpdout & 0x80));
 		udelay(plat->spi_delay_us);
 		if (cpha)
 			soft_spi_scl(dev, 0);
 		else
 			soft_spi_scl(dev, 1);
 		tmpdin	<<= 1;
-		tmpdin	|= dm_gpio_get_value(&plat->miso);
+		if ((plat->flags & SPI_MASTER_NO_RX) == 0)
+			tmpdin	|= dm_gpio_get_value(&plat->miso);
 		tmpdout	<<= 1;
 		udelay(plat->spi_delay_us);
 		if (cpha)
@@ -203,24 +214,36 @@
 	struct spi_slave *slave = dev_get_parent_priv(dev);
 	struct soft_spi_platdata *plat = dev->platdata;
 	int cs_flags, clk_flags;
+	int ret;
 
 	cs_flags = (slave->mode & SPI_CS_HIGH) ? 0 : GPIOD_ACTIVE_LOW;
 	clk_flags = (slave->mode & SPI_CPOL) ? GPIOD_ACTIVE_LOW : 0;
-	if (gpio_request_by_name(dev, "cs-gpio", 0, &plat->cs,
+
+	if (gpio_request_by_name(dev, "cs-gpios", 0, &plat->cs,
 				 GPIOD_IS_OUT | cs_flags) ||
-	    gpio_request_by_name(dev, "sclk-gpio", 0, &plat->sclk,
-				 GPIOD_IS_OUT | clk_flags) ||
-	    gpio_request_by_name(dev, "mosi-gpio", 0, &plat->mosi,
-				 GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE) ||
-	    gpio_request_by_name(dev, "miso-gpio", 0, &plat->miso,
-				 GPIOD_IS_IN))
+	    gpio_request_by_name(dev, "gpio-sck", 0, &plat->sclk,
+				 GPIOD_IS_OUT | clk_flags))
+		return -EINVAL;
+
+	ret = gpio_request_by_name(dev, "gpio-mosi", 0, &plat->mosi,
+				   GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
+	if (ret)
+		plat->flags |= SPI_MASTER_NO_TX;
+
+	ret = gpio_request_by_name(dev, "gpio-miso", 0, &plat->miso,
+				   GPIOD_IS_IN);
+	if (ret)
+		plat->flags |= SPI_MASTER_NO_RX;
+
+	if ((plat->flags & (SPI_MASTER_NO_RX | SPI_MASTER_NO_TX)) ==
+	    (SPI_MASTER_NO_RX | SPI_MASTER_NO_TX))
 		return -EINVAL;
 
 	return 0;
 }
 
 static const struct udevice_id soft_spi_ids[] = {
-	{ .compatible = "u-boot,soft-spi" },
+	{ .compatible = "spi-gpio" },
 	{ }
 };
 
diff --git a/drivers/spi/spi-uclass.c b/drivers/spi/spi-uclass.c
index 5561f36..84b6786 100644
--- a/drivers/spi/spi-uclass.c
+++ b/drivers/spi/spi-uclass.c
@@ -45,12 +45,12 @@
 	return 0;
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+int dm_spi_claim_bus(struct udevice *dev)
 {
-	struct udevice *dev = slave->dev;
 	struct udevice *bus = dev->parent;
 	struct dm_spi_ops *ops = spi_get_ops(bus);
 	struct dm_spi_bus *spi = dev_get_uclass_priv(bus);
+	struct spi_slave *slave = dev_get_parent_priv(dev);
 	int speed;
 	int ret;
 
@@ -73,9 +73,8 @@
 	return ops->claim_bus ? ops->claim_bus(dev) : 0;
 }
 
-void spi_release_bus(struct spi_slave *slave)
+void dm_spi_release_bus(struct udevice *dev)
 {
-	struct udevice *dev = slave->dev;
 	struct udevice *bus = dev->parent;
 	struct dm_spi_ops *ops = spi_get_ops(bus);
 
@@ -83,10 +82,9 @@
 		ops->release_bus(dev);
 }
 
-int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
-	     const void *dout, void *din, unsigned long flags)
+int dm_spi_xfer(struct udevice *dev, unsigned int bitlen,
+		const void *dout, void *din, unsigned long flags)
 {
-	struct udevice *dev = slave->dev;
 	struct udevice *bus = dev->parent;
 
 	if (bus->uclass->uc_drv->id != UCLASS_SPI)
@@ -95,6 +93,22 @@
 	return spi_get_ops(bus)->xfer(dev, bitlen, dout, din, flags);
 }
 
+int spi_claim_bus(struct spi_slave *slave)
+{
+	return dm_spi_claim_bus(slave->dev);
+}
+
+void spi_release_bus(struct spi_slave *slave)
+{
+	dm_spi_release_bus(slave->dev);
+}
+
+int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
+	     const void *dout, void *din, unsigned long flags)
+{
+	return dm_spi_xfer(slave->dev, bitlen, dout, din, flags);
+}
+
 static int spi_post_bind(struct udevice *dev)
 {
 	/* Scan the bus for devices */
diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile
index 2f3d43d..2f46d38 100644
--- a/drivers/usb/common/Makefile
+++ b/drivers/usb/common/Makefile
@@ -3,5 +3,6 @@
 # SPDX-License-Identifier:      GPL-2.0+
 #
 
+obj-$(CONFIG_DM_USB) += common.o
 obj-$(CONFIG_USB_EHCI_FSL) += fsl-dt-fixup.o
 obj-$(CONFIG_USB_XHCI_FSL) += fsl-dt-fixup.o
diff --git a/drivers/usb/common/common.c b/drivers/usb/common/common.c
new file mode 100644
index 0000000..35c2dc1
--- /dev/null
+++ b/drivers/usb/common/common.c
@@ -0,0 +1,40 @@
+/*
+ * Provides code common for host and device side USB.
+ *
+ * (C) Copyright 2016
+ *     Texas Instruments Incorporated, <www.ti.com>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <libfdt.h>
+#include <linux/usb/otg.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static const char *const usb_dr_modes[] = {
+	[USB_DR_MODE_UNKNOWN]		= "",
+	[USB_DR_MODE_HOST]		= "host",
+	[USB_DR_MODE_PERIPHERAL]	= "peripheral",
+	[USB_DR_MODE_OTG]		= "otg",
+};
+
+enum usb_dr_mode usb_get_dr_mode(int node)
+{
+	const void *fdt = gd->fdt_blob;
+	const char *dr_mode;
+	int i;
+
+	dr_mode = fdt_getprop(fdt, node, "dr_mode", NULL);
+	if (!dr_mode) {
+		error("usb dr_mode not found\n");
+		return USB_DR_MODE_UNKNOWN;
+	}
+
+	for (i = 0; i < ARRAY_SIZE(usb_dr_modes); i++)
+		if (!strcmp(dr_mode, usb_dr_modes[i]))
+			return i;
+
+	return USB_DR_MODE_UNKNOWN;
+}
diff --git a/drivers/video/ipu_common.c b/drivers/video/ipu_common.c
index 36d4b23..5676a0f 100644
--- a/drivers/video/ipu_common.c
+++ b/drivers/video/ipu_common.c
@@ -352,7 +352,9 @@
 	 */
 	__raw_writel((div / 16) << 16, DI_BS_CLKGEN1(clk->id));
 
-	clk->rate = (u64)(clk->parent->rate * 16) / div;
+	do_div(parent_rate, div);
+
+	clk->rate = parent_rate;
 
 	return 0;
 }
diff --git a/drivers/video/tegra.c b/drivers/video/tegra.c
index 7fd10e6..c01809e 100644
--- a/drivers/video/tegra.c
+++ b/drivers/video/tegra.c
@@ -620,6 +620,13 @@
 static int tegra_lcd_bind(struct udevice *dev)
 {
 	struct video_uc_platdata *plat = dev_get_uclass_platdata(dev);
+	const void *blob = gd->fdt_blob;
+	int node = dev->of_offset;
+	int rgb;
+
+	rgb = fdt_subnode_offset(blob, node, "rgb");
+	if ((rgb < 0) || !fdtdec_get_is_enabled(blob, rgb))
+		return -ENODEV;
 
 	plat->size = LCD_MAX_WIDTH * LCD_MAX_HEIGHT *
 		(1 << LCD_MAX_LOG2_BPP) / 8;
diff --git a/dts/Kconfig b/dts/Kconfig
index d585009..c56c129 100644
--- a/dts/Kconfig
+++ b/dts/Kconfig
@@ -62,6 +62,7 @@
 config OF_LIST
 	string "List of device tree files to include for DT control"
 	depends on SPL_LOAD_FIT
+	default DEFAULT_DEVICE_TREE
 	help
 	  This option specifies a list of device tree files to use for DT
 	  control. These will be packaged into a FIT. At run-time, SPL will
diff --git a/examples/api/Makefile b/examples/api/Makefile
index 4e9b8ea..6cffee7 100644
--- a/examples/api/Makefile
+++ b/examples/api/Makefile
@@ -11,8 +11,12 @@
 LOAD_ADDR = 0x1000000
 endif
 ifeq ($(ARCH),mips)
+ifdef CONFIG_64BIT
+LOAD_ADDR = 0xffffffff80200000
+else
 LOAD_ADDR = 0x80200000
 endif
+endif
 
 # Resulting ELF and binary exectuables will be named demo and demo.bin
 extra-y = demo
diff --git a/examples/api/crt0.S b/examples/api/crt0.S
index ced2c82..5a7049d 100644
--- a/examples/api/crt0.S
+++ b/examples/api/crt0.S
@@ -41,28 +41,29 @@
 	ldr	pc, [ip]
 
 #elif defined(CONFIG_MIPS)
+#include <asm/asm.h>
 	.text
 	.globl __start
 	.ent __start
 __start:
-	sw	$sp, search_hint
+	PTR_S	$sp, search_hint
 	b	main
 	.end __start
 
 	.globl syscall
 	.ent syscall
 syscall:
-	sw	$ra, return_addr
-	lw	$t9, syscall_ptr
+	PTR_S	$ra, return_addr
+	PTR_L	$t9, syscall_ptr
 	jalr	$t9
 	nop
-	lw	$ra, return_addr
+	PTR_L	$ra, return_addr
 	jr	$ra
 	nop
 	.end syscall
 
 return_addr:
-	.align 4
+	.align 8
 	.long 0
 #else
 #error No support for this arch!
@@ -70,7 +71,7 @@
 
 	.globl syscall_ptr
 syscall_ptr:
-	.align	4
+	.align	8
 	.long	0
 
 	.globl search_hint
diff --git a/examples/api/glue.c b/examples/api/glue.c
index d619518..8aabf32 100644
--- a/examples/api/glue.c
+++ b/examples/api/glue.c
@@ -77,7 +77,7 @@
 {
 	int c;
 
-	if (!syscall(API_GETC, NULL, (uint32_t)&c))
+	if (!syscall(API_GETC, NULL, &c))
 		return -1;
 
 	return c;
@@ -87,7 +87,7 @@
 {
 	int t;
 
-	if (!syscall(API_TSTC, NULL, (uint32_t)&t))
+	if (!syscall(API_TSTC, NULL, &t))
 		return -1;
 
 	return t;
@@ -95,12 +95,12 @@
 
 void ub_putc(char c)
 {
-	syscall(API_PUTC, NULL, (uint32_t)&c);
+	syscall(API_PUTC, NULL, &c);
 }
 
 void ub_puts(const char *s)
 {
-	syscall(API_PUTS, NULL, (uint32_t)s);
+	syscall(API_PUTS, NULL, s);
 }
 
 /****************************************
@@ -126,7 +126,7 @@
 	si.mr_no = UB_MAX_MR;
 	memset(&mr, 0, sizeof(mr));
 
-	if (!syscall(API_GET_SYS_INFO, &err, (u_int32_t)&si))
+	if (!syscall(API_GET_SYS_INFO, &err, &si))
 		return NULL;
 
 	return ((err) ? NULL : &si);
@@ -344,7 +344,7 @@
 {
 	char *value;
 
-	if (!syscall(API_ENV_GET, NULL, (uint32_t)name, (uint32_t)&value))
+	if (!syscall(API_ENV_GET, NULL, name, &value))
 		return NULL;
 
 	return value;
@@ -352,7 +352,7 @@
 
 void ub_env_set(const char *name, char *value)
 {
-	syscall(API_ENV_SET, NULL, (uint32_t)name, (uint32_t)value);
+	syscall(API_ENV_SET, NULL, name, value);
 }
 
 static char env_name[256];
@@ -369,7 +369,7 @@
 	 * 'name=val' string), since the API_ENUM_ENV call uses envmatch()
 	 * internally, which handles such case
 	 */
-	if (!syscall(API_ENV_ENUM, NULL, (uint32_t)last, (uint32_t)&env))
+	if (!syscall(API_ENV_ENUM, NULL, last, &env))
 		return NULL;
 
 	if (!env)
@@ -396,7 +396,7 @@
 {
 	int err = 0;
 
-	if (!syscall(API_DISPLAY_GET_INFO, &err, (uint32_t)type, (uint32_t)di))
+	if (!syscall(API_DISPLAY_GET_INFO, &err, type, di))
 		return API_ESYSC;
 
 	return err;
diff --git a/examples/standalone/stubs.c b/examples/standalone/stubs.c
index 920a0a9..0d62067 100644
--- a/examples/standalone/stubs.c
+++ b/examples/standalone/stubs.c
@@ -65,6 +65,23 @@
 	: : "i"(offsetof(gd_t, jt)), "i"(FO(x)) : "ip");
 #endif
 #elif defined(CONFIG_MIPS)
+#ifdef CONFIG_CPU_MIPS64
+/*
+ * k0 ($26) holds the pointer to the global_data; t9 ($25) is a call-
+ * clobbered register that is also used to set gp ($26). Note that the
+ * jr instruction also executes the instruction immediately following
+ * it; however, GCC/mips generates an additional `nop' after each asm
+ * statement
+ */
+#define EXPORT_FUNC(f, a, x, ...) \
+	asm volatile (			\
+"	.globl " #x "\n"		\
+#x ":\n"				\
+"	ld	$25, %0($26)\n"		\
+"	ld	$25, %1($25)\n"		\
+"	jr	$25\n"			\
+        : : "i"(offsetof(gd_t, jt)), "i"(FO(x)) : "t9");
+#else
 /*
  * k0 ($26) holds the pointer to the global_data; t9 ($25) is a call-
  * clobbered register that is also used to set gp ($26). Note that the
@@ -80,6 +97,7 @@
 "	lw	$25, %1($25)\n"		\
 "	jr	$25\n"			\
 	: : "i"(offsetof(gd_t, jt)), "i"(FO(x)) : "t9");
+#endif
 #elif defined(CONFIG_NIOS2)
 /*
  * gp holds the pointer to the global_data, r8 is call-clobbered
diff --git a/fs/fat/fat.c b/fs/fat/fat.c
index 600a90e..826bd85 100644
--- a/fs/fat/fat.c
+++ b/fs/fat/fat.c
@@ -1254,7 +1254,7 @@
 
 #if defined(CONFIG_CMD_IDE) || \
     defined(CONFIG_CMD_SATA) || \
-    defined(CONFIG_CMD_SCSI) || \
+    defined(CONFIG_SCSI) || \
     defined(CONFIG_CMD_USB) || \
     defined(CONFIG_MMC)
 	printf("Interface:  ");
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
index 68b5f0b..2500c10 100644
--- a/include/asm-generic/gpio.h
+++ b/include/asm-generic/gpio.h
@@ -207,6 +207,16 @@
 struct fdtdec_phandle_args;
 
 /**
+ * gpio_xlate_offs_flags() - implementation for common use of dm_gpio_ops.xlate
+ *
+ * This routine sets the offset field to args[0] and the flags field to
+ * GPIOD_ACTIVE_LOW if the GPIO_ACTIVE_LOW flag is present in args[1].
+ *
+ */
+int gpio_xlate_offs_flags(struct udevice *dev, struct gpio_desc *desc,
+			  struct fdtdec_phandle_args *args);
+
+/**
  * struct struct dm_gpio_ops - Driver model GPIO operations
  *
  * Refer to functions above for description. These function largely copy
@@ -258,12 +268,11 @@
 	 *
 	 *   @desc->dev to @dev
 	 *   @desc->flags to 0
-	 *   @desc->offset to the value of the first argument in args, if any,
-	 *		otherwise -1 (which is invalid)
+	 *   @desc->offset to 0
 	 *
-	 * This method is optional so if the above defaults suit it can be
-	 * omitted. Typical behaviour is to set up the GPIOD_ACTIVE_LOW flag
-	 * in desc->flags.
+	 * This method is optional and defaults to gpio_xlate_offs_flags,
+	 * which will parse offset and the GPIO_ACTIVE_LOW flag in the first
+	 * two arguments.
 	 *
 	 * Note that @dev is passed in as a parameter to follow driver model
 	 * uclass conventions, even though it is already available as
diff --git a/include/ata.h b/include/ata.h
index 9d6f59c..dde377c 100644
--- a/include/ata.h
+++ b/include/ata.h
@@ -126,7 +126,7 @@
 
 #define ATA_BLOCKSIZE	512	/* bytes */
 #define ATA_BLOCKSHIFT	9	/* 2 ^ ATA_BLOCKSIZESHIFT = 512 */
-#define ATA_SECTORWORDS	(512 / sizeof(unsigned long))
+#define ATA_SECTORWORDS	(512 / sizeof(uint32_t))
 
 #ifndef ATA_RESET_TIME
 #define ATA_RESET_TIME	60	/* spec allows up to 31 seconds */
diff --git a/include/blk.h b/include/blk.h
index f624671..66a1c55 100644
--- a/include/blk.h
+++ b/include/blk.h
@@ -30,6 +30,7 @@
 	IF_TYPE_SD,
 	IF_TYPE_SATA,
 	IF_TYPE_HOST,
+	IF_TYPE_SYSTEMACE,
 
 	IF_TYPE_COUNT,			/* Number of interface types */
 };
@@ -62,6 +63,11 @@
 	char		product[20+1];	/* IDE Serial no, SCSI product */
 	char		revision[8+1];	/* firmware revision */
 #ifdef CONFIG_BLK
+	/*
+	 * For now we have a few functions which take struct blk_desc as a
+	 * parameter. This field allows them to look up the associated
+	 * device. Once these functions are removed we can drop this field.
+	 */
 	struct udevice *bdev;
 #else
 	unsigned long	(*block_read)(struct blk_desc *block_dev,
@@ -210,6 +216,25 @@
 	 */
 	unsigned long (*erase)(struct udevice *dev, lbaint_t start,
 			       lbaint_t blkcnt);
+
+	/**
+	 * select_hwpart() - select a particular hardware partition
+	 *
+	 * Some devices (e.g. MMC) can support partitioning at the hardware
+	 * level. This is quite separate from the normal idea of
+	 * software-based partitions. MMC hardware partitions must be
+	 * explicitly selected. Once selected only the region of the device
+	 * covered by that partition is accessible.
+	 *
+	 * The MMC standard provides for two boot partitions (numbered 1 and 2),
+	 * rpmb (3), and up to 4 addition general-purpose partitions (4-7).
+	 *
+	 * @desc:	Block device to update
+	 * @hwpart:	Hardware partition number to select. 0 means the raw
+	 *		device, 1 is the first partition, 2 is the second, etc.
+	 * @return 0 if OK, -ve on error
+	 */
+	int (*select_hwpart)(struct udevice *dev, int hwpart);
 };
 
 #define blk_get_ops(dev)	((struct blk_ops *)(dev)->driver->ops)
@@ -269,7 +294,8 @@
  * @drv_name:	Driver name to use for the block device
  * @name:	Name for the device
  * @if_type:	Interface type (enum if_type_t)
- * @devnum:	Device number, specific to the interface type
+ * @devnum:	Device number, specific to the interface type, or -1 to
+ *		allocate the next available number
  * @blksz:	Block size of the device in bytes (typically 512)
  * @size:	Total size of the device in bytes
  * @devp:	the new device (which has not been probed)
@@ -279,6 +305,23 @@
 		      lbaint_t size, struct udevice **devp);
 
 /**
+ * blk_create_devicef() - Create a new named block device
+ *
+ * @parent:	Parent of the new device
+ * @drv_name:	Driver name to use for the block device
+ * @name:	Name for the device (parent name is prepended)
+ * @if_type:	Interface type (enum if_type_t)
+ * @devnum:	Device number, specific to the interface type, or -1 to
+ *		allocate the next available number
+ * @blksz:	Block size of the device in bytes (typically 512)
+ * @size:	Total size of the device in bytes
+ * @devp:	the new device (which has not been probed)
+ */
+int blk_create_devicef(struct udevice *parent, const char *drv_name,
+		       const char *name, int if_type, int devnum, int blksz,
+		       lbaint_t size, struct udevice **devp);
+
+/**
  * blk_prepare_device() - Prepare a block device for use
  *
  * This reads partition information from the device if supported.
@@ -298,6 +341,29 @@
  */
 int blk_unbind_all(int if_type);
 
+/**
+ * blk_find_max_devnum() - find the maximum device number for an interface type
+ *
+ * Finds the last allocated device number for an interface type @if_type. The
+ * next number is safe to use for a newly allocated device.
+ *
+ * @if_type:	Interface type to scan
+ * @return maximum device number found, or -ENODEV if none, or other -ve on
+ * error
+ */
+int blk_find_max_devnum(enum if_type if_type);
+
+/**
+ * blk_select_hwpart() - select a hardware partition
+ *
+ * Select a hardware partition if the device supports it (typically MMC does)
+ *
+ * @dev:	Device to update
+ * @hwpart:	Partition number to select
+ * @return 0 if OK, -ve on error
+ */
+int blk_select_hwpart(struct udevice *dev, int hwpart);
+
 #else
 #include <errno.h>
 /*
@@ -340,6 +406,201 @@
 	blkcache_invalidate(block_dev->if_type, block_dev->devnum);
 	return block_dev->block_erase(block_dev, start, blkcnt);
 }
+
+/**
+ * struct blk_driver - Driver for block interface types
+ *
+ * This provides access to the block devices for each interface type. One
+ * driver should be provided using U_BOOT_LEGACY_BLK() for each interface
+ * type that is to be supported.
+ *
+ * @if_typename:	Interface type name
+ * @if_type:		Interface type
+ * @max_devs:		Maximum number of devices supported
+ * @desc:		Pointer to list of devices for this interface type,
+ *			or NULL to use @get_dev() instead
+ */
+struct blk_driver {
+	const char *if_typename;
+	enum if_type if_type;
+	int max_devs;
+	struct blk_desc *desc;
+	/**
+	 * get_dev() - get a pointer to a block device given its number
+	 *
+	 * Each interface allocates its own devices and typically
+	 * struct blk_desc is contained with the interface's data structure.
+	 * There is no global numbering for block devices. This method allows
+	 * the device for an interface type to be obtained when @desc is NULL.
+	 *
+	 * @devnum:	Device number (0 for first device on that interface,
+	 *		1 for second, etc.
+	 * @descp:	Returns pointer to the block device on success
+	 * @return 0 if OK, -ve on error
+	 */
+	int (*get_dev)(int devnum, struct blk_desc **descp);
+
+	/**
+	 * select_hwpart() - Select a hardware partition
+	 *
+	 * Some devices (e.g. MMC) can support partitioning at the hardware
+	 * level. This is quite separate from the normal idea of
+	 * software-based partitions. MMC hardware partitions must be
+	 * explicitly selected. Once selected only the region of the device
+	 * covered by that partition is accessible.
+	 *
+	 * The MMC standard provides for two boot partitions (numbered 1 and 2),
+	 * rpmb (3), and up to 4 addition general-purpose partitions (4-7).
+	 * Partition 0 is the main user-data partition.
+	 *
+	 * @desc:	Block device descriptor
+	 * @hwpart:	Hardware partition number to select. 0 means the main
+	 *		user-data partition, 1 is the first partition, 2 is
+	 *		the second, etc.
+	 * @return 0 if OK, other value for an error
+	 */
+	int (*select_hwpart)(struct blk_desc *desc, int hwpart);
+};
+
+/*
+ * Declare a new U-Boot legacy block driver. New drivers should use driver
+ * model (UCLASS_BLK).
+ */
+#define U_BOOT_LEGACY_BLK(__name)					\
+	ll_entry_declare(struct blk_driver, __name, blk_driver)
+
+struct blk_driver *blk_driver_lookup_type(int if_type);
+
 #endif /* !CONFIG_BLK */
 
+/**
+ * blk_get_devnum_by_typename() - Get a block device by type and number
+ *
+ * This looks through the available block devices of the given type, returning
+ * the one with the given @devnum.
+ *
+ * @if_type:	Block device type
+ * @devnum:	Device number
+ * @return point to block device descriptor, or NULL if not found
+ */
+struct blk_desc *blk_get_devnum_by_type(enum if_type if_type, int devnum);
+
+/**
+ * blk_get_devnum_by_type() - Get a block device by type name, and number
+ *
+ * This looks up the block device type based on @if_typename, then calls
+ * blk_get_devnum_by_type().
+ *
+ * @if_typename:	Block device type name
+ * @devnum:		Device number
+ * @return point to block device descriptor, or NULL if not found
+ */
+struct blk_desc *blk_get_devnum_by_typename(const char *if_typename,
+					    int devnum);
+
+/**
+ * blk_dselect_hwpart() - select a hardware partition
+ *
+ * This selects a hardware partition (such as is supported by MMC). The block
+ * device size may change as this effectively points the block device to a
+ * partition at the hardware level. See the select_hwpart() method above.
+ *
+ * @desc:	Block device descriptor for the device to select
+ * @hwpart:	Partition number to select
+ * @return 0 if OK, -ve on error
+ */
+int blk_dselect_hwpart(struct blk_desc *desc, int hwpart);
+
+/**
+ * blk_list_part() - list the partitions for block devices of a given type
+ *
+ * This looks up the partition type for each block device of type @if_type,
+ * then displays a list of partitions.
+ *
+ * @if_type:	Block device type
+ * @return 0 if OK, -ENODEV if there is none of that type
+ */
+int blk_list_part(enum if_type if_type);
+
+/**
+ * blk_list_devices() - list the block devices of a given type
+ *
+ * This lists each block device of the type @if_type, showing the capacity
+ * as well as type-specific information.
+ *
+ * @if_type:	Block device type
+ */
+void blk_list_devices(enum if_type if_type);
+
+/**
+ * blk_show_device() - show information about a given block device
+ *
+ * This shows the block device capacity as well as type-specific information.
+ *
+ * @if_type:	Block device type
+ * @devnum:	Device number
+ * @return 0 if OK, -ENODEV for invalid device number
+ */
+int blk_show_device(enum if_type if_type, int devnum);
+
+/**
+ * blk_print_device_num() - show information about a given block device
+ *
+ * This is similar to blk_show_device() but returns an error if the block
+ * device type is unknown.
+ *
+ * @if_type:	Block device type
+ * @devnum:	Device number
+ * @return 0 if OK, -ENODEV for invalid device number, -ENOENT if the block
+ * device is not connected
+ */
+int blk_print_device_num(enum if_type if_type, int devnum);
+
+/**
+ * blk_print_part_devnum() - print the partition information for a device
+ *
+ * @if_type:	Block device type
+ * @devnum:	Device number
+ * @return 0 if OK, -ENOENT if the block device is not connected, -ENOSYS if
+ * the interface type is not supported, other -ve on other error
+ */
+int blk_print_part_devnum(enum if_type if_type, int devnum);
+
+/**
+ * blk_read_devnum() - read blocks from a device
+ *
+ * @if_type:	Block device type
+ * @devnum:	Device number
+ * @blkcnt:	Number of blocks to read
+ * @buffer:	Address to write data to
+ * @return number of blocks read, or -ve error number on error
+ */
+ulong blk_read_devnum(enum if_type if_type, int devnum, lbaint_t start,
+		      lbaint_t blkcnt, void *buffer);
+
+/**
+ * blk_write_devnum() - write blocks to a device
+ *
+ * @if_type:	Block device type
+ * @devnum:	Device number
+ * @blkcnt:	Number of blocks to write
+ * @buffer:	Address to read data from
+ * @return number of blocks written, or -ve error number on error
+ */
+ulong blk_write_devnum(enum if_type if_type, int devnum, lbaint_t start,
+		       lbaint_t blkcnt, const void *buffer);
+
+/**
+ * blk_select_hwpart_devnum() - select a hardware partition
+ *
+ * This is similar to blk_dselect_hwpart() but it looks up the interface and
+ * device number.
+ *
+ * @if_type:	Block device type
+ * @devnum:	Device number
+ * @hwpart:	Partition number to select
+ * @return 0 if OK, -ve on error
+ */
+int blk_select_hwpart_devnum(enum if_type if_type, int devnum, int hwpart);
+
 #endif
diff --git a/include/bootstage.h b/include/bootstage.h
index 9765360..0880a68 100644
--- a/include/bootstage.h
+++ b/include/bootstage.h
@@ -198,6 +198,7 @@
 	BOOTSTAGE_ID_ACCUM_SCSI,
 	BOOTSTAGE_ID_ACCUM_SPI,
 	BOOTSTAGE_ID_ACCUM_DECOMP,
+	BOOTSTAGE_ID_FPGA_INIT,
 
 	/* a few spare for the user, from here */
 	BOOTSTAGE_ID_USER,
diff --git a/include/config_cmd_all.h b/include/config_cmd_all.h
index ed502a1..b5fd6c6 100644
--- a/include/config_cmd_all.h
+++ b/include/config_cmd_all.h
@@ -45,7 +45,7 @@
 #define CONFIG_CMD_READ		/* Read data from partition	*/
 #define CONFIG_CMD_SANDBOX	/* sb command to access sandbox features */
 #define CONFIG_CMD_SAVES	/* save S record dump		*/
-#define CONFIG_CMD_SCSI		/* SCSI Support			*/
+#define CONFIG_SCSI		/* SCSI Support			*/
 #define CONFIG_CMD_SDRAM	/* SDRAM DIMM SPD info printout */
 #define CONFIG_CMD_TERMINAL	/* built-in Serial Terminal	*/
 #define CONFIG_CMD_UBI		/* UBI Support			*/
diff --git a/include/config_distro_bootcmd.h b/include/config_distro_bootcmd.h
index 7f67344..5a8d7f2 100644
--- a/include/config_distro_bootcmd.h
+++ b/include/config_distro_bootcmd.h
@@ -165,7 +165,7 @@
 	BOOT_TARGET_DEVICES_references_SATA_without_CONFIG_CMD_SATA
 #endif
 
-#ifdef CONFIG_CMD_SCSI
+#ifdef CONFIG_SCSI
 #define BOOTENV_RUN_SCSI_INIT "run scsi_init; "
 #define BOOTENV_SET_SCSI_NEED_INIT "setenv scsi_need_init; "
 #define BOOTENV_SHARED_SCSI \
@@ -185,9 +185,9 @@
 #define BOOTENV_SET_SCSI_NEED_INIT
 #define BOOTENV_SHARED_SCSI
 #define BOOTENV_DEV_SCSI \
-	BOOT_TARGET_DEVICES_references_SCSI_without_CONFIG_CMD_SCSI
+	BOOT_TARGET_DEVICES_references_SCSI_without_CONFIG_SCSI
 #define BOOTENV_DEV_NAME_SCSI \
-	BOOT_TARGET_DEVICES_references_SCSI_without_CONFIG_CMD_SCSI
+	BOOT_TARGET_DEVICES_references_SCSI_without_CONFIG_SCSI
 #endif
 
 #ifdef CONFIG_CMD_IDE
diff --git a/include/config_fallbacks.h b/include/config_fallbacks.h
index 2666191..2ad54b7 100644
--- a/include/config_fallbacks.h
+++ b/include/config_fallbacks.h
@@ -45,7 +45,7 @@
 /* Rather than repeat this expression each time, add a define for it */
 #if defined(CONFIG_CMD_IDE) || \
 	defined(CONFIG_CMD_SATA) || \
-	defined(CONFIG_CMD_SCSI) || \
+	defined(CONFIG_SCSI) || \
 	defined(CONFIG_CMD_USB) || \
 	defined(CONFIG_CMD_PART) || \
 	defined(CONFIG_CMD_GPT) || \
diff --git a/include/configs/MPC8544DS.h b/include/configs/MPC8544DS.h
index 26d92da..f3036c1 100644
--- a/include/configs/MPC8544DS.h
+++ b/include/configs/MPC8544DS.h
@@ -373,7 +373,7 @@
 
 #if defined(CONFIG_PCI)
     #define CONFIG_CMD_PCI
-    #define CONFIG_CMD_SCSI
+    #define CONFIG_SCSI
 #endif
 
 /*
diff --git a/include/configs/MPC8572DS.h b/include/configs/MPC8572DS.h
index 8c4e5e2..bb7f38e 100644
--- a/include/configs/MPC8572DS.h
+++ b/include/configs/MPC8572DS.h
@@ -576,7 +576,7 @@
 
 #if defined(CONFIG_PCI)
 #define CONFIG_CMD_PCI
-#define CONFIG_CMD_SCSI
+#define CONFIG_SCSI
 #endif
 
 /*
diff --git a/include/configs/MPC8610HPCD.h b/include/configs/MPC8610HPCD.h
index e7f01d0..f6d45a9 100644
--- a/include/configs/MPC8610HPCD.h
+++ b/include/configs/MPC8610HPCD.h
@@ -449,7 +449,7 @@
 
 #if defined(CONFIG_PCI)
 #define CONFIG_CMD_PCI
-#define CONFIG_CMD_SCSI
+#define CONFIG_SCSI
 #endif
 
 #define CONFIG_WATCHDOG			/* watchdog enabled */
diff --git a/include/configs/MPC8641HPCN.h b/include/configs/MPC8641HPCN.h
index 2f94c82..9b2623c 100644
--- a/include/configs/MPC8641HPCN.h
+++ b/include/configs/MPC8641HPCN.h
@@ -354,8 +354,6 @@
 
 #define CONFIG_PCI_SCAN_SHOW		/* show pci devices on startup */
 
-#undef CONFIG_SYS_SCSI_SCAN_BUS_REVERSE
-
 #define CONFIG_PCI_PNP			/* do pci plug-and-play */
 
 #undef CONFIG_EEPRO100
@@ -612,7 +610,7 @@
 
 #if defined(CONFIG_PCI)
     #define CONFIG_CMD_PCI
-    #define CONFIG_CMD_SCSI
+    #define CONFIG_SCSI
 #endif
 
 #undef CONFIG_WATCHDOG			/* watchdog disabled */
diff --git a/include/configs/PIP405.h b/include/configs/PIP405.h
index 4bd06a4..4506d86 100644
--- a/include/configs/PIP405.h
+++ b/include/configs/PIP405.h
@@ -43,7 +43,7 @@
 #define CONFIG_CMD_EEPROM
 #define CONFIG_CMD_REGINFO
 #define CONFIG_CMD_FDC
-#define CONFIG_CMD_SCSI
+#define CONFIG_SCSI
 #define CONFIG_CMD_DATE
 #define CONFIG_CMD_SDRAM
 #define CONFIG_CMD_SAVES
diff --git a/include/configs/am57xx_evm.h b/include/configs/am57xx_evm.h
index 32d7d4d..d53b0fd 100644
--- a/include/configs/am57xx_evm.h
+++ b/include/configs/am57xx_evm.h
@@ -75,7 +75,7 @@
 
 /* SATA */
 #define CONFIG_BOARD_LATE_INIT
-#define CONFIG_CMD_SCSI
+#define CONFIG_SCSI
 #define CONFIG_LIBATA
 #define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
diff --git a/include/configs/ap121.h b/include/configs/ap121.h
new file mode 100644
index 0000000..2beffa4
--- /dev/null
+++ b/include/configs/ap121.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define CONFIG_SYS_TEXT_BASE            0x9f000000
+
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_DISPLAY_BOARDINFO
+#define CONFIG_BOARD_EARLY_INIT_F
+
+#define CONFIG_SYS_HZ                   1000
+#define CONFIG_SYS_MHZ                  200
+#define CONFIG_SYS_MIPS_TIMER_FREQ      (CONFIG_SYS_MHZ * 1000000)
+
+/* Cache Configuration */
+#define CONFIG_SYS_DCACHE_SIZE          0x8000
+#define CONFIG_SYS_ICACHE_SIZE          0x10000
+#define CONFIG_SYS_CACHELINE_SIZE       32
+
+#define CONFIG_SYS_MONITOR_BASE         CONFIG_SYS_TEXT_BASE
+
+#define CONFIG_SYS_MALLOC_LEN           0x40000
+#define CONFIG_SYS_BOOTPARAMS_LEN       0x20000
+
+#define CONFIG_SYS_SDRAM_BASE           0x80000000
+#define CONFIG_SYS_LOAD_ADDR            0x81000000
+
+#define CONFIG_SYS_NO_FLASH
+
+#define CONFIG_SYS_INIT_RAM_ADDR        0xbd000000
+#define CONFIG_SYS_INIT_RAM_SIZE        0x8000
+#define CONFIG_SYS_INIT_SP_ADDR \
+	(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE - 1)
+
+#define CONFIG_BAUDRATE                 115200
+#define CONFIG_SYS_BAUDRATE_TABLE \
+	{9600, 19200, 38400, 57600, 115200}
+
+#define CONFIG_BOOTDELAY                3
+#define CONFIG_BOOTARGS                 "console=ttyS0,115200 " \
+					"root=/dev/mtdblock2 " \
+					"rootfstype=squashfs"
+#define CONFIG_BOOTCOMMAND              "sf probe;" \
+					"mtdparts default;" \
+					"bootm 0x9f300000"
+#define CONFIG_LZMA
+
+#define MTDIDS_DEFAULT                  "nor0=spi-flash.0"
+#define MTDPARTS_DEFAULT                "mtdparts=spi-flash.0:" \
+					"256k(u-boot),64k(u-boot-env)," \
+					"2752k(rootfs),896k(uImage)," \
+					"64k(NVRAM),64k(ART)"
+
+#define CONFIG_ENV_SPI_MAX_HZ           25000000
+#define CONFIG_ENV_IS_IN_SPI_FLASH
+#define CONFIG_ENV_OFFSET               0x40000
+#define CONFIG_ENV_SECT_SIZE            0x10000
+#define CONFIG_ENV_SIZE                 0x10000
+
+/*
+ * Command
+ */
+#define CONFIG_CMD_MTDPARTS
+
+/* Miscellaneous configurable options */
+#define CONFIG_SYS_CBSIZE               256
+#define CONFIG_SYS_MAXARGS              16
+#define CONFIG_SYS_PBSIZE               (CONFIG_SYS_CBSIZE + \
+					sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_AUTO_COMPLETE
+
+/*
+ * Diagnostics
+ */
+#define CONFIG_SYS_MEMTEST_START        0x80100000
+#define CONFIG_SYS_MEMTEST_END          0x83f00000
+#define CONFIG_CMD_MEMTEST
+
+#endif  /* __CONFIG_H */
diff --git a/include/configs/ap143.h b/include/configs/ap143.h
new file mode 100644
index 0000000..7b69e10
--- /dev/null
+++ b/include/configs/ap143.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define CONFIG_SYS_TEXT_BASE            0x9f000000
+
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_DISPLAY_BOARDINFO
+#define CONFIG_BOARD_EARLY_INIT_F
+
+#define CONFIG_SYS_HZ                   1000
+#define CONFIG_SYS_MHZ                  325
+#define CONFIG_SYS_MIPS_TIMER_FREQ      (CONFIG_SYS_MHZ * 1000000)
+
+/* Cache Configuration */
+#define CONFIG_SYS_DCACHE_SIZE          0x8000
+#define CONFIG_SYS_ICACHE_SIZE          0x10000
+#define CONFIG_SYS_CACHELINE_SIZE       32
+
+#define CONFIG_SYS_MONITOR_BASE         CONFIG_SYS_TEXT_BASE
+
+#define CONFIG_SYS_MALLOC_LEN           0x40000
+#define CONFIG_SYS_BOOTPARAMS_LEN       0x20000
+
+#define CONFIG_SYS_SDRAM_BASE           0x80000000
+#define CONFIG_SYS_LOAD_ADDR            0x81000000
+
+#define CONFIG_SYS_NO_FLASH
+
+#define CONFIG_SYS_INIT_RAM_ADDR        0xbd000000
+#define CONFIG_SYS_INIT_RAM_SIZE        0x2000
+#define CONFIG_SYS_INIT_SP_ADDR \
+	(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE - 1)
+
+/*
+ * Serial Port
+ */
+#define CONFIG_SYS_NS16550_CLK          25000000
+#define CONFIG_BAUDRATE                 115200
+#define CONFIG_SYS_BAUDRATE_TABLE \
+	{9600, 19200, 38400, 57600, 115200}
+
+#define CONFIG_BOOTDELAY                3
+#define CONFIG_BOOTARGS                 "console=ttyS0,115200 " \
+					"root=/dev/mtdblock2 " \
+					"rootfstype=squashfs"
+#define CONFIG_BOOTCOMMAND              "sf probe;" \
+					"mtdparts default;" \
+					"bootm 0x9f300000"
+#define CONFIG_LZMA
+
+#define MTDIDS_DEFAULT                  "nor0=spi-flash.0"
+#define MTDPARTS_DEFAULT                "mtdparts=spi-flash.0:" \
+					"256k(u-boot),64k(u-boot-env)," \
+					"2752k(rootfs),896k(uImage)," \
+					"64k(NVRAM),64k(ART)"
+
+#define CONFIG_ENV_SPI_MAX_HZ           25000000
+#define CONFIG_ENV_IS_IN_SPI_FLASH
+#define CONFIG_ENV_OFFSET               0x40000
+#define CONFIG_ENV_SECT_SIZE            0x10000
+#define CONFIG_ENV_SIZE                 0x10000
+
+/*
+ * Command
+ */
+#define CONFIG_CMD_MTDPARTS
+
+/* Miscellaneous configurable options */
+#define CONFIG_SYS_CBSIZE               256
+#define CONFIG_SYS_MAXARGS              16
+#define CONFIG_SYS_PBSIZE               (CONFIG_SYS_CBSIZE + \
+					sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_AUTO_COMPLETE
+
+/*
+ * Diagnostics
+ */
+#define CONFIG_SYS_MEMTEST_START        0x80100000
+#define CONFIG_SYS_MEMTEST_END          0x83f00000
+#define CONFIG_CMD_MEMTEST
+
+#endif  /* __CONFIG_H */
diff --git a/include/configs/axs101.h b/include/configs/axs101.h
index 1bd4729..05d2d45 100644
--- a/include/configs/axs101.h
+++ b/include/configs/axs101.h
@@ -59,7 +59,6 @@
  * I2C configuration
  */
 #define CONFIG_SYS_I2C
-#define CONFIG_SYS_I2C_DW
 #define CONFIG_I2C_ENV_EEPROM_BUS	2
 #define CONFIG_SYS_I2C_SPEED		100000
 #define CONFIG_SYS_I2C_SPEED1		100000
diff --git a/include/configs/cm_fx6.h b/include/configs/cm_fx6.h
index 9a12552..1f20ec3 100644
--- a/include/configs/cm_fx6.h
+++ b/include/configs/cm_fx6.h
@@ -255,4 +255,15 @@
 #define CONFIG_VIDEO_LOGO
 #define CONFIG_VIDEO_BMP_LOGO
 
+/* EEPROM */
+#define CONFIG_CMD_EEPROM
+#define CONFIG_ENV_EEPROM_IS_ON_I2C
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN		1
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS	4
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS	5
+#define CONFIG_SYS_EEPROM_SIZE			256
+
+#define CONFIG_CMD_EEPROM_LAYOUT
+#define CONFIG_EEPROM_LAYOUT_HELP_STRING "v2, v3"
+
 #endif	/* __CONFIG_CM_FX6_H */
diff --git a/include/configs/cm_t335.h b/include/configs/cm_t335.h
index c4f1d4f..6dbc9e9 100644
--- a/include/configs/cm_t335.h
+++ b/include/configs/cm_t335.h
@@ -165,6 +165,17 @@
 #define STATUS_LED_PERIOD		(CONFIG_SYS_HZ / 2)
 #define STATUS_LED_BOOT			0
 
+/* EEPROM */
+#define CONFIG_CMD_EEPROM
+#define CONFIG_ENV_EEPROM_IS_ON_I2C
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN		1
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS	4
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS	5
+#define CONFIG_SYS_EEPROM_SIZE			256
+
+#define CONFIG_CMD_EEPROM_LAYOUT
+#define CONFIG_EEPROM_LAYOUT_HELP_STRING "v2, v3"
+
 #ifndef CONFIG_SPL_BUILD
 /*
  * Enable PCA9555 at I2C0-0x26.
diff --git a/include/configs/cm_t35.h b/include/configs/cm_t35.h
index 5d58116..0fb8530 100644
--- a/include/configs/cm_t35.h
+++ b/include/configs/cm_t35.h
@@ -361,4 +361,15 @@
 #define CONFIG_SYS_SPL_MALLOC_START	0x80208000
 #define CONFIG_SYS_SPL_MALLOC_SIZE	0x100000
 
+/* EEPROM */
+#define CONFIG_CMD_EEPROM
+#define CONFIG_ENV_EEPROM_IS_ON_I2C
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN		1
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS	4
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS	5
+#define CONFIG_SYS_EEPROM_SIZE			256
+
+#define CONFIG_CMD_EEPROM_LAYOUT
+#define CONFIG_EEPROM_LAYOUT_HELP_STRING "legacy, v1, v2, v3"
+
 #endif /* __CONFIG_H */
diff --git a/include/configs/cm_t3517.h b/include/configs/cm_t3517.h
index 7cedb67..7c087c6 100644
--- a/include/configs/cm_t3517.h
+++ b/include/configs/cm_t3517.h
@@ -305,4 +305,15 @@
 
 #define CONFIG_OMAP3_SPI
 
+/* EEPROM */
+#define CONFIG_CMD_EEPROM
+#define CONFIG_ENV_EEPROM_IS_ON_I2C
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN		1
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS	4
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS	5
+#define CONFIG_SYS_EEPROM_SIZE			256
+
+#define CONFIG_CMD_EEPROM_LAYOUT
+#define CONFIG_EEPROM_LAYOUT_HELP_STRING "v1, v2, v3"
+
 #endif /* __CONFIG_H */
diff --git a/include/configs/cm_t43.h b/include/configs/cm_t43.h
index ee818ed..c2dbd31 100644
--- a/include/configs/cm_t43.h
+++ b/include/configs/cm_t43.h
@@ -170,4 +170,15 @@
 #define CONFIG_SPL_I2C_SUPPORT
 #define CONFIG_SPL_POWER_SUPPORT
 
+/* EEPROM */
+#define CONFIG_CMD_EEPROM
+#define CONFIG_ENV_EEPROM_IS_ON_I2C
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN		1
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS	4
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS	5
+#define CONFIG_SYS_EEPROM_SIZE			256
+
+#define CONFIG_CMD_EEPROM_LAYOUT
+#define CONFIG_EEPROM_LAYOUT_HELP_STRING "v2, v3"
+
 #endif	/* __CONFIG_CM_T43_H */
diff --git a/include/configs/cm_t54.h b/include/configs/cm_t54.h
index 9b13aa6..ff63d7a 100644
--- a/include/configs/cm_t54.h
+++ b/include/configs/cm_t54.h
@@ -60,7 +60,7 @@
 #define CONFIG_SPL_SATA_BOOT_DEVICE		0
 #define CONFIG_SYS_SATA_FAT_BOOT_PARTITION	1
 
-#define CONFIG_CMD_SCSI
+#define CONFIG_SCSI
 #define CONFIG_LIBATA
 #define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
@@ -81,6 +81,17 @@
 
 /* Enabled commands */
 
+/* EEPROM */
+#define CONFIG_CMD_EEPROM
+#define CONFIG_ENV_EEPROM_IS_ON_I2C
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN		1
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS	4
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS	5
+#define CONFIG_SYS_EEPROM_SIZE			256
+
+#define CONFIG_CMD_EEPROM_LAYOUT
+#define CONFIG_EEPROM_LAYOUT_HELP_STRING "v2, v3"
+
 /* USB Networking options */
 #define CONFIG_USB_HOST_ETHER
 #define CONFIG_USB_ETHER_SMSC95XX
diff --git a/include/configs/db-88f6820-gp.h b/include/configs/db-88f6820-gp.h
index d84dde3..3539a62 100644
--- a/include/configs/db-88f6820-gp.h
+++ b/include/configs/db-88f6820-gp.h
@@ -27,7 +27,7 @@
 #define CONFIG_SYS_NO_FLASH		/* Declare no flash (NOR/SPI) */
 #define CONFIG_CMD_ENV
 #define CONFIG_CMD_PCI
-#define CONFIG_CMD_SCSI
+#define CONFIG_SCSI
 
 /* I2C */
 #define CONFIG_SYS_I2C
diff --git a/include/configs/dra7xx_evm.h b/include/configs/dra7xx_evm.h
index 79b6c09..8a0cd66 100644
--- a/include/configs/dra7xx_evm.h
+++ b/include/configs/dra7xx_evm.h
@@ -230,7 +230,7 @@
 
 /* SATA */
 #define CONFIG_BOARD_LATE_INIT
-#define CONFIG_CMD_SCSI
+#define CONFIG_SCSI
 #define CONFIG_LIBATA
 #define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
diff --git a/include/configs/efi-x86.h b/include/configs/efi-x86.h
index 6dd0b32..95e46c5 100644
--- a/include/configs/efi-x86.h
+++ b/include/configs/efi-x86.h
@@ -18,7 +18,7 @@
 #undef CONFIG_VIDEO
 #undef CONFIG_CFB_CONSOLE
 #undef CONFIG_SCSI_AHCI
-#undef CONFIG_CMD_SCSI
+#undef CONFIG_SCSI
 #undef CONFIG_INTEL_ICH6_GPIO
 #undef CONFIG_USB_EHCI_PCI
 
diff --git a/include/configs/galileo.h b/include/configs/galileo.h
index 2f1f6d4..40f7fba 100644
--- a/include/configs/galileo.h
+++ b/include/configs/galileo.h
@@ -29,7 +29,7 @@
 
 /* SATA is not supported in Quark SoC */
 #undef CONFIG_SCSI_AHCI
-#undef CONFIG_CMD_SCSI
+#undef CONFIG_SCSI
 
 /* Video is not supported in Quark SoC */
 #undef CONFIG_VIDEO
diff --git a/include/configs/highbank.h b/include/configs/highbank.h
index 3bce12b..5cefddc 100644
--- a/include/configs/highbank.h
+++ b/include/configs/highbank.h
@@ -51,7 +51,7 @@
 /*
  * Command line configuration.
  */
-#define CONFIG_CMD_SCSI
+#define CONFIG_SCSI
 
 #define CONFIG_BOOT_RETRY_TIME		-1
 #define CONFIG_RESET_TO_RETRY
diff --git a/include/configs/imx6_spl.h b/include/configs/imx6_spl.h
index 68d3fd7..9bd9f6e 100644
--- a/include/configs/imx6_spl.h
+++ b/include/configs/imx6_spl.h
@@ -48,12 +48,16 @@
 #define CONFIG_SYS_U_BOOT_MAX_SIZE_SECTORS	800 /* 400 KB */
 #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION	1
 #define CONFIG_SYS_MONITOR_LEN  (CONFIG_SYS_U_BOOT_MAX_SIZE_SECTORS/2*1024)
+#define CONFIG_SPL_ABORT_ON_RAW_IMAGE
+#define CONFIG_SPL_EXT_SUPPORT
 #endif
 
 /* SATA support */
 #if defined(CONFIG_SPL_SATA_SUPPORT)
 #define CONFIG_SPL_SATA_BOOT_DEVICE		0
 #define CONFIG_SYS_SATA_FAT_BOOT_PARTITION	1
+#define CONFIG_SPL_ABORT_ON_RAW_IMAGE
+#define CONFIG_SPL_EXT_SUPPORT
 #endif
 
 /* Define the payload for FAT/EXT support */
diff --git a/include/configs/ls1043aqds.h b/include/configs/ls1043aqds.h
index d71a229..af1f73d 100644
--- a/include/configs/ls1043aqds.h
+++ b/include/configs/ls1043aqds.h
@@ -108,7 +108,7 @@
 #define CONFIG_LIBATA
 #define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
-#define CONFIG_CMD_SCSI
+#define CONFIG_SCSI
 #define CONFIG_DOS_PARTITION
 #define CONFIG_BOARD_LATE_INIT
 
diff --git a/include/configs/ls2080aqds.h b/include/configs/ls2080aqds.h
index 16a536a..4b27114 100644
--- a/include/configs/ls2080aqds.h
+++ b/include/configs/ls2080aqds.h
@@ -44,7 +44,7 @@
 #define CONFIG_LIBATA
 #define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
-#define CONFIG_CMD_SCSI
+#define CONFIG_SCSI
 #define CONFIG_DOS_PARTITION
 #define CONFIG_BOARD_LATE_INIT
 
diff --git a/include/configs/ls2080ardb.h b/include/configs/ls2080ardb.h
index 45827f6..3baca64 100644
--- a/include/configs/ls2080ardb.h
+++ b/include/configs/ls2080ardb.h
@@ -62,7 +62,7 @@
 #define CONFIG_LIBATA
 #define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
-#define CONFIG_CMD_SCSI
+#define CONFIG_SCSI
 #define CONFIG_DOS_PARTITION
 #define CONFIG_BOARD_LATE_INIT
 
diff --git a/include/configs/minnowmax.h b/include/configs/minnowmax.h
index 674d1f6..95ad128 100644
--- a/include/configs/minnowmax.h
+++ b/include/configs/minnowmax.h
@@ -40,6 +40,6 @@
 #define CONFIG_X86EMU_RAW_IO
 
 #define CONFIG_ENV_SECT_SIZE		0x1000
-#define CONFIG_ENV_OFFSET		0x007fe000
+#define CONFIG_ENV_OFFSET		0x006ef000
 
 #endif	/* __CONFIG_H */
diff --git a/include/configs/novena.h b/include/configs/novena.h
index cfb92d6..2382951 100644
--- a/include/configs/novena.h
+++ b/include/configs/novena.h
@@ -75,7 +75,6 @@
 
 /* SPL */
 #define CONFIG_SPL_FAT_SUPPORT
-#define CONFIG_SPL_EXT_SUPPORT
 #define CONFIG_SPL_MMC_SUPPORT
 #include "imx6_spl.h"			/* common IMX6 SPL configuration */
 
@@ -150,6 +149,7 @@
 #define CONFIG_USB_EHCI_MX6
 #define CONFIG_USB_STORAGE
 #define CONFIG_USB_KEYBOARD
+#define CONFIG_SYS_STDIO_DEREGISTER
 #define CONFIG_SYS_USB_EVENT_POLL_VIA_CONTROL_EP
 #define CONFIG_USB_HOST_ETHER
 #define CONFIG_USB_ETHER_ASIX
diff --git a/include/configs/omap5_uevm.h b/include/configs/omap5_uevm.h
index 86cefa3..4ddc492 100644
--- a/include/configs/omap5_uevm.h
+++ b/include/configs/omap5_uevm.h
@@ -115,7 +115,7 @@
 /* Max time to hold reset on this board, see doc/README.omap-reset-time */
 #define CONFIG_OMAP_PLATFORM_RESET_TIME_MAX_USEC	16296
 
-#define CONFIG_CMD_SCSI
+#define CONFIG_SCSI
 #define CONFIG_LIBATA
 #define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
diff --git a/include/configs/qemu-mips.h b/include/configs/qemu-mips.h
index a7cd003..702967c 100644
--- a/include/configs/qemu-mips.h
+++ b/include/configs/qemu-mips.h
@@ -58,6 +58,10 @@
 #define CONFIG_CMD_IDE
 #define CONFIG_DOS_PARTITION
 
+#ifdef CONFIG_SYS_BIG_ENDIAN
+#define CONFIG_IDE_SWAP_IO
+#endif
+
 #define CONFIG_SYS_IDE_MAXBUS		2
 #define CONFIG_SYS_ATA_IDE0_OFFSET	0x1f0
 #define CONFIG_SYS_ATA_IDE1_OFFSET	0x170
diff --git a/include/configs/qemu-mips64.h b/include/configs/qemu-mips64.h
index 394382c..2394549 100644
--- a/include/configs/qemu-mips64.h
+++ b/include/configs/qemu-mips64.h
@@ -58,6 +58,10 @@
 #define CONFIG_CMD_IDE
 #define CONFIG_DOS_PARTITION
 
+#ifdef CONFIG_SYS_BIG_ENDIAN
+#define CONFIG_IDE_SWAP_IO
+#endif
+
 #define CONFIG_SYS_IDE_MAXBUS		2
 #define CONFIG_SYS_ATA_IDE0_OFFSET	0x1f0
 #define CONFIG_SYS_ATA_IDE1_OFFSET	0x170
diff --git a/include/configs/qemu-x86.h b/include/configs/qemu-x86.h
index b0d2ffe..476d37d 100644
--- a/include/configs/qemu-x86.h
+++ b/include/configs/qemu-x86.h
@@ -43,7 +43,7 @@
 #define CONFIG_ATAPI
 
 #undef CONFIG_SCSI_AHCI
-#undef CONFIG_CMD_SCSI
+#undef CONFIG_SCSI
 #else
 #define CONFIG_SCSI_DEV_LIST		\
 	{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_AHCI}
diff --git a/include/configs/sama5d2_ptc.h b/include/configs/sama5d2_ptc.h
new file mode 100644
index 0000000..d91d75e
--- /dev/null
+++ b/include/configs/sama5d2_ptc.h
@@ -0,0 +1,155 @@
+/*
+ * Configuration settings for the SAMA5D2 PTC Engineering board.
+ *
+ * Copyright (C) 2016 Atmel
+ *		      Wenyou Yang <wenyou.yang@atmel.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/* No NOR flash, this definition should put before common header */
+#define CONFIG_SYS_NO_FLASH
+
+#include "at91-sama5_common.h"
+
+/* serial console */
+#define CONFIG_ATMEL_USART
+#define CONFIG_USART_BASE		ATMEL_BASE_UART0
+#define CONFIG_USART_ID			ATMEL_ID_UART0
+
+#define CONFIG_SYS_SDRAM_BASE           ATMEL_BASE_DDRCS
+#define CONFIG_SYS_SDRAM_SIZE		0x20000000
+
+#ifdef CONFIG_SPL_BUILD
+#define CONFIG_SYS_INIT_SP_ADDR		0x210000
+#else
+#define CONFIG_SYS_INIT_SP_ADDR \
+	(CONFIG_SYS_SDRAM_BASE + 4 * 1024 - GENERATED_GBL_DATA_SIZE)
+#endif
+
+#define CONFIG_SYS_LOAD_ADDR		0x22000000 /* load address */
+
+#undef CONFIG_AT91_GPIO
+#define CONFIG_ATMEL_PIO4
+
+/* SDRAM */
+#define CONFIG_NR_DRAM_BANKS		1
+
+/* SerialFlash */
+#ifdef CONFIG_CMD_SF
+#define CONFIG_ATMEL_SPI
+#define CONFIG_SPI_FLASH_ATMEL
+#define CONFIG_SF_DEFAULT_BUS		0
+#define CONFIG_SF_DEFAULT_CS		0
+#define CONFIG_SF_DEFAULT_SPEED		30000000
+#endif
+
+/* NAND flash */
+#define CONFIG_CMD_NAND
+
+#ifdef CONFIG_CMD_NAND
+#define CONFIG_NAND_ATMEL
+#define CONFIG_SYS_MAX_NAND_DEVICE	1
+#define CONFIG_SYS_NAND_BASE		ATMEL_BASE_CS3
+/* our ALE is AD21 */
+#define CONFIG_SYS_NAND_MASK_ALE	(1 << 21)
+/* our CLE is AD22 */
+#define CONFIG_SYS_NAND_MASK_CLE	(1 << 22)
+#define CONFIG_SYS_NAND_ONFI_DETECTION
+/* PMECC & PMERRLOC */
+#define CONFIG_ATMEL_NAND_HWECC
+#define CONFIG_ATMEL_NAND_HW_PMECC
+#define CONFIG_CMD_NAND_TRIMFFS
+#endif
+
+/* USB */
+#define CONFIG_CMD_USB
+
+#ifdef CONFIG_CMD_USB
+#define CONFIG_USB_EHCI
+#define CONFIG_USB_EHCI_ATMEL
+#define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS	3
+#define CONFIG_USB_STORAGE
+#endif
+
+/* USB device */
+#define CONFIG_USB_GADGET
+#define CONFIG_USB_GADGET_DUALSPEED
+#define CONFIG_USB_GADGET_ATMEL_USBA
+#define CONFIG_USB_ETHER
+#define CONFIG_USB_ETH_RNDIS
+#define CONFIG_USBNET_MANUFACTURER      "Atmel SAMA5D2_PTC"
+
+#if defined(CONFIG_CMD_USB)
+#define CONFIG_CMD_FAT
+#define CONFIG_DOS_PARTITION
+#endif
+
+/* Ethernet Hardware */
+#define CONFIG_MACB
+#define CONFIG_RMII
+#define CONFIG_NET_RETRY_COUNT		20
+#define CONFIG_MACB_SEARCH_PHY
+
+#ifdef CONFIG_SYS_USE_NANDFLASH
+#undef CONFIG_ENV_OFFSET
+#undef CONFIG_ENV_OFFSET_REDUND
+#undef CONFIG_BOOTCOMMAND
+/* u-boot env in nand flash */
+#define CONFIG_ENV_IS_IN_NAND
+#define CONFIG_ENV_OFFSET		0x200000
+#define CONFIG_ENV_OFFSET_REDUND	0x400000
+#define CONFIG_BOOTCOMMAND		"nand read 0x21000000 0xb80000 0x80000;"	\
+					"nand read 0x22000000 0x600000 0x600000;"	\
+					"bootz 0x22000000 - 0x21000000"
+#endif
+
+#undef CONFIG_BOOTARGS
+#define CONFIG_BOOTARGS							\
+	"console=ttyS0,57600 earlyprintk "				\
+	"mtdparts=atmel_nand:6M(bootstrap)ro, 6M(kernel)ro,-(rootfs) "	\
+	"rootfstype=ubifs ubi.mtd=2 root=ubi0:rootfs"
+
+/* SPL */
+#define CONFIG_SPL_FRAMEWORK
+#define CONFIG_SPL_TEXT_BASE		0x200000
+#define CONFIG_SPL_MAX_SIZE		0x10000
+#define CONFIG_SPL_BSS_START_ADDR	0x20000000
+#define CONFIG_SPL_BSS_MAX_SIZE		0x80000
+#define CONFIG_SYS_SPL_MALLOC_START	0x20080000
+#define CONFIG_SYS_SPL_MALLOC_SIZE	0x80000
+
+#define CONFIG_SPL_LIBCOMMON_SUPPORT
+#define CONFIG_SPL_LIBGENERIC_SUPPORT
+#define CONFIG_SPL_GPIO_SUPPORT
+#define CONFIG_SPL_SERIAL_SUPPORT
+
+#define CONFIG_SPL_BOARD_INIT
+#define CONFIG_SYS_MONITOR_LEN		(512 << 10)
+
+#ifdef CONFIG_SYS_USE_SERIALFLASH
+#define CONFIG_SPL_SPI_SUPPORT
+#define CONFIG_SPL_SPI_FLASH_SUPPORT
+#define CONFIG_SPL_SPI_LOAD
+#define CONFIG_SYS_SPI_U_BOOT_OFFS	0x8000
+
+#elif CONFIG_SYS_USE_NANDFLASH
+#define CONFIG_SPL_NAND_SUPPORT
+#define CONFIG_SPL_NAND_DRIVERS
+#define CONFIG_SPL_NAND_BASE
+#define CONFIG_PMECC_CAP		8
+#define CONFIG_PMECC_SECTOR_SIZE	512
+#define CONFIG_SYS_NAND_U_BOOT_OFFS	0x40000
+#define CONFIG_SYS_NAND_5_ADDR_CYCLE
+#define CONFIG_SYS_NAND_PAGE_SIZE	0x1000
+#define CONFIG_SYS_NAND_PAGE_COUNT	64
+#define CONFIG_SYS_NAND_OOBSIZE		224
+#define CONFIG_SYS_NAND_BLOCK_SIZE	0x40000
+#define CONFIG_SYS_NAND_BAD_BLOCK_POS	0x0
+#define CONFIG_SPL_GENERATE_ATMEL_PMECC_HEADER
+#endif
+
+#endif
diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h
index 9790a14..23a0c40 100644
--- a/include/configs/sandbox.h
+++ b/include/configs/sandbox.h
@@ -192,4 +192,29 @@
 #define CONFIG_CMD_LZMADEC
 #define CONFIG_CMD_DATE
 
+#define CONFIG_CMD_IDE
+#define CONFIG_SYS_IDE_MAXBUS		1
+#define CONFIG_SYS_ATA_IDE0_OFFSET	0
+#define CONFIG_SYS_IDE_MAXDEVICE	2
+#define CONFIG_SYS_ATA_BASE_ADDR	0x100
+#define CONFIG_SYS_ATA_DATA_OFFSET	0
+#define CONFIG_SYS_ATA_REG_OFFSET	1
+#define CONFIG_SYS_ATA_ALT_OFFSET	2
+#define CONFIG_SYS_ATA_STRIDE		4
+
+#define CONFIG_SCSI
+#define CONFIG_SCSI_AHCI_PLAT
+#define CONFIG_SYS_SCSI_MAX_DEVICE	2
+#define CONFIG_SYS_SCSI_MAX_SCSI_ID	8
+#define CONFIG_SYS_SCSI_MAX_LUN		4
+
+#define CONFIG_CMD_SATA
+#define CONFIG_SYS_SATA_MAX_DEVICE	2
+
+#define CONFIG_SYSTEMACE
+#define CONFIG_SYS_SYSTEMACE_WIDTH	16
+#define CONFIG_SYS_SYSTEMACE_BASE	0
+
+#define CONFIG_GENERIC_MMC
+
 #endif
diff --git a/include/configs/sbc8641d.h b/include/configs/sbc8641d.h
index a7c7aef..c9970f1 100644
--- a/include/configs/sbc8641d.h
+++ b/include/configs/sbc8641d.h
@@ -297,8 +297,6 @@
 
 #define CONFIG_PCI_SCAN_SHOW            /* show pci devices on startup */
 
-#undef CONFIG_SYS_SCSI_SCAN_BUS_REVERSE
-
 #define CONFIG_PCI_PNP			/* do pci plug-and-play */
 
 #undef CONFIG_EEPRO100
diff --git a/include/configs/socfpga_common.h b/include/configs/socfpga_common.h
index 4fdc09a..f657766 100644
--- a/include/configs/socfpga_common.h
+++ b/include/configs/socfpga_common.h
@@ -173,7 +173,6 @@
  * I2C support
  */
 #define CONFIG_SYS_I2C
-#define CONFIG_SYS_I2C_DW
 #define CONFIG_SYS_I2C_BUS_MAX		4
 #define CONFIG_SYS_I2C_BASE		SOCFPGA_I2C0_ADDRESS
 #define CONFIG_SYS_I2C_BASE1		SOCFPGA_I2C1_ADDRESS
diff --git a/include/configs/spear-common.h b/include/configs/spear-common.h
index c4b6234..7b2d262 100644
--- a/include/configs/spear-common.h
+++ b/include/configs/spear-common.h
@@ -35,7 +35,6 @@
 
 /* I2C driver configuration */
 #define CONFIG_SYS_I2C
-#define CONFIG_SYS_I2C_DW
 #if defined(CONFIG_SPEAR600)
 #define CONFIG_SYS_I2C_BASE			0xD0200000
 #elif defined(CONFIG_SPEAR300)
diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h
index 2406115..ac2d931 100644
--- a/include/configs/sunxi-common.h
+++ b/include/configs/sunxi-common.h
@@ -125,7 +125,7 @@
 #define CONFIG_SYS_SCSI_MAX_LUN		1
 #define CONFIG_SYS_SCSI_MAX_DEVICE	(CONFIG_SYS_SCSI_MAX_SCSI_ID * \
 					 CONFIG_SYS_SCSI_MAX_LUN)
-#define CONFIG_CMD_SCSI
+#define CONFIG_SCSI
 #endif
 
 #define CONFIG_SETUP_MEMORY_TAGS
diff --git a/include/configs/theadorable.h b/include/configs/theadorable.h
index 1caa858..dda70c5 100644
--- a/include/configs/theadorable.h
+++ b/include/configs/theadorable.h
@@ -64,6 +64,7 @@
 #define PHY_ANEG_TIMEOUT	8000	/* PHY needs a longer aneg time */
 
 #define CONFIG_SYS_CONSOLE_INFO_QUIET	/* don't print console @ startup */
+#define CONFIG_ZERO_BOOTDELAY_CHECK	/* check for keypress on bootdelay==0 */
 #define CONFIG_SYS_ALT_MEMTEST
 #define CONFIG_PREBOOT
 
diff --git a/include/configs/ti_omap5_common.h b/include/configs/ti_omap5_common.h
index b049be4..2135af0 100644
--- a/include/configs/ti_omap5_common.h
+++ b/include/configs/ti_omap5_common.h
@@ -153,6 +153,7 @@
 #ifdef CONFIG_SPL_BUILD
 #undef CONFIG_DM_MMC
 #undef CONFIG_TIMER
+#undef CONFIG_DM_ETH
 #endif
 
 #endif /* __CONFIG_TI_OMAP5_COMMON_H */
diff --git a/include/configs/tplink_wdr4300.h b/include/configs/tplink_wdr4300.h
new file mode 100644
index 0000000..2b9e92e
--- /dev/null
+++ b/include/configs/tplink_wdr4300.h
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2016 Marek Vasut <marex@denx.de>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define CONFIG_SYS_TEXT_BASE		0xa1000000
+
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_DISPLAY_BOARDINFO
+#define CONFIG_BOARD_EARLY_INIT_F
+
+#define CONFIG_SYS_HZ			1000
+#define CONFIG_SYS_MHZ			280
+#define CONFIG_SYS_MIPS_TIMER_FREQ	(CONFIG_SYS_MHZ * 1000000)
+
+/* Cache Configuration */
+#define CONFIG_SYS_DCACHE_SIZE		0x8000
+#define CONFIG_SYS_ICACHE_SIZE		0x10000
+#define CONFIG_SYS_CACHELINE_SIZE	32
+
+#define CONFIG_SYS_MONITOR_BASE		CONFIG_SYS_TEXT_BASE
+
+#define CONFIG_SYS_MALLOC_LEN		0x40000
+#define CONFIG_SYS_BOOTPARAMS_LEN	0x20000
+
+#define CONFIG_SYS_SDRAM_BASE		0xa0000000
+#define CONFIG_SYS_LOAD_ADDR		0xa1000000
+#define CONFIG_LOADADDR			CONFIG_SYS_LOAD_ADDR
+
+#define CONFIG_SYS_NO_FLASH
+
+#define CONFIG_SYS_INIT_RAM_ADDR	0xbd000000
+#define CONFIG_SYS_INIT_RAM_SIZE	0x8000
+#define CONFIG_SYS_INIT_SP_ADDR		\
+	(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE)
+
+/*
+ * Serial Port
+ */
+#define CONFIG_SYS_NS16550_CLK		40000000
+#define CONFIG_BAUDRATE			115200
+#define CONFIG_SYS_BAUDRATE_TABLE \
+	{9600, 19200, 38400, 57600, 115200}
+
+#define CONFIG_BOOTDELAY		3
+#define CONFIG_BOOTARGS			\
+	"console=ttyS0,115200 root=/dev/mtdblock2 rootfstype=squashfs"
+#define CONFIG_BOOTCOMMAND		\
+	"dhcp 192.168.1.1:wdr4300.fit && bootm $loadaddr"
+#define CONFIG_LZMA
+
+#define CONFIG_ENV_IS_NOWHERE
+#define CONFIG_ENV_SIZE			0x10000
+
+/*
+ * Command
+ */
+/* Miscellaneous configurable options */
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_SYS_CBSIZE	1024		/* Console I/O buffer size */
+#define CONFIG_SYS_MAXARGS	32		/* Max number of command args */
+#define CONFIG_SYS_BARGSIZE	CONFIG_SYS_CBSIZE
+						/* Boot argument buffer size */
+#define CONFIG_VERSION_VARIABLE			/* U-BOOT version */
+#define CONFIG_AUTO_COMPLETE			/* Command auto complete */
+#define CONFIG_CMDLINE_EDITING			/* Command history etc */
+#define CONFIG_SYS_HUSH_PARSER
+#define CONFIG_SYS_PROMPT_HUSH_PS2	"> "
+
+/* USB, USB storage, USB ethernet */
+#define CONFIG_EHCI_MMIO_BIG_ENDIAN
+#define CONFIG_EHCI_DESC_BIG_ENDIAN
+#define CONFIG_EHCI_IS_TDI
+
+#define CONFIG_DOS_PARTITION
+
+/*
+ * Diagnostics
+ */
+#define CONFIG_SYS_MEMTEST_START	0x80100000
+#define CONFIG_SYS_MEMTEST_END		0x83f00000
+#define CONFIG_CMD_MEMTEST
+
+#define CONFIG_USE_PRIVATE_LIBGCC
+
+#define CONFIG_CMD_MII
+#define CONFIG_PHY_GIGE
+
+#endif  /* __CONFIG_H */
diff --git a/include/configs/tqma6.h b/include/configs/tqma6.h
index badb955..77ced71 100644
--- a/include/configs/tqma6.h
+++ b/include/configs/tqma6.h
@@ -16,7 +16,6 @@
 #define CONFIG_SPL_MMC_SUPPORT
 #define CONFIG_SPL_SPI_SUPPORT
 #define CONFIG_SPL_FAT_SUPPORT
-#define CONFIG_SPL_EXT_SUPPORT
 
 /* common IMX6 SPL configuration */
 #include "imx6_spl.h"
diff --git a/include/configs/x600.h b/include/configs/x600.h
index d7da0b2..5fdd2be 100644
--- a/include/configs/x600.h
+++ b/include/configs/x600.h
@@ -85,7 +85,6 @@
 
 /* I2C config options */
 #define CONFIG_SYS_I2C
-#define CONFIG_SYS_I2C_DW
 #define CONFIG_SYS_I2C_BASE			0xD0200000
 #define CONFIG_SYS_I2C_SPEED			400000
 #define CONFIG_SYS_I2C_SLAVE			0x02
diff --git a/include/configs/x86-common.h b/include/configs/x86-common.h
index a2822e0..b4aad6c 100644
--- a/include/configs/x86-common.h
+++ b/include/configs/x86-common.h
@@ -100,7 +100,7 @@
 #define CONFIG_CMD_IRQ
 #define CONFIG_CMD_PCI
 #define CONFIG_CMD_GETTIME
-#define CONFIG_CMD_SCSI
+#define CONFIG_SCSI
 
 #define CONFIG_CMD_ZBOOT
 
@@ -193,14 +193,19 @@
 #define CONFIG_HOSTNAME		x86
 #define CONFIG_BOOTFILE		"bzImage"
 #define CONFIG_LOADADDR		0x1000000
-#define CONFIG_RAMDISK_ADDR		0x4000000
+#define CONFIG_RAMDISK_ADDR	0x4000000
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+#define CONFIG_OTHBOOTARGS	"othbootargs=\0"
+#else
+#define CONFIG_OTHBOOTARGS	"othbootargs=acpi=off\0"
+#endif
 
 #define CONFIG_EXTRA_ENV_SETTINGS			\
 	CONFIG_STD_DEVICES_SETTINGS			\
 	"pciconfighost=1\0"				\
 	"netdev=eth0\0"					\
 	"consoledev=ttyS0\0"				\
-	"othbootargs=acpi=off\0"			\
+	CONFIG_OTHBOOTARGS				\
 	"ramdiskaddr=0x4000000\0"			\
 	"ramdiskfile=initramfs.gz\0"
 
diff --git a/include/configs/xilinx_zynqmp.h b/include/configs/xilinx_zynqmp.h
index 060bca9..b2fa164 100644
--- a/include/configs/xilinx_zynqmp.h
+++ b/include/configs/xilinx_zynqmp.h
@@ -41,7 +41,7 @@
 # define CONFIG_IDENT_STRING		" Xilinx ZynqMP"
 #endif
 
-#define CONFIG_SYS_INIT_SP_ADDR		CONFIG_SYS_TEXT_BASE
+#define CONFIG_SYS_INIT_SP_ADDR		0xfffffffc
 
 /* Generic Timer Definitions - setup in EL3. Setup by ATF for other cases */
 #if !defined(COUNTER_FREQUENCY)
@@ -65,6 +65,9 @@
 #define CONFIG_CMD_ENV
 #define CONFIG_DOS_PARTITION
 #define CONFIG_EFI_PARTITION
+#ifndef CONFIG_SPL_BUILD
+# define CONFIG_ISO_PARTITION
+#endif
 #define CONFIG_MP
 
 /* BOOTP options */
@@ -74,10 +77,24 @@
 #define CONFIG_BOOTP_HOSTNAME
 #define CONFIG_BOOTP_MAY_FAIL
 #define CONFIG_BOOTP_SERVERIP
+#define CONFIG_BOOTP_DNS
+#define CONFIG_BOOTP_PXE
+#define CONFIG_BOOTP_SUBNETMASK
+#define CONFIG_BOOTP_PXE_CLIENTARCH     0x100
+
+/* Diff from config_distro_defaults.h */
+#define CONFIG_SUPPORT_RAW_INITRD
+#define CONFIG_ENV_VARS_UBOOT_CONFIG
+#define CONFIG_AUTO_COMPLETE
+
+/* PXE */
+#define CONFIG_CMD_PXE
+#define CONFIG_MENU
 
 #if defined(CONFIG_ZYNQ_SDHCI)
 # define CONFIG_MMC
 # define CONFIG_GENERIC_MMC
+# define CONFIG_SUPPORT_EMMC_BOOT
 # define CONFIG_SDHCI
 # ifndef CONFIG_ZYNQ_SDHCI_MAX_FREQ
 #  define CONFIG_ZYNQ_SDHCI_MAX_FREQ	200000000
@@ -133,6 +150,7 @@
 #endif
 
 /* Initial environment variables */
+#ifndef CONFIG_EXTRA_ENV_SETTINGS
 #define CONFIG_EXTRA_ENV_SETTINGS \
 	"kernel_addr=0x80000\0" \
 	"fdt_addr=0x7000000\0" \
@@ -143,8 +161,8 @@
 		"load mmc $sdbootdev:$partid $kernel_addr Image && " \
 		"booti $kernel_addr - $fdt_addr\0" \
 	DFU_ALT_INFO
+#endif
 
-#define CONFIG_PREBOOT		"run bootargs"
 #define CONFIG_BOOTCOMMAND	"run $modeboot"
 #define CONFIG_BOOTDELAY	3
 
@@ -201,7 +219,7 @@
 #define CONFIG_SYS_SCSI_MAX_LUN		1
 #define CONFIG_SYS_SCSI_MAX_DEVICE	(CONFIG_SYS_SCSI_MAX_SCSI_ID * \
 					 CONFIG_SYS_SCSI_MAX_LUN)
-#define CONFIG_CMD_SCSI
+#define CONFIG_SCSI
 #endif
 
 #define CONFIG_SYS_BOOTM_LEN	(60 * 1024 * 1024)
@@ -212,4 +230,41 @@
 #define CONFIG_BOARD_EARLY_INIT_R
 #define CONFIG_CLOCKS
 
+#define CONFIG_SPL_TEXT_BASE		0xfffc0000
+#define CONFIG_SPL_MAX_SIZE		0x20000
+
+/* Just random location in OCM */
+#define CONFIG_SPL_BSS_START_ADDR	0x1000000
+#define CONFIG_SPL_BSS_MAX_SIZE		0x2000000
+
+#define CONFIG_SPL_FRAMEWORK
+#define CONFIG_SPL_LIBCOMMON_SUPPORT
+#define CONFIG_SPL_LIBGENERIC_SUPPORT
+#define CONFIG_SPL_SERIAL_SUPPORT
+#define CONFIG_SPL_BOARD_INIT
+#define CONFIG_SPL_RAM_DEVICE
+
+#define CONFIG_SPL_OS_BOOT
+/* u-boot is like dtb */
+#define CONFIG_SPL_FS_LOAD_ARGS_NAME	"u-boot.bin"
+#define CONFIG_SYS_SPL_ARGS_ADDR	0x8000000
+
+/* ATF is my kernel image */
+#define CONFIG_SPL_FS_LOAD_KERNEL_NAME	"atf.ub"
+
+/* FIT load address for RAM boot */
+#define CONFIG_SPL_LOAD_FIT_ADDRESS	0x10000000
+
+/* MMC support */
+#ifdef CONFIG_ZYNQ_SDHCI
+# define CONFIG_SPL_MMC_SUPPORT
+# define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION	1
+# define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR	0 /* unused */
+# define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS	0 /* unused */
+# define CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR	0 /* unused */
+# define CONFIG_SPL_LIBDISK_SUPPORT
+# define CONFIG_SPL_FAT_SUPPORT
+# define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME	"u-boot.img"
+#endif
+
 #endif /* __XILINX_ZYNQMP_H */
diff --git a/include/configs/xilinx_zynqmp_zcu102.h b/include/configs/xilinx_zynqmp_zcu102.h
index 30db2e4..81079fe 100644
--- a/include/configs/xilinx_zynqmp_zcu102.h
+++ b/include/configs/xilinx_zynqmp_zcu102.h
@@ -48,6 +48,12 @@
 
 #define CONFIG_IDENT_STRING	" Xilinx ZynqMP ZCU102"
 
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN	1
+#define CONFIG_CMD_EEPROM
+#define CONFIG_ZYNQ_EEPROM_BUS		5
+#define CONFIG_ZYNQ_GEM_EEPROM_ADDR	0x54
+#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET	0x20
+
 #define CONFIG_KERNEL_FDT_OFST_SIZE \
 	"kernel_offset=0x180000\0" \
 	"fdt_offset=0x100000\0" \
diff --git a/include/configs/zynq-common.h b/include/configs/zynq-common.h
index a3e4aec..82ece0d 100644
--- a/include/configs/zynq-common.h
+++ b/include/configs/zynq-common.h
@@ -315,11 +315,7 @@
 #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
 #define CONFIG_SPL_LIBDISK_SUPPORT
 #define CONFIG_SPL_FAT_SUPPORT
-#ifdef CONFIG_OF_SEPARATE
-# define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME     "u-boot-dtb.img"
-#else
-# define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME     "u-boot.img"
-#endif
+#define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME     "u-boot.img"
 #endif
 
 /* Disable dcache for SPL just for sure */
diff --git a/include/cpsw.h b/include/cpsw.h
index cf1d30b..257d12a 100644
--- a/include/cpsw.h
+++ b/include/cpsw.h
@@ -21,6 +21,7 @@
 	u32		sliver_reg_ofs;
 	int		phy_addr;
 	int		phy_if;
+	int		phy_of_handle;
 };
 
 enum {
@@ -51,5 +52,6 @@
 };
 
 int cpsw_register(struct cpsw_platform_data *data);
+int ti_cm_get_macid(struct udevice *dev, int slave, u8 *mac_addr);
 
 #endif /* _CPSW_H_  */
diff --git a/include/dm/device.h b/include/dm/device.h
index 8970fc0..f03bcd3 100644
--- a/include/dm/device.h
+++ b/include/dm/device.h
@@ -41,6 +41,9 @@
 /* Device is bound */
 #define DM_FLAG_BOUND			(1 << 6)
 
+/* Device name is allocated and should be freed on unbind() */
+#define DM_NAME_ALLOCED			(1 << 7)
+
 /**
  * struct udevice - An instance of a driver
  *
@@ -523,6 +526,9 @@
  * this is unnecessary but for probed devices which don't get a useful name
  * this function can be helpful.
  *
+ * The name is allocated and will be freed automatically when the device is
+ * unbound.
+ *
  * @dev:	Device to update
  * @name:	New name (this string is allocated new memory and attached to
  *		the device)
@@ -532,6 +538,39 @@
 int device_set_name(struct udevice *dev, const char *name);
 
 /**
+ * device_set_name_alloced() - note that a device name is allocated
+ *
+ * This sets the DM_NAME_ALLOCED flag for the device, so that when it is
+ * unbound the name will be freed. This avoids memory leaks.
+ *
+ * @dev:	Device to update
+ */
+void device_set_name_alloced(struct udevice *dev);
+
+/**
+ * of_device_is_compatible() - check if the device is compatible with the compat
+ *
+ * This allows to check whether the device is comaptible with the compat.
+ *
+ * @dev:	udevice pointer for which compatible needs to be verified.
+ * @compat:	Compatible string which needs to verified in the given
+ *		device
+ * @return true if OK, false if the compatible is not found
+ */
+bool of_device_is_compatible(struct udevice *dev, const char *compat);
+
+/**
+ * of_machine_is_compatible() - check if the machine is compatible with
+ *				the compat
+ *
+ * This allows to check whether the machine is comaptible with the compat.
+ *
+ * @compat:	Compatible string which needs to verified
+ * @return true if OK, false if the compatible is not found
+ */
+bool of_machine_is_compatible(const char *compat);
+
+/**
  * device_is_on_pci_bus - Test if a device is on a PCI bus
  *
  * @dev:	device to test
diff --git a/include/dm/platform_data/serial_coldfire.h b/include/dm/platform_data/serial_coldfire.h
new file mode 100644
index 0000000..5d86456
--- /dev/null
+++ b/include/dm/platform_data/serial_coldfire.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2015  Angelo Dureghello <angelo@sysam.it>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#ifndef __serial_coldfire_h
+#define __serial_coldfire_h
+
+/*
+ * struct coldfire_serial_platdata - information about a coldfire port
+ *
+ * @base:               Uart port base register address
+ * @port:               Uart port index, for cpu with pinmux for uart / gpio
+ * baudrtatre:          Uart port baudrate
+ */
+struct coldfire_serial_platdata {
+	unsigned long base;
+	int port;
+	int baudrate;
+};
+
+#endif /* __serial_coldfire_h */
diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
index cbf9b2c..a5cf6e2 100644
--- a/include/dm/uclass-id.h
+++ b/include/dm/uclass-id.h
@@ -26,11 +26,11 @@
 
 	/* U-Boot uclasses start here - in alphabetical order */
 	UCLASS_ADC,		/* Analog-to-digital converter */
+	UCLASS_AHCI,		/* SATA disk controller */
 	UCLASS_BLK,		/* Block device */
 	UCLASS_CLK,		/* Clock source, e.g. used by peripherals */
 	UCLASS_CPU,		/* CPU, typically part of an SoC */
 	UCLASS_CROS_EC,		/* Chrome OS EC */
-	UCLASS_DISK,		/* Disk controller, e.g. SATA */
 	UCLASS_DISPLAY,		/* Display (e.g. DisplayPort, HDMI) */
 	UCLASS_DMA,		/* Direct Memory Access */
 	UCLASS_RAM,		/* RAM controller */
diff --git a/include/dt-bindings/net/ti-dp83867.h b/include/dt-bindings/net/ti-dp83867.h
new file mode 100644
index 0000000..1843757
--- /dev/null
+++ b/include/dt-bindings/net/ti-dp83867.h
@@ -0,0 +1,35 @@
+/*
+ * TI DP83867 PHY drivers
+ *
+ * SPDX-License-Identifier:	GPL-2.0
+ *
+ */
+
+#ifndef _DT_BINDINGS_TI_DP83867_H
+#define _DT_BINDINGS_TI_DP83867_H
+
+/* PHY CTRL bits */
+#define DP83867_PHYCR_FIFO_DEPTH_3_B_NIB	0x00
+#define DP83867_PHYCR_FIFO_DEPTH_4_B_NIB	0x01
+#define DP83867_PHYCR_FIFO_DEPTH_6_B_NIB	0x02
+#define DP83867_PHYCR_FIFO_DEPTH_8_B_NIB	0x03
+
+/* RGMIIDCTL internal delay for rx and tx */
+#define DP83867_RGMIIDCTL_250_PS	0x0
+#define DP83867_RGMIIDCTL_500_PS	0x1
+#define DP83867_RGMIIDCTL_750_PS	0x2
+#define DP83867_RGMIIDCTL_1_NS		0x3
+#define DP83867_RGMIIDCTL_1_25_NS	0x4
+#define DP83867_RGMIIDCTL_1_50_NS	0x5
+#define DP83867_RGMIIDCTL_1_75_NS	0x6
+#define DP83867_RGMIIDCTL_2_00_NS	0x7
+#define DP83867_RGMIIDCTL_2_25_NS	0x8
+#define DP83867_RGMIIDCTL_2_50_NS	0x9
+#define DP83867_RGMIIDCTL_2_75_NS	0xa
+#define DP83867_RGMIIDCTL_3_00_NS	0xb
+#define DP83867_RGMIIDCTL_3_25_NS	0xc
+#define DP83867_RGMIIDCTL_3_50_NS	0xd
+#define DP83867_RGMIIDCTL_3_75_NS	0xe
+#define DP83867_RGMIIDCTL_4_00_NS	0xf
+
+#endif
diff --git a/include/eeprom_field.h b/include/eeprom_field.h
new file mode 100644
index 0000000..94e259f
--- /dev/null
+++ b/include/eeprom_field.h
@@ -0,0 +1,39 @@
+/*
+ * (C) Copyright 2009-2016 CompuLab, Ltd.
+ *
+ * Authors: Nikita Kiryanov <nikita@compulab.co.il>
+ *	    Igor Grinberg <grinberg@compulab.co.il>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef _FIELD_
+#define _FIELD_
+
+#define PRINT_FIELD_SEGMENT	"%-30s"
+
+struct eeprom_field {
+	char *name;
+	int size;
+	unsigned char *buf;
+
+	void (*print)(const struct eeprom_field *eeprom_field);
+	int (*update)(struct eeprom_field *eeprom_field, char *value);
+};
+
+void eeprom_field_print_bin(const struct eeprom_field *field);
+int eeprom_field_update_bin(struct eeprom_field *field, char *value);
+
+void eeprom_field_print_bin_rev(const struct eeprom_field *field);
+int eeprom_field_update_bin_rev(struct eeprom_field *field, char *value);
+
+void eeprom_field_print_mac(const struct eeprom_field *field);
+int eeprom_field_update_mac(struct eeprom_field *field, char *value);
+
+void eeprom_field_print_ascii(const struct eeprom_field *field);
+int eeprom_field_update_ascii(struct eeprom_field *field, char *value);
+
+void eeprom_field_print_reserved(const struct eeprom_field *field);
+int eeprom_field_update_reserved(struct eeprom_field *field, char *value);
+
+#endif
diff --git a/include/eeprom_layout.h b/include/eeprom_layout.h
new file mode 100644
index 0000000..459b99d
--- /dev/null
+++ b/include/eeprom_layout.h
@@ -0,0 +1,33 @@
+/*
+ * (C) Copyright 2009-2016 CompuLab, Ltd.
+ *
+ * Authors: Nikita Kiryanov <nikita@compulab.co.il>
+ *	    Igor Grinberg <grinberg@compulab.co.il>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef _LAYOUT_
+#define _LAYOUT_
+
+#define RESERVED_FIELDS			NULL
+#define LAYOUT_VERSION_UNRECOGNIZED	-1
+#define LAYOUT_VERSION_AUTODETECT	-2
+
+struct eeprom_layout {
+	struct eeprom_field *fields;
+	int num_of_fields;
+	int layout_version;
+	unsigned char *data;
+	int data_size;
+	void (*print)(const struct eeprom_layout *eeprom_layout);
+	int (*update)(struct eeprom_layout *eeprom_layout, char *field_name,
+		      char *new_data);
+};
+
+void eeprom_layout_setup(struct eeprom_layout *layout, unsigned char *buf,
+			 unsigned int buf_size, int layout_version);
+__weak void __eeprom_layout_assign(struct eeprom_layout *layout,
+				   int layout_version);
+
+#endif
diff --git a/include/flash.h b/include/flash.h
index c6321a0..2a5e13a 100644
--- a/include/flash.h
+++ b/include/flash.h
@@ -400,6 +400,9 @@
 #define FLASH_STM800DT	0x00D7		/* STM M29W800DT (1M = 64K x 16, top)	*/
 #define FLASH_STM800DB	0x005B		/* STM M29W800DB (1M = 64K x 16, bottom)*/
 
+#define FLASH_MCHP100T	0x0060		/* MCHP internal (1M = 64K x 16) */
+#define FLASH_MCHP100B	0x0061		/* MCHP internal (1M = 64K x 16) */
+
 #define FLASH_28F400_T	0x0062		/* MT  28F400B3 ID (  4M = 256K x 16 )	*/
 #define FLASH_28F400_B	0x0063		/* MT  28F400B3 ID (  4M = 256K x 16 )	*/
 
@@ -486,7 +489,7 @@
 #define FLASH_MAN_SHARP 0x00500000
 #define FLASH_MAN_ATM	0x00600000
 #define FLASH_MAN_CFI	0x01000000
-
+#define FLASH_MAN_MCHP	0x02000000	/* Microchip Technology		*/
 
 #define FLASH_TYPEMASK	0x0000FFFF	/* extract FLASH type	information	*/
 #define FLASH_VENDMASK	0xFFFF0000	/* extract FLASH vendor information	*/
diff --git a/include/ide.h b/include/ide.h
index a4e65cf..9b0a4a9 100644
--- a/include/ide.h
+++ b/include/ide.h
@@ -34,10 +34,18 @@
 
 void ide_init(void);
 struct blk_desc;
+struct udevice;
+#ifdef CONFIG_BLK
+ulong ide_read(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
+	       void *buffer);
+ulong ide_write(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
+		const void *buffer);
+#else
 ulong ide_read(struct blk_desc *block_dev, lbaint_t blknr, lbaint_t blkcnt,
 	       void *buffer);
 ulong ide_write(struct blk_desc *block_dev, lbaint_t blknr, lbaint_t blkcnt,
 		const void *buffer);
+#endif
 
 #ifdef CONFIG_IDE_PREINIT
 int ide_preinit(void);
diff --git a/include/image.h b/include/image.h
index f9ee564..a8f6bd1 100644
--- a/include/image.h
+++ b/include/image.h
@@ -246,8 +246,10 @@
 #define IH_TYPE_RKSD		24	/* Rockchip SD card		*/
 #define IH_TYPE_RKSPI		25	/* Rockchip SPI image		*/
 #define IH_TYPE_ZYNQIMAGE	26	/* Xilinx Zynq Boot Image */
+#define IH_TYPE_ZYNQMPIMAGE	27	/* Xilinx ZynqMP Boot Image */
+#define IH_TYPE_FPGA		28	/* FPGA Image */
 
-#define IH_TYPE_COUNT		27	/* Number of image types */
+#define IH_TYPE_COUNT		29	/* Number of image types */
 
 /*
  * Compression Types
@@ -494,6 +496,8 @@
 int genimg_has_config(bootm_headers_t *images);
 ulong genimg_get_image(ulong img_addr);
 
+int boot_get_fpga(int argc, char * const argv[], bootm_headers_t *images,
+		uint8_t arch, const ulong *ld_start, ulong * const ld_len);
 int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
 		uint8_t arch, ulong *rd_start, ulong *rd_end);
 
@@ -809,6 +813,7 @@
 #define FIT_LOADABLE_PROP	"loadables"
 #define FIT_DEFAULT_PROP	"default"
 #define FIT_SETUP_PROP		"setup"
+#define FIT_FPGA_PROP		"fpga"
 
 #define FIT_MAX_HASH_LEN	HASH_MAX_DIGEST_SIZE
 
diff --git a/include/iotrace.h b/include/iotrace.h
index 9bd1f16..e4ceb61 100644
--- a/include/iotrace.h
+++ b/include/iotrace.h
@@ -31,10 +31,11 @@
 #define writew(val, addr)	iotrace_writew(val, (const void *)(addr))
 
 #undef readb
-#define readb(addr)	iotrace_readb((const void *)(addr))
+#define readb(addr)	iotrace_readb((const void *)(uintptr_t)addr)
 
 #undef writeb
-#define writeb(val, addr)	iotrace_writeb(val, (const void *)(addr))
+#define writeb(val, addr) \
+	iotrace_writeb(val, (const void *)(uintptr_t)addr)
 
 #endif
 
diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h
index 7ec5550..8f8ac6a 100644
--- a/include/linux/usb/otg.h
+++ b/include/linux/usb/otg.h
@@ -17,4 +17,13 @@
 	USB_DR_MODE_OTG,
 };
 
+/**
+ * usb_get_dr_mode() - Get dual role mode for given device
+ * @node: Node offset to the given device
+ *
+ * The function gets phy interface string from property 'dr_mode',
+ * and returns the correspondig enum usb_dr_mode
+ */
+enum usb_dr_mode usb_get_dr_mode(int node);
+
 #endif /* __LINUX_USB_OTG_H */
diff --git a/include/mmc.h b/include/mmc.h
index cdb56e7..a5c6573 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -344,7 +344,9 @@
 
 /* TODO struct mmc should be in mmc_private but it's hard to fix right now */
 struct mmc {
+#ifndef CONFIG_BLK
 	struct list_head link;
+#endif
 	const struct mmc_config *cfg;	/* provided configuration */
 	uint version;
 	void *priv;
@@ -376,11 +378,16 @@
 	u64 capacity_gp[4];
 	u64 enh_user_start;
 	u64 enh_user_size;
+#ifndef CONFIG_BLK
 	struct blk_desc block_dev;
+#endif
 	char op_cond_pending;	/* 1 if we are waiting on an op_cond command */
 	char init_in_progress;	/* 1 if we have done mmc_start_init() */
 	char preinit;		/* start init as early as possible */
 	int ddr_mode;
+#ifdef CONFIG_DM_MMC
+	struct udevice *dev;	/* Device for this MMC controller */
+#endif
 };
 
 struct mmc_hwpart_conf {
@@ -406,7 +413,29 @@
 
 int mmc_register(struct mmc *mmc);
 struct mmc *mmc_create(const struct mmc_config *cfg, void *priv);
+
+/**
+ * mmc_bind() - Set up a new MMC device ready for probing
+ *
+ * A child block device is bound with the IF_TYPE_MMC interface type. This
+ * allows the device to be used with CONFIG_BLK
+ *
+ * @dev:	MMC device to set up
+ * @mmc:	MMC struct
+ * @cfg:	MMC configuration
+ * @return 0 if OK, -ve on error
+ */
+int mmc_bind(struct udevice *dev, struct mmc *mmc,
+	     const struct mmc_config *cfg);
 void mmc_destroy(struct mmc *mmc);
+
+/**
+ * mmc_unbind() - Unbind a MMC device's child block device
+ *
+ * @dev:	MMC device
+ * @return 0 if OK, -ve on error
+ */
+int mmc_unbind(struct udevice *dev);
 int mmc_initialize(bd_t *bis);
 int mmc_init(struct mmc *mmc);
 int mmc_read(struct mmc *mmc, u64 src, uchar *dst, int size);
@@ -415,7 +444,6 @@
 int mmc_set_dev(int dev_num);
 void print_mmc_devices(char separator);
 int get_mmc_num(void);
-int mmc_switch_part(int dev_num, unsigned int part_num);
 int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
 		      enum mmc_hwpart_conf_mode mode);
 int mmc_getcd(struct mmc *mmc);
@@ -498,4 +526,12 @@
 #define CONFIG_SYS_MMC_MAX_BLK_COUNT 65535
 #endif
 
+/**
+ * mmc_get_blk_desc() - Get the block descriptor for an MMC device
+ *
+ * @mmc:	MMC device
+ * @return block device if found, else NULL
+ */
+struct blk_desc *mmc_get_blk_desc(struct mmc *mmc);
+
 #endif /* _MMC_H_ */
diff --git a/include/netdev.h b/include/netdev.h
index 244f23f..7a211bc 100644
--- a/include/netdev.h
+++ b/include/netdev.h
@@ -134,64 +134,6 @@
 	return num;
 }
 
-/*
- * Boards with mv88e61xx switch can use this by defining
- * CONFIG_MV88E61XX_SWITCH in respective board configheader file
- * the stuct and enums here are used to specify switch configuration params
- */
-#if defined(CONFIG_MV88E61XX_SWITCH)
-
-/* constants for any 88E61xx switch */
-#define MV88E61XX_MAX_PORTS_NUM	6
-
-enum mv88e61xx_cfg_mdip {
-	MV88E61XX_MDIP_NOCHANGE,
-	MV88E61XX_MDIP_REVERSE
-};
-
-enum mv88e61xx_cfg_ledinit {
-	MV88E61XX_LED_INIT_DIS,
-	MV88E61XX_LED_INIT_EN
-};
-
-enum mv88e61xx_cfg_rgmiid {
-	MV88E61XX_RGMII_DELAY_DIS,
-	MV88E61XX_RGMII_DELAY_EN
-};
-
-enum mv88e61xx_cfg_prtstt {
-	MV88E61XX_PORTSTT_DISABLED,
-	MV88E61XX_PORTSTT_BLOCKING,
-	MV88E61XX_PORTSTT_LEARNING,
-	MV88E61XX_PORTSTT_FORWARDING
-};
-
-struct mv88e61xx_config {
-	char *name;
-	u8 vlancfg[MV88E61XX_MAX_PORTS_NUM];
-	enum mv88e61xx_cfg_rgmiid rgmii_delay;
-	enum mv88e61xx_cfg_prtstt portstate;
-	enum mv88e61xx_cfg_ledinit led_init;
-	enum mv88e61xx_cfg_mdip mdip;
-	u32 ports_enabled;
-	u8 cpuport;
-};
-
-/*
- * Common mappings for Internal VLANs
- * These mappings consider that all ports are useable; the driver
- * will mask inexistent/unused ports.
- */
-
-/* Switch mode : routes any port to any port */
-#define MV88E61XX_VLANCFG_SWITCH { 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F }
-
-/* Router mode: routes only CPU port 5 to/from non-CPU ports 0-4 */
-#define MV88E61XX_VLANCFG_ROUTER { 0x20, 0x20, 0x20, 0x20, 0x20, 0x1F }
-
-int mv88e61xx_switch_initialize(struct mv88e61xx_config *swconfig);
-#endif /* CONFIG_MV88E61XX_SWITCH */
-
 struct mii_dev *fec_get_miibus(uint32_t base_addr, int dev_id);
 #ifdef CONFIG_PHYLIB
 struct phy_device;
diff --git a/include/part.h b/include/part.h
index e3811c6..226b5be 100644
--- a/include/part.h
+++ b/include/part.h
@@ -12,7 +12,6 @@
 
 struct block_drvr {
 	char *name;
-	struct blk_desc* (*get_dev)(int dev);
 	int (*select_hwpart)(int dev_num, int hwpart);
 };
 
@@ -73,32 +72,8 @@
  *	   error occurred.
  */
 struct blk_desc *blk_get_dev(const char *ifname, int dev);
-struct blk_desc *ide_get_dev(int dev);
-struct blk_desc *sata_get_dev(int dev);
-struct blk_desc *scsi_get_dev(int dev);
-struct blk_desc *usb_stor_get_dev(int dev);
-struct blk_desc *mmc_get_dev(int dev);
 
-/**
- * mmc_select_hwpart() - Select the MMC hardware partiion on an MMC device
- *
- * MMC devices can support partitioning at the hardware level. This is quite
- * separate from the normal idea of software-based partitions. MMC hardware
- * partitions must be explicitly selected. Once selected only the region of
- * the device covered by that partition is accessible.
- *
- * The MMC standard provides for two boot partitions (numbered 1 and 2),
- * rpmb (3), and up to 4 addition general-purpose partitions (4-7).
- *
- * @dev_num:	Block device number (struct blk_desc->dev value)
- * @hwpart:	Hardware partition number to select. 0 means the raw device,
- *		1 is the first partition, 2 is the second, etc.
- * @return 0 if OK, other value for an error
- */
-int mmc_select_hwpart(int dev_num, int hwpart);
-struct blk_desc *systemace_get_dev(int dev);
 struct blk_desc *mg_disk_get_dev(int dev);
-struct blk_desc *host_get_dev(int dev);
 int host_get_dev_err(int dev, struct blk_desc **blk_devp);
 
 /* disk/part.c */
@@ -175,15 +150,7 @@
 #else
 static inline struct blk_desc *blk_get_dev(const char *ifname, int dev)
 { return NULL; }
-static inline struct blk_desc *ide_get_dev(int dev) { return NULL; }
-static inline struct blk_desc *sata_get_dev(int dev) { return NULL; }
-static inline struct blk_desc *scsi_get_dev(int dev) { return NULL; }
-static inline struct blk_desc *usb_stor_get_dev(int dev) { return NULL; }
-static inline struct blk_desc *mmc_get_dev(int dev) { return NULL; }
-static inline int mmc_select_hwpart(int dev_num, int hwpart) { return -1; }
-static inline struct blk_desc *systemace_get_dev(int dev) { return NULL; }
 static inline struct blk_desc *mg_disk_get_dev(int dev) { return NULL; }
-static inline struct blk_desc *host_get_dev(int dev) { return NULL; }
 
 static inline int part_get_info(struct blk_desc *dev_desc, int part,
 				disk_partition_t *info) { return -1; }
diff --git a/include/phy.h b/include/phy.h
index 21459a8..268d9a1 100644
--- a/include/phy.h
+++ b/include/phy.h
@@ -249,6 +249,7 @@
 int gen10g_shutdown(struct phy_device *phydev);
 int gen10g_discover_mmds(struct phy_device *phydev);
 
+int phy_mv88e61xx_init(void);
 int phy_aquantia_init(void);
 int phy_atheros_init(void);
 int phy_broadcom_init(void);
@@ -277,6 +278,28 @@
  */
 int phy_get_interface_by_name(const char *str);
 
+/**
+ * phy_interface_is_rgmii - Convenience function for testing if a PHY interface
+ * is RGMII (all variants)
+ * @phydev: the phy_device struct
+ */
+static inline bool phy_interface_is_rgmii(struct phy_device *phydev)
+{
+	return phydev->interface >= PHY_INTERFACE_MODE_RGMII &&
+		phydev->interface <= PHY_INTERFACE_MODE_RGMII_TXID;
+}
+
+/**
+ * phy_interface_is_sgmii - Convenience function for testing if a PHY interface
+ * is SGMII (all variants)
+ * @phydev: the phy_device struct
+ */
+static inline bool phy_interface_is_sgmii(struct phy_device *phydev)
+{
+	return phydev->interface >= PHY_INTERFACE_MODE_SGMII &&
+		phydev->interface <= PHY_INTERFACE_MODE_QSGMII;
+}
+
 /* PHY UIDs for various PHYs that are referenced in external code */
 #define PHY_UID_CS4340  0x13e51002
 #define PHY_UID_TN2020	0x00a19410
diff --git a/arch/x86/include/asm/fw_cfg.h b/include/qfw.h
similarity index 80%
rename from arch/x86/include/asm/fw_cfg.h
rename to include/qfw.h
index e9450c6..b0b3b59 100644
--- a/arch/x86/include/asm/fw_cfg.h
+++ b/include/qfw.h
@@ -7,11 +7,6 @@
 #ifndef __FW_CFG__
 #define __FW_CFG__
 
-#define FW_CONTROL_PORT	0x510
-#define FW_DATA_PORT		0x511
-#define FW_DMA_PORT_LOW	0x514
-#define FW_DMA_PORT_HIGH	0x518
-
 #include <linux/list.h>
 
 enum qemu_fwcfg_items {
@@ -87,12 +82,22 @@
 	struct list_head list;  /* list node to link to fw_list */
 };
 
+struct fw_cfg_file_iter {
+	struct list_head *entry; /* structure to iterate file list */
+};
+
 struct fw_cfg_dma_access {
 	__be32 control;
 	__be32 length;
 	__be64 address;
 };
 
+struct fw_cfg_arch_ops {
+	void (*arch_read_pio)(uint16_t selector, uint32_t size,
+			void *address);
+	void (*arch_read_dma)(struct fw_cfg_dma_access *dma);
+};
+
 struct bios_linker_entry {
 	__le32 command;
 	union {
@@ -144,8 +149,14 @@
 
 /**
  * Initialize QEMU fw_cfg interface
+ *
+ * @ops: arch specific read operations
  */
-void qemu_fwcfg_init(void);
+void qemu_fwcfg_init(struct fw_cfg_arch_ops *ops);
+
+void qemu_fwcfg_read_entry(uint16_t entry, uint32_t length, void *address);
+int qemu_fwcfg_read_firmware_list(void);
+struct fw_file *qemu_fwcfg_find_file(const char *name);
 
 /**
  * Get system cpu number
@@ -154,4 +165,12 @@
  */
 int qemu_fwcfg_online_cpus(void);
 
+/* helper functions to iterate firmware file list */
+struct fw_file *qemu_fwcfg_file_iter_init(struct fw_cfg_file_iter *iter);
+struct fw_file *qemu_fwcfg_file_iter_next(struct fw_cfg_file_iter *iter);
+bool qemu_fwcfg_file_iter_end(struct fw_cfg_file_iter *iter);
+
+bool qemu_fwcfg_present(void);
+bool qemu_fwcfg_dma_present(void);
+
 #endif
diff --git a/include/spi.h b/include/spi.h
index 4b88d39..ca96fa4 100644
--- a/include/spi.h
+++ b/include/spi.h
@@ -612,6 +612,58 @@
 			 struct udevice *bus, struct udevice *slave,
 			 struct udevice **emulp);
 
+/**
+ * Claim the bus and prepare it for communication with a given slave.
+ *
+ * This must be called before doing any transfers with a SPI slave. It
+ * will enable and initialize any SPI hardware as necessary, and make
+ * sure that the SCK line is in the correct idle state. It is not
+ * allowed to claim the same bus for several slaves without releasing
+ * the bus in between.
+ *
+ * @dev:	The SPI slave device
+ *
+ * Returns: 0 if the bus was claimed successfully, or a negative value
+ * if it wasn't.
+ */
+int dm_spi_claim_bus(struct udevice *dev);
+
+/**
+ * Release the SPI bus
+ *
+ * This must be called once for every call to dm_spi_claim_bus() after
+ * all transfers have finished. It may disable any SPI hardware as
+ * appropriate.
+ *
+ * @slave:	The SPI slave device
+ */
+void dm_spi_release_bus(struct udevice *dev);
+
+/**
+ * SPI transfer
+ *
+ * This writes "bitlen" bits out the SPI MOSI port and simultaneously clocks
+ * "bitlen" bits in the SPI MISO port.  That's just the way SPI works.
+ *
+ * The source of the outgoing bits is the "dout" parameter and the
+ * destination of the input bits is the "din" parameter.  Note that "dout"
+ * and "din" can point to the same memory location, in which case the
+ * input data overwrites the output data (since both are buffered by
+ * temporary variables, this is OK).
+ *
+ * dm_spi_xfer() interface:
+ * @dev:	The SPI slave device which will be sending/receiving the data.
+ * @bitlen:	How many bits to write and read.
+ * @dout:	Pointer to a string of bits to send out.  The bits are
+ *		held in a byte array and are sent MSB first.
+ * @din:	Pointer to a string of bits that will be filled in.
+ * @flags:	A bitwise combination of SPI_XFER_* flags.
+ *
+ * Returns: 0 on success, not 0 on failure
+ */
+int dm_spi_xfer(struct udevice *dev, unsigned int bitlen,
+		const void *dout, void *din, unsigned long flags);
+
 /* Access the operations for a SPI device */
 #define spi_get_ops(dev)	((struct dm_spi_ops *)(dev)->driver->ops)
 #define spi_emul_get_ops(dev)	((struct dm_spi_emul_ops *)(dev)->driver->ops)
diff --git a/include/spl.h b/include/spl.h
index de4f70a..335b76a 100644
--- a/include/spl.h
+++ b/include/spl.h
@@ -56,8 +56,9 @@
 u32 spl_boot_device(void);
 u32 spl_boot_mode(void);
 void spl_set_header_raw_uboot(void);
-void spl_parse_image_header(const struct image_header *header);
+int spl_parse_image_header(const struct image_header *header);
 void spl_board_prepare_for_linux(void);
+void spl_board_prepare_for_boot(void);
 void __noreturn jump_to_image_linux(void *arg);
 int spl_start_uboot(void);
 void spl_display_print(void);
diff --git a/include/systemace.h b/include/systemace.h
deleted file mode 100644
index 3b6ec7d..0000000
--- a/include/systemace.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef __SYSTEMACE_H
-#define __SYSTEMACE_H
-/*
- * Copyright (c) 2004 Picture Elements, Inc.
- *    Stephen Williams (steve@picturel.com)
- *
- * SPDX-License-Identifier:	GPL-2.0+
- */
-
-#ifdef CONFIG_SYSTEMACE
-
-# include  <part.h>
-
-struct blk_desc *systemace_get_dev(int dev);
-
-#endif	/* CONFIG_SYSTEMACE */
-#endif	/* __SYSTEMACE_H */
diff --git a/include/usb.h b/include/usb.h
index 5adad36..02a0ccd 100644
--- a/include/usb.h
+++ b/include/usb.h
@@ -228,7 +228,6 @@
 #ifdef CONFIG_USB_STORAGE
 
 #define USB_MAX_STOR_DEV 7
-struct blk_desc *usb_stor_get_dev(int index);
 int usb_stor_scan(int mode);
 int usb_stor_info(void);
 
diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
index 28e5b7f..075fd34 100644
--- a/lib/efi_loader/efi_disk.c
+++ b/lib/efi_loader/efi_disk.c
@@ -7,6 +7,7 @@
  */
 
 #include <common.h>
+#include <blk.h>
 #include <efi_loader.h>
 #include <inttypes.h>
 #include <part.h>
@@ -142,7 +143,7 @@
 };
 
 static void efi_disk_add_dev(char *name,
-			     const struct block_drvr *cur_drvr,
+			     const struct blk_driver *cur_drvr,
 			     const struct blk_desc *desc,
 			     int dev_index,
 			     lbaint_t offset)
@@ -160,7 +161,7 @@
 	diskobj->parent.protocols[1].open = efi_disk_open_dp;
 	diskobj->parent.handle = diskobj;
 	diskobj->ops = block_io_disk_template;
-	diskobj->ifname = cur_drvr->name;
+	diskobj->ifname = cur_drvr->if_typename;
 	diskobj->dev_index = dev_index;
 	diskobj->offset = offset;
 
@@ -189,7 +190,7 @@
 }
 
 static int efi_disk_create_eltorito(struct blk_desc *desc,
-				    const struct block_drvr *cur_drvr,
+				    const struct blk_driver *cur_drvr,
 				    int diskid)
 {
 	int disks = 0;
@@ -202,8 +203,8 @@
 		return 0;
 
 	while (!part_get_info(desc, part, &info)) {
-		snprintf(devname, sizeof(devname), "%s%d:%d", cur_drvr->name,
-			 diskid, part);
+		snprintf(devname, sizeof(devname), "%s%d:%d",
+			 cur_drvr->if_typename, diskid, part);
 		efi_disk_add_dev(devname, cur_drvr, desc, diskid, info.start);
 		part++;
 		disks++;
@@ -222,25 +223,29 @@
  */
 int efi_disk_register(void)
 {
-	const struct block_drvr *cur_drvr;
-	int i;
+	const struct blk_driver *cur_drvr;
+	int i, if_type;
 	int disks = 0;
 
 	/* Search for all available disk devices */
-	for (cur_drvr = block_drvr; cur_drvr->name; cur_drvr++) {
-		printf("Scanning disks on %s...\n", cur_drvr->name);
+	for (if_type = 0; if_type < IF_TYPE_COUNT; if_type++) {
+		cur_drvr = blk_driver_lookup_type(if_type);
+		if (!cur_drvr)
+			continue;
+
+		printf("Scanning disks on %s...\n", cur_drvr->if_typename);
 		for (i = 0; i < 4; i++) {
 			struct blk_desc *desc;
 			char devname[32] = { 0 }; /* dp->str is u16[32] long */
 
-			desc = blk_get_dev(cur_drvr->name, i);
+			desc = blk_get_devnum_by_type(if_type, i);
 			if (!desc)
 				continue;
 			if (desc->type == DEV_TYPE_UNKNOWN)
 				continue;
 
 			snprintf(devname, sizeof(devname), "%s%d",
-				 cur_drvr->name, i);
+				 cur_drvr->if_typename, i);
 			efi_disk_add_dev(devname, cur_drvr, desc, i, 0);
 			disks++;
 
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index ad1d9b5..97a09a2 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -323,13 +323,13 @@
 
 # ACPI
 # ---------------------------------------------------------------------------
-quiet_cmd_acpi_c_asl= ASL     $@
+quiet_cmd_acpi_c_asl= ASL     $<
 cmd_acpi_c_asl=         \
-	$(CPP) -x assembler-with-cpp -P -o $<.tmp $<; \
-	iasl -p $< -tc -va $<.tmp; \
+	$(CPP) -x assembler-with-cpp -P $(UBOOTINCLUDE) -o $<.tmp $<; \
+	iasl -p $< -tc $<.tmp $(if $(KBUILD_VERBOSE:1=), >/dev/null); \
 	mv $(patsubst %.asl,%.hex,$<) $@
 
-$(obj)/%.c:    $(src)/%.asl
+$(obj)/dsdt.c:    $(src)/dsdt.asl
 	$(call cmd,acpi_c_asl)
 
 # Bzip2
diff --git a/scripts/Makefile.spl b/scripts/Makefile.spl
index ec8d8f1..6d2017d 100644
--- a/scripts/Makefile.spl
+++ b/scripts/Makefile.spl
@@ -129,7 +129,12 @@
 boot.bin: $(obj)/u-boot-spl.bin FORCE
 	$(call if_changed,mkimage)
 else
+ifdef CONFIG_ARCH_ZYNQ
 MKIMAGEFLAGS_boot.bin = -T zynqimage
+endif
+ifdef CONFIG_ARCH_ZYNQMP
+MKIMAGEFLAGS_boot.bin = -T zynqmpimage
+endif
 
 spl/boot.bin: $(obj)/u-boot-spl.bin FORCE
 	$(call if_changed,mkimage)
@@ -157,6 +162,8 @@
 ALL-y	+= $(obj)/boot.bin
 endif
 
+ALL-(CONFIG_ARCH_ZYNQMP)	+= $(obj)/boot.bin
+
 all:	$(ALL-y)
 
 quiet_cmd_cat = CAT     $@
diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c
index e8e8c77..9bd0de2 100644
--- a/scripts/basic/fixdep.c
+++ b/scripts/basic/fixdep.c
@@ -296,7 +296,11 @@
 		perror(filename);
 		exit(2);
 	}
-	fstat(fd, &st);
+	if (fstat(fd, &st) < 0) {
+		fprintf(stderr, "fixdep: error fstat'ing config file: ");
+		perror(filename);
+		exit(2);
+	}
 	if (st.st_size == 0) {
 		close(fd);
 		return;
diff --git a/test/dm/blk.c b/test/dm/blk.c
index f4ea32e..012bf4c 100644
--- a/test/dm/blk.c
+++ b/test/dm/blk.c
@@ -83,12 +83,12 @@
 	ut_asserteq_ptr(usb_dev, dev_get_parent(dev));
 
 	/* Check we have one block device for each mass storage device */
-	ut_asserteq(3, count_blk_devices());
+	ut_asserteq(4, count_blk_devices());
 
 	/* Now go around again, making sure the old devices were unbound */
 	ut_assertok(usb_stop());
 	ut_assertok(usb_init());
-	ut_asserteq(3, count_blk_devices());
+	ut_asserteq(4, count_blk_devices());
 	ut_assertok(usb_stop());
 
 	return 0;
diff --git a/test/dm/mmc.c b/test/dm/mmc.c
index 0461423..5bca4b7 100644
--- a/test/dm/mmc.c
+++ b/test/dm/mmc.c
@@ -25,3 +25,22 @@
 	return 0;
 }
 DM_TEST(dm_test_mmc_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+static int dm_test_mmc_blk(struct unit_test_state *uts)
+{
+	struct udevice *dev;
+	struct blk_desc *dev_desc;
+	char cmp[1024];
+
+	ut_assertok(uclass_get_device(UCLASS_MMC, 0, &dev));
+	ut_assertok(blk_get_device_by_str("mmc", "0", &dev_desc));
+
+	/* Read a few blocks and look for the string we expect */
+	ut_asserteq(512, dev_desc->blksz);
+	memset(cmp, '\0', sizeof(cmp));
+	ut_asserteq(2, blk_dread(dev_desc, 0, 2, cmp));
+	ut_assertok(strcmp(cmp, "this is a test"));
+
+	return 0;
+}
+DM_TEST(dm_test_mmc_blk, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
diff --git a/tools/Makefile b/tools/Makefile
index da50e1b..63355aa 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -98,6 +98,7 @@
 			common/hash.o \
 			ublimage.o \
 			zynqimage.o \
+			zynqmpimage.o \
 			$(LIBFDT_OBJS) \
 			$(RSA_OBJS-y)
 
diff --git a/tools/buildman/README b/tools/buildman/README
index 4705d26..26755c5 100644
--- a/tools/buildman/README
+++ b/tools/buildman/README
@@ -898,6 +898,48 @@
 will build commits in us-buildman that are not in upstream/master.
 
 
+Building Faster
+===============
+
+By default, buildman executes 'make mrproper' prior to building the first
+commit for each board. This causes everything to be built from scratch. If you
+trust the build system's incremental build capabilities, you can pass the -I
+flag to skip the 'make mproper' invocation, which will reduce the amount of
+work 'make' does, and hence speed up the build. This flag will speed up any
+buildman invocation, since it reduces the amount of work done on any build.
+
+One possible application of buildman is as part of a continual edit, build,
+edit, build, ... cycle; repeatedly applying buildman to the same change or
+series of changes while making small incremental modifications to the source
+each time. This provides quick feedback regarding the correctness of recent
+modifications. In this scenario, buildman's default choice of build directory
+causes more build work to be performed than strictly necessary.
+
+By default, each buildman thread uses a single directory for all builds. When a
+thread builds multiple boards, the configuration built in this directory will
+cycle through various different configurations, one per board built by the
+thread. Variations in the configuration will force a rebuild of affected source
+files when a thread switches between boards. Ideally, such buildman-induced
+rebuilds would not happen, thus allowing the build to operate as efficiently as
+the build system and source changes allow. buildman's -P flag may be used to
+enable this; -P causes each board to be built in a separate (board-specific)
+directory, thus avoiding any buildman-induced configuration changes in any
+build directory.
+
+U-Boot's build system embeds information such as a build timestamp into the
+final binary. This information varies each time U-Boot is built. This causes
+various files to be rebuilt even if no source changes are made, which in turn
+requires that the final U-Boot binary be re-linked. This unnecessary work can
+be avoided by turning off the timestamp feature. This can be achieved by
+setting the SOURCE_DATE_EPOCH environment variable to 0.
+
+Combining all of these options together yields the command-line shown below.
+This will provide the quickest possible feedback regarding the current content
+of the source tree, thus allowing rapid tested evolution of the code.
+
+    SOURCE_DATE_EPOCH=0 ./tools/buildman/buildman -I -P tegra
+
+
 Other options
 =============
 
diff --git a/tools/buildman/builder.py b/tools/buildman/builder.py
index 141bf64..8ec3551 100644
--- a/tools/buildman/builder.py
+++ b/tools/buildman/builder.py
@@ -205,7 +205,8 @@
 
     def __init__(self, toolchains, base_dir, git_dir, num_threads, num_jobs,
                  gnu_make='make', checkout=True, show_unknown=True, step=1,
-                 no_subdirs=False, full_path=False, verbose_build=False):
+                 no_subdirs=False, full_path=False, verbose_build=False,
+                 incremental=False, per_board_out_dir=False):
         """Create a new Builder object
 
         Args:
@@ -224,6 +225,10 @@
             full_path: Return the full path in CROSS_COMPILE and don't set
                 PATH
             verbose_build: Run build with V=1 and don't use 'make -s'
+            incremental: Always perform incremental builds; don't run make
+                mrproper when configuring
+            per_board_out_dir: Build in a separate persistent directory per
+                board rather than a thread-specific directory
         """
         self.toolchains = toolchains
         self.base_dir = base_dir
@@ -263,7 +268,8 @@
         self.queue = Queue.Queue()
         self.out_queue = Queue.Queue()
         for i in range(self.num_threads):
-            t = builderthread.BuilderThread(self, i)
+            t = builderthread.BuilderThread(self, i, incremental,
+                    per_board_out_dir)
             t.setDaemon(True)
             t.start()
             self.threads.append(t)
diff --git a/tools/buildman/builderthread.py b/tools/buildman/builderthread.py
index cf25bb8..c512d3b 100644
--- a/tools/buildman/builderthread.py
+++ b/tools/buildman/builderthread.py
@@ -80,11 +80,13 @@
         thread_num: Our thread number (0-n-1), used to decide on a
                 temporary directory
     """
-    def __init__(self, builder, thread_num):
+    def __init__(self, builder, thread_num, incremental, per_board_out_dir):
         """Set up a new builder thread"""
         threading.Thread.__init__(self)
         self.builder = builder
         self.thread_num = thread_num
+        self.incremental = incremental
+        self.per_board_out_dir = per_board_out_dir
 
     def Make(self, commit, brd, stage, cwd, *args, **kwargs):
         """Run 'make' on a particular commit and board.
@@ -136,7 +138,11 @@
         if self.builder.in_tree:
             out_dir = work_dir
         else:
-            out_dir = os.path.join(work_dir, 'build')
+            if self.per_board_out_dir:
+                out_rel_dir = os.path.join('..', brd.target)
+            else:
+                out_rel_dir = 'build'
+            out_dir = os.path.join(work_dir, out_rel_dir)
 
         # Check if the job was already completed last time
         done_file = self.builder.GetDoneFile(commit_upto, brd.target)
@@ -197,12 +203,12 @@
                         #
                         # Symlinks can confuse U-Boot's Makefile since
                         # we may use '..' in our path, so remove them.
-                        work_dir = os.path.realpath(work_dir)
-                        args.append('O=%s/build' % work_dir)
+                        out_dir = os.path.realpath(out_dir)
+                        args.append('O=%s' % out_dir)
                         cwd = None
                         src_dir = os.getcwd()
                     else:
-                        args.append('O=build')
+                        args.append('O=%s' % out_rel_dir)
                 if self.builder.verbose_build:
                     args.append('V=1')
                 else:
@@ -215,9 +221,11 @@
 
                 # If we need to reconfigure, do that now
                 if do_config:
-                    result = self.Make(commit, brd, 'mrproper', cwd,
-                            'mrproper', *args, env=env)
-                    config_out = result.combined
+                    config_out = ''
+                    if not self.incremental:
+                        result = self.Make(commit, brd, 'mrproper', cwd,
+                                'mrproper', *args, env=env)
+                        config_out += result.combined
                     result = self.Make(commit, brd, 'config', cwd,
                             *(args + config_args), env=env)
                     config_out += result.combined
diff --git a/tools/buildman/cmdline.py b/tools/buildman/cmdline.py
index 8341ab1..3e3bd63 100644
--- a/tools/buildman/cmdline.py
+++ b/tools/buildman/cmdline.py
@@ -49,6 +49,8 @@
     parser.add_option('-i', '--in-tree', dest='in_tree',
           action='store_true', default=False,
           help='Build in the source tree instead of a separate directory')
+    parser.add_option('-I', '--incremental', action='store_true',
+          default=False, help='Do not run make mrproper (when reconfiguring)')
     parser.add_option('-j', '--jobs', dest='jobs', type='int',
           default=None, help='Number of jobs to run at once (passed to make)')
     parser.add_option('-k', '--keep-outputs', action='store_true',
@@ -70,6 +72,8 @@
           default=False, help='Do a rough build, with limited warning resolution')
     parser.add_option('-p', '--full-path', action='store_true',
           default=False, help="Use full toolchain path in CROSS_COMPILE")
+    parser.add_option('-P', '--per-board-out-dir', action='store_true',
+          default=False, help="Use an O= (output) directory per board rather than per thread")
     parser.add_option('-s', '--summary', action='store_true',
           default=False, help='Show a build summary')
     parser.add_option('-S', '--show-sizes', action='store_true',
diff --git a/tools/buildman/control.py b/tools/buildman/control.py
index c2c54bf..aeb128a 100644
--- a/tools/buildman/control.py
+++ b/tools/buildman/control.py
@@ -250,7 +250,9 @@
             options.threads, options.jobs, gnu_make=gnu_make, checkout=True,
             show_unknown=options.show_unknown, step=options.step,
             no_subdirs=options.no_subdirs, full_path=options.full_path,
-            verbose_build=options.verbose_build)
+            verbose_build=options.verbose_build,
+            incremental=options.incremental,
+            per_board_out_dir=options.per_board_out_dir,)
     builder.force_config_on_failure = not options.quick
     if make_func:
         builder.do_make = make_func
diff --git a/tools/imagetool.c b/tools/imagetool.c
index 916ab96..08d191d 100644
--- a/tools/imagetool.c
+++ b/tools/imagetool.c
@@ -51,7 +51,8 @@
 				 * successful
 				 */
 				if ((*curr)->print_header) {
-					(*curr)->print_header(ptr);
+					if (!params->quiet)
+						(*curr)->print_header(ptr);
 				} else {
 					fprintf(stderr,
 						"%s: print_header undefined for %s\n",
diff --git a/tools/imagetool.h b/tools/imagetool.h
index 24f8f4b..a3ed0f4 100644
--- a/tools/imagetool.h
+++ b/tools/imagetool.h
@@ -73,6 +73,7 @@
 	struct content_info *content_head;	/* List of files to include */
 	struct content_info *content_tail;
 	bool external_data;	/* Store data outside the FIT */
+	bool quiet;		/* Don't output text in normal operation */
 };
 
 /*
diff --git a/tools/imximage.c b/tools/imximage.c
index 7c21922..092d550 100644
--- a/tools/imximage.c
+++ b/tools/imximage.c
@@ -209,7 +209,7 @@
 		d = d2;
 		d->write_dcd_command.tag = DCD_CHECK_DATA_COMMAND_TAG;
 		d->write_dcd_command.length = cpu_to_be16(4);
-		d->write_dcd_command.param = DCD_CHECK_BITS_SET_PARAM;
+		d->write_dcd_command.param = DCD_CHECK_BITS_CLR_PARAM;
 		break;
 	default:
 		break;
diff --git a/tools/mkimage.c b/tools/mkimage.c
index 93d1c16..aefe22f 100644
--- a/tools/mkimage.c
+++ b/tools/mkimage.c
@@ -136,7 +136,7 @@
 	int opt;
 
 	while ((opt = getopt(argc, argv,
-			     "a:A:b:cC:d:D:e:Ef:Fk:K:ln:O:rR:sT:vVx")) != -1) {
+			     "a:A:b:cC:d:D:e:Ef:Fk:K:ln:O:rR:qsT:vVx")) != -1) {
 		switch (opt) {
 		case 'a':
 			params.addr = strtoull(optarg, &ptr, 16);
@@ -216,6 +216,9 @@
 			if (params.os < 0)
 				usage("Invalid operating system");
 			break;
+		case 'q':
+			params.quiet = 1;
+			break;
 		case 'r':
 			params.require_keys = 1;
 			break;
diff --git a/tools/zynqmpimage.c b/tools/zynqmpimage.c
new file mode 100644
index 0000000..3f28eb4
--- /dev/null
+++ b/tools/zynqmpimage.c
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2016 Michal Simek <michals@xilinx.com>
+ * Copyright (C) 2015 Nathan Rossi <nathan@nathanrossi.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ *
+ * The following Boot Header format/structures and values are defined in the
+ * following documents:
+ *   * ug1085 ZynqMP TRM (Chapter 9, Table 9-3)
+ *
+ * Expected Header Size = 0x9C0
+ * Forced as 'little' endian, 32-bit words
+ *
+ *  0x  0 - Interrupt table (8 words)
+ *  ...     (Default value = 0xeafffffe)
+ *  0x 1f
+ *  0x 20 - Width detection
+ *         * DEFAULT_WIDTHDETECTION    0xaa995566
+ *  0x 24 - Image identifier
+ *         * DEFAULT_IMAGEIDENTIFIER   0x584c4e58
+ *  0x 28 - Encryption
+ *         * 0x00000000 - None
+ *         * 0xa5c3c5a3 - eFuse
+ *         * 0xa5c3c5a7 - obfuscated key in eFUSE
+ *         * 0x3a5c3c5a - bbRam
+ *         * 0xa35c7ca5 - obfuscated key in boot header
+ *  0x 2C - Image load
+ *  0x 30 - Image offset
+ *  0x 34 - PFW image length
+ *  0x 38 - Total PFW image length
+ *  0x 3C - Image length
+ *  0x 40 - Total image length
+ *  0x 44 - Image attributes
+ *  0x 48 - Header checksum
+ *  0x 4c - Obfuscated key
+ *  ...
+ *  0x 68
+ *  0x 6c - Reserved
+ *  0x 70 - User defined
+ *  ...
+ *  0x 9c
+ *  0x a0 - Secure header initialization vector
+ *  ...
+ *  0x a8
+ *  0x ac - Obfuscated key initialization vector
+ *  ...
+ *  0x b4
+ *  0x b8 - Register Initialization, 511 Address and Data word pairs
+ *         * List is terminated with an address of 0xffffffff or
+ *  ...    * at the max number of entries
+ *  0x8b4
+ *  0x8b8 - Reserved
+ *  ...
+ *  0x9bf
+ *  0x9c0 - Data/Image starts here or above
+ */
+
+#include "imagetool.h"
+#include "mkimage.h"
+#include <image.h>
+
+#define HEADER_INTERRUPT_DEFAULT (cpu_to_le32(0xeafffffe))
+#define HEADER_REGINIT_NULL (cpu_to_le32(0xffffffff))
+#define HEADER_WIDTHDETECTION (cpu_to_le32(0xaa995566))
+#define HEADER_IMAGEIDENTIFIER (cpu_to_le32(0x584c4e58))
+
+enum {
+	ENCRYPTION_EFUSE = 0xa5c3c5a3,
+	ENCRYPTION_OEFUSE = 0xa5c3c5a7,
+	ENCRYPTION_BBRAM = 0x3a5c3c5a,
+	ENCRYPTION_OBBRAM = 0xa35c7ca5,
+	ENCRYPTION_NONE = 0x0,
+};
+
+struct zynqmp_reginit {
+	uint32_t address;
+	uint32_t data;
+};
+
+#define HEADER_INTERRUPT_VECTORS	8
+#define HEADER_REGINITS			256
+
+struct zynqmp_header {
+	uint32_t interrupt_vectors[HEADER_INTERRUPT_VECTORS]; /* 0x0 */
+	uint32_t width_detection; /* 0x20 */
+	uint32_t image_identifier; /* 0x24 */
+	uint32_t encryption; /* 0x28 */
+	uint32_t image_load; /* 0x2c */
+	uint32_t image_offset; /* 0x30 */
+	uint32_t pfw_image_length; /* 0x34 */
+	uint32_t total_pfw_image_length; /* 0x38 */
+	uint32_t image_size; /* 0x3c */
+	uint32_t image_stored_size; /* 0x40 */
+	uint32_t image_attributes; /* 0x44 */
+	uint32_t checksum; /* 0x48 */
+	uint32_t __reserved1[27]; /* 0x4c */
+	struct zynqmp_reginit register_init[HEADER_REGINITS]; /* 0xb8 */
+	uint32_t __reserved4[66]; /* 0x9c0 */
+};
+
+static struct zynqmp_header zynqmpimage_header;
+
+static uint32_t zynqmpimage_checksum(struct zynqmp_header *ptr)
+{
+	uint32_t checksum = 0;
+
+	if (ptr == NULL)
+		return 0;
+
+	checksum += le32_to_cpu(ptr->width_detection);
+	checksum += le32_to_cpu(ptr->image_identifier);
+	checksum += le32_to_cpu(ptr->encryption);
+	checksum += le32_to_cpu(ptr->image_load);
+	checksum += le32_to_cpu(ptr->image_offset);
+	checksum += le32_to_cpu(ptr->pfw_image_length);
+	checksum += le32_to_cpu(ptr->total_pfw_image_length);
+	checksum += le32_to_cpu(ptr->image_size);
+	checksum += le32_to_cpu(ptr->image_stored_size);
+	checksum += le32_to_cpu(ptr->image_attributes);
+	checksum = ~checksum;
+
+	return cpu_to_le32(checksum);
+}
+
+static void zynqmpimage_default_header(struct zynqmp_header *ptr)
+{
+	int i;
+
+	if (ptr == NULL)
+		return;
+
+	ptr->width_detection = HEADER_WIDTHDETECTION;
+	ptr->image_attributes = 0x800;
+	ptr->image_identifier = HEADER_IMAGEIDENTIFIER;
+	ptr->encryption = cpu_to_le32(ENCRYPTION_NONE);
+
+	/* Setup not-supported/constant/reserved fields */
+	for (i = 0; i < HEADER_INTERRUPT_VECTORS; i++)
+		ptr->interrupt_vectors[i] = HEADER_INTERRUPT_DEFAULT;
+
+	for (i = 0; i < HEADER_REGINITS; i++) {
+		ptr->register_init[i].address = HEADER_REGINIT_NULL;
+		ptr->register_init[i].data = 0;
+	}
+
+	/*
+	 * Certain reserved fields are required to be set to 0, ensure they are
+	 * set as such.
+	 */
+	ptr->pfw_image_length = 0x0;
+	ptr->total_pfw_image_length = 0x0;
+}
+
+/* mkimage glue functions */
+static int zynqmpimage_verify_header(unsigned char *ptr, int image_size,
+		struct image_tool_params *params)
+{
+	struct zynqmp_header *zynqhdr = (struct zynqmp_header *)ptr;
+
+	if (image_size < sizeof(struct zynqmp_header))
+		return -1;
+
+	if (zynqhdr->width_detection != HEADER_WIDTHDETECTION)
+		return -1;
+	if (zynqhdr->image_identifier != HEADER_IMAGEIDENTIFIER)
+		return -1;
+
+	if (zynqmpimage_checksum(zynqhdr) != zynqhdr->checksum)
+		return -1;
+
+	return 0;
+}
+
+static void zynqmpimage_print_header(const void *ptr)
+{
+	struct zynqmp_header *zynqhdr = (struct zynqmp_header *)ptr;
+	int i;
+
+	printf("Image Type   : Xilinx Zynq Boot Image support\n");
+	printf("Image Offset : 0x%08x\n", le32_to_cpu(zynqhdr->image_offset));
+	printf("Image Size   : %lu bytes (%lu bytes packed)\n",
+	       (unsigned long)le32_to_cpu(zynqhdr->image_size),
+	       (unsigned long)le32_to_cpu(zynqhdr->image_stored_size));
+	printf("Image Load   : 0x%08x\n", le32_to_cpu(zynqhdr->image_load));
+	printf("Checksum     : 0x%08x\n", le32_to_cpu(zynqhdr->checksum));
+
+	for (i = 0; i < HEADER_INTERRUPT_VECTORS; i++) {
+		if (zynqhdr->interrupt_vectors[i] == HEADER_INTERRUPT_DEFAULT)
+			continue;
+
+		printf("Modified Interrupt Vector Address [%d]: 0x%08x\n", i,
+		       le32_to_cpu(zynqhdr->interrupt_vectors[i]));
+	}
+
+	for (i = 0; i < HEADER_REGINITS; i++) {
+		if (zynqhdr->register_init[i].address == HEADER_REGINIT_NULL)
+			break;
+
+		if (i == 0)
+			printf("Custom Register Initialization:\n");
+
+		printf("    @ 0x%08x -> 0x%08x\n",
+		       le32_to_cpu(zynqhdr->register_init[i].address),
+		       le32_to_cpu(zynqhdr->register_init[i].data));
+	}
+}
+
+static int zynqmpimage_check_params(struct image_tool_params *params)
+{
+	if (!params)
+		return 0;
+
+	if (params->addr != 0x0) {
+		fprintf(stderr, "Error: Load Address cannot be specified.\n");
+		return -1;
+	}
+
+	/*
+	 * If the entry point is specified ensure it is 64 byte aligned.
+	 */
+	if (params->eflag && (params->ep % 64 != 0)) {
+		fprintf(stderr,
+			"Error: Entry Point must be aligned to a 64-byte boundary.\n");
+		return -1;
+	}
+
+	return !(params->lflag || params->dflag);
+}
+
+static int zynqmpimage_check_image_types(uint8_t type)
+{
+	if (type == IH_TYPE_ZYNQMPIMAGE)
+		return EXIT_SUCCESS;
+	return EXIT_FAILURE;
+}
+
+static void zynqmpimage_set_header(void *ptr, struct stat *sbuf, int ifd,
+		struct image_tool_params *params)
+{
+	struct zynqmp_header *zynqhdr = (struct zynqmp_header *)ptr;
+	zynqmpimage_default_header(zynqhdr);
+
+	/* place image directly after header */
+	zynqhdr->image_offset =
+		cpu_to_le32((uint32_t)sizeof(struct zynqmp_header));
+	zynqhdr->image_size = cpu_to_le32(params->file_size -
+					  sizeof(struct zynqmp_header));
+	zynqhdr->image_stored_size = zynqhdr->image_size;
+	zynqhdr->image_load = 0xfffc0000;
+	if (params->eflag)
+		zynqhdr->image_load = cpu_to_le32((uint32_t)params->ep);
+
+	zynqhdr->checksum = zynqmpimage_checksum(zynqhdr);
+}
+
+U_BOOT_IMAGE_TYPE(
+	zynqmpimage,
+	"Xilinx ZynqMP Boot Image support",
+	sizeof(struct zynqmp_header),
+	(void *)&zynqmpimage_header,
+	zynqmpimage_check_params,
+	zynqmpimage_verify_header,
+	zynqmpimage_print_header,
+	zynqmpimage_set_header,
+	NULL,
+	zynqmpimage_check_image_types,
+	NULL,
+	NULL
+);