From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id F379DC021AA for ; Wed, 19 Feb 2025 20:23:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-ID:Date :Subject:Cc:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=nid48bLhH/FBJHEXa989rxTIHzZsjgSmLvJWm4cud1Q=; b=LL8gOs5TyE1DQQ+1/MvSGoK+JJ L1NqNiAy8EEkdSocsw9yejjzloADHiCP5fGJuh+4mJbbLGjPAfSI9iyBuVE0HxCuLyOFAWE79jHWQ H5I6FWXiOPIbR108EVU5XDFkIj52rCWDfl0d83QmknAYt0nzqW9/na0bZiZrrfRLsW5u58UoZ5A+8 vqJgbtY9xp66YOS0RZ+Rtolnv7JE12DgCGoimJgKJXco+vsvmdxCMMSg9UVXWqxesPO2AY+DejFXa 2xabgKQxPmEf86tW6MWxjFJG3zkuw8jBCwhLEevxkIrW+EOWgnA/shqZO4wWPgCn7UkcKz8mdsot9 pQ1/Xd1g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkqbV-0000000Eree-24tY; Wed, 19 Feb 2025 20:23:33 +0000 Received: from mail-wm1-x330.google.com ([2a00:1450:4864:20::330]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkqZz-0000000ErIO-3s9s; Wed, 19 Feb 2025 20:22:02 +0000 Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-439950a45daso946225e9.2; Wed, 19 Feb 2025 12:21:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739996518; x=1740601318; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=nid48bLhH/FBJHEXa989rxTIHzZsjgSmLvJWm4cud1Q=; b=OhppFAxqtbebAiJTFQtln1VBHhNBU5G+1v7/4GnagzMrBXlJzzeq7eIilWZKrCCqdr etFaO9GNaXsasIcQKvqOJ+I4PLS4OyeQV0g7A5zWydupkjuL9MKg7Yvum/JEndNPwuWe mqUbPUhTJxpJFnecCqBiq3V7wVO76NMw8ldyz/+ECpf17e2LvEmAdrB7lxVXFRqy5O3U bRo+BfKQJu14v3d7MZmsDAaCF/q29tjGwWyt6F3tInUFyvV5k9LgkylkEuK2MM0nmPrL 5eLq33qahq34Jb/UlLO68zKrFYX1POb7j4aHwKujgIftfzgTFeldCqBbruBtx39H6WQ/ 7xmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739996518; x=1740601318; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nid48bLhH/FBJHEXa989rxTIHzZsjgSmLvJWm4cud1Q=; b=xHJPJdof9yyinf8f6B4R1dOTaVi6sgj0ejIkBN8qENbio9tZTeJWF9pVFD0eoG7tQc +PYAj1wV1A3NxUacU5KyI1OT4Rj2MrJCurtduLpQCWacdZYh1EaBckR10JaszWwnlbH/ cS8ImZlGcThw72ESjdBT5CmEAL4+e2YpEPEFXgyTb9cKXMnkWjMsTDqILTN0MWdvQJMq 03b4nx9Cv9dlxCsXKOJmB82prZaAInKAQXYCqHF6VAokOKNz8NRCCbBnUTt6KAvMlq4b hrMLEv6oalrS8uySuDHqvE5BPasUx7VMzv0wvoBlcrKfnp/FGgFI1fQ8lhFxLWkwbztW mI8w== X-Forwarded-Encrypted: i=1; AJvYcCViMn4ErYdWU3ogyIeZfZ+3KqjZNaaCRZT5fPNtnTo+QNyhIlmIYKsRLU0DNFEzOzwAb64YG1hssP87xHxO7FOn@lists.infradead.org, AJvYcCWO0kknWx3TkR6zdKaQBisAn4xsmT2yJaDCTu7vbB9hMPWkonwQ4H1rbZmQ7/kUQqtOzyylV6oGcouXppg=@lists.infradead.org, AJvYcCWribg83OV817+8Dpp8m6d6zRrFV5rL4Lj4oGuHeUhNrpkBdEk6//EKAH97hwYW6qF2ujrrRlNx5C/U@lists.infradead.org X-Gm-Message-State: AOJu0YxLLV+MeJXutuj1nzINQ05WflI556U6l+/lKqRJsPDQbop0KSTn w8qM/u2PkPw8C5H484GKrR9ZBpfwi+/fjpyB6YJPwnQQu7TCgbwm X-Gm-Gg: ASbGnctWO+ucWl8rmZxfAuD+at2KiRKzyM49GhT7BMMi9+W81v+0u/2YJ/2U4C9ouJJ 5y9BCnlzhlpK9JOFxE6QidygS5km+UM8ytsQ/A1exF7oab/6I3SOILrM+rm1940FLl0Znds4Nj8 555VUnui2F9df6R4BI7OVAsj0IpqMgPmImGMn49Xo2o5DGoC8P3JqNhw7ji4nszxhlwwT1TmtmK sGbCPKU4iy3Sdy16S92H04FrrRnTASFK/iULmnKh9re8L7OC4d7QZfaztxTgnE8zOz0Y/ztq/a+ GplLdPrHDtLKkJdWRrIxQTPrJD+D6vxA3flDjyrYbcIXzuUgbJ4gvsy3Xy0BnupmJ0E= X-Google-Smtp-Source: AGHT+IE6IeUem5aMOtu5jChHWDBa5MTCtBbguS6zGTJ5rDfVtK+EJKsOG90m0rn5aiIOqr+ekOeGNQ== X-Received: by 2002:a05:600c:3b12:b0:439:96b2:e9b with SMTP id 5b1f17b1804b1-43996b212d9mr63124255e9.9.1739996517331; Wed, 19 Feb 2025 12:21:57 -0800 (PST) Received: from jernej-laptop.localnet (86-58-6-171.dynamic.telemach.net. [86.58.6.171]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38f259d9be9sm19015747f8f.79.2025.02.19.12.21.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Feb 2025 12:21:56 -0800 (PST) From: Jernej =?UTF-8?B?xaBrcmFiZWM=?= To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen-Yu Tsai , Samuel Holland , Linus Walleij , Philipp Zabel , Maxime Ripard , Andras Szemzo Cc: Vinod Koul , Kishon Vijay Abraham I , Ulf Hansson , Paul Walmsley , Palmer Dabbelt , Albert Ou , Uwe =?UTF-8?B?S2xlaW5lLUvDtm5pZw==?= , Florian Fainelli , linux-clk@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-gpio@vger.kernel.org, linux-pm@vger.kernel.org, linux-riscv@lists.infradead.org Subject: Re: [PATCH v2 04/10] clk: sunxi-ng: add CCU drivers for V853 Date: Wed, 19 Feb 2025 21:21:54 +0100 Message-ID: <3596612.V25eIC5XRa@jernej-laptop> In-Reply-To: <20250205125225.1152849-5-szemzo.andras@gmail.com> References: <20250205125225.1152849-1-szemzo.andras@gmail.com> <20250205125225.1152849-5-szemzo.andras@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250219_122159_986472_FF1A52E5 X-CRM114-Status: GOOD ( 26.47 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Dne sreda, 5. februar 2025 ob 13:52:19 Srednjeevropski standardni =C4=8Das = je Andras Szemzo napisal(a): > V853 has similar gates/resets like existing Allwinner SOCs. Add support f= or it's CCU and PRCM CCU. >=20 > Signed-off-by: Andras Szemzo > --- > drivers/clk/sunxi-ng/Kconfig | 10 + > drivers/clk/sunxi-ng/Makefile | 4 + > drivers/clk/sunxi-ng/ccu-sun8i-v853-r.c | 120 +++ > drivers/clk/sunxi-ng/ccu-sun8i-v853-r.h | 14 + > drivers/clk/sunxi-ng/ccu-sun8i-v853.c | 1145 +++++++++++++++++++++++ > drivers/clk/sunxi-ng/ccu-sun8i-v853.h | 14 + > 6 files changed, 1307 insertions(+) > create mode 100644 drivers/clk/sunxi-ng/ccu-sun8i-v853-r.c > create mode 100644 drivers/clk/sunxi-ng/ccu-sun8i-v853-r.h > create mode 100644 drivers/clk/sunxi-ng/ccu-sun8i-v853.c > create mode 100644 drivers/clk/sunxi-ng/ccu-sun8i-v853.h >=20 > diff --git a/drivers/clk/sunxi-ng/Kconfig b/drivers/clk/sunxi-ng/Kconfig > index b547198a2c65..e257373177e0 100644 > --- a/drivers/clk/sunxi-ng/Kconfig > +++ b/drivers/clk/sunxi-ng/Kconfig > @@ -12,6 +12,16 @@ config SUNIV_F1C100S_CCU > default y > depends on MACH_SUNIV || COMPILE_TEST > =20 > +config SUN8I_V853_CCU > + tristate "Support for the Allwinner V853/V851s/V851SE CCU" > + default MACH_SUN8I > + depends on MACH_SUN8I || COMPILE_TEST > + > +config SUN8I_V853_R_CCU > + tristate "Support for the Allwinner V853/V851s/V851SE PRCM CCU" > + default MACH_SUN8I > + depends on MACH_SUN8I || COMPILE_TEST Generally, this are two patches, one for each driver. > + > config SUN20I_D1_CCU > tristate "Support for the Allwinner D1/R528/T113 CCU" > default y > diff --git a/drivers/clk/sunxi-ng/Makefile b/drivers/clk/sunxi-ng/Makefile > index 6b3ae2b620db..b87928462e15 100644 > --- a/drivers/clk/sunxi-ng/Makefile > +++ b/drivers/clk/sunxi-ng/Makefile > @@ -25,6 +25,8 @@ sunxi-ccu-y +=3D ccu_mp.o > =20 > # SoC support > obj-$(CONFIG_SUNIV_F1C100S_CCU) +=3D suniv-f1c100s-ccu.o > +obj-$(CONFIG_SUN8I_V853_CCU) +=3D sun8i-v853-ccu.o > +obj-$(CONFIG_SUN8I_V853_R_CCU) +=3D sun8i-v853-r-ccu.o Put it to other sun8i drivers. > obj-$(CONFIG_SUN20I_D1_CCU) +=3D sun20i-d1-ccu.o > obj-$(CONFIG_SUN20I_D1_R_CCU) +=3D sun20i-d1-r-ccu.o > obj-$(CONFIG_SUN50I_A64_CCU) +=3D sun50i-a64-ccu.o > @@ -50,6 +52,8 @@ obj-$(CONFIG_SUN9I_A80_CCU) +=3D sun9i-a80-de-ccu.o > obj-$(CONFIG_SUN9I_A80_CCU) +=3D sun9i-a80-usb-ccu.o > =20 > suniv-f1c100s-ccu-y +=3D ccu-suniv-f1c100s.o > +sun8i-v853-ccu-y +=3D ccu-sun8i-v853.o > +sun8i-v853-r-ccu-y +=3D ccu-sun8i-v853-r.o Ditto. > sun20i-d1-ccu-y +=3D ccu-sun20i-d1.o > sun20i-d1-r-ccu-y +=3D ccu-sun20i-d1-r.o > sun50i-a64-ccu-y +=3D ccu-sun50i-a64.o > diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v853-r.c b/drivers/clk/sunxi-= ng/ccu-sun8i-v853-r.c > new file mode 100644 > index 000000000000..bd60e00cda7f > --- /dev/null > +++ b/drivers/clk/sunxi-ng/ccu-sun8i-v853-r.c > @@ -0,0 +1,120 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (C) 2025 Andras Szemzo > + * > + * Based on ccu-sun20i-d1-r.c by Samuel Holland. > + */ > + > +#include > +#include > +#include > + > +#include "ccu_common.h" > +#include "ccu_reset.h" > + > +#include "ccu_gate.h" > +#include "ccu_mp.h" > + > +#include "ccu-sun8i-v853-r.h" > + > +static const struct clk_parent_data r_ahb_apb0_parents[] =3D { > + { .fw_name =3D "hosc" }, > + { .fw_name =3D "losc" }, > + { .fw_name =3D "iosc" }, > + { .fw_name =3D "pll-periph" }, > + { .fw_name =3D "pll-audio" } > +}; > + > +static SUNXI_CCU_MP_DATA_WITH_MUX(r_ahb_clk, "r-ahb", > + r_ahb_apb0_parents, 0x000, > + 0, 5, /* M */ > + 8, 2, /* P */ > + 24, 3, /* mux */ > + 0); > +static const struct clk_hw *r_ahb_hw =3D &r_ahb_clk.common.hw; > + > +static SUNXI_CCU_MP_DATA_WITH_MUX(r_apb0_clk, "r-apb0", > + r_ahb_apb0_parents, 0x00c, > + 0, 5, /* M */ > + 8, 2, /* P */ > + 24, 3, /* mux */ > + 0); > +static const struct clk_hw *r_apb0_hw =3D &r_apb0_clk.common.hw; Where can I look for above clocks? There are not described in BSP driver. > + > +static SUNXI_CCU_GATE_HWS(bus_r_twd_clk, "bus-r-twd", &r_apb0_hw,=20 > + 0x12c, BIT(0), 0); > +static SUNXI_CCU_GATE_HWS(bus_r_ppu_clk, "bus-r-ppu", &r_apb0_hw, > + 0x1ac, BIT(0), 0); > +static SUNXI_CCU_GATE_HWS(bus_r_rtc_clk, "bus-r-rtc", &r_ahb_hw, > + 0x20c, BIT(0), 0); > +static SUNXI_CCU_GATE_HWS(bus_r_cpucfg_clk, "bus-r-cpucfg", &r_apb0_hw, > + 0x22c, BIT(0), 0); > + > +static struct ccu_common *sun8i_v853_r_ccu_clks[] =3D { > + &r_ahb_clk.common, > + &r_apb0_clk.common, > + &bus_r_twd_clk.common, > + &bus_r_ppu_clk.common, > + &bus_r_rtc_clk.common, > + &bus_r_cpucfg_clk.common, > +}; > + > +static struct clk_hw_onecell_data sun8i_v853_r_hw_clks =3D { > + .num =3D CLK_NUMBER, > + .hws =3D { > + [CLK_R_AHB] =3D &r_ahb_clk.common.hw, > + [CLK_R_APB0] =3D &r_apb0_clk.common.hw, > + [CLK_BUS_R_TWD] =3D &bus_r_twd_clk.common.hw, > + [CLK_BUS_R_PPU] =3D &bus_r_ppu_clk.common.hw, > + [CLK_BUS_R_RTC] =3D &bus_r_rtc_clk.common.hw, > + [CLK_BUS_R_CPUCFG] =3D &bus_r_cpucfg_clk.common.hw, > + }, > +}; > + > +static const struct ccu_reset_map sun8i_v853_r_ccu_resets[] =3D { > + [RST_BUS_R_TWD] =3D { 0x12c, BIT(16) }, Where did you get that? BSP driver that I checked doesn't mentions it. > + [RST_BUS_R_PPU] =3D { 0x1ac, BIT(16) }, > + [RST_BUS_R_RTC] =3D { 0x20c, BIT(16) }, > + [RST_BUS_R_CPUCFG] =3D { 0x22c, BIT(16) }, > +}; > + > +static const struct sunxi_ccu_desc sun8i_v853_r_ccu_desc =3D { > + .ccu_clks =3D sun8i_v853_r_ccu_clks, > + .num_ccu_clks =3D ARRAY_SIZE(sun8i_v853_r_ccu_clks), > + > + .hw_clks =3D &sun8i_v853_r_hw_clks, > + > + .resets =3D sun8i_v853_r_ccu_resets, > + .num_resets =3D ARRAY_SIZE(sun8i_v853_r_ccu_resets), > +}; > + > +static int sun8i_v853_r_ccu_probe(struct platform_device *pdev) > +{ > + void __iomem *reg; > + > + reg =3D devm_platform_ioremap_resource(pdev, 0); > + if (IS_ERR(reg)) > + return PTR_ERR(reg); > + > + return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun8i_v853_r_ccu_desc); > +} > + > +static const struct of_device_id sun8i_v853_r_ccu_ids[] =3D { > + { .compatible =3D "allwinner,sun8i-v853-r-ccu" }, > + { } > +}; > +MODULE_DEVICE_TABLE(of, sun8i_v853_r_ccu_ids); > + > +static struct platform_driver sun8i_v853_r_ccu_driver =3D { > + .probe =3D sun8i_v853_r_ccu_probe, > + .driver =3D { > + .name =3D "sun8i-v853-r-ccu", > + .suppress_bind_attrs =3D true, > + .of_match_table =3D sun8i_v853_r_ccu_ids, > + }, > +}; > +module_platform_driver(sun8i_v853_r_ccu_driver); > + > +MODULE_IMPORT_NS("SUNXI_CCU"); > +MODULE_DESCRIPTION("Support for the Allwinner V853 PRCM CCU"); > +MODULE_LICENSE("GPL"); > diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v853-r.h b/drivers/clk/sunxi-= ng/ccu-sun8i-v853-r.h > new file mode 100644 > index 000000000000..2c6cc7b6f251 > --- /dev/null > +++ b/drivers/clk/sunxi-ng/ccu-sun8i-v853-r.h > @@ -0,0 +1,14 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) 2025 Andras Szemzo > + */ > + > +#ifndef _CCU_SUN8I_V853_R_H > +#define _CCU_SUN8I_V853_R_H > + > +#include > +#include > + > +#define CLK_NUMBER (CLK_BUS_R_CPUCFG + 1) > + > +#endif > diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v853.c b/drivers/clk/sunxi-ng= /ccu-sun8i-v853.c > new file mode 100644 > index 000000000000..4b32f3a913cf > --- /dev/null > +++ b/drivers/clk/sunxi-ng/ccu-sun8i-v853.c > @@ -0,0 +1,1145 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (C) 2025 Andras Szemzo > + * > + * Based on ccu-sun20i-d1.c by Samuel Holland. > + */ > + > +#include > +#include > +#include > +#include > + > +#include "../clk.h" > + > +#include "ccu_common.h" > +#include "ccu_reset.h" > + > +#include "ccu_div.h" > +#include "ccu_gate.h" > +#include "ccu_mp.h" > +#include "ccu_mult.h" > +#include "ccu_nk.h" > +#include "ccu_nkm.h" > +#include "ccu_nkmp.h" > +#include "ccu_nm.h" > + > +#include "ccu-sun8i-v853.h" > + > +static const struct clk_parent_data osc24M[] =3D { > + { .fw_name =3D "hosc" } > +}; > + > +/* > + * For the CPU PLL, the output divider is described as "only for testing" > + * in the user manual. So it's not modelled and forced to 0. > + */ > +#define SUN8I_V853_PLL_CPU_REG 0x000 > + > +static struct ccu_mult pll_cpu_clk =3D { > + .enable =3D BIT(27), > + .lock =3D BIT(28), > + .mult =3D _SUNXI_CCU_MULT_MIN(8, 8, 11), > + .common =3D { > + .reg =3D 0x000, > + .hw.init =3D CLK_HW_INIT_PARENTS_DATA("pll-cpu", osc24M, > + &ccu_mult_ops, > + CLK_SET_RATE_GATE), > + }, > +}; > + > +/* Some PLLs are input * N / div1 / P. Model them as NKMP with no K */ > +#define SUN8I_V853_PLL_DDR_REG 0x010 > +static struct ccu_nkmp pll_ddr_clk =3D { > + .enable =3D BIT(27), > + .lock =3D BIT(28), > + .n =3D _SUNXI_CCU_MULT_MIN(8, 8, 11), > + .m =3D _SUNXI_CCU_DIV(1, 1), /* input divider */ > + .p =3D _SUNXI_CCU_DIV(0, 1), /* output divider */ > + .common =3D { > + .reg =3D 0x010, > + .hw.init =3D CLK_HW_INIT_PARENTS_DATA("pll-ddr", osc24M, > + &ccu_nkmp_ops, > + CLK_SET_RATE_GATE), > + }, > +}; > + > +#define SUN8I_V853_PLL_PERIPH_REG 0x020 > +static struct ccu_nm pll_periph_4x_clk =3D { > + .enable =3D BIT(27), > + .lock =3D BIT(28), > + .n =3D _SUNXI_CCU_MULT_MIN(8, 8, 11), > + .m =3D _SUNXI_CCU_DIV(1, 1), /* input divider */ > + .common =3D { > + .reg =3D 0x020, > + .hw.init =3D CLK_HW_INIT_PARENTS_DATA("pll-periph-4x", osc24M, > + &ccu_nm_ops, > + CLK_SET_RATE_GATE), > + }, > +}; > + > +static const struct clk_hw *pll_periph_4x_hws[] =3D { > + &pll_periph_4x_clk.common.hw > +}; > + > +static SUNXI_CCU_M_HWS(pll_periph_2x_clk, "pll-periph-2x", pll_periph_4x= _hws, > + 0x020, 16, 3, 0); > + > +static SUNXI_CCU_M_HWS(pll_periph_800M_clk, "pll-periph-800M", pll_perip= h_4x_hws, > + 0x020, 20, 3, 0); > + > +static SUNXI_CCU_M_HWS(pll_periph_480M_clk, "pll-periph-480M", pll_perip= h_4x_hws, > + 0x020, 2, 3, 0); > + > +static CLK_FIXED_FACTOR_HW(pll_periph_600M_clk, "pll-periph-600M", > + &pll_periph_2x_clk.common.hw, 2, 1, 0); > + > +static CLK_FIXED_FACTOR_HW(pll_periph_400M_clk, "pll-periph-400M", > + &pll_periph_2x_clk.common.hw, 3, 1, 0); > + > +static CLK_FIXED_FACTOR_HW(pll_periph_300M_clk, "pll-periph-300M", > + &pll_periph_600M_clk.hw, 2, 1, 0); > + > +static CLK_FIXED_FACTOR_HW(pll_periph_200M_clk, "pll-periph-200M", > + &pll_periph_400M_clk.hw, 2, 1, 0); > + > +static CLK_FIXED_FACTOR_HW(pll_periph_160M_clk, "pll-periph-160M", > + &pll_periph_480M_clk.common.hw, 3, 1, 0); > + > +static CLK_FIXED_FACTOR_HW(pll_periph_150M_clk, "pll-periph-150M", > + &pll_periph_300M_clk.hw, 2, 1, 0); > + > +/* > + * For Video PLLs, the output divider is described as "only for testing" > + * in the user manual. > + */ > +#define SUN8I_V853_PLL_VIDEO_REG 0x040 > +static struct ccu_nkmp pll_video_4x_clk =3D { > + .enable =3D BIT(27), > + .lock =3D BIT(28), > + .n =3D _SUNXI_CCU_MULT_MIN(8, 8, 11), > + .p =3D _SUNXI_CCU_DIV(1, 1), /* input divider */ > + .common =3D { > + .reg =3D 0x040, > + .hw.init =3D CLK_HW_INIT_PARENTS_DATA("pll-video-4x", osc24M, > + &ccu_nkmp_ops, > + CLK_SET_RATE_GATE), > + }, > +}; > + > +static const struct clk_hw *pll_video_4x_hws[] =3D { > + &pll_video_4x_clk.common.hw > +}; > +static CLK_FIXED_FACTOR_HWS(pll_video_2x_clk, "pll-video-2x", > + pll_video_4x_hws, 2, 1, CLK_SET_RATE_PARENT); > +static CLK_FIXED_FACTOR_HWS(pll_video_1x_clk, "pll-video-1x", > + pll_video_4x_hws, 4, 1, CLK_SET_RATE_PARENT); > + > + > +/* > + * For CSI PLLs, the output divider is described as "only for testing" > + * in the user manual. > + */ > +#define SUN8I_V853_PLL_CSI_REG 0x048 > +static struct ccu_nkmp pll_csi_4x_clk =3D { > + .enable =3D BIT(27), > + .lock =3D BIT(28), > + .n =3D _SUNXI_CCU_MULT_MIN(8, 8, 11), > + .p =3D _SUNXI_CCU_DIV(1, 1), /* input divider */ > + .common =3D { > + .reg =3D 0x048, > + .hw.init =3D CLK_HW_INIT_PARENTS_DATA("pll-csi-4x", osc24M, > + &ccu_nkmp_ops, > + CLK_SET_RATE_GATE), > + }, > +}; > + > +static CLK_FIXED_FACTOR_HW(pll_csi_clk, "pll-csi", > + &pll_csi_4x_clk.common.hw, 4, 1, CLK_SET_RATE_PARENT); > + > + > +#define SUN8I_V853_PLL_AUDIO_REG 0x078 > +static struct ccu_sdm_setting pll_audio_div5_sdm_table[] =3D { > + { .rate =3D 196608000, .pattern =3D 0xc001eb85, .m =3D 5, .n =3D 40 }, = /* 24.576 */ > + { .rate =3D 67737600, .pattern =3D 0xc001288d, .m =3D 8, .n =3D 22 }, /= * 22.5792 */ > +}; > + > +static struct ccu_nm pll_audio_div5_clk =3D { > + .enable =3D BIT(27), > + .lock =3D BIT(28), > + .n =3D _SUNXI_CCU_MULT(8, 8), > + .m =3D _SUNXI_CCU_DIV(20, 3), > + .sdm =3D _SUNXI_CCU_SDM(pll_audio_div5_sdm_table, > + BIT(24), 0x0178, BIT(31)), > + .common =3D { > + .reg =3D 0x0078, > + .features =3D CCU_FEATURE_SIGMA_DELTA_MOD, > + .hw.init =3D CLK_HW_INIT_PARENTS_DATA("pll-audio-div5", osc24M, > + &ccu_nm_ops, > + CLK_SET_RATE_UNGATE), > + }, > +}; > + > +static const struct clk_hw *pll_audio_div5_hws[] =3D { > + &pll_audio_div5_clk.common.hw > +}; > + > +static SUNXI_CCU_M_HWS(pll_audio_1x_clk, "pll-audio-1x", pll_audio_div5_= hws, > + 0xe00, 0, 5, CLK_SET_RATE_PARENT); > + > +/* pll-audio-div2 and pll-audio-4x not used, because pll-audio-1x can co= ver=20 > + * 22.5792M and 24.576M=20 > + */ > +static SUNXI_CCU_M(pll_audio_div2_clk, "pll-audio-div2", "pll-audio", > + 0x078, 16, 3, 0); > +static SUNXI_CCU_M(pll_audio_4x_clk, "pll-audio-4x", "pll-audio-div2", > + 0xe00, 5, 5, 0); > + > +/* > + * For the NPU PLL, the output divider is described as "only for testing" > + * in the user manual. > + */ > +#define SUN8I_V853_PLL_NPU_REG 0x080 > +static struct ccu_nkmp pll_npu_4x_clk =3D { > + .enable =3D BIT(27), > + .lock =3D BIT(28), > + .n =3D _SUNXI_CCU_MULT_MIN(8, 8, 11), > + .p =3D _SUNXI_CCU_DIV(1, 1), /* input divider */ > + .common =3D { > + .reg =3D 0x080, > + .hw.init =3D CLK_HW_INIT_PARENTS_DATA("pll-npu-4x", osc24M, > + &ccu_nkmp_ops, > + CLK_SET_RATE_UNGATE), > + }, > +}; > + > +/* > + * The CPU gate is not modelled - it is in a separate register (0x504) > + * and has a special key field. The clock must not be gated anyway by > + * the kernel. > + */ > +static const struct clk_parent_data cpu_parents[] =3D { > + { .fw_name =3D "hosc" }, > + { .fw_name =3D "losc" }, > + { .fw_name =3D "iosc" }, > + { .hw =3D &pll_cpu_clk.common.hw }, > + { .hw =3D &pll_periph_600M_clk.hw }, > + { .hw =3D &pll_periph_800M_clk.common.hw }, > +}; > + > +/* > + * There is a P factor (PLL_OUT_EXT_DIVP[17:16]) in this register, but i= t is not modeled. > + * The manual states that it should be used only, when the output clock = is less than 288 MHz. > + */ > +static SUNXI_CCU_MUX_DATA(cpu_clk, "cpu", cpu_parents, > + 0x500, 24, 3, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL); > + > +static const struct clk_hw *cpu_hws[] =3D { &cpu_clk.common.hw }; > + > +static SUNXI_CCU_M_HWS(cpu_axi_clk, "cpu-axi", cpu_hws, > + 0x500, 0, 2, 0); > +static SUNXI_CCU_M_HWS(cpu_apb_clk, "cpu-apb", cpu_hws, > + 0x500, 8, 2, 0); > + > +static const struct clk_parent_data ahb_parents[] =3D { > + { .fw_name =3D "hosc" }, > + { .fw_name =3D "losc" }, > + { .fw_name =3D "iosc" }, > + { .hw =3D &pll_periph_600M_clk.hw }, > +}; > +static SUNXI_CCU_MP_DATA_WITH_MUX(ahb_clk, "ahb", ahb_parents, 0x510, > + 0, 5, /* M */ > + 8, 2, /* P */ > + 24, 2, /* mux */ > + 0); > + > +static SUNXI_CCU_MP_DATA_WITH_MUX(apb0_clk, "apb0", ahb_parents, 0x520, > + 0, 5, /* M */ > + 8, 2, /* P */ > + 24, 2, /* mux */ > + 0); > + > +static SUNXI_CCU_MP_DATA_WITH_MUX(apb1_clk, "apb1", ahb_parents, 0x524, > + 0, 5, /* M */ > + 8, 2, /* P */ > + 24, 2, /* mux */ > + 0); > + > +static const struct clk_hw *ahb_hws[] =3D { &ahb_clk.common.hw }; > +static const struct clk_hw *apb0_hws[] =3D { &apb0_clk.common.hw }; > +static const struct clk_hw *apb1_hws[] =3D { &apb1_clk.common.hw }; > + > + > +static const struct clk_hw *de_g2d_parents[] =3D { > + &pll_periph_300M_clk.hw, > + &pll_video_1x_clk.hw, > +}; > +static SUNXI_CCU_M_HW_WITH_MUX_GATE(de_clk, "de", de_g2d_parents, 0x600, > + 0, 5, /* M */ > + 24, 1, /* mux */ > + BIT(31), /* gate */ > + CLK_SET_RATE_PARENT); > + > +static SUNXI_CCU_GATE_HWS(bus_de_clk, "bus-de", ahb_hws, > + 0x60c, BIT(0), 0); > + > +static SUNXI_CCU_M_HW_WITH_MUX_GATE(g2d_clk, "g2d", de_g2d_parents, 0x63= 0, > + 0, 5, /* M */ > + 24, 1, /* mux */ > + BIT(31), /* gate */ > + CLK_SET_RATE_PARENT); > + > +static SUNXI_CCU_GATE_HWS(bus_g2d_clk, "bus-g2d", ahb_hws, > + 0x63c, BIT(0), 0); > + > + > +static const struct clk_parent_data ce_parents[] =3D { > + { .fw_name =3D "hosc" }, Where this come from? V853 manual v1.1 doesn't have it. > + { .hw =3D &pll_periph_400M_clk.hw, }, > + { .hw =3D &pll_periph_300M_clk.hw, } > +}; > +static SUNXI_CCU_M_DATA_WITH_MUX_GATE(ce_clk, "ce", ce_parents, 0x680, > + 0, 4, /* M */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + CLK_SET_RATE_PARENT); Set rate parent flag doesn't make sense on constant parents. > + > +static SUNXI_CCU_GATE_HWS(bus_ce_clk, "bus-ce", ahb_hws, > + 0x68c, BIT(0) | BIT(1), 0); > + > +static const struct clk_hw *ve_parents[] =3D { > + &pll_periph_300M_clk.hw, > + &pll_periph_400M_clk.hw, > + &pll_periph_480M_clk.common.hw, > + &pll_npu_4x_clk.common.hw, > + &pll_video_4x_clk.common.hw, > + &pll_csi_4x_clk.common.hw, > +}; > +static SUNXI_CCU_M_HW_WITH_MUX_GATE(ve_clk, "ve", ve_parents, 0x690, > + 0, 5, /* M */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + 0); CLK_SET_RATE_PARENT flag? Cedrus driver set working clock at the beginning. > + > +static SUNXI_CCU_GATE_HWS(bus_ve_clk, "bus-ve", ahb_hws, > + 0x69c, BIT(0), 0); > + > + > +static const struct clk_hw *npu_parents[] =3D { > + &pll_periph_480M_clk.common.hw, > + &pll_periph_600M_clk.hw, > + &pll_periph_800M_clk.common.hw, > + &pll_npu_4x_clk.common.hw, > +}; > +static SUNXI_CCU_M_HW_WITH_MUX_GATE(npu_clk, "npu", npu_parents, 0x6e0, > + 0, 5, /* M */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + 0); I think CLK_SET_RATE_PARENT would also be beneficial here. > + > +static SUNXI_CCU_GATE_HWS(bus_npu_clk, "bus-npu", ahb_hws, > + 0x6ec, BIT(0), 0); > + > +static SUNXI_CCU_GATE_HWS(bus_dma_clk, "bus-dma", ahb_hws, > + 0x70c, BIT(0), 0); > + > +static SUNXI_CCU_GATE_HWS(bus_msgbox0_clk, "bus-msgbox0", ahb_hws, > + 0x71c, BIT(0), 0); > +static SUNXI_CCU_GATE_HWS(bus_msgbox1_clk, "bus-msgbox1", ahb_hws, > + 0x71c, BIT(1), 0); > + > +static SUNXI_CCU_GATE_HWS(bus_spinlock_clk, "bus-spinlock", ahb_hws, > + 0x72c, BIT(0), 0); > + > +static SUNXI_CCU_GATE_HWS(bus_hstimer_clk, "bus-hstimer", ahb_hws, > + 0x73c, BIT(0), 0); > + > +static SUNXI_CCU_GATE_DATA(avs_clk, "avs", osc24M, > + 0x740, BIT(31), 0); > + > +static SUNXI_CCU_GATE_HWS(bus_dbg_clk, "bus-dbg", ahb_hws, > + 0x78c, BIT(0), 0); > + > +static SUNXI_CCU_GATE_HWS(bus_pwm_clk, "bus-pwm", apb0_hws, > + 0x7ac, BIT(0), 0); > + > +static SUNXI_CCU_GATE_HWS(bus_iommu_clk, "bus-iommu", ahb_hws, > + 0x7bc, BIT(0), 0); > + > +static const struct clk_hw *dram_parents[] =3D { > + &pll_ddr_clk.common.hw, > + &pll_periph_2x_clk.common.hw, > + &pll_periph_800M_clk.common.hw, > +}; > +static SUNXI_CCU_MP_HW_WITH_MUX_GATE(dram_clk, "dram", dram_parents, 0x8= 00, > + 0, 5, /* M */ > + 8, 2, /* P */ > + 24, 3, /* mux */ > + BIT(31), CLK_IS_CRITICAL); This clock needs update field to be set to actually apply configuration. So same comment as on A523 clock version, this needs new flag to be introduced for such case. > + > +static CLK_FIXED_FACTOR_HW(mbus_clk, "mbus", > + &dram_clk.common.hw, 4, 1, 0); > + > +static const struct clk_hw *mbus_hws[] =3D { &mbus_clk.hw }; > + > +static SUNXI_CCU_GATE_HWS(mbus_dma_clk, "mbus-dma", mbus_hws, > + 0x804, BIT(0), 0); > +static SUNXI_CCU_GATE_HWS(mbus_ve_clk, "mbus-ve", mbus_hws, > + 0x804, BIT(1), 0); > +static SUNXI_CCU_GATE_HWS(mbus_ce_clk, "mbus-ce", mbus_hws, > + 0x804, BIT(2), 0); > +static SUNXI_CCU_GATE_HWS(mbus_csi_clk, "mbus-csi", mbus_hws, > + 0x804, BIT(8), 0); > +static SUNXI_CCU_GATE_HWS(mbus_isp_clk, "mbus-isp", mbus_hws, > + 0x804, BIT(9), 0); > +static SUNXI_CCU_GATE_HWS(mbus_g2d_clk, "mbus-g2d", mbus_hws, > + 0x804, BIT(10), 0); > + > +static SUNXI_CCU_GATE_HWS(bus_dram_clk, "bus-dram", ahb_hws, > + 0x80c, BIT(0), CLK_IS_CRITICAL); > + > + > +static const struct clk_parent_data mmc0_mmc1_parents[] =3D { > + { .fw_name =3D "hosc" }, > + { .hw =3D &pll_periph_400M_clk.hw, }, > + { .hw =3D &pll_periph_300M_clk.hw, }, > +}; Just mmc_parents. > +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(mmc0_clk, "mmc0", mmc0_mmc1_paren= ts, 0x830, > + 0, 4, /* M */ > + 8, 2, /* P */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + 0); > + > +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(mmc1_clk, "mmc1", mmc0_mmc1_paren= ts, 0x834, > + 0, 4, /* M */ > + 8, 2, /* P */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + 0); > + > +static const struct clk_parent_data mmc2_parents[] =3D { > + { .fw_name =3D "hosc" }, > + { .hw =3D &pll_periph_600M_clk.hw, }, > + { .hw =3D &pll_periph_400M_clk.hw, }, > +}; > +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(mmc2_clk, "mmc2", mmc2_parents, 0= x838, > + 0, 4, /* M */ > + 8, 2, /* P */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + 0); > + > +static SUNXI_CCU_GATE_HWS(bus_mmc0_clk, "bus-mmc0", ahb_hws, > + 0x84c, BIT(0), 0); > +static SUNXI_CCU_GATE_HWS(bus_mmc1_clk, "bus-mmc1", ahb_hws, > + 0x84c, BIT(1), 0); > +static SUNXI_CCU_GATE_HWS(bus_mmc2_clk, "bus-mmc2", ahb_hws, > + 0x84c, BIT(2), 0); > + > +static SUNXI_CCU_GATE_HWS(bus_uart0_clk, "bus-uart0", apb1_hws, > + 0x90c, BIT(0), 0); > +static SUNXI_CCU_GATE_HWS(bus_uart1_clk, "bus-uart1", apb1_hws, > + 0x90c, BIT(1), 0); > +static SUNXI_CCU_GATE_HWS(bus_uart2_clk, "bus-uart2", apb1_hws, > + 0x90c, BIT(2), 0); > +static SUNXI_CCU_GATE_HWS(bus_uart3_clk, "bus-uart3", apb1_hws, > + 0x90c, BIT(3), 0); > + > +static SUNXI_CCU_GATE_HWS(bus_i2c0_clk, "bus-i2c0", apb1_hws, > + 0x91c, BIT(0), 0); > +static SUNXI_CCU_GATE_HWS(bus_i2c1_clk, "bus-i2c1", apb1_hws, > + 0x91c, BIT(1), 0); > +static SUNXI_CCU_GATE_HWS(bus_i2c2_clk, "bus-i2c2", apb1_hws, > + 0x91c, BIT(2), 0); > +static SUNXI_CCU_GATE_HWS(bus_i2c3_clk, "bus-i2c3", apb1_hws, > + 0x91c, BIT(3), 0); > +static SUNXI_CCU_GATE_HWS(bus_i2c4_clk, "bus-i2c4", apb1_hws, > + 0x91c, BIT(4), 0); > + > +static const struct clk_parent_data spi_parents[] =3D { > + { .fw_name =3D "hosc" }, > + { .hw =3D &pll_periph_300M_clk.hw, }, > + { .hw =3D &pll_periph_200M_clk.hw, }, > +}; > + > +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(spi0_clk, "spi0", spi_parents, 0x= 940, > + 0, 4, /* M */ > + 8, 2, /* P */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + 0); > + > +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(spi1_clk, "spi1", spi_parents, 0x= 944, > + 0, 4, /* M */ > + 8, 2, /* P */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + 0); > + > +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(spi2_clk, "spi2", spi_parents, 0x= 948, > + 0, 4, /* M */ > + 8, 2, /* P */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + 0); > + > +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(spi3_clk, "spi3", spi_parents, 0x= 94c, > + 0, 4, /* M */ > + 8, 2, /* P */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + 0); > + > +static SUNXI_CCU_GATE_HWS(bus_spi0_clk, "bus-spi0", ahb_hws, > + 0x96c, BIT(0), 0); > +static SUNXI_CCU_GATE_HWS(bus_spi1_clk, "bus-spi1", ahb_hws, > + 0x96c, BIT(1), 0); > +static SUNXI_CCU_GATE_HWS(bus_spi2_clk, "bus-spi2", ahb_hws, > + 0x96c, BIT(2), 0); > +static SUNXI_CCU_GATE_HWS(bus_spi3_clk, "bus-spi3", ahb_hws, > + 0x96c, BIT(3), 0); > + > + > +static const struct clk_parent_data spif_parents[] =3D { > + { .fw_name =3D "hosc" }, > + { .hw =3D &pll_periph_400M_clk.hw, }, > + { .hw =3D &pll_periph_300M_clk.hw, }, > +}; > + > +static SUNXI_CCU_M_DATA_WITH_MUX_GATE(spif_clk, "spif", spif_parents, 0x= 0950, > + 0, 4, /* M */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + CLK_SET_RATE_PARENT); This is MP clock, P being at 9:8. > + > +static SUNXI_CCU_GATE_HWS(bus_spif_clk, "bus-spif", ahb_hws, > + 0x096c, BIT(4), 0); > + > + > +static const struct clk_hw *pll_periph_150M_hws[] =3D { &pll_periph_150M= _clk.hw }; > +static SUNXI_CCU_GATE_HWS_WITH_PREDIV(emac_25M_clk, "emac-25M", pll_peri= ph_150M_hws, > + 0x970, BIT(31) | BIT(30), 6, 0); > + > +static SUNXI_CCU_GATE_HWS(bus_emac_clk, "bus-emac", ahb_hws, > + 0x97c, BIT(0), 0); > + > +static SUNXI_CCU_GATE_HWS(bus_gpadc_clk, "bus-gpadc", apb0_hws, > + 0x9ec, BIT(0), 0); > + > +static SUNXI_CCU_GATE_HWS(bus_ths_clk, "bus-ths", ahb_hws, > + 0x9fc, BIT(0), 0); > + > + > +static const struct clk_hw *audio_parents[] =3D { > + &pll_audio_1x_clk.common.hw, > + &pll_audio_4x_clk.common.hw, > +}; > + > +static SUNXI_CCU_M_HW_WITH_MUX_GATE(i2s0_clk, "i2s0", audio_parents, 0xa= 10, > + 0, 4, /* M */ > + 24, 1, /* mux */ > + BIT(31), /* gate */ > + CLK_SET_RATE_PARENT); > + > +static SUNXI_CCU_M_HW_WITH_MUX_GATE(i2s1_clk, "i2s1", audio_parents, 0xa= 14, > + 0, 4, /* M */ > + 24, 1, /* mux */ > + BIT(31), /* gate */ > + CLK_SET_RATE_PARENT); > + > +static SUNXI_CCU_GATE_HWS(bus_i2s0_clk, "bus-i2s0", ahb_hws, > + 0xa20, BIT(0), 0); > + > +static SUNXI_CCU_GATE_HWS(bus_i2s1_clk, "bus-i2s1", ahb_hws, > + 0xa20, BIT(1), 0); > + > +static SUNXI_CCU_M_HW_WITH_MUX_GATE(dmic_clk, "dmic", audio_parents, 0xa= 40, > + 0, 4, /* M */ > + 24, 1, /* mux */ > + BIT(31), /* gate */ > + CLK_SET_RATE_PARENT); > + > +static SUNXI_CCU_GATE_HWS(bus_dmic_clk, "bus-dmic", ahb_hws, > + 0xa4c, BIT(0), 0); > + > +static SUNXI_CCU_M_HW_WITH_MUX_GATE(audio_codec_dac_clk, "audio-codec-da= c",=20 > + audio_parents, 0xa50, > + 0, 4, /* M */ > + 24, 1, /* mux */ > + BIT(31), /* gate */ > + CLK_SET_RATE_PARENT); > + > +static SUNXI_CCU_M_HW_WITH_MUX_GATE(audio_codec_adc_clk, "audio-codec-ad= c",=20 > + audio_parents, 0xa54, > + 0, 4, /* M */ > + 24, 1, /* mux */ > + BIT(31), /* gate */ > + CLK_SET_RATE_PARENT); > + > +static SUNXI_CCU_GATE_HWS(bus_audio_codec_clk, "bus-audio-codec", apb0_h= ws, > + 0xa5c, BIT(0), 0); > + > +/* > + * There are OHCI 12M clock source selection bits for the USB 2.0 port. > + * We will force them to 0 (12M divided from 48M). > + */ > +static CLK_FIXED_FACTOR_FW_NAME(osc12M_clk, "osc12M", "hosc", 2, 1, 0); > + > +#define SUN8I_V853_USB_CLK_REG 0xa70 > + > +static SUNXI_CCU_GATE(usb_ohci_clk, "usb", "osc12M", 0x0a70, BIT(31), 0); > + > +static SUNXI_CCU_GATE_HWS(bus_ohci_clk, "bus-ohci", ahb_hws, 0xa8c, BIT(= 0), 0); > +static SUNXI_CCU_GATE_HWS(bus_ehci_clk, "bus-ehci", ahb_hws, 0xa8c, BIT(= 4), 0); > +static SUNXI_CCU_GATE_HWS(bus_otg_clk, "bus-otg", ahb_hws, 0xa8c, BIT(8)= , 0); > + > +static SUNXI_CCU_GATE_HWS(bus_dpss_top_clk, "bus-dpss-top", ahb_hws, > + 0xabc, BIT(0), 0); > + > + > +static const struct clk_parent_data mipi_dsi_parents[] =3D { > + { .fw_name =3D "hosc" }, > + { .hw =3D &pll_periph_200M_clk.hw }, > + { .hw =3D &pll_periph_150M_clk.hw }, > +}; > +static SUNXI_CCU_M_DATA_WITH_MUX_GATE(mipi_dsi_clk, "mipi-dsi", mipi_dsi= _parents,=20 > + 0xb24, > + 0, 4, /* M */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + CLK_SET_RATE_PARENT); CLK_SET_RATE_PARENT doesn't do anything for constant clocks. Best regards, Jernej > + > +static SUNXI_CCU_GATE_HWS(bus_mipi_dsi_clk, "bus-mipi-dsi", ahb_hws, > + 0xb4c, BIT(0), 0); > + > + > +static const struct clk_hw *tcon_lcd_parents[] =3D { > + &pll_video_4x_clk.common.hw, > + &pll_periph_2x_clk.common.hw, > + &pll_csi_4x_clk.common.hw, > +}; > +static SUNXI_CCU_MP_HW_WITH_MUX_GATE(tcon_lcd_clk, "tcon-lcd", tcon_lcd_= parents,=20 > + 0xb60, > + 0, 4, /* M */ > + 8, 2, /* P */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + CLK_SET_RATE_PARENT); > + > +static SUNXI_CCU_GATE_HWS(bus_tcon_lcd_clk, "bus-tcon-lcd", ahb_hws, > + 0xb7c, BIT(0), 0); > + > + > +static const struct clk_hw *csi_top_parents[] =3D { > + &pll_periph_300M_clk.hw, > + &pll_periph_400M_clk.hw, > + &pll_video_4x_clk.common.hw, > + &pll_csi_4x_clk.common.hw, > +}; > +static SUNXI_CCU_M_HW_WITH_MUX_GATE(csi_top_clk, "csi-top", csi_top_pare= nts, 0xc04, > + 0, 5, /* M */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + 0); > + > + > +static const struct clk_parent_data csi_mclk_parents[] =3D { > + { .fw_name =3D "hosc" }, > + { .hw =3D &pll_csi_4x_clk.common.hw }, > + { .hw =3D &pll_video_4x_clk.common.hw }, > + { .hw =3D &pll_periph_2x_clk.common.hw }, > +}; > +static SUNXI_CCU_M_DATA_WITH_MUX_GATE(csi_mclk0_clk, "csi-mclk0", csi_mc= lk_parents,=20 > + 0xc08, > + 0, 5, /* M */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + 0); > + > +static SUNXI_CCU_M_DATA_WITH_MUX_GATE(csi_mclk1_clk, "csi-mclk1", csi_mc= lk_parents,=20 > + 0xc0c, > + 0, 5, /* M */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + 0); > + > +static SUNXI_CCU_M_DATA_WITH_MUX_GATE(csi_mclk2_clk, "csi-mclk2", csi_mc= lk_parents,=20 > + 0xc10, > + 0, 5, /* M */ > + 24, 3, /* mux */ > + BIT(31), /* gate */ > + 0); All CSI mclks should be MP type. > + > +static SUNXI_CCU_GATE_HWS(bus_csi_clk, "bus-csi", ahb_hws, > + 0xc2c, BIT(0), 0); > + > + > +static SUNXI_CCU_GATE_HWS(bus_wiegand_clk, "bus-wiegand", ahb_hws, > + 0xc7c, BIT(0), 0); > + > + > +static const struct clk_parent_data riscv_parents[] =3D { > + { .fw_name =3D "hosc" }, > + { .fw_name =3D "losc" }, > + { .fw_name =3D "iosc" }, > + { .hw =3D &pll_periph_600M_clk.hw }, > + { .hw =3D &pll_periph_480M_clk.common.hw }, > + { .hw =3D &pll_cpu_clk.common.hw }, > +}; > +static SUNXI_CCU_M_DATA_WITH_MUX(riscv_clk, "riscv-cpu", riscv_parents, = 0xd00, > + 0, 5, /* M */ > + 24, 3, /* mux */ > + CLK_SET_RATE_PARENT); > + > +/* The riscv-axi clk must be divided by at least 2. */ > +static struct clk_div_table riscv_axi_table[] =3D { > + { .val =3D 1, .div =3D 2 }, > + { .val =3D 2, .div =3D 3 }, > + { .val =3D 3, .div =3D 4 }, > + { /* Sentinel */ } > +}; > +static SUNXI_CCU_DIV_TABLE_HW(riscv_axi_clk, "riscv-axi", &riscv_clk.com= mon.hw, > + 0xd00, 8, 2, riscv_axi_table, 0); > + > +static SUNXI_CCU_GATE_HWS_WITH_KEY(riscv_core_gate, "riscv-core-gate", a= hb_hws, > + 0xd04, BIT(0), 0); > + > +static SUNXI_CCU_GATE_HWS(riscv_cfg_gate, "riscv-cfg-gate", ahb_hws, > + 0xd0c, BIT(0), 0); > + > + > +static const struct clk_hw *pll_periph_160M_hws[] =3D { > + &pll_periph_160M_clk.hw, > +}; > + > +static SUNXI_CCU_GATE_DATA(fanout_24M_clk, "fanout-24M", osc24M, > + 0xf30, BIT(0), 0); > +static SUNXI_CCU_GATE_DATA_WITH_PREDIV(fanout_12M_clk, "fanout-12M", osc= 24M, > + 0xf30, BIT(1), 2, 0); > +static SUNXI_CCU_GATE_HWS_WITH_PREDIV(fanout_16M_clk, "fanout-16M", pll_= periph_160M_hws, > + 0xf30, BIT(2), 10, 0); > +static SUNXI_CCU_GATE_HWS_WITH_PREDIV(fanout_25M_clk, "fanout-25M", pll_= periph_150M_hws, > + 0xf30, BIT(3), 6, 0); > + > + > +/* This clock has a second divider that is not modelled and forced to 0.= */ > +#define SUN8I_V853_FANOUT_27M_REG 0xf34 > +static const struct clk_hw *fanout_27M_parents[] =3D { > + &pll_video_1x_clk.hw, > + &pll_csi_clk.hw, > + &pll_periph_300M_clk.hw, > +}; > +static SUNXI_CCU_M_HW_WITH_MUX_GATE(fanout_27M_clk, "fanout-27M",=20 > + fanout_27M_parents, 0xf34, > + 0, 5, /* M */ > + 24, 2, /* mux */ > + BIT(31), /* gate */ > + 0); > +static SUNXI_CCU_M_HWS_WITH_GATE(fanout_pclk_clk, "fanout-pclk", apb0_hw= s, 0xf38, > + 0, 5, /* M */ > + BIT(31), /* gate */ > + 0); > + > +static const struct clk_parent_data fanout_parents[] =3D { > + { .fw_name =3D "losc" }, > + { .hw =3D &fanout_12M_clk.common.hw }, > + { .hw =3D &fanout_16M_clk.common.hw }, > + { .hw =3D &fanout_24M_clk.common.hw }, > + { .hw =3D &fanout_25M_clk.common.hw }, > + { .hw =3D &fanout_27M_clk.common.hw }, > + { .hw =3D &fanout_pclk_clk.common.hw }, > +}; > + > +static SUNXI_CCU_MUX_DATA_WITH_GATE(fanout0_clk, "fanout0", fanout_paren= ts, 0xf3c, > + 0, 3, /* mux */ > + BIT(21), /* gate */ > + 0); > +static SUNXI_CCU_MUX_DATA_WITH_GATE(fanout1_clk, "fanout1", fanout_paren= ts, 0xf3c, > + 3, 3, /* mux */ > + BIT(22), /* gate */ > + 0); > +static SUNXI_CCU_MUX_DATA_WITH_GATE(fanout2_clk, "fanout2", fanout_paren= ts, 0xf3c, > + 6, 3, /* mux */ > + BIT(23), /* gate */ > + 0); > + > + > +static struct ccu_common *sun8i_v853_ccu_clks[] =3D { > + &pll_cpu_clk.common, > + &pll_ddr_clk.common, > + &pll_periph_4x_clk.common, > + &pll_periph_2x_clk.common, > + &pll_periph_800M_clk.common, > + &pll_periph_480M_clk.common, > + &pll_video_4x_clk.common, > + &pll_csi_4x_clk.common, > + &pll_audio_div2_clk.common, > + &pll_audio_div5_clk.common, > + &pll_audio_4x_clk.common, > + &pll_audio_1x_clk.common, > + &pll_npu_4x_clk.common, > + &cpu_clk.common, > + &cpu_axi_clk.common, > + &cpu_apb_clk.common, > + &ahb_clk.common, > + &apb0_clk.common, > + &apb1_clk.common, > + &de_clk.common, > + &bus_de_clk.common, > + &g2d_clk.common, > + &bus_g2d_clk.common, > + &ce_clk.common, > + &bus_ce_clk.common, > + &ve_clk.common, > + &bus_ve_clk.common, > + &npu_clk.common, > + &bus_npu_clk.common, > + &bus_dma_clk.common, > + &bus_msgbox0_clk.common, > + &bus_msgbox1_clk.common, > + &bus_spinlock_clk.common, > + &bus_hstimer_clk.common, > + &avs_clk.common, > + &bus_dbg_clk.common, > + &bus_pwm_clk.common, > + &bus_iommu_clk.common, > + &dram_clk.common, > + &mbus_dma_clk.common, > + &mbus_ve_clk.common, > + &mbus_ce_clk.common, > + &mbus_csi_clk.common, > + &mbus_isp_clk.common, > + &mbus_g2d_clk.common, > + &bus_dram_clk.common, > + &mmc0_clk.common, > + &mmc1_clk.common, > + &mmc2_clk.common, > + &bus_mmc0_clk.common, > + &bus_mmc1_clk.common, > + &bus_mmc2_clk.common, > + &bus_uart0_clk.common, > + &bus_uart1_clk.common, > + &bus_uart2_clk.common, > + &bus_uart3_clk.common, > + &bus_i2c0_clk.common, > + &bus_i2c1_clk.common, > + &bus_i2c2_clk.common, > + &bus_i2c3_clk.common, > + &bus_i2c4_clk.common, > + &spi0_clk.common, > + &spi1_clk.common, > + &spi2_clk.common, > + &spi3_clk.common, > + &bus_spi0_clk.common, > + &bus_spi1_clk.common, > + &bus_spi2_clk.common, > + &bus_spi3_clk.common, > + &spif_clk.common, > + &bus_spif_clk.common, > + &emac_25M_clk.common, > + &bus_emac_clk.common, > + &bus_gpadc_clk.common, > + &bus_ths_clk.common, > + &usb_ohci_clk.common, > + &bus_ohci_clk.common, > + &bus_ehci_clk.common, > + &bus_otg_clk.common, > + &i2s0_clk.common, > + &i2s1_clk.common, > + &bus_i2s0_clk.common, > + &bus_i2s1_clk.common, > + &dmic_clk.common, > + &bus_dmic_clk.common, > + &audio_codec_dac_clk.common, > + &audio_codec_adc_clk.common, > + &bus_audio_codec_clk.common, > + &bus_dpss_top_clk.common, > + &mipi_dsi_clk.common, > + &bus_mipi_dsi_clk.common, > + &tcon_lcd_clk.common, > + &bus_tcon_lcd_clk.common, > + &csi_top_clk.common, > + &csi_mclk0_clk.common, > + &csi_mclk1_clk.common, > + &csi_mclk2_clk.common, > + &bus_csi_clk.common, > + &bus_wiegand_clk.common, > + &riscv_clk.common, > + &riscv_axi_clk.common, > + &riscv_core_gate.common, > + &riscv_cfg_gate.common, > + &fanout_24M_clk.common, > + &fanout_12M_clk.common, > + &fanout_16M_clk.common, > + &fanout_25M_clk.common, > + &fanout_27M_clk.common, > + &fanout_pclk_clk.common, > + &fanout0_clk.common, > + &fanout1_clk.common, > + &fanout2_clk.common, > +}; > + > +static struct clk_hw_onecell_data sun8i_v853_hw_clks =3D { > + .num =3D CLK_NUMBER, > + .hws =3D { > + [CLK_OSC12M] =3D &osc12M_clk.hw, > + [CLK_PLL_CPU] =3D &pll_cpu_clk.common.hw, > + [CLK_PLL_DDR] =3D &pll_ddr_clk.common.hw, > + [CLK_PLL_PERIPH_4X] =3D &pll_periph_4x_clk.common.hw, > + [CLK_PLL_PERIPH_2X] =3D &pll_periph_2x_clk.common.hw, > + [CLK_PLL_PERIPH_800M] =3D &pll_periph_800M_clk.common.hw, > + [CLK_PLL_PERIPH_480M] =3D &pll_periph_480M_clk.common.hw, > + [CLK_PLL_PERIPH_600M] =3D &pll_periph_600M_clk.hw, > + [CLK_PLL_PERIPH_400M] =3D &pll_periph_400M_clk.hw, > + [CLK_PLL_PERIPH_300M] =3D &pll_periph_300M_clk.hw, > + [CLK_PLL_PERIPH_200M] =3D &pll_periph_200M_clk.hw, > + [CLK_PLL_PERIPH_160M] =3D &pll_periph_160M_clk.hw, > + [CLK_PLL_PERIPH_150M] =3D &pll_periph_150M_clk.hw, > + [CLK_PLL_VIDEO_4X] =3D &pll_video_4x_clk.common.hw, > + [CLK_PLL_VIDEO_2X] =3D &pll_video_2x_clk.hw, > + [CLK_PLL_VIDEO_1X] =3D &pll_video_1x_clk.hw, > + [CLK_PLL_CSI_4X] =3D &pll_csi_4x_clk.common.hw, > + [CLK_PLL_AUDIO_DIV2] =3D &pll_audio_div2_clk.common.hw, > + [CLK_PLL_AUDIO_DIV5] =3D &pll_audio_div5_clk.common.hw, > + [CLK_PLL_AUDIO_4X] =3D &pll_audio_4x_clk.common.hw, > + [CLK_PLL_AUDIO_1X] =3D &pll_audio_1x_clk.common.hw, > + [CLK_PLL_NPU_4X] =3D &pll_npu_4x_clk.common.hw, > + [CLK_CPU] =3D &cpu_clk.common.hw, > + [CLK_CPU_AXI] =3D &cpu_axi_clk.common.hw, > + [CLK_CPU_APB] =3D &cpu_apb_clk.common.hw, > + [CLK_AHB] =3D &ahb_clk.common.hw, > + [CLK_APB0] =3D &apb0_clk.common.hw, > + [CLK_APB1] =3D &apb1_clk.common.hw, > + [CLK_MBUS] =3D &mbus_clk.hw, > + [CLK_DE] =3D &de_clk.common.hw, > + [CLK_BUS_DE] =3D &bus_de_clk.common.hw, > + [CLK_G2D] =3D &g2d_clk.common.hw, > + [CLK_BUS_G2D] =3D &bus_g2d_clk.common.hw, > + [CLK_CE] =3D &ce_clk.common.hw, > + [CLK_BUS_CE] =3D &bus_ce_clk.common.hw, > + [CLK_VE] =3D &ve_clk.common.hw, > + [CLK_BUS_VE] =3D &bus_ve_clk.common.hw, > + [CLK_NPU] =3D &npu_clk.common.hw, > + [CLK_BUS_NPU] =3D &bus_npu_clk.common.hw, > + [CLK_BUS_DMA] =3D &bus_dma_clk.common.hw, > + [CLK_BUS_MSGBOX0] =3D &bus_msgbox0_clk.common.hw, > + [CLK_BUS_MSGBOX1] =3D &bus_msgbox1_clk.common.hw, > + [CLK_BUS_SPINLOCK] =3D &bus_spinlock_clk.common.hw, > + [CLK_BUS_HSTIMER] =3D &bus_hstimer_clk.common.hw, > + [CLK_AVS] =3D &avs_clk.common.hw, > + [CLK_BUS_DBG] =3D &bus_dbg_clk.common.hw, > + [CLK_BUS_PWM] =3D &bus_pwm_clk.common.hw, > + [CLK_BUS_IOMMU] =3D &bus_iommu_clk.common.hw, > + [CLK_DRAM] =3D &dram_clk.common.hw, > + [CLK_MBUS_DMA] =3D &mbus_dma_clk.common.hw, > + [CLK_MBUS_VE] =3D &mbus_ve_clk.common.hw, > + [CLK_MBUS_CE] =3D &mbus_ce_clk.common.hw, > + [CLK_MBUS_CSI] =3D &mbus_csi_clk.common.hw, > + [CLK_MBUS_ISP] =3D &mbus_isp_clk.common.hw, > + [CLK_MBUS_G2D] =3D &mbus_g2d_clk.common.hw, > + [CLK_BUS_DRAM] =3D &bus_dram_clk.common.hw, > + [CLK_MMC0] =3D &mmc0_clk.common.hw, > + [CLK_MMC1] =3D &mmc1_clk.common.hw, > + [CLK_MMC2] =3D &mmc2_clk.common.hw, > + [CLK_BUS_MMC0] =3D &bus_mmc0_clk.common.hw, > + [CLK_BUS_MMC1] =3D &bus_mmc1_clk.common.hw, > + [CLK_BUS_MMC2] =3D &bus_mmc2_clk.common.hw, > + [CLK_BUS_UART0] =3D &bus_uart0_clk.common.hw, > + [CLK_BUS_UART1] =3D &bus_uart1_clk.common.hw, > + [CLK_BUS_UART2] =3D &bus_uart2_clk.common.hw, > + [CLK_BUS_UART3] =3D &bus_uart3_clk.common.hw, > + [CLK_BUS_I2C0] =3D &bus_i2c0_clk.common.hw, > + [CLK_BUS_I2C1] =3D &bus_i2c1_clk.common.hw, > + [CLK_BUS_I2C2] =3D &bus_i2c2_clk.common.hw, > + [CLK_BUS_I2C3] =3D &bus_i2c3_clk.common.hw, > + [CLK_BUS_I2C4] =3D &bus_i2c4_clk.common.hw, > + [CLK_SPI0] =3D &spi0_clk.common.hw, > + [CLK_SPI1] =3D &spi1_clk.common.hw, > + [CLK_SPI2] =3D &spi2_clk.common.hw, > + [CLK_SPI3] =3D &spi3_clk.common.hw, > + [CLK_BUS_SPI0] =3D &bus_spi0_clk.common.hw, > + [CLK_BUS_SPI1] =3D &bus_spi1_clk.common.hw, > + [CLK_BUS_SPI2] =3D &bus_spi2_clk.common.hw, > + [CLK_BUS_SPI3] =3D &bus_spi3_clk.common.hw, > + [CLK_SPIF] =3D &spif_clk.common.hw, > + [CLK_BUS_SPIF] =3D &bus_spif_clk.common.hw, > + [CLK_EMAC_25M] =3D &emac_25M_clk.common.hw, > + [CLK_BUS_EMAC] =3D &bus_emac_clk.common.hw, > + [CLK_BUS_GPADC] =3D &bus_gpadc_clk.common.hw, > + [CLK_BUS_THS] =3D &bus_ths_clk.common.hw, > + [CLK_I2S0] =3D &i2s0_clk.common.hw, > + [CLK_I2S1] =3D &i2s1_clk.common.hw, > + [CLK_BUS_I2S0] =3D &bus_i2s0_clk.common.hw, > + [CLK_BUS_I2S1] =3D &bus_i2s1_clk.common.hw, > + [CLK_DMIC] =3D &dmic_clk.common.hw, > + [CLK_BUS_DMIC] =3D &bus_dmic_clk.common.hw, > + [CLK_AUDIO_CODEC_DAC] =3D &audio_codec_dac_clk.common.hw, > + [CLK_AUDIO_CODEC_ADC] =3D &audio_codec_adc_clk.common.hw, > + [CLK_BUS_AUDIO_CODEC] =3D &bus_audio_codec_clk.common.hw, > + [CLK_USB_OHCI] =3D &usb_ohci_clk.common.hw, > + [CLK_BUS_OHCI] =3D &bus_ohci_clk.common.hw, > + [CLK_BUS_EHCI] =3D &bus_ehci_clk.common.hw, > + [CLK_BUS_OTG] =3D &bus_otg_clk.common.hw, > + [CLK_BUS_DPSS_TOP] =3D &bus_dpss_top_clk.common.hw, > + [CLK_MIPI_DSI] =3D &mipi_dsi_clk.common.hw, > + [CLK_BUS_MIPI_DSI] =3D &bus_mipi_dsi_clk.common.hw, > + [CLK_TCON_LCD] =3D &tcon_lcd_clk.common.hw, > + [CLK_BUS_TCON_LCD] =3D &bus_tcon_lcd_clk.common.hw, > + [CLK_CSI_TOP] =3D &csi_top_clk.common.hw, > + [CLK_CSI_MCLK0] =3D &csi_mclk0_clk.common.hw, > + [CLK_CSI_MCLK1] =3D &csi_mclk1_clk.common.hw, > + [CLK_CSI_MCLK2] =3D &csi_mclk2_clk.common.hw, > + [CLK_BUS_CSI] =3D &bus_csi_clk.common.hw, > + [CLK_BUS_WIEGAND] =3D &bus_wiegand_clk.common.hw, > + [CLK_RISCV] =3D &riscv_clk.common.hw, > + [CLK_RISCV_AXI] =3D &riscv_axi_clk.common.hw, > + [CLK_RISCV_CORE_GATE] =3D &riscv_core_gate.common.hw, > + [CLK_RISCV_CFG_GATE] =3D &riscv_cfg_gate.common.hw, > + [CLK_FANOUT_24M] =3D &fanout_24M_clk.common.hw, > + [CLK_FANOUT_16M] =3D &fanout_16M_clk.common.hw, > + [CLK_FANOUT_12M] =3D &fanout_12M_clk.common.hw, > + [CLK_FANOUT_25M] =3D &fanout_25M_clk.common.hw, > + [CLK_FANOUT_27M] =3D &fanout_27M_clk.common.hw, > + [CLK_FANOUT_PCLK] =3D &fanout_pclk_clk.common.hw, > + [CLK_FANOUT0] =3D &fanout0_clk.common.hw, > + [CLK_FANOUT1] =3D &fanout1_clk.common.hw, > + [CLK_FANOUT2] =3D &fanout2_clk.common.hw, > + }, > +}; > + > +static struct ccu_reset_map sun8i_v853_ccu_resets[] =3D { > + [RST_MBUS] =3D { 0x540, BIT(30) }, > + [RST_BUS_DE] =3D { 0x60c, BIT(16) }, > + [RST_BUS_G2D] =3D { 0x63c, BIT(16) }, > + [RST_BUS_CE] =3D { 0x68c, BIT(16) | BIT(17)}, > + [RST_BUS_VE] =3D { 0x69c, BIT(16) }, > + [RST_BUS_NPU] =3D { 0x6ec, BIT(16) }, > + [RST_BUS_DMA] =3D { 0x70c, BIT(16) }, > + [RST_BUS_MSGBOX0] =3D { 0x71c, BIT(16) }, > + [RST_BUS_MSGBOX1] =3D { 0x71c, BIT(17) }, > + [RST_BUS_SPINLOCK] =3D { 0x72c, BIT(16) }, > + [RST_BUS_HSTIMER] =3D { 0x73c, BIT(16) }, > + [RST_BUS_DBG] =3D { 0x78c, BIT(16) }, > + [RST_BUS_PWM] =3D { 0x7ac, BIT(16) }, > + [RST_BUS_DRAM] =3D { 0x80c, BIT(16) }, > + [RST_BUS_MMC0] =3D { 0x84c, BIT(16) }, > + [RST_BUS_MMC1] =3D { 0x84c, BIT(17) }, > + [RST_BUS_MMC2] =3D { 0x84c, BIT(18) }, > + [RST_BUS_UART0] =3D { 0x90c, BIT(16) }, > + [RST_BUS_UART1] =3D { 0x90c, BIT(17) }, > + [RST_BUS_UART2] =3D { 0x90c, BIT(18) }, > + [RST_BUS_UART3] =3D { 0x90c, BIT(19) }, > + [RST_BUS_I2C0] =3D { 0x91c, BIT(16) }, > + [RST_BUS_I2C1] =3D { 0x91c, BIT(17) }, > + [RST_BUS_I2C2] =3D { 0x91c, BIT(18) }, > + [RST_BUS_I2C3] =3D { 0x91c, BIT(19) }, > + [RST_BUS_I2C4] =3D { 0x91c, BIT(20) }, > + [RST_BUS_SPI0] =3D { 0x96c, BIT(16) }, > + [RST_BUS_SPI1] =3D { 0x96c, BIT(17) }, > + [RST_BUS_SPI2] =3D { 0x96c, BIT(18) }, > + [RST_BUS_SPI3] =3D { 0x96c, BIT(19) }, > + [RST_BUS_SPIF] =3D { 0x96c, BIT(20) }, > + [RST_BUS_EMAC] =3D { 0x97c, BIT(16) }, > + [RST_BUS_GPADC] =3D { 0x9ec, BIT(16) }, > + [RST_BUS_THS] =3D { 0x9fc, BIT(16) }, > + [RST_BUS_I2S0] =3D { 0xa20, BIT(16) }, > + [RST_BUS_I2S1] =3D { 0xa20, BIT(17) }, > + [RST_BUS_DMIC] =3D { 0xa4c, BIT(16) }, > + [RST_BUS_AUDIO_CODEC] =3D { 0xa5c, BIT(16) }, > + [RST_USB_PHY] =3D { 0xa70, BIT(30) }, > + [RST_BUS_OHCI] =3D { 0xa8c, BIT(16) }, > + [RST_BUS_EHCI] =3D { 0xa8c, BIT(20) }, > + [RST_BUS_OTG] =3D { 0xa8c, BIT(24) }, > + [RST_BUS_DPSS_TOP] =3D { 0xabc, BIT(16) }, > + [RST_BUS_MIPI_DSI] =3D { 0xb4c, BIT(16) }, > + [RST_BUS_TCON_LCD] =3D { 0xb7c, BIT(16) }, > + [RST_BUS_CSI] =3D { 0xc2c, BIT(16) }, > + [RST_BUS_WIEGAND] =3D { 0xc7c, BIT(16) }, > + [RST_RISCV_SYS_APB] =3D { 0xd04, BIT(2), CCU_FEATURE_KEY_FIELD }, > + [RST_RISCV_SOFT] =3D { 0xd04, BIT(1), CCU_FEATURE_KEY_FIELD }, > + [RST_RISCV_CFG] =3D { 0xd0c, BIT(16) } > +}; > + > +static const struct sunxi_ccu_desc sun8i_v853_ccu_desc =3D { > + .ccu_clks =3D sun8i_v853_ccu_clks, > + .num_ccu_clks =3D ARRAY_SIZE(sun8i_v853_ccu_clks), > + > + .hw_clks =3D &sun8i_v853_hw_clks, > + > + .resets =3D sun8i_v853_ccu_resets, > + .num_resets =3D ARRAY_SIZE(sun8i_v853_ccu_resets), > +}; > + > +static const u32 pll_regs[] =3D { > + SUN8I_V853_PLL_CPU_REG, > + SUN8I_V853_PLL_DDR_REG, > + SUN8I_V853_PLL_PERIPH_REG, > + SUN8I_V853_PLL_VIDEO_REG, > + SUN8I_V853_PLL_CSI_REG, > + SUN8I_V853_PLL_AUDIO_REG, > + SUN8I_V853_PLL_NPU_REG, > +}; > + > +static int sun8i_v853_ccu_probe(struct platform_device *pdev) > +{ > + void __iomem *reg; > + u32 val; > + int i, ret; > + > + reg =3D devm_platform_ioremap_resource(pdev, 0); > + if (IS_ERR(reg)) > + return PTR_ERR(reg); > + > + /* Enable the enable, LDO, and lock bits on all PLLs. */ > + for (i =3D 0; i < ARRAY_SIZE(pll_regs); i++) { > + val =3D readl(reg + pll_regs[i]); > + val |=3D BIT(31) | BIT(30) | BIT(29); > + writel(val, reg + pll_regs[i]); > + } > + > + /* Force PLL_CPU factor M to 0. */ > + val =3D readl(reg + SUN8I_V853_PLL_CPU_REG); > + val &=3D ~GENMASK(1, 0); > + writel(val, reg + SUN8I_V853_PLL_CPU_REG); > + > + /* > + * Force OHCI 12M clock source to 00 (12MHz divided from 48MHz) > + * > + * This clock mux is still mysterious, and the code just enforces > + * it to have a valid clock parent. > + */ > + val =3D readl(reg + SUN8I_V853_USB_CLK_REG); > + val &=3D ~GENMASK(25, 24); > + writel(val, reg + SUN8I_V853_USB_CLK_REG); > + > + /* Force fanout-27M factor N to 0. */ > + val =3D readl(reg + SUN8I_V853_FANOUT_27M_REG); > + val &=3D ~GENMASK(9, 8); > + writel(val, reg + SUN8I_V853_FANOUT_27M_REG); > + > + ret =3D devm_sunxi_ccu_probe(&pdev->dev, reg, &sun8i_v853_ccu_desc); > + if (ret) > + return ret; > + > + return 0; > +} > + > +static const struct of_device_id sun8i_v853_ccu_ids[] =3D { > + { .compatible =3D "allwinner,sun8i-v853-ccu" }, > + { } > +}; > + > +static struct platform_driver sun8i_v853_ccu_driver =3D { > + .probe =3D sun8i_v853_ccu_probe, > + .driver =3D { > + .name =3D "sun8i-v853-ccu", > + .suppress_bind_attrs =3D true, > + .of_match_table =3D sun8i_v853_ccu_ids, > + }, > +}; > +module_platform_driver(sun8i_v853_ccu_driver); > + > +MODULE_IMPORT_NS("SUNXI_CCU"); > +MODULE_DESCRIPTION("Support for the Allwinner V853 CCU"); > +MODULE_LICENSE("GPL"); > diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v853.h b/drivers/clk/sunxi-ng= /ccu-sun8i-v853.h > new file mode 100644 > index 000000000000..f1b2a4d0bcd3 > --- /dev/null > +++ b/drivers/clk/sunxi-ng/ccu-sun8i-v853.h > @@ -0,0 +1,14 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) 2024 Andras Szemzo > + */ > + > +#ifndef _CCU_SUN8I_V853_H_ > +#define _CCU_SUN8I_V853_H_ > + > +#include > +#include > + > +#define CLK_NUMBER (CLK_FANOUT2 + 1) > + > +#endif >=20 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 09BB3C021B1 for ; Wed, 19 Feb 2025 20:23:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=GKj4NZXCizb4Lxpd9yCFLZyaHrS3m3tKfjsIwrGZIvI=; b=jK14OefqhSTSuX MvJNfcKbyZFo71HDwU+G8X1lyXHyKfRDzKiAyIOux23cwqt4o987i7vuvrRO67XIKRKS5mfJxFD06 kd4gBSBPrVdWmSvKJwqs2G+5d7leRPQSA6vodAcPPaxd5LXiZB7IMPq4oX2P24UM2k4u36TIVWbIF h5vvu4rQc8RCi8a/uNypDNf4e8iDMf9OIVrUxlv/DrDQJGiTC2L5LjvDOKvdAHLlcIH7FniE1U09R E5LyqrjmfVdB8p1MJOkg8r/AKsTWGDPdcIa+dhZIGfqJxcw8sjDr5jPMv8pRJqUmWvIWUORIJTGbA 0CcjDzyzIAaFREu2nVjQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkqbW-0000000Ereu-02yo; Wed, 19 Feb 2025 20:23:34 +0000 Received: from mail-wm1-x330.google.com ([2a00:1450:4864:20::330]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkqZz-0000000ErIO-3s9s; Wed, 19 Feb 2025 20:22:02 +0000 Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-439950a45daso946225e9.2; Wed, 19 Feb 2025 12:21:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739996518; x=1740601318; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=nid48bLhH/FBJHEXa989rxTIHzZsjgSmLvJWm4cud1Q=; b=OhppFAxqtbebAiJTFQtln1VBHhNBU5G+1v7/4GnagzMrBXlJzzeq7eIilWZKrCCqdr etFaO9GNaXsasIcQKvqOJ+I4PLS4OyeQV0g7A5zWydupkjuL9MKg7Yvum/JEndNPwuWe mqUbPUhTJxpJFnecCqBiq3V7wVO76NMw8ldyz/+ECpf17e2LvEmAdrB7lxVXFRqy5O3U bRo+BfKQJu14v3d7MZmsDAaCF/q29tjGwWyt6F3tInUFyvV5k9LgkylkEuK2MM0nmPrL 5eLq33qahq34Jb/UlLO68zKrFYX1POb7j4aHwKujgIftfzgTFeldCqBbruBtx39H6WQ/ 7xmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739996518; x=1740601318; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nid48bLhH/FBJHEXa989rxTIHzZsjgSmLvJWm4cud1Q=; b=xHJPJdof9yyinf8f6B4R1dOTaVi6sgj0ejIkBN8qENbio9tZTeJWF9pVFD0eoG7tQc +PYAj1wV1A3NxUacU5KyI1OT4Rj2MrJCurtduLpQCWacdZYh1EaBckR10JaszWwnlbH/ cS8ImZlGcThw72ESjdBT5CmEAL4+e2YpEPEFXgyTb9cKXMnkWjMsTDqILTN0MWdvQJMq 03b4nx9Cv9dlxCsXKOJmB82prZaAInKAQXYCqHF6VAokOKNz8NRCCbBnUTt6KAvMlq4b hrMLEv6oalrS8uySuDHqvE5BPasUx7VMzv0wvoBlcrKfnp/FGgFI1fQ8lhFxLWkwbztW mI8w== X-Forwarded-Encrypted: i=1; AJvYcCViMn4ErYdWU3ogyIeZfZ+3KqjZNaaCRZT5fPNtnTo+QNyhIlmIYKsRLU0DNFEzOzwAb64YG1hssP87xHxO7FOn@lists.infradead.org, AJvYcCWO0kknWx3TkR6zdKaQBisAn4xsmT2yJaDCTu7vbB9hMPWkonwQ4H1rbZmQ7/kUQqtOzyylV6oGcouXppg=@lists.infradead.org, AJvYcCWribg83OV817+8Dpp8m6d6zRrFV5rL4Lj4oGuHeUhNrpkBdEk6//EKAH97hwYW6qF2ujrrRlNx5C/U@lists.infradead.org X-Gm-Message-State: AOJu0YxLLV+MeJXutuj1nzINQ05WflI556U6l+/lKqRJsPDQbop0KSTn w8qM/u2PkPw8C5H484GKrR9ZBpfwi+/fjpyB6YJPwnQQu7TCgbwm X-Gm-Gg: ASbGnctWO+ucWl8rmZxfAuD+at2KiRKzyM49GhT7BMMi9+W81v+0u/2YJ/2U4C9ouJJ 5y9BCnlzhlpK9JOFxE6QidygS5km+UM8ytsQ/A1exF7oab/6I3SOILrM+rm1940FLl0Znds4Nj8 555VUnui2F9df6R4BI7OVAsj0IpqMgPmImGMn49Xo2o5DGoC8P3JqNhw7ji4nszxhlwwT1TmtmK sGbCPKU4iy3Sdy16S92H04FrrRnTASFK/iULmnKh9re8L7OC4d7QZfaztxTgnE8zOz0Y/ztq/a+ GplLdPrHDtLKkJdWRrIxQTPrJD+D6vxA3flDjyrYbcIXzuUgbJ4gvsy3Xy0BnupmJ0E= X-Google-Smtp-Source: AGHT+IE6IeUem5aMOtu5jChHWDBa5MTCtBbguS6zGTJ5rDfVtK+EJKsOG90m0rn5aiIOqr+ekOeGNQ== X-Received: by 2002:a05:600c:3b12:b0:439:96b2:e9b with SMTP id 5b1f17b1804b1-43996b212d9mr63124255e9.9.1739996517331; Wed, 19 Feb 2025 12:21:57 -0800 (PST) Received: from jernej-laptop.localnet (86-58-6-171.dynamic.telemach.net. [86.58.6.171]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38f259d9be9sm19015747f8f.79.2025.02.19.12.21.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Feb 2025 12:21:56 -0800 (PST) From: Jernej =?UTF-8?B?xaBrcmFiZWM=?= To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen-Yu Tsai , Samuel Holland , Linus Walleij , Philipp Zabel , Maxime Ripard , Andras Szemzo Cc: Vinod Koul , Kishon Vijay Abraham I , Ulf Hansson , Paul Walmsley , Palmer Dabbelt , Albert Ou , Uwe =?UTF-8?B?S2xlaW5lLUvDtm5pZw==?= , Florian Fainelli , linux-clk@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-gpio@vger.kernel.org, linux-pm@vger.kernel.org, linux-riscv@lists.infradead.org Subject: Re: [PATCH v2 04/10] clk: sunxi-ng: add CCU drivers for V853 Date: Wed, 19 Feb 2025 21:21:54 +0100 Message-ID: <3596612.V25eIC5XRa@jernej-laptop> In-Reply-To: <20250205125225.1152849-5-szemzo.andras@gmail.com> References: <20250205125225.1152849-1-szemzo.andras@gmail.com> <20250205125225.1152849-5-szemzo.andras@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250219_122159_986472_FF1A52E5 X-CRM114-Status: GOOD ( 26.47 ) X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org RG5lIHNyZWRhLCA1LiBmZWJydWFyIDIwMjUgb2IgMTM6NTI6MTkgU3JlZG5qZWV2cm9wc2tpIHN0 YW5kYXJkbmkgxI1hcyBqZSBBbmRyYXMgU3plbXpvIG5hcGlzYWwoYSk6Cj4gVjg1MyBoYXMgc2lt aWxhciBnYXRlcy9yZXNldHMgbGlrZSBleGlzdGluZyBBbGx3aW5uZXIgU09Dcy4gQWRkIHN1cHBv cnQgZm9yIGl0J3MgQ0NVIGFuZCBQUkNNIENDVS4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBBbmRyYXMg U3plbXpvIDxzemVtem8uYW5kcmFzQGdtYWlsLmNvbT4KPiAtLS0KPiAgZHJpdmVycy9jbGsvc3Vu eGktbmcvS2NvbmZpZyAgICAgICAgICAgIHwgICAxMCArCj4gIGRyaXZlcnMvY2xrL3N1bnhpLW5n L01ha2VmaWxlICAgICAgICAgICB8ICAgIDQgKwo+ICBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Ut c3VuOGktdjg1My1yLmMgfCAgMTIwICsrKwo+ICBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3Vu OGktdjg1My1yLmggfCAgIDE0ICsKPiAgZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4 NTMuYyAgIHwgMTE0NSArKysrKysrKysrKysrKysrKysrKysrKwo+ICBkcml2ZXJzL2Nsay9zdW54 aS1uZy9jY3Utc3VuOGktdjg1My5oICAgfCAgIDE0ICsKPiAgNiBmaWxlcyBjaGFuZ2VkLCAxMzA3 IGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvY2xrL3N1bnhpLW5n L2NjdS1zdW44aS12ODUzLXIuYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9jbGsvc3Vu eGktbmcvY2N1LXN1bjhpLXY4NTMtci5oCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2Ns ay9zdW54aS1uZy9jY3Utc3VuOGktdjg1My5jCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1My5oCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv Y2xrL3N1bnhpLW5nL0tjb25maWcgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9LY29uZmlnCj4gaW5k ZXggYjU0NzE5OGEyYzY1Li5lMjU3MzczMTc3ZTAgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9jbGsv c3VueGktbmcvS2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL0tjb25maWcKPiBA QCAtMTIsNiArMTIsMTYgQEAgY29uZmlnIFNVTklWX0YxQzEwMFNfQ0NVCj4gIAlkZWZhdWx0IHkK PiAgCWRlcGVuZHMgb24gTUFDSF9TVU5JViB8fCBDT01QSUxFX1RFU1QKPiAgCj4gK2NvbmZpZyBT VU44SV9WODUzX0NDVQo+ICsJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIHRoZSBBbGx3aW5uZXIgVjg1 My9WODUxcy9WODUxU0UgQ0NVIgo+ICsJZGVmYXVsdCBNQUNIX1NVTjhJCj4gKwlkZXBlbmRzIG9u IE1BQ0hfU1VOOEkgfHwgQ09NUElMRV9URVNUCj4gKwo+ICtjb25maWcgU1VOOElfVjg1M19SX0ND VQo+ICsJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIHRoZSBBbGx3aW5uZXIgVjg1My9WODUxcy9WODUx U0UgUFJDTSBDQ1UiCj4gKwlkZWZhdWx0IE1BQ0hfU1VOOEkKPiArCWRlcGVuZHMgb24gTUFDSF9T VU44SSB8fCBDT01QSUxFX1RFU1QKCkdlbmVyYWxseSwgdGhpcyBhcmUgdHdvIHBhdGNoZXMsIG9u ZSBmb3IgZWFjaCBkcml2ZXIuCgo+ICsKPiAgY29uZmlnIFNVTjIwSV9EMV9DQ1UKPiAgCXRyaXN0 YXRlICJTdXBwb3J0IGZvciB0aGUgQWxsd2lubmVyIEQxL1I1MjgvVDExMyBDQ1UiCj4gIAlkZWZh dWx0IHkKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvTWFrZWZpbGUgYi9kcml2 ZXJzL2Nsay9zdW54aS1uZy9NYWtlZmlsZQo+IGluZGV4IDZiM2FlMmI2MjBkYi4uYjg3OTI4NDYy ZTE1IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL01ha2VmaWxlCj4gKysrIGIv ZHJpdmVycy9jbGsvc3VueGktbmcvTWFrZWZpbGUKPiBAQCAtMjUsNiArMjUsOCBAQCBzdW54aS1j Y3UteQkJCSs9IGNjdV9tcC5vCj4gIAo+ICAjIFNvQyBzdXBwb3J0Cj4gIG9iai0kKENPTkZJR19T VU5JVl9GMUMxMDBTX0NDVSkJKz0gc3VuaXYtZjFjMTAwcy1jY3Uubwo+ICtvYmotJChDT05GSUdf U1VOOElfVjg1M19DQ1UpCSs9IHN1bjhpLXY4NTMtY2N1Lm8KPiArb2JqLSQoQ09ORklHX1NVTjhJ X1Y4NTNfUl9DQ1UpCSs9IHN1bjhpLXY4NTMtci1jY3UubwoKUHV0IGl0IHRvIG90aGVyIHN1bjhp IGRyaXZlcnMuCgo+ICBvYmotJChDT05GSUdfU1VOMjBJX0QxX0NDVSkJKz0gc3VuMjBpLWQxLWNj dS5vCj4gIG9iai0kKENPTkZJR19TVU4yMElfRDFfUl9DQ1UpCSs9IHN1bjIwaS1kMS1yLWNjdS5v Cj4gIG9iai0kKENPTkZJR19TVU41MElfQTY0X0NDVSkJKz0gc3VuNTBpLWE2NC1jY3Uubwo+IEBA IC01MCw2ICs1Miw4IEBAIG9iai0kKENPTkZJR19TVU45SV9BODBfQ0NVKQkrPSBzdW45aS1hODAt ZGUtY2N1Lm8KPiAgb2JqLSQoQ09ORklHX1NVTjlJX0E4MF9DQ1UpCSs9IHN1bjlpLWE4MC11c2It Y2N1Lm8KPiAgCj4gIHN1bml2LWYxYzEwMHMtY2N1LXkJCSs9IGNjdS1zdW5pdi1mMWMxMDBzLm8K PiArc3VuOGktdjg1My1jY3UteQkJKz0gY2N1LXN1bjhpLXY4NTMubwo+ICtzdW44aS12ODUzLXIt Y2N1LXkJCSs9IGNjdS1zdW44aS12ODUzLXIubwoKRGl0dG8uCgo+ICBzdW4yMGktZDEtY2N1LXkJ CQkrPSBjY3Utc3VuMjBpLWQxLm8KPiAgc3VuMjBpLWQxLXItY2N1LXkJCSs9IGNjdS1zdW4yMGkt ZDEtci5vCj4gIHN1bjUwaS1hNjQtY2N1LXkJCSs9IGNjdS1zdW41MGktYTY0Lm8KPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMtci5jIGIvZHJpdmVycy9j bGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMtci5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBp bmRleCAwMDAwMDAwMDAwMDAuLmJkNjBlMDBjZGE3Zgo+IC0tLSAvZGV2L251bGwKPiArKysgYi9k cml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1My1yLmMKPiBAQCAtMCwwICsxLDEyMCBA QAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ICsvKgo+ICsgKiBDb3B5 cmlnaHQgKEMpIDIwMjUgQW5kcmFzIFN6ZW16byA8c3plbXpvLmFuZHJhc0BnbWFpbC5jb20+Cj4g KyAqCj4gKyAqIEJhc2VkIG9uIGNjdS1zdW4yMGktZDEtci5jIGJ5IFNhbXVlbCBIb2xsYW5kLgo+ ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KPiArI2luY2x1ZGUg PGxpbnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4g Kwo+ICsjaW5jbHVkZSAiY2N1X2NvbW1vbi5oIgo+ICsjaW5jbHVkZSAiY2N1X3Jlc2V0LmgiCj4g Kwo+ICsjaW5jbHVkZSAiY2N1X2dhdGUuaCIKPiArI2luY2x1ZGUgImNjdV9tcC5oIgo+ICsKPiAr I2luY2x1ZGUgImNjdS1zdW44aS12ODUzLXIuaCIKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg Y2xrX3BhcmVudF9kYXRhIHJfYWhiX2FwYjBfcGFyZW50c1tdID0gewo+ICsJeyAuZndfbmFtZSA9 ICJob3NjIiB9LAo+ICsJeyAuZndfbmFtZSA9ICJsb3NjIiB9LAo+ICsJeyAuZndfbmFtZSA9ICJp b3NjIiB9LAo+ICsJeyAuZndfbmFtZSA9ICJwbGwtcGVyaXBoIiB9LAo+ICsJeyAuZndfbmFtZSA9 ICJwbGwtYXVkaW8iIH0KPiArfTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfREFUQV9XSVRI X01VWChyX2FoYl9jbGssICJyLWFoYiIsCj4gKwkJCQkgIHJfYWhiX2FwYjBfcGFyZW50cywgMHgw MDAsCj4gKwkJCQkgIDAsIDUsCQkvKiBNICovCj4gKwkJCQkgIDgsIDIsCQkvKiBQICovCj4gKwkJ CQkgIDI0LCAzLAkvKiBtdXggKi8KPiArCQkJCSAgMCk7Cj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg Y2xrX2h3ICpyX2FoYl9odyA9ICZyX2FoYl9jbGsuY29tbW9uLmh3Owo+ICsKPiArc3RhdGljIFNV TlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYKHJfYXBiMF9jbGssICJyLWFwYjAiLAo+ICsJCQkJICBy X2FoYl9hcGIwX3BhcmVudHMsIDB4MDBjLAo+ICsJCQkJICAwLCA1LAkJLyogTSAqLwo+ICsJCQkJ ICA4LCAyLAkJLyogUCAqLwo+ICsJCQkJICAyNCwgMywJLyogbXV4ICovCj4gKwkJCQkgIDApOwo+ ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqcl9hcGIwX2h3ID0gJnJfYXBiMF9jbGsuY29t bW9uLmh3OwoKV2hlcmUgY2FuIEkgbG9vayBmb3IgYWJvdmUgY2xvY2tzPyBUaGVyZSBhcmUgbm90 IGRlc2NyaWJlZCBpbiBCU1AgZHJpdmVyLgoKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9I V1MoYnVzX3JfdHdkX2NsaywgImJ1cy1yLXR3ZCIsICZyX2FwYjBfaHcsIAo+ICsJCQkgIDB4MTJj LCBCSVQoMCksIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19yX3BwdV9jbGss ICJidXMtci1wcHUiLCAmcl9hcGIwX2h3LAo+ICsJCQkgIDB4MWFjLCBCSVQoMCksIDApOwo+ICtz dGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19yX3J0Y19jbGssICJidXMtci1ydGMiLCAmcl9h aGJfaHcsCj4gKwkJCSAgMHgyMGMsIEJJVCgwKSwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FU RV9IV1MoYnVzX3JfY3B1Y2ZnX2NsaywgImJ1cy1yLWNwdWNmZyIsICZyX2FwYjBfaHcsCj4gKwkJ CSAgMHgyMmMsIEJJVCgwKSwgMCk7Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGNjdV9jb21tb24gKnN1 bjhpX3Y4NTNfcl9jY3VfY2xrc1tdID0gewo+ICsJJnJfYWhiX2Nsay5jb21tb24sCj4gKwkmcl9h cGIwX2Nsay5jb21tb24sCj4gKwkmYnVzX3JfdHdkX2Nsay5jb21tb24sCj4gKwkmYnVzX3JfcHB1 X2Nsay5jb21tb24sCj4gKwkmYnVzX3JfcnRjX2Nsay5jb21tb24sCj4gKwkmYnVzX3JfY3B1Y2Zn X2Nsay5jb21tb24sCj4gK307Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2Rh dGEgc3VuOGlfdjg1M19yX2h3X2Nsa3MgPSB7Cj4gKwkubnVtCT0gQ0xLX05VTUJFUiwKPiArCS5o d3MJPSB7Cj4gKwkJW0NMS19SX0FIQl0JCT0gJnJfYWhiX2Nsay5jb21tb24uaHcsCj4gKwkJW0NM S19SX0FQQjBdCQk9ICZyX2FwYjBfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19SX1RXRF0J CT0gJmJ1c19yX3R3ZF9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQlVTX1JfUFBVXQkJPSAmYnVz X3JfcHB1X2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfUl9SVENdCQk9ICZidXNfcl9ydGNf Y2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19SX0NQVUNGR10JPSAmYnVzX3JfY3B1Y2ZnX2Ns ay5jb21tb24uaHcsCj4gKwl9LAo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjY3Vf cmVzZXRfbWFwIHN1bjhpX3Y4NTNfcl9jY3VfcmVzZXRzW10gPSB7Cj4gKwlbUlNUX0JVU19SX1RX RF0JCT0geyAweDEyYywgQklUKDE2KSB9LAoKV2hlcmUgZGlkIHlvdSBnZXQgdGhhdD8gQlNQIGRy aXZlciB0aGF0IEkgY2hlY2tlZCBkb2Vzbid0IG1lbnRpb25zIGl0LgoKPiArCVtSU1RfQlVTX1Jf UFBVXQkJPSB7IDB4MWFjLCBCSVQoMTYpIH0sCj4gKwlbUlNUX0JVU19SX1JUQ10JCT0geyAweDIw YywgQklUKDE2KSB9LAo+ICsJW1JTVF9CVVNfUl9DUFVDRkddCT0geyAweDIyYywgQklUKDE2KSB9 LAo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBzdW54aV9jY3VfZGVzYyBzdW44aV92 ODUzX3JfY2N1X2Rlc2MgPSB7Cj4gKwkuY2N1X2Nsa3MJPSBzdW44aV92ODUzX3JfY2N1X2Nsa3Ms Cj4gKwkubnVtX2NjdV9jbGtzCT0gQVJSQVlfU0laRShzdW44aV92ODUzX3JfY2N1X2Nsa3MpLAo+ ICsKPiArCS5od19jbGtzCT0gJnN1bjhpX3Y4NTNfcl9od19jbGtzLAo+ICsKPiArCS5yZXNldHMJ CT0gc3VuOGlfdjg1M19yX2NjdV9yZXNldHMsCj4gKwkubnVtX3Jlc2V0cwk9IEFSUkFZX1NJWkUo c3VuOGlfdjg1M19yX2NjdV9yZXNldHMpLAo+ICt9Owo+ICsKPiArc3RhdGljIGludCBzdW44aV92 ODUzX3JfY2N1X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gK3sKPiArCXZv aWQgX19pb21lbSAqcmVnOwo+ICsKPiArCXJlZyA9IGRldm1fcGxhdGZvcm1faW9yZW1hcF9yZXNv dXJjZShwZGV2LCAwKTsKPiArCWlmIChJU19FUlIocmVnKSkKPiArCQlyZXR1cm4gUFRSX0VSUihy ZWcpOwo+ICsKPiArCXJldHVybiBkZXZtX3N1bnhpX2NjdV9wcm9iZSgmcGRldi0+ZGV2LCByZWcs ICZzdW44aV92ODUzX3JfY2N1X2Rlc2MpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0 IG9mX2RldmljZV9pZCBzdW44aV92ODUzX3JfY2N1X2lkc1tdID0gewo+ICsJeyAuY29tcGF0aWJs ZSA9ICJhbGx3aW5uZXIsc3VuOGktdjg1My1yLWNjdSIgfSwKPiArCXsgfQo+ICt9Owo+ICtNT0RV TEVfREVWSUNFX1RBQkxFKG9mLCBzdW44aV92ODUzX3JfY2N1X2lkcyk7Cj4gKwo+ICtzdGF0aWMg c3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdW44aV92ODUzX3JfY2N1X2RyaXZlciA9IHsKPiArCS5w cm9iZQk9IHN1bjhpX3Y4NTNfcl9jY3VfcHJvYmUsCj4gKwkuZHJpdmVyCT0gewo+ICsJCS5uYW1l CQkJPSAic3VuOGktdjg1My1yLWNjdSIsCj4gKwkJLnN1cHByZXNzX2JpbmRfYXR0cnMJPSB0cnVl LAo+ICsJCS5vZl9tYXRjaF90YWJsZQkJPSBzdW44aV92ODUzX3JfY2N1X2lkcywKPiArCX0sCj4g K307Cj4gK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3VuOGlfdjg1M19yX2NjdV9kcml2ZXIpOwo+ ICsKPiArTU9EVUxFX0lNUE9SVF9OUygiU1VOWElfQ0NVIik7Cj4gK01PRFVMRV9ERVNDUklQVElP TigiU3VwcG9ydCBmb3IgdGhlIEFsbHdpbm5lciBWODUzIFBSQ00gQ0NVIik7Cj4gK01PRFVMRV9M SUNFTlNFKCJHUEwiKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1 bjhpLXY4NTMtci5oIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMtci5oCj4g bmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjJjNmNjN2I2ZjI1MQo+ IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1 My1yLmgKPiBAQCAtMCwwICsxLDE0IEBACj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wICovCj4gKy8qCj4gKyAqIENvcHlyaWdodCAoQykgMjAyNSBBbmRyYXMgU3plbXpvIDxz emVtem8uYW5kcmFzQGdtYWlsLmNvbT4KPiArICovCj4gKwo+ICsjaWZuZGVmIF9DQ1VfU1VOOElf Vjg1M19SX0gKPiArI2RlZmluZSBfQ0NVX1NVTjhJX1Y4NTNfUl9ICj4gKwo+ICsjaW5jbHVkZSA8 ZHQtYmluZGluZ3MvY2xvY2svYWxsd2lubmVyLHN1bjhpLXY4NTMtci1jY3UuaD4KPiArI2luY2x1 ZGUgPGR0LWJpbmRpbmdzL3Jlc2V0L2FsbHdpbm5lcixzdW44aS12ODUzLXItY2N1Lmg+Cj4gKwo+ ICsjZGVmaW5lIENMS19OVU1CRVIJCShDTEtfQlVTX1JfQ1BVQ0ZHICsgMSkKPiArCj4gKyNlbmRp Zgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1My5jIGIv ZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMuYwo+IG5ldyBmaWxlIG1vZGUgMTAw NjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi40YjMyZjNhOTEzY2YKPiAtLS0gL2Rldi9udWxsCj4g KysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMuYwo+IEBAIC0wLDAgKzEs MTE0NSBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ICsvKgo+ICsg KiBDb3B5cmlnaHQgKEMpIDIwMjUgQW5kcmFzIFN6ZW16byA8c3plbXpvLmFuZHJhc0BnbWFpbC5j b20+Cj4gKyAqCj4gKyAqIEJhc2VkIG9uIGNjdS1zdW4yMGktZDEuYyBieSBTYW11ZWwgSG9sbGFu ZC4KPiArICovCj4gKwo+ICsjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+Cj4gKyNpbmNs dWRlIDxsaW51eC9pby5oPgo+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gKyNpbmNsdWRl IDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiArCj4gKyNpbmNsdWRlICIuLi9jbGsuaCIKPiAr Cj4gKyNpbmNsdWRlICJjY3VfY29tbW9uLmgiCj4gKyNpbmNsdWRlICJjY3VfcmVzZXQuaCIKPiAr Cj4gKyNpbmNsdWRlICJjY3VfZGl2LmgiCj4gKyNpbmNsdWRlICJjY3VfZ2F0ZS5oIgo+ICsjaW5j bHVkZSAiY2N1X21wLmgiCj4gKyNpbmNsdWRlICJjY3VfbXVsdC5oIgo+ICsjaW5jbHVkZSAiY2N1 X25rLmgiCj4gKyNpbmNsdWRlICJjY3VfbmttLmgiCj4gKyNpbmNsdWRlICJjY3VfbmttcC5oIgo+ ICsjaW5jbHVkZSAiY2N1X25tLmgiCj4gKwo+ICsjaW5jbHVkZSAiY2N1LXN1bjhpLXY4NTMuaCIK PiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX3BhcmVudF9kYXRhIG9zYzI0TVtdID0gewo+ ICsJeyAuZndfbmFtZSA9ICJob3NjIiB9Cj4gK307Cj4gKwo+ICsvKgo+ICsgKiBGb3IgdGhlIENQ VSBQTEwsIHRoZSBvdXRwdXQgZGl2aWRlciBpcyBkZXNjcmliZWQgYXMgIm9ubHkgZm9yIHRlc3Rp bmciCj4gKyAqIGluIHRoZSB1c2VyIG1hbnVhbC4gU28gaXQncyBub3QgbW9kZWxsZWQgYW5kIGZv cmNlZCB0byAwLgo+ICsgKi8KPiArI2RlZmluZSBTVU44SV9WODUzX1BMTF9DUFVfUkVHCQkweDAw MAo+ICsKPiArc3RhdGljIHN0cnVjdCBjY3VfbXVsdCBwbGxfY3B1X2NsayA9IHsKPiArCS5lbmFi bGUJCT0gQklUKDI3KSwKPiArCS5sb2NrCQk9IEJJVCgyOCksCj4gKwkubXVsdAkJPSBfU1VOWElf Q0NVX01VTFRfTUlOKDgsIDgsIDExKSwKPiArCS5jb21tb24JCT0gewo+ICsJCS5yZWcJCT0gMHgw MDAsCj4gKwkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVF9QQVJFTlRTX0RBVEEoInBsbC1jcHUiLCBv c2MyNE0sCj4gKwkJCQkJCQkgICAmY2N1X211bHRfb3BzLAo+ICsJCQkJCQkJICAgQ0xLX1NFVF9S QVRFX0dBVEUpLAo+ICsJfSwKPiArfTsKPiArCj4gKy8qIFNvbWUgUExMcyBhcmUgaW5wdXQgKiBO IC8gZGl2MSAvIFAuIE1vZGVsIHRoZW0gYXMgTktNUCB3aXRoIG5vIEsgKi8KPiArI2RlZmluZSBT VU44SV9WODUzX1BMTF9ERFJfUkVHCQkweDAxMAo+ICtzdGF0aWMgc3RydWN0IGNjdV9ua21wIHBs bF9kZHJfY2xrID0gewo+ICsJLmVuYWJsZQkJPSBCSVQoMjcpLAo+ICsJLmxvY2sJCT0gQklUKDI4 KSwKPiArCS5uCQk9IF9TVU5YSV9DQ1VfTVVMVF9NSU4oOCwgOCwgMTEpLAo+ICsJLm0JCT0gX1NV TlhJX0NDVV9ESVYoMSwgMSksIC8qIGlucHV0IGRpdmlkZXIgKi8KPiArCS5wCQk9IF9TVU5YSV9D Q1VfRElWKDAsIDEpLCAvKiBvdXRwdXQgZGl2aWRlciAqLwo+ICsJLmNvbW1vbgkJPSB7Cj4gKwkJ LnJlZwkJPSAweDAxMCwKPiArCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFNfREFUQSgi cGxsLWRkciIsIG9zYzI0TSwKPiArCQkJCQkJCSAgICZjY3VfbmttcF9vcHMsCj4gKwkJCQkJCQkg ICBDTEtfU0VUX1JBVEVfR0FURSksCj4gKwl9LAo+ICt9Owo+ICsKPiArI2RlZmluZSBTVU44SV9W ODUzX1BMTF9QRVJJUEhfUkVHCTB4MDIwCj4gK3N0YXRpYyBzdHJ1Y3QgY2N1X25tIHBsbF9wZXJp cGhfNHhfY2xrID0gewo+ICsJLmVuYWJsZQkJPSBCSVQoMjcpLAo+ICsJLmxvY2sJCT0gQklUKDI4 KSwKPiArCS5uCQk9IF9TVU5YSV9DQ1VfTVVMVF9NSU4oOCwgOCwgMTEpLAo+ICsJLm0JCT0gX1NV TlhJX0NDVV9ESVYoMSwgMSksIC8qIGlucHV0IGRpdmlkZXIgKi8KPiArCS5jb21tb24JCT0gewo+ ICsJCS5yZWcJCT0gMHgwMjAsCj4gKwkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVF9QQVJFTlRTX0RB VEEoInBsbC1wZXJpcGgtNHgiLCBvc2MyNE0sCj4gKwkJCQkJCQkgICAmY2N1X25tX29wcywKPiAr CQkJCQkJCSAgIENMS19TRVRfUkFURV9HQVRFKSwKPiArCX0sCj4gK307Cj4gKwo+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGNsa19odyAqcGxsX3BlcmlwaF80eF9od3NbXSA9IHsKPiArCSZwbGxfcGVy aXBoXzR4X2Nsay5jb21tb24uaHcKPiArfTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9IV1Mo cGxsX3BlcmlwaF8yeF9jbGssICJwbGwtcGVyaXBoLTJ4IiwgcGxsX3BlcmlwaF80eF9od3MsCj4g KwkJICAgICAgIDB4MDIwLCAxNiwgMywgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX01fSFdT KHBsbF9wZXJpcGhfODAwTV9jbGssICJwbGwtcGVyaXBoLTgwME0iLCBwbGxfcGVyaXBoXzR4X2h3 cywKPiArCQkgICAgICAgMHgwMjAsIDIwLCAzLCAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1Vf TV9IV1MocGxsX3BlcmlwaF80ODBNX2NsaywgInBsbC1wZXJpcGgtNDgwTSIsIHBsbF9wZXJpcGhf NHhfaHdzLAo+ICsJCSAgICAgICAweDAyMCwgMiwgMywgMCk7Cj4gKwo+ICtzdGF0aWMgQ0xLX0ZJ WEVEX0ZBQ1RPUl9IVyhwbGxfcGVyaXBoXzYwME1fY2xrLCAicGxsLXBlcmlwaC02MDBNIiwKPiAr CQkJICAgJnBsbF9wZXJpcGhfMnhfY2xrLmNvbW1vbi5odywgMiwgMSwgMCk7Cj4gKwo+ICtzdGF0 aWMgQ0xLX0ZJWEVEX0ZBQ1RPUl9IVyhwbGxfcGVyaXBoXzQwME1fY2xrLCAicGxsLXBlcmlwaC00 MDBNIiwKPiArCQkJICAgJnBsbF9wZXJpcGhfMnhfY2xrLmNvbW1vbi5odywgMywgMSwgMCk7Cj4g Kwo+ICtzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUl9IVyhwbGxfcGVyaXBoXzMwME1fY2xrLCAicGxs LXBlcmlwaC0zMDBNIiwKPiArCQkJICAgJnBsbF9wZXJpcGhfNjAwTV9jbGsuaHcsIDIsIDEsIDAp Owo+ICsKPiArc3RhdGljIENMS19GSVhFRF9GQUNUT1JfSFcocGxsX3BlcmlwaF8yMDBNX2Nsaywg InBsbC1wZXJpcGgtMjAwTSIsCj4gKwkJCSAgICZwbGxfcGVyaXBoXzQwME1fY2xrLmh3LCAyLCAx LCAwKTsKPiArCj4gK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SX0hXKHBsbF9wZXJpcGhfMTYwTV9j bGssICJwbGwtcGVyaXBoLTE2ME0iLAo+ICsJCQkgICAmcGxsX3BlcmlwaF80ODBNX2Nsay5jb21t b24uaHcsIDMsIDEsIDApOwo+ICsKPiArc3RhdGljIENMS19GSVhFRF9GQUNUT1JfSFcocGxsX3Bl cmlwaF8xNTBNX2NsaywgInBsbC1wZXJpcGgtMTUwTSIsCj4gKwkJCSAgICZwbGxfcGVyaXBoXzMw ME1fY2xrLmh3LCAyLCAxLCAwKTsKPiArCj4gKy8qCj4gKyAqIEZvciBWaWRlbyBQTExzLCB0aGUg b3V0cHV0IGRpdmlkZXIgaXMgZGVzY3JpYmVkIGFzICJvbmx5IGZvciB0ZXN0aW5nIgo+ICsgKiBp biB0aGUgdXNlciBtYW51YWwuCj4gKyAqLwo+ICsjZGVmaW5lIFNVTjhJX1Y4NTNfUExMX1ZJREVP X1JFRwkweDA0MAo+ICtzdGF0aWMgc3RydWN0IGNjdV9ua21wIHBsbF92aWRlb180eF9jbGsgPSB7 Cj4gKwkuZW5hYmxlCQk9IEJJVCgyNyksCj4gKwkubG9jawkJPSBCSVQoMjgpLAo+ICsJLm4JCT0g X1NVTlhJX0NDVV9NVUxUX01JTig4LCA4LCAxMSksCj4gKwkucAkJPSBfU1VOWElfQ0NVX0RJVigx LCAxKSwgLyogaW5wdXQgZGl2aWRlciAqLwo+ICsJLmNvbW1vbgkJPSB7Cj4gKwkJLnJlZwkJPSAw eDA0MCwKPiArCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFNfREFUQSgicGxsLXZpZGVv LTR4Iiwgb3NjMjRNLAo+ICsJCQkJCQkJICAgJmNjdV9ua21wX29wcywKPiArCQkJCQkJCSAgIENM S19TRVRfUkFURV9HQVRFKSwKPiArCX0sCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0 IGNsa19odyAqcGxsX3ZpZGVvXzR4X2h3c1tdID0gewo+ICsJJnBsbF92aWRlb180eF9jbGsuY29t bW9uLmh3Cj4gK307Cj4gK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SX0hXUyhwbGxfdmlkZW9fMnhf Y2xrLCAicGxsLXZpZGVvLTJ4IiwKPiArCQkJICAgIHBsbF92aWRlb180eF9od3MsIDIsIDEsIENM S19TRVRfUkFURV9QQVJFTlQpOwo+ICtzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUl9IV1MocGxsX3Zp ZGVvXzF4X2NsaywgInBsbC12aWRlby0xeCIsCj4gKwkJCSAgICBwbGxfdmlkZW9fNHhfaHdzLCA0 LCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKPiArCj4gKwo+ICsvKgo+ICsgKiBGb3IgQ1NJIFBM THMsIHRoZSBvdXRwdXQgZGl2aWRlciBpcyBkZXNjcmliZWQgYXMgIm9ubHkgZm9yIHRlc3Rpbmci Cj4gKyAqIGluIHRoZSB1c2VyIG1hbnVhbC4KPiArICovCj4gKyNkZWZpbmUgU1VOOElfVjg1M19Q TExfQ1NJX1JFRwkJMHgwNDgKPiArc3RhdGljIHN0cnVjdCBjY3VfbmttcCBwbGxfY3NpXzR4X2Ns ayA9IHsKPiArCS5lbmFibGUJCT0gQklUKDI3KSwKPiArCS5sb2NrCQk9IEJJVCgyOCksCj4gKwku bgkJPSBfU1VOWElfQ0NVX01VTFRfTUlOKDgsIDgsIDExKSwKPiArCS5wCQk9IF9TVU5YSV9DQ1Vf RElWKDEsIDEpLCAvKiBpbnB1dCBkaXZpZGVyICovCj4gKwkuY29tbW9uCQk9IHsKPiArCQkucmVn CQk9IDB4MDQ4LAo+ICsJCS5ody5pbml0CT0gQ0xLX0hXX0lOSVRfUEFSRU5UU19EQVRBKCJwbGwt Y3NpLTR4Iiwgb3NjMjRNLAo+ICsJCQkJCQkJICAgJmNjdV9ua21wX29wcywKPiArCQkJCQkJCSAg IENMS19TRVRfUkFURV9HQVRFKSwKPiArCX0sCj4gK307Cj4gKwo+ICtzdGF0aWMgQ0xLX0ZJWEVE X0ZBQ1RPUl9IVyhwbGxfY3NpX2NsaywgInBsbC1jc2kiLAo+ICsJCQkgICAmcGxsX2NzaV80eF9j bGsuY29tbW9uLmh3LCA0LCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKPiArCj4gKwo+ICsjZGVm aW5lIFNVTjhJX1Y4NTNfUExMX0FVRElPX1JFRwkweDA3OAo+ICtzdGF0aWMgc3RydWN0IGNjdV9z ZG1fc2V0dGluZyBwbGxfYXVkaW9fZGl2NV9zZG1fdGFibGVbXSA9IHsKPiArCXsgLnJhdGUgPSAx OTY2MDgwMDAsIC5wYXR0ZXJuID0gMHhjMDAxZWI4NSwgLm0gPSA1LCAubiA9IDQwIH0sIC8qIDI0 LjU3NiAqLwo+ICsJeyAucmF0ZSA9IDY3NzM3NjAwLCAucGF0dGVybiA9IDB4YzAwMTI4OGQsIC5t ID0gOCwgLm4gPSAyMiB9LCAvKiAyMi41NzkyICovCj4gK307Cj4gKwo+ICtzdGF0aWMgc3RydWN0 IGNjdV9ubSBwbGxfYXVkaW9fZGl2NV9jbGsgPSB7Cj4gKwkuZW5hYmxlCQk9IEJJVCgyNyksCj4g KwkubG9jayAgICAgICAgICAgPSBCSVQoMjgpLAo+ICsJLm4gICAgICAgICAgICAgID0gX1NVTlhJ X0NDVV9NVUxUKDgsIDgpLAo+ICsJLm0gICAgICAgICAgICAgID0gX1NVTlhJX0NDVV9ESVYoMjAs IDMpLAo+ICsJLnNkbSAgICAgICAgICAgID0gX1NVTlhJX0NDVV9TRE0ocGxsX2F1ZGlvX2RpdjVf c2RtX3RhYmxlLAo+ICsJCQkJICAgIEJJVCgyNCksIDB4MDE3OCwgQklUKDMxKSksCj4gKwkuY29t bW9uICAgICAgICAgPSB7Cj4gKwkJLnJlZyAgICAgICAgICAgID0gMHgwMDc4LAo+ICsJCS5mZWF0 dXJlcyAgICAgICA9IENDVV9GRUFUVVJFX1NJR01BX0RFTFRBX01PRCwKPiArCQkuaHcuaW5pdCAg ICAgICAgPSBDTEtfSFdfSU5JVF9QQVJFTlRTX0RBVEEoInBsbC1hdWRpby1kaXY1Iiwgb3NjMjRN LAo+ICsJCQkJCQkJICAgJmNjdV9ubV9vcHMsCj4gKwkJCQkJCQkgICBDTEtfU0VUX1JBVEVfVU5H QVRFKSwKPiArCX0sCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqcGxs X2F1ZGlvX2RpdjVfaHdzW10gPSB7Cj4gKwkmcGxsX2F1ZGlvX2RpdjVfY2xrLmNvbW1vbi5odwo+ ICt9Owo+ICsKPiArc3RhdGljIFNVTlhJX0NDVV9NX0hXUyhwbGxfYXVkaW9fMXhfY2xrLCAicGxs LWF1ZGlvLTF4IiwgcGxsX2F1ZGlvX2RpdjVfaHdzLAo+ICsJCSAgICAgICAweGUwMCwgMCwgNSwg Q0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4gKwo+ICsvKiBwbGwtYXVkaW8tZGl2MiBhbmQgcGxsLWF1 ZGlvLTR4IG5vdCB1c2VkLCBiZWNhdXNlIHBsbC1hdWRpby0xeCBjYW4gY292ZXIgCj4gKyAqIDIy LjU3OTJNIGFuZCAyNC41NzZNIAo+ICsgKi8KPiArc3RhdGljIFNVTlhJX0NDVV9NKHBsbF9hdWRp b19kaXYyX2NsaywgInBsbC1hdWRpby1kaXYyIiwgInBsbC1hdWRpbyIsCj4gKwkJICAgMHgwNzgs IDE2LCAzLCAwKTsKPiArc3RhdGljIFNVTlhJX0NDVV9NKHBsbF9hdWRpb180eF9jbGssICJwbGwt YXVkaW8tNHgiLCAicGxsLWF1ZGlvLWRpdjIiLAo+ICsJCSAgIDB4ZTAwLCA1LCA1LCAwKTsKPiAr Cj4gKy8qCj4gKyAqIEZvciB0aGUgTlBVIFBMTCwgdGhlIG91dHB1dCBkaXZpZGVyIGlzIGRlc2Ny aWJlZCBhcyAib25seSBmb3IgdGVzdGluZyIKPiArICogaW4gdGhlIHVzZXIgbWFudWFsLgo+ICsg Ki8KPiArI2RlZmluZSBTVU44SV9WODUzX1BMTF9OUFVfUkVHCQkweDA4MAo+ICtzdGF0aWMgc3Ry dWN0IGNjdV9ua21wIHBsbF9ucHVfNHhfY2xrID0gewo+ICsJLmVuYWJsZQkJPSBCSVQoMjcpLAo+ ICsJLmxvY2sJCT0gQklUKDI4KSwKPiArCS5uCQk9IF9TVU5YSV9DQ1VfTVVMVF9NSU4oOCwgOCwg MTEpLAo+ICsJLnAJCT0gX1NVTlhJX0NDVV9ESVYoMSwgMSksIC8qIGlucHV0IGRpdmlkZXIgKi8K PiArCS5jb21tb24JCT0gewo+ICsJCS5yZWcJCT0gMHgwODAsCj4gKwkJLmh3LmluaXQJPSBDTEtf SFdfSU5JVF9QQVJFTlRTX0RBVEEoInBsbC1ucHUtNHgiLCBvc2MyNE0sCj4gKwkJCQkJCQkgICAm Y2N1X25rbXBfb3BzLAo+ICsJCQkJCQkJICAgQ0xLX1NFVF9SQVRFX1VOR0FURSksCj4gKwl9LAo+ ICt9Owo+ICsKPiArLyoKPiArICogVGhlIENQVSBnYXRlIGlzIG5vdCBtb2RlbGxlZCAtIGl0IGlz IGluIGEgc2VwYXJhdGUgcmVnaXN0ZXIgKDB4NTA0KQo+ICsgKiBhbmQgaGFzIGEgc3BlY2lhbCBr ZXkgZmllbGQuIFRoZSBjbG9jayBtdXN0IG5vdCBiZSBnYXRlZCBhbnl3YXkgYnkKPiArICogdGhl IGtlcm5lbC4KPiArICovCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX3BhcmVudF9kYXRhIGNw dV9wYXJlbnRzW10gPSB7Cj4gKwl7IC5md19uYW1lID0gImhvc2MiIH0sCj4gKwl7IC5md19uYW1l ID0gImxvc2MiIH0sCj4gKwl7IC5md19uYW1lID0gImlvc2MiIH0sCj4gKwl7IC5odyA9ICZwbGxf Y3B1X2Nsay5jb21tb24uaHcgfSwKPiArCXsgLmh3ID0gJnBsbF9wZXJpcGhfNjAwTV9jbGsuaHcg fSwKPiArCXsgLmh3ID0gJnBsbF9wZXJpcGhfODAwTV9jbGsuY29tbW9uLmh3IH0sCj4gK307Cj4g Kwo+ICsvKgo+ICsgKiBUaGVyZSBpcyBhIFAgZmFjdG9yIChQTExfT1VUX0VYVF9ESVZQWzE3OjE2 XSkgaW4gdGhpcyByZWdpc3RlciwgYnV0IGl0IGlzIG5vdCBtb2RlbGVkLgo+ICsgKiBUaGUgbWFu dWFsIHN0YXRlcyB0aGF0IGl0IHNob3VsZCBiZSB1c2VkIG9ubHksIHdoZW4gdGhlIG91dHB1dCBj bG9jayBpcyBsZXNzIHRoYW4gMjg4IE1Iei4KPiArICovCj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVVY X0RBVEEoY3B1X2NsaywgImNwdSIsIGNwdV9wYXJlbnRzLAo+ICsJCQkgIDB4NTAwLCAyNCwgMywg Q0xLX1NFVF9SQVRFX1BBUkVOVCB8IENMS19JU19DUklUSUNBTCk7Cj4gKwo+ICtzdGF0aWMgY29u c3Qgc3RydWN0IGNsa19odyAqY3B1X2h3c1tdID0geyAmY3B1X2Nsay5jb21tb24uaHcgfTsKPiAr Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9IV1MoY3B1X2F4aV9jbGssICJjcHUtYXhpIiwgY3B1X2h3 cywKPiArCQkgICAgICAgMHg1MDAsIDAsIDIsIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX01fSFdT KGNwdV9hcGJfY2xrLCAiY3B1LWFwYiIsIGNwdV9od3MsCj4gKwkJICAgICAgIDB4NTAwLCA4LCAy LCAwKTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX3BhcmVudF9kYXRhIGFoYl9wYXJl bnRzW10gPSB7Cj4gKwl7IC5md19uYW1lID0gImhvc2MiIH0sCj4gKwl7IC5md19uYW1lID0gImxv c2MiIH0sCj4gKwl7IC5md19uYW1lID0gImlvc2MiIH0sCj4gKwl7IC5odyA9ICZwbGxfcGVyaXBo XzYwME1fY2xrLmh3IH0sCj4gK307Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfREFUQV9XSVRIX01V WChhaGJfY2xrLCAiYWhiIiwgYWhiX3BhcmVudHMsIDB4NTEwLAo+ICsJCQkJICAwLCA1LAkJLyog TSAqLwo+ICsJCQkJICA4LCAyLAkJLyogUCAqLwo+ICsJCQkJICAyNCwgMiwJLyogbXV4ICovCj4g KwkJCQkgIDApOwo+ICsKPiArc3RhdGljIFNVTlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYKGFwYjBf Y2xrLCAiYXBiMCIsIGFoYl9wYXJlbnRzLCAweDUyMCwKPiArCQkJCSAgMCwgNSwJCS8qIE0gKi8K PiArCQkJCSAgOCwgMiwJCS8qIFAgKi8KPiArCQkJCSAgMjQsIDIsCS8qIG11eCAqLwo+ICsJCQkJ ICAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfREFUQV9XSVRIX01VWChhcGIxX2Nsaywg ImFwYjEiLCBhaGJfcGFyZW50cywgMHg1MjQsCj4gKwkJCQkgIDAsIDUsCQkvKiBNICovCj4gKwkJ CQkgIDgsIDIsCQkvKiBQICovCj4gKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KPiArCQkJCSAgMCk7 Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqYWhiX2h3c1tdID0geyAmYWhiX2Ns ay5jb21tb24uaHcgfTsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcgKmFwYjBfaHdzW10g PSB7ICZhcGIwX2Nsay5jb21tb24uaHcgfTsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcg KmFwYjFfaHdzW10gPSB7ICZhcGIxX2Nsay5jb21tb24uaHcgfTsKPiArCj4gKwo+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGNsa19odyAqZGVfZzJkX3BhcmVudHNbXSA9IHsKPiArCSZwbGxfcGVyaXBo XzMwME1fY2xrLmh3LAo+ICsJJnBsbF92aWRlb18xeF9jbGsuaHcsCj4gK307Cj4gK3N0YXRpYyBT VU5YSV9DQ1VfTV9IV19XSVRIX01VWF9HQVRFKGRlX2NsaywgImRlIiwgZGVfZzJkX3BhcmVudHMs IDB4NjAwLAo+ICsJCQkJICAgIDAsIDUsCS8qIE0gKi8KPiArCQkJCSAgICAyNCwgMSwJLyogbXV4 ICovCj4gKwkJCQkgICAgQklUKDMxKSwJLyogZ2F0ZSAqLwo+ICsJCQkJICAgIENMS19TRVRfUkFU RV9QQVJFTlQpOwo+ICsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfZGVfY2xrLCAi YnVzLWRlIiwgYWhiX2h3cywKPiArCQkJICAweDYwYywgQklUKDApLCAwKTsKPiArCj4gK3N0YXRp YyBTVU5YSV9DQ1VfTV9IV19XSVRIX01VWF9HQVRFKGcyZF9jbGssICJnMmQiLCBkZV9nMmRfcGFy ZW50cywgMHg2MzAsCj4gKwkJCQkgICAgMCwgNSwJLyogTSAqLwo+ICsJCQkJICAgIDI0LCAxLAkv KiBtdXggKi8KPiArCQkJCSAgICBCSVQoMzEpLAkvKiBnYXRlICovCj4gKwkJCQkgICAgQ0xLX1NF VF9SQVRFX1BBUkVOVCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19nMmRf Y2xrLCAiYnVzLWcyZCIsIGFoYl9od3MsCj4gKwkJCSAgMHg2M2MsIEJJVCgwKSwgMCk7Cj4gKwo+ ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfcGFyZW50X2RhdGEgY2VfcGFyZW50c1tdID0g ewo+ICsJeyAuZndfbmFtZSA9ICJob3NjIiB9LAoKV2hlcmUgdGhpcyBjb21lIGZyb20/IFY4NTMg bWFudWFsIHYxLjEgZG9lc24ndCBoYXZlIGl0LgoKPiArCXsgLmh3ID0gJnBsbF9wZXJpcGhfNDAw TV9jbGsuaHcsIH0sCj4gKwl7IC5odyA9ICZwbGxfcGVyaXBoXzMwME1fY2xrLmh3LCB9Cj4gK307 Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9EQVRBX1dJVEhfTVVYX0dBVEUoY2VfY2xrLCAiY2UiLCBj ZV9wYXJlbnRzLCAweDY4MCwKPiArCQkJCSAgICAgIDAsIDQsCS8qIE0gKi8KPiArCQkJCSAgICAg IDI0LCAzLAkvKiBtdXggKi8KPiArCQkJCSAgICAgIEJJVCgzMSksCS8qIGdhdGUgKi8KPiArCQkJ CSAgICAgIENMS19TRVRfUkFURV9QQVJFTlQpOwoKU2V0IHJhdGUgcGFyZW50IGZsYWcgZG9lc24n dCBtYWtlIHNlbnNlIG9uIGNvbnN0YW50IHBhcmVudHMuCgo+ICsKPiArc3RhdGljIFNVTlhJX0ND VV9HQVRFX0hXUyhidXNfY2VfY2xrLCAiYnVzLWNlIiwgYWhiX2h3cywKPiArCQkJICAweDY4Yywg QklUKDApIHwgQklUKDEpLCAwKTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3ICp2 ZV9wYXJlbnRzW10gPSB7Cj4gKwkmcGxsX3BlcmlwaF8zMDBNX2Nsay5odywKPiArCSZwbGxfcGVy aXBoXzQwME1fY2xrLmh3LAo+ICsJJnBsbF9wZXJpcGhfNDgwTV9jbGsuY29tbW9uLmh3LAo+ICsJ JnBsbF9ucHVfNHhfY2xrLmNvbW1vbi5odywKPiArCSZwbGxfdmlkZW9fNHhfY2xrLmNvbW1vbi5o dywKPiArCSZwbGxfY3NpXzR4X2Nsay5jb21tb24uaHcsCj4gK307Cj4gK3N0YXRpYyBTVU5YSV9D Q1VfTV9IV19XSVRIX01VWF9HQVRFKHZlX2NsaywgInZlIiwgdmVfcGFyZW50cywgMHg2OTAsCj4g KwkJCQkgICAgMCwgNSwJLyogTSAqLwo+ICsJCQkJICAgIDI0LCAzLAkvKiBtdXggKi8KPiArCQkJ CSAgICBCSVQoMzEpLAkvKiBnYXRlICovCj4gKwkJCQkgICAgMCk7CgpDTEtfU0VUX1JBVEVfUEFS RU5UIGZsYWc/IENlZHJ1cyBkcml2ZXIgc2V0IHdvcmtpbmcgY2xvY2sgYXQgdGhlIGJlZ2lubmlu Zy4KCj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c192ZV9jbGssICJidXMtdmUi LCBhaGJfaHdzLAo+ICsJCQkgIDB4NjljLCBCSVQoMCksIDApOwo+ICsKPiArCj4gK3N0YXRpYyBj b25zdCBzdHJ1Y3QgY2xrX2h3ICpucHVfcGFyZW50c1tdID0gewo+ICsJJnBsbF9wZXJpcGhfNDgw TV9jbGsuY29tbW9uLmh3LAo+ICsJJnBsbF9wZXJpcGhfNjAwTV9jbGsuaHcsCj4gKwkmcGxsX3Bl cmlwaF84MDBNX2Nsay5jb21tb24uaHcsCj4gKwkmcGxsX25wdV80eF9jbGsuY29tbW9uLmh3LAo+ ICt9Owo+ICtzdGF0aWMgU1VOWElfQ0NVX01fSFdfV0lUSF9NVVhfR0FURShucHVfY2xrLCAibnB1 IiwgbnB1X3BhcmVudHMsIDB4NmUwLAo+ICsJCQkJICAgIDAsIDUsCS8qIE0gKi8KPiArCQkJCSAg ICAyNCwgMywJLyogbXV4ICovCj4gKwkJCQkgICAgQklUKDMxKSwJLyogZ2F0ZSAqLwo+ICsJCQkJ ICAgIDApOwoKSSB0aGluayBDTEtfU0VUX1JBVEVfUEFSRU5UIHdvdWxkIGFsc28gYmUgYmVuZWZp Y2lhbCBoZXJlLgoKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX25wdV9jbGss ICJidXMtbnB1IiwgYWhiX2h3cywKPiArCQkJICAweDZlYywgQklUKDApLCAwKTsKPiArCj4gK3N0 YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2RtYV9jbGssICJidXMtZG1hIiwgYWhiX2h3cywK PiArCQkJICAweDcwYywgQklUKDApLCAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9I V1MoYnVzX21zZ2JveDBfY2xrLCAiYnVzLW1zZ2JveDAiLCBhaGJfaHdzLAo+ICsJCQkgIDB4NzFj LCBCSVQoMCksIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19tc2dib3gxX2Ns aywgImJ1cy1tc2dib3gxIiwgYWhiX2h3cywKPiArCQkJICAweDcxYywgQklUKDEpLCAwKTsKPiAr Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX3NwaW5sb2NrX2NsaywgImJ1cy1zcGlu bG9jayIsIGFoYl9od3MsCj4gKwkJCSAgMHg3MmMsIEJJVCgwKSwgMCk7Cj4gKwo+ICtzdGF0aWMg U1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19oc3RpbWVyX2NsaywgImJ1cy1oc3RpbWVyIiwgYWhiX2h3 cywKPiArCQkJICAweDczYywgQklUKDApLCAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FU RV9EQVRBKGF2c19jbGssICJhdnMiLCBvc2MyNE0sCj4gKwkJCSAgIDB4NzQwLCBCSVQoMzEpLCAw KTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2RiZ19jbGssICJidXMtZGJn IiwgYWhiX2h3cywKPiArCQkJICAweDc4YywgQklUKDApLCAwKTsKPiArCj4gK3N0YXRpYyBTVU5Y SV9DQ1VfR0FURV9IV1MoYnVzX3B3bV9jbGssICJidXMtcHdtIiwgYXBiMF9od3MsCj4gKwkJCSAg MHg3YWMsIEJJVCgwKSwgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19p b21tdV9jbGssICJidXMtaW9tbXUiLCBhaGJfaHdzLAo+ICsJCQkgIDB4N2JjLCBCSVQoMCksIDAp Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcgKmRyYW1fcGFyZW50c1tdID0gewo+ ICsJJnBsbF9kZHJfY2xrLmNvbW1vbi5odywKPiArCSZwbGxfcGVyaXBoXzJ4X2Nsay5jb21tb24u aHcsCj4gKwkmcGxsX3BlcmlwaF84MDBNX2Nsay5jb21tb24uaHcsCj4gK307Cj4gK3N0YXRpYyBT VU5YSV9DQ1VfTVBfSFdfV0lUSF9NVVhfR0FURShkcmFtX2NsaywgImRyYW0iLCBkcmFtX3BhcmVu dHMsIDB4ODAwLAo+ICsJCQkJICAgICAwLCA1LAkvKiBNICovCj4gKwkJCQkgICAgIDgsIDIsCS8q IFAgKi8KPiArCQkJCSAgICAgMjQsIDMsCS8qIG11eCAqLwo+ICsJCQkJICAgICBCSVQoMzEpLCBD TEtfSVNfQ1JJVElDQUwpOwoKVGhpcyBjbG9jayBuZWVkcyB1cGRhdGUgZmllbGQgdG8gYmUgc2V0 IHRvIGFjdHVhbGx5IGFwcGx5IGNvbmZpZ3VyYXRpb24uIFNvCnNhbWUgY29tbWVudCBhcyBvbiBB NTIzIGNsb2NrIHZlcnNpb24sIHRoaXMgbmVlZHMgbmV3IGZsYWcgdG8gYmUgaW50cm9kdWNlZApm b3Igc3VjaCBjYXNlLgoKPiArCj4gK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SX0hXKG1idXNfY2xr LCAibWJ1cyIsCj4gKwkJCSAgICZkcmFtX2Nsay5jb21tb24uaHcsIDQsIDEsIDApOwo+ICsKPiAr c3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcgKm1idXNfaHdzW10gPSB7ICZtYnVzX2Nsay5odyB9 Owo+ICsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhtYnVzX2RtYV9jbGssICJtYnVzLWRt YSIsIG1idXNfaHdzLAo+ICsJCQkgIDB4ODA0LCBCSVQoMCksIDApOwo+ICtzdGF0aWMgU1VOWElf Q0NVX0dBVEVfSFdTKG1idXNfdmVfY2xrLCAibWJ1cy12ZSIsIG1idXNfaHdzLAo+ICsJCQkgIDB4 ODA0LCBCSVQoMSksIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKG1idXNfY2VfY2xr LCAibWJ1cy1jZSIsIG1idXNfaHdzLAo+ICsJCQkgIDB4ODA0LCBCSVQoMiksIDApOwo+ICtzdGF0 aWMgU1VOWElfQ0NVX0dBVEVfSFdTKG1idXNfY3NpX2NsaywgIm1idXMtY3NpIiwgbWJ1c19od3Ms Cj4gKwkJCSAgMHg4MDQsIEJJVCg4KSwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1Mo bWJ1c19pc3BfY2xrLCAibWJ1cy1pc3AiLCBtYnVzX2h3cywKPiArCQkJICAweDgwNCwgQklUKDkp LCAwKTsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhtYnVzX2cyZF9jbGssICJtYnVzLWcy ZCIsIG1idXNfaHdzLAo+ICsJCQkgIDB4ODA0LCBCSVQoMTApLCAwKTsKPiArCj4gK3N0YXRpYyBT VU5YSV9DQ1VfR0FURV9IV1MoYnVzX2RyYW1fY2xrLCAiYnVzLWRyYW0iLCBhaGJfaHdzLAo+ICsJ CQkgIDB4ODBjLCBCSVQoMCksIENMS19JU19DUklUSUNBTCk7Cj4gKwo+ICsKPiArc3RhdGljIGNv bnN0IHN0cnVjdCBjbGtfcGFyZW50X2RhdGEgbW1jMF9tbWMxX3BhcmVudHNbXSA9IHsKPiArCXsg LmZ3X25hbWUgPSAiaG9zYyIgfSwKPiArCXsgLmh3ID0gJnBsbF9wZXJpcGhfNDAwTV9jbGsuaHcs IH0sCj4gKwl7IC5odyA9ICZwbGxfcGVyaXBoXzMwME1fY2xrLmh3LCB9LAo+ICt9OwoKSnVzdCBt bWNfcGFyZW50cy4KCj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfREFUQV9XSVRIX01VWF9HQVRFKG1t YzBfY2xrLCAibW1jMCIsIG1tYzBfbW1jMV9wYXJlbnRzLCAweDgzMCwKPiArCQkJCSAgICAgICAw LCA0LAkvKiBNICovCj4gKwkJCQkgICAgICAgOCwgMiwJLyogUCAqLwo+ICsJCQkJICAgICAgIDI0 LCAzLAkvKiBtdXggKi8KPiArCQkJCSAgICAgICBCSVQoMzEpLAkvKiBnYXRlICovCj4gKwkJCQkg ICAgICAgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX01QX0RBVEFfV0lUSF9NVVhfR0FURSht bWMxX2NsaywgIm1tYzEiLCBtbWMwX21tYzFfcGFyZW50cywgMHg4MzQsCj4gKwkJCQkgICAgICAg MCwgNCwJLyogTSAqLwo+ICsJCQkJICAgICAgIDgsIDIsCS8qIFAgKi8KPiArCQkJCSAgICAgICAy NCwgMywJLyogbXV4ICovCj4gKwkJCQkgICAgICAgQklUKDMxKSwJLyogZ2F0ZSAqLwo+ICsJCQkJ ICAgICAgIDApOwo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfcGFyZW50X2RhdGEgbW1j Ml9wYXJlbnRzW10gPSB7Cj4gKwl7IC5md19uYW1lID0gImhvc2MiIH0sCj4gKwl7IC5odyA9ICZw bGxfcGVyaXBoXzYwME1fY2xrLmh3LCB9LAo+ICsJeyAuaHcgPSAmcGxsX3BlcmlwaF80MDBNX2Ns ay5odywgfSwKPiArfTsKPiArc3RhdGljIFNVTlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYX0dBVEUo bW1jMl9jbGssICJtbWMyIiwgbW1jMl9wYXJlbnRzLCAweDgzOCwKPiArCQkJCSAgICAgICAwLCA0 LAkvKiBNICovCj4gKwkJCQkgICAgICAgOCwgMiwJLyogUCAqLwo+ICsJCQkJICAgICAgIDI0LCAz LAkvKiBtdXggKi8KPiArCQkJCSAgICAgICBCSVQoMzEpLAkvKiBnYXRlICovCj4gKwkJCQkgICAg ICAgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19tbWMwX2NsaywgImJ1 cy1tbWMwIiwgYWhiX2h3cywKPiArCQkJICAweDg0YywgQklUKDApLCAwKTsKPiArc3RhdGljIFNV TlhJX0NDVV9HQVRFX0hXUyhidXNfbW1jMV9jbGssICJidXMtbW1jMSIsIGFoYl9od3MsCj4gKwkJ CSAgMHg4NGMsIEJJVCgxKSwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX21t YzJfY2xrLCAiYnVzLW1tYzIiLCBhaGJfaHdzLAo+ICsJCQkgIDB4ODRjLCBCSVQoMiksIDApOwo+ ICsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfdWFydDBfY2xrLCAiYnVzLXVhcnQw IiwgYXBiMV9od3MsCj4gKwkJCSAgMHg5MGMsIEJJVCgwKSwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9D Q1VfR0FURV9IV1MoYnVzX3VhcnQxX2NsaywgImJ1cy11YXJ0MSIsIGFwYjFfaHdzLAo+ICsJCQkg IDB4OTBjLCBCSVQoMSksIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c191YXJ0 Ml9jbGssICJidXMtdWFydDIiLCBhcGIxX2h3cywKPiArCQkJICAweDkwYywgQklUKDIpLCAwKTsK PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfdWFydDNfY2xrLCAiYnVzLXVhcnQzIiwg YXBiMV9od3MsCj4gKwkJCSAgMHg5MGMsIEJJVCgzKSwgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElf Q0NVX0dBVEVfSFdTKGJ1c19pMmMwX2NsaywgImJ1cy1pMmMwIiwgYXBiMV9od3MsCj4gKwkJCSAg MHg5MWMsIEJJVCgwKSwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2kyYzFf Y2xrLCAiYnVzLWkyYzEiLCBhcGIxX2h3cywKPiArCQkJICAweDkxYywgQklUKDEpLCAwKTsKPiAr c3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfaTJjMl9jbGssICJidXMtaTJjMiIsIGFwYjFf aHdzLAo+ICsJCQkgIDB4OTFjLCBCSVQoMiksIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVf SFdTKGJ1c19pMmMzX2NsaywgImJ1cy1pMmMzIiwgYXBiMV9od3MsCj4gKwkJCSAgMHg5MWMsIEJJ VCgzKSwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2kyYzRfY2xrLCAiYnVz LWkyYzQiLCBhcGIxX2h3cywKPiArCQkJICAweDkxYywgQklUKDQpLCAwKTsKPiArCj4gK3N0YXRp YyBjb25zdCBzdHJ1Y3QgY2xrX3BhcmVudF9kYXRhIHNwaV9wYXJlbnRzW10gPSB7Cj4gKwl7IC5m d19uYW1lID0gImhvc2MiIH0sCj4gKwl7IC5odyA9ICZwbGxfcGVyaXBoXzMwME1fY2xrLmh3LCB9 LAo+ICsJeyAuaHcgPSAmcGxsX3BlcmlwaF8yMDBNX2Nsay5odywgfSwKPiArfTsKPiArCj4gK3N0 YXRpYyBTVU5YSV9DQ1VfTVBfREFUQV9XSVRIX01VWF9HQVRFKHNwaTBfY2xrLCAic3BpMCIsIHNw aV9wYXJlbnRzLCAweDk0MCwKPiArCQkJCSAgICAgICAwLCA0LAkvKiBNICovCj4gKwkJCQkgICAg ICAgOCwgMiwJLyogUCAqLwo+ICsJCQkJICAgICAgIDI0LCAzLAkvKiBtdXggKi8KPiArCQkJCSAg ICAgICBCSVQoMzEpLAkvKiBnYXRlICovCj4gKwkJCQkgICAgICAgMCk7Cj4gKwo+ICtzdGF0aWMg U1VOWElfQ0NVX01QX0RBVEFfV0lUSF9NVVhfR0FURShzcGkxX2NsaywgInNwaTEiLCBzcGlfcGFy ZW50cywgMHg5NDQsCj4gKwkJCQkgICAgICAgMCwgNCwJLyogTSAqLwo+ICsJCQkJICAgICAgIDgs IDIsCS8qIFAgKi8KPiArCQkJCSAgICAgICAyNCwgMywJLyogbXV4ICovCj4gKwkJCQkgICAgICAg QklUKDMxKSwJLyogZ2F0ZSAqLwo+ICsJCQkJICAgICAgIDApOwo+ICsKPiArc3RhdGljIFNVTlhJ X0NDVV9NUF9EQVRBX1dJVEhfTVVYX0dBVEUoc3BpMl9jbGssICJzcGkyIiwgc3BpX3BhcmVudHMs IDB4OTQ4LAo+ICsJCQkJICAgICAgIDAsIDQsCS8qIE0gKi8KPiArCQkJCSAgICAgICA4LCAyLAkv KiBQICovCj4gKwkJCQkgICAgICAgMjQsIDMsCS8qIG11eCAqLwo+ICsJCQkJICAgICAgIEJJVCgz MSksCS8qIGdhdGUgKi8KPiArCQkJCSAgICAgICAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1Vf TVBfREFUQV9XSVRIX01VWF9HQVRFKHNwaTNfY2xrLCAic3BpMyIsIHNwaV9wYXJlbnRzLCAweDk0 YywKPiArCQkJCSAgICAgICAwLCA0LAkvKiBNICovCj4gKwkJCQkgICAgICAgOCwgMiwJLyogUCAq Lwo+ICsJCQkJICAgICAgIDI0LCAzLAkvKiBtdXggKi8KPiArCQkJCSAgICAgICBCSVQoMzEpLAkv KiBnYXRlICovCj4gKwkJCQkgICAgICAgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVf SFdTKGJ1c19zcGkwX2NsaywgImJ1cy1zcGkwIiwgYWhiX2h3cywKPiArCQkJICAweDk2YywgQklU KDApLCAwKTsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfc3BpMV9jbGssICJidXMt c3BpMSIsIGFoYl9od3MsCj4gKwkJCSAgMHg5NmMsIEJJVCgxKSwgMCk7Cj4gK3N0YXRpYyBTVU5Y SV9DQ1VfR0FURV9IV1MoYnVzX3NwaTJfY2xrLCAiYnVzLXNwaTIiLCBhaGJfaHdzLAo+ICsJCQkg IDB4OTZjLCBCSVQoMiksIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19zcGkz X2NsaywgImJ1cy1zcGkzIiwgYWhiX2h3cywKPiArCQkJICAweDk2YywgQklUKDMpLCAwKTsKPiAr Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19wYXJlbnRfZGF0YSBzcGlmX3BhcmVudHNb XSA9IHsKPiArCXsgLmZ3X25hbWUgPSAiaG9zYyIgfSwKPiArCXsgLmh3ID0gJnBsbF9wZXJpcGhf NDAwTV9jbGsuaHcsIH0sCj4gKwl7IC5odyA9ICZwbGxfcGVyaXBoXzMwME1fY2xrLmh3LCB9LAo+ ICt9Owo+ICsKPiArc3RhdGljIFNVTlhJX0NDVV9NX0RBVEFfV0lUSF9NVVhfR0FURShzcGlmX2Ns aywgInNwaWYiLCBzcGlmX3BhcmVudHMsIDB4MDk1MCwKPiArCQkJCSAgICAgIDAsIDQsCS8qIE0g Ki8KPiArCQkJCSAgICAgIDI0LCAzLAkvKiBtdXggKi8KPiArCQkJCSAgICAgIEJJVCgzMSksCS8q IGdhdGUgKi8KPiArCQkJCSAgICAgIENMS19TRVRfUkFURV9QQVJFTlQpOwoKVGhpcyBpcyBNUCBj bG9jaywgUCBiZWluZyBhdCA5OjguCgo+ICsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhi dXNfc3BpZl9jbGssICJidXMtc3BpZiIsIGFoYl9od3MsCj4gKwkJCSAgMHgwOTZjLCBCSVQoNCks IDApOwo+ICsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3ICpwbGxfcGVyaXBoXzE1 ME1faHdzW10gPSB7ICZwbGxfcGVyaXBoXzE1ME1fY2xrLmh3IH07Cj4gK3N0YXRpYyBTVU5YSV9D Q1VfR0FURV9IV1NfV0lUSF9QUkVESVYoZW1hY18yNU1fY2xrLCAiZW1hYy0yNU0iLCBwbGxfcGVy aXBoXzE1ME1faHdzLAo+ICsJCQkJICAgICAgMHg5NzAsIEJJVCgzMSkgfCBCSVQoMzApLCA2LCAw KTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2VtYWNfY2xrLCAiYnVzLWVt YWMiLCBhaGJfaHdzLAo+ICsJCQkgIDB4OTdjLCBCSVQoMCksIDApOwo+ICsKPiArc3RhdGljIFNV TlhJX0NDVV9HQVRFX0hXUyhidXNfZ3BhZGNfY2xrLCAiYnVzLWdwYWRjIiwgYXBiMF9od3MsCj4g KwkJCSAgMHg5ZWMsIEJJVCgwKSwgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdT KGJ1c190aHNfY2xrLCAiYnVzLXRocyIsIGFoYl9od3MsCj4gKwkJCSAgMHg5ZmMsIEJJVCgwKSwg MCk7Cj4gKwo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcgKmF1ZGlvX3BhcmVudHNb XSA9IHsKPiArCSZwbGxfYXVkaW9fMXhfY2xrLmNvbW1vbi5odywKPiArCSZwbGxfYXVkaW9fNHhf Y2xrLmNvbW1vbi5odywKPiArfTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9IV19XSVRIX01V WF9HQVRFKGkyczBfY2xrLCAiaTJzMCIsIGF1ZGlvX3BhcmVudHMsIDB4YTEwLAo+ICsJCQkJICAg IDAsIDQsCS8qIE0gKi8KPiArCQkJCSAgICAyNCwgMSwJLyogbXV4ICovCj4gKwkJCQkgICAgQklU KDMxKSwJLyogZ2F0ZSAqLwo+ICsJCQkJICAgIENMS19TRVRfUkFURV9QQVJFTlQpOwo+ICsKPiAr c3RhdGljIFNVTlhJX0NDVV9NX0hXX1dJVEhfTVVYX0dBVEUoaTJzMV9jbGssICJpMnMxIiwgYXVk aW9fcGFyZW50cywgMHhhMTQsCj4gKwkJCQkgICAgMCwgNCwJLyogTSAqLwo+ICsJCQkJICAgIDI0 LCAxLAkvKiBtdXggKi8KPiArCQkJCSAgICBCSVQoMzEpLAkvKiBnYXRlICovCj4gKwkJCQkgICAg Q0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1 c19pMnMwX2NsaywgImJ1cy1pMnMwIiwgYWhiX2h3cywKPiArCQkJICAweGEyMCwgQklUKDApLCAw KTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2kyczFfY2xrLCAiYnVzLWky czEiLCBhaGJfaHdzLAo+ICsJCQkgIDB4YTIwLCBCSVQoMSksIDApOwo+ICsKPiArc3RhdGljIFNV TlhJX0NDVV9NX0hXX1dJVEhfTVVYX0dBVEUoZG1pY19jbGssICJkbWljIiwgYXVkaW9fcGFyZW50 cywgMHhhNDAsCj4gKwkJCQkgICAgMCwgNCwJLyogTSAqLwo+ICsJCQkJICAgIDI0LCAxLAkvKiBt dXggKi8KPiArCQkJCSAgICBCSVQoMzEpLAkvKiBnYXRlICovCj4gKwkJCQkgICAgQ0xLX1NFVF9S QVRFX1BBUkVOVCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19kbWljX2Ns aywgImJ1cy1kbWljIiwgYWhiX2h3cywKPiArCQkJICAweGE0YywgQklUKDApLCAwKTsKPiArCj4g K3N0YXRpYyBTVU5YSV9DQ1VfTV9IV19XSVRIX01VWF9HQVRFKGF1ZGlvX2NvZGVjX2RhY19jbGss ICJhdWRpby1jb2RlYy1kYWMiLCAKPiArCQkJCSAgICBhdWRpb19wYXJlbnRzLCAweGE1MCwKPiAr CQkJCSAgICAwLCA0LAkvKiBNICovCj4gKwkJCQkgICAgMjQsIDEsCS8qIG11eCAqLwo+ICsJCQkJ ICAgIEJJVCgzMSksCS8qIGdhdGUgKi8KPiArCQkJCSAgICBDTEtfU0VUX1JBVEVfUEFSRU5UKTsK PiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9IV19XSVRIX01VWF9HQVRFKGF1ZGlvX2NvZGVjX2Fk Y19jbGssICJhdWRpby1jb2RlYy1hZGMiLCAKPiArCQkJCSAgICBhdWRpb19wYXJlbnRzLCAweGE1 NCwKPiArCQkJCSAgICAwLCA0LAkvKiBNICovCj4gKwkJCQkgICAgMjQsIDEsCS8qIG11eCAqLwo+ ICsJCQkJICAgIEJJVCgzMSksCS8qIGdhdGUgKi8KPiArCQkJCSAgICBDTEtfU0VUX1JBVEVfUEFS RU5UKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2F1ZGlvX2NvZGVjX2Ns aywgImJ1cy1hdWRpby1jb2RlYyIsIGFwYjBfaHdzLAo+ICsJCQkgIDB4YTVjLCBCSVQoMCksIDAp Owo+ICsKPiArLyoKPiArICogVGhlcmUgYXJlIE9IQ0kgMTJNIGNsb2NrIHNvdXJjZSBzZWxlY3Rp b24gYml0cyBmb3IgdGhlIFVTQiAyLjAgcG9ydC4KPiArICogV2Ugd2lsbCBmb3JjZSB0aGVtIHRv IDAgKDEyTSBkaXZpZGVkIGZyb20gNDhNKS4KPiArICovCj4gK3N0YXRpYyBDTEtfRklYRURfRkFD VE9SX0ZXX05BTUUob3NjMTJNX2NsaywgIm9zYzEyTSIsICJob3NjIiwgMiwgMSwgMCk7Cj4gKwo+ ICsjZGVmaW5lIFNVTjhJX1Y4NTNfVVNCX0NMS19SRUcJCTB4YTcwCj4gKwo+ICtzdGF0aWMgU1VO WElfQ0NVX0dBVEUodXNiX29oY2lfY2xrLCAidXNiIiwgIm9zYzEyTSIsIDB4MGE3MCwgQklUKDMx KSwgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19vaGNpX2NsaywgImJ1 cy1vaGNpIiwgYWhiX2h3cywgMHhhOGMsIEJJVCgwKSwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1Vf R0FURV9IV1MoYnVzX2VoY2lfY2xrLCAiYnVzLWVoY2kiLCBhaGJfaHdzLCAweGE4YywgQklUKDQp LCAwKTsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfb3RnX2NsaywgImJ1cy1vdGci LCBhaGJfaHdzLCAweGE4YywgQklUKDgpLCAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FU RV9IV1MoYnVzX2Rwc3NfdG9wX2NsaywgImJ1cy1kcHNzLXRvcCIsIGFoYl9od3MsCj4gKwkJCSAg MHhhYmMsIEJJVCgwKSwgMCk7Cj4gKwo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfcGFy ZW50X2RhdGEgbWlwaV9kc2lfcGFyZW50c1tdID0gewo+ICsJeyAuZndfbmFtZSA9ICJob3NjIiB9 LAo+ICsJeyAuaHcgPSAmcGxsX3BlcmlwaF8yMDBNX2Nsay5odyB9LAo+ICsJeyAuaHcgPSAmcGxs X3BlcmlwaF8xNTBNX2Nsay5odyB9LAo+ICt9Owo+ICtzdGF0aWMgU1VOWElfQ0NVX01fREFUQV9X SVRIX01VWF9HQVRFKG1pcGlfZHNpX2NsaywgIm1pcGktZHNpIiwgbWlwaV9kc2lfcGFyZW50cywg Cj4gKwkJCQkgICAgICAweGIyNCwKPiArCQkJCSAgICAgIDAsIDQsCS8qIE0gKi8KPiArCQkJCSAg ICAgIDI0LCAzLAkvKiBtdXggKi8KPiArCQkJCSAgICAgIEJJVCgzMSksCS8qIGdhdGUgKi8KPiAr CQkJCSAgICAgIENMS19TRVRfUkFURV9QQVJFTlQpOwoKQ0xLX1NFVF9SQVRFX1BBUkVOVCBkb2Vz bid0IGRvIGFueXRoaW5nIGZvciBjb25zdGFudCBjbG9ja3MuCgpCZXN0IHJlZ2FyZHMsCkplcm5l agoKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX21pcGlfZHNpX2NsaywgImJ1 cy1taXBpLWRzaSIsIGFoYl9od3MsCj4gKwkJCSAgMHhiNGMsIEJJVCgwKSwgMCk7Cj4gKwo+ICsK PiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcgKnRjb25fbGNkX3BhcmVudHNbXSA9IHsKPiAr CSZwbGxfdmlkZW9fNHhfY2xrLmNvbW1vbi5odywKPiArCSZwbGxfcGVyaXBoXzJ4X2Nsay5jb21t b24uaHcsCj4gKwkmcGxsX2NzaV80eF9jbGsuY29tbW9uLmh3LAo+ICt9Owo+ICtzdGF0aWMgU1VO WElfQ0NVX01QX0hXX1dJVEhfTVVYX0dBVEUodGNvbl9sY2RfY2xrLCAidGNvbi1sY2QiLCB0Y29u X2xjZF9wYXJlbnRzLCAKPiArCQkJCSAgICAgMHhiNjAsCj4gKwkJCQkgICAgIDAsIDQsCS8qIE0g Ki8KPiArCQkJCSAgICAgOCwgMiwJLyogUCAqLwo+ICsJCQkJICAgICAyNCwgMywJLyogbXV4ICov Cj4gKwkJCQkgICAgIEJJVCgzMSksCS8qIGdhdGUgKi8KPiArCQkJCSAgICAgQ0xLX1NFVF9SQVRF X1BBUkVOVCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c190Y29uX2xjZF9j bGssICJidXMtdGNvbi1sY2QiLCBhaGJfaHdzLAo+ICsJCQkgIDB4YjdjLCBCSVQoMCksIDApOwo+ ICsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3ICpjc2lfdG9wX3BhcmVudHNbXSA9 IHsKPiArCSZwbGxfcGVyaXBoXzMwME1fY2xrLmh3LAo+ICsJJnBsbF9wZXJpcGhfNDAwTV9jbGsu aHcsCj4gKwkmcGxsX3ZpZGVvXzR4X2Nsay5jb21tb24uaHcsCj4gKwkmcGxsX2NzaV80eF9jbGsu Y29tbW9uLmh3LAo+ICt9Owo+ICtzdGF0aWMgU1VOWElfQ0NVX01fSFdfV0lUSF9NVVhfR0FURShj c2lfdG9wX2NsaywgImNzaS10b3AiLCBjc2lfdG9wX3BhcmVudHMsIDB4YzA0LAo+ICsJCQkJICAg IDAsIDUsCS8qIE0gKi8KPiArCQkJCSAgICAyNCwgMywJLyogbXV4ICovCj4gKwkJCQkgICAgQklU KDMxKSwJLyogZ2F0ZSAqLwo+ICsJCQkJICAgIDApOwo+ICsKPiArCj4gK3N0YXRpYyBjb25zdCBz dHJ1Y3QgY2xrX3BhcmVudF9kYXRhIGNzaV9tY2xrX3BhcmVudHNbXSA9IHsKPiArCXsgLmZ3X25h bWUgPSAiaG9zYyIgfSwKPiArCXsgLmh3ID0gJnBsbF9jc2lfNHhfY2xrLmNvbW1vbi5odyB9LAo+ ICsJeyAuaHcgPSAmcGxsX3ZpZGVvXzR4X2Nsay5jb21tb24uaHcgfSwKPiArCXsgLmh3ID0gJnBs bF9wZXJpcGhfMnhfY2xrLmNvbW1vbi5odyB9LAo+ICt9Owo+ICtzdGF0aWMgU1VOWElfQ0NVX01f REFUQV9XSVRIX01VWF9HQVRFKGNzaV9tY2xrMF9jbGssICJjc2ktbWNsazAiLCBjc2lfbWNsa19w YXJlbnRzLCAKPiArCQkJCSAgICAgIDB4YzA4LAo+ICsJCQkJICAgICAgMCwgNSwJLyogTSAqLwo+ ICsJCQkJICAgICAgMjQsIDMsCS8qIG11eCAqLwo+ICsJCQkJICAgICAgQklUKDMxKSwJLyogZ2F0 ZSAqLwo+ICsJCQkJICAgICAgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX01fREFUQV9XSVRI X01VWF9HQVRFKGNzaV9tY2xrMV9jbGssICJjc2ktbWNsazEiLCBjc2lfbWNsa19wYXJlbnRzLCAK PiArCQkJCSAgICAgIDB4YzBjLAo+ICsJCQkJICAgICAgMCwgNSwJLyogTSAqLwo+ICsJCQkJICAg ICAgMjQsIDMsCS8qIG11eCAqLwo+ICsJCQkJICAgICAgQklUKDMxKSwJLyogZ2F0ZSAqLwo+ICsJ CQkJICAgICAgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX01fREFUQV9XSVRIX01VWF9HQVRF KGNzaV9tY2xrMl9jbGssICJjc2ktbWNsazIiLCBjc2lfbWNsa19wYXJlbnRzLCAKPiArCQkJCSAg ICAgIDB4YzEwLAo+ICsJCQkJICAgICAgMCwgNSwJLyogTSAqLwo+ICsJCQkJICAgICAgMjQsIDMs CS8qIG11eCAqLwo+ICsJCQkJICAgICAgQklUKDMxKSwJLyogZ2F0ZSAqLwo+ICsJCQkJICAgICAg MCk7CgpBbGwgQ1NJIG1jbGtzIHNob3VsZCBiZSBNUCB0eXBlLgoKPiArCj4gK3N0YXRpYyBTVU5Y SV9DQ1VfR0FURV9IV1MoYnVzX2NzaV9jbGssICJidXMtY3NpIiwgYWhiX2h3cywKPiArCQkJICAw eGMyYywgQklUKDApLCAwKTsKPiArCj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1 c193aWVnYW5kX2NsaywgImJ1cy13aWVnYW5kIiwgYWhiX2h3cywKPiArCQkJICAweGM3YywgQklU KDApLCAwKTsKPiArCj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19wYXJlbnRfZGF0YSBy aXNjdl9wYXJlbnRzW10gPSB7Cj4gKwl7IC5md19uYW1lID0gImhvc2MiIH0sCj4gKwl7IC5md19u YW1lID0gImxvc2MiIH0sCj4gKwl7IC5md19uYW1lID0gImlvc2MiIH0sCj4gKwl7IC5odyA9ICZw bGxfcGVyaXBoXzYwME1fY2xrLmh3IH0sCj4gKwl7IC5odyA9ICZwbGxfcGVyaXBoXzQ4ME1fY2xr LmNvbW1vbi5odyB9LAo+ICsJeyAuaHcgPSAmcGxsX2NwdV9jbGsuY29tbW9uLmh3IH0sCj4gK307 Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9EQVRBX1dJVEhfTVVYKHJpc2N2X2NsaywgInJpc2N2LWNw dSIsIHJpc2N2X3BhcmVudHMsIDB4ZDAwLAo+ICsJCQkJIDAsIDUsCS8qIE0gKi8KPiArCQkJCSAy NCwgMywJLyogbXV4ICovCj4gKwkJCQkgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4gKwo+ICsvKiBU aGUgcmlzY3YtYXhpIGNsayBtdXN0IGJlIGRpdmlkZWQgYnkgYXQgbGVhc3QgMi4gKi8KPiArc3Rh dGljIHN0cnVjdCBjbGtfZGl2X3RhYmxlIHJpc2N2X2F4aV90YWJsZVtdID0gewo+ICsJeyAudmFs ID0gMSwgLmRpdiA9IDIgfSwKPiArCXsgLnZhbCA9IDIsIC5kaXYgPSAzIH0sCj4gKwl7IC52YWwg PSAzLCAuZGl2ID0gNCB9LAo+ICsJeyAvKiBTZW50aW5lbCAqLyB9Cj4gK307Cj4gK3N0YXRpYyBT VU5YSV9DQ1VfRElWX1RBQkxFX0hXKHJpc2N2X2F4aV9jbGssICJyaXNjdi1heGkiLCAmcmlzY3Zf Y2xrLmNvbW1vbi5odywKPiArCQkJICAgICAgMHhkMDAsIDgsIDIsIHJpc2N2X2F4aV90YWJsZSwg MCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTX1dJVEhfS0VZKHJpc2N2X2NvcmVf Z2F0ZSwgInJpc2N2LWNvcmUtZ2F0ZSIsIGFoYl9od3MsCj4gKwkJCQkgICAweGQwNCwgQklUKDAp LCAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MocmlzY3ZfY2ZnX2dhdGUsICJy aXNjdi1jZmctZ2F0ZSIsIGFoYl9od3MsCj4gKwkJCSAgMHhkMGMsIEJJVCgwKSwgMCk7Cj4gKwo+ ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcgKnBsbF9wZXJpcGhfMTYwTV9od3NbXSA9 IHsKPiArCSZwbGxfcGVyaXBoXzE2ME1fY2xrLmh3LAo+ICt9Owo+ICsKPiArc3RhdGljIFNVTlhJ X0NDVV9HQVRFX0RBVEEoZmFub3V0XzI0TV9jbGssICJmYW5vdXQtMjRNIiwgb3NjMjRNLAo+ICsJ CQkgICAweGYzMCwgQklUKDApLCAwKTsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0RBVEFfV0lU SF9QUkVESVYoZmFub3V0XzEyTV9jbGssICJmYW5vdXQtMTJNIiwgb3NjMjRNLAo+ICsJCQkJICAg ICAgIDB4ZjMwLCBCSVQoMSksIDIsIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTX1dJ VEhfUFJFRElWKGZhbm91dF8xNk1fY2xrLCAiZmFub3V0LTE2TSIsIHBsbF9wZXJpcGhfMTYwTV9o d3MsCj4gKwkJCQkgICAgICAweGYzMCwgQklUKDIpLCAxMCwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9D Q1VfR0FURV9IV1NfV0lUSF9QUkVESVYoZmFub3V0XzI1TV9jbGssICJmYW5vdXQtMjVNIiwgcGxs X3BlcmlwaF8xNTBNX2h3cywKPiArCQkJCSAgICAgIDB4ZjMwLCBCSVQoMyksIDYsIDApOwo+ICsK PiArCj4gKy8qIFRoaXMgY2xvY2sgaGFzIGEgc2Vjb25kIGRpdmlkZXIgdGhhdCBpcyBub3QgbW9k ZWxsZWQgYW5kIGZvcmNlZCB0byAwLiAqLwo+ICsjZGVmaW5lIFNVTjhJX1Y4NTNfRkFOT1VUXzI3 TV9SRUcJMHhmMzQKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcgKmZhbm91dF8yN01fcGFy ZW50c1tdID0gewo+ICsJJnBsbF92aWRlb18xeF9jbGsuaHcsCj4gKwkmcGxsX2NzaV9jbGsuaHcs Cj4gKwkmcGxsX3BlcmlwaF8zMDBNX2Nsay5odywKPiArfTsKPiArc3RhdGljIFNVTlhJX0NDVV9N X0hXX1dJVEhfTVVYX0dBVEUoZmFub3V0XzI3TV9jbGssICJmYW5vdXQtMjdNIiwgCj4gKwkJCQkg ICAgZmFub3V0XzI3TV9wYXJlbnRzLCAweGYzNCwKPiArCQkJCSAgICAwLCA1LAkvKiBNICovCj4g KwkJCQkgICAgMjQsIDIsCS8qIG11eCAqLwo+ICsJCQkJICAgIEJJVCgzMSksCS8qIGdhdGUgKi8K PiArCQkJCSAgICAwKTsKPiArc3RhdGljIFNVTlhJX0NDVV9NX0hXU19XSVRIX0dBVEUoZmFub3V0 X3BjbGtfY2xrLCAiZmFub3V0LXBjbGsiLCBhcGIwX2h3cywgMHhmMzgsCj4gKwkJCQkgMCwgNSwJ CS8qIE0gKi8KPiArCQkJCSBCSVQoMzEpLAkvKiBnYXRlICovCj4gKwkJCQkgMCk7Cj4gKwo+ICtz dGF0aWMgY29uc3Qgc3RydWN0IGNsa19wYXJlbnRfZGF0YSBmYW5vdXRfcGFyZW50c1tdID0gewo+ ICsJeyAuZndfbmFtZSA9ICJsb3NjIiB9LAo+ICsJeyAuaHcgPSAmZmFub3V0XzEyTV9jbGsuY29t bW9uLmh3IH0sCj4gKwl7IC5odyA9ICZmYW5vdXRfMTZNX2Nsay5jb21tb24uaHcgfSwKPiArCXsg Lmh3ID0gJmZhbm91dF8yNE1fY2xrLmNvbW1vbi5odyB9LAo+ICsJeyAuaHcgPSAmZmFub3V0XzI1 TV9jbGsuY29tbW9uLmh3IH0sCj4gKwl7IC5odyA9ICZmYW5vdXRfMjdNX2Nsay5jb21tb24uaHcg fSwKPiArCXsgLmh3ID0gJmZhbm91dF9wY2xrX2Nsay5jb21tb24uaHcgfSwKPiArfTsKPiArCj4g K3N0YXRpYyBTVU5YSV9DQ1VfTVVYX0RBVEFfV0lUSF9HQVRFKGZhbm91dDBfY2xrLCAiZmFub3V0 MCIsIGZhbm91dF9wYXJlbnRzLCAweGYzYywKPiArCQkJCSAgICAwLCAzLAkvKiBtdXggKi8KPiAr CQkJCSAgICBCSVQoMjEpLAkvKiBnYXRlICovCj4gKwkJCQkgICAgMCk7Cj4gK3N0YXRpYyBTVU5Y SV9DQ1VfTVVYX0RBVEFfV0lUSF9HQVRFKGZhbm91dDFfY2xrLCAiZmFub3V0MSIsIGZhbm91dF9w YXJlbnRzLCAweGYzYywKPiArCQkJCSAgICAzLCAzLAkvKiBtdXggKi8KPiArCQkJCSAgICBCSVQo MjIpLAkvKiBnYXRlICovCj4gKwkJCQkgICAgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVVYX0RB VEFfV0lUSF9HQVRFKGZhbm91dDJfY2xrLCAiZmFub3V0MiIsIGZhbm91dF9wYXJlbnRzLCAweGYz YywKPiArCQkJCSAgICA2LCAzLAkvKiBtdXggKi8KPiArCQkJCSAgICBCSVQoMjMpLAkvKiBnYXRl ICovCj4gKwkJCQkgICAgMCk7Cj4gKwo+ICsKPiArc3RhdGljIHN0cnVjdCBjY3VfY29tbW9uICpz dW44aV92ODUzX2NjdV9jbGtzW10gPSB7Cj4gKwkmcGxsX2NwdV9jbGsuY29tbW9uLAo+ICsJJnBs bF9kZHJfY2xrLmNvbW1vbiwKPiArCSZwbGxfcGVyaXBoXzR4X2Nsay5jb21tb24sCj4gKwkmcGxs X3BlcmlwaF8yeF9jbGsuY29tbW9uLAo+ICsJJnBsbF9wZXJpcGhfODAwTV9jbGsuY29tbW9uLAo+ ICsJJnBsbF9wZXJpcGhfNDgwTV9jbGsuY29tbW9uLAo+ICsJJnBsbF92aWRlb180eF9jbGsuY29t bW9uLAo+ICsJJnBsbF9jc2lfNHhfY2xrLmNvbW1vbiwKPiArCSZwbGxfYXVkaW9fZGl2Ml9jbGsu Y29tbW9uLAo+ICsJJnBsbF9hdWRpb19kaXY1X2Nsay5jb21tb24sCj4gKwkmcGxsX2F1ZGlvXzR4 X2Nsay5jb21tb24sCj4gKwkmcGxsX2F1ZGlvXzF4X2Nsay5jb21tb24sCj4gKwkmcGxsX25wdV80 eF9jbGsuY29tbW9uLAo+ICsJJmNwdV9jbGsuY29tbW9uLAo+ICsJJmNwdV9heGlfY2xrLmNvbW1v biwKPiArCSZjcHVfYXBiX2Nsay5jb21tb24sCj4gKwkmYWhiX2Nsay5jb21tb24sCj4gKwkmYXBi MF9jbGsuY29tbW9uLAo+ICsJJmFwYjFfY2xrLmNvbW1vbiwKPiArCSZkZV9jbGsuY29tbW9uLAo+ ICsJJmJ1c19kZV9jbGsuY29tbW9uLAo+ICsJJmcyZF9jbGsuY29tbW9uLAo+ICsJJmJ1c19nMmRf Y2xrLmNvbW1vbiwKPiArCSZjZV9jbGsuY29tbW9uLAo+ICsJJmJ1c19jZV9jbGsuY29tbW9uLAo+ ICsJJnZlX2Nsay5jb21tb24sCj4gKwkmYnVzX3ZlX2Nsay5jb21tb24sCj4gKwkmbnB1X2Nsay5j b21tb24sCj4gKwkmYnVzX25wdV9jbGsuY29tbW9uLAo+ICsJJmJ1c19kbWFfY2xrLmNvbW1vbiwK PiArCSZidXNfbXNnYm94MF9jbGsuY29tbW9uLAo+ICsJJmJ1c19tc2dib3gxX2Nsay5jb21tb24s Cj4gKwkmYnVzX3NwaW5sb2NrX2Nsay5jb21tb24sCj4gKwkmYnVzX2hzdGltZXJfY2xrLmNvbW1v biwKPiArCSZhdnNfY2xrLmNvbW1vbiwKPiArCSZidXNfZGJnX2Nsay5jb21tb24sCj4gKwkmYnVz X3B3bV9jbGsuY29tbW9uLAo+ICsJJmJ1c19pb21tdV9jbGsuY29tbW9uLAo+ICsJJmRyYW1fY2xr LmNvbW1vbiwKPiArCSZtYnVzX2RtYV9jbGsuY29tbW9uLAo+ICsJJm1idXNfdmVfY2xrLmNvbW1v biwKPiArCSZtYnVzX2NlX2Nsay5jb21tb24sCj4gKwkmbWJ1c19jc2lfY2xrLmNvbW1vbiwKPiAr CSZtYnVzX2lzcF9jbGsuY29tbW9uLAo+ICsJJm1idXNfZzJkX2Nsay5jb21tb24sCj4gKwkmYnVz X2RyYW1fY2xrLmNvbW1vbiwKPiArCSZtbWMwX2Nsay5jb21tb24sCj4gKwkmbW1jMV9jbGsuY29t bW9uLAo+ICsJJm1tYzJfY2xrLmNvbW1vbiwKPiArCSZidXNfbW1jMF9jbGsuY29tbW9uLAo+ICsJ JmJ1c19tbWMxX2Nsay5jb21tb24sCj4gKwkmYnVzX21tYzJfY2xrLmNvbW1vbiwKPiArCSZidXNf dWFydDBfY2xrLmNvbW1vbiwKPiArCSZidXNfdWFydDFfY2xrLmNvbW1vbiwKPiArCSZidXNfdWFy dDJfY2xrLmNvbW1vbiwKPiArCSZidXNfdWFydDNfY2xrLmNvbW1vbiwKPiArCSZidXNfaTJjMF9j bGsuY29tbW9uLAo+ICsJJmJ1c19pMmMxX2Nsay5jb21tb24sCj4gKwkmYnVzX2kyYzJfY2xrLmNv bW1vbiwKPiArCSZidXNfaTJjM19jbGsuY29tbW9uLAo+ICsJJmJ1c19pMmM0X2Nsay5jb21tb24s Cj4gKwkmc3BpMF9jbGsuY29tbW9uLAo+ICsJJnNwaTFfY2xrLmNvbW1vbiwKPiArCSZzcGkyX2Ns ay5jb21tb24sCj4gKwkmc3BpM19jbGsuY29tbW9uLAo+ICsJJmJ1c19zcGkwX2Nsay5jb21tb24s Cj4gKwkmYnVzX3NwaTFfY2xrLmNvbW1vbiwKPiArCSZidXNfc3BpMl9jbGsuY29tbW9uLAo+ICsJ JmJ1c19zcGkzX2Nsay5jb21tb24sCj4gKwkmc3BpZl9jbGsuY29tbW9uLAo+ICsJJmJ1c19zcGlm X2Nsay5jb21tb24sCj4gKwkmZW1hY18yNU1fY2xrLmNvbW1vbiwKPiArCSZidXNfZW1hY19jbGsu Y29tbW9uLAo+ICsJJmJ1c19ncGFkY19jbGsuY29tbW9uLAo+ICsJJmJ1c190aHNfY2xrLmNvbW1v biwKPiArCSZ1c2Jfb2hjaV9jbGsuY29tbW9uLAo+ICsJJmJ1c19vaGNpX2Nsay5jb21tb24sCj4g KwkmYnVzX2VoY2lfY2xrLmNvbW1vbiwKPiArCSZidXNfb3RnX2Nsay5jb21tb24sCj4gKwkmaTJz MF9jbGsuY29tbW9uLAo+ICsJJmkyczFfY2xrLmNvbW1vbiwKPiArCSZidXNfaTJzMF9jbGsuY29t bW9uLAo+ICsJJmJ1c19pMnMxX2Nsay5jb21tb24sCj4gKwkmZG1pY19jbGsuY29tbW9uLAo+ICsJ JmJ1c19kbWljX2Nsay5jb21tb24sCj4gKwkmYXVkaW9fY29kZWNfZGFjX2Nsay5jb21tb24sCj4g KwkmYXVkaW9fY29kZWNfYWRjX2Nsay5jb21tb24sCj4gKwkmYnVzX2F1ZGlvX2NvZGVjX2Nsay5j b21tb24sCj4gKwkmYnVzX2Rwc3NfdG9wX2Nsay5jb21tb24sCj4gKwkmbWlwaV9kc2lfY2xrLmNv bW1vbiwKPiArCSZidXNfbWlwaV9kc2lfY2xrLmNvbW1vbiwKPiArCSZ0Y29uX2xjZF9jbGsuY29t bW9uLAo+ICsJJmJ1c190Y29uX2xjZF9jbGsuY29tbW9uLAo+ICsJJmNzaV90b3BfY2xrLmNvbW1v biwKPiArCSZjc2lfbWNsazBfY2xrLmNvbW1vbiwKPiArCSZjc2lfbWNsazFfY2xrLmNvbW1vbiwK PiArCSZjc2lfbWNsazJfY2xrLmNvbW1vbiwKPiArCSZidXNfY3NpX2Nsay5jb21tb24sCj4gKwkm YnVzX3dpZWdhbmRfY2xrLmNvbW1vbiwKPiArCSZyaXNjdl9jbGsuY29tbW9uLAo+ICsJJnJpc2N2 X2F4aV9jbGsuY29tbW9uLAo+ICsJJnJpc2N2X2NvcmVfZ2F0ZS5jb21tb24sCj4gKwkmcmlzY3Zf Y2ZnX2dhdGUuY29tbW9uLAo+ICsJJmZhbm91dF8yNE1fY2xrLmNvbW1vbiwKPiArCSZmYW5vdXRf MTJNX2Nsay5jb21tb24sCj4gKwkmZmFub3V0XzE2TV9jbGsuY29tbW9uLAo+ICsJJmZhbm91dF8y NU1fY2xrLmNvbW1vbiwKPiArCSZmYW5vdXRfMjdNX2Nsay5jb21tb24sCj4gKwkmZmFub3V0X3Bj bGtfY2xrLmNvbW1vbiwKPiArCSZmYW5vdXQwX2Nsay5jb21tb24sCj4gKwkmZmFub3V0MV9jbGsu Y29tbW9uLAo+ICsJJmZhbm91dDJfY2xrLmNvbW1vbiwKPiArfTsKPiArCj4gK3N0YXRpYyBzdHJ1 Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSBzdW44aV92ODUzX2h3X2Nsa3MgPSB7Cj4gKwkubnVtCT0g Q0xLX05VTUJFUiwKPiArCS5od3MJPSB7Cj4gKwkJW0NMS19PU0MxMk1dICAgICAgICAgICAgPSAm b3NjMTJNX2Nsay5odywKPiArCQlbQ0xLX1BMTF9DUFVdCQk9ICZwbGxfY3B1X2Nsay5jb21tb24u aHcsCj4gKwkJW0NMS19QTExfRERSXQkJPSAmcGxsX2Rkcl9jbGsuY29tbW9uLmh3LAo+ICsJCVtD TEtfUExMX1BFUklQSF80WF0JPSAmcGxsX3BlcmlwaF80eF9jbGsuY29tbW9uLmh3LAo+ICsJCVtD TEtfUExMX1BFUklQSF8yWF0JPSAmcGxsX3BlcmlwaF8yeF9jbGsuY29tbW9uLmh3LAo+ICsJCVtD TEtfUExMX1BFUklQSF84MDBNXQk9ICZwbGxfcGVyaXBoXzgwME1fY2xrLmNvbW1vbi5odywKPiAr CQlbQ0xLX1BMTF9QRVJJUEhfNDgwTV0JPSAmcGxsX3BlcmlwaF80ODBNX2Nsay5jb21tb24uaHcs Cj4gKwkJW0NMS19QTExfUEVSSVBIXzYwME1dCT0gJnBsbF9wZXJpcGhfNjAwTV9jbGsuaHcsCj4g KwkJW0NMS19QTExfUEVSSVBIXzQwME1dCT0gJnBsbF9wZXJpcGhfNDAwTV9jbGsuaHcsCj4gKwkJ W0NMS19QTExfUEVSSVBIXzMwME1dCT0gJnBsbF9wZXJpcGhfMzAwTV9jbGsuaHcsCj4gKwkJW0NM S19QTExfUEVSSVBIXzIwME1dCT0gJnBsbF9wZXJpcGhfMjAwTV9jbGsuaHcsCj4gKwkJW0NMS19Q TExfUEVSSVBIXzE2ME1dCT0gJnBsbF9wZXJpcGhfMTYwTV9jbGsuaHcsCj4gKwkJW0NMS19QTExf UEVSSVBIXzE1ME1dCT0gJnBsbF9wZXJpcGhfMTUwTV9jbGsuaHcsCj4gKwkJW0NMS19QTExfVklE RU9fNFhdCT0gJnBsbF92aWRlb180eF9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfUExMX1ZJREVP XzJYXQk9ICZwbGxfdmlkZW9fMnhfY2xrLmh3LAo+ICsJCVtDTEtfUExMX1ZJREVPXzFYXQk9ICZw bGxfdmlkZW9fMXhfY2xrLmh3LAo+ICsJCVtDTEtfUExMX0NTSV80WF0JPSAmcGxsX2NzaV80eF9j bGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfUExMX0FVRElPX0RJVjJdCT0gJnBsbF9hdWRpb19kaXYy X2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19QTExfQVVESU9fRElWNV0JPSAmcGxsX2F1ZGlvX2Rp djVfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX1BMTF9BVURJT180WF0JPSAmcGxsX2F1ZGlvXzR4 X2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19QTExfQVVESU9fMVhdCT0gJnBsbF9hdWRpb18xeF9j bGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfUExMX05QVV80WF0JPSAmcGxsX25wdV80eF9jbGsuY29t bW9uLmh3LAo+ICsJCVtDTEtfQ1BVXQkJPSAmY3B1X2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19D UFVfQVhJXQkJPSAmY3B1X2F4aV9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQ1BVX0FQQl0JCT0g JmNwdV9hcGJfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0FIQl0JCT0gJmFoYl9jbGsuY29tbW9u Lmh3LAo+ICsJCVtDTEtfQVBCMF0JCT0gJmFwYjBfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0FQ QjFdCQk9ICZhcGIxX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19NQlVTXQkJPSAmbWJ1c19jbGsu aHcsCj4gKwkJW0NMS19ERV0JCT0gJmRlX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfREVd CQk9ICZidXNfZGVfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0cyRF0JCT0gJmcyZF9jbGsuY29t bW9uLmh3LAo+ICsJCVtDTEtfQlVTX0cyRF0JCT0gJmJ1c19nMmRfY2xrLmNvbW1vbi5odywKPiAr CQlbQ0xLX0NFXQkJPSAmY2VfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19DRV0JCT0gJmJ1 c19jZV9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfVkVdCQk9ICZ2ZV9jbGsuY29tbW9uLmh3LAo+ ICsJCVtDTEtfQlVTX1ZFXQkJPSAmYnVzX3ZlX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19OUFVd CQk9ICZucHVfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19OUFVdCQk9ICZidXNfbnB1X2Ns ay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfRE1BXQkJPSAmYnVzX2RtYV9jbGsuY29tbW9uLmh3 LAo+ICsJCVtDTEtfQlVTX01TR0JPWDBdCT0gJmJ1c19tc2dib3gwX2Nsay5jb21tb24uaHcsCj4g KwkJW0NMS19CVVNfTVNHQk9YMV0JPSAmYnVzX21zZ2JveDFfY2xrLmNvbW1vbi5odywKPiArCQlb Q0xLX0JVU19TUElOTE9DS10JPSAmYnVzX3NwaW5sb2NrX2Nsay5jb21tb24uaHcsCj4gKwkJW0NM S19CVVNfSFNUSU1FUl0JPSAmYnVzX2hzdGltZXJfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0FW U10JCT0gJmF2c19jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQlVTX0RCR10JCT0gJmJ1c19kYmdf Y2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19QV01dCQk9ICZidXNfcHdtX2Nsay5jb21tb24u aHcsCj4gKwkJW0NMS19CVVNfSU9NTVVdCQk9ICZidXNfaW9tbXVfY2xrLmNvbW1vbi5odywKPiAr CQlbQ0xLX0RSQU1dCQk9ICZkcmFtX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19NQlVTX0RNQV0J CT0gJm1idXNfZG1hX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19NQlVTX1ZFXQkJPSAmbWJ1c192 ZV9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfTUJVU19DRV0JCT0gJm1idXNfY2VfY2xrLmNvbW1v bi5odywKPiArCQlbQ0xLX01CVVNfQ1NJXQkJPSAmbWJ1c19jc2lfY2xrLmNvbW1vbi5odywKPiAr CQlbQ0xLX01CVVNfSVNQXQkJPSAmbWJ1c19pc3BfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX01C VVNfRzJEXQkJPSAmbWJ1c19nMmRfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19EUkFNXQkJ PSAmYnVzX2RyYW1fY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX01NQzBdCQk9ICZtbWMwX2Nsay5j b21tb24uaHcsCj4gKwkJW0NMS19NTUMxXQkJPSAmbW1jMV9jbGsuY29tbW9uLmh3LAo+ICsJCVtD TEtfTU1DMl0JCT0gJm1tYzJfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19NTUMwXQkJPSAm YnVzX21tYzBfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19NTUMxXQkJPSAmYnVzX21tYzFf Y2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19NTUMyXQkJPSAmYnVzX21tYzJfY2xrLmNvbW1v bi5odywKPiArCQlbQ0xLX0JVU19VQVJUMF0JCT0gJmJ1c191YXJ0MF9jbGsuY29tbW9uLmh3LAo+ ICsJCVtDTEtfQlVTX1VBUlQxXQkJPSAmYnVzX3VhcnQxX2Nsay5jb21tb24uaHcsCj4gKwkJW0NM S19CVVNfVUFSVDJdCQk9ICZidXNfdWFydDJfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19V QVJUM10JCT0gJmJ1c191YXJ0M19jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQlVTX0kyQzBdCQk9 ICZidXNfaTJjMF9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQlVTX0kyQzFdCQk9ICZidXNfaTJj MV9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQlVTX0kyQzJdCQk9ICZidXNfaTJjMl9jbGsuY29t bW9uLmh3LAo+ICsJCVtDTEtfQlVTX0kyQzNdCQk9ICZidXNfaTJjM19jbGsuY29tbW9uLmh3LAo+ ICsJCVtDTEtfQlVTX0kyQzRdCQk9ICZidXNfaTJjNF9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtf U1BJMF0JCT0gJnNwaTBfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX1NQSTFdCQk9ICZzcGkxX2Ns ay5jb21tb24uaHcsCj4gKwkJW0NMS19TUEkyXQkJPSAmc3BpMl9jbGsuY29tbW9uLmh3LAo+ICsJ CVtDTEtfU1BJM10JCT0gJnNwaTNfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19TUEkwXQkJ PSAmYnVzX3NwaTBfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19TUEkxXQkJPSAmYnVzX3Nw aTFfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19TUEkyXQkJPSAmYnVzX3NwaTJfY2xrLmNv bW1vbi5odywKPiArCQlbQ0xLX0JVU19TUEkzXQkJPSAmYnVzX3NwaTNfY2xrLmNvbW1vbi5odywK PiArCQlbQ0xLX1NQSUZdCQk9ICZzcGlmX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfU1BJ Rl0JCT0gJmJ1c19zcGlmX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19FTUFDXzI1TV0JCT0gJmVt YWNfMjVNX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfRU1BQ10JCT0gJmJ1c19lbWFjX2Ns ay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfR1BBRENdCQk9ICZidXNfZ3BhZGNfY2xrLmNvbW1v bi5odywKPiArCQlbQ0xLX0JVU19USFNdCQk9ICZidXNfdGhzX2Nsay5jb21tb24uaHcsCj4gKwkJ W0NMS19JMlMwXQkJPSAmaTJzMF9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfSTJTMV0JCT0gJmky czFfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19JMlMwXQkJPSAmYnVzX2kyczBfY2xrLmNv bW1vbi5odywKPiArCQlbQ0xLX0JVU19JMlMxXQkJPSAmYnVzX2kyczFfY2xrLmNvbW1vbi5odywK PiArCQlbQ0xLX0RNSUNdCQk9ICZkbWljX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfRE1J Q10JCT0gJmJ1c19kbWljX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19BVURJT19DT0RFQ19EQUNd CT0gJmF1ZGlvX2NvZGVjX2RhY19jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQVVESU9fQ09ERUNf QURDXQk9ICZhdWRpb19jb2RlY19hZGNfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19BVURJ T19DT0RFQ10JPSAmYnVzX2F1ZGlvX2NvZGVjX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19VU0Jf T0hDSV0JCT0gJnVzYl9vaGNpX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfT0hDSV0JCT0g JmJ1c19vaGNpX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfRUhDSV0JCT0gJmJ1c19laGNp X2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfT1RHXQkJPSAmYnVzX290Z19jbGsuY29tbW9u Lmh3LAo+ICsJCVtDTEtfQlVTX0RQU1NfVE9QXQk9ICZidXNfZHBzc190b3BfY2xrLmNvbW1vbi5o dywKPiArCQlbQ0xLX01JUElfRFNJXQkJPSAmbWlwaV9kc2lfY2xrLmNvbW1vbi5odywKPiArCQlb Q0xLX0JVU19NSVBJX0RTSV0JPSAmYnVzX21pcGlfZHNpX2Nsay5jb21tb24uaHcsCj4gKwkJW0NM S19UQ09OX0xDRF0JCT0gJnRjb25fbGNkX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfVENP Tl9MQ0RdCT0gJmJ1c190Y29uX2xjZF9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQ1NJX1RPUF0J CT0gJmNzaV90b3BfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0NTSV9NQ0xLMF0JCT0gJmNzaV9t Y2xrMF9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQ1NJX01DTEsxXQkJPSAmY3NpX21jbGsxX2Ns ay5jb21tb24uaHcsCj4gKwkJW0NMS19DU0lfTUNMSzJdCQk9ICZjc2lfbWNsazJfY2xrLmNvbW1v bi5odywKPiArCQlbQ0xLX0JVU19DU0ldCQk9ICZidXNfY3NpX2Nsay5jb21tb24uaHcsCj4gKwkJ W0NMS19CVVNfV0lFR0FORF0JPSAmYnVzX3dpZWdhbmRfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xL X1JJU0NWXQkJPSAmcmlzY3ZfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX1JJU0NWX0FYSV0JCT0g JnJpc2N2X2F4aV9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfUklTQ1ZfQ09SRV9HQVRFXSAgID0g JnJpc2N2X2NvcmVfZ2F0ZS5jb21tb24uaHcsCj4gKwkJW0NMS19SSVNDVl9DRkdfR0FURV0gICAg PSAmcmlzY3ZfY2ZnX2dhdGUuY29tbW9uLmh3LAo+ICsJCVtDTEtfRkFOT1VUXzI0TV0JPSAmZmFu b3V0XzI0TV9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfRkFOT1VUXzE2TV0JPSAmZmFub3V0XzE2 TV9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfRkFOT1VUXzEyTV0JPSAmZmFub3V0XzEyTV9jbGsu Y29tbW9uLmh3LAo+ICsJCVtDTEtfRkFOT1VUXzI1TV0JPSAmZmFub3V0XzI1TV9jbGsuY29tbW9u Lmh3LAo+ICsJCVtDTEtfRkFOT1VUXzI3TV0JPSAmZmFub3V0XzI3TV9jbGsuY29tbW9uLmh3LAo+ ICsJCVtDTEtfRkFOT1VUX1BDTEtdCT0gJmZhbm91dF9wY2xrX2Nsay5jb21tb24uaHcsCj4gKwkJ W0NMS19GQU5PVVQwXQkJPSAmZmFub3V0MF9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfRkFOT1VU MV0JCT0gJmZhbm91dDFfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0ZBTk9VVDJdCQk9ICZmYW5v dXQyX2Nsay5jb21tb24uaHcsCj4gKwl9LAo+ICt9Owo+ICsKPiArc3RhdGljIHN0cnVjdCBjY3Vf cmVzZXRfbWFwIHN1bjhpX3Y4NTNfY2N1X3Jlc2V0c1tdID0gewo+ICsJW1JTVF9NQlVTXQkJPSB7 IDB4NTQwLCBCSVQoMzApIH0sCj4gKwlbUlNUX0JVU19ERV0JCT0geyAweDYwYywgQklUKDE2KSB9 LAo+ICsJW1JTVF9CVVNfRzJEXQkJPSB7IDB4NjNjLCBCSVQoMTYpIH0sCj4gKwlbUlNUX0JVU19D RV0JCT0geyAweDY4YywgQklUKDE2KSB8IEJJVCgxNyl9LAo+ICsJW1JTVF9CVVNfVkVdCQk9IHsg MHg2OWMsIEJJVCgxNikgfSwKPiArCVtSU1RfQlVTX05QVV0JCT0geyAweDZlYywgQklUKDE2KSB9 LAo+ICsJW1JTVF9CVVNfRE1BXQkJPSB7IDB4NzBjLCBCSVQoMTYpIH0sCj4gKwlbUlNUX0JVU19N U0dCT1gwXQk9IHsgMHg3MWMsIEJJVCgxNikgfSwKPiArCVtSU1RfQlVTX01TR0JPWDFdCT0geyAw eDcxYywgQklUKDE3KSB9LAo+ICsJW1JTVF9CVVNfU1BJTkxPQ0tdCT0geyAweDcyYywgQklUKDE2 KSB9LAo+ICsJW1JTVF9CVVNfSFNUSU1FUl0JPSB7IDB4NzNjLCBCSVQoMTYpIH0sCj4gKwlbUlNU X0JVU19EQkddCQk9IHsgMHg3OGMsIEJJVCgxNikgfSwKPiArCVtSU1RfQlVTX1BXTV0JCT0geyAw eDdhYywgQklUKDE2KSB9LAo+ICsJW1JTVF9CVVNfRFJBTV0JCT0geyAweDgwYywgQklUKDE2KSB9 LAo+ICsJW1JTVF9CVVNfTU1DMF0JCT0geyAweDg0YywgQklUKDE2KSB9LAo+ICsJW1JTVF9CVVNf TU1DMV0JCT0geyAweDg0YywgQklUKDE3KSB9LAo+ICsJW1JTVF9CVVNfTU1DMl0JCT0geyAweDg0 YywgQklUKDE4KSB9LAo+ICsJW1JTVF9CVVNfVUFSVDBdCQk9IHsgMHg5MGMsIEJJVCgxNikgfSwK PiArCVtSU1RfQlVTX1VBUlQxXQkJPSB7IDB4OTBjLCBCSVQoMTcpIH0sCj4gKwlbUlNUX0JVU19V QVJUMl0JCT0geyAweDkwYywgQklUKDE4KSB9LAo+ICsJW1JTVF9CVVNfVUFSVDNdCQk9IHsgMHg5 MGMsIEJJVCgxOSkgfSwKPiArCVtSU1RfQlVTX0kyQzBdCQk9IHsgMHg5MWMsIEJJVCgxNikgfSwK PiArCVtSU1RfQlVTX0kyQzFdCQk9IHsgMHg5MWMsIEJJVCgxNykgfSwKPiArCVtSU1RfQlVTX0ky QzJdCQk9IHsgMHg5MWMsIEJJVCgxOCkgfSwKPiArCVtSU1RfQlVTX0kyQzNdCQk9IHsgMHg5MWMs IEJJVCgxOSkgfSwKPiArCVtSU1RfQlVTX0kyQzRdCQk9IHsgMHg5MWMsIEJJVCgyMCkgfSwKPiAr CVtSU1RfQlVTX1NQSTBdCQk9IHsgMHg5NmMsIEJJVCgxNikgfSwKPiArCVtSU1RfQlVTX1NQSTFd CQk9IHsgMHg5NmMsIEJJVCgxNykgfSwKPiArCVtSU1RfQlVTX1NQSTJdCQk9IHsgMHg5NmMsIEJJ VCgxOCkgfSwKPiArCVtSU1RfQlVTX1NQSTNdCQk9IHsgMHg5NmMsIEJJVCgxOSkgfSwKPiArCVtS U1RfQlVTX1NQSUZdCQk9IHsgMHg5NmMsIEJJVCgyMCkgfSwKPiArCVtSU1RfQlVTX0VNQUNdCQk9 IHsgMHg5N2MsIEJJVCgxNikgfSwKPiArCVtSU1RfQlVTX0dQQURDXQkJPSB7IDB4OWVjLCBCSVQo MTYpIH0sCj4gKwlbUlNUX0JVU19USFNdCQk9IHsgMHg5ZmMsIEJJVCgxNikgfSwKPiArCVtSU1Rf QlVTX0kyUzBdCQk9IHsgMHhhMjAsIEJJVCgxNikgfSwKPiArCVtSU1RfQlVTX0kyUzFdCQk9IHsg MHhhMjAsIEJJVCgxNykgfSwKPiArCVtSU1RfQlVTX0RNSUNdCQk9IHsgMHhhNGMsIEJJVCgxNikg fSwKPiArCVtSU1RfQlVTX0FVRElPX0NPREVDXQk9IHsgMHhhNWMsIEJJVCgxNikgfSwKPiArCVtS U1RfVVNCX1BIWV0JCT0geyAweGE3MCwgQklUKDMwKSB9LAo+ICsJW1JTVF9CVVNfT0hDSV0JCT0g eyAweGE4YywgQklUKDE2KSB9LAo+ICsJW1JTVF9CVVNfRUhDSV0JCT0geyAweGE4YywgQklUKDIw KSB9LAo+ICsJW1JTVF9CVVNfT1RHXQkJPSB7IDB4YThjLCBCSVQoMjQpIH0sCj4gKwlbUlNUX0JV U19EUFNTX1RPUF0JPSB7IDB4YWJjLCBCSVQoMTYpIH0sCj4gKwlbUlNUX0JVU19NSVBJX0RTSV0J PSB7IDB4YjRjLCBCSVQoMTYpIH0sCj4gKwlbUlNUX0JVU19UQ09OX0xDRF0JPSB7IDB4YjdjLCBC SVQoMTYpIH0sCj4gKwlbUlNUX0JVU19DU0ldCQk9IHsgMHhjMmMsIEJJVCgxNikgfSwKPiArCVtS U1RfQlVTX1dJRUdBTkRdCT0geyAweGM3YywgQklUKDE2KSB9LAo+ICsJW1JTVF9SSVNDVl9TWVNf QVBCXQk9IHsgMHhkMDQsIEJJVCgyKSwgQ0NVX0ZFQVRVUkVfS0VZX0ZJRUxEIH0sCj4gKwlbUlNU X1JJU0NWX1NPRlRdCT0geyAweGQwNCwgQklUKDEpLCBDQ1VfRkVBVFVSRV9LRVlfRklFTEQgfSwK PiArCVtSU1RfUklTQ1ZfQ0ZHXQkJPSB7IDB4ZDBjLCBCSVQoMTYpIH0KPiArfTsKPiArCj4gK3N0 YXRpYyBjb25zdCBzdHJ1Y3Qgc3VueGlfY2N1X2Rlc2Mgc3VuOGlfdjg1M19jY3VfZGVzYyA9IHsK PiArCS5jY3VfY2xrcwk9IHN1bjhpX3Y4NTNfY2N1X2Nsa3MsCj4gKwkubnVtX2NjdV9jbGtzCT0g QVJSQVlfU0laRShzdW44aV92ODUzX2NjdV9jbGtzKSwKPiArCj4gKwkuaHdfY2xrcwk9ICZzdW44 aV92ODUzX2h3X2Nsa3MsCj4gKwo+ICsJLnJlc2V0cwkJPSBzdW44aV92ODUzX2NjdV9yZXNldHMs Cj4gKwkubnVtX3Jlc2V0cwk9IEFSUkFZX1NJWkUoc3VuOGlfdjg1M19jY3VfcmVzZXRzKSwKPiAr fTsKPiArCj4gK3N0YXRpYyBjb25zdCB1MzIgcGxsX3JlZ3NbXSA9IHsKPiArCVNVTjhJX1Y4NTNf UExMX0NQVV9SRUcsCj4gKwlTVU44SV9WODUzX1BMTF9ERFJfUkVHLAo+ICsJU1VOOElfVjg1M19Q TExfUEVSSVBIX1JFRywKPiArCVNVTjhJX1Y4NTNfUExMX1ZJREVPX1JFRywKPiArCVNVTjhJX1Y4 NTNfUExMX0NTSV9SRUcsCj4gKwlTVU44SV9WODUzX1BMTF9BVURJT19SRUcsCj4gKwlTVU44SV9W ODUzX1BMTF9OUFVfUkVHLAo+ICt9Owo+ICsKPiArc3RhdGljIGludCBzdW44aV92ODUzX2NjdV9w cm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKwl2b2lkIF9faW9tZW0g KnJlZzsKPiArCXUzMiB2YWw7Cj4gKwlpbnQgaSwgcmV0Owo+ICsKPiArCXJlZyA9IGRldm1fcGxh dGZvcm1faW9yZW1hcF9yZXNvdXJjZShwZGV2LCAwKTsKPiArCWlmIChJU19FUlIocmVnKSkKPiAr CQlyZXR1cm4gUFRSX0VSUihyZWcpOwo+ICsKPiArCS8qIEVuYWJsZSB0aGUgZW5hYmxlLCBMRE8s IGFuZCBsb2NrIGJpdHMgb24gYWxsIFBMTHMuICovCj4gKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlf U0laRShwbGxfcmVncyk7IGkrKykgewo+ICsJCXZhbCA9IHJlYWRsKHJlZyArIHBsbF9yZWdzW2ld KTsKPiArCQl2YWwgfD0gQklUKDMxKSB8IEJJVCgzMCkgfCBCSVQoMjkpOwo+ICsJCXdyaXRlbCh2 YWwsIHJlZyArIHBsbF9yZWdzW2ldKTsKPiArCX0KPiArCj4gKwkvKiBGb3JjZSBQTExfQ1BVIGZh Y3RvciBNIHRvIDAuICovCj4gKwl2YWwgPSByZWFkbChyZWcgKyBTVU44SV9WODUzX1BMTF9DUFVf UkVHKTsKPiArCXZhbCAmPSB+R0VOTUFTSygxLCAwKTsKPiArCXdyaXRlbCh2YWwsIHJlZyArIFNV TjhJX1Y4NTNfUExMX0NQVV9SRUcpOwo+ICsKPiArCS8qCj4gKwkgKiBGb3JjZSBPSENJIDEyTSBj bG9jayBzb3VyY2UgdG8gMDAgKDEyTUh6IGRpdmlkZWQgZnJvbSA0OE1IeikKPiArCSAqCj4gKwkg KiBUaGlzIGNsb2NrIG11eCBpcyBzdGlsbCBteXN0ZXJpb3VzLCBhbmQgdGhlIGNvZGUganVzdCBl bmZvcmNlcwo+ICsJICogaXQgdG8gaGF2ZSBhIHZhbGlkIGNsb2NrIHBhcmVudC4KPiArCSAqLwo+ ICsJdmFsID0gcmVhZGwocmVnICsgU1VOOElfVjg1M19VU0JfQ0xLX1JFRyk7Cj4gKwl2YWwgJj0g fkdFTk1BU0soMjUsIDI0KTsKPiArCXdyaXRlbCh2YWwsIHJlZyArIFNVTjhJX1Y4NTNfVVNCX0NM S19SRUcpOwo+ICsKPiArCS8qIEZvcmNlIGZhbm91dC0yN00gZmFjdG9yIE4gdG8gMC4gKi8KPiAr CXZhbCA9IHJlYWRsKHJlZyArIFNVTjhJX1Y4NTNfRkFOT1VUXzI3TV9SRUcpOwo+ICsJdmFsICY9 IH5HRU5NQVNLKDksIDgpOwo+ICsJd3JpdGVsKHZhbCwgcmVnICsgU1VOOElfVjg1M19GQU5PVVRf MjdNX1JFRyk7Cj4gKwo+ICsJcmV0ID0gZGV2bV9zdW54aV9jY3VfcHJvYmUoJnBkZXYtPmRldiwg cmVnLCAmc3VuOGlfdjg1M19jY3VfZGVzYyk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7 Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2 aWNlX2lkIHN1bjhpX3Y4NTNfY2N1X2lkc1tdID0gewo+ICsJeyAuY29tcGF0aWJsZSA9ICJhbGx3 aW5uZXIsc3VuOGktdjg1My1jY3UiIH0sCj4gKwl7IH0KPiArfTsKPiArCj4gK3N0YXRpYyBzdHJ1 Y3QgcGxhdGZvcm1fZHJpdmVyIHN1bjhpX3Y4NTNfY2N1X2RyaXZlciA9IHsKPiArCS5wcm9iZQk9 IHN1bjhpX3Y4NTNfY2N1X3Byb2JlLAo+ICsJLmRyaXZlcgk9IHsKPiArCQkubmFtZQkJCT0gInN1 bjhpLXY4NTMtY2N1IiwKPiArCQkuc3VwcHJlc3NfYmluZF9hdHRycwk9IHRydWUsCj4gKwkJLm9m X21hdGNoX3RhYmxlCQk9IHN1bjhpX3Y4NTNfY2N1X2lkcywKPiArCX0sCj4gK307Cj4gK21vZHVs ZV9wbGF0Zm9ybV9kcml2ZXIoc3VuOGlfdjg1M19jY3VfZHJpdmVyKTsKPiArCj4gK01PRFVMRV9J TVBPUlRfTlMoIlNVTlhJX0NDVSIpOwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIlN1cHBvcnQgZm9y IHRoZSBBbGx3aW5uZXIgVjg1MyBDQ1UiKTsKPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1My5oIGIvZHJpdmVy cy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMuaAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4g aW5kZXggMDAwMDAwMDAwMDAwLi5mMWIyYTRkMGJjZDMKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIv ZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMuaAo+IEBAIC0wLDAgKzEsMTQgQEAK PiArLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KPiArLyoKPiArICogQ29w eXJpZ2h0IChDKSAyMDI0IEFuZHJhcyBTemVtem8gPHN6ZW16by5hbmRyYXNAZ21haWwuY29tPgo+ ICsgKi8KPiArCj4gKyNpZm5kZWYgX0NDVV9TVU44SV9WODUzX0hfCj4gKyNkZWZpbmUgX0NDVV9T VU44SV9WODUzX0hfCj4gKwo+ICsjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svYWxsd2lubmVy LHN1bjhpLXY4NTMtY2N1Lmg+Cj4gKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9yZXNldC9hbGx3aW5u ZXIsc3VuOGktdjg1My1jY3UuaD4KPiArCj4gKyNkZWZpbmUgQ0xLX05VTUJFUgkJKENMS19GQU5P VVQyICsgMSkKPiArCj4gKyNlbmRpZgo+IAoKCgoKCi0tIApsaW51eC1waHkgbWFpbGluZyBsaXN0 CmxpbnV4LXBoeUBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHBzOi8vbGlzdHMuaW5mcmFkZWFkLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXBoeQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 34F31C021AA for ; Wed, 19 Feb 2025 20:23:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=q3DGaY0zasXw8qE811uqbKJcUX5erXMr//QLlskFNmw=; b=PbWQEcwSeQULZq OfK5/XN7V3EBuQk+pwfF3q4ecQeyr/oAN87WgSObq6o7sAV2tDOoUKLKbcHQeMvoReavD90QtaIyw KizjY1NbDzHeNncFoNQnlnR9Ns517ZQdKQB7yrFNx/WeNPvSm87OhjWKOsHbkbML2JYqmbfmAJ7D1 97CK4oIJ8+Sbam4mJ9JLoyL7SfaAW231UdX/ocvB+kSh6k63yK2DEwXy3wx3uyNUOYFD+VTyYfzpC qspgXc6Vw/9AN9MQekEs7MFqh+7W5C2eLHX10jkTR+tUTmAvBxVqJaaOUsqAnFcrNg0ZfPIIPNSHM TTYIh9b2Lyve2kDXOSmw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkqbW-0000000Erf8-1NCk; Wed, 19 Feb 2025 20:23:34 +0000 Received: from mail-wm1-x330.google.com ([2a00:1450:4864:20::330]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkqZz-0000000ErIO-3s9s; Wed, 19 Feb 2025 20:22:02 +0000 Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-439950a45daso946225e9.2; Wed, 19 Feb 2025 12:21:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739996518; x=1740601318; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=nid48bLhH/FBJHEXa989rxTIHzZsjgSmLvJWm4cud1Q=; b=OhppFAxqtbebAiJTFQtln1VBHhNBU5G+1v7/4GnagzMrBXlJzzeq7eIilWZKrCCqdr etFaO9GNaXsasIcQKvqOJ+I4PLS4OyeQV0g7A5zWydupkjuL9MKg7Yvum/JEndNPwuWe mqUbPUhTJxpJFnecCqBiq3V7wVO76NMw8ldyz/+ECpf17e2LvEmAdrB7lxVXFRqy5O3U bRo+BfKQJu14v3d7MZmsDAaCF/q29tjGwWyt6F3tInUFyvV5k9LgkylkEuK2MM0nmPrL 5eLq33qahq34Jb/UlLO68zKrFYX1POb7j4aHwKujgIftfzgTFeldCqBbruBtx39H6WQ/ 7xmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739996518; x=1740601318; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nid48bLhH/FBJHEXa989rxTIHzZsjgSmLvJWm4cud1Q=; b=xHJPJdof9yyinf8f6B4R1dOTaVi6sgj0ejIkBN8qENbio9tZTeJWF9pVFD0eoG7tQc +PYAj1wV1A3NxUacU5KyI1OT4Rj2MrJCurtduLpQCWacdZYh1EaBckR10JaszWwnlbH/ cS8ImZlGcThw72ESjdBT5CmEAL4+e2YpEPEFXgyTb9cKXMnkWjMsTDqILTN0MWdvQJMq 03b4nx9Cv9dlxCsXKOJmB82prZaAInKAQXYCqHF6VAokOKNz8NRCCbBnUTt6KAvMlq4b hrMLEv6oalrS8uySuDHqvE5BPasUx7VMzv0wvoBlcrKfnp/FGgFI1fQ8lhFxLWkwbztW mI8w== X-Forwarded-Encrypted: i=1; AJvYcCViMn4ErYdWU3ogyIeZfZ+3KqjZNaaCRZT5fPNtnTo+QNyhIlmIYKsRLU0DNFEzOzwAb64YG1hssP87xHxO7FOn@lists.infradead.org, AJvYcCWO0kknWx3TkR6zdKaQBisAn4xsmT2yJaDCTu7vbB9hMPWkonwQ4H1rbZmQ7/kUQqtOzyylV6oGcouXppg=@lists.infradead.org, AJvYcCWribg83OV817+8Dpp8m6d6zRrFV5rL4Lj4oGuHeUhNrpkBdEk6//EKAH97hwYW6qF2ujrrRlNx5C/U@lists.infradead.org X-Gm-Message-State: AOJu0YxLLV+MeJXutuj1nzINQ05WflI556U6l+/lKqRJsPDQbop0KSTn w8qM/u2PkPw8C5H484GKrR9ZBpfwi+/fjpyB6YJPwnQQu7TCgbwm X-Gm-Gg: ASbGnctWO+ucWl8rmZxfAuD+at2KiRKzyM49GhT7BMMi9+W81v+0u/2YJ/2U4C9ouJJ 5y9BCnlzhlpK9JOFxE6QidygS5km+UM8ytsQ/A1exF7oab/6I3SOILrM+rm1940FLl0Znds4Nj8 555VUnui2F9df6R4BI7OVAsj0IpqMgPmImGMn49Xo2o5DGoC8P3JqNhw7ji4nszxhlwwT1TmtmK sGbCPKU4iy3Sdy16S92H04FrrRnTASFK/iULmnKh9re8L7OC4d7QZfaztxTgnE8zOz0Y/ztq/a+ GplLdPrHDtLKkJdWRrIxQTPrJD+D6vxA3flDjyrYbcIXzuUgbJ4gvsy3Xy0BnupmJ0E= X-Google-Smtp-Source: AGHT+IE6IeUem5aMOtu5jChHWDBa5MTCtBbguS6zGTJ5rDfVtK+EJKsOG90m0rn5aiIOqr+ekOeGNQ== X-Received: by 2002:a05:600c:3b12:b0:439:96b2:e9b with SMTP id 5b1f17b1804b1-43996b212d9mr63124255e9.9.1739996517331; Wed, 19 Feb 2025 12:21:57 -0800 (PST) Received: from jernej-laptop.localnet (86-58-6-171.dynamic.telemach.net. [86.58.6.171]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38f259d9be9sm19015747f8f.79.2025.02.19.12.21.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Feb 2025 12:21:56 -0800 (PST) From: Jernej =?UTF-8?B?xaBrcmFiZWM=?= To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen-Yu Tsai , Samuel Holland , Linus Walleij , Philipp Zabel , Maxime Ripard , Andras Szemzo Cc: Vinod Koul , Kishon Vijay Abraham I , Ulf Hansson , Paul Walmsley , Palmer Dabbelt , Albert Ou , Uwe =?UTF-8?B?S2xlaW5lLUvDtm5pZw==?= , Florian Fainelli , linux-clk@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-gpio@vger.kernel.org, linux-pm@vger.kernel.org, linux-riscv@lists.infradead.org Subject: Re: [PATCH v2 04/10] clk: sunxi-ng: add CCU drivers for V853 Date: Wed, 19 Feb 2025 21:21:54 +0100 Message-ID: <3596612.V25eIC5XRa@jernej-laptop> In-Reply-To: <20250205125225.1152849-5-szemzo.andras@gmail.com> References: <20250205125225.1152849-1-szemzo.andras@gmail.com> <20250205125225.1152849-5-szemzo.andras@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250219_122159_986472_FF1A52E5 X-CRM114-Status: GOOD ( 26.47 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org RG5lIHNyZWRhLCA1LiBmZWJydWFyIDIwMjUgb2IgMTM6NTI6MTkgU3JlZG5qZWV2cm9wc2tpIHN0 YW5kYXJkbmkgxI1hcyBqZSBBbmRyYXMgU3plbXpvIG5hcGlzYWwoYSk6Cj4gVjg1MyBoYXMgc2lt aWxhciBnYXRlcy9yZXNldHMgbGlrZSBleGlzdGluZyBBbGx3aW5uZXIgU09Dcy4gQWRkIHN1cHBv cnQgZm9yIGl0J3MgQ0NVIGFuZCBQUkNNIENDVS4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBBbmRyYXMg U3plbXpvIDxzemVtem8uYW5kcmFzQGdtYWlsLmNvbT4KPiAtLS0KPiAgZHJpdmVycy9jbGsvc3Vu eGktbmcvS2NvbmZpZyAgICAgICAgICAgIHwgICAxMCArCj4gIGRyaXZlcnMvY2xrL3N1bnhpLW5n L01ha2VmaWxlICAgICAgICAgICB8ICAgIDQgKwo+ICBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Ut c3VuOGktdjg1My1yLmMgfCAgMTIwICsrKwo+ICBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3Vu OGktdjg1My1yLmggfCAgIDE0ICsKPiAgZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4 NTMuYyAgIHwgMTE0NSArKysrKysrKysrKysrKysrKysrKysrKwo+ICBkcml2ZXJzL2Nsay9zdW54 aS1uZy9jY3Utc3VuOGktdjg1My5oICAgfCAgIDE0ICsKPiAgNiBmaWxlcyBjaGFuZ2VkLCAxMzA3 IGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvY2xrL3N1bnhpLW5n L2NjdS1zdW44aS12ODUzLXIuYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9jbGsvc3Vu eGktbmcvY2N1LXN1bjhpLXY4NTMtci5oCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2Ns ay9zdW54aS1uZy9jY3Utc3VuOGktdjg1My5jCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1My5oCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv Y2xrL3N1bnhpLW5nL0tjb25maWcgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9LY29uZmlnCj4gaW5k ZXggYjU0NzE5OGEyYzY1Li5lMjU3MzczMTc3ZTAgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9jbGsv c3VueGktbmcvS2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL0tjb25maWcKPiBA QCAtMTIsNiArMTIsMTYgQEAgY29uZmlnIFNVTklWX0YxQzEwMFNfQ0NVCj4gIAlkZWZhdWx0IHkK PiAgCWRlcGVuZHMgb24gTUFDSF9TVU5JViB8fCBDT01QSUxFX1RFU1QKPiAgCj4gK2NvbmZpZyBT VU44SV9WODUzX0NDVQo+ICsJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIHRoZSBBbGx3aW5uZXIgVjg1 My9WODUxcy9WODUxU0UgQ0NVIgo+ICsJZGVmYXVsdCBNQUNIX1NVTjhJCj4gKwlkZXBlbmRzIG9u IE1BQ0hfU1VOOEkgfHwgQ09NUElMRV9URVNUCj4gKwo+ICtjb25maWcgU1VOOElfVjg1M19SX0ND VQo+ICsJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIHRoZSBBbGx3aW5uZXIgVjg1My9WODUxcy9WODUx U0UgUFJDTSBDQ1UiCj4gKwlkZWZhdWx0IE1BQ0hfU1VOOEkKPiArCWRlcGVuZHMgb24gTUFDSF9T VU44SSB8fCBDT01QSUxFX1RFU1QKCkdlbmVyYWxseSwgdGhpcyBhcmUgdHdvIHBhdGNoZXMsIG9u ZSBmb3IgZWFjaCBkcml2ZXIuCgo+ICsKPiAgY29uZmlnIFNVTjIwSV9EMV9DQ1UKPiAgCXRyaXN0 YXRlICJTdXBwb3J0IGZvciB0aGUgQWxsd2lubmVyIEQxL1I1MjgvVDExMyBDQ1UiCj4gIAlkZWZh dWx0IHkKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvTWFrZWZpbGUgYi9kcml2 ZXJzL2Nsay9zdW54aS1uZy9NYWtlZmlsZQo+IGluZGV4IDZiM2FlMmI2MjBkYi4uYjg3OTI4NDYy ZTE1IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL01ha2VmaWxlCj4gKysrIGIv ZHJpdmVycy9jbGsvc3VueGktbmcvTWFrZWZpbGUKPiBAQCAtMjUsNiArMjUsOCBAQCBzdW54aS1j Y3UteQkJCSs9IGNjdV9tcC5vCj4gIAo+ICAjIFNvQyBzdXBwb3J0Cj4gIG9iai0kKENPTkZJR19T VU5JVl9GMUMxMDBTX0NDVSkJKz0gc3VuaXYtZjFjMTAwcy1jY3Uubwo+ICtvYmotJChDT05GSUdf U1VOOElfVjg1M19DQ1UpCSs9IHN1bjhpLXY4NTMtY2N1Lm8KPiArb2JqLSQoQ09ORklHX1NVTjhJ X1Y4NTNfUl9DQ1UpCSs9IHN1bjhpLXY4NTMtci1jY3UubwoKUHV0IGl0IHRvIG90aGVyIHN1bjhp IGRyaXZlcnMuCgo+ICBvYmotJChDT05GSUdfU1VOMjBJX0QxX0NDVSkJKz0gc3VuMjBpLWQxLWNj dS5vCj4gIG9iai0kKENPTkZJR19TVU4yMElfRDFfUl9DQ1UpCSs9IHN1bjIwaS1kMS1yLWNjdS5v Cj4gIG9iai0kKENPTkZJR19TVU41MElfQTY0X0NDVSkJKz0gc3VuNTBpLWE2NC1jY3Uubwo+IEBA IC01MCw2ICs1Miw4IEBAIG9iai0kKENPTkZJR19TVU45SV9BODBfQ0NVKQkrPSBzdW45aS1hODAt ZGUtY2N1Lm8KPiAgb2JqLSQoQ09ORklHX1NVTjlJX0E4MF9DQ1UpCSs9IHN1bjlpLWE4MC11c2It Y2N1Lm8KPiAgCj4gIHN1bml2LWYxYzEwMHMtY2N1LXkJCSs9IGNjdS1zdW5pdi1mMWMxMDBzLm8K PiArc3VuOGktdjg1My1jY3UteQkJKz0gY2N1LXN1bjhpLXY4NTMubwo+ICtzdW44aS12ODUzLXIt Y2N1LXkJCSs9IGNjdS1zdW44aS12ODUzLXIubwoKRGl0dG8uCgo+ICBzdW4yMGktZDEtY2N1LXkJ CQkrPSBjY3Utc3VuMjBpLWQxLm8KPiAgc3VuMjBpLWQxLXItY2N1LXkJCSs9IGNjdS1zdW4yMGkt ZDEtci5vCj4gIHN1bjUwaS1hNjQtY2N1LXkJCSs9IGNjdS1zdW41MGktYTY0Lm8KPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMtci5jIGIvZHJpdmVycy9j bGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMtci5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBp bmRleCAwMDAwMDAwMDAwMDAuLmJkNjBlMDBjZGE3Zgo+IC0tLSAvZGV2L251bGwKPiArKysgYi9k cml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1My1yLmMKPiBAQCAtMCwwICsxLDEyMCBA QAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ICsvKgo+ICsgKiBDb3B5 cmlnaHQgKEMpIDIwMjUgQW5kcmFzIFN6ZW16byA8c3plbXpvLmFuZHJhc0BnbWFpbC5jb20+Cj4g KyAqCj4gKyAqIEJhc2VkIG9uIGNjdS1zdW4yMGktZDEtci5jIGJ5IFNhbXVlbCBIb2xsYW5kLgo+ ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KPiArI2luY2x1ZGUg PGxpbnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4g Kwo+ICsjaW5jbHVkZSAiY2N1X2NvbW1vbi5oIgo+ICsjaW5jbHVkZSAiY2N1X3Jlc2V0LmgiCj4g Kwo+ICsjaW5jbHVkZSAiY2N1X2dhdGUuaCIKPiArI2luY2x1ZGUgImNjdV9tcC5oIgo+ICsKPiAr I2luY2x1ZGUgImNjdS1zdW44aS12ODUzLXIuaCIKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg Y2xrX3BhcmVudF9kYXRhIHJfYWhiX2FwYjBfcGFyZW50c1tdID0gewo+ICsJeyAuZndfbmFtZSA9 ICJob3NjIiB9LAo+ICsJeyAuZndfbmFtZSA9ICJsb3NjIiB9LAo+ICsJeyAuZndfbmFtZSA9ICJp b3NjIiB9LAo+ICsJeyAuZndfbmFtZSA9ICJwbGwtcGVyaXBoIiB9LAo+ICsJeyAuZndfbmFtZSA9 ICJwbGwtYXVkaW8iIH0KPiArfTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfREFUQV9XSVRI X01VWChyX2FoYl9jbGssICJyLWFoYiIsCj4gKwkJCQkgIHJfYWhiX2FwYjBfcGFyZW50cywgMHgw MDAsCj4gKwkJCQkgIDAsIDUsCQkvKiBNICovCj4gKwkJCQkgIDgsIDIsCQkvKiBQICovCj4gKwkJ CQkgIDI0LCAzLAkvKiBtdXggKi8KPiArCQkJCSAgMCk7Cj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg Y2xrX2h3ICpyX2FoYl9odyA9ICZyX2FoYl9jbGsuY29tbW9uLmh3Owo+ICsKPiArc3RhdGljIFNV TlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYKHJfYXBiMF9jbGssICJyLWFwYjAiLAo+ICsJCQkJICBy X2FoYl9hcGIwX3BhcmVudHMsIDB4MDBjLAo+ICsJCQkJICAwLCA1LAkJLyogTSAqLwo+ICsJCQkJ ICA4LCAyLAkJLyogUCAqLwo+ICsJCQkJICAyNCwgMywJLyogbXV4ICovCj4gKwkJCQkgIDApOwo+ ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqcl9hcGIwX2h3ID0gJnJfYXBiMF9jbGsuY29t bW9uLmh3OwoKV2hlcmUgY2FuIEkgbG9vayBmb3IgYWJvdmUgY2xvY2tzPyBUaGVyZSBhcmUgbm90 IGRlc2NyaWJlZCBpbiBCU1AgZHJpdmVyLgoKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9I V1MoYnVzX3JfdHdkX2NsaywgImJ1cy1yLXR3ZCIsICZyX2FwYjBfaHcsIAo+ICsJCQkgIDB4MTJj LCBCSVQoMCksIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19yX3BwdV9jbGss ICJidXMtci1wcHUiLCAmcl9hcGIwX2h3LAo+ICsJCQkgIDB4MWFjLCBCSVQoMCksIDApOwo+ICtz dGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19yX3J0Y19jbGssICJidXMtci1ydGMiLCAmcl9h aGJfaHcsCj4gKwkJCSAgMHgyMGMsIEJJVCgwKSwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FU RV9IV1MoYnVzX3JfY3B1Y2ZnX2NsaywgImJ1cy1yLWNwdWNmZyIsICZyX2FwYjBfaHcsCj4gKwkJ CSAgMHgyMmMsIEJJVCgwKSwgMCk7Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGNjdV9jb21tb24gKnN1 bjhpX3Y4NTNfcl9jY3VfY2xrc1tdID0gewo+ICsJJnJfYWhiX2Nsay5jb21tb24sCj4gKwkmcl9h cGIwX2Nsay5jb21tb24sCj4gKwkmYnVzX3JfdHdkX2Nsay5jb21tb24sCj4gKwkmYnVzX3JfcHB1 X2Nsay5jb21tb24sCj4gKwkmYnVzX3JfcnRjX2Nsay5jb21tb24sCj4gKwkmYnVzX3JfY3B1Y2Zn X2Nsay5jb21tb24sCj4gK307Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2Rh dGEgc3VuOGlfdjg1M19yX2h3X2Nsa3MgPSB7Cj4gKwkubnVtCT0gQ0xLX05VTUJFUiwKPiArCS5o d3MJPSB7Cj4gKwkJW0NMS19SX0FIQl0JCT0gJnJfYWhiX2Nsay5jb21tb24uaHcsCj4gKwkJW0NM S19SX0FQQjBdCQk9ICZyX2FwYjBfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19SX1RXRF0J CT0gJmJ1c19yX3R3ZF9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQlVTX1JfUFBVXQkJPSAmYnVz X3JfcHB1X2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfUl9SVENdCQk9ICZidXNfcl9ydGNf Y2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19SX0NQVUNGR10JPSAmYnVzX3JfY3B1Y2ZnX2Ns ay5jb21tb24uaHcsCj4gKwl9LAo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjY3Vf cmVzZXRfbWFwIHN1bjhpX3Y4NTNfcl9jY3VfcmVzZXRzW10gPSB7Cj4gKwlbUlNUX0JVU19SX1RX RF0JCT0geyAweDEyYywgQklUKDE2KSB9LAoKV2hlcmUgZGlkIHlvdSBnZXQgdGhhdD8gQlNQIGRy aXZlciB0aGF0IEkgY2hlY2tlZCBkb2Vzbid0IG1lbnRpb25zIGl0LgoKPiArCVtSU1RfQlVTX1Jf UFBVXQkJPSB7IDB4MWFjLCBCSVQoMTYpIH0sCj4gKwlbUlNUX0JVU19SX1JUQ10JCT0geyAweDIw YywgQklUKDE2KSB9LAo+ICsJW1JTVF9CVVNfUl9DUFVDRkddCT0geyAweDIyYywgQklUKDE2KSB9 LAo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBzdW54aV9jY3VfZGVzYyBzdW44aV92 ODUzX3JfY2N1X2Rlc2MgPSB7Cj4gKwkuY2N1X2Nsa3MJPSBzdW44aV92ODUzX3JfY2N1X2Nsa3Ms Cj4gKwkubnVtX2NjdV9jbGtzCT0gQVJSQVlfU0laRShzdW44aV92ODUzX3JfY2N1X2Nsa3MpLAo+ ICsKPiArCS5od19jbGtzCT0gJnN1bjhpX3Y4NTNfcl9od19jbGtzLAo+ICsKPiArCS5yZXNldHMJ CT0gc3VuOGlfdjg1M19yX2NjdV9yZXNldHMsCj4gKwkubnVtX3Jlc2V0cwk9IEFSUkFZX1NJWkUo c3VuOGlfdjg1M19yX2NjdV9yZXNldHMpLAo+ICt9Owo+ICsKPiArc3RhdGljIGludCBzdW44aV92 ODUzX3JfY2N1X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gK3sKPiArCXZv aWQgX19pb21lbSAqcmVnOwo+ICsKPiArCXJlZyA9IGRldm1fcGxhdGZvcm1faW9yZW1hcF9yZXNv dXJjZShwZGV2LCAwKTsKPiArCWlmIChJU19FUlIocmVnKSkKPiArCQlyZXR1cm4gUFRSX0VSUihy ZWcpOwo+ICsKPiArCXJldHVybiBkZXZtX3N1bnhpX2NjdV9wcm9iZSgmcGRldi0+ZGV2LCByZWcs ICZzdW44aV92ODUzX3JfY2N1X2Rlc2MpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0 IG9mX2RldmljZV9pZCBzdW44aV92ODUzX3JfY2N1X2lkc1tdID0gewo+ICsJeyAuY29tcGF0aWJs ZSA9ICJhbGx3aW5uZXIsc3VuOGktdjg1My1yLWNjdSIgfSwKPiArCXsgfQo+ICt9Owo+ICtNT0RV TEVfREVWSUNFX1RBQkxFKG9mLCBzdW44aV92ODUzX3JfY2N1X2lkcyk7Cj4gKwo+ICtzdGF0aWMg c3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdW44aV92ODUzX3JfY2N1X2RyaXZlciA9IHsKPiArCS5w cm9iZQk9IHN1bjhpX3Y4NTNfcl9jY3VfcHJvYmUsCj4gKwkuZHJpdmVyCT0gewo+ICsJCS5uYW1l CQkJPSAic3VuOGktdjg1My1yLWNjdSIsCj4gKwkJLnN1cHByZXNzX2JpbmRfYXR0cnMJPSB0cnVl LAo+ICsJCS5vZl9tYXRjaF90YWJsZQkJPSBzdW44aV92ODUzX3JfY2N1X2lkcywKPiArCX0sCj4g K307Cj4gK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3VuOGlfdjg1M19yX2NjdV9kcml2ZXIpOwo+ ICsKPiArTU9EVUxFX0lNUE9SVF9OUygiU1VOWElfQ0NVIik7Cj4gK01PRFVMRV9ERVNDUklQVElP TigiU3VwcG9ydCBmb3IgdGhlIEFsbHdpbm5lciBWODUzIFBSQ00gQ0NVIik7Cj4gK01PRFVMRV9M SUNFTlNFKCJHUEwiKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1 bjhpLXY4NTMtci5oIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMtci5oCj4g bmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjJjNmNjN2I2ZjI1MQo+ IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1 My1yLmgKPiBAQCAtMCwwICsxLDE0IEBACj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wICovCj4gKy8qCj4gKyAqIENvcHlyaWdodCAoQykgMjAyNSBBbmRyYXMgU3plbXpvIDxz emVtem8uYW5kcmFzQGdtYWlsLmNvbT4KPiArICovCj4gKwo+ICsjaWZuZGVmIF9DQ1VfU1VOOElf Vjg1M19SX0gKPiArI2RlZmluZSBfQ0NVX1NVTjhJX1Y4NTNfUl9ICj4gKwo+ICsjaW5jbHVkZSA8 ZHQtYmluZGluZ3MvY2xvY2svYWxsd2lubmVyLHN1bjhpLXY4NTMtci1jY3UuaD4KPiArI2luY2x1 ZGUgPGR0LWJpbmRpbmdzL3Jlc2V0L2FsbHdpbm5lcixzdW44aS12ODUzLXItY2N1Lmg+Cj4gKwo+ ICsjZGVmaW5lIENMS19OVU1CRVIJCShDTEtfQlVTX1JfQ1BVQ0ZHICsgMSkKPiArCj4gKyNlbmRp Zgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1My5jIGIv ZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMuYwo+IG5ldyBmaWxlIG1vZGUgMTAw NjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi40YjMyZjNhOTEzY2YKPiAtLS0gL2Rldi9udWxsCj4g KysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMuYwo+IEBAIC0wLDAgKzEs MTE0NSBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ICsvKgo+ICsg KiBDb3B5cmlnaHQgKEMpIDIwMjUgQW5kcmFzIFN6ZW16byA8c3plbXpvLmFuZHJhc0BnbWFpbC5j b20+Cj4gKyAqCj4gKyAqIEJhc2VkIG9uIGNjdS1zdW4yMGktZDEuYyBieSBTYW11ZWwgSG9sbGFu ZC4KPiArICovCj4gKwo+ICsjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+Cj4gKyNpbmNs dWRlIDxsaW51eC9pby5oPgo+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gKyNpbmNsdWRl IDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiArCj4gKyNpbmNsdWRlICIuLi9jbGsuaCIKPiAr Cj4gKyNpbmNsdWRlICJjY3VfY29tbW9uLmgiCj4gKyNpbmNsdWRlICJjY3VfcmVzZXQuaCIKPiAr Cj4gKyNpbmNsdWRlICJjY3VfZGl2LmgiCj4gKyNpbmNsdWRlICJjY3VfZ2F0ZS5oIgo+ICsjaW5j bHVkZSAiY2N1X21wLmgiCj4gKyNpbmNsdWRlICJjY3VfbXVsdC5oIgo+ICsjaW5jbHVkZSAiY2N1 X25rLmgiCj4gKyNpbmNsdWRlICJjY3VfbmttLmgiCj4gKyNpbmNsdWRlICJjY3VfbmttcC5oIgo+ ICsjaW5jbHVkZSAiY2N1X25tLmgiCj4gKwo+ICsjaW5jbHVkZSAiY2N1LXN1bjhpLXY4NTMuaCIK PiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX3BhcmVudF9kYXRhIG9zYzI0TVtdID0gewo+ ICsJeyAuZndfbmFtZSA9ICJob3NjIiB9Cj4gK307Cj4gKwo+ICsvKgo+ICsgKiBGb3IgdGhlIENQ VSBQTEwsIHRoZSBvdXRwdXQgZGl2aWRlciBpcyBkZXNjcmliZWQgYXMgIm9ubHkgZm9yIHRlc3Rp bmciCj4gKyAqIGluIHRoZSB1c2VyIG1hbnVhbC4gU28gaXQncyBub3QgbW9kZWxsZWQgYW5kIGZv cmNlZCB0byAwLgo+ICsgKi8KPiArI2RlZmluZSBTVU44SV9WODUzX1BMTF9DUFVfUkVHCQkweDAw MAo+ICsKPiArc3RhdGljIHN0cnVjdCBjY3VfbXVsdCBwbGxfY3B1X2NsayA9IHsKPiArCS5lbmFi bGUJCT0gQklUKDI3KSwKPiArCS5sb2NrCQk9IEJJVCgyOCksCj4gKwkubXVsdAkJPSBfU1VOWElf Q0NVX01VTFRfTUlOKDgsIDgsIDExKSwKPiArCS5jb21tb24JCT0gewo+ICsJCS5yZWcJCT0gMHgw MDAsCj4gKwkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVF9QQVJFTlRTX0RBVEEoInBsbC1jcHUiLCBv c2MyNE0sCj4gKwkJCQkJCQkgICAmY2N1X211bHRfb3BzLAo+ICsJCQkJCQkJICAgQ0xLX1NFVF9S QVRFX0dBVEUpLAo+ICsJfSwKPiArfTsKPiArCj4gKy8qIFNvbWUgUExMcyBhcmUgaW5wdXQgKiBO IC8gZGl2MSAvIFAuIE1vZGVsIHRoZW0gYXMgTktNUCB3aXRoIG5vIEsgKi8KPiArI2RlZmluZSBT VU44SV9WODUzX1BMTF9ERFJfUkVHCQkweDAxMAo+ICtzdGF0aWMgc3RydWN0IGNjdV9ua21wIHBs bF9kZHJfY2xrID0gewo+ICsJLmVuYWJsZQkJPSBCSVQoMjcpLAo+ICsJLmxvY2sJCT0gQklUKDI4 KSwKPiArCS5uCQk9IF9TVU5YSV9DQ1VfTVVMVF9NSU4oOCwgOCwgMTEpLAo+ICsJLm0JCT0gX1NV TlhJX0NDVV9ESVYoMSwgMSksIC8qIGlucHV0IGRpdmlkZXIgKi8KPiArCS5wCQk9IF9TVU5YSV9D Q1VfRElWKDAsIDEpLCAvKiBvdXRwdXQgZGl2aWRlciAqLwo+ICsJLmNvbW1vbgkJPSB7Cj4gKwkJ LnJlZwkJPSAweDAxMCwKPiArCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFNfREFUQSgi cGxsLWRkciIsIG9zYzI0TSwKPiArCQkJCQkJCSAgICZjY3VfbmttcF9vcHMsCj4gKwkJCQkJCQkg ICBDTEtfU0VUX1JBVEVfR0FURSksCj4gKwl9LAo+ICt9Owo+ICsKPiArI2RlZmluZSBTVU44SV9W ODUzX1BMTF9QRVJJUEhfUkVHCTB4MDIwCj4gK3N0YXRpYyBzdHJ1Y3QgY2N1X25tIHBsbF9wZXJp cGhfNHhfY2xrID0gewo+ICsJLmVuYWJsZQkJPSBCSVQoMjcpLAo+ICsJLmxvY2sJCT0gQklUKDI4 KSwKPiArCS5uCQk9IF9TVU5YSV9DQ1VfTVVMVF9NSU4oOCwgOCwgMTEpLAo+ICsJLm0JCT0gX1NV TlhJX0NDVV9ESVYoMSwgMSksIC8qIGlucHV0IGRpdmlkZXIgKi8KPiArCS5jb21tb24JCT0gewo+ ICsJCS5yZWcJCT0gMHgwMjAsCj4gKwkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVF9QQVJFTlRTX0RB VEEoInBsbC1wZXJpcGgtNHgiLCBvc2MyNE0sCj4gKwkJCQkJCQkgICAmY2N1X25tX29wcywKPiAr CQkJCQkJCSAgIENMS19TRVRfUkFURV9HQVRFKSwKPiArCX0sCj4gK307Cj4gKwo+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGNsa19odyAqcGxsX3BlcmlwaF80eF9od3NbXSA9IHsKPiArCSZwbGxfcGVy aXBoXzR4X2Nsay5jb21tb24uaHcKPiArfTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9IV1Mo cGxsX3BlcmlwaF8yeF9jbGssICJwbGwtcGVyaXBoLTJ4IiwgcGxsX3BlcmlwaF80eF9od3MsCj4g KwkJICAgICAgIDB4MDIwLCAxNiwgMywgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX01fSFdT KHBsbF9wZXJpcGhfODAwTV9jbGssICJwbGwtcGVyaXBoLTgwME0iLCBwbGxfcGVyaXBoXzR4X2h3 cywKPiArCQkgICAgICAgMHgwMjAsIDIwLCAzLCAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1Vf TV9IV1MocGxsX3BlcmlwaF80ODBNX2NsaywgInBsbC1wZXJpcGgtNDgwTSIsIHBsbF9wZXJpcGhf NHhfaHdzLAo+ICsJCSAgICAgICAweDAyMCwgMiwgMywgMCk7Cj4gKwo+ICtzdGF0aWMgQ0xLX0ZJ WEVEX0ZBQ1RPUl9IVyhwbGxfcGVyaXBoXzYwME1fY2xrLCAicGxsLXBlcmlwaC02MDBNIiwKPiAr CQkJICAgJnBsbF9wZXJpcGhfMnhfY2xrLmNvbW1vbi5odywgMiwgMSwgMCk7Cj4gKwo+ICtzdGF0 aWMgQ0xLX0ZJWEVEX0ZBQ1RPUl9IVyhwbGxfcGVyaXBoXzQwME1fY2xrLCAicGxsLXBlcmlwaC00 MDBNIiwKPiArCQkJICAgJnBsbF9wZXJpcGhfMnhfY2xrLmNvbW1vbi5odywgMywgMSwgMCk7Cj4g Kwo+ICtzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUl9IVyhwbGxfcGVyaXBoXzMwME1fY2xrLCAicGxs LXBlcmlwaC0zMDBNIiwKPiArCQkJICAgJnBsbF9wZXJpcGhfNjAwTV9jbGsuaHcsIDIsIDEsIDAp Owo+ICsKPiArc3RhdGljIENMS19GSVhFRF9GQUNUT1JfSFcocGxsX3BlcmlwaF8yMDBNX2Nsaywg InBsbC1wZXJpcGgtMjAwTSIsCj4gKwkJCSAgICZwbGxfcGVyaXBoXzQwME1fY2xrLmh3LCAyLCAx LCAwKTsKPiArCj4gK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SX0hXKHBsbF9wZXJpcGhfMTYwTV9j bGssICJwbGwtcGVyaXBoLTE2ME0iLAo+ICsJCQkgICAmcGxsX3BlcmlwaF80ODBNX2Nsay5jb21t b24uaHcsIDMsIDEsIDApOwo+ICsKPiArc3RhdGljIENMS19GSVhFRF9GQUNUT1JfSFcocGxsX3Bl cmlwaF8xNTBNX2NsaywgInBsbC1wZXJpcGgtMTUwTSIsCj4gKwkJCSAgICZwbGxfcGVyaXBoXzMw ME1fY2xrLmh3LCAyLCAxLCAwKTsKPiArCj4gKy8qCj4gKyAqIEZvciBWaWRlbyBQTExzLCB0aGUg b3V0cHV0IGRpdmlkZXIgaXMgZGVzY3JpYmVkIGFzICJvbmx5IGZvciB0ZXN0aW5nIgo+ICsgKiBp biB0aGUgdXNlciBtYW51YWwuCj4gKyAqLwo+ICsjZGVmaW5lIFNVTjhJX1Y4NTNfUExMX1ZJREVP X1JFRwkweDA0MAo+ICtzdGF0aWMgc3RydWN0IGNjdV9ua21wIHBsbF92aWRlb180eF9jbGsgPSB7 Cj4gKwkuZW5hYmxlCQk9IEJJVCgyNyksCj4gKwkubG9jawkJPSBCSVQoMjgpLAo+ICsJLm4JCT0g X1NVTlhJX0NDVV9NVUxUX01JTig4LCA4LCAxMSksCj4gKwkucAkJPSBfU1VOWElfQ0NVX0RJVigx LCAxKSwgLyogaW5wdXQgZGl2aWRlciAqLwo+ICsJLmNvbW1vbgkJPSB7Cj4gKwkJLnJlZwkJPSAw eDA0MCwKPiArCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFNfREFUQSgicGxsLXZpZGVv LTR4Iiwgb3NjMjRNLAo+ICsJCQkJCQkJICAgJmNjdV9ua21wX29wcywKPiArCQkJCQkJCSAgIENM S19TRVRfUkFURV9HQVRFKSwKPiArCX0sCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0 IGNsa19odyAqcGxsX3ZpZGVvXzR4X2h3c1tdID0gewo+ICsJJnBsbF92aWRlb180eF9jbGsuY29t bW9uLmh3Cj4gK307Cj4gK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SX0hXUyhwbGxfdmlkZW9fMnhf Y2xrLCAicGxsLXZpZGVvLTJ4IiwKPiArCQkJICAgIHBsbF92aWRlb180eF9od3MsIDIsIDEsIENM S19TRVRfUkFURV9QQVJFTlQpOwo+ICtzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUl9IV1MocGxsX3Zp ZGVvXzF4X2NsaywgInBsbC12aWRlby0xeCIsCj4gKwkJCSAgICBwbGxfdmlkZW9fNHhfaHdzLCA0 LCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKPiArCj4gKwo+ICsvKgo+ICsgKiBGb3IgQ1NJIFBM THMsIHRoZSBvdXRwdXQgZGl2aWRlciBpcyBkZXNjcmliZWQgYXMgIm9ubHkgZm9yIHRlc3Rpbmci Cj4gKyAqIGluIHRoZSB1c2VyIG1hbnVhbC4KPiArICovCj4gKyNkZWZpbmUgU1VOOElfVjg1M19Q TExfQ1NJX1JFRwkJMHgwNDgKPiArc3RhdGljIHN0cnVjdCBjY3VfbmttcCBwbGxfY3NpXzR4X2Ns ayA9IHsKPiArCS5lbmFibGUJCT0gQklUKDI3KSwKPiArCS5sb2NrCQk9IEJJVCgyOCksCj4gKwku bgkJPSBfU1VOWElfQ0NVX01VTFRfTUlOKDgsIDgsIDExKSwKPiArCS5wCQk9IF9TVU5YSV9DQ1Vf RElWKDEsIDEpLCAvKiBpbnB1dCBkaXZpZGVyICovCj4gKwkuY29tbW9uCQk9IHsKPiArCQkucmVn CQk9IDB4MDQ4LAo+ICsJCS5ody5pbml0CT0gQ0xLX0hXX0lOSVRfUEFSRU5UU19EQVRBKCJwbGwt Y3NpLTR4Iiwgb3NjMjRNLAo+ICsJCQkJCQkJICAgJmNjdV9ua21wX29wcywKPiArCQkJCQkJCSAg IENMS19TRVRfUkFURV9HQVRFKSwKPiArCX0sCj4gK307Cj4gKwo+ICtzdGF0aWMgQ0xLX0ZJWEVE X0ZBQ1RPUl9IVyhwbGxfY3NpX2NsaywgInBsbC1jc2kiLAo+ICsJCQkgICAmcGxsX2NzaV80eF9j bGsuY29tbW9uLmh3LCA0LCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKPiArCj4gKwo+ICsjZGVm aW5lIFNVTjhJX1Y4NTNfUExMX0FVRElPX1JFRwkweDA3OAo+ICtzdGF0aWMgc3RydWN0IGNjdV9z ZG1fc2V0dGluZyBwbGxfYXVkaW9fZGl2NV9zZG1fdGFibGVbXSA9IHsKPiArCXsgLnJhdGUgPSAx OTY2MDgwMDAsIC5wYXR0ZXJuID0gMHhjMDAxZWI4NSwgLm0gPSA1LCAubiA9IDQwIH0sIC8qIDI0 LjU3NiAqLwo+ICsJeyAucmF0ZSA9IDY3NzM3NjAwLCAucGF0dGVybiA9IDB4YzAwMTI4OGQsIC5t ID0gOCwgLm4gPSAyMiB9LCAvKiAyMi41NzkyICovCj4gK307Cj4gKwo+ICtzdGF0aWMgc3RydWN0 IGNjdV9ubSBwbGxfYXVkaW9fZGl2NV9jbGsgPSB7Cj4gKwkuZW5hYmxlCQk9IEJJVCgyNyksCj4g KwkubG9jayAgICAgICAgICAgPSBCSVQoMjgpLAo+ICsJLm4gICAgICAgICAgICAgID0gX1NVTlhJ X0NDVV9NVUxUKDgsIDgpLAo+ICsJLm0gICAgICAgICAgICAgID0gX1NVTlhJX0NDVV9ESVYoMjAs IDMpLAo+ICsJLnNkbSAgICAgICAgICAgID0gX1NVTlhJX0NDVV9TRE0ocGxsX2F1ZGlvX2RpdjVf c2RtX3RhYmxlLAo+ICsJCQkJICAgIEJJVCgyNCksIDB4MDE3OCwgQklUKDMxKSksCj4gKwkuY29t bW9uICAgICAgICAgPSB7Cj4gKwkJLnJlZyAgICAgICAgICAgID0gMHgwMDc4LAo+ICsJCS5mZWF0 dXJlcyAgICAgICA9IENDVV9GRUFUVVJFX1NJR01BX0RFTFRBX01PRCwKPiArCQkuaHcuaW5pdCAg ICAgICAgPSBDTEtfSFdfSU5JVF9QQVJFTlRTX0RBVEEoInBsbC1hdWRpby1kaXY1Iiwgb3NjMjRN LAo+ICsJCQkJCQkJICAgJmNjdV9ubV9vcHMsCj4gKwkJCQkJCQkgICBDTEtfU0VUX1JBVEVfVU5H QVRFKSwKPiArCX0sCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqcGxs X2F1ZGlvX2RpdjVfaHdzW10gPSB7Cj4gKwkmcGxsX2F1ZGlvX2RpdjVfY2xrLmNvbW1vbi5odwo+ ICt9Owo+ICsKPiArc3RhdGljIFNVTlhJX0NDVV9NX0hXUyhwbGxfYXVkaW9fMXhfY2xrLCAicGxs LWF1ZGlvLTF4IiwgcGxsX2F1ZGlvX2RpdjVfaHdzLAo+ICsJCSAgICAgICAweGUwMCwgMCwgNSwg Q0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4gKwo+ICsvKiBwbGwtYXVkaW8tZGl2MiBhbmQgcGxsLWF1 ZGlvLTR4IG5vdCB1c2VkLCBiZWNhdXNlIHBsbC1hdWRpby0xeCBjYW4gY292ZXIgCj4gKyAqIDIy LjU3OTJNIGFuZCAyNC41NzZNIAo+ICsgKi8KPiArc3RhdGljIFNVTlhJX0NDVV9NKHBsbF9hdWRp b19kaXYyX2NsaywgInBsbC1hdWRpby1kaXYyIiwgInBsbC1hdWRpbyIsCj4gKwkJICAgMHgwNzgs IDE2LCAzLCAwKTsKPiArc3RhdGljIFNVTlhJX0NDVV9NKHBsbF9hdWRpb180eF9jbGssICJwbGwt YXVkaW8tNHgiLCAicGxsLWF1ZGlvLWRpdjIiLAo+ICsJCSAgIDB4ZTAwLCA1LCA1LCAwKTsKPiAr Cj4gKy8qCj4gKyAqIEZvciB0aGUgTlBVIFBMTCwgdGhlIG91dHB1dCBkaXZpZGVyIGlzIGRlc2Ny aWJlZCBhcyAib25seSBmb3IgdGVzdGluZyIKPiArICogaW4gdGhlIHVzZXIgbWFudWFsLgo+ICsg Ki8KPiArI2RlZmluZSBTVU44SV9WODUzX1BMTF9OUFVfUkVHCQkweDA4MAo+ICtzdGF0aWMgc3Ry dWN0IGNjdV9ua21wIHBsbF9ucHVfNHhfY2xrID0gewo+ICsJLmVuYWJsZQkJPSBCSVQoMjcpLAo+ ICsJLmxvY2sJCT0gQklUKDI4KSwKPiArCS5uCQk9IF9TVU5YSV9DQ1VfTVVMVF9NSU4oOCwgOCwg MTEpLAo+ICsJLnAJCT0gX1NVTlhJX0NDVV9ESVYoMSwgMSksIC8qIGlucHV0IGRpdmlkZXIgKi8K PiArCS5jb21tb24JCT0gewo+ICsJCS5yZWcJCT0gMHgwODAsCj4gKwkJLmh3LmluaXQJPSBDTEtf SFdfSU5JVF9QQVJFTlRTX0RBVEEoInBsbC1ucHUtNHgiLCBvc2MyNE0sCj4gKwkJCQkJCQkgICAm Y2N1X25rbXBfb3BzLAo+ICsJCQkJCQkJICAgQ0xLX1NFVF9SQVRFX1VOR0FURSksCj4gKwl9LAo+ ICt9Owo+ICsKPiArLyoKPiArICogVGhlIENQVSBnYXRlIGlzIG5vdCBtb2RlbGxlZCAtIGl0IGlz IGluIGEgc2VwYXJhdGUgcmVnaXN0ZXIgKDB4NTA0KQo+ICsgKiBhbmQgaGFzIGEgc3BlY2lhbCBr ZXkgZmllbGQuIFRoZSBjbG9jayBtdXN0IG5vdCBiZSBnYXRlZCBhbnl3YXkgYnkKPiArICogdGhl IGtlcm5lbC4KPiArICovCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX3BhcmVudF9kYXRhIGNw dV9wYXJlbnRzW10gPSB7Cj4gKwl7IC5md19uYW1lID0gImhvc2MiIH0sCj4gKwl7IC5md19uYW1l ID0gImxvc2MiIH0sCj4gKwl7IC5md19uYW1lID0gImlvc2MiIH0sCj4gKwl7IC5odyA9ICZwbGxf Y3B1X2Nsay5jb21tb24uaHcgfSwKPiArCXsgLmh3ID0gJnBsbF9wZXJpcGhfNjAwTV9jbGsuaHcg fSwKPiArCXsgLmh3ID0gJnBsbF9wZXJpcGhfODAwTV9jbGsuY29tbW9uLmh3IH0sCj4gK307Cj4g Kwo+ICsvKgo+ICsgKiBUaGVyZSBpcyBhIFAgZmFjdG9yIChQTExfT1VUX0VYVF9ESVZQWzE3OjE2 XSkgaW4gdGhpcyByZWdpc3RlciwgYnV0IGl0IGlzIG5vdCBtb2RlbGVkLgo+ICsgKiBUaGUgbWFu dWFsIHN0YXRlcyB0aGF0IGl0IHNob3VsZCBiZSB1c2VkIG9ubHksIHdoZW4gdGhlIG91dHB1dCBj bG9jayBpcyBsZXNzIHRoYW4gMjg4IE1Iei4KPiArICovCj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVVY X0RBVEEoY3B1X2NsaywgImNwdSIsIGNwdV9wYXJlbnRzLAo+ICsJCQkgIDB4NTAwLCAyNCwgMywg Q0xLX1NFVF9SQVRFX1BBUkVOVCB8IENMS19JU19DUklUSUNBTCk7Cj4gKwo+ICtzdGF0aWMgY29u c3Qgc3RydWN0IGNsa19odyAqY3B1X2h3c1tdID0geyAmY3B1X2Nsay5jb21tb24uaHcgfTsKPiAr Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9IV1MoY3B1X2F4aV9jbGssICJjcHUtYXhpIiwgY3B1X2h3 cywKPiArCQkgICAgICAgMHg1MDAsIDAsIDIsIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX01fSFdT KGNwdV9hcGJfY2xrLCAiY3B1LWFwYiIsIGNwdV9od3MsCj4gKwkJICAgICAgIDB4NTAwLCA4LCAy LCAwKTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX3BhcmVudF9kYXRhIGFoYl9wYXJl bnRzW10gPSB7Cj4gKwl7IC5md19uYW1lID0gImhvc2MiIH0sCj4gKwl7IC5md19uYW1lID0gImxv c2MiIH0sCj4gKwl7IC5md19uYW1lID0gImlvc2MiIH0sCj4gKwl7IC5odyA9ICZwbGxfcGVyaXBo XzYwME1fY2xrLmh3IH0sCj4gK307Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfREFUQV9XSVRIX01V WChhaGJfY2xrLCAiYWhiIiwgYWhiX3BhcmVudHMsIDB4NTEwLAo+ICsJCQkJICAwLCA1LAkJLyog TSAqLwo+ICsJCQkJICA4LCAyLAkJLyogUCAqLwo+ICsJCQkJICAyNCwgMiwJLyogbXV4ICovCj4g KwkJCQkgIDApOwo+ICsKPiArc3RhdGljIFNVTlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYKGFwYjBf Y2xrLCAiYXBiMCIsIGFoYl9wYXJlbnRzLCAweDUyMCwKPiArCQkJCSAgMCwgNSwJCS8qIE0gKi8K PiArCQkJCSAgOCwgMiwJCS8qIFAgKi8KPiArCQkJCSAgMjQsIDIsCS8qIG11eCAqLwo+ICsJCQkJ ICAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfREFUQV9XSVRIX01VWChhcGIxX2Nsaywg ImFwYjEiLCBhaGJfcGFyZW50cywgMHg1MjQsCj4gKwkJCQkgIDAsIDUsCQkvKiBNICovCj4gKwkJ CQkgIDgsIDIsCQkvKiBQICovCj4gKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KPiArCQkJCSAgMCk7 Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqYWhiX2h3c1tdID0geyAmYWhiX2Ns ay5jb21tb24uaHcgfTsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcgKmFwYjBfaHdzW10g PSB7ICZhcGIwX2Nsay5jb21tb24uaHcgfTsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcg KmFwYjFfaHdzW10gPSB7ICZhcGIxX2Nsay5jb21tb24uaHcgfTsKPiArCj4gKwo+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGNsa19odyAqZGVfZzJkX3BhcmVudHNbXSA9IHsKPiArCSZwbGxfcGVyaXBo XzMwME1fY2xrLmh3LAo+ICsJJnBsbF92aWRlb18xeF9jbGsuaHcsCj4gK307Cj4gK3N0YXRpYyBT VU5YSV9DQ1VfTV9IV19XSVRIX01VWF9HQVRFKGRlX2NsaywgImRlIiwgZGVfZzJkX3BhcmVudHMs IDB4NjAwLAo+ICsJCQkJICAgIDAsIDUsCS8qIE0gKi8KPiArCQkJCSAgICAyNCwgMSwJLyogbXV4 ICovCj4gKwkJCQkgICAgQklUKDMxKSwJLyogZ2F0ZSAqLwo+ICsJCQkJICAgIENMS19TRVRfUkFU RV9QQVJFTlQpOwo+ICsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfZGVfY2xrLCAi YnVzLWRlIiwgYWhiX2h3cywKPiArCQkJICAweDYwYywgQklUKDApLCAwKTsKPiArCj4gK3N0YXRp YyBTVU5YSV9DQ1VfTV9IV19XSVRIX01VWF9HQVRFKGcyZF9jbGssICJnMmQiLCBkZV9nMmRfcGFy ZW50cywgMHg2MzAsCj4gKwkJCQkgICAgMCwgNSwJLyogTSAqLwo+ICsJCQkJICAgIDI0LCAxLAkv KiBtdXggKi8KPiArCQkJCSAgICBCSVQoMzEpLAkvKiBnYXRlICovCj4gKwkJCQkgICAgQ0xLX1NF VF9SQVRFX1BBUkVOVCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19nMmRf Y2xrLCAiYnVzLWcyZCIsIGFoYl9od3MsCj4gKwkJCSAgMHg2M2MsIEJJVCgwKSwgMCk7Cj4gKwo+ ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfcGFyZW50X2RhdGEgY2VfcGFyZW50c1tdID0g ewo+ICsJeyAuZndfbmFtZSA9ICJob3NjIiB9LAoKV2hlcmUgdGhpcyBjb21lIGZyb20/IFY4NTMg bWFudWFsIHYxLjEgZG9lc24ndCBoYXZlIGl0LgoKPiArCXsgLmh3ID0gJnBsbF9wZXJpcGhfNDAw TV9jbGsuaHcsIH0sCj4gKwl7IC5odyA9ICZwbGxfcGVyaXBoXzMwME1fY2xrLmh3LCB9Cj4gK307 Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9EQVRBX1dJVEhfTVVYX0dBVEUoY2VfY2xrLCAiY2UiLCBj ZV9wYXJlbnRzLCAweDY4MCwKPiArCQkJCSAgICAgIDAsIDQsCS8qIE0gKi8KPiArCQkJCSAgICAg IDI0LCAzLAkvKiBtdXggKi8KPiArCQkJCSAgICAgIEJJVCgzMSksCS8qIGdhdGUgKi8KPiArCQkJ CSAgICAgIENMS19TRVRfUkFURV9QQVJFTlQpOwoKU2V0IHJhdGUgcGFyZW50IGZsYWcgZG9lc24n dCBtYWtlIHNlbnNlIG9uIGNvbnN0YW50IHBhcmVudHMuCgo+ICsKPiArc3RhdGljIFNVTlhJX0ND VV9HQVRFX0hXUyhidXNfY2VfY2xrLCAiYnVzLWNlIiwgYWhiX2h3cywKPiArCQkJICAweDY4Yywg QklUKDApIHwgQklUKDEpLCAwKTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3ICp2 ZV9wYXJlbnRzW10gPSB7Cj4gKwkmcGxsX3BlcmlwaF8zMDBNX2Nsay5odywKPiArCSZwbGxfcGVy aXBoXzQwME1fY2xrLmh3LAo+ICsJJnBsbF9wZXJpcGhfNDgwTV9jbGsuY29tbW9uLmh3LAo+ICsJ JnBsbF9ucHVfNHhfY2xrLmNvbW1vbi5odywKPiArCSZwbGxfdmlkZW9fNHhfY2xrLmNvbW1vbi5o dywKPiArCSZwbGxfY3NpXzR4X2Nsay5jb21tb24uaHcsCj4gK307Cj4gK3N0YXRpYyBTVU5YSV9D Q1VfTV9IV19XSVRIX01VWF9HQVRFKHZlX2NsaywgInZlIiwgdmVfcGFyZW50cywgMHg2OTAsCj4g KwkJCQkgICAgMCwgNSwJLyogTSAqLwo+ICsJCQkJICAgIDI0LCAzLAkvKiBtdXggKi8KPiArCQkJ CSAgICBCSVQoMzEpLAkvKiBnYXRlICovCj4gKwkJCQkgICAgMCk7CgpDTEtfU0VUX1JBVEVfUEFS RU5UIGZsYWc/IENlZHJ1cyBkcml2ZXIgc2V0IHdvcmtpbmcgY2xvY2sgYXQgdGhlIGJlZ2lubmlu Zy4KCj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c192ZV9jbGssICJidXMtdmUi LCBhaGJfaHdzLAo+ICsJCQkgIDB4NjljLCBCSVQoMCksIDApOwo+ICsKPiArCj4gK3N0YXRpYyBj b25zdCBzdHJ1Y3QgY2xrX2h3ICpucHVfcGFyZW50c1tdID0gewo+ICsJJnBsbF9wZXJpcGhfNDgw TV9jbGsuY29tbW9uLmh3LAo+ICsJJnBsbF9wZXJpcGhfNjAwTV9jbGsuaHcsCj4gKwkmcGxsX3Bl cmlwaF84MDBNX2Nsay5jb21tb24uaHcsCj4gKwkmcGxsX25wdV80eF9jbGsuY29tbW9uLmh3LAo+ ICt9Owo+ICtzdGF0aWMgU1VOWElfQ0NVX01fSFdfV0lUSF9NVVhfR0FURShucHVfY2xrLCAibnB1 IiwgbnB1X3BhcmVudHMsIDB4NmUwLAo+ICsJCQkJICAgIDAsIDUsCS8qIE0gKi8KPiArCQkJCSAg ICAyNCwgMywJLyogbXV4ICovCj4gKwkJCQkgICAgQklUKDMxKSwJLyogZ2F0ZSAqLwo+ICsJCQkJ ICAgIDApOwoKSSB0aGluayBDTEtfU0VUX1JBVEVfUEFSRU5UIHdvdWxkIGFsc28gYmUgYmVuZWZp Y2lhbCBoZXJlLgoKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX25wdV9jbGss ICJidXMtbnB1IiwgYWhiX2h3cywKPiArCQkJICAweDZlYywgQklUKDApLCAwKTsKPiArCj4gK3N0 YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2RtYV9jbGssICJidXMtZG1hIiwgYWhiX2h3cywK PiArCQkJICAweDcwYywgQklUKDApLCAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9I V1MoYnVzX21zZ2JveDBfY2xrLCAiYnVzLW1zZ2JveDAiLCBhaGJfaHdzLAo+ICsJCQkgIDB4NzFj LCBCSVQoMCksIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19tc2dib3gxX2Ns aywgImJ1cy1tc2dib3gxIiwgYWhiX2h3cywKPiArCQkJICAweDcxYywgQklUKDEpLCAwKTsKPiAr Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX3NwaW5sb2NrX2NsaywgImJ1cy1zcGlu bG9jayIsIGFoYl9od3MsCj4gKwkJCSAgMHg3MmMsIEJJVCgwKSwgMCk7Cj4gKwo+ICtzdGF0aWMg U1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19oc3RpbWVyX2NsaywgImJ1cy1oc3RpbWVyIiwgYWhiX2h3 cywKPiArCQkJICAweDczYywgQklUKDApLCAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FU RV9EQVRBKGF2c19jbGssICJhdnMiLCBvc2MyNE0sCj4gKwkJCSAgIDB4NzQwLCBCSVQoMzEpLCAw KTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2RiZ19jbGssICJidXMtZGJn IiwgYWhiX2h3cywKPiArCQkJICAweDc4YywgQklUKDApLCAwKTsKPiArCj4gK3N0YXRpYyBTVU5Y SV9DQ1VfR0FURV9IV1MoYnVzX3B3bV9jbGssICJidXMtcHdtIiwgYXBiMF9od3MsCj4gKwkJCSAg MHg3YWMsIEJJVCgwKSwgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19p b21tdV9jbGssICJidXMtaW9tbXUiLCBhaGJfaHdzLAo+ICsJCQkgIDB4N2JjLCBCSVQoMCksIDAp Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcgKmRyYW1fcGFyZW50c1tdID0gewo+ ICsJJnBsbF9kZHJfY2xrLmNvbW1vbi5odywKPiArCSZwbGxfcGVyaXBoXzJ4X2Nsay5jb21tb24u aHcsCj4gKwkmcGxsX3BlcmlwaF84MDBNX2Nsay5jb21tb24uaHcsCj4gK307Cj4gK3N0YXRpYyBT VU5YSV9DQ1VfTVBfSFdfV0lUSF9NVVhfR0FURShkcmFtX2NsaywgImRyYW0iLCBkcmFtX3BhcmVu dHMsIDB4ODAwLAo+ICsJCQkJICAgICAwLCA1LAkvKiBNICovCj4gKwkJCQkgICAgIDgsIDIsCS8q IFAgKi8KPiArCQkJCSAgICAgMjQsIDMsCS8qIG11eCAqLwo+ICsJCQkJICAgICBCSVQoMzEpLCBD TEtfSVNfQ1JJVElDQUwpOwoKVGhpcyBjbG9jayBuZWVkcyB1cGRhdGUgZmllbGQgdG8gYmUgc2V0 IHRvIGFjdHVhbGx5IGFwcGx5IGNvbmZpZ3VyYXRpb24uIFNvCnNhbWUgY29tbWVudCBhcyBvbiBB NTIzIGNsb2NrIHZlcnNpb24sIHRoaXMgbmVlZHMgbmV3IGZsYWcgdG8gYmUgaW50cm9kdWNlZApm b3Igc3VjaCBjYXNlLgoKPiArCj4gK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SX0hXKG1idXNfY2xr LCAibWJ1cyIsCj4gKwkJCSAgICZkcmFtX2Nsay5jb21tb24uaHcsIDQsIDEsIDApOwo+ICsKPiAr c3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcgKm1idXNfaHdzW10gPSB7ICZtYnVzX2Nsay5odyB9 Owo+ICsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhtYnVzX2RtYV9jbGssICJtYnVzLWRt YSIsIG1idXNfaHdzLAo+ICsJCQkgIDB4ODA0LCBCSVQoMCksIDApOwo+ICtzdGF0aWMgU1VOWElf Q0NVX0dBVEVfSFdTKG1idXNfdmVfY2xrLCAibWJ1cy12ZSIsIG1idXNfaHdzLAo+ICsJCQkgIDB4 ODA0LCBCSVQoMSksIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKG1idXNfY2VfY2xr LCAibWJ1cy1jZSIsIG1idXNfaHdzLAo+ICsJCQkgIDB4ODA0LCBCSVQoMiksIDApOwo+ICtzdGF0 aWMgU1VOWElfQ0NVX0dBVEVfSFdTKG1idXNfY3NpX2NsaywgIm1idXMtY3NpIiwgbWJ1c19od3Ms Cj4gKwkJCSAgMHg4MDQsIEJJVCg4KSwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1Mo bWJ1c19pc3BfY2xrLCAibWJ1cy1pc3AiLCBtYnVzX2h3cywKPiArCQkJICAweDgwNCwgQklUKDkp LCAwKTsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhtYnVzX2cyZF9jbGssICJtYnVzLWcy ZCIsIG1idXNfaHdzLAo+ICsJCQkgIDB4ODA0LCBCSVQoMTApLCAwKTsKPiArCj4gK3N0YXRpYyBT VU5YSV9DQ1VfR0FURV9IV1MoYnVzX2RyYW1fY2xrLCAiYnVzLWRyYW0iLCBhaGJfaHdzLAo+ICsJ CQkgIDB4ODBjLCBCSVQoMCksIENMS19JU19DUklUSUNBTCk7Cj4gKwo+ICsKPiArc3RhdGljIGNv bnN0IHN0cnVjdCBjbGtfcGFyZW50X2RhdGEgbW1jMF9tbWMxX3BhcmVudHNbXSA9IHsKPiArCXsg LmZ3X25hbWUgPSAiaG9zYyIgfSwKPiArCXsgLmh3ID0gJnBsbF9wZXJpcGhfNDAwTV9jbGsuaHcs IH0sCj4gKwl7IC5odyA9ICZwbGxfcGVyaXBoXzMwME1fY2xrLmh3LCB9LAo+ICt9OwoKSnVzdCBt bWNfcGFyZW50cy4KCj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfREFUQV9XSVRIX01VWF9HQVRFKG1t YzBfY2xrLCAibW1jMCIsIG1tYzBfbW1jMV9wYXJlbnRzLCAweDgzMCwKPiArCQkJCSAgICAgICAw LCA0LAkvKiBNICovCj4gKwkJCQkgICAgICAgOCwgMiwJLyogUCAqLwo+ICsJCQkJICAgICAgIDI0 LCAzLAkvKiBtdXggKi8KPiArCQkJCSAgICAgICBCSVQoMzEpLAkvKiBnYXRlICovCj4gKwkJCQkg ICAgICAgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX01QX0RBVEFfV0lUSF9NVVhfR0FURSht bWMxX2NsaywgIm1tYzEiLCBtbWMwX21tYzFfcGFyZW50cywgMHg4MzQsCj4gKwkJCQkgICAgICAg MCwgNCwJLyogTSAqLwo+ICsJCQkJICAgICAgIDgsIDIsCS8qIFAgKi8KPiArCQkJCSAgICAgICAy NCwgMywJLyogbXV4ICovCj4gKwkJCQkgICAgICAgQklUKDMxKSwJLyogZ2F0ZSAqLwo+ICsJCQkJ ICAgICAgIDApOwo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfcGFyZW50X2RhdGEgbW1j Ml9wYXJlbnRzW10gPSB7Cj4gKwl7IC5md19uYW1lID0gImhvc2MiIH0sCj4gKwl7IC5odyA9ICZw bGxfcGVyaXBoXzYwME1fY2xrLmh3LCB9LAo+ICsJeyAuaHcgPSAmcGxsX3BlcmlwaF80MDBNX2Ns ay5odywgfSwKPiArfTsKPiArc3RhdGljIFNVTlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYX0dBVEUo bW1jMl9jbGssICJtbWMyIiwgbW1jMl9wYXJlbnRzLCAweDgzOCwKPiArCQkJCSAgICAgICAwLCA0 LAkvKiBNICovCj4gKwkJCQkgICAgICAgOCwgMiwJLyogUCAqLwo+ICsJCQkJICAgICAgIDI0LCAz LAkvKiBtdXggKi8KPiArCQkJCSAgICAgICBCSVQoMzEpLAkvKiBnYXRlICovCj4gKwkJCQkgICAg ICAgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19tbWMwX2NsaywgImJ1 cy1tbWMwIiwgYWhiX2h3cywKPiArCQkJICAweDg0YywgQklUKDApLCAwKTsKPiArc3RhdGljIFNV TlhJX0NDVV9HQVRFX0hXUyhidXNfbW1jMV9jbGssICJidXMtbW1jMSIsIGFoYl9od3MsCj4gKwkJ CSAgMHg4NGMsIEJJVCgxKSwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX21t YzJfY2xrLCAiYnVzLW1tYzIiLCBhaGJfaHdzLAo+ICsJCQkgIDB4ODRjLCBCSVQoMiksIDApOwo+ ICsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfdWFydDBfY2xrLCAiYnVzLXVhcnQw IiwgYXBiMV9od3MsCj4gKwkJCSAgMHg5MGMsIEJJVCgwKSwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9D Q1VfR0FURV9IV1MoYnVzX3VhcnQxX2NsaywgImJ1cy11YXJ0MSIsIGFwYjFfaHdzLAo+ICsJCQkg IDB4OTBjLCBCSVQoMSksIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c191YXJ0 Ml9jbGssICJidXMtdWFydDIiLCBhcGIxX2h3cywKPiArCQkJICAweDkwYywgQklUKDIpLCAwKTsK PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfdWFydDNfY2xrLCAiYnVzLXVhcnQzIiwg YXBiMV9od3MsCj4gKwkJCSAgMHg5MGMsIEJJVCgzKSwgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElf Q0NVX0dBVEVfSFdTKGJ1c19pMmMwX2NsaywgImJ1cy1pMmMwIiwgYXBiMV9od3MsCj4gKwkJCSAg MHg5MWMsIEJJVCgwKSwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2kyYzFf Y2xrLCAiYnVzLWkyYzEiLCBhcGIxX2h3cywKPiArCQkJICAweDkxYywgQklUKDEpLCAwKTsKPiAr c3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfaTJjMl9jbGssICJidXMtaTJjMiIsIGFwYjFf aHdzLAo+ICsJCQkgIDB4OTFjLCBCSVQoMiksIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVf SFdTKGJ1c19pMmMzX2NsaywgImJ1cy1pMmMzIiwgYXBiMV9od3MsCj4gKwkJCSAgMHg5MWMsIEJJ VCgzKSwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2kyYzRfY2xrLCAiYnVz LWkyYzQiLCBhcGIxX2h3cywKPiArCQkJICAweDkxYywgQklUKDQpLCAwKTsKPiArCj4gK3N0YXRp YyBjb25zdCBzdHJ1Y3QgY2xrX3BhcmVudF9kYXRhIHNwaV9wYXJlbnRzW10gPSB7Cj4gKwl7IC5m d19uYW1lID0gImhvc2MiIH0sCj4gKwl7IC5odyA9ICZwbGxfcGVyaXBoXzMwME1fY2xrLmh3LCB9 LAo+ICsJeyAuaHcgPSAmcGxsX3BlcmlwaF8yMDBNX2Nsay5odywgfSwKPiArfTsKPiArCj4gK3N0 YXRpYyBTVU5YSV9DQ1VfTVBfREFUQV9XSVRIX01VWF9HQVRFKHNwaTBfY2xrLCAic3BpMCIsIHNw aV9wYXJlbnRzLCAweDk0MCwKPiArCQkJCSAgICAgICAwLCA0LAkvKiBNICovCj4gKwkJCQkgICAg ICAgOCwgMiwJLyogUCAqLwo+ICsJCQkJICAgICAgIDI0LCAzLAkvKiBtdXggKi8KPiArCQkJCSAg ICAgICBCSVQoMzEpLAkvKiBnYXRlICovCj4gKwkJCQkgICAgICAgMCk7Cj4gKwo+ICtzdGF0aWMg U1VOWElfQ0NVX01QX0RBVEFfV0lUSF9NVVhfR0FURShzcGkxX2NsaywgInNwaTEiLCBzcGlfcGFy ZW50cywgMHg5NDQsCj4gKwkJCQkgICAgICAgMCwgNCwJLyogTSAqLwo+ICsJCQkJICAgICAgIDgs IDIsCS8qIFAgKi8KPiArCQkJCSAgICAgICAyNCwgMywJLyogbXV4ICovCj4gKwkJCQkgICAgICAg QklUKDMxKSwJLyogZ2F0ZSAqLwo+ICsJCQkJICAgICAgIDApOwo+ICsKPiArc3RhdGljIFNVTlhJ X0NDVV9NUF9EQVRBX1dJVEhfTVVYX0dBVEUoc3BpMl9jbGssICJzcGkyIiwgc3BpX3BhcmVudHMs IDB4OTQ4LAo+ICsJCQkJICAgICAgIDAsIDQsCS8qIE0gKi8KPiArCQkJCSAgICAgICA4LCAyLAkv KiBQICovCj4gKwkJCQkgICAgICAgMjQsIDMsCS8qIG11eCAqLwo+ICsJCQkJICAgICAgIEJJVCgz MSksCS8qIGdhdGUgKi8KPiArCQkJCSAgICAgICAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1Vf TVBfREFUQV9XSVRIX01VWF9HQVRFKHNwaTNfY2xrLCAic3BpMyIsIHNwaV9wYXJlbnRzLCAweDk0 YywKPiArCQkJCSAgICAgICAwLCA0LAkvKiBNICovCj4gKwkJCQkgICAgICAgOCwgMiwJLyogUCAq Lwo+ICsJCQkJICAgICAgIDI0LCAzLAkvKiBtdXggKi8KPiArCQkJCSAgICAgICBCSVQoMzEpLAkv KiBnYXRlICovCj4gKwkJCQkgICAgICAgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVf SFdTKGJ1c19zcGkwX2NsaywgImJ1cy1zcGkwIiwgYWhiX2h3cywKPiArCQkJICAweDk2YywgQklU KDApLCAwKTsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfc3BpMV9jbGssICJidXMt c3BpMSIsIGFoYl9od3MsCj4gKwkJCSAgMHg5NmMsIEJJVCgxKSwgMCk7Cj4gK3N0YXRpYyBTVU5Y SV9DQ1VfR0FURV9IV1MoYnVzX3NwaTJfY2xrLCAiYnVzLXNwaTIiLCBhaGJfaHdzLAo+ICsJCQkg IDB4OTZjLCBCSVQoMiksIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19zcGkz X2NsaywgImJ1cy1zcGkzIiwgYWhiX2h3cywKPiArCQkJICAweDk2YywgQklUKDMpLCAwKTsKPiAr Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19wYXJlbnRfZGF0YSBzcGlmX3BhcmVudHNb XSA9IHsKPiArCXsgLmZ3X25hbWUgPSAiaG9zYyIgfSwKPiArCXsgLmh3ID0gJnBsbF9wZXJpcGhf NDAwTV9jbGsuaHcsIH0sCj4gKwl7IC5odyA9ICZwbGxfcGVyaXBoXzMwME1fY2xrLmh3LCB9LAo+ ICt9Owo+ICsKPiArc3RhdGljIFNVTlhJX0NDVV9NX0RBVEFfV0lUSF9NVVhfR0FURShzcGlmX2Ns aywgInNwaWYiLCBzcGlmX3BhcmVudHMsIDB4MDk1MCwKPiArCQkJCSAgICAgIDAsIDQsCS8qIE0g Ki8KPiArCQkJCSAgICAgIDI0LCAzLAkvKiBtdXggKi8KPiArCQkJCSAgICAgIEJJVCgzMSksCS8q IGdhdGUgKi8KPiArCQkJCSAgICAgIENMS19TRVRfUkFURV9QQVJFTlQpOwoKVGhpcyBpcyBNUCBj bG9jaywgUCBiZWluZyBhdCA5OjguCgo+ICsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhi dXNfc3BpZl9jbGssICJidXMtc3BpZiIsIGFoYl9od3MsCj4gKwkJCSAgMHgwOTZjLCBCSVQoNCks IDApOwo+ICsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3ICpwbGxfcGVyaXBoXzE1 ME1faHdzW10gPSB7ICZwbGxfcGVyaXBoXzE1ME1fY2xrLmh3IH07Cj4gK3N0YXRpYyBTVU5YSV9D Q1VfR0FURV9IV1NfV0lUSF9QUkVESVYoZW1hY18yNU1fY2xrLCAiZW1hYy0yNU0iLCBwbGxfcGVy aXBoXzE1ME1faHdzLAo+ICsJCQkJICAgICAgMHg5NzAsIEJJVCgzMSkgfCBCSVQoMzApLCA2LCAw KTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2VtYWNfY2xrLCAiYnVzLWVt YWMiLCBhaGJfaHdzLAo+ICsJCQkgIDB4OTdjLCBCSVQoMCksIDApOwo+ICsKPiArc3RhdGljIFNV TlhJX0NDVV9HQVRFX0hXUyhidXNfZ3BhZGNfY2xrLCAiYnVzLWdwYWRjIiwgYXBiMF9od3MsCj4g KwkJCSAgMHg5ZWMsIEJJVCgwKSwgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdT KGJ1c190aHNfY2xrLCAiYnVzLXRocyIsIGFoYl9od3MsCj4gKwkJCSAgMHg5ZmMsIEJJVCgwKSwg MCk7Cj4gKwo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcgKmF1ZGlvX3BhcmVudHNb XSA9IHsKPiArCSZwbGxfYXVkaW9fMXhfY2xrLmNvbW1vbi5odywKPiArCSZwbGxfYXVkaW9fNHhf Y2xrLmNvbW1vbi5odywKPiArfTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9IV19XSVRIX01V WF9HQVRFKGkyczBfY2xrLCAiaTJzMCIsIGF1ZGlvX3BhcmVudHMsIDB4YTEwLAo+ICsJCQkJICAg IDAsIDQsCS8qIE0gKi8KPiArCQkJCSAgICAyNCwgMSwJLyogbXV4ICovCj4gKwkJCQkgICAgQklU KDMxKSwJLyogZ2F0ZSAqLwo+ICsJCQkJICAgIENMS19TRVRfUkFURV9QQVJFTlQpOwo+ICsKPiAr c3RhdGljIFNVTlhJX0NDVV9NX0hXX1dJVEhfTVVYX0dBVEUoaTJzMV9jbGssICJpMnMxIiwgYXVk aW9fcGFyZW50cywgMHhhMTQsCj4gKwkJCQkgICAgMCwgNCwJLyogTSAqLwo+ICsJCQkJICAgIDI0 LCAxLAkvKiBtdXggKi8KPiArCQkJCSAgICBCSVQoMzEpLAkvKiBnYXRlICovCj4gKwkJCQkgICAg Q0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1 c19pMnMwX2NsaywgImJ1cy1pMnMwIiwgYWhiX2h3cywKPiArCQkJICAweGEyMCwgQklUKDApLCAw KTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2kyczFfY2xrLCAiYnVzLWky czEiLCBhaGJfaHdzLAo+ICsJCQkgIDB4YTIwLCBCSVQoMSksIDApOwo+ICsKPiArc3RhdGljIFNV TlhJX0NDVV9NX0hXX1dJVEhfTVVYX0dBVEUoZG1pY19jbGssICJkbWljIiwgYXVkaW9fcGFyZW50 cywgMHhhNDAsCj4gKwkJCQkgICAgMCwgNCwJLyogTSAqLwo+ICsJCQkJICAgIDI0LCAxLAkvKiBt dXggKi8KPiArCQkJCSAgICBCSVQoMzEpLAkvKiBnYXRlICovCj4gKwkJCQkgICAgQ0xLX1NFVF9S QVRFX1BBUkVOVCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19kbWljX2Ns aywgImJ1cy1kbWljIiwgYWhiX2h3cywKPiArCQkJICAweGE0YywgQklUKDApLCAwKTsKPiArCj4g K3N0YXRpYyBTVU5YSV9DQ1VfTV9IV19XSVRIX01VWF9HQVRFKGF1ZGlvX2NvZGVjX2RhY19jbGss ICJhdWRpby1jb2RlYy1kYWMiLCAKPiArCQkJCSAgICBhdWRpb19wYXJlbnRzLCAweGE1MCwKPiAr CQkJCSAgICAwLCA0LAkvKiBNICovCj4gKwkJCQkgICAgMjQsIDEsCS8qIG11eCAqLwo+ICsJCQkJ ICAgIEJJVCgzMSksCS8qIGdhdGUgKi8KPiArCQkJCSAgICBDTEtfU0VUX1JBVEVfUEFSRU5UKTsK PiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9IV19XSVRIX01VWF9HQVRFKGF1ZGlvX2NvZGVjX2Fk Y19jbGssICJhdWRpby1jb2RlYy1hZGMiLCAKPiArCQkJCSAgICBhdWRpb19wYXJlbnRzLCAweGE1 NCwKPiArCQkJCSAgICAwLCA0LAkvKiBNICovCj4gKwkJCQkgICAgMjQsIDEsCS8qIG11eCAqLwo+ ICsJCQkJICAgIEJJVCgzMSksCS8qIGdhdGUgKi8KPiArCQkJCSAgICBDTEtfU0VUX1JBVEVfUEFS RU5UKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2F1ZGlvX2NvZGVjX2Ns aywgImJ1cy1hdWRpby1jb2RlYyIsIGFwYjBfaHdzLAo+ICsJCQkgIDB4YTVjLCBCSVQoMCksIDAp Owo+ICsKPiArLyoKPiArICogVGhlcmUgYXJlIE9IQ0kgMTJNIGNsb2NrIHNvdXJjZSBzZWxlY3Rp b24gYml0cyBmb3IgdGhlIFVTQiAyLjAgcG9ydC4KPiArICogV2Ugd2lsbCBmb3JjZSB0aGVtIHRv IDAgKDEyTSBkaXZpZGVkIGZyb20gNDhNKS4KPiArICovCj4gK3N0YXRpYyBDTEtfRklYRURfRkFD VE9SX0ZXX05BTUUob3NjMTJNX2NsaywgIm9zYzEyTSIsICJob3NjIiwgMiwgMSwgMCk7Cj4gKwo+ ICsjZGVmaW5lIFNVTjhJX1Y4NTNfVVNCX0NMS19SRUcJCTB4YTcwCj4gKwo+ICtzdGF0aWMgU1VO WElfQ0NVX0dBVEUodXNiX29oY2lfY2xrLCAidXNiIiwgIm9zYzEyTSIsIDB4MGE3MCwgQklUKDMx KSwgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19vaGNpX2NsaywgImJ1 cy1vaGNpIiwgYWhiX2h3cywgMHhhOGMsIEJJVCgwKSwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1Vf R0FURV9IV1MoYnVzX2VoY2lfY2xrLCAiYnVzLWVoY2kiLCBhaGJfaHdzLCAweGE4YywgQklUKDQp LCAwKTsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfb3RnX2NsaywgImJ1cy1vdGci LCBhaGJfaHdzLCAweGE4YywgQklUKDgpLCAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FU RV9IV1MoYnVzX2Rwc3NfdG9wX2NsaywgImJ1cy1kcHNzLXRvcCIsIGFoYl9od3MsCj4gKwkJCSAg MHhhYmMsIEJJVCgwKSwgMCk7Cj4gKwo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfcGFy ZW50X2RhdGEgbWlwaV9kc2lfcGFyZW50c1tdID0gewo+ICsJeyAuZndfbmFtZSA9ICJob3NjIiB9 LAo+ICsJeyAuaHcgPSAmcGxsX3BlcmlwaF8yMDBNX2Nsay5odyB9LAo+ICsJeyAuaHcgPSAmcGxs X3BlcmlwaF8xNTBNX2Nsay5odyB9LAo+ICt9Owo+ICtzdGF0aWMgU1VOWElfQ0NVX01fREFUQV9X SVRIX01VWF9HQVRFKG1pcGlfZHNpX2NsaywgIm1pcGktZHNpIiwgbWlwaV9kc2lfcGFyZW50cywg Cj4gKwkJCQkgICAgICAweGIyNCwKPiArCQkJCSAgICAgIDAsIDQsCS8qIE0gKi8KPiArCQkJCSAg ICAgIDI0LCAzLAkvKiBtdXggKi8KPiArCQkJCSAgICAgIEJJVCgzMSksCS8qIGdhdGUgKi8KPiAr CQkJCSAgICAgIENMS19TRVRfUkFURV9QQVJFTlQpOwoKQ0xLX1NFVF9SQVRFX1BBUkVOVCBkb2Vz bid0IGRvIGFueXRoaW5nIGZvciBjb25zdGFudCBjbG9ja3MuCgpCZXN0IHJlZ2FyZHMsCkplcm5l agoKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX21pcGlfZHNpX2NsaywgImJ1 cy1taXBpLWRzaSIsIGFoYl9od3MsCj4gKwkJCSAgMHhiNGMsIEJJVCgwKSwgMCk7Cj4gKwo+ICsK PiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcgKnRjb25fbGNkX3BhcmVudHNbXSA9IHsKPiAr CSZwbGxfdmlkZW9fNHhfY2xrLmNvbW1vbi5odywKPiArCSZwbGxfcGVyaXBoXzJ4X2Nsay5jb21t b24uaHcsCj4gKwkmcGxsX2NzaV80eF9jbGsuY29tbW9uLmh3LAo+ICt9Owo+ICtzdGF0aWMgU1VO WElfQ0NVX01QX0hXX1dJVEhfTVVYX0dBVEUodGNvbl9sY2RfY2xrLCAidGNvbi1sY2QiLCB0Y29u X2xjZF9wYXJlbnRzLCAKPiArCQkJCSAgICAgMHhiNjAsCj4gKwkJCQkgICAgIDAsIDQsCS8qIE0g Ki8KPiArCQkJCSAgICAgOCwgMiwJLyogUCAqLwo+ICsJCQkJICAgICAyNCwgMywJLyogbXV4ICov Cj4gKwkJCQkgICAgIEJJVCgzMSksCS8qIGdhdGUgKi8KPiArCQkJCSAgICAgQ0xLX1NFVF9SQVRF X1BBUkVOVCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c190Y29uX2xjZF9j bGssICJidXMtdGNvbi1sY2QiLCBhaGJfaHdzLAo+ICsJCQkgIDB4YjdjLCBCSVQoMCksIDApOwo+ ICsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3ICpjc2lfdG9wX3BhcmVudHNbXSA9 IHsKPiArCSZwbGxfcGVyaXBoXzMwME1fY2xrLmh3LAo+ICsJJnBsbF9wZXJpcGhfNDAwTV9jbGsu aHcsCj4gKwkmcGxsX3ZpZGVvXzR4X2Nsay5jb21tb24uaHcsCj4gKwkmcGxsX2NzaV80eF9jbGsu Y29tbW9uLmh3LAo+ICt9Owo+ICtzdGF0aWMgU1VOWElfQ0NVX01fSFdfV0lUSF9NVVhfR0FURShj c2lfdG9wX2NsaywgImNzaS10b3AiLCBjc2lfdG9wX3BhcmVudHMsIDB4YzA0LAo+ICsJCQkJICAg IDAsIDUsCS8qIE0gKi8KPiArCQkJCSAgICAyNCwgMywJLyogbXV4ICovCj4gKwkJCQkgICAgQklU KDMxKSwJLyogZ2F0ZSAqLwo+ICsJCQkJICAgIDApOwo+ICsKPiArCj4gK3N0YXRpYyBjb25zdCBz dHJ1Y3QgY2xrX3BhcmVudF9kYXRhIGNzaV9tY2xrX3BhcmVudHNbXSA9IHsKPiArCXsgLmZ3X25h bWUgPSAiaG9zYyIgfSwKPiArCXsgLmh3ID0gJnBsbF9jc2lfNHhfY2xrLmNvbW1vbi5odyB9LAo+ ICsJeyAuaHcgPSAmcGxsX3ZpZGVvXzR4X2Nsay5jb21tb24uaHcgfSwKPiArCXsgLmh3ID0gJnBs bF9wZXJpcGhfMnhfY2xrLmNvbW1vbi5odyB9LAo+ICt9Owo+ICtzdGF0aWMgU1VOWElfQ0NVX01f REFUQV9XSVRIX01VWF9HQVRFKGNzaV9tY2xrMF9jbGssICJjc2ktbWNsazAiLCBjc2lfbWNsa19w YXJlbnRzLCAKPiArCQkJCSAgICAgIDB4YzA4LAo+ICsJCQkJICAgICAgMCwgNSwJLyogTSAqLwo+ ICsJCQkJICAgICAgMjQsIDMsCS8qIG11eCAqLwo+ICsJCQkJICAgICAgQklUKDMxKSwJLyogZ2F0 ZSAqLwo+ICsJCQkJICAgICAgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX01fREFUQV9XSVRI X01VWF9HQVRFKGNzaV9tY2xrMV9jbGssICJjc2ktbWNsazEiLCBjc2lfbWNsa19wYXJlbnRzLCAK PiArCQkJCSAgICAgIDB4YzBjLAo+ICsJCQkJICAgICAgMCwgNSwJLyogTSAqLwo+ICsJCQkJICAg ICAgMjQsIDMsCS8qIG11eCAqLwo+ICsJCQkJICAgICAgQklUKDMxKSwJLyogZ2F0ZSAqLwo+ICsJ CQkJICAgICAgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX01fREFUQV9XSVRIX01VWF9HQVRF KGNzaV9tY2xrMl9jbGssICJjc2ktbWNsazIiLCBjc2lfbWNsa19wYXJlbnRzLCAKPiArCQkJCSAg ICAgIDB4YzEwLAo+ICsJCQkJICAgICAgMCwgNSwJLyogTSAqLwo+ICsJCQkJICAgICAgMjQsIDMs CS8qIG11eCAqLwo+ICsJCQkJICAgICAgQklUKDMxKSwJLyogZ2F0ZSAqLwo+ICsJCQkJICAgICAg MCk7CgpBbGwgQ1NJIG1jbGtzIHNob3VsZCBiZSBNUCB0eXBlLgoKPiArCj4gK3N0YXRpYyBTVU5Y SV9DQ1VfR0FURV9IV1MoYnVzX2NzaV9jbGssICJidXMtY3NpIiwgYWhiX2h3cywKPiArCQkJICAw eGMyYywgQklUKDApLCAwKTsKPiArCj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1 c193aWVnYW5kX2NsaywgImJ1cy13aWVnYW5kIiwgYWhiX2h3cywKPiArCQkJICAweGM3YywgQklU KDApLCAwKTsKPiArCj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19wYXJlbnRfZGF0YSBy aXNjdl9wYXJlbnRzW10gPSB7Cj4gKwl7IC5md19uYW1lID0gImhvc2MiIH0sCj4gKwl7IC5md19u YW1lID0gImxvc2MiIH0sCj4gKwl7IC5md19uYW1lID0gImlvc2MiIH0sCj4gKwl7IC5odyA9ICZw bGxfcGVyaXBoXzYwME1fY2xrLmh3IH0sCj4gKwl7IC5odyA9ICZwbGxfcGVyaXBoXzQ4ME1fY2xr LmNvbW1vbi5odyB9LAo+ICsJeyAuaHcgPSAmcGxsX2NwdV9jbGsuY29tbW9uLmh3IH0sCj4gK307 Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9EQVRBX1dJVEhfTVVYKHJpc2N2X2NsaywgInJpc2N2LWNw dSIsIHJpc2N2X3BhcmVudHMsIDB4ZDAwLAo+ICsJCQkJIDAsIDUsCS8qIE0gKi8KPiArCQkJCSAy NCwgMywJLyogbXV4ICovCj4gKwkJCQkgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4gKwo+ICsvKiBU aGUgcmlzY3YtYXhpIGNsayBtdXN0IGJlIGRpdmlkZWQgYnkgYXQgbGVhc3QgMi4gKi8KPiArc3Rh dGljIHN0cnVjdCBjbGtfZGl2X3RhYmxlIHJpc2N2X2F4aV90YWJsZVtdID0gewo+ICsJeyAudmFs ID0gMSwgLmRpdiA9IDIgfSwKPiArCXsgLnZhbCA9IDIsIC5kaXYgPSAzIH0sCj4gKwl7IC52YWwg PSAzLCAuZGl2ID0gNCB9LAo+ICsJeyAvKiBTZW50aW5lbCAqLyB9Cj4gK307Cj4gK3N0YXRpYyBT VU5YSV9DQ1VfRElWX1RBQkxFX0hXKHJpc2N2X2F4aV9jbGssICJyaXNjdi1heGkiLCAmcmlzY3Zf Y2xrLmNvbW1vbi5odywKPiArCQkJICAgICAgMHhkMDAsIDgsIDIsIHJpc2N2X2F4aV90YWJsZSwg MCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTX1dJVEhfS0VZKHJpc2N2X2NvcmVf Z2F0ZSwgInJpc2N2LWNvcmUtZ2F0ZSIsIGFoYl9od3MsCj4gKwkJCQkgICAweGQwNCwgQklUKDAp LCAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MocmlzY3ZfY2ZnX2dhdGUsICJy aXNjdi1jZmctZ2F0ZSIsIGFoYl9od3MsCj4gKwkJCSAgMHhkMGMsIEJJVCgwKSwgMCk7Cj4gKwo+ ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcgKnBsbF9wZXJpcGhfMTYwTV9od3NbXSA9 IHsKPiArCSZwbGxfcGVyaXBoXzE2ME1fY2xrLmh3LAo+ICt9Owo+ICsKPiArc3RhdGljIFNVTlhJ X0NDVV9HQVRFX0RBVEEoZmFub3V0XzI0TV9jbGssICJmYW5vdXQtMjRNIiwgb3NjMjRNLAo+ICsJ CQkgICAweGYzMCwgQklUKDApLCAwKTsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0RBVEFfV0lU SF9QUkVESVYoZmFub3V0XzEyTV9jbGssICJmYW5vdXQtMTJNIiwgb3NjMjRNLAo+ICsJCQkJICAg ICAgIDB4ZjMwLCBCSVQoMSksIDIsIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTX1dJ VEhfUFJFRElWKGZhbm91dF8xNk1fY2xrLCAiZmFub3V0LTE2TSIsIHBsbF9wZXJpcGhfMTYwTV9o d3MsCj4gKwkJCQkgICAgICAweGYzMCwgQklUKDIpLCAxMCwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9D Q1VfR0FURV9IV1NfV0lUSF9QUkVESVYoZmFub3V0XzI1TV9jbGssICJmYW5vdXQtMjVNIiwgcGxs X3BlcmlwaF8xNTBNX2h3cywKPiArCQkJCSAgICAgIDB4ZjMwLCBCSVQoMyksIDYsIDApOwo+ICsK PiArCj4gKy8qIFRoaXMgY2xvY2sgaGFzIGEgc2Vjb25kIGRpdmlkZXIgdGhhdCBpcyBub3QgbW9k ZWxsZWQgYW5kIGZvcmNlZCB0byAwLiAqLwo+ICsjZGVmaW5lIFNVTjhJX1Y4NTNfRkFOT1VUXzI3 TV9SRUcJMHhmMzQKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcgKmZhbm91dF8yN01fcGFy ZW50c1tdID0gewo+ICsJJnBsbF92aWRlb18xeF9jbGsuaHcsCj4gKwkmcGxsX2NzaV9jbGsuaHcs Cj4gKwkmcGxsX3BlcmlwaF8zMDBNX2Nsay5odywKPiArfTsKPiArc3RhdGljIFNVTlhJX0NDVV9N X0hXX1dJVEhfTVVYX0dBVEUoZmFub3V0XzI3TV9jbGssICJmYW5vdXQtMjdNIiwgCj4gKwkJCQkg ICAgZmFub3V0XzI3TV9wYXJlbnRzLCAweGYzNCwKPiArCQkJCSAgICAwLCA1LAkvKiBNICovCj4g KwkJCQkgICAgMjQsIDIsCS8qIG11eCAqLwo+ICsJCQkJICAgIEJJVCgzMSksCS8qIGdhdGUgKi8K PiArCQkJCSAgICAwKTsKPiArc3RhdGljIFNVTlhJX0NDVV9NX0hXU19XSVRIX0dBVEUoZmFub3V0 X3BjbGtfY2xrLCAiZmFub3V0LXBjbGsiLCBhcGIwX2h3cywgMHhmMzgsCj4gKwkJCQkgMCwgNSwJ CS8qIE0gKi8KPiArCQkJCSBCSVQoMzEpLAkvKiBnYXRlICovCj4gKwkJCQkgMCk7Cj4gKwo+ICtz dGF0aWMgY29uc3Qgc3RydWN0IGNsa19wYXJlbnRfZGF0YSBmYW5vdXRfcGFyZW50c1tdID0gewo+ ICsJeyAuZndfbmFtZSA9ICJsb3NjIiB9LAo+ICsJeyAuaHcgPSAmZmFub3V0XzEyTV9jbGsuY29t bW9uLmh3IH0sCj4gKwl7IC5odyA9ICZmYW5vdXRfMTZNX2Nsay5jb21tb24uaHcgfSwKPiArCXsg Lmh3ID0gJmZhbm91dF8yNE1fY2xrLmNvbW1vbi5odyB9LAo+ICsJeyAuaHcgPSAmZmFub3V0XzI1 TV9jbGsuY29tbW9uLmh3IH0sCj4gKwl7IC5odyA9ICZmYW5vdXRfMjdNX2Nsay5jb21tb24uaHcg fSwKPiArCXsgLmh3ID0gJmZhbm91dF9wY2xrX2Nsay5jb21tb24uaHcgfSwKPiArfTsKPiArCj4g K3N0YXRpYyBTVU5YSV9DQ1VfTVVYX0RBVEFfV0lUSF9HQVRFKGZhbm91dDBfY2xrLCAiZmFub3V0 MCIsIGZhbm91dF9wYXJlbnRzLCAweGYzYywKPiArCQkJCSAgICAwLCAzLAkvKiBtdXggKi8KPiAr CQkJCSAgICBCSVQoMjEpLAkvKiBnYXRlICovCj4gKwkJCQkgICAgMCk7Cj4gK3N0YXRpYyBTVU5Y SV9DQ1VfTVVYX0RBVEFfV0lUSF9HQVRFKGZhbm91dDFfY2xrLCAiZmFub3V0MSIsIGZhbm91dF9w YXJlbnRzLCAweGYzYywKPiArCQkJCSAgICAzLCAzLAkvKiBtdXggKi8KPiArCQkJCSAgICBCSVQo MjIpLAkvKiBnYXRlICovCj4gKwkJCQkgICAgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVVYX0RB VEFfV0lUSF9HQVRFKGZhbm91dDJfY2xrLCAiZmFub3V0MiIsIGZhbm91dF9wYXJlbnRzLCAweGYz YywKPiArCQkJCSAgICA2LCAzLAkvKiBtdXggKi8KPiArCQkJCSAgICBCSVQoMjMpLAkvKiBnYXRl ICovCj4gKwkJCQkgICAgMCk7Cj4gKwo+ICsKPiArc3RhdGljIHN0cnVjdCBjY3VfY29tbW9uICpz dW44aV92ODUzX2NjdV9jbGtzW10gPSB7Cj4gKwkmcGxsX2NwdV9jbGsuY29tbW9uLAo+ICsJJnBs bF9kZHJfY2xrLmNvbW1vbiwKPiArCSZwbGxfcGVyaXBoXzR4X2Nsay5jb21tb24sCj4gKwkmcGxs X3BlcmlwaF8yeF9jbGsuY29tbW9uLAo+ICsJJnBsbF9wZXJpcGhfODAwTV9jbGsuY29tbW9uLAo+ ICsJJnBsbF9wZXJpcGhfNDgwTV9jbGsuY29tbW9uLAo+ICsJJnBsbF92aWRlb180eF9jbGsuY29t bW9uLAo+ICsJJnBsbF9jc2lfNHhfY2xrLmNvbW1vbiwKPiArCSZwbGxfYXVkaW9fZGl2Ml9jbGsu Y29tbW9uLAo+ICsJJnBsbF9hdWRpb19kaXY1X2Nsay5jb21tb24sCj4gKwkmcGxsX2F1ZGlvXzR4 X2Nsay5jb21tb24sCj4gKwkmcGxsX2F1ZGlvXzF4X2Nsay5jb21tb24sCj4gKwkmcGxsX25wdV80 eF9jbGsuY29tbW9uLAo+ICsJJmNwdV9jbGsuY29tbW9uLAo+ICsJJmNwdV9heGlfY2xrLmNvbW1v biwKPiArCSZjcHVfYXBiX2Nsay5jb21tb24sCj4gKwkmYWhiX2Nsay5jb21tb24sCj4gKwkmYXBi MF9jbGsuY29tbW9uLAo+ICsJJmFwYjFfY2xrLmNvbW1vbiwKPiArCSZkZV9jbGsuY29tbW9uLAo+ ICsJJmJ1c19kZV9jbGsuY29tbW9uLAo+ICsJJmcyZF9jbGsuY29tbW9uLAo+ICsJJmJ1c19nMmRf Y2xrLmNvbW1vbiwKPiArCSZjZV9jbGsuY29tbW9uLAo+ICsJJmJ1c19jZV9jbGsuY29tbW9uLAo+ ICsJJnZlX2Nsay5jb21tb24sCj4gKwkmYnVzX3ZlX2Nsay5jb21tb24sCj4gKwkmbnB1X2Nsay5j b21tb24sCj4gKwkmYnVzX25wdV9jbGsuY29tbW9uLAo+ICsJJmJ1c19kbWFfY2xrLmNvbW1vbiwK PiArCSZidXNfbXNnYm94MF9jbGsuY29tbW9uLAo+ICsJJmJ1c19tc2dib3gxX2Nsay5jb21tb24s Cj4gKwkmYnVzX3NwaW5sb2NrX2Nsay5jb21tb24sCj4gKwkmYnVzX2hzdGltZXJfY2xrLmNvbW1v biwKPiArCSZhdnNfY2xrLmNvbW1vbiwKPiArCSZidXNfZGJnX2Nsay5jb21tb24sCj4gKwkmYnVz X3B3bV9jbGsuY29tbW9uLAo+ICsJJmJ1c19pb21tdV9jbGsuY29tbW9uLAo+ICsJJmRyYW1fY2xr LmNvbW1vbiwKPiArCSZtYnVzX2RtYV9jbGsuY29tbW9uLAo+ICsJJm1idXNfdmVfY2xrLmNvbW1v biwKPiArCSZtYnVzX2NlX2Nsay5jb21tb24sCj4gKwkmbWJ1c19jc2lfY2xrLmNvbW1vbiwKPiAr CSZtYnVzX2lzcF9jbGsuY29tbW9uLAo+ICsJJm1idXNfZzJkX2Nsay5jb21tb24sCj4gKwkmYnVz X2RyYW1fY2xrLmNvbW1vbiwKPiArCSZtbWMwX2Nsay5jb21tb24sCj4gKwkmbW1jMV9jbGsuY29t bW9uLAo+ICsJJm1tYzJfY2xrLmNvbW1vbiwKPiArCSZidXNfbW1jMF9jbGsuY29tbW9uLAo+ICsJ JmJ1c19tbWMxX2Nsay5jb21tb24sCj4gKwkmYnVzX21tYzJfY2xrLmNvbW1vbiwKPiArCSZidXNf dWFydDBfY2xrLmNvbW1vbiwKPiArCSZidXNfdWFydDFfY2xrLmNvbW1vbiwKPiArCSZidXNfdWFy dDJfY2xrLmNvbW1vbiwKPiArCSZidXNfdWFydDNfY2xrLmNvbW1vbiwKPiArCSZidXNfaTJjMF9j bGsuY29tbW9uLAo+ICsJJmJ1c19pMmMxX2Nsay5jb21tb24sCj4gKwkmYnVzX2kyYzJfY2xrLmNv bW1vbiwKPiArCSZidXNfaTJjM19jbGsuY29tbW9uLAo+ICsJJmJ1c19pMmM0X2Nsay5jb21tb24s Cj4gKwkmc3BpMF9jbGsuY29tbW9uLAo+ICsJJnNwaTFfY2xrLmNvbW1vbiwKPiArCSZzcGkyX2Ns ay5jb21tb24sCj4gKwkmc3BpM19jbGsuY29tbW9uLAo+ICsJJmJ1c19zcGkwX2Nsay5jb21tb24s Cj4gKwkmYnVzX3NwaTFfY2xrLmNvbW1vbiwKPiArCSZidXNfc3BpMl9jbGsuY29tbW9uLAo+ICsJ JmJ1c19zcGkzX2Nsay5jb21tb24sCj4gKwkmc3BpZl9jbGsuY29tbW9uLAo+ICsJJmJ1c19zcGlm X2Nsay5jb21tb24sCj4gKwkmZW1hY18yNU1fY2xrLmNvbW1vbiwKPiArCSZidXNfZW1hY19jbGsu Y29tbW9uLAo+ICsJJmJ1c19ncGFkY19jbGsuY29tbW9uLAo+ICsJJmJ1c190aHNfY2xrLmNvbW1v biwKPiArCSZ1c2Jfb2hjaV9jbGsuY29tbW9uLAo+ICsJJmJ1c19vaGNpX2Nsay5jb21tb24sCj4g KwkmYnVzX2VoY2lfY2xrLmNvbW1vbiwKPiArCSZidXNfb3RnX2Nsay5jb21tb24sCj4gKwkmaTJz MF9jbGsuY29tbW9uLAo+ICsJJmkyczFfY2xrLmNvbW1vbiwKPiArCSZidXNfaTJzMF9jbGsuY29t bW9uLAo+ICsJJmJ1c19pMnMxX2Nsay5jb21tb24sCj4gKwkmZG1pY19jbGsuY29tbW9uLAo+ICsJ JmJ1c19kbWljX2Nsay5jb21tb24sCj4gKwkmYXVkaW9fY29kZWNfZGFjX2Nsay5jb21tb24sCj4g KwkmYXVkaW9fY29kZWNfYWRjX2Nsay5jb21tb24sCj4gKwkmYnVzX2F1ZGlvX2NvZGVjX2Nsay5j b21tb24sCj4gKwkmYnVzX2Rwc3NfdG9wX2Nsay5jb21tb24sCj4gKwkmbWlwaV9kc2lfY2xrLmNv bW1vbiwKPiArCSZidXNfbWlwaV9kc2lfY2xrLmNvbW1vbiwKPiArCSZ0Y29uX2xjZF9jbGsuY29t bW9uLAo+ICsJJmJ1c190Y29uX2xjZF9jbGsuY29tbW9uLAo+ICsJJmNzaV90b3BfY2xrLmNvbW1v biwKPiArCSZjc2lfbWNsazBfY2xrLmNvbW1vbiwKPiArCSZjc2lfbWNsazFfY2xrLmNvbW1vbiwK PiArCSZjc2lfbWNsazJfY2xrLmNvbW1vbiwKPiArCSZidXNfY3NpX2Nsay5jb21tb24sCj4gKwkm YnVzX3dpZWdhbmRfY2xrLmNvbW1vbiwKPiArCSZyaXNjdl9jbGsuY29tbW9uLAo+ICsJJnJpc2N2 X2F4aV9jbGsuY29tbW9uLAo+ICsJJnJpc2N2X2NvcmVfZ2F0ZS5jb21tb24sCj4gKwkmcmlzY3Zf Y2ZnX2dhdGUuY29tbW9uLAo+ICsJJmZhbm91dF8yNE1fY2xrLmNvbW1vbiwKPiArCSZmYW5vdXRf MTJNX2Nsay5jb21tb24sCj4gKwkmZmFub3V0XzE2TV9jbGsuY29tbW9uLAo+ICsJJmZhbm91dF8y NU1fY2xrLmNvbW1vbiwKPiArCSZmYW5vdXRfMjdNX2Nsay5jb21tb24sCj4gKwkmZmFub3V0X3Bj bGtfY2xrLmNvbW1vbiwKPiArCSZmYW5vdXQwX2Nsay5jb21tb24sCj4gKwkmZmFub3V0MV9jbGsu Y29tbW9uLAo+ICsJJmZhbm91dDJfY2xrLmNvbW1vbiwKPiArfTsKPiArCj4gK3N0YXRpYyBzdHJ1 Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSBzdW44aV92ODUzX2h3X2Nsa3MgPSB7Cj4gKwkubnVtCT0g Q0xLX05VTUJFUiwKPiArCS5od3MJPSB7Cj4gKwkJW0NMS19PU0MxMk1dICAgICAgICAgICAgPSAm b3NjMTJNX2Nsay5odywKPiArCQlbQ0xLX1BMTF9DUFVdCQk9ICZwbGxfY3B1X2Nsay5jb21tb24u aHcsCj4gKwkJW0NMS19QTExfRERSXQkJPSAmcGxsX2Rkcl9jbGsuY29tbW9uLmh3LAo+ICsJCVtD TEtfUExMX1BFUklQSF80WF0JPSAmcGxsX3BlcmlwaF80eF9jbGsuY29tbW9uLmh3LAo+ICsJCVtD TEtfUExMX1BFUklQSF8yWF0JPSAmcGxsX3BlcmlwaF8yeF9jbGsuY29tbW9uLmh3LAo+ICsJCVtD TEtfUExMX1BFUklQSF84MDBNXQk9ICZwbGxfcGVyaXBoXzgwME1fY2xrLmNvbW1vbi5odywKPiAr CQlbQ0xLX1BMTF9QRVJJUEhfNDgwTV0JPSAmcGxsX3BlcmlwaF80ODBNX2Nsay5jb21tb24uaHcs Cj4gKwkJW0NMS19QTExfUEVSSVBIXzYwME1dCT0gJnBsbF9wZXJpcGhfNjAwTV9jbGsuaHcsCj4g KwkJW0NMS19QTExfUEVSSVBIXzQwME1dCT0gJnBsbF9wZXJpcGhfNDAwTV9jbGsuaHcsCj4gKwkJ W0NMS19QTExfUEVSSVBIXzMwME1dCT0gJnBsbF9wZXJpcGhfMzAwTV9jbGsuaHcsCj4gKwkJW0NM S19QTExfUEVSSVBIXzIwME1dCT0gJnBsbF9wZXJpcGhfMjAwTV9jbGsuaHcsCj4gKwkJW0NMS19Q TExfUEVSSVBIXzE2ME1dCT0gJnBsbF9wZXJpcGhfMTYwTV9jbGsuaHcsCj4gKwkJW0NMS19QTExf UEVSSVBIXzE1ME1dCT0gJnBsbF9wZXJpcGhfMTUwTV9jbGsuaHcsCj4gKwkJW0NMS19QTExfVklE RU9fNFhdCT0gJnBsbF92aWRlb180eF9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfUExMX1ZJREVP XzJYXQk9ICZwbGxfdmlkZW9fMnhfY2xrLmh3LAo+ICsJCVtDTEtfUExMX1ZJREVPXzFYXQk9ICZw bGxfdmlkZW9fMXhfY2xrLmh3LAo+ICsJCVtDTEtfUExMX0NTSV80WF0JPSAmcGxsX2NzaV80eF9j bGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfUExMX0FVRElPX0RJVjJdCT0gJnBsbF9hdWRpb19kaXYy X2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19QTExfQVVESU9fRElWNV0JPSAmcGxsX2F1ZGlvX2Rp djVfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX1BMTF9BVURJT180WF0JPSAmcGxsX2F1ZGlvXzR4 X2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19QTExfQVVESU9fMVhdCT0gJnBsbF9hdWRpb18xeF9j bGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfUExMX05QVV80WF0JPSAmcGxsX25wdV80eF9jbGsuY29t bW9uLmh3LAo+ICsJCVtDTEtfQ1BVXQkJPSAmY3B1X2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19D UFVfQVhJXQkJPSAmY3B1X2F4aV9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQ1BVX0FQQl0JCT0g JmNwdV9hcGJfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0FIQl0JCT0gJmFoYl9jbGsuY29tbW9u Lmh3LAo+ICsJCVtDTEtfQVBCMF0JCT0gJmFwYjBfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0FQ QjFdCQk9ICZhcGIxX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19NQlVTXQkJPSAmbWJ1c19jbGsu aHcsCj4gKwkJW0NMS19ERV0JCT0gJmRlX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfREVd CQk9ICZidXNfZGVfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0cyRF0JCT0gJmcyZF9jbGsuY29t bW9uLmh3LAo+ICsJCVtDTEtfQlVTX0cyRF0JCT0gJmJ1c19nMmRfY2xrLmNvbW1vbi5odywKPiAr CQlbQ0xLX0NFXQkJPSAmY2VfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19DRV0JCT0gJmJ1 c19jZV9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfVkVdCQk9ICZ2ZV9jbGsuY29tbW9uLmh3LAo+ ICsJCVtDTEtfQlVTX1ZFXQkJPSAmYnVzX3ZlX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19OUFVd CQk9ICZucHVfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19OUFVdCQk9ICZidXNfbnB1X2Ns ay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfRE1BXQkJPSAmYnVzX2RtYV9jbGsuY29tbW9uLmh3 LAo+ICsJCVtDTEtfQlVTX01TR0JPWDBdCT0gJmJ1c19tc2dib3gwX2Nsay5jb21tb24uaHcsCj4g KwkJW0NMS19CVVNfTVNHQk9YMV0JPSAmYnVzX21zZ2JveDFfY2xrLmNvbW1vbi5odywKPiArCQlb Q0xLX0JVU19TUElOTE9DS10JPSAmYnVzX3NwaW5sb2NrX2Nsay5jb21tb24uaHcsCj4gKwkJW0NM S19CVVNfSFNUSU1FUl0JPSAmYnVzX2hzdGltZXJfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0FW U10JCT0gJmF2c19jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQlVTX0RCR10JCT0gJmJ1c19kYmdf Y2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19QV01dCQk9ICZidXNfcHdtX2Nsay5jb21tb24u aHcsCj4gKwkJW0NMS19CVVNfSU9NTVVdCQk9ICZidXNfaW9tbXVfY2xrLmNvbW1vbi5odywKPiAr CQlbQ0xLX0RSQU1dCQk9ICZkcmFtX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19NQlVTX0RNQV0J CT0gJm1idXNfZG1hX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19NQlVTX1ZFXQkJPSAmbWJ1c192 ZV9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfTUJVU19DRV0JCT0gJm1idXNfY2VfY2xrLmNvbW1v bi5odywKPiArCQlbQ0xLX01CVVNfQ1NJXQkJPSAmbWJ1c19jc2lfY2xrLmNvbW1vbi5odywKPiAr CQlbQ0xLX01CVVNfSVNQXQkJPSAmbWJ1c19pc3BfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX01C VVNfRzJEXQkJPSAmbWJ1c19nMmRfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19EUkFNXQkJ PSAmYnVzX2RyYW1fY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX01NQzBdCQk9ICZtbWMwX2Nsay5j b21tb24uaHcsCj4gKwkJW0NMS19NTUMxXQkJPSAmbW1jMV9jbGsuY29tbW9uLmh3LAo+ICsJCVtD TEtfTU1DMl0JCT0gJm1tYzJfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19NTUMwXQkJPSAm YnVzX21tYzBfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19NTUMxXQkJPSAmYnVzX21tYzFf Y2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19NTUMyXQkJPSAmYnVzX21tYzJfY2xrLmNvbW1v bi5odywKPiArCQlbQ0xLX0JVU19VQVJUMF0JCT0gJmJ1c191YXJ0MF9jbGsuY29tbW9uLmh3LAo+ ICsJCVtDTEtfQlVTX1VBUlQxXQkJPSAmYnVzX3VhcnQxX2Nsay5jb21tb24uaHcsCj4gKwkJW0NM S19CVVNfVUFSVDJdCQk9ICZidXNfdWFydDJfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19V QVJUM10JCT0gJmJ1c191YXJ0M19jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQlVTX0kyQzBdCQk9 ICZidXNfaTJjMF9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQlVTX0kyQzFdCQk9ICZidXNfaTJj MV9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQlVTX0kyQzJdCQk9ICZidXNfaTJjMl9jbGsuY29t bW9uLmh3LAo+ICsJCVtDTEtfQlVTX0kyQzNdCQk9ICZidXNfaTJjM19jbGsuY29tbW9uLmh3LAo+ ICsJCVtDTEtfQlVTX0kyQzRdCQk9ICZidXNfaTJjNF9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtf U1BJMF0JCT0gJnNwaTBfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX1NQSTFdCQk9ICZzcGkxX2Ns ay5jb21tb24uaHcsCj4gKwkJW0NMS19TUEkyXQkJPSAmc3BpMl9jbGsuY29tbW9uLmh3LAo+ICsJ CVtDTEtfU1BJM10JCT0gJnNwaTNfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19TUEkwXQkJ PSAmYnVzX3NwaTBfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19TUEkxXQkJPSAmYnVzX3Nw aTFfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19TUEkyXQkJPSAmYnVzX3NwaTJfY2xrLmNv bW1vbi5odywKPiArCQlbQ0xLX0JVU19TUEkzXQkJPSAmYnVzX3NwaTNfY2xrLmNvbW1vbi5odywK PiArCQlbQ0xLX1NQSUZdCQk9ICZzcGlmX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfU1BJ Rl0JCT0gJmJ1c19zcGlmX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19FTUFDXzI1TV0JCT0gJmVt YWNfMjVNX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfRU1BQ10JCT0gJmJ1c19lbWFjX2Ns ay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfR1BBRENdCQk9ICZidXNfZ3BhZGNfY2xrLmNvbW1v bi5odywKPiArCQlbQ0xLX0JVU19USFNdCQk9ICZidXNfdGhzX2Nsay5jb21tb24uaHcsCj4gKwkJ W0NMS19JMlMwXQkJPSAmaTJzMF9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfSTJTMV0JCT0gJmky czFfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19JMlMwXQkJPSAmYnVzX2kyczBfY2xrLmNv bW1vbi5odywKPiArCQlbQ0xLX0JVU19JMlMxXQkJPSAmYnVzX2kyczFfY2xrLmNvbW1vbi5odywK PiArCQlbQ0xLX0RNSUNdCQk9ICZkbWljX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfRE1J Q10JCT0gJmJ1c19kbWljX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19BVURJT19DT0RFQ19EQUNd CT0gJmF1ZGlvX2NvZGVjX2RhY19jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQVVESU9fQ09ERUNf QURDXQk9ICZhdWRpb19jb2RlY19hZGNfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0JVU19BVURJ T19DT0RFQ10JPSAmYnVzX2F1ZGlvX2NvZGVjX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19VU0Jf T0hDSV0JCT0gJnVzYl9vaGNpX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfT0hDSV0JCT0g JmJ1c19vaGNpX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfRUhDSV0JCT0gJmJ1c19laGNp X2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfT1RHXQkJPSAmYnVzX290Z19jbGsuY29tbW9u Lmh3LAo+ICsJCVtDTEtfQlVTX0RQU1NfVE9QXQk9ICZidXNfZHBzc190b3BfY2xrLmNvbW1vbi5o dywKPiArCQlbQ0xLX01JUElfRFNJXQkJPSAmbWlwaV9kc2lfY2xrLmNvbW1vbi5odywKPiArCQlb Q0xLX0JVU19NSVBJX0RTSV0JPSAmYnVzX21pcGlfZHNpX2Nsay5jb21tb24uaHcsCj4gKwkJW0NM S19UQ09OX0xDRF0JCT0gJnRjb25fbGNkX2Nsay5jb21tb24uaHcsCj4gKwkJW0NMS19CVVNfVENP Tl9MQ0RdCT0gJmJ1c190Y29uX2xjZF9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQ1NJX1RPUF0J CT0gJmNzaV90b3BfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0NTSV9NQ0xLMF0JCT0gJmNzaV9t Y2xrMF9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfQ1NJX01DTEsxXQkJPSAmY3NpX21jbGsxX2Ns ay5jb21tb24uaHcsCj4gKwkJW0NMS19DU0lfTUNMSzJdCQk9ICZjc2lfbWNsazJfY2xrLmNvbW1v bi5odywKPiArCQlbQ0xLX0JVU19DU0ldCQk9ICZidXNfY3NpX2Nsay5jb21tb24uaHcsCj4gKwkJ W0NMS19CVVNfV0lFR0FORF0JPSAmYnVzX3dpZWdhbmRfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xL X1JJU0NWXQkJPSAmcmlzY3ZfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX1JJU0NWX0FYSV0JCT0g JnJpc2N2X2F4aV9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfUklTQ1ZfQ09SRV9HQVRFXSAgID0g JnJpc2N2X2NvcmVfZ2F0ZS5jb21tb24uaHcsCj4gKwkJW0NMS19SSVNDVl9DRkdfR0FURV0gICAg PSAmcmlzY3ZfY2ZnX2dhdGUuY29tbW9uLmh3LAo+ICsJCVtDTEtfRkFOT1VUXzI0TV0JPSAmZmFu b3V0XzI0TV9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfRkFOT1VUXzE2TV0JPSAmZmFub3V0XzE2 TV9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfRkFOT1VUXzEyTV0JPSAmZmFub3V0XzEyTV9jbGsu Y29tbW9uLmh3LAo+ICsJCVtDTEtfRkFOT1VUXzI1TV0JPSAmZmFub3V0XzI1TV9jbGsuY29tbW9u Lmh3LAo+ICsJCVtDTEtfRkFOT1VUXzI3TV0JPSAmZmFub3V0XzI3TV9jbGsuY29tbW9uLmh3LAo+ ICsJCVtDTEtfRkFOT1VUX1BDTEtdCT0gJmZhbm91dF9wY2xrX2Nsay5jb21tb24uaHcsCj4gKwkJ W0NMS19GQU5PVVQwXQkJPSAmZmFub3V0MF9jbGsuY29tbW9uLmh3LAo+ICsJCVtDTEtfRkFOT1VU MV0JCT0gJmZhbm91dDFfY2xrLmNvbW1vbi5odywKPiArCQlbQ0xLX0ZBTk9VVDJdCQk9ICZmYW5v dXQyX2Nsay5jb21tb24uaHcsCj4gKwl9LAo+ICt9Owo+ICsKPiArc3RhdGljIHN0cnVjdCBjY3Vf cmVzZXRfbWFwIHN1bjhpX3Y4NTNfY2N1X3Jlc2V0c1tdID0gewo+ICsJW1JTVF9NQlVTXQkJPSB7 IDB4NTQwLCBCSVQoMzApIH0sCj4gKwlbUlNUX0JVU19ERV0JCT0geyAweDYwYywgQklUKDE2KSB9 LAo+ICsJW1JTVF9CVVNfRzJEXQkJPSB7IDB4NjNjLCBCSVQoMTYpIH0sCj4gKwlbUlNUX0JVU19D RV0JCT0geyAweDY4YywgQklUKDE2KSB8IEJJVCgxNyl9LAo+ICsJW1JTVF9CVVNfVkVdCQk9IHsg MHg2OWMsIEJJVCgxNikgfSwKPiArCVtSU1RfQlVTX05QVV0JCT0geyAweDZlYywgQklUKDE2KSB9 LAo+ICsJW1JTVF9CVVNfRE1BXQkJPSB7IDB4NzBjLCBCSVQoMTYpIH0sCj4gKwlbUlNUX0JVU19N U0dCT1gwXQk9IHsgMHg3MWMsIEJJVCgxNikgfSwKPiArCVtSU1RfQlVTX01TR0JPWDFdCT0geyAw eDcxYywgQklUKDE3KSB9LAo+ICsJW1JTVF9CVVNfU1BJTkxPQ0tdCT0geyAweDcyYywgQklUKDE2 KSB9LAo+ICsJW1JTVF9CVVNfSFNUSU1FUl0JPSB7IDB4NzNjLCBCSVQoMTYpIH0sCj4gKwlbUlNU X0JVU19EQkddCQk9IHsgMHg3OGMsIEJJVCgxNikgfSwKPiArCVtSU1RfQlVTX1BXTV0JCT0geyAw eDdhYywgQklUKDE2KSB9LAo+ICsJW1JTVF9CVVNfRFJBTV0JCT0geyAweDgwYywgQklUKDE2KSB9 LAo+ICsJW1JTVF9CVVNfTU1DMF0JCT0geyAweDg0YywgQklUKDE2KSB9LAo+ICsJW1JTVF9CVVNf TU1DMV0JCT0geyAweDg0YywgQklUKDE3KSB9LAo+ICsJW1JTVF9CVVNfTU1DMl0JCT0geyAweDg0 YywgQklUKDE4KSB9LAo+ICsJW1JTVF9CVVNfVUFSVDBdCQk9IHsgMHg5MGMsIEJJVCgxNikgfSwK PiArCVtSU1RfQlVTX1VBUlQxXQkJPSB7IDB4OTBjLCBCSVQoMTcpIH0sCj4gKwlbUlNUX0JVU19V QVJUMl0JCT0geyAweDkwYywgQklUKDE4KSB9LAo+ICsJW1JTVF9CVVNfVUFSVDNdCQk9IHsgMHg5 MGMsIEJJVCgxOSkgfSwKPiArCVtSU1RfQlVTX0kyQzBdCQk9IHsgMHg5MWMsIEJJVCgxNikgfSwK PiArCVtSU1RfQlVTX0kyQzFdCQk9IHsgMHg5MWMsIEJJVCgxNykgfSwKPiArCVtSU1RfQlVTX0ky QzJdCQk9IHsgMHg5MWMsIEJJVCgxOCkgfSwKPiArCVtSU1RfQlVTX0kyQzNdCQk9IHsgMHg5MWMs IEJJVCgxOSkgfSwKPiArCVtSU1RfQlVTX0kyQzRdCQk9IHsgMHg5MWMsIEJJVCgyMCkgfSwKPiAr CVtSU1RfQlVTX1NQSTBdCQk9IHsgMHg5NmMsIEJJVCgxNikgfSwKPiArCVtSU1RfQlVTX1NQSTFd CQk9IHsgMHg5NmMsIEJJVCgxNykgfSwKPiArCVtSU1RfQlVTX1NQSTJdCQk9IHsgMHg5NmMsIEJJ VCgxOCkgfSwKPiArCVtSU1RfQlVTX1NQSTNdCQk9IHsgMHg5NmMsIEJJVCgxOSkgfSwKPiArCVtS U1RfQlVTX1NQSUZdCQk9IHsgMHg5NmMsIEJJVCgyMCkgfSwKPiArCVtSU1RfQlVTX0VNQUNdCQk9 IHsgMHg5N2MsIEJJVCgxNikgfSwKPiArCVtSU1RfQlVTX0dQQURDXQkJPSB7IDB4OWVjLCBCSVQo MTYpIH0sCj4gKwlbUlNUX0JVU19USFNdCQk9IHsgMHg5ZmMsIEJJVCgxNikgfSwKPiArCVtSU1Rf QlVTX0kyUzBdCQk9IHsgMHhhMjAsIEJJVCgxNikgfSwKPiArCVtSU1RfQlVTX0kyUzFdCQk9IHsg MHhhMjAsIEJJVCgxNykgfSwKPiArCVtSU1RfQlVTX0RNSUNdCQk9IHsgMHhhNGMsIEJJVCgxNikg fSwKPiArCVtSU1RfQlVTX0FVRElPX0NPREVDXQk9IHsgMHhhNWMsIEJJVCgxNikgfSwKPiArCVtS U1RfVVNCX1BIWV0JCT0geyAweGE3MCwgQklUKDMwKSB9LAo+ICsJW1JTVF9CVVNfT0hDSV0JCT0g eyAweGE4YywgQklUKDE2KSB9LAo+ICsJW1JTVF9CVVNfRUhDSV0JCT0geyAweGE4YywgQklUKDIw KSB9LAo+ICsJW1JTVF9CVVNfT1RHXQkJPSB7IDB4YThjLCBCSVQoMjQpIH0sCj4gKwlbUlNUX0JV U19EUFNTX1RPUF0JPSB7IDB4YWJjLCBCSVQoMTYpIH0sCj4gKwlbUlNUX0JVU19NSVBJX0RTSV0J PSB7IDB4YjRjLCBCSVQoMTYpIH0sCj4gKwlbUlNUX0JVU19UQ09OX0xDRF0JPSB7IDB4YjdjLCBC SVQoMTYpIH0sCj4gKwlbUlNUX0JVU19DU0ldCQk9IHsgMHhjMmMsIEJJVCgxNikgfSwKPiArCVtS U1RfQlVTX1dJRUdBTkRdCT0geyAweGM3YywgQklUKDE2KSB9LAo+ICsJW1JTVF9SSVNDVl9TWVNf QVBCXQk9IHsgMHhkMDQsIEJJVCgyKSwgQ0NVX0ZFQVRVUkVfS0VZX0ZJRUxEIH0sCj4gKwlbUlNU X1JJU0NWX1NPRlRdCT0geyAweGQwNCwgQklUKDEpLCBDQ1VfRkVBVFVSRV9LRVlfRklFTEQgfSwK PiArCVtSU1RfUklTQ1ZfQ0ZHXQkJPSB7IDB4ZDBjLCBCSVQoMTYpIH0KPiArfTsKPiArCj4gK3N0 YXRpYyBjb25zdCBzdHJ1Y3Qgc3VueGlfY2N1X2Rlc2Mgc3VuOGlfdjg1M19jY3VfZGVzYyA9IHsK PiArCS5jY3VfY2xrcwk9IHN1bjhpX3Y4NTNfY2N1X2Nsa3MsCj4gKwkubnVtX2NjdV9jbGtzCT0g QVJSQVlfU0laRShzdW44aV92ODUzX2NjdV9jbGtzKSwKPiArCj4gKwkuaHdfY2xrcwk9ICZzdW44 aV92ODUzX2h3X2Nsa3MsCj4gKwo+ICsJLnJlc2V0cwkJPSBzdW44aV92ODUzX2NjdV9yZXNldHMs Cj4gKwkubnVtX3Jlc2V0cwk9IEFSUkFZX1NJWkUoc3VuOGlfdjg1M19jY3VfcmVzZXRzKSwKPiAr fTsKPiArCj4gK3N0YXRpYyBjb25zdCB1MzIgcGxsX3JlZ3NbXSA9IHsKPiArCVNVTjhJX1Y4NTNf UExMX0NQVV9SRUcsCj4gKwlTVU44SV9WODUzX1BMTF9ERFJfUkVHLAo+ICsJU1VOOElfVjg1M19Q TExfUEVSSVBIX1JFRywKPiArCVNVTjhJX1Y4NTNfUExMX1ZJREVPX1JFRywKPiArCVNVTjhJX1Y4 NTNfUExMX0NTSV9SRUcsCj4gKwlTVU44SV9WODUzX1BMTF9BVURJT19SRUcsCj4gKwlTVU44SV9W ODUzX1BMTF9OUFVfUkVHLAo+ICt9Owo+ICsKPiArc3RhdGljIGludCBzdW44aV92ODUzX2NjdV9w cm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKwl2b2lkIF9faW9tZW0g KnJlZzsKPiArCXUzMiB2YWw7Cj4gKwlpbnQgaSwgcmV0Owo+ICsKPiArCXJlZyA9IGRldm1fcGxh dGZvcm1faW9yZW1hcF9yZXNvdXJjZShwZGV2LCAwKTsKPiArCWlmIChJU19FUlIocmVnKSkKPiAr CQlyZXR1cm4gUFRSX0VSUihyZWcpOwo+ICsKPiArCS8qIEVuYWJsZSB0aGUgZW5hYmxlLCBMRE8s IGFuZCBsb2NrIGJpdHMgb24gYWxsIFBMTHMuICovCj4gKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlf U0laRShwbGxfcmVncyk7IGkrKykgewo+ICsJCXZhbCA9IHJlYWRsKHJlZyArIHBsbF9yZWdzW2ld KTsKPiArCQl2YWwgfD0gQklUKDMxKSB8IEJJVCgzMCkgfCBCSVQoMjkpOwo+ICsJCXdyaXRlbCh2 YWwsIHJlZyArIHBsbF9yZWdzW2ldKTsKPiArCX0KPiArCj4gKwkvKiBGb3JjZSBQTExfQ1BVIGZh Y3RvciBNIHRvIDAuICovCj4gKwl2YWwgPSByZWFkbChyZWcgKyBTVU44SV9WODUzX1BMTF9DUFVf UkVHKTsKPiArCXZhbCAmPSB+R0VOTUFTSygxLCAwKTsKPiArCXdyaXRlbCh2YWwsIHJlZyArIFNV TjhJX1Y4NTNfUExMX0NQVV9SRUcpOwo+ICsKPiArCS8qCj4gKwkgKiBGb3JjZSBPSENJIDEyTSBj bG9jayBzb3VyY2UgdG8gMDAgKDEyTUh6IGRpdmlkZWQgZnJvbSA0OE1IeikKPiArCSAqCj4gKwkg KiBUaGlzIGNsb2NrIG11eCBpcyBzdGlsbCBteXN0ZXJpb3VzLCBhbmQgdGhlIGNvZGUganVzdCBl bmZvcmNlcwo+ICsJICogaXQgdG8gaGF2ZSBhIHZhbGlkIGNsb2NrIHBhcmVudC4KPiArCSAqLwo+ ICsJdmFsID0gcmVhZGwocmVnICsgU1VOOElfVjg1M19VU0JfQ0xLX1JFRyk7Cj4gKwl2YWwgJj0g fkdFTk1BU0soMjUsIDI0KTsKPiArCXdyaXRlbCh2YWwsIHJlZyArIFNVTjhJX1Y4NTNfVVNCX0NM S19SRUcpOwo+ICsKPiArCS8qIEZvcmNlIGZhbm91dC0yN00gZmFjdG9yIE4gdG8gMC4gKi8KPiAr CXZhbCA9IHJlYWRsKHJlZyArIFNVTjhJX1Y4NTNfRkFOT1VUXzI3TV9SRUcpOwo+ICsJdmFsICY9 IH5HRU5NQVNLKDksIDgpOwo+ICsJd3JpdGVsKHZhbCwgcmVnICsgU1VOOElfVjg1M19GQU5PVVRf MjdNX1JFRyk7Cj4gKwo+ICsJcmV0ID0gZGV2bV9zdW54aV9jY3VfcHJvYmUoJnBkZXYtPmRldiwg cmVnLCAmc3VuOGlfdjg1M19jY3VfZGVzYyk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7 Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2 aWNlX2lkIHN1bjhpX3Y4NTNfY2N1X2lkc1tdID0gewo+ICsJeyAuY29tcGF0aWJsZSA9ICJhbGx3 aW5uZXIsc3VuOGktdjg1My1jY3UiIH0sCj4gKwl7IH0KPiArfTsKPiArCj4gK3N0YXRpYyBzdHJ1 Y3QgcGxhdGZvcm1fZHJpdmVyIHN1bjhpX3Y4NTNfY2N1X2RyaXZlciA9IHsKPiArCS5wcm9iZQk9 IHN1bjhpX3Y4NTNfY2N1X3Byb2JlLAo+ICsJLmRyaXZlcgk9IHsKPiArCQkubmFtZQkJCT0gInN1 bjhpLXY4NTMtY2N1IiwKPiArCQkuc3VwcHJlc3NfYmluZF9hdHRycwk9IHRydWUsCj4gKwkJLm9m X21hdGNoX3RhYmxlCQk9IHN1bjhpX3Y4NTNfY2N1X2lkcywKPiArCX0sCj4gK307Cj4gK21vZHVs ZV9wbGF0Zm9ybV9kcml2ZXIoc3VuOGlfdjg1M19jY3VfZHJpdmVyKTsKPiArCj4gK01PRFVMRV9J TVBPUlRfTlMoIlNVTlhJX0NDVSIpOwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIlN1cHBvcnQgZm9y IHRoZSBBbGx3aW5uZXIgVjg1MyBDQ1UiKTsKPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1My5oIGIvZHJpdmVy cy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMuaAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4g aW5kZXggMDAwMDAwMDAwMDAwLi5mMWIyYTRkMGJjZDMKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIv ZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMuaAo+IEBAIC0wLDAgKzEsMTQgQEAK PiArLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KPiArLyoKPiArICogQ29w eXJpZ2h0IChDKSAyMDI0IEFuZHJhcyBTemVtem8gPHN6ZW16by5hbmRyYXNAZ21haWwuY29tPgo+ ICsgKi8KPiArCj4gKyNpZm5kZWYgX0NDVV9TVU44SV9WODUzX0hfCj4gKyNkZWZpbmUgX0NDVV9T VU44SV9WODUzX0hfCj4gKwo+ICsjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svYWxsd2lubmVy LHN1bjhpLXY4NTMtY2N1Lmg+Cj4gKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9yZXNldC9hbGx3aW5u ZXIsc3VuOGktdjg1My1jY3UuaD4KPiArCj4gKyNkZWZpbmUgQ0xLX05VTUJFUgkJKENMS19GQU5P VVQyICsgMSkKPiArCj4gKyNlbmRpZgo+IAoKCgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCmxpbnV4LXJpc2N2IG1haWxpbmcgbGlzdApsaW51eC1yaXNj dkBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4v bGlzdGluZm8vbGludXgtcmlzY3YK