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 X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B3422C433DB for ; Mon, 11 Jan 2021 12:16:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5725C20BED for ; Mon, 11 Jan 2021 12:16:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725977AbhAKMQ1 (ORCPT ); Mon, 11 Jan 2021 07:16:27 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37110 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725919AbhAKMQ0 (ORCPT ); Mon, 11 Jan 2021 07:16:26 -0500 Received: from mail-oi1-x232.google.com (mail-oi1-x232.google.com [IPv6:2607:f8b0:4864:20::232]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A0518C061794; Mon, 11 Jan 2021 04:15:45 -0800 (PST) Received: by mail-oi1-x232.google.com with SMTP id s75so19899748oih.1; Mon, 11 Jan 2021 04:15:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=DDttZIjQaPrl98+NPurBcwGDVkZUdgP5hs24HQyiA5s=; b=dd8nTqbOjoR0C3qASa7KKTPhrOX71HO8p2f7IeTyLoeSYmQnTnyCZKS9Dmoet8jSPO 3W3yAyAkcc92Vm9l3h5YY9bohm5Cxh4AG1oeFkzbapMSYgw0/N/6xp6V30vtMCgfMsyB P8Baf8bhcTTmq7XKh482ZwSKCG0ddsouaQvTeT4IrhrxLQN9njWj9mj9ud26b00Ud8DS tR/zMRp91IF2FLa8AomY96zBapnH4NNOGxMjJ+8WjdJTPHSMHk3Gw0X7Hvp61Ujawlr6 ah5/nhSdtNXXuNv4wG6NUqKQdLMsGyihPGZhIWSSAevKfR0fosLw9tPpa7ISp7Bf9i1t 8FXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=DDttZIjQaPrl98+NPurBcwGDVkZUdgP5hs24HQyiA5s=; b=a6RnwL4+WZGIFY2sl2IVJWg7DM6GViumKsd46DObKnLJu3UUDCNWcwrZhWSVxiDKnW SfT5LzktIhU19e/K0N0w9T3eQzAMBYKfb3it0r84Ez3iI6pYqRSRvecXHtrqXEpS1Z+0 3JMIhkTt9Rxu7nv1DjYa+cfhUgC6Hn4CenRI6kfgCluZ3oLiztNaUOqbQMfqMsPnqX1r 8IZMKJ+y60N40wnDQWmKs+xf3djtescYEPR9MXxtPJgjNBbUKmIjVNtX+lMprDnpxil/ iLZReGO2BKhzf4sgnLTggPdWyaRMB2wFcmnZ9Czr+HvzX4r3BAbnwNN7qcnHX7DR7byc Bdlg== X-Gm-Message-State: AOAM530DdbTxuo4fiVCD6agps3xteHPspm+tgi480Jm2pofJDT8u4iC8 f6KAvLxpm8CzLTS5C3lYJ6S4F4lmjd1kVuHO4GI= X-Google-Smtp-Source: ABdhPJzxbmGT1NKfvCOwSLX1JXeKLs7aoHkUMJNne6zceIcP7+tnM9zvg9KKVlHst1eb/ro9nl2tU6Jg9zpfwcoun0U= X-Received: by 2002:aca:3554:: with SMTP id c81mr9927093oia.23.1610367344755; Mon, 11 Jan 2021 04:15:44 -0800 (PST) MIME-Version: 1.0 References: <1608796084-29418-1-git-send-email-gene.chen.richtek@gmail.com> <1608796084-29418-3-git-send-email-gene.chen.richtek@gmail.com> <20210106201654.lkmqorlgcecgqqkf@earth.universe> In-Reply-To: <20210106201654.lkmqorlgcecgqqkf@earth.universe> From: Gene Chen Date: Mon, 11 Jan 2021 20:15:33 +0800 Message-ID: Subject: Re: [PATCH v3 2/2] power: supply: mt6360_charger: add MT6360 charger support To: Sebastian Reichel Cc: Matthias Brugger , Rob Herring , linux-pm@vger.kernel.org, devicetree , linux-arm Mailing List , "moderated list:ARM/Mediatek SoC support" , Linux Kernel Mailing List , Gene Chen , Wilma.Wu@mediatek.com, shufan_lee@richtek.com, cy_huang@richtek.com, benjamin.chao@mediatek.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Sebastian Reichel =E6=96=BC 2021=E5=B9=B4= 1=E6=9C=887=E6=97=A5 =E9=80=B1=E5=9B=9B =E4=B8=8A=E5=8D=884:16=E5=AF=AB=E9= =81=93=EF=BC=9A > > Hi Gene, > > I have a bunch of comments, please take a look at my inline > comments. > > On Thu, Dec 24, 2020 at 03:48:04PM +0800, Gene Chen wrote: > > From: Gene Chen > > > > Add basic support for the battery charger for MT6360 PMIC > > > > Signed-off-by: Gene Chen > > --- > > drivers/power/supply/Kconfig | 10 + > > drivers/power/supply/Makefile | 1 + > > drivers/power/supply/mt6360_charger.c | 1054 +++++++++++++++++++++++++= ++++++++ > > 3 files changed, 1065 insertions(+) > > create mode 100644 drivers/power/supply/mt6360_charger.c > > > > diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfi= g > > index eec646c..dd63bed 100644 > > --- a/drivers/power/supply/Kconfig > > +++ b/drivers/power/supply/Kconfig > > @@ -567,6 +567,16 @@ config CHARGER_MP2629 > > Battery charger. This driver provides Battery charger power man= agement > > functions on the systems. > > > > +config CHARGER_MT6360 > > + tristate "Mediatek MT6360 Charger Driver" > > + depends on MFD_MT6360 > > + depends on REGULATOR > > + help > > + Say Y here to enable MT6360 Charger Part. > > + The device supports High-Accuracy Voltage/Current Regulation, > > + Average Input Current Regulation, Battery Tempature Sensing, > > + Over-Temperature Protection, DPDM Detection for BC1.2 > > + > > config CHARGER_QCOM_SMBB > > tristate "Qualcomm Switch-Mode Battery Charger and Boost" > > depends on MFD_SPMI_PMIC || COMPILE_TEST > > diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makef= ile > > index dd4b863..9bd0804 100644 > > --- a/drivers/power/supply/Makefile > > +++ b/drivers/power/supply/Makefile > > @@ -77,6 +77,7 @@ obj-$(CONFIG_CHARGER_MAX77693) +=3D max77693_cha= rger.o > > obj-$(CONFIG_CHARGER_MAX8997) +=3D max8997_charger.o > > obj-$(CONFIG_CHARGER_MAX8998) +=3D max8998_charger.o > > obj-$(CONFIG_CHARGER_MP2629) +=3D mp2629_charger.o > > +obj-$(CONFIG_CHARGER_MT6360) +=3D mt6360_charger.o > > obj-$(CONFIG_CHARGER_QCOM_SMBB) +=3D qcom_smbb.o > > obj-$(CONFIG_CHARGER_BQ2415X) +=3D bq2415x_charger.o > > obj-$(CONFIG_CHARGER_BQ24190) +=3D bq24190_charger.o > > diff --git a/drivers/power/supply/mt6360_charger.c b/drivers/power/supp= ly/mt6360_charger.c > > new file mode 100644 > > index 0000000..f1dcb97 > > --- /dev/null > > +++ b/drivers/power/supply/mt6360_charger.c > > @@ -0,0 +1,1054 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * Copyright (c) 2019 MediaTek Inc. > > 2019-2021? :) > ACK > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > change of.h to after implementing my later > change request. > ACK > > +#include > > +#include > > +#include > > + > > +#define MT6360_PMU_CHG_CTRL1 0x311 > > +#define MT6360_PMU_CHG_CTRL2 0x312 > > +#define MT6360_PMU_CHG_CTRL3 0x313 > > +#define MT6360_PMU_CHG_CTRL4 0x314 > > +#define MT6360_PMU_CHG_CTRL5 0x315 > > +#define MT6360_PMU_CHG_CTRL6 0x316 > > +#define MT6360_PMU_CHG_CTRL7 0x317 > > +#define MT6360_PMU_CHG_CTRL8 0x318 > > +#define MT6360_PMU_CHG_CTRL9 0x319 > > +#define MT6360_PMU_CHG_CTRL10 0x31A > > +#define MT6360_PMU_CHG_CTRL11 0x31B > > +#define MT6360_PMU_CHG_CTRL12 0x31C > > +#define MT6360_PMU_CHG_CTRL13 0x31D > > +#define MT6360_PMU_DEVICE_TYPE 0x322 > > +#define MT6360_PMU_USB_STATUS1 0x327 > > +#define MT6360_PMU_CHG_CTRL17 0x32B > > +#define MT6360_PMU_CHG_CTRL18 0x32C > > +#define MT6360_PMU_CHG_STAT 0x34A > > +#define MT6360_PMU_CHG_CTRL19 0x361 > > +#define MT6360_PMU_FOD_STAT 0x3E7 > > + > > +/* MT6360_PMU_CHG_CTRL1 */ > > +#define MT6360_FSLP_SHFT (3) > > +#define MT6360_FSLP_MASK BIT(MT6360_FSLP_SHFT) > > +#define MT6360_HIZ_SHFT (2) > > +#define MT6360_HIZ_MASK BIT(MT6360_HIZ_SHFT) > > +#define MT6360_OPA_MODE_SHFT (0) > > +#define MT6360_OPA_MODE_MASK BIT(MT6360_OPA_MODE_SHFT) > > +/* MT6360_PMU_CHG_CTRL2 */ > > +#define MT6360_TE_SHFT (4) > > +#define MT6360_TE_MASK BIT(MT6360_TE_SHFT) > > +#define MT6360_IINLMTSEL_SHFT (2) > > +#define MT6360_IINLMTSEL_MASK GENMASK(3, 2) > > +#define MT6360_CHG_EN_SHFT (0) > > +#define MT6360_CHG_EN_MASK BIT(MT6360_CHG_EN_SHFT) > > +/* MT6360_PMU_CHG_CTRL3 */ > > +#define MT6360_IAICR_SHFT (2) > > +#define MT6360_IAICR_MASK GENMASK(7, 2) > > +#define MT6360_ILIM_EN_MASK BIT(0) > > +/* MT6360_PMU_CHG_CTRL4 */ > > +#define MT6360_VOREG_SHFT (1) > > +#define MT6360_VOREG_MASK GENMASK(7, 1) > > +/* MT6360_PMU_CHG_CTRL5 */ > > +#define MT6360_VOBST_MASK GENMASK(7, 2) > > +/* MT6360_PMU_CHG_CTRL6 */ > > +#define MT6360_VMIVR_SHFT (1) > > +#define MT6360_VMIVR_MASK GENMASK(7, 1) > > +/* MT6360_PMU_CHG_CTRL7 */ > > +#define MT6360_ICHG_SHFT (2) > > +#define MT6360_ICHG_MASK GENMASK(7, 2) > > +/* MT6360_PMU_CHG_CTRL8 */ > > +#define MT6360_IPREC_SHFT (0) > > +#define MT6360_IPREC_MASK GENMASK(3, 0) > > +/* MT6360_PMU_CHG_CTRL9 */ > > +#define MT6360_IEOC_SHFT (4) > > +#define MT6360_IEOC_MASK GENMASK(7, 4) > > +/* MT6360_PMU_CHG_CTRL10 */ > > +#define MT6360_LBP_SHFT (4) > > +#define MT6360_LBP_MASK GENMASK(7, 4) > > +#define MT6360_OTG_OC_SHFT (0) > > +#define MT6360_OTG_OC_MASK GENMASK(3, 0) > > +/* MT6360_PMU_CHG_CTRL11 */ > > +#define MT6360_SYSREG_SHFT (2) > > +#define MT6360_SYSREG_MASK GENMASK(4, 2) > > +#define MT6360_VREC_SHFT (0) > > +#define MT6360_VREC_MASK GENMASK(2, 0) > > +/* MT6360_PMU_CHG_CTRL12 */ > > +#define MT6360_WT_FC_SHFT (5) > > +#define MT6360_WT_FC_MASK GENMASK(7, 5) > > +/* MT6360_PMU_CHG_CTRL13 */ > > +#define MT6360_CHG_WDT_EN_SHFT (7) > > +#define MT6360_CHG_WDT_EN_MASK BIT(MT6360_CHG_WDT_EN_SHFT) > > +#define MT6360_CHG_WDT_SHFT (4) > > +#define MT6360_CHG_WDT_MASK GENMASK(5, 4) > > +/* MT6360_PMU_DEVICE_TYPE */ > > +#define MT6360_USBCHGEN_SHFT (7) > > +#define MT6360_USBCHGEN_MASK BIT(MT6360_USBCHGEN_SHFT) > > +/* MT6360_PMU_USB_STATUS1 */ > > +#define MT6360_USB_STATUS_SHFT (4) > > +#define MT6360_USB_STATUS_MASK GENMASK(6, 4) > > +/* MT6360_PMU_CHG_CTRL18 */ > > +#define MT6360_BAT_COMP_SHFT (3) > > +#define MT6360_BAT_COMP_MASK GENMASK(5, 3) > > +#define MT6360_VCLAMP_SHFT (0) > > +#define MT6360_VCLAMP_MASK GENMASK(2, 0) > > +/* MT6360_PMU_CHG_STAT */ > > +#define MT6360_CHG_STAT_SHFT (6) > > +#define MT6360_CHG_STAT_MASK GENMASK(7, 6) > > +#define MT6360_VBAT_LVL_MASK BIT(5) > > +/* MT6360_PMU_CHG_CTRL19 */ > > +#define MT6360_VINOVP_SHFT (5) > > +#define MT6360_VINOVP_MASK GENMASK(6, 5) > > +/* MT6360_PMU_FOD_STAT */ > > +#define MT6360_CHRDET_EXT_SHFT (4) > > +#define MT6360_CHRDET_EXT_MASK BIT(4) > > + > > +/* uA */ > > +#define MT6360_ICHG_MIN 100000 > > +#define MT6360_ICHG_MAX 5000000 > > +#define MT6360_ICHG_STEP 100000 > > +/* uV */ > > +#define MT6360_VOREG_MIN 3900000 > > +#define MT6360_VOREG_MAX 4710000 > > +#define MT6360_VOREG_STEP 10000 > > +/* uA */ > > +#define MT6360_AICR_MIN 100000 > > +#define MT6360_AICR_MAX 3250000 > > +#define MT6360_AICR_STEP 50000 > > +/* uA */ > > +#define MT6360_IPREC_MIN 100000 > > +#define MT6360_IPREC_MAX 850000 > > +#define MT6360_IPREC_STEP 50000 > > +/* uA */ > > +#define MT6360_IEOC_MIN 100000 > > +#define MT6360_IEOC_MAX 850000 > > +#define MT6360_IEOC_STEP 50000 > > + > > +struct mt6360_chg_platform_data { > > + u32 vinovp; > > +}; > > I think it's pointless to have the platform_data struct. > More about that later. > ACK, I will fix it as below suggestion. > > +struct mt6360_chg_info { > > + struct device *dev; > > + struct mt6360_chg_platform_data *pdata; > > + struct regmap *regmap; > > + struct power_supply_desc psy_desc; > > + struct power_supply *psy; > > + struct regulator_dev *otg_rdev; > > + struct mutex chgdet_lock; > > + bool pwr_rdy; > > + bool bc12_en; > > + int psy_usb_type; > > + struct work_struct chrdet_work; > > +}; > > + > > +static struct mt6360_chg_platform_data def_platform_data =3D { > > + .vinovp =3D 6500000, > > +}; > > + > > +enum mt6360_iinlmtsel { > > + MT6360_IINLMTSEL_AICR_3250 =3D 0, > > + MT6360_IINLMTSEL_CHG_TYPE, > > + MT6360_IINLMTSEL_AICR, > > + MT6360_IINLMTSEL_LOWER_LEVEL, > > +}; > > + > > +enum mt6360_pmu_chg_type { > > + MT6360_CHG_TYPE_NOVBUS =3D 0, > > + MT6360_CHG_TYPE_UNDER_GOING, > > + MT6360_CHG_TYPE_SDP, > > + MT6360_CHG_TYPE_SDPNSTD, > > + MT6360_CHG_TYPE_DCP, > > + MT6360_CHG_TYPE_CDP, > > + MT6360_CHG_TYPE_MAX, > > +}; > > + > > +static enum power_supply_usb_type mt6360_charger_usb_types[] =3D { > > + POWER_SUPPLY_USB_TYPE_UNKNOWN, > > + POWER_SUPPLY_USB_TYPE_SDP, > > + POWER_SUPPLY_USB_TYPE_DCP, > > + POWER_SUPPLY_USB_TYPE_CDP, > > + POWER_SUPPLY_USB_TYPE_C, > > + POWER_SUPPLY_USB_TYPE_PD, > > + POWER_SUPPLY_USB_TYPE_PD_DRP, > > + POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID > > driver/hardware does not seem to support Type-C, PD, PD-DRP and the > special Apple type. Any unsupported type should not be listed. > ACK > > +}; > > + > > +static unsigned int mt6360_map_reg_sel(u32 data, u32 min, u32 max, u32= step) > > +{ > > + u32 target =3D 0, max_sel; > > + > > + if (data >=3D min) { > > + target =3D (data - min) / step; > > + max_sel =3D (max - min) / step; > > + if (target > max_sel) > > + target =3D max_sel; > > + } > > + return target; > > +} > > + > > +static u32 mt6360_map_real_val(u32 sel, u32 min, u32 max, u32 step) > > +{ > > + u32 target =3D 0; > > + > > + target =3D min + (sel * step); > > + if (target > max) > > + target =3D max; > > + return target; > > +} > > + > > +static int mt6360_get_chrdet_ext_stat(struct mt6360_chg_info *mci, > > + bool *pwr_rdy) > > +{ > > + int ret; > > + unsigned int regval; > > + > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_FOD_STAT, ®val); > > + if (ret < 0) > > + return ret; > > + *pwr_rdy =3D (regval & MT6360_CHRDET_EXT_MASK) ? true : false; > > + return 0; > > +} > > + > > +static int mt6360_charger_get_online(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + int ret; > > + bool pwr_rdy; > > + > > + ret =3D mt6360_get_chrdet_ext_stat(mci, &pwr_rdy); > > + if (ret < 0) > > + return ret; > > + val->intval =3D pwr_rdy ? true : false; > > + return 0; > > +} > > + > > +static int mt6360_charger_get_status(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + int status, ret; > > + unsigned int regval; > > + bool pwr_rdy; > > + > > + ret =3D mt6360_get_chrdet_ext_stat(mci, &pwr_rdy); > > + if (ret < 0) > > + return ret; > > + if (!pwr_rdy) { > > + status =3D POWER_SUPPLY_STATUS_DISCHARGING; > > + goto out; > > + } > > + > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_STAT, ®val); > > + if (ret < 0) > > + return ret; > > + regval &=3D MT6360_CHG_STAT_MASK; > > + regval >>=3D MT6360_CHG_STAT_SHFT; > > + switch (regval) { > > + case 0x0: > > + status =3D POWER_SUPPLY_STATUS_NOT_CHARGING; > > + break; > > + case 0x1: > > + status =3D POWER_SUPPLY_STATUS_CHARGING; > > + break; > > + case 0x2: > > + status =3D POWER_SUPPLY_STATUS_FULL; > > + break; > > + default: > > + ret =3D -EIO; > > + } > > +out: > > + if (!ret) > > + val->intval =3D status; > > + return ret; > > +} > > + > > +static int mt6360_charger_get_charge_type(struct mt6360_chg_info *mci, > > + union power_supply_propval *val= ) > > +{ > > + int type, ret; > > + unsigned int regval; > > + u8 chg_stat; > > + > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_STAT, ®val); > > + if (ret < 0) > > + return ret; > > + > > + chg_stat =3D (regval & MT6360_CHG_STAT_MASK) >> MT6360_CHG_STAT_S= HFT; > > + switch (chg_stat) { > > + case 0x01: /* Charge in Progress */ > > + if (regval & MT6360_VBAT_LVL_MASK) > > + type =3D POWER_SUPPLY_CHARGE_TYPE_FAST; > > + else > > + type =3D POWER_SUPPLY_CHARGE_TYPE_TRICKLE; > > + break; > > + case 0x00: /* Not Charging */ > > + case 0x02: /* Charge Done */ > > + case 0x03: /* Charge Fault */ > > + default: > > + type =3D POWER_SUPPLY_CHARGE_TYPE_NONE; > > + break; > > + } > > + > > + val->intval =3D type; > > + return 0; > > +} > > + > > +static int mt6360_charger_get_ichg(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + int ret; > > + unsigned int regval; > > + > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL7, ®val); > > + if (ret < 0) > > + return ret; > > + regval =3D (regval & MT6360_ICHG_MASK) >> MT6360_ICHG_SHFT; > > + val->intval =3D mt6360_map_real_val(regval, > > + MT6360_ICHG_MIN, > > + MT6360_ICHG_MAX, > > + MT6360_ICHG_STEP); > > + return 0; > > +} > > It's unusual, that you do not need any scaling. Does the hardware > really report voltages in =C2=B5V and currents in =C2=B5A? > Should I replace MT6360_ICHG_MIN by MT6360_ICHG_MINUA? > > +static int mt6360_charger_get_max_ichg(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + val->intval =3D MT6360_ICHG_MAX; > > + return 0; > > +} > > + > > +static int mt6360_charger_get_cv(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + int ret; > > + unsigned int regval; > > + > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL4, ®val); > > + if (ret < 0) > > + return ret; > > + regval =3D (regval & MT6360_VOREG_MASK) >> MT6360_VOREG_SHFT; > > + val->intval =3D mt6360_map_real_val(regval, > > + MT6360_VOREG_MIN, > > + MT6360_VOREG_MAX, > > + MT6360_VOREG_STEP); > > + return 0; > > +} > > + > > +static int mt6360_charger_get_max_cv(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + val->intval =3D MT6360_VOREG_MAX; > > + return 0; > > +} > > + > > +static int mt6360_charger_get_aicr(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + int ret; > > + unsigned int regval; > > + > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL3, ®val); > > + if (ret < 0) > > + return ret; > > + regval =3D (regval & MT6360_IAICR_MASK) >> MT6360_IAICR_SHFT; > > + val->intval =3D mt6360_map_real_val(regval, > > + MT6360_AICR_MIN, > > + MT6360_AICR_MAX, > > + MT6360_AICR_STEP); > > + return 0; > > +} > > + > > +static int mt6360_charger_get_iprechg(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + int ret; > > + unsigned int regval; > > + > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL8, ®val); > > + if (ret < 0) > > + return ret; > > + regval =3D (regval & MT6360_IPREC_MASK) >> MT6360_IPREC_SHFT; > > + val->intval =3D mt6360_map_real_val(regval, > > + MT6360_IPREC_MIN, > > + MT6360_IPREC_MAX, > > + MT6360_IPREC_STEP); > > + return 0; > > +} > > + > > +static int mt6360_charger_get_ieoc(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + int ret; > > + unsigned int regval; > > + > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL9, ®val); > > + if (ret < 0) > > + return ret; > > + regval =3D (regval & MT6360_IEOC_MASK) >> MT6360_IEOC_SHFT; > > + val->intval =3D mt6360_map_real_val(regval, > > + MT6360_IEOC_MIN, > > + MT6360_IEOC_MAX, > > + MT6360_IEOC_STEP); > > + return 0; > > +} > > + > > +static int mt6360_charger_set_online(struct mt6360_chg_info *mci, > > + const union power_supply_propval *va= l) > > +{ > > + u8 force_sleep =3D val->intval ? 0 : 1; > > + > > + return regmap_update_bits(mci->regmap, > > + MT6360_PMU_CHG_CTRL1, > > + MT6360_FSLP_MASK, > > + force_sleep << MT6360_FSLP_SHFT); > > +} > > + > > +static int mt6360_charger_set_ichg(struct mt6360_chg_info *mci, > > + const union power_supply_propval *val) > > +{ > > + u8 sel; > > + > > + sel =3D mt6360_map_reg_sel(val->intval, > > + MT6360_ICHG_MIN, > > + MT6360_ICHG_MAX, > > + MT6360_ICHG_STEP); > > + return regmap_update_bits(mci->regmap, > > + MT6360_PMU_CHG_CTRL7, > > + MT6360_ICHG_MASK, > > + sel << MT6360_ICHG_SHFT); > > +} > > + > > +static int mt6360_charger_set_cv(struct mt6360_chg_info *mci, > > + const union power_supply_propval *val) > > +{ > > + u8 sel; > > + > > + sel =3D mt6360_map_reg_sel(val->intval, > > + MT6360_VOREG_MIN, > > + MT6360_VOREG_MAX, > > + MT6360_VOREG_STEP); > > + return regmap_update_bits(mci->regmap, > > + MT6360_PMU_CHG_CTRL4, > > + MT6360_VOREG_MASK, > > + sel << MT6360_VOREG_SHFT); > > +} > > + > > +static int mt6360_charger_set_aicr(struct mt6360_chg_info *mci, > > + const union power_supply_propval *val) > > +{ > > + u8 sel; > > + > > + sel =3D mt6360_map_reg_sel(val->intval, > > + MT6360_AICR_MIN, > > + MT6360_AICR_MAX, > > + MT6360_AICR_STEP); > > + return regmap_update_bits(mci->regmap, > > + MT6360_PMU_CHG_CTRL3, > > + MT6360_IAICR_MASK, > > + sel << MT6360_IAICR_SHFT); > > +} > > + > > +static int mt6360_charger_set_iprechg(struct mt6360_chg_info *mci, > > + const union power_supply_propval *v= al) > > +{ > > + u8 sel; > > + > > + sel =3D mt6360_map_reg_sel(val->intval, > > + MT6360_IPREC_MIN, > > + MT6360_IPREC_MAX, > > + MT6360_IPREC_STEP); > > + return regmap_update_bits(mci->regmap, > > + MT6360_PMU_CHG_CTRL8, > > + MT6360_IPREC_MASK, > > + sel << MT6360_IPREC_SHFT); > > +} > > + > > +static int mt6360_charger_set_ieoc(struct mt6360_chg_info *mci, > > + const union power_supply_propval *val) > > +{ > > + u8 sel; > > + > > + sel =3D mt6360_map_reg_sel(val->intval, > > + MT6360_IEOC_MIN, > > + MT6360_IEOC_MAX, > > + MT6360_IEOC_STEP); > > + return regmap_update_bits(mci->regmap, > > + MT6360_PMU_CHG_CTRL9, > > + MT6360_IEOC_MASK, > > + sel << MT6360_IEOC_SHFT); > > +} > > + > > +static int mt6360_charger_get_property(struct power_supply *psy, > > + enum power_supply_property psp, > > + union power_supply_propval *val) > > +{ > > + struct mt6360_chg_info *mci =3D power_supply_get_drvdata(psy); > > + int ret =3D 0; > > + > > + dev_dbg(mci->dev, "%s: prop =3D %d\n", __func__, psp); > > drop this debug message. It's only useful during development. > ACK > > + switch (psp) { > > + case POWER_SUPPLY_PROP_ONLINE: > > + ret =3D mt6360_charger_get_online(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_STATUS: > > + ret =3D mt6360_charger_get_status(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CHARGE_TYPE: > > + ret =3D mt6360_charger_get_charge_type(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: > > + ret =3D mt6360_charger_get_ichg(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX: > > + ret =3D mt6360_charger_get_max_ichg(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: > > + ret =3D mt6360_charger_get_cv(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX: > > + ret =3D mt6360_charger_get_max_cv(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: > > + ret =3D mt6360_charger_get_aicr(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: > > + ret =3D mt6360_charger_get_iprechg(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: > > + ret =3D mt6360_charger_get_ieoc(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_USB_TYPE: > > + val->intval =3D mci->psy_usb_type; > > + break; > > + default: > > + ret =3D -ENODATA; > > + } > > + return ret; > > +} > > + > > +static int mt6360_charger_set_property(struct power_supply *psy, > > + enum power_supply_property psp, > > + const union power_supply_propval *= val) > > +{ > > + struct mt6360_chg_info *mci =3D power_supply_get_drvdata(psy); > > + int ret; > > + > > + dev_dbg(mci->dev, "%s: prop =3D %d\n", __func__, psp); > > drop this debug message. It's only useful during development. > ACK > > + switch (psp) { > > + case POWER_SUPPLY_PROP_ONLINE: > > + ret =3D mt6360_charger_set_online(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: > > + ret =3D mt6360_charger_set_ichg(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: > > + ret =3D mt6360_charger_set_cv(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: > > + ret =3D mt6360_charger_set_aicr(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: > > + ret =3D mt6360_charger_set_iprechg(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: > > + ret =3D mt6360_charger_set_ieoc(mci, val); > > + break; > > + default: > > + ret =3D -EINVAL; > > + } > > + return ret; > > +} > > + > > +static int mt6360_charger_property_is_writeable(struct power_supply *p= sy, > > + enum power_supply_property= psp) > > +{ > > + switch (psp) { > > + case POWER_SUPPLY_PROP_ONLINE: > > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: > > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: > > + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: > > + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: > > + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: > > + return 1; > > + default: > > + return 0; > > + } > > +} > > + > > +static enum power_supply_property mt6360_charger_properties[] =3D { > > + POWER_SUPPLY_PROP_ONLINE, > > + POWER_SUPPLY_PROP_STATUS, > > + POWER_SUPPLY_PROP_CHARGE_TYPE, > > + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, > > + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, > > + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, > > + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX, > > + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, > > + POWER_SUPPLY_PROP_PRECHARGE_CURRENT, > > + POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT, > > + POWER_SUPPLY_PROP_USB_TYPE, > > +}; > > + > > +static char *mt6360_charger_supplied_to[] =3D { > > + "main-battery" > > +}; > > + > > +static const struct power_supply_desc mt6360_charger_desc =3D { > > + .type =3D POWER_SUPPLY_TYPE_USB, > > + .properties =3D mt6360_charger_properties, > > + .num_properties =3D ARRAY_SIZE(mt6360_charger_properties)= , > > + .get_property =3D mt6360_charger_get_property, > > + .set_property =3D mt6360_charger_set_property, > > + .property_is_writeable =3D mt6360_charger_property_is_writeable, > > + .usb_types =3D mt6360_charger_usb_types, > > + .num_usb_types =3D ARRAY_SIZE(mt6360_charger_usb_types), > > +}; > > + > > +static const struct regulator_ops mt6360_chg_otg_ops =3D { > > + .list_voltage =3D regulator_list_voltage_linear, > > + .enable =3D regulator_enable_regmap, > > + .disable =3D regulator_disable_regmap, > > + .is_enabled =3D regulator_is_enabled_regmap, > > + .set_voltage_sel =3D regulator_set_voltage_sel_regmap, > > + .get_voltage_sel =3D regulator_get_voltage_sel_regmap, > > +}; > > + > > +static const struct regulator_desc mt6360_otg_rdesc =3D { > > + .of_match =3D "usb-otg-vbus", > > + .name =3D "usb-otg-vbus", > > + .ops =3D &mt6360_chg_otg_ops, > > + .owner =3D THIS_MODULE, > > + .type =3D REGULATOR_VOLTAGE, > > + .min_uV =3D 4425000, > > + .uV_step =3D 25000, > > + .n_voltages =3D 57, > > + .vsel_reg =3D MT6360_PMU_CHG_CTRL5, > > + .vsel_mask =3D MT6360_VOBST_MASK, > > + .enable_reg =3D MT6360_PMU_CHG_CTRL1, > > + .enable_mask =3D MT6360_OPA_MODE_MASK, > > +}; > > + > > +static irqreturn_t mt6360_pmu_attach_i_handler(int irq, void *data) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + int ret; > > + unsigned int usb_status; > > + int last_usb_type; > > + > > + dev_dbg(mci->dev, "%s\n", __func__); > > please change string to something more sensible to users debugging > problems without having read the driver code before, sth. like > "received attach interrupt". > ACK > > + mutex_lock(&mci->chgdet_lock); > > + if (!mci->bc12_en) { > > + dev_info(mci->dev, "%s: bc12 disabled, ignore irq\n", __f= unc__); > > + goto out; > > + } > > Why is this info level? I would expect it to be either debug or > warning/error. Also drop all those __func__ and provide proper > debug messages instead. > ACK > > + last_usb_type =3D mci->psy_usb_type; > > + /* Plug in */ > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_USB_STATUS1, &usb_sta= tus); > > + if (ret < 0) > > + goto out; > > + usb_status &=3D MT6360_USB_STATUS_MASK; > > + usb_status >>=3D MT6360_USB_STATUS_SHFT; > > + switch (usb_status) { > > + case MT6360_CHG_TYPE_UNDER_GOING: > > + dev_info(mci->dev, "%s: under going...\n", __func__); > > + goto out; > > IDK what this is supposed to tell me. Do you mean "detection in > progress"? Also why is this info level? I would expect either > debug (assuming it happens regularly and is normal) or warning > (assuming it should not happen). > When handling attach interrupt and cable plug out at the same time, HW change register status. So we don' need to handle this attach interrupt at this case. > > + case MT6360_CHG_TYPE_SDP: > > + mci->psy_usb_type =3D POWER_SUPPLY_USB_TYPE_SDP; > > + break; > > + case MT6360_CHG_TYPE_SDPNSTD: > > + mci->psy_usb_type =3D POWER_SUPPLY_USB_TYPE_SDP; > > + break; > > + case MT6360_CHG_TYPE_CDP: > > + mci->psy_usb_type =3D POWER_SUPPLY_USB_TYPE_CDP; > > + break; > > + case MT6360_CHG_TYPE_DCP: > > + mci->psy_usb_type =3D POWER_SUPPLY_USB_TYPE_DCP; > > + break; > > + default: > > + dev_warn(mci->dev, > > + "%s: disconnect or unknown status\n", __func__); > > So you are printing a warning on every disconnect? > Please do not spam device messages. > Fixed. Should be "unknown status", not "disconnect", which is undefined register value. > > + goto out; > > + } > > + > > + dev_info(mci->dev, "%s: chg_type =3D %d\n", __func__, mci->psy_us= b_type); > > This should be debug level. > ACK > > + if (last_usb_type !=3D mci->psy_usb_type) > > + power_supply_changed(mci->psy); > > +out: > > + mutex_unlock(&mci->chgdet_lock); > > + return IRQ_HANDLED; > > +} > > + > > +static void mt6360_handle_chrdet_ext_evt(struct mt6360_chg_info *mci) > > +{ > > + int ret; > > + bool pwr_rdy; > > + > > + mutex_lock(&mci->chgdet_lock); > > + ret =3D mt6360_get_chrdet_ext_stat(mci, &pwr_rdy); > > + if (ret < 0) > > + goto out; > > + if (mci->pwr_rdy =3D=3D pwr_rdy) { > > + dev_info(mci->dev, > > + "%s: pwr_rdy is same(%d)\n", __func__, pwr_rdy); > > + goto out; > > + } > > + mci->pwr_rdy =3D pwr_rdy; > > + dev_info(mci->dev, "%s: pwr_rdy =3D %d\n", __func__, pwr_rdy); > > + if (!pwr_rdy) { > > + mci->psy_usb_type =3D POWER_SUPPLY_USB_TYPE_UNKNOWN; > > + power_supply_changed(mci->psy); > > + > > + } > > + ret =3D regmap_update_bits(mci->regmap, > > + MT6360_PMU_DEVICE_TYPE, > > + MT6360_USBCHGEN_MASK, > > + pwr_rdy ? MT6360_USBCHGEN_MASK : 0); > > + if (ret < 0) > > + goto out; > > + mci->bc12_en =3D pwr_rdy; > > +out: > > + mutex_unlock(&mci->chgdet_lock); > > +} > > + > > +static void mt6360_chrdet_work(struct work_struct *work) > > +{ > > + struct mt6360_chg_info *mci =3D (struct mt6360_chg_info *)contain= er_of( > > + work, struct mt6360_chg_info, chrdet= _work); > > + > > + dev_info(mci->dev, "%s\n", __func__); > > + mt6360_handle_chrdet_ext_evt(mci); > > +} > > + > > +static irqreturn_t mt6360_pmu_chrdet_ext_evt_handler(int irq, void *da= ta) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + > > + dev_info(mci->dev, "%s\n", __func__); > > + mt6360_handle_chrdet_ext_evt(mci); > > + return IRQ_HANDLED; > > +} > > + > > +static int mt6360_chg_irq_register(struct platform_device *pdev) > > +{ > > + const struct { > > + const char *name; > > + irq_handler_t handler; > > + } irq_descs[] =3D { > > + { "attach_i", mt6360_pmu_attach_i_handler }, > > + { "chrdet_ext_evt", mt6360_pmu_chrdet_ext_evt_handler } > > + }; > > + int i, ret; > > + > > + for (i =3D 0; i < ARRAY_SIZE(irq_descs); i++) { > > + ret =3D platform_get_irq_byname(pdev, irq_descs[i].name); > > + if (ret < 0) > > + return ret; > > + > > + ret =3D devm_request_threaded_irq(&pdev->dev, ret, NULL, > > + irq_descs[i].handler, > > + IRQF_TRIGGER_FALLING, > > + irq_descs[i].name, > > + platform_get_drvdata(pdev= )); > > + if (ret < 0) { > > + dev_err(&pdev->dev, "Failed to request %s irq\n", > > + irq_descs[i].name); > > + return ret; > > + } > > + } > > + > > + return 0; > > +} > > + > > +struct mt6360_field_info { > > + struct device_attribute dev_attr; > > + u16 reg; > > + u8 mask; > > + u8 shft; > > +}; > > + > > +static ssize_t mt6360_sysfs_show(struct device *dev, > > + struct device_attribute *attr, char *buf); > > +static ssize_t mt6360_sysfs_store(struct device *dev, > > + struct device_attribute *attr, const char *buf, size_t co= unt); > > + > > +#define MT6360_FIELD_RW(_name, _reg, _nbit) \ > > +{ \ > > + .dev_attr =3D __ATTR(_name, 0664, \ > > + mt6360_sysfs_show, mt6360_sysfs_store), \ > > + .reg =3D MT6360_PMU_##_reg, \ > > + .mask =3D MT6360_##_nbit##_MASK, = \ > > + .shft =3D MT6360_##_nbit##_SHFT, = \ > > +} > > + > > +#define MT6360_FIELD_RO(_name, _reg, _nbit) \ > > +{ \ > > + .dev_attr =3D __ATTR(_name, 0444, \ > > + mt6360_sysfs_show, NULL), \ > > + .reg =3D MT6360_PMU_##_reg, \ > > + .mask =3D MT6360_##_nbit##_MASK, \ > > + .shft =3D MT6360_##_nbit##_SHFT, \ > > +} > > + > > +static struct mt6360_field_info mt6360_field_tbl[] =3D { > > + MT6360_FIELD_RW(hiz, CHG_CTRL1, HIZ), > > + MT6360_FIELD_RW(vmivr, CHG_CTRL6, VMIVR), > > + MT6360_FIELD_RW(iaicr, CHG_CTRL3, IAICR), > > + MT6360_FIELD_RW(SYSREG, CHG_CTRL11, SYSREG), > > + MT6360_FIELD_RW(otg_oc, CHG_CTRL10, OTG_OC), > > + MT6360_FIELD_RW(ichg, CHG_CTRL17, ICHG), > > + MT6360_FIELD_RW(iprec, CHG_CTRL8, IPREC), > > + MT6360_FIELD_RW(ieoc, CHG_CTRL9, IEOC), > > + MT6360_FIELD_RW(voreg, CHG_CTRL4, VOREG), > > + MT6360_FIELD_RW(lbp, CHG_CTRL10, LBP), > > + MT6360_FIELD_RW(vrec, CHG_CTRL11, VREC), > > + MT6360_FIELD_RW(te, CHG_CTRL2, TE), > > + MT6360_FIELD_RW(chg_wdt_en, CHG_CTRL13, CHG_WDT_EN), > > + MT6360_FIELD_RW(chg_wdt, CHG_CTRL13, CHG_WDT), > > + MT6360_FIELD_RW(wt_fc, CHG_CTRL12, WT_FC), > > + MT6360_FIELD_RW(bat_comp, CHG_CTRL18, BAT_COMP), > > + MT6360_FIELD_RW(vclamp, CHG_CTRL18, VCLAMP), > > + MT6360_FIELD_RW(usbchgen, DEVICE_TYPE, USBCHGEN), > > + MT6360_FIELD_RW(chg_en, CHG_CTRL2, CHG_EN), > > + MT6360_FIELD_RO(chrdet_ext, FOD_STAT, CHRDET_EXT), > > +}; > > + > > +static struct attribute *mt6360_attrs[ARRAY_SIZE(mt6360_field_tbl) + 1= ]; > > + > > +static const struct attribute_group mt6360_attr_group =3D { > > + .attrs =3D mt6360_attrs, > > +}; > > + > > +static ssize_t mt6360_sysfs_show(struct device *dev, > > + struct device_attribute *attr, char *buf= ) > > +{ > > + struct mt6360_chg_info *mci =3D dev_get_drvdata(dev->parent); > > + struct mt6360_field_info *info =3D (void *)attr; > > + unsigned int regval; > > + int ret; > > + > > + ret =3D regmap_read(mci->regmap, info->reg, ®val); > > + if (ret < 0) > > + return ret; > > + regval =3D (regval & info->mask) >> info->shft; > > + return scnprintf(buf, PAGE_SIZE, "%02x\n", regval); > > +} > > + > > +static ssize_t mt6360_sysfs_store(struct device *dev, > > + struct device_attribute *attr, const char *buf, size_t= count) > > +{ > > + struct mt6360_chg_info *mci =3D dev_get_drvdata(dev->parent); > > + struct mt6360_field_info *info =3D (void *)attr; > > + int ret, tmp; > > + > > + if (kstrtoint(buf, 10, &tmp) < 0) { > > + dev_err(dev, "Failed to parse number\n"); > > + return -EINVAL; > > + } > > + ret =3D regmap_update_bits(mci->regmap, > > + info->reg, info->mask, tmp << info->shft= ); > > + if (ret < 0) > > + return ret; > > + return count; > > +} > > + > > +static int mt6360_sysfs_create_group(struct mt6360_chg_info *mci) > > +{ > > + int i, tb_size =3D ARRAY_SIZE(mt6360_field_tbl); > > + > > + for (i =3D 0; i < tb_size; i++) > > + mt6360_attrs[i] =3D &(mt6360_field_tbl[i].dev_attr.attr); > > + return devm_device_add_group(&mci->psy->dev, &mt6360_attr_group); > > +} > > + > > +static int mt6360_chg_init_setting(struct mt6360_chg_info *mci) > > +{ > > + int ret; > > + > > + ret =3D regmap_update_bits(mci->regmap, MT6360_PMU_DEVICE_TYPE, > > + MT6360_USBCHGEN_MASK, 0); > > + if (ret < 0) { > > + dev_err(mci->dev, "%s: Failed to disable bc12\n", __func_= _); > > + goto out; > > + } > > + ret =3D regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL2, > > + MT6360_IINLMTSEL_MASK, > > + MT6360_IINLMTSEL_AICR << > > + MT6360_IINLMTSEL_SHFT); > > + if (ret < 0) { > > + dev_err(mci->dev, > > + "%s: Failed to switch iinlmtsel to aicr\n", __fun= c__); > > + goto out; > > + } > > + usleep_range(5000, 6000); > > + ret =3D regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL3, > > + MT6360_ILIM_EN_MASK, 0); > > + if (ret < 0) { > > + dev_err(mci->dev, > > + "%s: Failed to disable ilim\n", __func__); > > + goto out; > > + } > > + ret =3D regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL10, > > + MT6360_OTG_OC_MASK, MT6360_OTG_OC_MASK); > > + if (ret < 0) { > > + dev_err(mci->dev, > > + "%s: Failed to config otg oc to 3A\n", __func__); > > + } > > +out: > > + return ret; > > remove useless goto and return directly like this (without the > __func__ part): > > ret =3D regmap_update_bits(...); > if (ret < 0) > return dev_err_probe(mci->dev, ret, "Failed to do xyz!\n"). > ACK > > +} > > + > > +static u32 mt6360_vinovp_trans_to_sel(u32 val) > > +{ > > + u32 vinovp_tbl[] =3D { 5500000, 6500000, 11000000, 14500000 }; > > + int i; > > + > > + /* Select the smaller and equal supported value */ > > + for (i =3D 0; i < ARRAY_SIZE(vinovp_tbl)-1; i++) { > > + if (val < vinovp_tbl[i+1]) > > + break; > > + } > > + return i; > > +} > > + > > +static struct mt6360_chg_platform_data *mt6360_parse_pdata( > > + struct platform_device= *pdev) > > +{ > > + struct mt6360_chg_platform_data *pdata =3D dev_get_platdata(&pdev= ->dev); > > + struct device_node *np =3D pdev->dev.of_node; > > + int ret; > > + > > + pdata =3D kmemdup(&def_platform_data, sizeof(*pdata), GFP_KERNEL)= ; > > + ret =3D of_property_read_u32(np, "richtek,vinovp-microvolt", > > + &pdata->vinovp); > > use device_property_read_u32(); > ACK > > + if (ret) { > > + dev_err(&pdev->dev, "Failed to parse vinovp in DT\n"); > > + return ERR_PTR(ret); > > + } > > + return pdata; > > +} > > + > > +static int mt6360_apply_pdata(struct platform_device *pdev) > > +{ > > + struct mt6360_chg_platform_data *pdata =3D dev_get_platdata(&pdev= ->dev); > > + struct mt6360_chg_info *mci =3D dev_get_drvdata(&pdev->dev); > > + int ret; > > + u32 sel; > > + > > + sel =3D mt6360_vinovp_trans_to_sel(pdata->vinovp); > > + ret =3D regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL19, > > + MT6360_VINOVP_MASK, sel << MT6360_VINOVP= _SHFT); > > + if (ret) > > + return ret; > > + return 0; > > +} > > + > > +static int mt6360_charger_probe(struct platform_device *pdev) > > +{ > > + struct mt6360_chg_platform_data *pdata =3D dev_get_platdata(&pdev= ->dev); > > The value is unused, so init to NULL or not at all. > ACK > > + struct mt6360_chg_info *mci; > > + struct power_supply_config charger_cfg =3D {}; > > + struct regulator_config config =3D { }; > > + int ret; > > + > > + mci =3D devm_kzalloc(&pdev->dev, sizeof(*mci), GFP_KERNEL); > > + if (!mci) > > + return -ENOMEM; > > + > > + pdata =3D mt6360_parse_pdata(pdev); > > + if (IS_ERR_OR_NULL(pdata)) > > + return PTR_ERR(pdata); > > + > > + pdev->dev.platform_data =3D pdata; > > instead of all this code for a single variable, just store it > directly into struct mt6360_chg_info and drop all that > platform_data code. Also no need to move it into extra function: > > mci->vinovp =3D 6500000; > device_property_read_u32(&pdev->dev, "richtek,vinovp-microvolt", &mci->vi= novp); > ACK > > + mci->dev =3D &pdev->dev; > > + mutex_init(&mci->chgdet_lock); > > + platform_set_drvdata(pdev, mci); > > + INIT_WORK(&mci->chrdet_work, &mt6360_chrdet_work); > > + > > + mci->regmap =3D dev_get_regmap(pdev->dev.parent, NULL); > > + if (!mci->regmap) { > > + dev_err(&pdev->dev, "Failed to get parent regmap\n"); > > + return -ENODEV; > > + } > > use 'return dev_err_probe(&pdev->dev, -ENODEV, "..."); > ACK > > + ret =3D mt6360_apply_pdata(pdev); > > + if (ret) { > > + dev_err(&pdev->dev, "Failed to apply pdata\n"); > > + return ret; > > + } > > use 'return dev_err_probe(&pdev->dev, ret, "..."); > > Also can this function be folded into mt6360_chg_init_setting()? > ACK > > + memcpy(&mci->psy_desc, &mt6360_charger_desc, sizeof(mci->psy_desc= )); > > + mci->psy_desc.name =3D dev_name(&pdev->dev); > > + charger_cfg.drv_data =3D mci; > > + charger_cfg.of_node =3D pdev->dev.of_node; > > + charger_cfg.supplied_to =3D mt6360_charger_supplied_to; > > + charger_cfg.num_supplicants =3D ARRAY_SIZE(mt6360_charger_supplie= d_to); > > why do you need to provide supplied_to? this should be generated > automatically from devicetree. > ACK > > + mci->psy =3D devm_power_supply_register(&pdev->dev, > > + &mci->psy_desc, &charger_cf= g); > > + if (IS_ERR(mci->psy)) { > > + dev_err(&pdev->dev, "Failed to register power supply dev\= n"); > > + return PTR_ERR(mci->psy); > > + } > > dev_err_probe() > ACK > > + > > + ret =3D mt6360_chg_init_setting(mci); > > + if (ret) { > > + dev_err(&pdev->dev, "Failed to initial setting\n"); > > + return ret; > > + } > > dev_err_probe() > > > + schedule_work(&mci->chrdet_work); > ACK > considering work is only scheduled once in this place, why do you > need it? can't you simply call mt6360_handle_chrdet_ext_evt() here > and remove all worker related code? > > > + ret =3D mt6360_chg_irq_register(pdev); > > + if (ret) { > > + dev_err(&pdev->dev, "Failed to register irqs\n"); > > + return ret; > > + } > > dev_err_probe(); > ACK > > + config.dev =3D &pdev->dev; > > + config.regmap =3D mci->regmap; > > + mci->otg_rdev =3D devm_regulator_register(&pdev->dev, &mt6360_otg= _rdesc, > > + &config); > > + if (IS_ERR(mci->otg_rdev)) > > + return PTR_ERR(mci->otg_rdev); > > + > > + ret =3D mt6360_sysfs_create_group(mci); > > + if (ret) { > > + dev_err(&pdev->dev, > > + "%s: Failed to create sysfs attrs\n", __func__); > > + return ret; > > + } > > Use charger_cfg.attr_grp to register custom sysfs group for > power-supply devices. Otherwise your code is racy (udev may not pick > up the sysfs attributes). Also custom sysfs attributes need to be > documented in Documentation/ABI/testing/sysfs-class-power-. > > Looking at the attributes you are planning to expose, I don't think they > are suitable for sysfs anyways. Looks more like a debug interface, which > should go into debugfs instead. But it's hard to tell without any documen= tation > being provided :) > ACK, I will change to charger_cfg.attr_grp. I assumed the charger algorithm thread is in user space, and take control by sysfs node from charger device, like bq24190.c. Should I change to debugfs? > > + return 0; > > +} > > + > > +static const struct of_device_id __maybe_unused mt6360_charger_of_id[]= =3D { > > + { .compatible =3D "mediatek,mt6360-chg", }, > > + {}, > > +}; > > +MODULE_DEVICE_TABLE(of, mt6360_charger_of_id); > > + > > +static const struct platform_device_id mt6360_charger_id[] =3D { > > + { "mt6360-chg", 0 }, > > + {}, > > +}; > > +MODULE_DEVICE_TABLE(platform, mt6360_charger_id); > > + > > +static struct platform_driver mt6360_charger_driver =3D { > > + .driver =3D { > > + .name =3D "mt6360-chg", > > + .of_match_table =3D of_match_ptr(mt6360_charger_of_id), > > + }, > > + .probe =3D mt6360_charger_probe, > > + .id_table =3D mt6360_charger_id, > > +}; > > +module_platform_driver(mt6360_charger_driver); > > + > > +MODULE_AUTHOR("CY_Huang "); > > Can you fix the name? Also it differs from you, but I do not see any > extra Signed-off-by line? > ACK > Thanks, > > -- Sebastian > > > +MODULE_DESCRIPTION("MT6360 Charger Driver"); > > +MODULE_LICENSE("GPL"); > > -- > > 2.7.4 > > 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 X-Spam-Level: X-Spam-Status: No, score=-10.7 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 98499C433E0 for ; Mon, 11 Jan 2021 12:16:07 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 09028221E3 for ; Mon, 11 Jan 2021 12:16:06 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 09028221E3 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=Keg7MZA0DZVloL42LCqd4iK/lxXOA10zlhQ4JzXSIQA=; b=3Dqyt2RxVwrxiU1TF73rM4RPp FucKg0oQip6ZfHGUVjAANdE/LRa5b0TzjxsGdEiBv275BWp/HERlHT8GW+kwhE7Q8lqShzAqS5ysx Yxs+ybPYylaD3TMOe+mdWG746qBtAzaRehBXbe8TGBr95lCMr+sIYEqKHsuVyXE97m5gpE6z0Vn2G Y5DeufrDXUN2Cm6/0uFusXzAV1nTQ5d2ioURzOH7w1wig4en1xvHiliup7Is+mXRA1G+Fa9bhRIcl k3sbQpInRQnpX3RSK1Tbl3XAUCBk99xrrJ3imT7hcFj2qywudzc4q1te810lvaog3OgyVgYX1tvsr BWpkxGqMg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kyw6z-0000DU-6T; Mon, 11 Jan 2021 12:15:53 +0000 Received: from mail-oi1-x231.google.com ([2607:f8b0:4864:20::231]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kyw6t-0000CX-74; Mon, 11 Jan 2021 12:15:49 +0000 Received: by mail-oi1-x231.google.com with SMTP id w124so19900145oia.6; Mon, 11 Jan 2021 04:15:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=DDttZIjQaPrl98+NPurBcwGDVkZUdgP5hs24HQyiA5s=; b=dd8nTqbOjoR0C3qASa7KKTPhrOX71HO8p2f7IeTyLoeSYmQnTnyCZKS9Dmoet8jSPO 3W3yAyAkcc92Vm9l3h5YY9bohm5Cxh4AG1oeFkzbapMSYgw0/N/6xp6V30vtMCgfMsyB P8Baf8bhcTTmq7XKh482ZwSKCG0ddsouaQvTeT4IrhrxLQN9njWj9mj9ud26b00Ud8DS tR/zMRp91IF2FLa8AomY96zBapnH4NNOGxMjJ+8WjdJTPHSMHk3Gw0X7Hvp61Ujawlr6 ah5/nhSdtNXXuNv4wG6NUqKQdLMsGyihPGZhIWSSAevKfR0fosLw9tPpa7ISp7Bf9i1t 8FXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=DDttZIjQaPrl98+NPurBcwGDVkZUdgP5hs24HQyiA5s=; b=OafnJDp+rSbr34DbHO5qBpbhPXkFZcttWjo0I5Z3GKa/uWOMGsyZx+zzVutwqvQTZV J8oguLmq9EkjtlO89WxOhLz2i9e6TYwSh0qEvp+XXJtpVsXx3s2sThHdQTwPDmeNw3nk NCVAy+fyr11nrCIb4bmpf7X1xbGzc8DkPKWeanbEPDHyOQLYXQ+LEu8IslJ7HVM1R38j 786UGPy4PQZlEprEDz7oJqXQnu9vgBxz6VWt38BdNCQgAm9G9RP84sS2/MO79lWk1NTr ijJpiHA4UXLdXh5QdMRGNvhZAfldmalzcAMTbQkgNWMn3bkY3gEbwfP99RA6G7x0zTMe XqtA== X-Gm-Message-State: AOAM533mia9uRZoA7A1JfGnMV4Zym1p3mXnGFilyzwuu01Q45MUfZVI2 aKqyhYrt73Hcu39goqnFbAzHzjZ7f0nvDPws5ak= X-Google-Smtp-Source: ABdhPJzxbmGT1NKfvCOwSLX1JXeKLs7aoHkUMJNne6zceIcP7+tnM9zvg9KKVlHst1eb/ro9nl2tU6Jg9zpfwcoun0U= X-Received: by 2002:aca:3554:: with SMTP id c81mr9927093oia.23.1610367344755; Mon, 11 Jan 2021 04:15:44 -0800 (PST) MIME-Version: 1.0 References: <1608796084-29418-1-git-send-email-gene.chen.richtek@gmail.com> <1608796084-29418-3-git-send-email-gene.chen.richtek@gmail.com> <20210106201654.lkmqorlgcecgqqkf@earth.universe> In-Reply-To: <20210106201654.lkmqorlgcecgqqkf@earth.universe> From: Gene Chen Date: Mon, 11 Jan 2021 20:15:33 +0800 Message-ID: Subject: Re: [PATCH v3 2/2] power: supply: mt6360_charger: add MT6360 charger support To: Sebastian Reichel X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210111_071547_331950_22770700 X-CRM114-Status: GOOD ( 31.24 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gene Chen , devicetree , linux-pm@vger.kernel.org, Linux Kernel Mailing List , cy_huang@richtek.com, benjamin.chao@mediatek.com, Rob Herring , "moderated list:ARM/Mediatek SoC support" , Matthias Brugger , Wilma.Wu@mediatek.com, linux-arm Mailing List , shufan_lee@richtek.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org U2ViYXN0aWFuIFJlaWNoZWwgPHNlYmFzdGlhbi5yZWljaGVsQGNvbGxhYm9yYS5jb20+IOaWvCAy MDIx5bm0MeaciDfml6Ug6YCx5ZubIOS4iuWNiDQ6MTblr6vpgZPvvJoKPgo+IEhpIEdlbmUsCj4K PiBJIGhhdmUgYSBidW5jaCBvZiBjb21tZW50cywgcGxlYXNlIHRha2UgYSBsb29rIGF0IG15IGlu bGluZQo+IGNvbW1lbnRzLgo+Cj4gT24gVGh1LCBEZWMgMjQsIDIwMjAgYXQgMDM6NDg6MDRQTSAr MDgwMCwgR2VuZSBDaGVuIHdyb3RlOgo+ID4gRnJvbTogR2VuZSBDaGVuIDxnZW5lX2NoZW5Acmlj aHRlay5jb20+Cj4gPgo+ID4gQWRkIGJhc2ljIHN1cHBvcnQgZm9yIHRoZSBiYXR0ZXJ5IGNoYXJn ZXIgZm9yIE1UNjM2MCBQTUlDCj4gPgo+ID4gU2lnbmVkLW9mZi1ieTogR2VuZSBDaGVuIDxnZW5l X2NoZW5AcmljaHRlay5jb20+Cj4gPiAtLS0KPiA+ICBkcml2ZXJzL3Bvd2VyL3N1cHBseS9LY29u ZmlnICAgICAgICAgIHwgICAxMCArCj4gPiAgZHJpdmVycy9wb3dlci9zdXBwbHkvTWFrZWZpbGUg ICAgICAgICB8ICAgIDEgKwo+ID4gIGRyaXZlcnMvcG93ZXIvc3VwcGx5L210NjM2MF9jaGFyZ2Vy LmMgfCAxMDU0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ID4gIDMgZmlsZXMg Y2hhbmdlZCwgMTA2NSBpbnNlcnRpb25zKCspCj4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZl cnMvcG93ZXIvc3VwcGx5L210NjM2MF9jaGFyZ2VyLmMKPiA+Cj4gPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9wb3dlci9zdXBwbHkvS2NvbmZpZyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L0tjb25maWcK PiA+IGluZGV4IGVlYzY0NmMuLmRkNjNiZWQgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL3Bvd2Vy L3N1cHBseS9LY29uZmlnCj4gPiArKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9LY29uZmlnCj4g PiBAQCAtNTY3LDYgKzU2NywxNiBAQCBjb25maWcgQ0hBUkdFUl9NUDI2MjkKPiA+ICAgICAgICAg QmF0dGVyeSBjaGFyZ2VyLiBUaGlzIGRyaXZlciBwcm92aWRlcyBCYXR0ZXJ5IGNoYXJnZXIgcG93 ZXIgbWFuYWdlbWVudAo+ID4gICAgICAgICBmdW5jdGlvbnMgb24gdGhlIHN5c3RlbXMuCj4gPgo+ ID4gK2NvbmZpZyBDSEFSR0VSX01UNjM2MAo+ID4gKyAgICAgdHJpc3RhdGUgIk1lZGlhdGVrIE1U NjM2MCBDaGFyZ2VyIERyaXZlciIKPiA+ICsgICAgIGRlcGVuZHMgb24gTUZEX01UNjM2MAo+ID4g KyAgICAgZGVwZW5kcyBvbiBSRUdVTEFUT1IKPiA+ICsgICAgIGhlbHAKPiA+ICsgICAgICAgU2F5 IFkgaGVyZSB0byBlbmFibGUgTVQ2MzYwIENoYXJnZXIgUGFydC4KPiA+ICsgICAgICAgVGhlIGRl dmljZSBzdXBwb3J0cyBIaWdoLUFjY3VyYWN5IFZvbHRhZ2UvQ3VycmVudCBSZWd1bGF0aW9uLAo+ ID4gKyAgICAgICBBdmVyYWdlIElucHV0IEN1cnJlbnQgUmVndWxhdGlvbiwgQmF0dGVyeSBUZW1w YXR1cmUgU2Vuc2luZywKPiA+ICsgICAgICAgT3Zlci1UZW1wZXJhdHVyZSBQcm90ZWN0aW9uLCBE UERNIERldGVjdGlvbiBmb3IgQkMxLjIKPiA+ICsKPiA+ICBjb25maWcgQ0hBUkdFUl9RQ09NX1NN QkIKPiA+ICAgICAgIHRyaXN0YXRlICJRdWFsY29tbSBTd2l0Y2gtTW9kZSBCYXR0ZXJ5IENoYXJn ZXIgYW5kIEJvb3N0Igo+ID4gICAgICAgZGVwZW5kcyBvbiBNRkRfU1BNSV9QTUlDIHx8IENPTVBJ TEVfVEVTVAo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L01ha2VmaWxlIGIv ZHJpdmVycy9wb3dlci9zdXBwbHkvTWFrZWZpbGUKPiA+IGluZGV4IGRkNGI4NjMuLjliZDA4MDQg MTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9NYWtlZmlsZQo+ID4gKysrIGIv ZHJpdmVycy9wb3dlci9zdXBwbHkvTWFrZWZpbGUKPiA+IEBAIC03Nyw2ICs3Nyw3IEBAIG9iai0k KENPTkZJR19DSEFSR0VSX01BWDc3NjkzKSAgICAgICs9IG1heDc3NjkzX2NoYXJnZXIubwo+ID4g IG9iai0kKENPTkZJR19DSEFSR0VSX01BWDg5OTcpICAgICAgICArPSBtYXg4OTk3X2NoYXJnZXIu bwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX01BWDg5OTgpICAgICAgICArPSBtYXg4OTk4X2No YXJnZXIubwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX01QMjYyOSkgKz0gbXAyNjI5X2NoYXJn ZXIubwo+ID4gK29iai0kKENPTkZJR19DSEFSR0VSX01UNjM2MCkgKz0gbXQ2MzYwX2NoYXJnZXIu bwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX1FDT01fU01CQikgICAgICArPSBxY29tX3NtYmIu bwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX0JRMjQxNVgpICAgICAgICArPSBicTI0MTV4X2No YXJnZXIubwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX0JRMjQxOTApICAgICAgICArPSBicTI0 MTkwX2NoYXJnZXIubwo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L210NjM2 MF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9tdDYzNjBfY2hhcmdlci5jCj4gPiBu ZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXggMDAwMDAwMC4uZjFkY2I5Nwo+ID4gLS0tIC9k ZXYvbnVsbAo+ID4gKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvbXQ2MzYwX2NoYXJnZXIuYwo+ ID4gQEAgLTAsMCArMSwxMDU0IEBACj4gPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQ TC0yLjAKPiA+ICsvKgo+ID4gKyAqIENvcHlyaWdodCAoYykgMjAxOSBNZWRpYVRlayBJbmMuCj4K PiAyMDE5LTIwMjE/IDopCj4KCkFDSwoKPiA+ICsgKi8KPiA+ICsKPiA+ICsjaW5jbHVkZSA8bGlu dXgvaW5pdC5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiA+ICsjaW5jbHVkZSA8 bGludXgva2VybmVsLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgo+ID4gKyNpbmNs dWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4K Pgo+IGNoYW5nZSBvZi5oIHRvIDxsaW51eC9wcm9wZXJ0eS5oPiBhZnRlciBpbXBsZW1lbnRpbmcg bXkgbGF0ZXIKPiBjaGFuZ2UgcmVxdWVzdC4KPgoKQUNLCgo+ID4gKyNpbmNsdWRlIDxsaW51eC9p bnRlcnJ1cHQuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+Cj4gPiArI2lu Y2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KPiA+ICsKPiA+ICsjZGVmaW5lIE1UNjM2 MF9QTVVfQ0hHX0NUUkwxIDB4MzExCj4gPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19DVFJMMiAw eDMxMgo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDMgMHgzMTMKPiA+ICsjZGVmaW5l IE1UNjM2MF9QTVVfQ0hHX0NUUkw0IDB4MzE0Cj4gPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19D VFJMNSAweDMxNQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDYgMHgzMTYKPiA+ICsj ZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkw3IDB4MzE3Cj4gPiArI2RlZmluZSBNVDYzNjBfUE1V X0NIR19DVFJMOCAweDMxOAo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDkgMHgzMTkK PiA+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkwxMCAgICAgICAgMHgzMUEKPiA+ICsjZGVm aW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkwxMSAgICAgICAgMHgzMUIKPiA+ICsjZGVmaW5lIE1UNjM2 MF9QTVVfQ0hHX0NUUkwxMiAgICAgICAgMHgzMUMKPiA+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hH X0NUUkwxMyAgICAgICAgMHgzMUQKPiA+ICsjZGVmaW5lIE1UNjM2MF9QTVVfREVWSUNFX1RZUEUg ICAgICAgMHgzMjIKPiA+ICsjZGVmaW5lIE1UNjM2MF9QTVVfVVNCX1NUQVRVUzEgICAgICAgMHgz MjcKPiA+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkwxNyAgICAgICAgMHgzMkIKPiA+ICsj ZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkwxOCAgICAgICAgMHgzMkMKPiA+ICsjZGVmaW5lIE1U NjM2MF9QTVVfQ0hHX1NUQVQgIDB4MzRBCj4gPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19DVFJM MTkgICAgICAgIDB4MzYxCj4gPiArI2RlZmluZSBNVDYzNjBfUE1VX0ZPRF9TVEFUICAweDNFNwo+ ID4gKwo+ID4gKy8qIE1UNjM2MF9QTVVfQ0hHX0NUUkwxICovCj4gPiArI2RlZmluZSBNVDYzNjBf RlNMUF9TSEZUICAgICAoMykKPiA+ICsjZGVmaW5lIE1UNjM2MF9GU0xQX01BU0sgICAgIEJJVChN VDYzNjBfRlNMUF9TSEZUKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX0hJWl9TSEZUICAgICAgICAgICAg ICAoMikKPiA+ICsjZGVmaW5lIE1UNjM2MF9ISVpfTUFTSyAgICAgICAgICAgICAgQklUKE1UNjM2 MF9ISVpfU0hGVCkKPiA+ICsjZGVmaW5lIE1UNjM2MF9PUEFfTU9ERV9TSEZUICgwKQo+ID4gKyNk ZWZpbmUgTVQ2MzYwX09QQV9NT0RFX01BU0sgQklUKE1UNjM2MF9PUEFfTU9ERV9TSEZUKQo+ID4g Ky8qIE1UNjM2MF9QTVVfQ0hHX0NUUkwyICovCj4gPiArI2RlZmluZSBNVDYzNjBfVEVfU0hGVCAg ICAgICAgICAgICAgICg0KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1RFX01BU0sgICAgICAgICAgICAg ICBCSVQoTVQ2MzYwX1RFX1NIRlQpCj4gPiArI2RlZmluZSBNVDYzNjBfSUlOTE1UU0VMX1NIRlQg ICAgICAgICgyKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX0lJTkxNVFNFTF9NQVNLICAgICAgICBHRU5N QVNLKDMsIDIpCj4gPiArI2RlZmluZSBNVDYzNjBfQ0hHX0VOX1NIRlQgICAoMCkKPiA+ICsjZGVm aW5lIE1UNjM2MF9DSEdfRU5fTUFTSyAgIEJJVChNVDYzNjBfQ0hHX0VOX1NIRlQpCj4gPiArLyog TVQ2MzYwX1BNVV9DSEdfQ1RSTDMgKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9JQUlDUl9TSEZUICAg ICgyKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX0lBSUNSX01BU0sgICAgR0VOTUFTSyg3LCAyKQo+ID4g KyNkZWZpbmUgTVQ2MzYwX0lMSU1fRU5fTUFTSyAgQklUKDApCj4gPiArLyogTVQ2MzYwX1BNVV9D SEdfQ1RSTDQgKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9WT1JFR19TSEZUICAgICgxKQo+ID4gKyNk ZWZpbmUgTVQ2MzYwX1ZPUkVHX01BU0sgICAgR0VOTUFTSyg3LCAxKQo+ID4gKy8qIE1UNjM2MF9Q TVVfQ0hHX0NUUkw1ICovCj4gPiArI2RlZmluZSBNVDYzNjBfVk9CU1RfTUFTSyAgICBHRU5NQVNL KDcsIDIpCj4gPiArLyogTVQ2MzYwX1BNVV9DSEdfQ1RSTDYgKi8KPiA+ICsjZGVmaW5lIE1UNjM2 MF9WTUlWUl9TSEZUICAgICgxKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1ZNSVZSX01BU0sgICAgR0VO TUFTSyg3LCAxKQo+ID4gKy8qIE1UNjM2MF9QTVVfQ0hHX0NUUkw3ICovCj4gPiArI2RlZmluZSBN VDYzNjBfSUNIR19TSEZUICAgICAoMikKPiA+ICsjZGVmaW5lIE1UNjM2MF9JQ0hHX01BU0sgICAg IEdFTk1BU0soNywgMikKPiA+ICsvKiBNVDYzNjBfUE1VX0NIR19DVFJMOCAqLwo+ID4gKyNkZWZp bmUgTVQ2MzYwX0lQUkVDX1NIRlQgICAgKDApCj4gPiArI2RlZmluZSBNVDYzNjBfSVBSRUNfTUFT SyAgICBHRU5NQVNLKDMsIDApCj4gPiArLyogTVQ2MzYwX1BNVV9DSEdfQ1RSTDkgKi8KPiA+ICsj ZGVmaW5lIE1UNjM2MF9JRU9DX1NIRlQgICAgICg0KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX0lFT0Nf TUFTSyAgICAgR0VOTUFTSyg3LCA0KQo+ID4gKy8qIE1UNjM2MF9QTVVfQ0hHX0NUUkwxMCAqLwo+ ID4gKyNkZWZpbmUgTVQ2MzYwX0xCUF9TSEZUICAgICAgICAgICAgICAoNCkKPiA+ICsjZGVmaW5l IE1UNjM2MF9MQlBfTUFTSyAgICAgICAgICAgICAgR0VOTUFTSyg3LCA0KQo+ID4gKyNkZWZpbmUg TVQ2MzYwX09UR19PQ19TSEZUICAgKDApCj4gPiArI2RlZmluZSBNVDYzNjBfT1RHX09DX01BU0sg ICBHRU5NQVNLKDMsIDApCj4gPiArLyogTVQ2MzYwX1BNVV9DSEdfQ1RSTDExICovCj4gPiArI2Rl ZmluZSBNVDYzNjBfU1lTUkVHX1NIRlQgICAoMikKPiA+ICsjZGVmaW5lIE1UNjM2MF9TWVNSRUdf TUFTSyAgIEdFTk1BU0soNCwgMikKPiA+ICsjZGVmaW5lIE1UNjM2MF9WUkVDX1NIRlQgICAgICgw KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1ZSRUNfTUFTSyAgICAgR0VOTUFTSygyLCAwKQo+ID4gKy8q IE1UNjM2MF9QTVVfQ0hHX0NUUkwxMiAqLwo+ID4gKyNkZWZpbmUgTVQ2MzYwX1dUX0ZDX1NIRlQg ICAgKDUpCj4gPiArI2RlZmluZSBNVDYzNjBfV1RfRkNfTUFTSyAgICBHRU5NQVNLKDcsIDUpCj4g PiArLyogTVQ2MzYwX1BNVV9DSEdfQ1RSTDEzICovCj4gPiArI2RlZmluZSBNVDYzNjBfQ0hHX1dE VF9FTl9TSEZUICAgICAgICg3KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX0NIR19XRFRfRU5fTUFTSyAg ICAgICBCSVQoTVQ2MzYwX0NIR19XRFRfRU5fU0hGVCkKPiA+ICsjZGVmaW5lIE1UNjM2MF9DSEdf V0RUX1NIRlQgICg0KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX0NIR19XRFRfTUFTSyAgR0VOTUFTSyg1 LCA0KQo+ID4gKy8qIE1UNjM2MF9QTVVfREVWSUNFX1RZUEUgKi8KPiA+ICsjZGVmaW5lIE1UNjM2 MF9VU0JDSEdFTl9TSEZUICg3KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1VTQkNIR0VOX01BU0sgQklU KE1UNjM2MF9VU0JDSEdFTl9TSEZUKQo+ID4gKy8qIE1UNjM2MF9QTVVfVVNCX1NUQVRVUzEgKi8K PiA+ICsjZGVmaW5lIE1UNjM2MF9VU0JfU1RBVFVTX1NIRlQgICAgICAgKDQpCj4gPiArI2RlZmlu ZSBNVDYzNjBfVVNCX1NUQVRVU19NQVNLICAgICAgIEdFTk1BU0soNiwgNCkKPiA+ICsvKiBNVDYz NjBfUE1VX0NIR19DVFJMMTggKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9CQVRfQ09NUF9TSEZUICgz KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX0JBVF9DT01QX01BU0sgR0VOTUFTSyg1LCAzKQo+ID4gKyNk ZWZpbmUgTVQ2MzYwX1ZDTEFNUF9TSEZUICAgKDApCj4gPiArI2RlZmluZSBNVDYzNjBfVkNMQU1Q X01BU0sgICBHRU5NQVNLKDIsIDApCj4gPiArLyogTVQ2MzYwX1BNVV9DSEdfU1RBVCAqLwo+ID4g KyNkZWZpbmUgTVQ2MzYwX0NIR19TVEFUX1NIRlQgKDYpCj4gPiArI2RlZmluZSBNVDYzNjBfQ0hH X1NUQVRfTUFTSyBHRU5NQVNLKDcsIDYpCj4gPiArI2RlZmluZSBNVDYzNjBfVkJBVF9MVkxfTUFT SyBCSVQoNSkKPiA+ICsvKiBNVDYzNjBfUE1VX0NIR19DVFJMMTkgKi8KPiA+ICsjZGVmaW5lIE1U NjM2MF9WSU5PVlBfU0hGVCAgICg1KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1ZJTk9WUF9NQVNLICAg R0VOTUFTSyg2LCA1KQo+ID4gKy8qIE1UNjM2MF9QTVVfRk9EX1NUQVQgKi8KPiA+ICsjZGVmaW5l IE1UNjM2MF9DSFJERVRfRVhUX1NIRlQgICAgICAgKDQpCj4gPiArI2RlZmluZSBNVDYzNjBfQ0hS REVUX0VYVF9NQVNLICAgICAgIEJJVCg0KQo+ID4gKwo+ID4gKy8qIHVBICovCj4gPiArI2RlZmlu ZSBNVDYzNjBfSUNIR19NSU4gICAgICAgICAgICAgIDEwMDAwMAo+ID4gKyNkZWZpbmUgTVQ2MzYw X0lDSEdfTUFYICAgICAgICAgICAgICA1MDAwMDAwCj4gPiArI2RlZmluZSBNVDYzNjBfSUNIR19T VEVQICAgICAxMDAwMDAKPiA+ICsvKiB1ViAqLwo+ID4gKyNkZWZpbmUgTVQ2MzYwX1ZPUkVHX01J TiAgICAgMzkwMDAwMAo+ID4gKyNkZWZpbmUgTVQ2MzYwX1ZPUkVHX01BWCAgICAgNDcxMDAwMAo+ ID4gKyNkZWZpbmUgTVQ2MzYwX1ZPUkVHX1NURVAgICAgMTAwMDAKPiA+ICsvKiB1QSAqLwo+ID4g KyNkZWZpbmUgTVQ2MzYwX0FJQ1JfTUlOICAgICAgICAgICAgICAxMDAwMDAKPiA+ICsjZGVmaW5l IE1UNjM2MF9BSUNSX01BWCAgICAgICAgICAgICAgMzI1MDAwMAo+ID4gKyNkZWZpbmUgTVQ2MzYw X0FJQ1JfU1RFUCAgICAgNTAwMDAKPiA+ICsvKiB1QSAqLwo+ID4gKyNkZWZpbmUgTVQ2MzYwX0lQ UkVDX01JTiAgICAgMTAwMDAwCj4gPiArI2RlZmluZSBNVDYzNjBfSVBSRUNfTUFYICAgICA4NTAw MDAKPiA+ICsjZGVmaW5lIE1UNjM2MF9JUFJFQ19TVEVQICAgIDUwMDAwCj4gPiArLyogdUEgKi8K PiA+ICsjZGVmaW5lIE1UNjM2MF9JRU9DX01JTiAgICAgICAgICAgICAgMTAwMDAwCj4gPiArI2Rl ZmluZSBNVDYzNjBfSUVPQ19NQVggICAgICAgICAgICAgIDg1MDAwMAo+ID4gKyNkZWZpbmUgTVQ2 MzYwX0lFT0NfU1RFUCAgICAgNTAwMDAKPiA+ICsKPiA+ICtzdHJ1Y3QgbXQ2MzYwX2NoZ19wbGF0 Zm9ybV9kYXRhIHsKPiA+ICsgICAgIHUzMiB2aW5vdnA7Cj4gPiArfTsKPgo+IEkgdGhpbmsgaXQn cyBwb2ludGxlc3MgdG8gaGF2ZSB0aGUgcGxhdGZvcm1fZGF0YSBzdHJ1Y3QuCj4gTW9yZSBhYm91 dCB0aGF0IGxhdGVyLgo+CgpBQ0ssIEkgd2lsbCBmaXggaXQgYXMgYmVsb3cgc3VnZ2VzdGlvbi4K Cj4gPiArc3RydWN0IG10NjM2MF9jaGdfaW5mbyB7Cj4gPiArICAgICBzdHJ1Y3QgZGV2aWNlICpk ZXY7Cj4gPiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKPiA+ ICsgICAgIHN0cnVjdCByZWdtYXAgKnJlZ21hcDsKPiA+ICsgICAgIHN0cnVjdCBwb3dlcl9zdXBw bHlfZGVzYyBwc3lfZGVzYzsKPiA+ICsgICAgIHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeTsKPiA+ ICsgICAgIHN0cnVjdCByZWd1bGF0b3JfZGV2ICpvdGdfcmRldjsKPiA+ICsgICAgIHN0cnVjdCBt dXRleCBjaGdkZXRfbG9jazsKPiA+ICsgICAgIGJvb2wgcHdyX3JkeTsKPiA+ICsgICAgIGJvb2wg YmMxMl9lbjsKPiA+ICsgICAgIGludCBwc3lfdXNiX3R5cGU7Cj4gPiArICAgICBzdHJ1Y3Qgd29y a19zdHJ1Y3QgY2hyZGV0X3dvcms7Cj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IG10 NjM2MF9jaGdfcGxhdGZvcm1fZGF0YSBkZWZfcGxhdGZvcm1fZGF0YSA9IHsKPiA+ICsgICAgIC52 aW5vdnAgPSA2NTAwMDAwLAo+ID4gK307Cj4gPiArCj4gPiArZW51bSBtdDYzNjBfaWlubG10c2Vs IHsKPiA+ICsgICAgIE1UNjM2MF9JSU5MTVRTRUxfQUlDUl8zMjUwID0gMCwKPiA+ICsgICAgIE1U NjM2MF9JSU5MTVRTRUxfQ0hHX1RZUEUsCj4gPiArICAgICBNVDYzNjBfSUlOTE1UU0VMX0FJQ1Is Cj4gPiArICAgICBNVDYzNjBfSUlOTE1UU0VMX0xPV0VSX0xFVkVMLAo+ID4gK307Cj4gPiArCj4g PiArZW51bSBtdDYzNjBfcG11X2NoZ190eXBlIHsKPiA+ICsgICAgIE1UNjM2MF9DSEdfVFlQRV9O T1ZCVVMgPSAwLAo+ID4gKyAgICAgTVQ2MzYwX0NIR19UWVBFX1VOREVSX0dPSU5HLAo+ID4gKyAg ICAgTVQ2MzYwX0NIR19UWVBFX1NEUCwKPiA+ICsgICAgIE1UNjM2MF9DSEdfVFlQRV9TRFBOU1RE LAo+ID4gKyAgICAgTVQ2MzYwX0NIR19UWVBFX0RDUCwKPiA+ICsgICAgIE1UNjM2MF9DSEdfVFlQ RV9DRFAsCj4gPiArICAgICBNVDYzNjBfQ0hHX1RZUEVfTUFYLAo+ID4gK307Cj4gPiArCj4gPiAr c3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3VzYl90eXBlIG10NjM2MF9jaGFyZ2VyX3VzYl90eXBl c1tdID0gewo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1VTQl9UWVBFX1VOS05PV04sCj4gPiArICAg ICBQT1dFUl9TVVBQTFlfVVNCX1RZUEVfU0RQLAo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1VTQl9U WVBFX0RDUCwKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9DRFAsCj4gPiArICAgICBQ T1dFUl9TVVBQTFlfVVNCX1RZUEVfQywKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9Q RCwKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9QRF9EUlAsCj4gPiArICAgICBQT1dF Ul9TVVBQTFlfVVNCX1RZUEVfQVBQTEVfQlJJQ0tfSUQKPgo+IGRyaXZlci9oYXJkd2FyZSBkb2Vz IG5vdCBzZWVtIHRvIHN1cHBvcnQgVHlwZS1DLCBQRCwgUEQtRFJQIGFuZCB0aGUKPiBzcGVjaWFs IEFwcGxlIHR5cGUuIEFueSB1bnN1cHBvcnRlZCB0eXBlIHNob3VsZCBub3QgYmUgbGlzdGVkLgo+ CgpBQ0sKCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgdW5zaWduZWQgaW50IG10NjM2MF9tYXBf cmVnX3NlbCh1MzIgZGF0YSwgdTMyIG1pbiwgdTMyIG1heCwgdTMyIHN0ZXApCj4gPiArewo+ID4g KyAgICAgdTMyIHRhcmdldCA9IDAsIG1heF9zZWw7Cj4gPiArCj4gPiArICAgICBpZiAoZGF0YSA+ PSBtaW4pIHsKPiA+ICsgICAgICAgICAgICAgdGFyZ2V0ID0gKGRhdGEgLSBtaW4pIC8gc3RlcDsK PiA+ICsgICAgICAgICAgICAgbWF4X3NlbCA9IChtYXggLSBtaW4pIC8gc3RlcDsKPiA+ICsgICAg ICAgICAgICAgaWYgKHRhcmdldCA+IG1heF9zZWwpCj4gPiArICAgICAgICAgICAgICAgICAgICAg dGFyZ2V0ID0gbWF4X3NlbDsKPiA+ICsgICAgIH0KPiA+ICsgICAgIHJldHVybiB0YXJnZXQ7Cj4g PiArfQo+ID4gKwo+ID4gK3N0YXRpYyB1MzIgbXQ2MzYwX21hcF9yZWFsX3ZhbCh1MzIgc2VsLCB1 MzIgbWluLCB1MzIgbWF4LCB1MzIgc3RlcCkKPiA+ICt7Cj4gPiArICAgICB1MzIgdGFyZ2V0ID0g MDsKPiA+ICsKPiA+ICsgICAgIHRhcmdldCA9IG1pbiArIChzZWwgKiBzdGVwKTsKPiA+ICsgICAg IGlmICh0YXJnZXQgPiBtYXgpCj4gPiArICAgICAgICAgICAgIHRhcmdldCA9IG1heDsKPiA+ICsg ICAgIHJldHVybiB0YXJnZXQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2dl dF9jaHJkZXRfZXh0X3N0YXQoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnB3cl9yZHkpCj4gPiAr ewo+ID4gKyAgICAgaW50IHJldDsKPiA+ICsgICAgIHVuc2lnbmVkIGludCByZWd2YWw7Cj4gPiAr Cj4gPiArICAgICByZXQgPSByZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9GT0Rf U1RBVCwgJnJlZ3ZhbCk7Cj4gPiArICAgICBpZiAocmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAg cmV0dXJuIHJldDsKPiA+ICsgICAgICpwd3JfcmR5ID0gKHJlZ3ZhbCAmIE1UNjM2MF9DSFJERVRf RVhUX01BU0spID8gdHJ1ZSA6IGZhbHNlOwo+ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4g Kwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X29ubGluZShzdHJ1Y3QgbXQ2MzYw X2NoZ19pbmZvICptY2ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVu aW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4gKyAgICAgaW50IHJldDsK PiA+ICsgICAgIGJvb2wgcHdyX3JkeTsKPiA+ICsKPiA+ICsgICAgIHJldCA9IG10NjM2MF9nZXRf Y2hyZGV0X2V4dF9zdGF0KG1jaSwgJnB3cl9yZHkpOwo+ID4gKyAgICAgaWYgKHJldCA8IDApCj4g PiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICB2YWwtPmludHZhbCA9IHB3cl9y ZHkgPyB0cnVlIDogZmFsc2U7Cj4gPiArICAgICByZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiAr c3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9nZXRfc3RhdHVzKHN0cnVjdCBtdDYzNjBfY2hnX2lu Zm8gKm1jaSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gcG93 ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKPiA+ICt7Cj4gPiArICAgICBpbnQgc3RhdHVzLCByZXQ7 Cj4gPiArICAgICB1bnNpZ25lZCBpbnQgcmVndmFsOwo+ID4gKyAgICAgYm9vbCBwd3JfcmR5Owo+ ID4gKwo+ID4gKyAgICAgcmV0ID0gbXQ2MzYwX2dldF9jaHJkZXRfZXh0X3N0YXQobWNpLCAmcHdy X3JkeSk7Cj4gPiArICAgICBpZiAocmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIHJl dDsKPiA+ICsgICAgIGlmICghcHdyX3JkeSkgewo+ID4gKyAgICAgICAgICAgICBzdGF0dXMgPSBQ T1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOwo+ID4gKyAgICAgICAgICAgICBnb3RvIG91 dDsKPiA+ICsgICAgIH0KPiA+ICsKPiA+ICsgICAgIHJldCA9IHJlZ21hcF9yZWFkKG1jaS0+cmVn bWFwLCBNVDYzNjBfUE1VX0NIR19TVEFULCAmcmVndmFsKTsKPiA+ICsgICAgIGlmIChyZXQgPCAw KQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAgICAgcmVndmFsICY9IE1UNjM2 MF9DSEdfU1RBVF9NQVNLOwo+ID4gKyAgICAgcmVndmFsID4+PSBNVDYzNjBfQ0hHX1NUQVRfU0hG VDsKPiA+ICsgICAgIHN3aXRjaCAocmVndmFsKSB7Cj4gPiArICAgICBjYXNlIDB4MDoKPiA+ICsg ICAgICAgICAgICAgc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7Cj4g PiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSAweDE6Cj4gPiArICAgICAgICAg ICAgIHN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7Cj4gPiArICAgICAgICAg ICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSAweDI6Cj4gPiArICAgICAgICAgICAgIHN0YXR1cyA9 IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiAr ICAgICBkZWZhdWx0Ogo+ID4gKyAgICAgICAgICAgICByZXQgPSAtRUlPOwo+ID4gKyAgICAgfQo+ ID4gK291dDoKPiA+ICsgICAgIGlmICghcmV0KQo+ID4gKyAgICAgICAgICAgICB2YWwtPmludHZh bCA9IHN0YXR1czsKPiA+ICsgICAgIHJldHVybiByZXQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X2NoYXJnZV90eXBlKHN0cnVjdCBtdDYzNjBfY2hnX2lu Zm8gKm1jaSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlv biBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIGludCB0eXBlLCBy ZXQ7Cj4gPiArICAgICB1bnNpZ25lZCBpbnQgcmVndmFsOwo+ID4gKyAgICAgdTggY2hnX3N0YXQ7 Cj4gPiArCj4gPiArICAgICByZXQgPSByZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BN VV9DSEdfU1RBVCwgJnJlZ3ZhbCk7Cj4gPiArICAgICBpZiAocmV0IDwgMCkKPiA+ICsgICAgICAg ICAgICAgcmV0dXJuIHJldDsKPiA+ICsKPiA+ICsgICAgIGNoZ19zdGF0ID0gKHJlZ3ZhbCAmIE1U NjM2MF9DSEdfU1RBVF9NQVNLKSA+PiBNVDYzNjBfQ0hHX1NUQVRfU0hGVDsKPiA+ICsgICAgIHN3 aXRjaCAoY2hnX3N0YXQpIHsKPiA+ICsgICAgIGNhc2UgMHgwMTogLyogQ2hhcmdlIGluIFByb2dy ZXNzICovCj4gPiArICAgICAgICAgICAgIGlmIChyZWd2YWwgJiBNVDYzNjBfVkJBVF9MVkxfTUFT SykKPiA+ICsgICAgICAgICAgICAgICAgICAgICB0eXBlID0gUE9XRVJfU1VQUExZX0NIQVJHRV9U WVBFX0ZBU1Q7Cj4gPiArICAgICAgICAgICAgIGVsc2UKPiA+ICsgICAgICAgICAgICAgICAgICAg ICB0eXBlID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX1RSSUNLTEU7Cj4gPiArICAgICAgICAg ICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSAweDAwOiAvKiBOb3QgQ2hhcmdpbmcgKi8KPiA+ICsg ICAgIGNhc2UgMHgwMjogLyogQ2hhcmdlIERvbmUgKi8KPiA+ICsgICAgIGNhc2UgMHgwMzogLyog Q2hhcmdlIEZhdWx0ICovCj4gPiArICAgICBkZWZhdWx0Ogo+ID4gKyAgICAgICAgICAgICB0eXBl ID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX05PTkU7Cj4gPiArICAgICAgICAgICAgIGJyZWFr Owo+ID4gKyAgICAgfQo+ID4gKwo+ID4gKyAgICAgdmFsLT5pbnR2YWwgPSB0eXBlOwo+ID4gKyAg ICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJf Z2V0X2ljaGcoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKPiA+ICt7 Cj4gPiArICAgICBpbnQgcmV0Owo+ID4gKyAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPiA+ICsK PiA+ICsgICAgIHJldCA9IHJlZ21hcF9yZWFkKG1jaS0+cmVnbWFwLCBNVDYzNjBfUE1VX0NIR19D VFJMNywgJnJlZ3ZhbCk7Cj4gPiArICAgICBpZiAocmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAg cmV0dXJuIHJldDsKPiA+ICsgICAgIHJlZ3ZhbCA9IChyZWd2YWwgJiBNVDYzNjBfSUNIR19NQVNL KSA+PiBNVDYzNjBfSUNIR19TSEZUOwo+ID4gKyAgICAgdmFsLT5pbnR2YWwgPSBtdDYzNjBfbWFw X3JlYWxfdmFsKHJlZ3ZhbCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBNVDYzNjBfSUNIR19NSU4sCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgTVQ2MzYwX0lDSEdfTUFYLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIE1UNjM2MF9JQ0hHX1NURVApOwo+ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiAr fQo+Cj4gSXQncyB1bnVzdWFsLCB0aGF0IHlvdSBkbyBub3QgbmVlZCBhbnkgc2NhbGluZy4gRG9l cyB0aGUgaGFyZHdhcmUKPiByZWFsbHkgcmVwb3J0IHZvbHRhZ2VzIGluIMK1ViBhbmQgY3VycmVu dHMgaW4gwrVBPwo+CgpTaG91bGQgSSByZXBsYWNlIE1UNjM2MF9JQ0hHX01JTiBieSBNVDYzNjBf SUNIR19NSU5VQT8KCj4gPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9nZXRfbWF4X2ljaGco c3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4g KyAgICAgdmFsLT5pbnR2YWwgPSBNVDYzNjBfSUNIR19NQVg7Cj4gPiArICAgICByZXR1cm4gMDsK PiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9nZXRfY3Yoc3RydWN0 IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4gKyAgICAgaW50IHJl dDsKPiA+ICsgICAgIHVuc2lnbmVkIGludCByZWd2YWw7Cj4gPiArCj4gPiArICAgICByZXQgPSBy ZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdfQ1RSTDQsICZyZWd2YWwpOwo+ ID4gKyAgICAgaWYgKHJldCA8IDApCj4gPiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiAr ICAgICByZWd2YWwgPSAocmVndmFsICYgTVQ2MzYwX1ZPUkVHX01BU0spID4+IE1UNjM2MF9WT1JF R19TSEZUOwo+ID4gKyAgICAgdmFsLT5pbnR2YWwgPSBtdDYzNjBfbWFwX3JlYWxfdmFsKHJlZ3Zh bCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfVk9S RUdfTUlOLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2 MF9WT1JFR19NQVgsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg TVQ2MzYwX1ZPUkVHX1NURVApOwo+ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4g K3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X21heF9jdihzdHJ1Y3QgbXQ2MzYwX2NoZ19p bmZvICptY2ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIHBv d2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4gKyAgICAgdmFsLT5pbnR2YWwgPSBN VDYzNjBfVk9SRUdfTUFYOwo+ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0 YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X2FpY3Ioc3RydWN0IG10NjM2MF9jaGdfaW5mbyAq bWNpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gcG93ZXJfc3Vw cGx5X3Byb3B2YWwgKnZhbCkKPiA+ICt7Cj4gPiArICAgICBpbnQgcmV0Owo+ID4gKyAgICAgdW5z aWduZWQgaW50IHJlZ3ZhbDsKPiA+ICsKPiA+ICsgICAgIHJldCA9IHJlZ21hcF9yZWFkKG1jaS0+ cmVnbWFwLCBNVDYzNjBfUE1VX0NIR19DVFJMMywgJnJlZ3ZhbCk7Cj4gPiArICAgICBpZiAocmV0 IDwgMCkKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICsgICAgIHJlZ3ZhbCA9IChy ZWd2YWwgJiBNVDYzNjBfSUFJQ1JfTUFTSykgPj4gTVQ2MzYwX0lBSUNSX1NIRlQ7Cj4gPiArICAg ICB2YWwtPmludHZhbCA9IG10NjM2MF9tYXBfcmVhbF92YWwocmVndmFsLAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9BSUNSX01JTiwKPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfQUlDUl9NQVgsCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0FJQ1JfU1RFUCk7 Cj4gPiArICAgICByZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBtdDYzNjBf Y2hhcmdlcl9nZXRfaXByZWNoZyhzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2ksCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZh bCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArICAgICB1bnNpZ25lZCBpbnQg cmVndmFsOwo+ID4gKwo+ID4gKyAgICAgcmV0ID0gcmVnbWFwX3JlYWQobWNpLT5yZWdtYXAsIE1U NjM2MF9QTVVfQ0hHX0NUUkw4LCAmcmVndmFsKTsKPiA+ICsgICAgIGlmIChyZXQgPCAwKQo+ID4g KyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAgICAgcmVndmFsID0gKHJlZ3ZhbCAmIE1U NjM2MF9JUFJFQ19NQVNLKSA+PiBNVDYzNjBfSVBSRUNfU0hGVDsKPiA+ICsgICAgIHZhbC0+aW50 dmFsID0gbXQ2MzYwX21hcF9yZWFsX3ZhbChyZWd2YWwsCj4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lQUkVDX01JTiwKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSVBSRUNfTUFYLAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JUFJFQ19TVEVQKTsKPiA+ICsg ICAgIHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2Vy X2dldF9pZW9jKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiAr ewo+ID4gKyAgICAgaW50IHJldDsKPiA+ICsgICAgIHVuc2lnbmVkIGludCByZWd2YWw7Cj4gPiAr Cj4gPiArICAgICByZXQgPSByZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdf Q1RSTDksICZyZWd2YWwpOwo+ID4gKyAgICAgaWYgKHJldCA8IDApCj4gPiArICAgICAgICAgICAg IHJldHVybiByZXQ7Cj4gPiArICAgICByZWd2YWwgPSAocmVndmFsICYgTVQ2MzYwX0lFT0NfTUFT SykgPj4gTVQ2MzYwX0lFT0NfU0hGVDsKPiA+ICsgICAgIHZhbC0+aW50dmFsID0gbXQ2MzYwX21h cF9yZWFsX3ZhbChyZWd2YWwsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgTVQ2MzYwX0lFT0NfTUlOLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIE1UNjM2MF9JRU9DX01BWCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBNVDYzNjBfSUVPQ19TVEVQKTsKPiA+ICsgICAgIHJldHVybiAwOwo+ID4g K30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX3NldF9vbmxpbmUoc3RydWN0 IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjb25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsg ICAgIHU4IGZvcmNlX3NsZWVwID0gdmFsLT5pbnR2YWwgPyAwIDogMTsKPiA+ICsKPiA+ICsgICAg IHJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMobWNpLT5yZWdtYXAsCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIE1UNjM2MF9QTVVfQ0hHX0NUUkwxLAo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBNVDYzNjBfRlNMUF9NQVNLLAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBmb3JjZV9zbGVlcCA8PCBNVDYzNjBfRlNMUF9TSEZUKTsKPiA+ICt9 Cj4gPiArCj4gPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9zZXRfaWNoZyhzdHJ1Y3QgbXQ2 MzYwX2NoZ19pbmZvICptY2ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj b25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIHU4 IHNlbDsKPiA+ICsKPiA+ICsgICAgIHNlbCA9IG10NjM2MF9tYXBfcmVnX3NlbCh2YWwtPmludHZh bCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSUNIR19NSU4sCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lDSEdfTUFYLAo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JQ0hHX1NURVApOwo+ID4gKyAgICAg cmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgTVQ2MzYwX1BNVV9DSEdfQ1RSTDcsCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JQ0hHX01BU0ssCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHNlbCA8PCBNVDYzNjBfSUNIR19TSEZUKTsKPiA+ICt9Cj4gPiArCj4g PiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9zZXRfY3Yoc3RydWN0IG10NjM2MF9jaGdfaW5m byAqbWNpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaW9uIHBv d2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4gKyAgICAgdTggc2VsOwo+ID4gKwo+ ID4gKyAgICAgc2VsID0gbXQ2MzYwX21hcF9yZWdfc2VsKHZhbC0+aW50dmFsLAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9WT1JFR19NSU4sCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX1ZPUkVHX01BWCwKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBNVDYzNjBfVk9SRUdfU1RFUCk7Cj4gPiArICAgICByZXR1cm4gcmVn bWFwX3VwZGF0ZV9iaXRzKG1jaS0+cmVnbWFwLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBNVDYzNjBfUE1VX0NIR19DVFJMNCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgTVQ2MzYwX1ZPUkVHX01BU0ssCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHNlbCA8PCBNVDYzNjBfVk9SRUdfU0hGVCk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBpbnQgbXQ2MzYwX2NoYXJnZXJfc2V0X2FpY3Ioc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNp LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pb24gcG93ZXJf c3VwcGx5X3Byb3B2YWwgKnZhbCkKPiA+ICt7Cj4gPiArICAgICB1OCBzZWw7Cj4gPiArCj4gPiAr ICAgICBzZWwgPSBtdDYzNjBfbWFwX3JlZ19zZWwodmFsLT5pbnR2YWwsCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0FJQ1JfTUlOLAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIE1UNjM2MF9BSUNSX01BWCwKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBNVDYzNjBfQUlDUl9TVEVQKTsKPiA+ICsgICAgIHJldHVybiByZWdtYXBfdXBk YXRlX2JpdHMobWNpLT5yZWdtYXAsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IE1UNjM2MF9QTVVfQ0hHX0NUUkwzLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBNVDYzNjBfSUFJQ1JfTUFTSywKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c2VsIDw8IE1UNjM2MF9JQUlDUl9TSEZUKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBt dDYzNjBfY2hhcmdlcl9zZXRfaXByZWNoZyhzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2ksCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlvbiBwb3dlcl9z dXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIHU4IHNlbDsKPiA+ICsKPiA+ICsg ICAgIHNlbCA9IG10NjM2MF9tYXBfcmVnX3NlbCh2YWwtPmludHZhbCwKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSVBSRUNfTUlOLAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIE1UNjM2MF9JUFJFQ19NQVgsCj4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgTVQ2MzYwX0lQUkVDX1NURVApOwo+ID4gKyAgICAgcmV0dXJuIHJlZ21hcF91 cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgTVQ2MzYwX1BNVV9DSEdfQ1RSTDgsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIE1UNjM2MF9JUFJFQ19NQVNLLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzZWwgPDwgTVQ2MzYwX0lQUkVDX1NIRlQpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50 IG10NjM2MF9jaGFyZ2VyX3NldF9pZW9jKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBs eV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4gKyAgICAgdTggc2VsOwo+ID4gKwo+ID4gKyAgICAg c2VsID0gbXQ2MzYwX21hcF9yZWdfc2VsKHZhbC0+aW50dmFsLAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIE1UNjM2MF9JRU9DX01JTiwKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBNVDYzNjBfSUVPQ19NQVgsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgTVQ2MzYwX0lFT0NfU1RFUCk7Cj4gPiArICAgICByZXR1cm4gcmVnbWFwX3VwZGF0ZV9i aXRzKG1jaS0+cmVnbWFwLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYz NjBfUE1VX0NIR19DVFJMOSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2 MzYwX0lFT0NfTUFTSywKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsIDw8 IE1UNjM2MF9JRU9DX1NIRlQpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9j aGFyZ2VyX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkg cHNwLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIHBvd2Vy X3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4gKyAgICAgc3RydWN0IG10NjM2MF9jaGdf aW5mbyAqbWNpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Cj4gPiArICAgICBpbnQg cmV0ID0gMDsKPiA+ICsKPiA+ICsgICAgIGRldl9kYmcobWNpLT5kZXYsICIlczogcHJvcCA9ICVk XG4iLCBfX2Z1bmNfXywgcHNwKTsKPgo+IGRyb3AgdGhpcyBkZWJ1ZyBtZXNzYWdlLiBJdCdzIG9u bHkgdXNlZnVsIGR1cmluZyBkZXZlbG9wbWVudC4KPgoKQUNLCgo+ID4gKyAgICAgc3dpdGNoIChw c3ApIHsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgo+ID4gKyAgICAg ICAgICAgICByZXQgPSBtdDYzNjBfY2hhcmdlcl9nZXRfb25saW5lKG1jaSwgdmFsKTsKPiA+ICsg ICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRV UzoKPiA+ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X3N0YXR1cyhtY2ks IHZhbCk7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQ TFlfUFJPUF9DSEFSR0VfVFlQRToKPiA+ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJn ZXJfZ2V0X2NoYXJnZV90eXBlKG1jaSwgdmFsKTsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4g PiArICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UOgo+ ID4gKyAgICAgICAgICAgICByZXQgPSBtdDYzNjBfY2hhcmdlcl9nZXRfaWNoZyhtY2ksIHZhbCk7 Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJP UF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVF9NQVg6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10 NjM2MF9jaGFyZ2VyX2dldF9tYXhfaWNoZyhtY2ksIHZhbCk7Cj4gPiArICAgICAgICAgICAgIGJy ZWFrOwo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9M VEFHRToKPiA+ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X2N2KG1jaSwg dmFsKTsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICBjYXNlIFBPV0VSX1NVUFBM WV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFX01BWDoKPiA+ICsgICAgICAgICAgICAgcmV0 ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X21heF9jdihtY2ksIHZhbCk7Cj4gPiArICAgICAgICAgICAg IGJyZWFrOwo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJ TUlUOgo+ID4gKyAgICAgICAgICAgICByZXQgPSBtdDYzNjBfY2hhcmdlcl9nZXRfYWljcihtY2ks IHZhbCk7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQ TFlfUFJPUF9QUkVDSEFSR0VfQ1VSUkVOVDoKPiA+ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYw X2NoYXJnZXJfZ2V0X2lwcmVjaGcobWNpLCB2YWwpOwo+ID4gKyAgICAgICAgICAgICBicmVhazsK PiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RFUk1fQ1VSUkVOVDoKPiA+ ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X2llb2MobWNpLCB2YWwpOwo+ ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1Bf VVNCX1RZUEU6Cj4gPiArICAgICAgICAgICAgIHZhbC0+aW50dmFsID0gbWNpLT5wc3lfdXNiX3R5 cGU7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgZGVmYXVsdDoKPiA+ICsgICAg ICAgICAgICAgcmV0ID0gLUVOT0RBVEE7Cj4gPiArICAgICB9Cj4gPiArICAgICByZXR1cm4gcmV0 Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX3NldF9wcm9wZXJ0 eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9w dmFsICp2YWwpCj4gPiArewo+ID4gKyAgICAgc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpID0g cG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Cj4gPiArICAgICBpbnQgcmV0Owo+ID4gKwo+ ID4gKyAgICAgZGV2X2RiZyhtY2ktPmRldiwgIiVzOiBwcm9wID0gJWRcbiIsIF9fZnVuY19fLCBw c3ApOwo+Cj4gZHJvcCB0aGlzIGRlYnVnIG1lc3NhZ2UuIEl0J3Mgb25seSB1c2VmdWwgZHVyaW5n IGRldmVsb3BtZW50Lgo+CgpBQ0sKCj4gPiArICAgICBzd2l0Y2ggKHBzcCkgewo+ID4gKyAgICAg Y2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10 NjM2MF9jaGFyZ2VyX3NldF9vbmxpbmUobWNpLCB2YWwpOwo+ID4gKyAgICAgICAgICAgICBicmVh azsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJF TlQ6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX3NldF9pY2hnKG1jaSwg dmFsKTsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICBjYXNlIFBPV0VSX1NVUFBM WV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFOgo+ID4gKyAgICAgICAgICAgICByZXQgPSBt dDYzNjBfY2hhcmdlcl9zZXRfY3YobWNpLCB2YWwpOwo+ID4gKyAgICAgICAgICAgICBicmVhazsK PiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfSU5QVVRfQ1VSUkVOVF9MSU1JVDoKPiA+ ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfc2V0X2FpY3IobWNpLCB2YWwpOwo+ ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1Bf UFJFQ0hBUkdFX0NVUlJFTlQ6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2Vy X3NldF9pcHJlY2hnKG1jaSwgdmFsKTsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAg ICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9URVJNX0NVUlJFTlQ6Cj4gPiArICAgICAg ICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX3NldF9pZW9jKG1jaSwgdmFsKTsKPiA+ICsgICAg ICAgICAgICAgYnJlYWs7Cj4gPiArICAgICBkZWZhdWx0Ogo+ID4gKyAgICAgICAgICAgICByZXQg PSAtRUlOVkFMOwo+ID4gKyAgICAgfQo+ID4gKyAgICAgcmV0dXJuIHJldDsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9wcm9wZXJ0eV9pc193cml0ZWFibGUoc3Ry dWN0IHBvd2VyX3N1cHBseSAqcHN5LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwKQo+ID4gK3sKPiA+ ICsgICAgIHN3aXRjaCAocHNwKSB7Cj4gPiArICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09O TElORToKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NV UlJFTlQ6Cj4gPiArICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9W T0xUQUdFOgo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJ TUlUOgo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVDSEFSR0VfQ1VSUkVOVDoK PiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RFUk1fQ1VSUkVOVDoKPiA+ ICsgICAgICAgICAgICAgcmV0dXJuIDE7Cj4gPiArICAgICBkZWZhdWx0Ogo+ID4gKyAgICAgICAg ICAgICByZXR1cm4gMDsKPiA+ICsgICAgIH0KPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGVudW0g cG93ZXJfc3VwcGx5X3Byb3BlcnR5IG10NjM2MF9jaGFyZ2VyX3Byb3BlcnRpZXNbXSA9IHsKPiA+ ICsgICAgIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9Q Uk9QX1NUQVRVUywKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9UWVBFLAo+ID4g KyAgICAgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJFTlQsCj4gPiArICAg ICBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVF9NQVgsCj4gPiArICAg ICBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRSwKPiA+ICsgICAgIFBP V0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFX01BWCwKPiA+ICsgICAgIFBP V0VSX1NVUFBMWV9QUk9QX0lOUFVUX0NVUlJFTlRfTElNSVQsCj4gPiArICAgICBQT1dFUl9TVVBQ TFlfUFJPUF9QUkVDSEFSR0VfQ1VSUkVOVCwKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9QUk9QX0NI QVJHRV9URVJNX0NVUlJFTlQsCj4gPiArICAgICBQT1dFUl9TVVBQTFlfUFJPUF9VU0JfVFlQRSwK PiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyBjaGFyICptdDYzNjBfY2hhcmdlcl9zdXBwbGllZF90 b1tdID0gewo+ID4gKyAgICAgIm1haW4tYmF0dGVyeSIKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRp YyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbXQ2MzYwX2NoYXJnZXJfZGVzYyA9IHsK PiA+ICsgICAgIC50eXBlICAgICAgICAgICAgICAgICAgID0gUE9XRVJfU1VQUExZX1RZUEVfVVNC LAo+ID4gKyAgICAgLnByb3BlcnRpZXMgICAgICAgICAgICAgPSBtdDYzNjBfY2hhcmdlcl9wcm9w ZXJ0aWVzLAo+ID4gKyAgICAgLm51bV9wcm9wZXJ0aWVzICAgICAgICAgPSBBUlJBWV9TSVpFKG10 NjM2MF9jaGFyZ2VyX3Byb3BlcnRpZXMpLAo+ID4gKyAgICAgLmdldF9wcm9wZXJ0eSAgICAgICAg ICAgPSBtdDYzNjBfY2hhcmdlcl9nZXRfcHJvcGVydHksCj4gPiArICAgICAuc2V0X3Byb3BlcnR5 ICAgICAgICAgICA9IG10NjM2MF9jaGFyZ2VyX3NldF9wcm9wZXJ0eSwKPiA+ICsgICAgIC5wcm9w ZXJ0eV9pc193cml0ZWFibGUgID0gbXQ2MzYwX2NoYXJnZXJfcHJvcGVydHlfaXNfd3JpdGVhYmxl LAo+ID4gKyAgICAgLnVzYl90eXBlcyAgICAgICAgICAgICAgPSBtdDYzNjBfY2hhcmdlcl91c2Jf dHlwZXMsCj4gPiArICAgICAubnVtX3VzYl90eXBlcyAgICAgICAgICA9IEFSUkFZX1NJWkUobXQ2 MzYwX2NoYXJnZXJfdXNiX3R5cGVzKSwKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyBjb25zdCBz dHJ1Y3QgcmVndWxhdG9yX29wcyBtdDYzNjBfY2hnX290Z19vcHMgPSB7Cj4gPiArICAgICAubGlz dF92b2x0YWdlID0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXIsCj4gPiArICAgICAuZW5h YmxlID0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCj4gPiArICAgICAuZGlzYWJsZSA9IHJlZ3Vs YXRvcl9kaXNhYmxlX3JlZ21hcCwKPiA+ICsgICAgIC5pc19lbmFibGVkID0gcmVndWxhdG9yX2lz X2VuYWJsZWRfcmVnbWFwLAo+ID4gKyAgICAgLnNldF92b2x0YWdlX3NlbCA9IHJlZ3VsYXRvcl9z ZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAo+ID4gKyAgICAgLmdldF92b2x0YWdlX3NlbCA9IHJlZ3Vs YXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIGNv bnN0IHN0cnVjdCByZWd1bGF0b3JfZGVzYyBtdDYzNjBfb3RnX3JkZXNjID0gewo+ID4gKyAgICAg Lm9mX21hdGNoID0gInVzYi1vdGctdmJ1cyIsCj4gPiArICAgICAubmFtZSA9ICJ1c2Itb3RnLXZi dXMiLAo+ID4gKyAgICAgLm9wcyA9ICZtdDYzNjBfY2hnX290Z19vcHMsCj4gPiArICAgICAub3du ZXIgPSBUSElTX01PRFVMRSwKPiA+ICsgICAgIC50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsCj4g PiArICAgICAubWluX3VWID0gNDQyNTAwMCwKPiA+ICsgICAgIC51Vl9zdGVwID0gMjUwMDAsCj4g PiArICAgICAubl92b2x0YWdlcyA9IDU3LAo+ID4gKyAgICAgLnZzZWxfcmVnID0gTVQ2MzYwX1BN VV9DSEdfQ1RSTDUsCj4gPiArICAgICAudnNlbF9tYXNrID0gTVQ2MzYwX1ZPQlNUX01BU0ssCj4g PiArICAgICAuZW5hYmxlX3JlZyA9IE1UNjM2MF9QTVVfQ0hHX0NUUkwxLAo+ID4gKyAgICAgLmVu YWJsZV9tYXNrID0gTVQ2MzYwX09QQV9NT0RFX01BU0ssCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0 aWMgaXJxcmV0dXJuX3QgbXQ2MzYwX3BtdV9hdHRhY2hfaV9oYW5kbGVyKGludCBpcnEsIHZvaWQg KmRhdGEpCj4gPiArewo+ID4gKyAgICAgc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpID0gZGF0 YTsKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArICAgICB1bnNpZ25lZCBpbnQgdXNiX3N0YXR1czsK PiA+ICsgICAgIGludCBsYXN0X3VzYl90eXBlOwo+ID4gKwo+ID4gKyAgICAgZGV2X2RiZyhtY2kt PmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4KPiBwbGVhc2UgY2hhbmdlIHN0cmluZyB0byBzb21l dGhpbmcgbW9yZSBzZW5zaWJsZSB0byB1c2VycyBkZWJ1Z2dpbmcKPiBwcm9ibGVtcyB3aXRob3V0 IGhhdmluZyByZWFkIHRoZSBkcml2ZXIgY29kZSBiZWZvcmUsIHN0aC4gbGlrZQo+ICJyZWNlaXZl ZCBhdHRhY2ggaW50ZXJydXB0Ii4KPgoKQUNLCgo+ID4gKyAgICAgbXV0ZXhfbG9jaygmbWNpLT5j aGdkZXRfbG9jayk7Cj4gPiArICAgICBpZiAoIW1jaS0+YmMxMl9lbikgewo+ID4gKyAgICAgICAg ICAgICBkZXZfaW5mbyhtY2ktPmRldiwgIiVzOiBiYzEyIGRpc2FibGVkLCBpZ25vcmUgaXJxXG4i LCBfX2Z1bmNfXyk7Cj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAgfQo+Cj4g V2h5IGlzIHRoaXMgaW5mbyBsZXZlbD8gSSB3b3VsZCBleHBlY3QgaXQgdG8gYmUgZWl0aGVyIGRl YnVnIG9yCj4gd2FybmluZy9lcnJvci4gQWxzbyBkcm9wIGFsbCB0aG9zZSBfX2Z1bmNfXyBhbmQg cHJvdmlkZSBwcm9wZXIKPiBkZWJ1ZyBtZXNzYWdlcyBpbnN0ZWFkLgo+CgpBQ0sKCj4gPiArICAg ICBsYXN0X3VzYl90eXBlID0gbWNpLT5wc3lfdXNiX3R5cGU7Cj4gPiArICAgICAvKiBQbHVnIGlu ICovCj4gPiArICAgICByZXQgPSByZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9V U0JfU1RBVFVTMSwgJnVzYl9zdGF0dXMpOwo+ID4gKyAgICAgaWYgKHJldCA8IDApCj4gPiArICAg ICAgICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAgdXNiX3N0YXR1cyAmPSBNVDYzNjBfVVNCX1NU QVRVU19NQVNLOwo+ID4gKyAgICAgdXNiX3N0YXR1cyA+Pj0gTVQ2MzYwX1VTQl9TVEFUVVNfU0hG VDsKPiA+ICsgICAgIHN3aXRjaCAodXNiX3N0YXR1cykgewo+ID4gKyAgICAgY2FzZSBNVDYzNjBf Q0hHX1RZUEVfVU5ERVJfR09JTkc6Cj4gPiArICAgICAgICAgICAgIGRldl9pbmZvKG1jaS0+ZGV2 LCAiJXM6IHVuZGVyIGdvaW5nLi4uXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICAgICAgICAgIGdv dG8gb3V0Owo+Cj4gSURLIHdoYXQgdGhpcyBpcyBzdXBwb3NlZCB0byB0ZWxsIG1lLiBEbyB5b3Ug bWVhbiAiZGV0ZWN0aW9uIGluCj4gcHJvZ3Jlc3MiPyBBbHNvIHdoeSBpcyB0aGlzIGluZm8gbGV2 ZWw/IEkgd291bGQgZXhwZWN0IGVpdGhlcgo+IGRlYnVnIChhc3N1bWluZyBpdCBoYXBwZW5zIHJl Z3VsYXJseSBhbmQgaXMgbm9ybWFsKSBvciB3YXJuaW5nCj4gKGFzc3VtaW5nIGl0IHNob3VsZCBu b3QgaGFwcGVuKS4KPgoKV2hlbiBoYW5kbGluZyBhdHRhY2ggaW50ZXJydXB0IGFuZCBjYWJsZSBw bHVnIG91dCBhdCB0aGUgc2FtZSB0aW1lLCBIVwpjaGFuZ2UgcmVnaXN0ZXIgc3RhdHVzLgpTbyB3 ZSBkb24nIG5lZWQgdG8gaGFuZGxlIHRoaXMgYXR0YWNoIGludGVycnVwdCBhdCB0aGlzIGNhc2Uu Cgo+ID4gKyAgICAgY2FzZSBNVDYzNjBfQ0hHX1RZUEVfU0RQOgo+ID4gKyAgICAgICAgICAgICBt Y2ktPnBzeV91c2JfdHlwZSA9IFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9TRFA7Cj4gPiArICAgICAg ICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBNVDYzNjBfQ0hHX1RZUEVfU0RQTlNURDoKPiA+ ICsgICAgICAgICAgICAgbWNpLT5wc3lfdXNiX3R5cGUgPSBQT1dFUl9TVVBQTFlfVVNCX1RZUEVf U0RQOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgTVQ2MzYwX0NIR19U WVBFX0NEUDoKPiA+ICsgICAgICAgICAgICAgbWNpLT5wc3lfdXNiX3R5cGUgPSBQT1dFUl9TVVBQ TFlfVVNCX1RZUEVfQ0RQOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2Ug TVQ2MzYwX0NIR19UWVBFX0RDUDoKPiA+ICsgICAgICAgICAgICAgbWNpLT5wc3lfdXNiX3R5cGUg PSBQT1dFUl9TVVBQTFlfVVNCX1RZUEVfRENQOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ ICsgICAgIGRlZmF1bHQ6Cj4gPiArICAgICAgICAgICAgIGRldl93YXJuKG1jaS0+ZGV2LAo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAiJXM6IGRpc2Nvbm5lY3Qgb3IgdW5rbm93biBzdGF0dXNc biIsIF9fZnVuY19fKTsKPgo+IFNvIHlvdSBhcmUgcHJpbnRpbmcgYSB3YXJuaW5nIG9uIGV2ZXJ5 IGRpc2Nvbm5lY3Q/Cj4gUGxlYXNlIGRvIG5vdCBzcGFtIGRldmljZSBtZXNzYWdlcy4KPgoKRml4 ZWQuIFNob3VsZCBiZSAidW5rbm93biBzdGF0dXMiLCBub3QgImRpc2Nvbm5lY3QiLCB3aGljaCBp cwp1bmRlZmluZWQgcmVnaXN0ZXIgdmFsdWUuCgo+ID4gKyAgICAgICAgICAgICBnb3RvIG91dDsK PiA+ICsgICAgIH0KPiA+ICsKPiA+ICsgICAgIGRldl9pbmZvKG1jaS0+ZGV2LCAiJXM6IGNoZ190 eXBlID0gJWRcbiIsIF9fZnVuY19fLCBtY2ktPnBzeV91c2JfdHlwZSk7Cj4KPiBUaGlzIHNob3Vs ZCBiZSBkZWJ1ZyBsZXZlbC4KPgoKQUNLCgo+ID4gKyAgICAgaWYgKGxhc3RfdXNiX3R5cGUgIT0g bWNpLT5wc3lfdXNiX3R5cGUpCj4gPiArICAgICAgICAgICAgIHBvd2VyX3N1cHBseV9jaGFuZ2Vk KG1jaS0+cHN5KTsKPiA+ICtvdXQ6Cj4gPiArICAgICBtdXRleF91bmxvY2soJm1jaS0+Y2hnZGV0 X2xvY2spOwo+ID4gKyAgICAgcmV0dXJuIElSUV9IQU5ETEVEOwo+ID4gK30KPiA+ICsKPiA+ICtz dGF0aWMgdm9pZCBtdDYzNjBfaGFuZGxlX2NocmRldF9leHRfZXZ0KHN0cnVjdCBtdDYzNjBfY2hn X2luZm8gKm1jaSkKPiA+ICt7Cj4gPiArICAgICBpbnQgcmV0Owo+ID4gKyAgICAgYm9vbCBwd3Jf cmR5Owo+ID4gKwo+ID4gKyAgICAgbXV0ZXhfbG9jaygmbWNpLT5jaGdkZXRfbG9jayk7Cj4gPiAr ICAgICByZXQgPSBtdDYzNjBfZ2V0X2NocmRldF9leHRfc3RhdChtY2ksICZwd3JfcmR5KTsKPiA+ ICsgICAgIGlmIChyZXQgPCAwKQo+ID4gKyAgICAgICAgICAgICBnb3RvIG91dDsKPiA+ICsgICAg IGlmIChtY2ktPnB3cl9yZHkgPT0gcHdyX3JkeSkgewo+ID4gKyAgICAgICAgICAgICBkZXZfaW5m byhtY2ktPmRldiwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwd3JfcmR5IGlzIHNh bWUoJWQpXG4iLCBfX2Z1bmNfXywgcHdyX3JkeSk7Cj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0 Owo+ID4gKyAgICAgfQo+ID4gKyAgICAgbWNpLT5wd3JfcmR5ID0gcHdyX3JkeTsKPiA+ICsgICAg IGRldl9pbmZvKG1jaS0+ZGV2LCAiJXM6IHB3cl9yZHkgPSAlZFxuIiwgX19mdW5jX18sIHB3cl9y ZHkpOwo+ID4gKyAgICAgaWYgKCFwd3JfcmR5KSB7Cj4gPiArICAgICAgICAgICAgIG1jaS0+cHN5 X3VzYl90eXBlID0gUE9XRVJfU1VQUExZX1VTQl9UWVBFX1VOS05PV047Cj4gPiArICAgICAgICAg ICAgIHBvd2VyX3N1cHBseV9jaGFuZ2VkKG1jaS0+cHN5KTsKPiA+ICsKPiA+ICsgICAgIH0KPiA+ ICsgICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfUE1VX0RFVklDRV9UWVBFLAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9VU0JDSEdFTl9NQVNLLAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHB3cl9yZHkgPyBNVDYzNjBfVVNCQ0hHRU5fTUFTSyA6 IDApOwo+ID4gKyAgICAgaWYgKHJldCA8IDApCj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0Owo+ ID4gKyAgICAgbWNpLT5iYzEyX2VuID0gcHdyX3JkeTsKPiA+ICtvdXQ6Cj4gPiArICAgICBtdXRl eF91bmxvY2soJm1jaS0+Y2hnZGV0X2xvY2spOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9p ZCBtdDYzNjBfY2hyZGV0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ID4gK3sKPiA+ ICsgICAgIHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSA9IChzdHJ1Y3QgbXQ2MzYwX2NoZ19p bmZvICopY29udGFpbmVyX29mKAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB3b3JrLCBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvLCBjaHJkZXRfd29yayk7Cj4gPiArCj4gPiAr ICAgICBkZXZfaW5mbyhtY2ktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICBtdDYz NjBfaGFuZGxlX2NocmRldF9leHRfZXZ0KG1jaSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBp cnFyZXR1cm5fdCBtdDYzNjBfcG11X2NocmRldF9leHRfZXZ0X2hhbmRsZXIoaW50IGlycSwgdm9p ZCAqZGF0YSkKPiA+ICt7Cj4gPiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBk YXRhOwo+ID4gKwo+ID4gKyAgICAgZGV2X2luZm8obWNpLT5kZXYsICIlc1xuIiwgX19mdW5jX18p Owo+ID4gKyAgICAgbXQ2MzYwX2hhbmRsZV9jaHJkZXRfZXh0X2V2dChtY2kpOwo+ID4gKyAgICAg cmV0dXJuIElSUV9IQU5ETEVEOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9j aGdfaXJxX3JlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiArewo+ID4g KyAgICAgY29uc3Qgc3RydWN0IHsKPiA+ICsgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZTsK PiA+ICsgICAgICAgICAgICAgaXJxX2hhbmRsZXJfdCBoYW5kbGVyOwo+ID4gKyAgICAgfSBpcnFf ZGVzY3NbXSA9IHsKPiA+ICsgICAgICAgICAgICAgeyAiYXR0YWNoX2kiLCBtdDYzNjBfcG11X2F0 dGFjaF9pX2hhbmRsZXIgfSwKPiA+ICsgICAgICAgICAgICAgeyAiY2hyZGV0X2V4dF9ldnQiLCBt dDYzNjBfcG11X2NocmRldF9leHRfZXZ0X2hhbmRsZXIgfQo+ID4gKyAgICAgfTsKPiA+ICsgICAg IGludCBpLCByZXQ7Cj4gPiArCj4gPiArICAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShp cnFfZGVzY3MpOyBpKyspIHsKPiA+ICsgICAgICAgICAgICAgcmV0ID0gcGxhdGZvcm1fZ2V0X2ly cV9ieW5hbWUocGRldiwgaXJxX2Rlc2NzW2ldLm5hbWUpOwo+ID4gKyAgICAgICAgICAgICBpZiAo cmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKwo+ID4g KyAgICAgICAgICAgICByZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZwZGV2LT5kZXYs IHJldCwgTlVMTCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBpcnFfZGVzY3NbaV0uaGFuZGxlciwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBJUlFGX1RSSUdHRVJfRkFMTElORywKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFfZGVzY3NbaV0ubmFtZSwKPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybV9n ZXRfZHJ2ZGF0YShwZGV2KSk7Cj4gPiArICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Cj4gPiAr ICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVl c3QgJXMgaXJxXG4iLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJxX2Rlc2Nz W2ldLm5hbWUpOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAg ICAgICAgICAgIH0KPiA+ICsgICAgIH0KPiA+ICsKPiA+ICsgICAgIHJldHVybiAwOwo+ID4gK30K PiA+ICsKPiA+ICtzdHJ1Y3QgbXQ2MzYwX2ZpZWxkX2luZm8gewo+ID4gKyAgICAgc3RydWN0IGRl dmljZV9hdHRyaWJ1dGUgZGV2X2F0dHI7Cj4gPiArICAgICB1MTYgcmVnOwo+ID4gKyAgICAgdTgg bWFzazsKPiA+ICsgICAgIHU4IHNoZnQ7Cj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgc3NpemVf dCBtdDYzNjBfc3lzZnNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gPiArICAgICAgICAgICAg IHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOwo+ID4gK3N0YXRpYyBz c2l6ZV90IG10NjM2MF9zeXNmc19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gPiArICAgICAg ICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNp emVfdCBjb3VudCk7Cj4gPiArCj4gPiArI2RlZmluZSBNVDYzNjBfRklFTERfUlcoX25hbWUsIF9y ZWcsIF9uYml0KSAgICAgICAgICAgICAgICAgIFwKPiA+ICt7ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgLmRldl9h dHRyID0gX19BVFRSKF9uYW1lLCAwNjY0LCAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiAr ICAgICAgICAgICAgICAgICAgICBtdDYzNjBfc3lzZnNfc2hvdywgbXQ2MzYwX3N5c2ZzX3N0b3Jl KSwgIFwKPiA+ICsgICAgIC5yZWcgICAgPSBNVDYzNjBfUE1VXyMjX3JlZywgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgLm1hc2sgICA9IE1UNjM2MF8jI19uYml0IyNfTUFT SywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICsgICAgIC5zaGZ0ICAgPSBN VDYzNjBfIyNfbmJpdCMjX1NIRlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4g PiArfQo+ID4gKwo+ID4gKyNkZWZpbmUgTVQ2MzYwX0ZJRUxEX1JPKF9uYW1lLCBfcmVnLCBfbmJp dCkgICAgICAgICAgICAgICAgICBcCj4gPiAreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICsgICAgIC5kZXZfYXR0ciA9IF9f QVRUUihfbmFtZSwgMDQ0NCwgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgIG10NjM2MF9zeXNmc19zaG93LCBOVUxMKSwgICAgICAgICAgICAgICBcCj4g PiArICAgICAucmVnICAgID0gTVQ2MzYwX1BNVV8jI19yZWcsICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKPiA+ICsgICAgIC5tYXNrICAgPSBNVDYzNjBfIyNfbmJpdCMjX01BU0ssICAgICAg ICAgICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgLnNoZnQgICA9IE1UNjM2MF8jI19uYml0IyNf U0hGVCwgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBz dHJ1Y3QgbXQ2MzYwX2ZpZWxkX2luZm8gbXQ2MzYwX2ZpZWxkX3RibFtdID0gewo+ID4gKyAgICAg TVQ2MzYwX0ZJRUxEX1JXKGhpeiwgICAgICAgICAgICBDSEdfQ1RSTDEsICAgICAgSElaKSwKPiA+ ICsgICAgIE1UNjM2MF9GSUVMRF9SVyh2bWl2ciwgICAgICAgICAgQ0hHX0NUUkw2LCAgICAgIFZN SVZSKSwKPiA+ICsgICAgIE1UNjM2MF9GSUVMRF9SVyhpYWljciwgICAgICAgICAgQ0hHX0NUUkwz LCAgICAgIElBSUNSKSwKPiA+ICsgICAgIE1UNjM2MF9GSUVMRF9SVyhTWVNSRUcsICAgICAgICAg Q0hHX0NUUkwxMSwgICAgIFNZU1JFRyksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcob3RnX29j LCAgICAgICAgIENIR19DVFJMMTAsICAgICBPVEdfT0MpLAo+ID4gKyAgICAgTVQ2MzYwX0ZJRUxE X1JXKGljaGcsICAgICAgICAgICBDSEdfQ1RSTDE3LCAgICAgSUNIRyksCj4gPiArICAgICBNVDYz NjBfRklFTERfUlcoaXByZWMsICAgICAgICAgIENIR19DVFJMOCwgICAgICBJUFJFQyksCj4gPiAr ICAgICBNVDYzNjBfRklFTERfUlcoaWVvYywgICAgICAgICAgIENIR19DVFJMOSwgICAgICBJRU9D KSwKPiA+ICsgICAgIE1UNjM2MF9GSUVMRF9SVyh2b3JlZywgICAgICAgICAgQ0hHX0NUUkw0LCAg ICAgIFZPUkVHKSwKPiA+ICsgICAgIE1UNjM2MF9GSUVMRF9SVyhsYnAsICAgICAgICAgICAgQ0hH X0NUUkwxMCwgICAgIExCUCksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcodnJlYywgICAgICAg ICAgIENIR19DVFJMMTEsICAgICBWUkVDKSwKPiA+ICsgICAgIE1UNjM2MF9GSUVMRF9SVyh0ZSwg ICAgICAgICAgICAgQ0hHX0NUUkwyLCAgICAgIFRFKSwKPiA+ICsgICAgIE1UNjM2MF9GSUVMRF9S VyhjaGdfd2R0X2VuLCAgICAgQ0hHX0NUUkwxMywgICAgIENIR19XRFRfRU4pLAo+ID4gKyAgICAg TVQ2MzYwX0ZJRUxEX1JXKGNoZ193ZHQsICAgICAgICBDSEdfQ1RSTDEzLCAgICAgQ0hHX1dEVCks Cj4gPiArICAgICBNVDYzNjBfRklFTERfUlcod3RfZmMsICAgICAgICAgIENIR19DVFJMMTIsICAg ICBXVF9GQyksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcoYmF0X2NvbXAsICAgICAgIENIR19D VFJMMTgsICAgICBCQVRfQ09NUCksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcodmNsYW1wLCAg ICAgICAgIENIR19DVFJMMTgsICAgICBWQ0xBTVApLAo+ID4gKyAgICAgTVQ2MzYwX0ZJRUxEX1JX KHVzYmNoZ2VuLCAgICAgICBERVZJQ0VfVFlQRSwgICAgVVNCQ0hHRU4pLAo+ID4gKyAgICAgTVQ2 MzYwX0ZJRUxEX1JXKGNoZ19lbiwgICAgICAgICBDSEdfQ1RSTDIsICAgICAgQ0hHX0VOKSwKPiA+ ICsgICAgIE1UNjM2MF9GSUVMRF9STyhjaHJkZXRfZXh0LCAgICAgRk9EX1NUQVQsICAgICAgIENI UkRFVF9FWFQpLAo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm10 NjM2MF9hdHRyc1tBUlJBWV9TSVpFKG10NjM2MF9maWVsZF90YmwpICsgMV07Cj4gPiArCj4gPiAr c3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbXQ2MzYwX2F0dHJfZ3JvdXAgPSB7 Cj4gPiArICAgICAuYXR0cnMgPSBtdDYzNjBfYXR0cnMsCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0 aWMgc3NpemVfdCBtdDYzNjBfc3lzZnNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIs IGNoYXIgKmJ1ZikKPiA+ICt7Cj4gPiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kg PSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOwo+ID4gKyAgICAgc3RydWN0IG10NjM2MF9m aWVsZF9pbmZvICppbmZvID0gKHZvaWQgKilhdHRyOwo+ID4gKyAgICAgdW5zaWduZWQgaW50IHJl Z3ZhbDsKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArCj4gPiArICAgICByZXQgPSByZWdtYXBfcmVh ZChtY2ktPnJlZ21hcCwgaW5mby0+cmVnLCAmcmVndmFsKTsKPiA+ICsgICAgIGlmIChyZXQgPCAw KQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAgICAgcmVndmFsID0gKHJlZ3Zh bCAmIGluZm8tPm1hc2spID4+IGluZm8tPnNoZnQ7Cj4gPiArICAgICByZXR1cm4gc2NucHJpbnRm KGJ1ZiwgUEFHRV9TSVpFLCAiJTAyeFxuIiwgcmVndmFsKTsKPiA+ICt9Cj4gPiArCj4gPiArc3Rh dGljIHNzaXplX3QgbXQ2MzYwX3N5c2ZzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKPiA+ICsg ICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIg KmJ1Ziwgc2l6ZV90IGNvdW50KQo+ID4gK3sKPiA+ICsgICAgIHN0cnVjdCBtdDYzNjBfY2hnX2lu Zm8gKm1jaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7Cj4gPiArICAgICBzdHJ1Y3Qg bXQ2MzYwX2ZpZWxkX2luZm8gKmluZm8gPSAodm9pZCAqKWF0dHI7Cj4gPiArICAgICBpbnQgcmV0 LCB0bXA7Cj4gPiArCj4gPiArICAgICBpZiAoa3N0cnRvaW50KGJ1ZiwgMTAsICZ0bXApIDwgMCkg ewo+ID4gKyAgICAgICAgICAgICBkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBwYXJzZSBudW1iZXJc biIpOwo+ID4gKyAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKPiA+ICsgICAgIH0KPiA+ICsg ICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBpbmZvLT5yZWcsIGluZm8tPm1hc2ssIHRtcCA8PCBpbmZvLT5z aGZ0KTsKPiA+ICsgICAgIGlmIChyZXQgPCAwKQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0 Owo+ID4gKyAgICAgcmV0dXJuIGNvdW50Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10 NjM2MF9zeXNmc19jcmVhdGVfZ3JvdXAoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpKQo+ID4g K3sKPiA+ICsgICAgIGludCBpLCB0Yl9zaXplID0gQVJSQVlfU0laRShtdDYzNjBfZmllbGRfdGJs KTsKPiA+ICsKPiA+ICsgICAgIGZvciAoaSA9IDA7IGkgPCB0Yl9zaXplOyBpKyspCj4gPiArICAg ICAgICAgICAgIG10NjM2MF9hdHRyc1tpXSA9ICYobXQ2MzYwX2ZpZWxkX3RibFtpXS5kZXZfYXR0 ci5hdHRyKTsKPiA+ICsgICAgIHJldHVybiBkZXZtX2RldmljZV9hZGRfZ3JvdXAoJm1jaS0+cHN5 LT5kZXYsICZtdDYzNjBfYXR0cl9ncm91cCk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQg bXQ2MzYwX2NoZ19pbml0X3NldHRpbmcoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpKQo+ID4g K3sKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArCj4gPiArICAgICByZXQgPSByZWdtYXBfdXBkYXRl X2JpdHMobWNpLT5yZWdtYXAsIE1UNjM2MF9QTVVfREVWSUNFX1RZUEUsCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX1VTQkNIR0VOX01BU0ssIDApOwo+ID4gKyAgICAg aWYgKHJldCA8IDApIHsKPiA+ICsgICAgICAgICAgICAgZGV2X2VycihtY2ktPmRldiwgIiVzOiBG YWlsZWQgdG8gZGlzYWJsZSBiYzEyXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICAgICAgICAgIGdv dG8gb3V0Owo+ID4gKyAgICAgfQo+ID4gKyAgICAgcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKG1j aS0+cmVnbWFwLCBNVDYzNjBfUE1VX0NIR19DVFJMMiwKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBNVDYzNjBfSUlOTE1UU0VMX01BU0ssCj4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgTVQ2MzYwX0lJTkxNVFNFTF9BSUNSIDw8Cj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JSU5MTVRTRUxfU0hGVCk7Cj4gPiArICAgICBp ZiAocmV0IDwgMCkgewo+ID4gKyAgICAgICAgICAgICBkZXZfZXJyKG1jaS0+ZGV2LAo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIHN3aXRjaCBpaW5sbXRzZWwgdG8gYWlj clxuIiwgX19mdW5jX18pOwo+ID4gKyAgICAgICAgICAgICBnb3RvIG91dDsKPiA+ICsgICAgIH0K PiA+ICsgICAgIHVzbGVlcF9yYW5nZSg1MDAwLCA2MDAwKTsKPiA+ICsgICAgIHJldCA9IHJlZ21h cF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdfQ1RSTDMsCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lMSU1fRU5fTUFTSywgMCk7Cj4gPiAr ICAgICBpZiAocmV0IDwgMCkgewo+ID4gKyAgICAgICAgICAgICBkZXZfZXJyKG1jaS0+ZGV2LAo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIGRpc2FibGUgaWxpbVxuIiwg X19mdW5jX18pOwo+ID4gKyAgICAgICAgICAgICBnb3RvIG91dDsKPiA+ICsgICAgIH0KPiA+ICsg ICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdf Q1RSTDEwLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9PVEdfT0Nf TUFTSywgTVQ2MzYwX09UR19PQ19NQVNLKTsKPiA+ICsgICAgIGlmIChyZXQgPCAwKSB7Cj4gPiAr ICAgICAgICAgICAgIGRldl9lcnIobWNpLT5kZXYsCj4gPiArICAgICAgICAgICAgICAgICAgICAg IiVzOiBGYWlsZWQgdG8gY29uZmlnIG90ZyBvYyB0byAzQVxuIiwgX19mdW5jX18pOwo+ID4gKyAg ICAgfQo+ID4gK291dDoKPiA+ICsgICAgIHJldHVybiByZXQ7Cj4KPiByZW1vdmUgdXNlbGVzcyBn b3RvIGFuZCByZXR1cm4gZGlyZWN0bHkgbGlrZSB0aGlzICh3aXRob3V0IHRoZQo+IF9fZnVuY19f IHBhcnQpOgo+Cj4gcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKC4uLik7Cj4gaWYgKHJldCA8IDAp Cj4gICAgIHJldHVybiBkZXZfZXJyX3Byb2JlKG1jaS0+ZGV2LCByZXQsICJGYWlsZWQgdG8gZG8g eHl6IVxuIikuCj4KCkFDSwoKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHUzMiBtdDYzNjBfdmlu b3ZwX3RyYW5zX3RvX3NlbCh1MzIgdmFsKQo+ID4gK3sKPiA+ICsgICAgIHUzMiB2aW5vdnBfdGJs W10gPSB7IDU1MDAwMDAsIDY1MDAwMDAsIDExMDAwMDAwLCAxNDUwMDAwMCB9Owo+ID4gKyAgICAg aW50IGk7Cj4gPiArCj4gPiArICAgICAvKiBTZWxlY3QgdGhlIHNtYWxsZXIgYW5kIGVxdWFsIHN1 cHBvcnRlZCB2YWx1ZSAqLwo+ID4gKyAgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmlu b3ZwX3RibCktMTsgaSsrKSB7Cj4gPiArICAgICAgICAgICAgIGlmICh2YWwgPCB2aW5vdnBfdGJs W2krMV0pCj4gPiArICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICB9Cj4gPiAr ICAgICByZXR1cm4gaTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHN0cnVjdCBtdDYzNjBfY2hn X3BsYXRmb3JtX2RhdGEgKm10NjM2MF9wYXJzZV9wZGF0YSgKPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpw ZGV2KQo+ID4gK3sKPiA+ICsgICAgIHN0cnVjdCBtdDYzNjBfY2hnX3BsYXRmb3JtX2RhdGEgKnBk YXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKPiA+ICsgICAgIHN0cnVjdCBkZXZp Y2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKPiA+ICsgICAgIGludCByZXQ7Cj4gPiAr Cj4gPiArICAgICBwZGF0YSA9IGttZW1kdXAoJmRlZl9wbGF0Zm9ybV9kYXRhLCBzaXplb2YoKnBk YXRhKSwgR0ZQX0tFUk5FTCk7Cj4gPiArICAgICByZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihu cCwgInJpY2h0ZWssdmlub3ZwLW1pY3Jvdm9sdCIsCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAmcGRhdGEtPnZpbm92cCk7Cj4KPiB1c2UgZGV2aWNlX3Byb3BlcnR5X3JlYWRf dTMyKCk7Cj4KCkFDSwoKPiA+ICsgICAgIGlmIChyZXQpIHsKPiA+ICsgICAgICAgICAgICAgZGV2 X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHBhcnNlIHZpbm92cCBpbiBEVFxuIik7Cj4gPiAr ICAgICAgICAgICAgIHJldHVybiBFUlJfUFRSKHJldCk7Cj4gPiArICAgICB9Cj4gPiArICAgICBy ZXR1cm4gcGRhdGE7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2FwcGx5X3Bk YXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiArewo+ID4gKyAgICAgc3RydWN0 IG10NjM2MF9jaGdfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2 LT5kZXYpOwo+ID4gKyAgICAgc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpID0gZGV2X2dldF9k cnZkYXRhKCZwZGV2LT5kZXYpOwo+ID4gKyAgICAgaW50IHJldDsKPiA+ICsgICAgIHUzMiBzZWw7 Cj4gPiArCj4gPiArICAgICBzZWwgPSBtdDYzNjBfdmlub3ZwX3RyYW5zX3RvX3NlbChwZGF0YS0+ dmlub3ZwKTsKPiA+ICsgICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwg TVQ2MzYwX1BNVV9DSEdfQ1RSTDE5LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IE1UNjM2MF9WSU5PVlBfTUFTSywgc2VsIDw8IE1UNjM2MF9WSU5PVlBfU0hGVCk7Cj4gPiArICAg ICBpZiAocmV0KQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAgICAgcmV0dXJu IDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfcHJvYmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+ICt7Cj4gPiArICAgICBzdHJ1Y3QgbXQ2MzYw X2NoZ19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7 Cj4KPiBUaGUgdmFsdWUgaXMgdW51c2VkLCBzbyBpbml0IHRvIE5VTEwgb3Igbm90IGF0IGFsbC4K PgoKQUNLCgo+ID4gKyAgICAgc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpOwo+ID4gKyAgICAg c3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgY2hhcmdlcl9jZmcgPSB7fTsKPiA+ICsgICAgIHN0 cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKPiA+ICsgICAgIGludCByZXQ7Cj4g PiArCj4gPiArICAgICBtY2kgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCptY2kp LCBHRlBfS0VSTkVMKTsKPiA+ICsgICAgIGlmICghbWNpKQo+ID4gKyAgICAgICAgICAgICByZXR1 cm4gLUVOT01FTTsKPiA+ICsKPiA+ICsgICAgIHBkYXRhID0gbXQ2MzYwX3BhcnNlX3BkYXRhKHBk ZXYpOwo+ID4gKyAgICAgaWYgKElTX0VSUl9PUl9OVUxMKHBkYXRhKSkKPiA+ICsgICAgICAgICAg ICAgcmV0dXJuIFBUUl9FUlIocGRhdGEpOwo+ID4gKwo+ID4gKyAgICAgcGRldi0+ZGV2LnBsYXRm b3JtX2RhdGEgPSBwZGF0YTsKPgo+IGluc3RlYWQgb2YgYWxsIHRoaXMgY29kZSBmb3IgYSBzaW5n bGUgdmFyaWFibGUsIGp1c3Qgc3RvcmUgaXQKPiBkaXJlY3RseSBpbnRvIHN0cnVjdCBtdDYzNjBf Y2hnX2luZm8gYW5kIGRyb3AgYWxsIHRoYXQKPiBwbGF0Zm9ybV9kYXRhIGNvZGUuIEFsc28gbm8g bmVlZCB0byBtb3ZlIGl0IGludG8gZXh0cmEgZnVuY3Rpb246Cj4KPiBtY2ktPnZpbm92cCA9IDY1 MDAwMDA7Cj4gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKCZwZGV2LT5kZXYsICJyaWNodGVrLHZp bm92cC1taWNyb3ZvbHQiLCAmbWNpLT52aW5vdnApOwo+CgpBQ0sKCgo+ID4gKyAgICAgbWNpLT5k ZXYgPSAmcGRldi0+ZGV2Owo+ID4gKyAgICAgbXV0ZXhfaW5pdCgmbWNpLT5jaGdkZXRfbG9jayk7 Cj4gPiArICAgICBwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtY2kpOwo+ID4gKyAgICAgSU5J VF9XT1JLKCZtY2ktPmNocmRldF93b3JrLCAmbXQ2MzYwX2NocmRldF93b3JrKTsKPiA+ICsKPiA+ ICsgICAgIG1jaS0+cmVnbWFwID0gZGV2X2dldF9yZWdtYXAocGRldi0+ZGV2LnBhcmVudCwgTlVM TCk7Cj4gPiArICAgICBpZiAoIW1jaS0+cmVnbWFwKSB7Cj4gPiArICAgICAgICAgICAgIGRldl9l cnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgcGFyZW50IHJlZ21hcFxuIik7Cj4gPiArICAg ICAgICAgICAgIHJldHVybiAtRU5PREVWOwo+ID4gKyAgICAgfQo+Cj4gdXNlICdyZXR1cm4gZGV2 X2Vycl9wcm9iZSgmcGRldi0+ZGV2LCAtRU5PREVWLCAiLi4uIik7Cj4KCkFDSwoKPiA+ICsgICAg IHJldCA9IG10NjM2MF9hcHBseV9wZGF0YShwZGV2KTsKPiA+ICsgICAgIGlmIChyZXQpIHsKPiA+ ICsgICAgICAgICAgICAgZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFwcGx5IHBkYXRh XG4iKTsKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICsgICAgIH0KPgo+IHVzZSAn cmV0dXJuIGRldl9lcnJfcHJvYmUoJnBkZXYtPmRldiwgcmV0LCAiLi4uIik7Cj4KPiBBbHNvIGNh biB0aGlzIGZ1bmN0aW9uIGJlIGZvbGRlZCBpbnRvIG10NjM2MF9jaGdfaW5pdF9zZXR0aW5nKCk/ Cj4KCkFDSwoKPiA+ICsgICAgIG1lbWNweSgmbWNpLT5wc3lfZGVzYywgJm10NjM2MF9jaGFyZ2Vy X2Rlc2MsIHNpemVvZihtY2ktPnBzeV9kZXNjKSk7Cj4gPiArICAgICBtY2ktPnBzeV9kZXNjLm5h bWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKPiA+ICsgICAgIGNoYXJnZXJfY2ZnLmRydl9kYXRh ID0gbWNpOwo+ID4gKyAgICAgY2hhcmdlcl9jZmcub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2Rl Owo+ID4gKyAgICAgY2hhcmdlcl9jZmcuc3VwcGxpZWRfdG8gPSBtdDYzNjBfY2hhcmdlcl9zdXBw bGllZF90bzsKPiA+ICsgICAgIGNoYXJnZXJfY2ZnLm51bV9zdXBwbGljYW50cyA9IEFSUkFZX1NJ WkUobXQ2MzYwX2NoYXJnZXJfc3VwcGxpZWRfdG8pOwo+Cj4gd2h5IGRvIHlvdSBuZWVkIHRvIHBy b3ZpZGUgc3VwcGxpZWRfdG8/IHRoaXMgc2hvdWxkIGJlIGdlbmVyYXRlZAo+IGF1dG9tYXRpY2Fs bHkgZnJvbSBkZXZpY2V0cmVlLgo+CgpBQ0sKCj4gPiArICAgICBtY2ktPnBzeSA9IGRldm1fcG93 ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICZtY2ktPnBzeV9kZXNjLCAmY2hhcmdlcl9jZmcpOwo+ID4g KyAgICAgaWYgKElTX0VSUihtY2ktPnBzeSkpIHsKPiA+ICsgICAgICAgICAgICAgZGV2X2Vycigm cGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHBvd2VyIHN1cHBseSBkZXZcbiIpOwo+ID4g KyAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUihtY2ktPnBzeSk7Cj4gPiArICAgICB9Cj4KPiBk ZXZfZXJyX3Byb2JlKCkKPgoKQUNLCgo+ID4gKwo+ID4gKyAgICAgcmV0ID0gbXQ2MzYwX2NoZ19p bml0X3NldHRpbmcobWNpKTsKPiA+ICsgICAgIGlmIChyZXQpIHsKPiA+ICsgICAgICAgICAgICAg ZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGluaXRpYWwgc2V0dGluZ1xuIik7Cj4gPiAr ICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICB9Cj4KPiBkZXZfZXJyX3Byb2JlKCkK Pgo+ID4gKyAgICAgc2NoZWR1bGVfd29yaygmbWNpLT5jaHJkZXRfd29yayk7Cj4KCkFDSwoKPiBj b25zaWRlcmluZyB3b3JrIGlzIG9ubHkgc2NoZWR1bGVkIG9uY2UgaW4gdGhpcyBwbGFjZSwgd2h5 IGRvIHlvdQo+IG5lZWQgaXQ/ICBjYW4ndCB5b3Ugc2ltcGx5IGNhbGwgbXQ2MzYwX2hhbmRsZV9j aHJkZXRfZXh0X2V2dCgpIGhlcmUKPiBhbmQgcmVtb3ZlIGFsbCB3b3JrZXIgcmVsYXRlZCBjb2Rl Pwo+Cj4gPiArICAgICByZXQgPSBtdDYzNjBfY2hnX2lycV9yZWdpc3RlcihwZGV2KTsKPiA+ICsg ICAgIGlmIChyZXQpIHsKPiA+ICsgICAgICAgICAgICAgZGV2X2VycigmcGRldi0+ZGV2LCAiRmFp bGVkIHRvIHJlZ2lzdGVyIGlycXNcbiIpOwo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ ID4gKyAgICAgfQo+Cj4gZGV2X2Vycl9wcm9iZSgpOwo+CgpBQ0sKCj4gPiArICAgICBjb25maWcu ZGV2ID0gJnBkZXYtPmRldjsKPiA+ICsgICAgIGNvbmZpZy5yZWdtYXAgPSBtY2ktPnJlZ21hcDsK PiA+ICsgICAgIG1jaS0+b3RnX3JkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ ZGV2LCAmbXQ2MzYwX290Z19yZGVzYywKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAmY29uZmlnKTsKPiA+ICsgICAgIGlmIChJU19FUlIobWNpLT5vdGdf cmRldikpCj4gPiArICAgICAgICAgICAgIHJldHVybiBQVFJfRVJSKG1jaS0+b3RnX3JkZXYpOwo+ ID4gKwo+ID4gKyAgICAgcmV0ID0gbXQ2MzYwX3N5c2ZzX2NyZWF0ZV9ncm91cChtY2kpOwo+ID4g KyAgICAgaWYgKHJldCkgewo+ID4gKyAgICAgICAgICAgICBkZXZfZXJyKCZwZGV2LT5kZXYsCj4g PiArICAgICAgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGF0dHJz XG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICB9 Cj4KPiBVc2UgY2hhcmdlcl9jZmcuYXR0cl9ncnAgdG8gcmVnaXN0ZXIgY3VzdG9tIHN5c2ZzIGdy b3VwIGZvcgo+IHBvd2VyLXN1cHBseSBkZXZpY2VzLiBPdGhlcndpc2UgeW91ciBjb2RlIGlzIHJh Y3kgKHVkZXYgbWF5IG5vdCBwaWNrCj4gdXAgdGhlIHN5c2ZzIGF0dHJpYnV0ZXMpLiBBbHNvIGN1 c3RvbSBzeXNmcyBhdHRyaWJ1dGVzIG5lZWQgdG8gYmUKPiBkb2N1bWVudGVkIGluIERvY3VtZW50 YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtcG93ZXItPGRyaXZlcj4uCj4KPiBMb29raW5n IGF0IHRoZSBhdHRyaWJ1dGVzIHlvdSBhcmUgcGxhbm5pbmcgdG8gZXhwb3NlLCBJIGRvbid0IHRo aW5rIHRoZXkKPiBhcmUgc3VpdGFibGUgZm9yIHN5c2ZzIGFueXdheXMuIExvb2tzIG1vcmUgbGlr ZSBhIGRlYnVnIGludGVyZmFjZSwgd2hpY2gKPiBzaG91bGQgZ28gaW50byBkZWJ1Z2ZzIGluc3Rl YWQuIEJ1dCBpdCdzIGhhcmQgdG8gdGVsbCB3aXRob3V0IGFueSBkb2N1bWVudGF0aW9uCj4gYmVp bmcgcHJvdmlkZWQgOikKPgoKQUNLLCBJIHdpbGwgY2hhbmdlIHRvIGNoYXJnZXJfY2ZnLmF0dHJf Z3JwLgpJIGFzc3VtZWQgdGhlIGNoYXJnZXIgYWxnb3JpdGhtIHRocmVhZCBpcyBpbiB1c2VyIHNw YWNlLCBhbmQgdGFrZQpjb250cm9sIGJ5IHN5c2ZzIG5vZGUgZnJvbSBjaGFyZ2VyIGRldmljZSwg bGlrZSBicTI0MTkwLmMuClNob3VsZCBJIGNoYW5nZSB0byBkZWJ1Z2ZzPwoKPiA+ICsgICAgIHJl dHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9p ZCBfX21heWJlX3VudXNlZCBtdDYzNjBfY2hhcmdlcl9vZl9pZFtdID0gewo+ID4gKyAgICAgeyAu Y29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDYzNjAtY2hnIiwgfSwKPiA+ICsgICAgIHt9LAo+ID4g K307Cj4gPiArTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXQ2MzYwX2NoYXJnZXJfb2ZfaWQpOwo+ ID4gKwo+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIG10NjM2MF9j aGFyZ2VyX2lkW10gPSB7Cj4gPiArICAgICB7ICJtdDYzNjAtY2hnIiwgMCB9LAo+ID4gKyAgICAg e30sCj4gPiArfTsKPiA+ICtNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBtdDYzNjBfY2hh cmdlcl9pZCk7Cj4gPiArCj4gPiArc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXQ2MzYw X2NoYXJnZXJfZHJpdmVyID0gewo+ID4gKyAgICAgLmRyaXZlciA9IHsKPiA+ICsgICAgICAgICAg ICAgLm5hbWUgPSAibXQ2MzYwLWNoZyIsCj4gPiArICAgICAgICAgICAgIC5vZl9tYXRjaF90YWJs ZSA9IG9mX21hdGNoX3B0cihtdDYzNjBfY2hhcmdlcl9vZl9pZCksCj4gPiArICAgICB9LAo+ID4g KyAgICAgLnByb2JlID0gbXQ2MzYwX2NoYXJnZXJfcHJvYmUsCj4gPiArICAgICAuaWRfdGFibGUg PSBtdDYzNjBfY2hhcmdlcl9pZCwKPiA+ICt9Owo+ID4gK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIo bXQ2MzYwX2NoYXJnZXJfZHJpdmVyKTsKPiA+ICsKPiA+ICtNT0RVTEVfQVVUSE9SKCJDWV9IdWFu ZyA8Y3lfaHVhbmdAcmljaHRlay5jb20+Iik7Cj4KPiBDYW4geW91IGZpeCB0aGUgbmFtZT8gQWxz byBpdCBkaWZmZXJzIGZyb20geW91LCBidXQgSSBkbyBub3Qgc2VlIGFueQo+IGV4dHJhIFNpZ25l ZC1vZmYtYnkgbGluZT8KPgoKQUNLCgo+IFRoYW5rcywKPgo+IC0tIFNlYmFzdGlhbgo+Cj4gPiAr TU9EVUxFX0RFU0NSSVBUSU9OKCJNVDYzNjAgQ2hhcmdlciBEcml2ZXIiKTsKPiA+ICtNT0RVTEVf TElDRU5TRSgiR1BMIik7Cj4gPiAtLQo+ID4gMi43LjQKPiA+CgpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eC1tZWRpYXRlayBtYWlsaW5nIGxpc3QK TGludXgtbWVkaWF0ZWtAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFk Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW1lZGlhdGVrCg== 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 X-Spam-Level: X-Spam-Status: No, score=-10.7 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D4D15C433E0 for ; Mon, 11 Jan 2021 12:17:36 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 50585221F5 for ; Mon, 11 Jan 2021 12:17:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 50585221F5 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=c1cD9A5u8swSrFZeJvE5gmBi2xAbonuKqrQxxEFoKZA=; b=3KKmkgjilppe923aX7zG9Y6m8 4PwZ0C3hCL/BNT9GTFzBJkKnaKQJkg8I8X4Xy7+KrJAO+yvk2ev8OWnveij9oJ+e4HR+qkVwcbDIk A94rvqNZ90zuXF7WHb90S+xCrLy3x+1lItzxaFJNYpEs5fkXVkMA9j+u45q1wMJ3QYjezGwkZe0WS JdBSygCY/byR7n2ecz4gxOeBBI0+tKoUlaJiT3awzvn3I6BtwqrjnB01BZJ4y2i2SaVSHBC8pwCyN dXxEywFr4PLs7IxLvLrEkpzX7qnnoqnNFjOf6mIVpRzttlqxn5ViJLBfoEOwl+FymFCfWLI1hb/rN funGlgr3Q==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kyw6x-0000DC-Ap; Mon, 11 Jan 2021 12:15:51 +0000 Received: from mail-oi1-x231.google.com ([2607:f8b0:4864:20::231]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kyw6t-0000CX-74; Mon, 11 Jan 2021 12:15:49 +0000 Received: by mail-oi1-x231.google.com with SMTP id w124so19900145oia.6; Mon, 11 Jan 2021 04:15:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=DDttZIjQaPrl98+NPurBcwGDVkZUdgP5hs24HQyiA5s=; b=dd8nTqbOjoR0C3qASa7KKTPhrOX71HO8p2f7IeTyLoeSYmQnTnyCZKS9Dmoet8jSPO 3W3yAyAkcc92Vm9l3h5YY9bohm5Cxh4AG1oeFkzbapMSYgw0/N/6xp6V30vtMCgfMsyB P8Baf8bhcTTmq7XKh482ZwSKCG0ddsouaQvTeT4IrhrxLQN9njWj9mj9ud26b00Ud8DS tR/zMRp91IF2FLa8AomY96zBapnH4NNOGxMjJ+8WjdJTPHSMHk3Gw0X7Hvp61Ujawlr6 ah5/nhSdtNXXuNv4wG6NUqKQdLMsGyihPGZhIWSSAevKfR0fosLw9tPpa7ISp7Bf9i1t 8FXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=DDttZIjQaPrl98+NPurBcwGDVkZUdgP5hs24HQyiA5s=; b=OafnJDp+rSbr34DbHO5qBpbhPXkFZcttWjo0I5Z3GKa/uWOMGsyZx+zzVutwqvQTZV J8oguLmq9EkjtlO89WxOhLz2i9e6TYwSh0qEvp+XXJtpVsXx3s2sThHdQTwPDmeNw3nk NCVAy+fyr11nrCIb4bmpf7X1xbGzc8DkPKWeanbEPDHyOQLYXQ+LEu8IslJ7HVM1R38j 786UGPy4PQZlEprEDz7oJqXQnu9vgBxz6VWt38BdNCQgAm9G9RP84sS2/MO79lWk1NTr ijJpiHA4UXLdXh5QdMRGNvhZAfldmalzcAMTbQkgNWMn3bkY3gEbwfP99RA6G7x0zTMe XqtA== X-Gm-Message-State: AOAM533mia9uRZoA7A1JfGnMV4Zym1p3mXnGFilyzwuu01Q45MUfZVI2 aKqyhYrt73Hcu39goqnFbAzHzjZ7f0nvDPws5ak= X-Google-Smtp-Source: ABdhPJzxbmGT1NKfvCOwSLX1JXeKLs7aoHkUMJNne6zceIcP7+tnM9zvg9KKVlHst1eb/ro9nl2tU6Jg9zpfwcoun0U= X-Received: by 2002:aca:3554:: with SMTP id c81mr9927093oia.23.1610367344755; Mon, 11 Jan 2021 04:15:44 -0800 (PST) MIME-Version: 1.0 References: <1608796084-29418-1-git-send-email-gene.chen.richtek@gmail.com> <1608796084-29418-3-git-send-email-gene.chen.richtek@gmail.com> <20210106201654.lkmqorlgcecgqqkf@earth.universe> In-Reply-To: <20210106201654.lkmqorlgcecgqqkf@earth.universe> From: Gene Chen Date: Mon, 11 Jan 2021 20:15:33 +0800 Message-ID: Subject: Re: [PATCH v3 2/2] power: supply: mt6360_charger: add MT6360 charger support To: Sebastian Reichel X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210111_071547_331950_22770700 X-CRM114-Status: GOOD ( 31.24 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gene Chen , devicetree , linux-pm@vger.kernel.org, Linux Kernel Mailing List , cy_huang@richtek.com, benjamin.chao@mediatek.com, Rob Herring , "moderated list:ARM/Mediatek SoC support" , Matthias Brugger , Wilma.Wu@mediatek.com, linux-arm Mailing List , shufan_lee@richtek.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org U2ViYXN0aWFuIFJlaWNoZWwgPHNlYmFzdGlhbi5yZWljaGVsQGNvbGxhYm9yYS5jb20+IOaWvCAy MDIx5bm0MeaciDfml6Ug6YCx5ZubIOS4iuWNiDQ6MTblr6vpgZPvvJoKPgo+IEhpIEdlbmUsCj4K PiBJIGhhdmUgYSBidW5jaCBvZiBjb21tZW50cywgcGxlYXNlIHRha2UgYSBsb29rIGF0IG15IGlu bGluZQo+IGNvbW1lbnRzLgo+Cj4gT24gVGh1LCBEZWMgMjQsIDIwMjAgYXQgMDM6NDg6MDRQTSAr MDgwMCwgR2VuZSBDaGVuIHdyb3RlOgo+ID4gRnJvbTogR2VuZSBDaGVuIDxnZW5lX2NoZW5Acmlj aHRlay5jb20+Cj4gPgo+ID4gQWRkIGJhc2ljIHN1cHBvcnQgZm9yIHRoZSBiYXR0ZXJ5IGNoYXJn ZXIgZm9yIE1UNjM2MCBQTUlDCj4gPgo+ID4gU2lnbmVkLW9mZi1ieTogR2VuZSBDaGVuIDxnZW5l X2NoZW5AcmljaHRlay5jb20+Cj4gPiAtLS0KPiA+ICBkcml2ZXJzL3Bvd2VyL3N1cHBseS9LY29u ZmlnICAgICAgICAgIHwgICAxMCArCj4gPiAgZHJpdmVycy9wb3dlci9zdXBwbHkvTWFrZWZpbGUg ICAgICAgICB8ICAgIDEgKwo+ID4gIGRyaXZlcnMvcG93ZXIvc3VwcGx5L210NjM2MF9jaGFyZ2Vy LmMgfCAxMDU0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ID4gIDMgZmlsZXMg Y2hhbmdlZCwgMTA2NSBpbnNlcnRpb25zKCspCj4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZl cnMvcG93ZXIvc3VwcGx5L210NjM2MF9jaGFyZ2VyLmMKPiA+Cj4gPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9wb3dlci9zdXBwbHkvS2NvbmZpZyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L0tjb25maWcK PiA+IGluZGV4IGVlYzY0NmMuLmRkNjNiZWQgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL3Bvd2Vy L3N1cHBseS9LY29uZmlnCj4gPiArKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9LY29uZmlnCj4g PiBAQCAtNTY3LDYgKzU2NywxNiBAQCBjb25maWcgQ0hBUkdFUl9NUDI2MjkKPiA+ICAgICAgICAg QmF0dGVyeSBjaGFyZ2VyLiBUaGlzIGRyaXZlciBwcm92aWRlcyBCYXR0ZXJ5IGNoYXJnZXIgcG93 ZXIgbWFuYWdlbWVudAo+ID4gICAgICAgICBmdW5jdGlvbnMgb24gdGhlIHN5c3RlbXMuCj4gPgo+ ID4gK2NvbmZpZyBDSEFSR0VSX01UNjM2MAo+ID4gKyAgICAgdHJpc3RhdGUgIk1lZGlhdGVrIE1U NjM2MCBDaGFyZ2VyIERyaXZlciIKPiA+ICsgICAgIGRlcGVuZHMgb24gTUZEX01UNjM2MAo+ID4g KyAgICAgZGVwZW5kcyBvbiBSRUdVTEFUT1IKPiA+ICsgICAgIGhlbHAKPiA+ICsgICAgICAgU2F5 IFkgaGVyZSB0byBlbmFibGUgTVQ2MzYwIENoYXJnZXIgUGFydC4KPiA+ICsgICAgICAgVGhlIGRl dmljZSBzdXBwb3J0cyBIaWdoLUFjY3VyYWN5IFZvbHRhZ2UvQ3VycmVudCBSZWd1bGF0aW9uLAo+ ID4gKyAgICAgICBBdmVyYWdlIElucHV0IEN1cnJlbnQgUmVndWxhdGlvbiwgQmF0dGVyeSBUZW1w YXR1cmUgU2Vuc2luZywKPiA+ICsgICAgICAgT3Zlci1UZW1wZXJhdHVyZSBQcm90ZWN0aW9uLCBE UERNIERldGVjdGlvbiBmb3IgQkMxLjIKPiA+ICsKPiA+ICBjb25maWcgQ0hBUkdFUl9RQ09NX1NN QkIKPiA+ICAgICAgIHRyaXN0YXRlICJRdWFsY29tbSBTd2l0Y2gtTW9kZSBCYXR0ZXJ5IENoYXJn ZXIgYW5kIEJvb3N0Igo+ID4gICAgICAgZGVwZW5kcyBvbiBNRkRfU1BNSV9QTUlDIHx8IENPTVBJ TEVfVEVTVAo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L01ha2VmaWxlIGIv ZHJpdmVycy9wb3dlci9zdXBwbHkvTWFrZWZpbGUKPiA+IGluZGV4IGRkNGI4NjMuLjliZDA4MDQg MTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9NYWtlZmlsZQo+ID4gKysrIGIv ZHJpdmVycy9wb3dlci9zdXBwbHkvTWFrZWZpbGUKPiA+IEBAIC03Nyw2ICs3Nyw3IEBAIG9iai0k KENPTkZJR19DSEFSR0VSX01BWDc3NjkzKSAgICAgICs9IG1heDc3NjkzX2NoYXJnZXIubwo+ID4g IG9iai0kKENPTkZJR19DSEFSR0VSX01BWDg5OTcpICAgICAgICArPSBtYXg4OTk3X2NoYXJnZXIu bwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX01BWDg5OTgpICAgICAgICArPSBtYXg4OTk4X2No YXJnZXIubwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX01QMjYyOSkgKz0gbXAyNjI5X2NoYXJn ZXIubwo+ID4gK29iai0kKENPTkZJR19DSEFSR0VSX01UNjM2MCkgKz0gbXQ2MzYwX2NoYXJnZXIu bwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX1FDT01fU01CQikgICAgICArPSBxY29tX3NtYmIu bwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX0JRMjQxNVgpICAgICAgICArPSBicTI0MTV4X2No YXJnZXIubwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX0JRMjQxOTApICAgICAgICArPSBicTI0 MTkwX2NoYXJnZXIubwo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L210NjM2 MF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9tdDYzNjBfY2hhcmdlci5jCj4gPiBu ZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXggMDAwMDAwMC4uZjFkY2I5Nwo+ID4gLS0tIC9k ZXYvbnVsbAo+ID4gKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvbXQ2MzYwX2NoYXJnZXIuYwo+ ID4gQEAgLTAsMCArMSwxMDU0IEBACj4gPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQ TC0yLjAKPiA+ICsvKgo+ID4gKyAqIENvcHlyaWdodCAoYykgMjAxOSBNZWRpYVRlayBJbmMuCj4K PiAyMDE5LTIwMjE/IDopCj4KCkFDSwoKPiA+ICsgKi8KPiA+ICsKPiA+ICsjaW5jbHVkZSA8bGlu dXgvaW5pdC5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiA+ICsjaW5jbHVkZSA8 bGludXgva2VybmVsLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgo+ID4gKyNpbmNs dWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4K Pgo+IGNoYW5nZSBvZi5oIHRvIDxsaW51eC9wcm9wZXJ0eS5oPiBhZnRlciBpbXBsZW1lbnRpbmcg bXkgbGF0ZXIKPiBjaGFuZ2UgcmVxdWVzdC4KPgoKQUNLCgo+ID4gKyNpbmNsdWRlIDxsaW51eC9p bnRlcnJ1cHQuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+Cj4gPiArI2lu Y2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KPiA+ICsKPiA+ICsjZGVmaW5lIE1UNjM2 MF9QTVVfQ0hHX0NUUkwxIDB4MzExCj4gPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19DVFJMMiAw eDMxMgo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDMgMHgzMTMKPiA+ICsjZGVmaW5l IE1UNjM2MF9QTVVfQ0hHX0NUUkw0IDB4MzE0Cj4gPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19D VFJMNSAweDMxNQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDYgMHgzMTYKPiA+ICsj ZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkw3IDB4MzE3Cj4gPiArI2RlZmluZSBNVDYzNjBfUE1V X0NIR19DVFJMOCAweDMxOAo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDkgMHgzMTkK PiA+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkwxMCAgICAgICAgMHgzMUEKPiA+ICsjZGVm aW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkwxMSAgICAgICAgMHgzMUIKPiA+ICsjZGVmaW5lIE1UNjM2 MF9QTVVfQ0hHX0NUUkwxMiAgICAgICAgMHgzMUMKPiA+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hH X0NUUkwxMyAgICAgICAgMHgzMUQKPiA+ICsjZGVmaW5lIE1UNjM2MF9QTVVfREVWSUNFX1RZUEUg ICAgICAgMHgzMjIKPiA+ICsjZGVmaW5lIE1UNjM2MF9QTVVfVVNCX1NUQVRVUzEgICAgICAgMHgz MjcKPiA+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkwxNyAgICAgICAgMHgzMkIKPiA+ICsj ZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkwxOCAgICAgICAgMHgzMkMKPiA+ICsjZGVmaW5lIE1U NjM2MF9QTVVfQ0hHX1NUQVQgIDB4MzRBCj4gPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19DVFJM MTkgICAgICAgIDB4MzYxCj4gPiArI2RlZmluZSBNVDYzNjBfUE1VX0ZPRF9TVEFUICAweDNFNwo+ ID4gKwo+ID4gKy8qIE1UNjM2MF9QTVVfQ0hHX0NUUkwxICovCj4gPiArI2RlZmluZSBNVDYzNjBf RlNMUF9TSEZUICAgICAoMykKPiA+ICsjZGVmaW5lIE1UNjM2MF9GU0xQX01BU0sgICAgIEJJVChN VDYzNjBfRlNMUF9TSEZUKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX0hJWl9TSEZUICAgICAgICAgICAg ICAoMikKPiA+ICsjZGVmaW5lIE1UNjM2MF9ISVpfTUFTSyAgICAgICAgICAgICAgQklUKE1UNjM2 MF9ISVpfU0hGVCkKPiA+ICsjZGVmaW5lIE1UNjM2MF9PUEFfTU9ERV9TSEZUICgwKQo+ID4gKyNk ZWZpbmUgTVQ2MzYwX09QQV9NT0RFX01BU0sgQklUKE1UNjM2MF9PUEFfTU9ERV9TSEZUKQo+ID4g Ky8qIE1UNjM2MF9QTVVfQ0hHX0NUUkwyICovCj4gPiArI2RlZmluZSBNVDYzNjBfVEVfU0hGVCAg ICAgICAgICAgICAgICg0KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1RFX01BU0sgICAgICAgICAgICAg ICBCSVQoTVQ2MzYwX1RFX1NIRlQpCj4gPiArI2RlZmluZSBNVDYzNjBfSUlOTE1UU0VMX1NIRlQg ICAgICAgICgyKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX0lJTkxNVFNFTF9NQVNLICAgICAgICBHRU5N QVNLKDMsIDIpCj4gPiArI2RlZmluZSBNVDYzNjBfQ0hHX0VOX1NIRlQgICAoMCkKPiA+ICsjZGVm aW5lIE1UNjM2MF9DSEdfRU5fTUFTSyAgIEJJVChNVDYzNjBfQ0hHX0VOX1NIRlQpCj4gPiArLyog TVQ2MzYwX1BNVV9DSEdfQ1RSTDMgKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9JQUlDUl9TSEZUICAg ICgyKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX0lBSUNSX01BU0sgICAgR0VOTUFTSyg3LCAyKQo+ID4g KyNkZWZpbmUgTVQ2MzYwX0lMSU1fRU5fTUFTSyAgQklUKDApCj4gPiArLyogTVQ2MzYwX1BNVV9D SEdfQ1RSTDQgKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9WT1JFR19TSEZUICAgICgxKQo+ID4gKyNk ZWZpbmUgTVQ2MzYwX1ZPUkVHX01BU0sgICAgR0VOTUFTSyg3LCAxKQo+ID4gKy8qIE1UNjM2MF9Q TVVfQ0hHX0NUUkw1ICovCj4gPiArI2RlZmluZSBNVDYzNjBfVk9CU1RfTUFTSyAgICBHRU5NQVNL KDcsIDIpCj4gPiArLyogTVQ2MzYwX1BNVV9DSEdfQ1RSTDYgKi8KPiA+ICsjZGVmaW5lIE1UNjM2 MF9WTUlWUl9TSEZUICAgICgxKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1ZNSVZSX01BU0sgICAgR0VO TUFTSyg3LCAxKQo+ID4gKy8qIE1UNjM2MF9QTVVfQ0hHX0NUUkw3ICovCj4gPiArI2RlZmluZSBN VDYzNjBfSUNIR19TSEZUICAgICAoMikKPiA+ICsjZGVmaW5lIE1UNjM2MF9JQ0hHX01BU0sgICAg IEdFTk1BU0soNywgMikKPiA+ICsvKiBNVDYzNjBfUE1VX0NIR19DVFJMOCAqLwo+ID4gKyNkZWZp bmUgTVQ2MzYwX0lQUkVDX1NIRlQgICAgKDApCj4gPiArI2RlZmluZSBNVDYzNjBfSVBSRUNfTUFT SyAgICBHRU5NQVNLKDMsIDApCj4gPiArLyogTVQ2MzYwX1BNVV9DSEdfQ1RSTDkgKi8KPiA+ICsj ZGVmaW5lIE1UNjM2MF9JRU9DX1NIRlQgICAgICg0KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX0lFT0Nf TUFTSyAgICAgR0VOTUFTSyg3LCA0KQo+ID4gKy8qIE1UNjM2MF9QTVVfQ0hHX0NUUkwxMCAqLwo+ ID4gKyNkZWZpbmUgTVQ2MzYwX0xCUF9TSEZUICAgICAgICAgICAgICAoNCkKPiA+ICsjZGVmaW5l IE1UNjM2MF9MQlBfTUFTSyAgICAgICAgICAgICAgR0VOTUFTSyg3LCA0KQo+ID4gKyNkZWZpbmUg TVQ2MzYwX09UR19PQ19TSEZUICAgKDApCj4gPiArI2RlZmluZSBNVDYzNjBfT1RHX09DX01BU0sg ICBHRU5NQVNLKDMsIDApCj4gPiArLyogTVQ2MzYwX1BNVV9DSEdfQ1RSTDExICovCj4gPiArI2Rl ZmluZSBNVDYzNjBfU1lTUkVHX1NIRlQgICAoMikKPiA+ICsjZGVmaW5lIE1UNjM2MF9TWVNSRUdf TUFTSyAgIEdFTk1BU0soNCwgMikKPiA+ICsjZGVmaW5lIE1UNjM2MF9WUkVDX1NIRlQgICAgICgw KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1ZSRUNfTUFTSyAgICAgR0VOTUFTSygyLCAwKQo+ID4gKy8q IE1UNjM2MF9QTVVfQ0hHX0NUUkwxMiAqLwo+ID4gKyNkZWZpbmUgTVQ2MzYwX1dUX0ZDX1NIRlQg ICAgKDUpCj4gPiArI2RlZmluZSBNVDYzNjBfV1RfRkNfTUFTSyAgICBHRU5NQVNLKDcsIDUpCj4g PiArLyogTVQ2MzYwX1BNVV9DSEdfQ1RSTDEzICovCj4gPiArI2RlZmluZSBNVDYzNjBfQ0hHX1dE VF9FTl9TSEZUICAgICAgICg3KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX0NIR19XRFRfRU5fTUFTSyAg ICAgICBCSVQoTVQ2MzYwX0NIR19XRFRfRU5fU0hGVCkKPiA+ICsjZGVmaW5lIE1UNjM2MF9DSEdf V0RUX1NIRlQgICg0KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX0NIR19XRFRfTUFTSyAgR0VOTUFTSyg1 LCA0KQo+ID4gKy8qIE1UNjM2MF9QTVVfREVWSUNFX1RZUEUgKi8KPiA+ICsjZGVmaW5lIE1UNjM2 MF9VU0JDSEdFTl9TSEZUICg3KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1VTQkNIR0VOX01BU0sgQklU KE1UNjM2MF9VU0JDSEdFTl9TSEZUKQo+ID4gKy8qIE1UNjM2MF9QTVVfVVNCX1NUQVRVUzEgKi8K PiA+ICsjZGVmaW5lIE1UNjM2MF9VU0JfU1RBVFVTX1NIRlQgICAgICAgKDQpCj4gPiArI2RlZmlu ZSBNVDYzNjBfVVNCX1NUQVRVU19NQVNLICAgICAgIEdFTk1BU0soNiwgNCkKPiA+ICsvKiBNVDYz NjBfUE1VX0NIR19DVFJMMTggKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9CQVRfQ09NUF9TSEZUICgz KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX0JBVF9DT01QX01BU0sgR0VOTUFTSyg1LCAzKQo+ID4gKyNk ZWZpbmUgTVQ2MzYwX1ZDTEFNUF9TSEZUICAgKDApCj4gPiArI2RlZmluZSBNVDYzNjBfVkNMQU1Q X01BU0sgICBHRU5NQVNLKDIsIDApCj4gPiArLyogTVQ2MzYwX1BNVV9DSEdfU1RBVCAqLwo+ID4g KyNkZWZpbmUgTVQ2MzYwX0NIR19TVEFUX1NIRlQgKDYpCj4gPiArI2RlZmluZSBNVDYzNjBfQ0hH X1NUQVRfTUFTSyBHRU5NQVNLKDcsIDYpCj4gPiArI2RlZmluZSBNVDYzNjBfVkJBVF9MVkxfTUFT SyBCSVQoNSkKPiA+ICsvKiBNVDYzNjBfUE1VX0NIR19DVFJMMTkgKi8KPiA+ICsjZGVmaW5lIE1U NjM2MF9WSU5PVlBfU0hGVCAgICg1KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1ZJTk9WUF9NQVNLICAg R0VOTUFTSyg2LCA1KQo+ID4gKy8qIE1UNjM2MF9QTVVfRk9EX1NUQVQgKi8KPiA+ICsjZGVmaW5l IE1UNjM2MF9DSFJERVRfRVhUX1NIRlQgICAgICAgKDQpCj4gPiArI2RlZmluZSBNVDYzNjBfQ0hS REVUX0VYVF9NQVNLICAgICAgIEJJVCg0KQo+ID4gKwo+ID4gKy8qIHVBICovCj4gPiArI2RlZmlu ZSBNVDYzNjBfSUNIR19NSU4gICAgICAgICAgICAgIDEwMDAwMAo+ID4gKyNkZWZpbmUgTVQ2MzYw X0lDSEdfTUFYICAgICAgICAgICAgICA1MDAwMDAwCj4gPiArI2RlZmluZSBNVDYzNjBfSUNIR19T VEVQICAgICAxMDAwMDAKPiA+ICsvKiB1ViAqLwo+ID4gKyNkZWZpbmUgTVQ2MzYwX1ZPUkVHX01J TiAgICAgMzkwMDAwMAo+ID4gKyNkZWZpbmUgTVQ2MzYwX1ZPUkVHX01BWCAgICAgNDcxMDAwMAo+ ID4gKyNkZWZpbmUgTVQ2MzYwX1ZPUkVHX1NURVAgICAgMTAwMDAKPiA+ICsvKiB1QSAqLwo+ID4g KyNkZWZpbmUgTVQ2MzYwX0FJQ1JfTUlOICAgICAgICAgICAgICAxMDAwMDAKPiA+ICsjZGVmaW5l IE1UNjM2MF9BSUNSX01BWCAgICAgICAgICAgICAgMzI1MDAwMAo+ID4gKyNkZWZpbmUgTVQ2MzYw X0FJQ1JfU1RFUCAgICAgNTAwMDAKPiA+ICsvKiB1QSAqLwo+ID4gKyNkZWZpbmUgTVQ2MzYwX0lQ UkVDX01JTiAgICAgMTAwMDAwCj4gPiArI2RlZmluZSBNVDYzNjBfSVBSRUNfTUFYICAgICA4NTAw MDAKPiA+ICsjZGVmaW5lIE1UNjM2MF9JUFJFQ19TVEVQICAgIDUwMDAwCj4gPiArLyogdUEgKi8K PiA+ICsjZGVmaW5lIE1UNjM2MF9JRU9DX01JTiAgICAgICAgICAgICAgMTAwMDAwCj4gPiArI2Rl ZmluZSBNVDYzNjBfSUVPQ19NQVggICAgICAgICAgICAgIDg1MDAwMAo+ID4gKyNkZWZpbmUgTVQ2 MzYwX0lFT0NfU1RFUCAgICAgNTAwMDAKPiA+ICsKPiA+ICtzdHJ1Y3QgbXQ2MzYwX2NoZ19wbGF0 Zm9ybV9kYXRhIHsKPiA+ICsgICAgIHUzMiB2aW5vdnA7Cj4gPiArfTsKPgo+IEkgdGhpbmsgaXQn cyBwb2ludGxlc3MgdG8gaGF2ZSB0aGUgcGxhdGZvcm1fZGF0YSBzdHJ1Y3QuCj4gTW9yZSBhYm91 dCB0aGF0IGxhdGVyLgo+CgpBQ0ssIEkgd2lsbCBmaXggaXQgYXMgYmVsb3cgc3VnZ2VzdGlvbi4K Cj4gPiArc3RydWN0IG10NjM2MF9jaGdfaW5mbyB7Cj4gPiArICAgICBzdHJ1Y3QgZGV2aWNlICpk ZXY7Cj4gPiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKPiA+ ICsgICAgIHN0cnVjdCByZWdtYXAgKnJlZ21hcDsKPiA+ICsgICAgIHN0cnVjdCBwb3dlcl9zdXBw bHlfZGVzYyBwc3lfZGVzYzsKPiA+ICsgICAgIHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeTsKPiA+ ICsgICAgIHN0cnVjdCByZWd1bGF0b3JfZGV2ICpvdGdfcmRldjsKPiA+ICsgICAgIHN0cnVjdCBt dXRleCBjaGdkZXRfbG9jazsKPiA+ICsgICAgIGJvb2wgcHdyX3JkeTsKPiA+ICsgICAgIGJvb2wg YmMxMl9lbjsKPiA+ICsgICAgIGludCBwc3lfdXNiX3R5cGU7Cj4gPiArICAgICBzdHJ1Y3Qgd29y a19zdHJ1Y3QgY2hyZGV0X3dvcms7Cj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IG10 NjM2MF9jaGdfcGxhdGZvcm1fZGF0YSBkZWZfcGxhdGZvcm1fZGF0YSA9IHsKPiA+ICsgICAgIC52 aW5vdnAgPSA2NTAwMDAwLAo+ID4gK307Cj4gPiArCj4gPiArZW51bSBtdDYzNjBfaWlubG10c2Vs IHsKPiA+ICsgICAgIE1UNjM2MF9JSU5MTVRTRUxfQUlDUl8zMjUwID0gMCwKPiA+ICsgICAgIE1U NjM2MF9JSU5MTVRTRUxfQ0hHX1RZUEUsCj4gPiArICAgICBNVDYzNjBfSUlOTE1UU0VMX0FJQ1Is Cj4gPiArICAgICBNVDYzNjBfSUlOTE1UU0VMX0xPV0VSX0xFVkVMLAo+ID4gK307Cj4gPiArCj4g PiArZW51bSBtdDYzNjBfcG11X2NoZ190eXBlIHsKPiA+ICsgICAgIE1UNjM2MF9DSEdfVFlQRV9O T1ZCVVMgPSAwLAo+ID4gKyAgICAgTVQ2MzYwX0NIR19UWVBFX1VOREVSX0dPSU5HLAo+ID4gKyAg ICAgTVQ2MzYwX0NIR19UWVBFX1NEUCwKPiA+ICsgICAgIE1UNjM2MF9DSEdfVFlQRV9TRFBOU1RE LAo+ID4gKyAgICAgTVQ2MzYwX0NIR19UWVBFX0RDUCwKPiA+ICsgICAgIE1UNjM2MF9DSEdfVFlQ RV9DRFAsCj4gPiArICAgICBNVDYzNjBfQ0hHX1RZUEVfTUFYLAo+ID4gK307Cj4gPiArCj4gPiAr c3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3VzYl90eXBlIG10NjM2MF9jaGFyZ2VyX3VzYl90eXBl c1tdID0gewo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1VTQl9UWVBFX1VOS05PV04sCj4gPiArICAg ICBQT1dFUl9TVVBQTFlfVVNCX1RZUEVfU0RQLAo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1VTQl9U WVBFX0RDUCwKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9DRFAsCj4gPiArICAgICBQ T1dFUl9TVVBQTFlfVVNCX1RZUEVfQywKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9Q RCwKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9QRF9EUlAsCj4gPiArICAgICBQT1dF Ul9TVVBQTFlfVVNCX1RZUEVfQVBQTEVfQlJJQ0tfSUQKPgo+IGRyaXZlci9oYXJkd2FyZSBkb2Vz IG5vdCBzZWVtIHRvIHN1cHBvcnQgVHlwZS1DLCBQRCwgUEQtRFJQIGFuZCB0aGUKPiBzcGVjaWFs IEFwcGxlIHR5cGUuIEFueSB1bnN1cHBvcnRlZCB0eXBlIHNob3VsZCBub3QgYmUgbGlzdGVkLgo+ CgpBQ0sKCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgdW5zaWduZWQgaW50IG10NjM2MF9tYXBf cmVnX3NlbCh1MzIgZGF0YSwgdTMyIG1pbiwgdTMyIG1heCwgdTMyIHN0ZXApCj4gPiArewo+ID4g KyAgICAgdTMyIHRhcmdldCA9IDAsIG1heF9zZWw7Cj4gPiArCj4gPiArICAgICBpZiAoZGF0YSA+ PSBtaW4pIHsKPiA+ICsgICAgICAgICAgICAgdGFyZ2V0ID0gKGRhdGEgLSBtaW4pIC8gc3RlcDsK PiA+ICsgICAgICAgICAgICAgbWF4X3NlbCA9IChtYXggLSBtaW4pIC8gc3RlcDsKPiA+ICsgICAg ICAgICAgICAgaWYgKHRhcmdldCA+IG1heF9zZWwpCj4gPiArICAgICAgICAgICAgICAgICAgICAg dGFyZ2V0ID0gbWF4X3NlbDsKPiA+ICsgICAgIH0KPiA+ICsgICAgIHJldHVybiB0YXJnZXQ7Cj4g PiArfQo+ID4gKwo+ID4gK3N0YXRpYyB1MzIgbXQ2MzYwX21hcF9yZWFsX3ZhbCh1MzIgc2VsLCB1 MzIgbWluLCB1MzIgbWF4LCB1MzIgc3RlcCkKPiA+ICt7Cj4gPiArICAgICB1MzIgdGFyZ2V0ID0g MDsKPiA+ICsKPiA+ICsgICAgIHRhcmdldCA9IG1pbiArIChzZWwgKiBzdGVwKTsKPiA+ICsgICAg IGlmICh0YXJnZXQgPiBtYXgpCj4gPiArICAgICAgICAgICAgIHRhcmdldCA9IG1heDsKPiA+ICsg ICAgIHJldHVybiB0YXJnZXQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2dl dF9jaHJkZXRfZXh0X3N0YXQoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnB3cl9yZHkpCj4gPiAr ewo+ID4gKyAgICAgaW50IHJldDsKPiA+ICsgICAgIHVuc2lnbmVkIGludCByZWd2YWw7Cj4gPiAr Cj4gPiArICAgICByZXQgPSByZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9GT0Rf U1RBVCwgJnJlZ3ZhbCk7Cj4gPiArICAgICBpZiAocmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAg cmV0dXJuIHJldDsKPiA+ICsgICAgICpwd3JfcmR5ID0gKHJlZ3ZhbCAmIE1UNjM2MF9DSFJERVRf RVhUX01BU0spID8gdHJ1ZSA6IGZhbHNlOwo+ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4g Kwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X29ubGluZShzdHJ1Y3QgbXQ2MzYw X2NoZ19pbmZvICptY2ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVu aW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4gKyAgICAgaW50IHJldDsK PiA+ICsgICAgIGJvb2wgcHdyX3JkeTsKPiA+ICsKPiA+ICsgICAgIHJldCA9IG10NjM2MF9nZXRf Y2hyZGV0X2V4dF9zdGF0KG1jaSwgJnB3cl9yZHkpOwo+ID4gKyAgICAgaWYgKHJldCA8IDApCj4g PiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICB2YWwtPmludHZhbCA9IHB3cl9y ZHkgPyB0cnVlIDogZmFsc2U7Cj4gPiArICAgICByZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiAr c3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9nZXRfc3RhdHVzKHN0cnVjdCBtdDYzNjBfY2hnX2lu Zm8gKm1jaSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gcG93 ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKPiA+ICt7Cj4gPiArICAgICBpbnQgc3RhdHVzLCByZXQ7 Cj4gPiArICAgICB1bnNpZ25lZCBpbnQgcmVndmFsOwo+ID4gKyAgICAgYm9vbCBwd3JfcmR5Owo+ ID4gKwo+ID4gKyAgICAgcmV0ID0gbXQ2MzYwX2dldF9jaHJkZXRfZXh0X3N0YXQobWNpLCAmcHdy X3JkeSk7Cj4gPiArICAgICBpZiAocmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIHJl dDsKPiA+ICsgICAgIGlmICghcHdyX3JkeSkgewo+ID4gKyAgICAgICAgICAgICBzdGF0dXMgPSBQ T1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOwo+ID4gKyAgICAgICAgICAgICBnb3RvIG91 dDsKPiA+ICsgICAgIH0KPiA+ICsKPiA+ICsgICAgIHJldCA9IHJlZ21hcF9yZWFkKG1jaS0+cmVn bWFwLCBNVDYzNjBfUE1VX0NIR19TVEFULCAmcmVndmFsKTsKPiA+ICsgICAgIGlmIChyZXQgPCAw KQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAgICAgcmVndmFsICY9IE1UNjM2 MF9DSEdfU1RBVF9NQVNLOwo+ID4gKyAgICAgcmVndmFsID4+PSBNVDYzNjBfQ0hHX1NUQVRfU0hG VDsKPiA+ICsgICAgIHN3aXRjaCAocmVndmFsKSB7Cj4gPiArICAgICBjYXNlIDB4MDoKPiA+ICsg ICAgICAgICAgICAgc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7Cj4g PiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSAweDE6Cj4gPiArICAgICAgICAg ICAgIHN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7Cj4gPiArICAgICAgICAg ICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSAweDI6Cj4gPiArICAgICAgICAgICAgIHN0YXR1cyA9 IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiAr ICAgICBkZWZhdWx0Ogo+ID4gKyAgICAgICAgICAgICByZXQgPSAtRUlPOwo+ID4gKyAgICAgfQo+ ID4gK291dDoKPiA+ICsgICAgIGlmICghcmV0KQo+ID4gKyAgICAgICAgICAgICB2YWwtPmludHZh bCA9IHN0YXR1czsKPiA+ICsgICAgIHJldHVybiByZXQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X2NoYXJnZV90eXBlKHN0cnVjdCBtdDYzNjBfY2hnX2lu Zm8gKm1jaSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlv biBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIGludCB0eXBlLCBy ZXQ7Cj4gPiArICAgICB1bnNpZ25lZCBpbnQgcmVndmFsOwo+ID4gKyAgICAgdTggY2hnX3N0YXQ7 Cj4gPiArCj4gPiArICAgICByZXQgPSByZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BN VV9DSEdfU1RBVCwgJnJlZ3ZhbCk7Cj4gPiArICAgICBpZiAocmV0IDwgMCkKPiA+ICsgICAgICAg ICAgICAgcmV0dXJuIHJldDsKPiA+ICsKPiA+ICsgICAgIGNoZ19zdGF0ID0gKHJlZ3ZhbCAmIE1U NjM2MF9DSEdfU1RBVF9NQVNLKSA+PiBNVDYzNjBfQ0hHX1NUQVRfU0hGVDsKPiA+ICsgICAgIHN3 aXRjaCAoY2hnX3N0YXQpIHsKPiA+ICsgICAgIGNhc2UgMHgwMTogLyogQ2hhcmdlIGluIFByb2dy ZXNzICovCj4gPiArICAgICAgICAgICAgIGlmIChyZWd2YWwgJiBNVDYzNjBfVkJBVF9MVkxfTUFT SykKPiA+ICsgICAgICAgICAgICAgICAgICAgICB0eXBlID0gUE9XRVJfU1VQUExZX0NIQVJHRV9U WVBFX0ZBU1Q7Cj4gPiArICAgICAgICAgICAgIGVsc2UKPiA+ICsgICAgICAgICAgICAgICAgICAg ICB0eXBlID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX1RSSUNLTEU7Cj4gPiArICAgICAgICAg ICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSAweDAwOiAvKiBOb3QgQ2hhcmdpbmcgKi8KPiA+ICsg ICAgIGNhc2UgMHgwMjogLyogQ2hhcmdlIERvbmUgKi8KPiA+ICsgICAgIGNhc2UgMHgwMzogLyog Q2hhcmdlIEZhdWx0ICovCj4gPiArICAgICBkZWZhdWx0Ogo+ID4gKyAgICAgICAgICAgICB0eXBl ID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX05PTkU7Cj4gPiArICAgICAgICAgICAgIGJyZWFr Owo+ID4gKyAgICAgfQo+ID4gKwo+ID4gKyAgICAgdmFsLT5pbnR2YWwgPSB0eXBlOwo+ID4gKyAg ICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJf Z2V0X2ljaGcoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKPiA+ICt7 Cj4gPiArICAgICBpbnQgcmV0Owo+ID4gKyAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPiA+ICsK PiA+ICsgICAgIHJldCA9IHJlZ21hcF9yZWFkKG1jaS0+cmVnbWFwLCBNVDYzNjBfUE1VX0NIR19D VFJMNywgJnJlZ3ZhbCk7Cj4gPiArICAgICBpZiAocmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAg cmV0dXJuIHJldDsKPiA+ICsgICAgIHJlZ3ZhbCA9IChyZWd2YWwgJiBNVDYzNjBfSUNIR19NQVNL KSA+PiBNVDYzNjBfSUNIR19TSEZUOwo+ID4gKyAgICAgdmFsLT5pbnR2YWwgPSBtdDYzNjBfbWFw X3JlYWxfdmFsKHJlZ3ZhbCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBNVDYzNjBfSUNIR19NSU4sCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgTVQ2MzYwX0lDSEdfTUFYLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIE1UNjM2MF9JQ0hHX1NURVApOwo+ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiAr fQo+Cj4gSXQncyB1bnVzdWFsLCB0aGF0IHlvdSBkbyBub3QgbmVlZCBhbnkgc2NhbGluZy4gRG9l cyB0aGUgaGFyZHdhcmUKPiByZWFsbHkgcmVwb3J0IHZvbHRhZ2VzIGluIMK1ViBhbmQgY3VycmVu dHMgaW4gwrVBPwo+CgpTaG91bGQgSSByZXBsYWNlIE1UNjM2MF9JQ0hHX01JTiBieSBNVDYzNjBf SUNIR19NSU5VQT8KCj4gPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9nZXRfbWF4X2ljaGco c3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4g KyAgICAgdmFsLT5pbnR2YWwgPSBNVDYzNjBfSUNIR19NQVg7Cj4gPiArICAgICByZXR1cm4gMDsK PiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9nZXRfY3Yoc3RydWN0 IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4gKyAgICAgaW50IHJl dDsKPiA+ICsgICAgIHVuc2lnbmVkIGludCByZWd2YWw7Cj4gPiArCj4gPiArICAgICByZXQgPSBy ZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdfQ1RSTDQsICZyZWd2YWwpOwo+ ID4gKyAgICAgaWYgKHJldCA8IDApCj4gPiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiAr ICAgICByZWd2YWwgPSAocmVndmFsICYgTVQ2MzYwX1ZPUkVHX01BU0spID4+IE1UNjM2MF9WT1JF R19TSEZUOwo+ID4gKyAgICAgdmFsLT5pbnR2YWwgPSBtdDYzNjBfbWFwX3JlYWxfdmFsKHJlZ3Zh bCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfVk9S RUdfTUlOLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2 MF9WT1JFR19NQVgsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg TVQ2MzYwX1ZPUkVHX1NURVApOwo+ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4g K3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X21heF9jdihzdHJ1Y3QgbXQ2MzYwX2NoZ19p bmZvICptY2ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIHBv d2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4gKyAgICAgdmFsLT5pbnR2YWwgPSBN VDYzNjBfVk9SRUdfTUFYOwo+ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0 YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X2FpY3Ioc3RydWN0IG10NjM2MF9jaGdfaW5mbyAq bWNpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gcG93ZXJfc3Vw cGx5X3Byb3B2YWwgKnZhbCkKPiA+ICt7Cj4gPiArICAgICBpbnQgcmV0Owo+ID4gKyAgICAgdW5z aWduZWQgaW50IHJlZ3ZhbDsKPiA+ICsKPiA+ICsgICAgIHJldCA9IHJlZ21hcF9yZWFkKG1jaS0+ cmVnbWFwLCBNVDYzNjBfUE1VX0NIR19DVFJMMywgJnJlZ3ZhbCk7Cj4gPiArICAgICBpZiAocmV0 IDwgMCkKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICsgICAgIHJlZ3ZhbCA9IChy ZWd2YWwgJiBNVDYzNjBfSUFJQ1JfTUFTSykgPj4gTVQ2MzYwX0lBSUNSX1NIRlQ7Cj4gPiArICAg ICB2YWwtPmludHZhbCA9IG10NjM2MF9tYXBfcmVhbF92YWwocmVndmFsLAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9BSUNSX01JTiwKPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfQUlDUl9NQVgsCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0FJQ1JfU1RFUCk7 Cj4gPiArICAgICByZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBtdDYzNjBf Y2hhcmdlcl9nZXRfaXByZWNoZyhzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2ksCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZh bCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArICAgICB1bnNpZ25lZCBpbnQg cmVndmFsOwo+ID4gKwo+ID4gKyAgICAgcmV0ID0gcmVnbWFwX3JlYWQobWNpLT5yZWdtYXAsIE1U NjM2MF9QTVVfQ0hHX0NUUkw4LCAmcmVndmFsKTsKPiA+ICsgICAgIGlmIChyZXQgPCAwKQo+ID4g KyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAgICAgcmVndmFsID0gKHJlZ3ZhbCAmIE1U NjM2MF9JUFJFQ19NQVNLKSA+PiBNVDYzNjBfSVBSRUNfU0hGVDsKPiA+ICsgICAgIHZhbC0+aW50 dmFsID0gbXQ2MzYwX21hcF9yZWFsX3ZhbChyZWd2YWwsCj4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lQUkVDX01JTiwKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSVBSRUNfTUFYLAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JUFJFQ19TVEVQKTsKPiA+ICsg ICAgIHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2Vy X2dldF9pZW9jKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiAr ewo+ID4gKyAgICAgaW50IHJldDsKPiA+ICsgICAgIHVuc2lnbmVkIGludCByZWd2YWw7Cj4gPiAr Cj4gPiArICAgICByZXQgPSByZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdf Q1RSTDksICZyZWd2YWwpOwo+ID4gKyAgICAgaWYgKHJldCA8IDApCj4gPiArICAgICAgICAgICAg IHJldHVybiByZXQ7Cj4gPiArICAgICByZWd2YWwgPSAocmVndmFsICYgTVQ2MzYwX0lFT0NfTUFT SykgPj4gTVQ2MzYwX0lFT0NfU0hGVDsKPiA+ICsgICAgIHZhbC0+aW50dmFsID0gbXQ2MzYwX21h cF9yZWFsX3ZhbChyZWd2YWwsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgTVQ2MzYwX0lFT0NfTUlOLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIE1UNjM2MF9JRU9DX01BWCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBNVDYzNjBfSUVPQ19TVEVQKTsKPiA+ICsgICAgIHJldHVybiAwOwo+ID4g K30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX3NldF9vbmxpbmUoc3RydWN0 IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjb25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsg ICAgIHU4IGZvcmNlX3NsZWVwID0gdmFsLT5pbnR2YWwgPyAwIDogMTsKPiA+ICsKPiA+ICsgICAg IHJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMobWNpLT5yZWdtYXAsCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIE1UNjM2MF9QTVVfQ0hHX0NUUkwxLAo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBNVDYzNjBfRlNMUF9NQVNLLAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBmb3JjZV9zbGVlcCA8PCBNVDYzNjBfRlNMUF9TSEZUKTsKPiA+ICt9 Cj4gPiArCj4gPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9zZXRfaWNoZyhzdHJ1Y3QgbXQ2 MzYwX2NoZ19pbmZvICptY2ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj b25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIHU4 IHNlbDsKPiA+ICsKPiA+ICsgICAgIHNlbCA9IG10NjM2MF9tYXBfcmVnX3NlbCh2YWwtPmludHZh bCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSUNIR19NSU4sCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lDSEdfTUFYLAo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JQ0hHX1NURVApOwo+ID4gKyAgICAg cmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgTVQ2MzYwX1BNVV9DSEdfQ1RSTDcsCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JQ0hHX01BU0ssCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHNlbCA8PCBNVDYzNjBfSUNIR19TSEZUKTsKPiA+ICt9Cj4gPiArCj4g PiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9zZXRfY3Yoc3RydWN0IG10NjM2MF9jaGdfaW5m byAqbWNpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaW9uIHBv d2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4gKyAgICAgdTggc2VsOwo+ID4gKwo+ ID4gKyAgICAgc2VsID0gbXQ2MzYwX21hcF9yZWdfc2VsKHZhbC0+aW50dmFsLAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9WT1JFR19NSU4sCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX1ZPUkVHX01BWCwKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBNVDYzNjBfVk9SRUdfU1RFUCk7Cj4gPiArICAgICByZXR1cm4gcmVn bWFwX3VwZGF0ZV9iaXRzKG1jaS0+cmVnbWFwLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBNVDYzNjBfUE1VX0NIR19DVFJMNCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgTVQ2MzYwX1ZPUkVHX01BU0ssCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHNlbCA8PCBNVDYzNjBfVk9SRUdfU0hGVCk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBpbnQgbXQ2MzYwX2NoYXJnZXJfc2V0X2FpY3Ioc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNp LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pb24gcG93ZXJf c3VwcGx5X3Byb3B2YWwgKnZhbCkKPiA+ICt7Cj4gPiArICAgICB1OCBzZWw7Cj4gPiArCj4gPiAr ICAgICBzZWwgPSBtdDYzNjBfbWFwX3JlZ19zZWwodmFsLT5pbnR2YWwsCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0FJQ1JfTUlOLAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIE1UNjM2MF9BSUNSX01BWCwKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBNVDYzNjBfQUlDUl9TVEVQKTsKPiA+ICsgICAgIHJldHVybiByZWdtYXBfdXBk YXRlX2JpdHMobWNpLT5yZWdtYXAsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IE1UNjM2MF9QTVVfQ0hHX0NUUkwzLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBNVDYzNjBfSUFJQ1JfTUFTSywKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c2VsIDw8IE1UNjM2MF9JQUlDUl9TSEZUKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBt dDYzNjBfY2hhcmdlcl9zZXRfaXByZWNoZyhzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2ksCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlvbiBwb3dlcl9z dXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIHU4IHNlbDsKPiA+ICsKPiA+ICsg ICAgIHNlbCA9IG10NjM2MF9tYXBfcmVnX3NlbCh2YWwtPmludHZhbCwKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSVBSRUNfTUlOLAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIE1UNjM2MF9JUFJFQ19NQVgsCj4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgTVQ2MzYwX0lQUkVDX1NURVApOwo+ID4gKyAgICAgcmV0dXJuIHJlZ21hcF91 cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgTVQ2MzYwX1BNVV9DSEdfQ1RSTDgsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIE1UNjM2MF9JUFJFQ19NQVNLLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzZWwgPDwgTVQ2MzYwX0lQUkVDX1NIRlQpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50 IG10NjM2MF9jaGFyZ2VyX3NldF9pZW9jKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBs eV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4gKyAgICAgdTggc2VsOwo+ID4gKwo+ID4gKyAgICAg c2VsID0gbXQ2MzYwX21hcF9yZWdfc2VsKHZhbC0+aW50dmFsLAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIE1UNjM2MF9JRU9DX01JTiwKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBNVDYzNjBfSUVPQ19NQVgsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgTVQ2MzYwX0lFT0NfU1RFUCk7Cj4gPiArICAgICByZXR1cm4gcmVnbWFwX3VwZGF0ZV9i aXRzKG1jaS0+cmVnbWFwLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYz NjBfUE1VX0NIR19DVFJMOSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2 MzYwX0lFT0NfTUFTSywKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsIDw8 IE1UNjM2MF9JRU9DX1NIRlQpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9j aGFyZ2VyX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkg cHNwLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIHBvd2Vy X3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4gKyAgICAgc3RydWN0IG10NjM2MF9jaGdf aW5mbyAqbWNpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Cj4gPiArICAgICBpbnQg cmV0ID0gMDsKPiA+ICsKPiA+ICsgICAgIGRldl9kYmcobWNpLT5kZXYsICIlczogcHJvcCA9ICVk XG4iLCBfX2Z1bmNfXywgcHNwKTsKPgo+IGRyb3AgdGhpcyBkZWJ1ZyBtZXNzYWdlLiBJdCdzIG9u bHkgdXNlZnVsIGR1cmluZyBkZXZlbG9wbWVudC4KPgoKQUNLCgo+ID4gKyAgICAgc3dpdGNoIChw c3ApIHsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgo+ID4gKyAgICAg ICAgICAgICByZXQgPSBtdDYzNjBfY2hhcmdlcl9nZXRfb25saW5lKG1jaSwgdmFsKTsKPiA+ICsg ICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRV UzoKPiA+ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X3N0YXR1cyhtY2ks IHZhbCk7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQ TFlfUFJPUF9DSEFSR0VfVFlQRToKPiA+ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJn ZXJfZ2V0X2NoYXJnZV90eXBlKG1jaSwgdmFsKTsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4g PiArICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UOgo+ ID4gKyAgICAgICAgICAgICByZXQgPSBtdDYzNjBfY2hhcmdlcl9nZXRfaWNoZyhtY2ksIHZhbCk7 Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJP UF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVF9NQVg6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10 NjM2MF9jaGFyZ2VyX2dldF9tYXhfaWNoZyhtY2ksIHZhbCk7Cj4gPiArICAgICAgICAgICAgIGJy ZWFrOwo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9M VEFHRToKPiA+ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X2N2KG1jaSwg dmFsKTsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICBjYXNlIFBPV0VSX1NVUFBM WV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFX01BWDoKPiA+ICsgICAgICAgICAgICAgcmV0 ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X21heF9jdihtY2ksIHZhbCk7Cj4gPiArICAgICAgICAgICAg IGJyZWFrOwo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJ TUlUOgo+ID4gKyAgICAgICAgICAgICByZXQgPSBtdDYzNjBfY2hhcmdlcl9nZXRfYWljcihtY2ks IHZhbCk7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQ TFlfUFJPUF9QUkVDSEFSR0VfQ1VSUkVOVDoKPiA+ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYw X2NoYXJnZXJfZ2V0X2lwcmVjaGcobWNpLCB2YWwpOwo+ID4gKyAgICAgICAgICAgICBicmVhazsK PiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RFUk1fQ1VSUkVOVDoKPiA+ ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X2llb2MobWNpLCB2YWwpOwo+ ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1Bf VVNCX1RZUEU6Cj4gPiArICAgICAgICAgICAgIHZhbC0+aW50dmFsID0gbWNpLT5wc3lfdXNiX3R5 cGU7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgZGVmYXVsdDoKPiA+ICsgICAg ICAgICAgICAgcmV0ID0gLUVOT0RBVEE7Cj4gPiArICAgICB9Cj4gPiArICAgICByZXR1cm4gcmV0 Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX3NldF9wcm9wZXJ0 eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9w dmFsICp2YWwpCj4gPiArewo+ID4gKyAgICAgc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpID0g cG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Cj4gPiArICAgICBpbnQgcmV0Owo+ID4gKwo+ ID4gKyAgICAgZGV2X2RiZyhtY2ktPmRldiwgIiVzOiBwcm9wID0gJWRcbiIsIF9fZnVuY19fLCBw c3ApOwo+Cj4gZHJvcCB0aGlzIGRlYnVnIG1lc3NhZ2UuIEl0J3Mgb25seSB1c2VmdWwgZHVyaW5n IGRldmVsb3BtZW50Lgo+CgpBQ0sKCj4gPiArICAgICBzd2l0Y2ggKHBzcCkgewo+ID4gKyAgICAg Y2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10 NjM2MF9jaGFyZ2VyX3NldF9vbmxpbmUobWNpLCB2YWwpOwo+ID4gKyAgICAgICAgICAgICBicmVh azsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJF TlQ6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX3NldF9pY2hnKG1jaSwg dmFsKTsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICBjYXNlIFBPV0VSX1NVUFBM WV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFOgo+ID4gKyAgICAgICAgICAgICByZXQgPSBt dDYzNjBfY2hhcmdlcl9zZXRfY3YobWNpLCB2YWwpOwo+ID4gKyAgICAgICAgICAgICBicmVhazsK PiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfSU5QVVRfQ1VSUkVOVF9MSU1JVDoKPiA+ ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfc2V0X2FpY3IobWNpLCB2YWwpOwo+ ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1Bf UFJFQ0hBUkdFX0NVUlJFTlQ6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2Vy X3NldF9pcHJlY2hnKG1jaSwgdmFsKTsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAg ICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9URVJNX0NVUlJFTlQ6Cj4gPiArICAgICAg ICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX3NldF9pZW9jKG1jaSwgdmFsKTsKPiA+ICsgICAg ICAgICAgICAgYnJlYWs7Cj4gPiArICAgICBkZWZhdWx0Ogo+ID4gKyAgICAgICAgICAgICByZXQg PSAtRUlOVkFMOwo+ID4gKyAgICAgfQo+ID4gKyAgICAgcmV0dXJuIHJldDsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9wcm9wZXJ0eV9pc193cml0ZWFibGUoc3Ry dWN0IHBvd2VyX3N1cHBseSAqcHN5LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwKQo+ID4gK3sKPiA+ ICsgICAgIHN3aXRjaCAocHNwKSB7Cj4gPiArICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09O TElORToKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NV UlJFTlQ6Cj4gPiArICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9W T0xUQUdFOgo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJ TUlUOgo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVDSEFSR0VfQ1VSUkVOVDoK PiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RFUk1fQ1VSUkVOVDoKPiA+ ICsgICAgICAgICAgICAgcmV0dXJuIDE7Cj4gPiArICAgICBkZWZhdWx0Ogo+ID4gKyAgICAgICAg ICAgICByZXR1cm4gMDsKPiA+ICsgICAgIH0KPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGVudW0g cG93ZXJfc3VwcGx5X3Byb3BlcnR5IG10NjM2MF9jaGFyZ2VyX3Byb3BlcnRpZXNbXSA9IHsKPiA+ ICsgICAgIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9Q Uk9QX1NUQVRVUywKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9UWVBFLAo+ID4g KyAgICAgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJFTlQsCj4gPiArICAg ICBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVF9NQVgsCj4gPiArICAg ICBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRSwKPiA+ICsgICAgIFBP V0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFX01BWCwKPiA+ICsgICAgIFBP V0VSX1NVUFBMWV9QUk9QX0lOUFVUX0NVUlJFTlRfTElNSVQsCj4gPiArICAgICBQT1dFUl9TVVBQ TFlfUFJPUF9QUkVDSEFSR0VfQ1VSUkVOVCwKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9QUk9QX0NI QVJHRV9URVJNX0NVUlJFTlQsCj4gPiArICAgICBQT1dFUl9TVVBQTFlfUFJPUF9VU0JfVFlQRSwK PiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyBjaGFyICptdDYzNjBfY2hhcmdlcl9zdXBwbGllZF90 b1tdID0gewo+ID4gKyAgICAgIm1haW4tYmF0dGVyeSIKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRp YyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbXQ2MzYwX2NoYXJnZXJfZGVzYyA9IHsK PiA+ICsgICAgIC50eXBlICAgICAgICAgICAgICAgICAgID0gUE9XRVJfU1VQUExZX1RZUEVfVVNC LAo+ID4gKyAgICAgLnByb3BlcnRpZXMgICAgICAgICAgICAgPSBtdDYzNjBfY2hhcmdlcl9wcm9w ZXJ0aWVzLAo+ID4gKyAgICAgLm51bV9wcm9wZXJ0aWVzICAgICAgICAgPSBBUlJBWV9TSVpFKG10 NjM2MF9jaGFyZ2VyX3Byb3BlcnRpZXMpLAo+ID4gKyAgICAgLmdldF9wcm9wZXJ0eSAgICAgICAg ICAgPSBtdDYzNjBfY2hhcmdlcl9nZXRfcHJvcGVydHksCj4gPiArICAgICAuc2V0X3Byb3BlcnR5 ICAgICAgICAgICA9IG10NjM2MF9jaGFyZ2VyX3NldF9wcm9wZXJ0eSwKPiA+ICsgICAgIC5wcm9w ZXJ0eV9pc193cml0ZWFibGUgID0gbXQ2MzYwX2NoYXJnZXJfcHJvcGVydHlfaXNfd3JpdGVhYmxl LAo+ID4gKyAgICAgLnVzYl90eXBlcyAgICAgICAgICAgICAgPSBtdDYzNjBfY2hhcmdlcl91c2Jf dHlwZXMsCj4gPiArICAgICAubnVtX3VzYl90eXBlcyAgICAgICAgICA9IEFSUkFZX1NJWkUobXQ2 MzYwX2NoYXJnZXJfdXNiX3R5cGVzKSwKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyBjb25zdCBz dHJ1Y3QgcmVndWxhdG9yX29wcyBtdDYzNjBfY2hnX290Z19vcHMgPSB7Cj4gPiArICAgICAubGlz dF92b2x0YWdlID0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXIsCj4gPiArICAgICAuZW5h YmxlID0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCj4gPiArICAgICAuZGlzYWJsZSA9IHJlZ3Vs YXRvcl9kaXNhYmxlX3JlZ21hcCwKPiA+ICsgICAgIC5pc19lbmFibGVkID0gcmVndWxhdG9yX2lz X2VuYWJsZWRfcmVnbWFwLAo+ID4gKyAgICAgLnNldF92b2x0YWdlX3NlbCA9IHJlZ3VsYXRvcl9z ZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAo+ID4gKyAgICAgLmdldF92b2x0YWdlX3NlbCA9IHJlZ3Vs YXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIGNv bnN0IHN0cnVjdCByZWd1bGF0b3JfZGVzYyBtdDYzNjBfb3RnX3JkZXNjID0gewo+ID4gKyAgICAg Lm9mX21hdGNoID0gInVzYi1vdGctdmJ1cyIsCj4gPiArICAgICAubmFtZSA9ICJ1c2Itb3RnLXZi dXMiLAo+ID4gKyAgICAgLm9wcyA9ICZtdDYzNjBfY2hnX290Z19vcHMsCj4gPiArICAgICAub3du ZXIgPSBUSElTX01PRFVMRSwKPiA+ICsgICAgIC50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsCj4g PiArICAgICAubWluX3VWID0gNDQyNTAwMCwKPiA+ICsgICAgIC51Vl9zdGVwID0gMjUwMDAsCj4g PiArICAgICAubl92b2x0YWdlcyA9IDU3LAo+ID4gKyAgICAgLnZzZWxfcmVnID0gTVQ2MzYwX1BN VV9DSEdfQ1RSTDUsCj4gPiArICAgICAudnNlbF9tYXNrID0gTVQ2MzYwX1ZPQlNUX01BU0ssCj4g PiArICAgICAuZW5hYmxlX3JlZyA9IE1UNjM2MF9QTVVfQ0hHX0NUUkwxLAo+ID4gKyAgICAgLmVu YWJsZV9tYXNrID0gTVQ2MzYwX09QQV9NT0RFX01BU0ssCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0 aWMgaXJxcmV0dXJuX3QgbXQ2MzYwX3BtdV9hdHRhY2hfaV9oYW5kbGVyKGludCBpcnEsIHZvaWQg KmRhdGEpCj4gPiArewo+ID4gKyAgICAgc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpID0gZGF0 YTsKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArICAgICB1bnNpZ25lZCBpbnQgdXNiX3N0YXR1czsK PiA+ICsgICAgIGludCBsYXN0X3VzYl90eXBlOwo+ID4gKwo+ID4gKyAgICAgZGV2X2RiZyhtY2kt PmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4KPiBwbGVhc2UgY2hhbmdlIHN0cmluZyB0byBzb21l dGhpbmcgbW9yZSBzZW5zaWJsZSB0byB1c2VycyBkZWJ1Z2dpbmcKPiBwcm9ibGVtcyB3aXRob3V0 IGhhdmluZyByZWFkIHRoZSBkcml2ZXIgY29kZSBiZWZvcmUsIHN0aC4gbGlrZQo+ICJyZWNlaXZl ZCBhdHRhY2ggaW50ZXJydXB0Ii4KPgoKQUNLCgo+ID4gKyAgICAgbXV0ZXhfbG9jaygmbWNpLT5j aGdkZXRfbG9jayk7Cj4gPiArICAgICBpZiAoIW1jaS0+YmMxMl9lbikgewo+ID4gKyAgICAgICAg ICAgICBkZXZfaW5mbyhtY2ktPmRldiwgIiVzOiBiYzEyIGRpc2FibGVkLCBpZ25vcmUgaXJxXG4i LCBfX2Z1bmNfXyk7Cj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAgfQo+Cj4g V2h5IGlzIHRoaXMgaW5mbyBsZXZlbD8gSSB3b3VsZCBleHBlY3QgaXQgdG8gYmUgZWl0aGVyIGRl YnVnIG9yCj4gd2FybmluZy9lcnJvci4gQWxzbyBkcm9wIGFsbCB0aG9zZSBfX2Z1bmNfXyBhbmQg cHJvdmlkZSBwcm9wZXIKPiBkZWJ1ZyBtZXNzYWdlcyBpbnN0ZWFkLgo+CgpBQ0sKCj4gPiArICAg ICBsYXN0X3VzYl90eXBlID0gbWNpLT5wc3lfdXNiX3R5cGU7Cj4gPiArICAgICAvKiBQbHVnIGlu ICovCj4gPiArICAgICByZXQgPSByZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9V U0JfU1RBVFVTMSwgJnVzYl9zdGF0dXMpOwo+ID4gKyAgICAgaWYgKHJldCA8IDApCj4gPiArICAg ICAgICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAgdXNiX3N0YXR1cyAmPSBNVDYzNjBfVVNCX1NU QVRVU19NQVNLOwo+ID4gKyAgICAgdXNiX3N0YXR1cyA+Pj0gTVQ2MzYwX1VTQl9TVEFUVVNfU0hG VDsKPiA+ICsgICAgIHN3aXRjaCAodXNiX3N0YXR1cykgewo+ID4gKyAgICAgY2FzZSBNVDYzNjBf Q0hHX1RZUEVfVU5ERVJfR09JTkc6Cj4gPiArICAgICAgICAgICAgIGRldl9pbmZvKG1jaS0+ZGV2 LCAiJXM6IHVuZGVyIGdvaW5nLi4uXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICAgICAgICAgIGdv dG8gb3V0Owo+Cj4gSURLIHdoYXQgdGhpcyBpcyBzdXBwb3NlZCB0byB0ZWxsIG1lLiBEbyB5b3Ug bWVhbiAiZGV0ZWN0aW9uIGluCj4gcHJvZ3Jlc3MiPyBBbHNvIHdoeSBpcyB0aGlzIGluZm8gbGV2 ZWw/IEkgd291bGQgZXhwZWN0IGVpdGhlcgo+IGRlYnVnIChhc3N1bWluZyBpdCBoYXBwZW5zIHJl Z3VsYXJseSBhbmQgaXMgbm9ybWFsKSBvciB3YXJuaW5nCj4gKGFzc3VtaW5nIGl0IHNob3VsZCBu b3QgaGFwcGVuKS4KPgoKV2hlbiBoYW5kbGluZyBhdHRhY2ggaW50ZXJydXB0IGFuZCBjYWJsZSBw bHVnIG91dCBhdCB0aGUgc2FtZSB0aW1lLCBIVwpjaGFuZ2UgcmVnaXN0ZXIgc3RhdHVzLgpTbyB3 ZSBkb24nIG5lZWQgdG8gaGFuZGxlIHRoaXMgYXR0YWNoIGludGVycnVwdCBhdCB0aGlzIGNhc2Uu Cgo+ID4gKyAgICAgY2FzZSBNVDYzNjBfQ0hHX1RZUEVfU0RQOgo+ID4gKyAgICAgICAgICAgICBt Y2ktPnBzeV91c2JfdHlwZSA9IFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9TRFA7Cj4gPiArICAgICAg ICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBNVDYzNjBfQ0hHX1RZUEVfU0RQTlNURDoKPiA+ ICsgICAgICAgICAgICAgbWNpLT5wc3lfdXNiX3R5cGUgPSBQT1dFUl9TVVBQTFlfVVNCX1RZUEVf U0RQOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgTVQ2MzYwX0NIR19U WVBFX0NEUDoKPiA+ICsgICAgICAgICAgICAgbWNpLT5wc3lfdXNiX3R5cGUgPSBQT1dFUl9TVVBQ TFlfVVNCX1RZUEVfQ0RQOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2Ug TVQ2MzYwX0NIR19UWVBFX0RDUDoKPiA+ICsgICAgICAgICAgICAgbWNpLT5wc3lfdXNiX3R5cGUg PSBQT1dFUl9TVVBQTFlfVVNCX1RZUEVfRENQOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ ICsgICAgIGRlZmF1bHQ6Cj4gPiArICAgICAgICAgICAgIGRldl93YXJuKG1jaS0+ZGV2LAo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAiJXM6IGRpc2Nvbm5lY3Qgb3IgdW5rbm93biBzdGF0dXNc biIsIF9fZnVuY19fKTsKPgo+IFNvIHlvdSBhcmUgcHJpbnRpbmcgYSB3YXJuaW5nIG9uIGV2ZXJ5 IGRpc2Nvbm5lY3Q/Cj4gUGxlYXNlIGRvIG5vdCBzcGFtIGRldmljZSBtZXNzYWdlcy4KPgoKRml4 ZWQuIFNob3VsZCBiZSAidW5rbm93biBzdGF0dXMiLCBub3QgImRpc2Nvbm5lY3QiLCB3aGljaCBp cwp1bmRlZmluZWQgcmVnaXN0ZXIgdmFsdWUuCgo+ID4gKyAgICAgICAgICAgICBnb3RvIG91dDsK PiA+ICsgICAgIH0KPiA+ICsKPiA+ICsgICAgIGRldl9pbmZvKG1jaS0+ZGV2LCAiJXM6IGNoZ190 eXBlID0gJWRcbiIsIF9fZnVuY19fLCBtY2ktPnBzeV91c2JfdHlwZSk7Cj4KPiBUaGlzIHNob3Vs ZCBiZSBkZWJ1ZyBsZXZlbC4KPgoKQUNLCgo+ID4gKyAgICAgaWYgKGxhc3RfdXNiX3R5cGUgIT0g bWNpLT5wc3lfdXNiX3R5cGUpCj4gPiArICAgICAgICAgICAgIHBvd2VyX3N1cHBseV9jaGFuZ2Vk KG1jaS0+cHN5KTsKPiA+ICtvdXQ6Cj4gPiArICAgICBtdXRleF91bmxvY2soJm1jaS0+Y2hnZGV0 X2xvY2spOwo+ID4gKyAgICAgcmV0dXJuIElSUV9IQU5ETEVEOwo+ID4gK30KPiA+ICsKPiA+ICtz dGF0aWMgdm9pZCBtdDYzNjBfaGFuZGxlX2NocmRldF9leHRfZXZ0KHN0cnVjdCBtdDYzNjBfY2hn X2luZm8gKm1jaSkKPiA+ICt7Cj4gPiArICAgICBpbnQgcmV0Owo+ID4gKyAgICAgYm9vbCBwd3Jf cmR5Owo+ID4gKwo+ID4gKyAgICAgbXV0ZXhfbG9jaygmbWNpLT5jaGdkZXRfbG9jayk7Cj4gPiAr ICAgICByZXQgPSBtdDYzNjBfZ2V0X2NocmRldF9leHRfc3RhdChtY2ksICZwd3JfcmR5KTsKPiA+ ICsgICAgIGlmIChyZXQgPCAwKQo+ID4gKyAgICAgICAgICAgICBnb3RvIG91dDsKPiA+ICsgICAg IGlmIChtY2ktPnB3cl9yZHkgPT0gcHdyX3JkeSkgewo+ID4gKyAgICAgICAgICAgICBkZXZfaW5m byhtY2ktPmRldiwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwd3JfcmR5IGlzIHNh bWUoJWQpXG4iLCBfX2Z1bmNfXywgcHdyX3JkeSk7Cj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0 Owo+ID4gKyAgICAgfQo+ID4gKyAgICAgbWNpLT5wd3JfcmR5ID0gcHdyX3JkeTsKPiA+ICsgICAg IGRldl9pbmZvKG1jaS0+ZGV2LCAiJXM6IHB3cl9yZHkgPSAlZFxuIiwgX19mdW5jX18sIHB3cl9y ZHkpOwo+ID4gKyAgICAgaWYgKCFwd3JfcmR5KSB7Cj4gPiArICAgICAgICAgICAgIG1jaS0+cHN5 X3VzYl90eXBlID0gUE9XRVJfU1VQUExZX1VTQl9UWVBFX1VOS05PV047Cj4gPiArICAgICAgICAg ICAgIHBvd2VyX3N1cHBseV9jaGFuZ2VkKG1jaS0+cHN5KTsKPiA+ICsKPiA+ICsgICAgIH0KPiA+ ICsgICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfUE1VX0RFVklDRV9UWVBFLAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9VU0JDSEdFTl9NQVNLLAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHB3cl9yZHkgPyBNVDYzNjBfVVNCQ0hHRU5fTUFTSyA6 IDApOwo+ID4gKyAgICAgaWYgKHJldCA8IDApCj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0Owo+ ID4gKyAgICAgbWNpLT5iYzEyX2VuID0gcHdyX3JkeTsKPiA+ICtvdXQ6Cj4gPiArICAgICBtdXRl eF91bmxvY2soJm1jaS0+Y2hnZGV0X2xvY2spOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9p ZCBtdDYzNjBfY2hyZGV0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ID4gK3sKPiA+ ICsgICAgIHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSA9IChzdHJ1Y3QgbXQ2MzYwX2NoZ19p bmZvICopY29udGFpbmVyX29mKAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB3b3JrLCBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvLCBjaHJkZXRfd29yayk7Cj4gPiArCj4gPiAr ICAgICBkZXZfaW5mbyhtY2ktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICBtdDYz NjBfaGFuZGxlX2NocmRldF9leHRfZXZ0KG1jaSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBp cnFyZXR1cm5fdCBtdDYzNjBfcG11X2NocmRldF9leHRfZXZ0X2hhbmRsZXIoaW50IGlycSwgdm9p ZCAqZGF0YSkKPiA+ICt7Cj4gPiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBk YXRhOwo+ID4gKwo+ID4gKyAgICAgZGV2X2luZm8obWNpLT5kZXYsICIlc1xuIiwgX19mdW5jX18p Owo+ID4gKyAgICAgbXQ2MzYwX2hhbmRsZV9jaHJkZXRfZXh0X2V2dChtY2kpOwo+ID4gKyAgICAg cmV0dXJuIElSUV9IQU5ETEVEOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9j aGdfaXJxX3JlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiArewo+ID4g KyAgICAgY29uc3Qgc3RydWN0IHsKPiA+ICsgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZTsK PiA+ICsgICAgICAgICAgICAgaXJxX2hhbmRsZXJfdCBoYW5kbGVyOwo+ID4gKyAgICAgfSBpcnFf ZGVzY3NbXSA9IHsKPiA+ICsgICAgICAgICAgICAgeyAiYXR0YWNoX2kiLCBtdDYzNjBfcG11X2F0 dGFjaF9pX2hhbmRsZXIgfSwKPiA+ICsgICAgICAgICAgICAgeyAiY2hyZGV0X2V4dF9ldnQiLCBt dDYzNjBfcG11X2NocmRldF9leHRfZXZ0X2hhbmRsZXIgfQo+ID4gKyAgICAgfTsKPiA+ICsgICAg IGludCBpLCByZXQ7Cj4gPiArCj4gPiArICAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShp cnFfZGVzY3MpOyBpKyspIHsKPiA+ICsgICAgICAgICAgICAgcmV0ID0gcGxhdGZvcm1fZ2V0X2ly cV9ieW5hbWUocGRldiwgaXJxX2Rlc2NzW2ldLm5hbWUpOwo+ID4gKyAgICAgICAgICAgICBpZiAo cmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKwo+ID4g KyAgICAgICAgICAgICByZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZwZGV2LT5kZXYs IHJldCwgTlVMTCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBpcnFfZGVzY3NbaV0uaGFuZGxlciwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBJUlFGX1RSSUdHRVJfRkFMTElORywKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFfZGVzY3NbaV0ubmFtZSwKPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybV9n ZXRfZHJ2ZGF0YShwZGV2KSk7Cj4gPiArICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Cj4gPiAr ICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVl c3QgJXMgaXJxXG4iLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJxX2Rlc2Nz W2ldLm5hbWUpOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAg ICAgICAgICAgIH0KPiA+ICsgICAgIH0KPiA+ICsKPiA+ICsgICAgIHJldHVybiAwOwo+ID4gK30K PiA+ICsKPiA+ICtzdHJ1Y3QgbXQ2MzYwX2ZpZWxkX2luZm8gewo+ID4gKyAgICAgc3RydWN0IGRl dmljZV9hdHRyaWJ1dGUgZGV2X2F0dHI7Cj4gPiArICAgICB1MTYgcmVnOwo+ID4gKyAgICAgdTgg bWFzazsKPiA+ICsgICAgIHU4IHNoZnQ7Cj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgc3NpemVf dCBtdDYzNjBfc3lzZnNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gPiArICAgICAgICAgICAg IHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOwo+ID4gK3N0YXRpYyBz c2l6ZV90IG10NjM2MF9zeXNmc19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gPiArICAgICAg ICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNp emVfdCBjb3VudCk7Cj4gPiArCj4gPiArI2RlZmluZSBNVDYzNjBfRklFTERfUlcoX25hbWUsIF9y ZWcsIF9uYml0KSAgICAgICAgICAgICAgICAgIFwKPiA+ICt7ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgLmRldl9h dHRyID0gX19BVFRSKF9uYW1lLCAwNjY0LCAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiAr ICAgICAgICAgICAgICAgICAgICBtdDYzNjBfc3lzZnNfc2hvdywgbXQ2MzYwX3N5c2ZzX3N0b3Jl KSwgIFwKPiA+ICsgICAgIC5yZWcgICAgPSBNVDYzNjBfUE1VXyMjX3JlZywgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgLm1hc2sgICA9IE1UNjM2MF8jI19uYml0IyNfTUFT SywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICsgICAgIC5zaGZ0ICAgPSBN VDYzNjBfIyNfbmJpdCMjX1NIRlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4g PiArfQo+ID4gKwo+ID4gKyNkZWZpbmUgTVQ2MzYwX0ZJRUxEX1JPKF9uYW1lLCBfcmVnLCBfbmJp dCkgICAgICAgICAgICAgICAgICBcCj4gPiAreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICsgICAgIC5kZXZfYXR0ciA9IF9f QVRUUihfbmFtZSwgMDQ0NCwgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgIG10NjM2MF9zeXNmc19zaG93LCBOVUxMKSwgICAgICAgICAgICAgICBcCj4g PiArICAgICAucmVnICAgID0gTVQ2MzYwX1BNVV8jI19yZWcsICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKPiA+ICsgICAgIC5tYXNrICAgPSBNVDYzNjBfIyNfbmJpdCMjX01BU0ssICAgICAg ICAgICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgLnNoZnQgICA9IE1UNjM2MF8jI19uYml0IyNf U0hGVCwgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBz dHJ1Y3QgbXQ2MzYwX2ZpZWxkX2luZm8gbXQ2MzYwX2ZpZWxkX3RibFtdID0gewo+ID4gKyAgICAg TVQ2MzYwX0ZJRUxEX1JXKGhpeiwgICAgICAgICAgICBDSEdfQ1RSTDEsICAgICAgSElaKSwKPiA+ ICsgICAgIE1UNjM2MF9GSUVMRF9SVyh2bWl2ciwgICAgICAgICAgQ0hHX0NUUkw2LCAgICAgIFZN SVZSKSwKPiA+ICsgICAgIE1UNjM2MF9GSUVMRF9SVyhpYWljciwgICAgICAgICAgQ0hHX0NUUkwz LCAgICAgIElBSUNSKSwKPiA+ICsgICAgIE1UNjM2MF9GSUVMRF9SVyhTWVNSRUcsICAgICAgICAg Q0hHX0NUUkwxMSwgICAgIFNZU1JFRyksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcob3RnX29j LCAgICAgICAgIENIR19DVFJMMTAsICAgICBPVEdfT0MpLAo+ID4gKyAgICAgTVQ2MzYwX0ZJRUxE X1JXKGljaGcsICAgICAgICAgICBDSEdfQ1RSTDE3LCAgICAgSUNIRyksCj4gPiArICAgICBNVDYz NjBfRklFTERfUlcoaXByZWMsICAgICAgICAgIENIR19DVFJMOCwgICAgICBJUFJFQyksCj4gPiAr ICAgICBNVDYzNjBfRklFTERfUlcoaWVvYywgICAgICAgICAgIENIR19DVFJMOSwgICAgICBJRU9D KSwKPiA+ICsgICAgIE1UNjM2MF9GSUVMRF9SVyh2b3JlZywgICAgICAgICAgQ0hHX0NUUkw0LCAg ICAgIFZPUkVHKSwKPiA+ICsgICAgIE1UNjM2MF9GSUVMRF9SVyhsYnAsICAgICAgICAgICAgQ0hH X0NUUkwxMCwgICAgIExCUCksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcodnJlYywgICAgICAg ICAgIENIR19DVFJMMTEsICAgICBWUkVDKSwKPiA+ICsgICAgIE1UNjM2MF9GSUVMRF9SVyh0ZSwg ICAgICAgICAgICAgQ0hHX0NUUkwyLCAgICAgIFRFKSwKPiA+ICsgICAgIE1UNjM2MF9GSUVMRF9S VyhjaGdfd2R0X2VuLCAgICAgQ0hHX0NUUkwxMywgICAgIENIR19XRFRfRU4pLAo+ID4gKyAgICAg TVQ2MzYwX0ZJRUxEX1JXKGNoZ193ZHQsICAgICAgICBDSEdfQ1RSTDEzLCAgICAgQ0hHX1dEVCks Cj4gPiArICAgICBNVDYzNjBfRklFTERfUlcod3RfZmMsICAgICAgICAgIENIR19DVFJMMTIsICAg ICBXVF9GQyksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcoYmF0X2NvbXAsICAgICAgIENIR19D VFJMMTgsICAgICBCQVRfQ09NUCksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcodmNsYW1wLCAg ICAgICAgIENIR19DVFJMMTgsICAgICBWQ0xBTVApLAo+ID4gKyAgICAgTVQ2MzYwX0ZJRUxEX1JX KHVzYmNoZ2VuLCAgICAgICBERVZJQ0VfVFlQRSwgICAgVVNCQ0hHRU4pLAo+ID4gKyAgICAgTVQ2 MzYwX0ZJRUxEX1JXKGNoZ19lbiwgICAgICAgICBDSEdfQ1RSTDIsICAgICAgQ0hHX0VOKSwKPiA+ ICsgICAgIE1UNjM2MF9GSUVMRF9STyhjaHJkZXRfZXh0LCAgICAgRk9EX1NUQVQsICAgICAgIENI UkRFVF9FWFQpLAo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm10 NjM2MF9hdHRyc1tBUlJBWV9TSVpFKG10NjM2MF9maWVsZF90YmwpICsgMV07Cj4gPiArCj4gPiAr c3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbXQ2MzYwX2F0dHJfZ3JvdXAgPSB7 Cj4gPiArICAgICAuYXR0cnMgPSBtdDYzNjBfYXR0cnMsCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0 aWMgc3NpemVfdCBtdDYzNjBfc3lzZnNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIs IGNoYXIgKmJ1ZikKPiA+ICt7Cj4gPiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kg PSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOwo+ID4gKyAgICAgc3RydWN0IG10NjM2MF9m aWVsZF9pbmZvICppbmZvID0gKHZvaWQgKilhdHRyOwo+ID4gKyAgICAgdW5zaWduZWQgaW50IHJl Z3ZhbDsKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArCj4gPiArICAgICByZXQgPSByZWdtYXBfcmVh ZChtY2ktPnJlZ21hcCwgaW5mby0+cmVnLCAmcmVndmFsKTsKPiA+ICsgICAgIGlmIChyZXQgPCAw KQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAgICAgcmVndmFsID0gKHJlZ3Zh bCAmIGluZm8tPm1hc2spID4+IGluZm8tPnNoZnQ7Cj4gPiArICAgICByZXR1cm4gc2NucHJpbnRm KGJ1ZiwgUEFHRV9TSVpFLCAiJTAyeFxuIiwgcmVndmFsKTsKPiA+ICt9Cj4gPiArCj4gPiArc3Rh dGljIHNzaXplX3QgbXQ2MzYwX3N5c2ZzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKPiA+ICsg ICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIg KmJ1Ziwgc2l6ZV90IGNvdW50KQo+ID4gK3sKPiA+ICsgICAgIHN0cnVjdCBtdDYzNjBfY2hnX2lu Zm8gKm1jaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7Cj4gPiArICAgICBzdHJ1Y3Qg bXQ2MzYwX2ZpZWxkX2luZm8gKmluZm8gPSAodm9pZCAqKWF0dHI7Cj4gPiArICAgICBpbnQgcmV0 LCB0bXA7Cj4gPiArCj4gPiArICAgICBpZiAoa3N0cnRvaW50KGJ1ZiwgMTAsICZ0bXApIDwgMCkg ewo+ID4gKyAgICAgICAgICAgICBkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBwYXJzZSBudW1iZXJc biIpOwo+ID4gKyAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKPiA+ICsgICAgIH0KPiA+ICsg ICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBpbmZvLT5yZWcsIGluZm8tPm1hc2ssIHRtcCA8PCBpbmZvLT5z aGZ0KTsKPiA+ICsgICAgIGlmIChyZXQgPCAwKQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0 Owo+ID4gKyAgICAgcmV0dXJuIGNvdW50Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10 NjM2MF9zeXNmc19jcmVhdGVfZ3JvdXAoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpKQo+ID4g K3sKPiA+ICsgICAgIGludCBpLCB0Yl9zaXplID0gQVJSQVlfU0laRShtdDYzNjBfZmllbGRfdGJs KTsKPiA+ICsKPiA+ICsgICAgIGZvciAoaSA9IDA7IGkgPCB0Yl9zaXplOyBpKyspCj4gPiArICAg ICAgICAgICAgIG10NjM2MF9hdHRyc1tpXSA9ICYobXQ2MzYwX2ZpZWxkX3RibFtpXS5kZXZfYXR0 ci5hdHRyKTsKPiA+ICsgICAgIHJldHVybiBkZXZtX2RldmljZV9hZGRfZ3JvdXAoJm1jaS0+cHN5 LT5kZXYsICZtdDYzNjBfYXR0cl9ncm91cCk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQg bXQ2MzYwX2NoZ19pbml0X3NldHRpbmcoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpKQo+ID4g K3sKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArCj4gPiArICAgICByZXQgPSByZWdtYXBfdXBkYXRl X2JpdHMobWNpLT5yZWdtYXAsIE1UNjM2MF9QTVVfREVWSUNFX1RZUEUsCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX1VTQkNIR0VOX01BU0ssIDApOwo+ID4gKyAgICAg aWYgKHJldCA8IDApIHsKPiA+ICsgICAgICAgICAgICAgZGV2X2VycihtY2ktPmRldiwgIiVzOiBG YWlsZWQgdG8gZGlzYWJsZSBiYzEyXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICAgICAgICAgIGdv dG8gb3V0Owo+ID4gKyAgICAgfQo+ID4gKyAgICAgcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKG1j aS0+cmVnbWFwLCBNVDYzNjBfUE1VX0NIR19DVFJMMiwKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBNVDYzNjBfSUlOTE1UU0VMX01BU0ssCj4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgTVQ2MzYwX0lJTkxNVFNFTF9BSUNSIDw8Cj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JSU5MTVRTRUxfU0hGVCk7Cj4gPiArICAgICBp ZiAocmV0IDwgMCkgewo+ID4gKyAgICAgICAgICAgICBkZXZfZXJyKG1jaS0+ZGV2LAo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIHN3aXRjaCBpaW5sbXRzZWwgdG8gYWlj clxuIiwgX19mdW5jX18pOwo+ID4gKyAgICAgICAgICAgICBnb3RvIG91dDsKPiA+ICsgICAgIH0K PiA+ICsgICAgIHVzbGVlcF9yYW5nZSg1MDAwLCA2MDAwKTsKPiA+ICsgICAgIHJldCA9IHJlZ21h cF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdfQ1RSTDMsCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lMSU1fRU5fTUFTSywgMCk7Cj4gPiAr ICAgICBpZiAocmV0IDwgMCkgewo+ID4gKyAgICAgICAgICAgICBkZXZfZXJyKG1jaS0+ZGV2LAo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIGRpc2FibGUgaWxpbVxuIiwg X19mdW5jX18pOwo+ID4gKyAgICAgICAgICAgICBnb3RvIG91dDsKPiA+ICsgICAgIH0KPiA+ICsg ICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdf Q1RSTDEwLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9PVEdfT0Nf TUFTSywgTVQ2MzYwX09UR19PQ19NQVNLKTsKPiA+ICsgICAgIGlmIChyZXQgPCAwKSB7Cj4gPiAr ICAgICAgICAgICAgIGRldl9lcnIobWNpLT5kZXYsCj4gPiArICAgICAgICAgICAgICAgICAgICAg IiVzOiBGYWlsZWQgdG8gY29uZmlnIG90ZyBvYyB0byAzQVxuIiwgX19mdW5jX18pOwo+ID4gKyAg ICAgfQo+ID4gK291dDoKPiA+ICsgICAgIHJldHVybiByZXQ7Cj4KPiByZW1vdmUgdXNlbGVzcyBn b3RvIGFuZCByZXR1cm4gZGlyZWN0bHkgbGlrZSB0aGlzICh3aXRob3V0IHRoZQo+IF9fZnVuY19f IHBhcnQpOgo+Cj4gcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKC4uLik7Cj4gaWYgKHJldCA8IDAp Cj4gICAgIHJldHVybiBkZXZfZXJyX3Byb2JlKG1jaS0+ZGV2LCByZXQsICJGYWlsZWQgdG8gZG8g eHl6IVxuIikuCj4KCkFDSwoKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHUzMiBtdDYzNjBfdmlu b3ZwX3RyYW5zX3RvX3NlbCh1MzIgdmFsKQo+ID4gK3sKPiA+ICsgICAgIHUzMiB2aW5vdnBfdGJs W10gPSB7IDU1MDAwMDAsIDY1MDAwMDAsIDExMDAwMDAwLCAxNDUwMDAwMCB9Owo+ID4gKyAgICAg aW50IGk7Cj4gPiArCj4gPiArICAgICAvKiBTZWxlY3QgdGhlIHNtYWxsZXIgYW5kIGVxdWFsIHN1 cHBvcnRlZCB2YWx1ZSAqLwo+ID4gKyAgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmlu b3ZwX3RibCktMTsgaSsrKSB7Cj4gPiArICAgICAgICAgICAgIGlmICh2YWwgPCB2aW5vdnBfdGJs W2krMV0pCj4gPiArICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICB9Cj4gPiAr ICAgICByZXR1cm4gaTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHN0cnVjdCBtdDYzNjBfY2hn X3BsYXRmb3JtX2RhdGEgKm10NjM2MF9wYXJzZV9wZGF0YSgKPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpw ZGV2KQo+ID4gK3sKPiA+ICsgICAgIHN0cnVjdCBtdDYzNjBfY2hnX3BsYXRmb3JtX2RhdGEgKnBk YXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKPiA+ICsgICAgIHN0cnVjdCBkZXZp Y2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKPiA+ICsgICAgIGludCByZXQ7Cj4gPiAr Cj4gPiArICAgICBwZGF0YSA9IGttZW1kdXAoJmRlZl9wbGF0Zm9ybV9kYXRhLCBzaXplb2YoKnBk YXRhKSwgR0ZQX0tFUk5FTCk7Cj4gPiArICAgICByZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihu cCwgInJpY2h0ZWssdmlub3ZwLW1pY3Jvdm9sdCIsCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAmcGRhdGEtPnZpbm92cCk7Cj4KPiB1c2UgZGV2aWNlX3Byb3BlcnR5X3JlYWRf dTMyKCk7Cj4KCkFDSwoKPiA+ICsgICAgIGlmIChyZXQpIHsKPiA+ICsgICAgICAgICAgICAgZGV2 X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHBhcnNlIHZpbm92cCBpbiBEVFxuIik7Cj4gPiAr ICAgICAgICAgICAgIHJldHVybiBFUlJfUFRSKHJldCk7Cj4gPiArICAgICB9Cj4gPiArICAgICBy ZXR1cm4gcGRhdGE7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2FwcGx5X3Bk YXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiArewo+ID4gKyAgICAgc3RydWN0 IG10NjM2MF9jaGdfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2 LT5kZXYpOwo+ID4gKyAgICAgc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpID0gZGV2X2dldF9k cnZkYXRhKCZwZGV2LT5kZXYpOwo+ID4gKyAgICAgaW50IHJldDsKPiA+ICsgICAgIHUzMiBzZWw7 Cj4gPiArCj4gPiArICAgICBzZWwgPSBtdDYzNjBfdmlub3ZwX3RyYW5zX3RvX3NlbChwZGF0YS0+ dmlub3ZwKTsKPiA+ICsgICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwg TVQ2MzYwX1BNVV9DSEdfQ1RSTDE5LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IE1UNjM2MF9WSU5PVlBfTUFTSywgc2VsIDw8IE1UNjM2MF9WSU5PVlBfU0hGVCk7Cj4gPiArICAg ICBpZiAocmV0KQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAgICAgcmV0dXJu IDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfcHJvYmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+ICt7Cj4gPiArICAgICBzdHJ1Y3QgbXQ2MzYw X2NoZ19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7 Cj4KPiBUaGUgdmFsdWUgaXMgdW51c2VkLCBzbyBpbml0IHRvIE5VTEwgb3Igbm90IGF0IGFsbC4K PgoKQUNLCgo+ID4gKyAgICAgc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpOwo+ID4gKyAgICAg c3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgY2hhcmdlcl9jZmcgPSB7fTsKPiA+ICsgICAgIHN0 cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKPiA+ICsgICAgIGludCByZXQ7Cj4g PiArCj4gPiArICAgICBtY2kgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCptY2kp LCBHRlBfS0VSTkVMKTsKPiA+ICsgICAgIGlmICghbWNpKQo+ID4gKyAgICAgICAgICAgICByZXR1 cm4gLUVOT01FTTsKPiA+ICsKPiA+ICsgICAgIHBkYXRhID0gbXQ2MzYwX3BhcnNlX3BkYXRhKHBk ZXYpOwo+ID4gKyAgICAgaWYgKElTX0VSUl9PUl9OVUxMKHBkYXRhKSkKPiA+ICsgICAgICAgICAg ICAgcmV0dXJuIFBUUl9FUlIocGRhdGEpOwo+ID4gKwo+ID4gKyAgICAgcGRldi0+ZGV2LnBsYXRm b3JtX2RhdGEgPSBwZGF0YTsKPgo+IGluc3RlYWQgb2YgYWxsIHRoaXMgY29kZSBmb3IgYSBzaW5n bGUgdmFyaWFibGUsIGp1c3Qgc3RvcmUgaXQKPiBkaXJlY3RseSBpbnRvIHN0cnVjdCBtdDYzNjBf Y2hnX2luZm8gYW5kIGRyb3AgYWxsIHRoYXQKPiBwbGF0Zm9ybV9kYXRhIGNvZGUuIEFsc28gbm8g bmVlZCB0byBtb3ZlIGl0IGludG8gZXh0cmEgZnVuY3Rpb246Cj4KPiBtY2ktPnZpbm92cCA9IDY1 MDAwMDA7Cj4gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKCZwZGV2LT5kZXYsICJyaWNodGVrLHZp bm92cC1taWNyb3ZvbHQiLCAmbWNpLT52aW5vdnApOwo+CgpBQ0sKCgo+ID4gKyAgICAgbWNpLT5k ZXYgPSAmcGRldi0+ZGV2Owo+ID4gKyAgICAgbXV0ZXhfaW5pdCgmbWNpLT5jaGdkZXRfbG9jayk7 Cj4gPiArICAgICBwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtY2kpOwo+ID4gKyAgICAgSU5J VF9XT1JLKCZtY2ktPmNocmRldF93b3JrLCAmbXQ2MzYwX2NocmRldF93b3JrKTsKPiA+ICsKPiA+ ICsgICAgIG1jaS0+cmVnbWFwID0gZGV2X2dldF9yZWdtYXAocGRldi0+ZGV2LnBhcmVudCwgTlVM TCk7Cj4gPiArICAgICBpZiAoIW1jaS0+cmVnbWFwKSB7Cj4gPiArICAgICAgICAgICAgIGRldl9l cnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgcGFyZW50IHJlZ21hcFxuIik7Cj4gPiArICAg ICAgICAgICAgIHJldHVybiAtRU5PREVWOwo+ID4gKyAgICAgfQo+Cj4gdXNlICdyZXR1cm4gZGV2 X2Vycl9wcm9iZSgmcGRldi0+ZGV2LCAtRU5PREVWLCAiLi4uIik7Cj4KCkFDSwoKPiA+ICsgICAg IHJldCA9IG10NjM2MF9hcHBseV9wZGF0YShwZGV2KTsKPiA+ICsgICAgIGlmIChyZXQpIHsKPiA+ ICsgICAgICAgICAgICAgZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFwcGx5IHBkYXRh XG4iKTsKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICsgICAgIH0KPgo+IHVzZSAn cmV0dXJuIGRldl9lcnJfcHJvYmUoJnBkZXYtPmRldiwgcmV0LCAiLi4uIik7Cj4KPiBBbHNvIGNh biB0aGlzIGZ1bmN0aW9uIGJlIGZvbGRlZCBpbnRvIG10NjM2MF9jaGdfaW5pdF9zZXR0aW5nKCk/ Cj4KCkFDSwoKPiA+ICsgICAgIG1lbWNweSgmbWNpLT5wc3lfZGVzYywgJm10NjM2MF9jaGFyZ2Vy X2Rlc2MsIHNpemVvZihtY2ktPnBzeV9kZXNjKSk7Cj4gPiArICAgICBtY2ktPnBzeV9kZXNjLm5h bWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKPiA+ICsgICAgIGNoYXJnZXJfY2ZnLmRydl9kYXRh ID0gbWNpOwo+ID4gKyAgICAgY2hhcmdlcl9jZmcub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2Rl Owo+ID4gKyAgICAgY2hhcmdlcl9jZmcuc3VwcGxpZWRfdG8gPSBtdDYzNjBfY2hhcmdlcl9zdXBw bGllZF90bzsKPiA+ICsgICAgIGNoYXJnZXJfY2ZnLm51bV9zdXBwbGljYW50cyA9IEFSUkFZX1NJ WkUobXQ2MzYwX2NoYXJnZXJfc3VwcGxpZWRfdG8pOwo+Cj4gd2h5IGRvIHlvdSBuZWVkIHRvIHBy b3ZpZGUgc3VwcGxpZWRfdG8/IHRoaXMgc2hvdWxkIGJlIGdlbmVyYXRlZAo+IGF1dG9tYXRpY2Fs bHkgZnJvbSBkZXZpY2V0cmVlLgo+CgpBQ0sKCj4gPiArICAgICBtY2ktPnBzeSA9IGRldm1fcG93 ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICZtY2ktPnBzeV9kZXNjLCAmY2hhcmdlcl9jZmcpOwo+ID4g KyAgICAgaWYgKElTX0VSUihtY2ktPnBzeSkpIHsKPiA+ICsgICAgICAgICAgICAgZGV2X2Vycigm cGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHBvd2VyIHN1cHBseSBkZXZcbiIpOwo+ID4g KyAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUihtY2ktPnBzeSk7Cj4gPiArICAgICB9Cj4KPiBk ZXZfZXJyX3Byb2JlKCkKPgoKQUNLCgo+ID4gKwo+ID4gKyAgICAgcmV0ID0gbXQ2MzYwX2NoZ19p bml0X3NldHRpbmcobWNpKTsKPiA+ICsgICAgIGlmIChyZXQpIHsKPiA+ICsgICAgICAgICAgICAg ZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGluaXRpYWwgc2V0dGluZ1xuIik7Cj4gPiAr ICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICB9Cj4KPiBkZXZfZXJyX3Byb2JlKCkK Pgo+ID4gKyAgICAgc2NoZWR1bGVfd29yaygmbWNpLT5jaHJkZXRfd29yayk7Cj4KCkFDSwoKPiBj b25zaWRlcmluZyB3b3JrIGlzIG9ubHkgc2NoZWR1bGVkIG9uY2UgaW4gdGhpcyBwbGFjZSwgd2h5 IGRvIHlvdQo+IG5lZWQgaXQ/ICBjYW4ndCB5b3Ugc2ltcGx5IGNhbGwgbXQ2MzYwX2hhbmRsZV9j aHJkZXRfZXh0X2V2dCgpIGhlcmUKPiBhbmQgcmVtb3ZlIGFsbCB3b3JrZXIgcmVsYXRlZCBjb2Rl Pwo+Cj4gPiArICAgICByZXQgPSBtdDYzNjBfY2hnX2lycV9yZWdpc3RlcihwZGV2KTsKPiA+ICsg ICAgIGlmIChyZXQpIHsKPiA+ICsgICAgICAgICAgICAgZGV2X2VycigmcGRldi0+ZGV2LCAiRmFp bGVkIHRvIHJlZ2lzdGVyIGlycXNcbiIpOwo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ ID4gKyAgICAgfQo+Cj4gZGV2X2Vycl9wcm9iZSgpOwo+CgpBQ0sKCj4gPiArICAgICBjb25maWcu ZGV2ID0gJnBkZXYtPmRldjsKPiA+ICsgICAgIGNvbmZpZy5yZWdtYXAgPSBtY2ktPnJlZ21hcDsK PiA+ICsgICAgIG1jaS0+b3RnX3JkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ ZGV2LCAmbXQ2MzYwX290Z19yZGVzYywKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAmY29uZmlnKTsKPiA+ICsgICAgIGlmIChJU19FUlIobWNpLT5vdGdf cmRldikpCj4gPiArICAgICAgICAgICAgIHJldHVybiBQVFJfRVJSKG1jaS0+b3RnX3JkZXYpOwo+ ID4gKwo+ID4gKyAgICAgcmV0ID0gbXQ2MzYwX3N5c2ZzX2NyZWF0ZV9ncm91cChtY2kpOwo+ID4g KyAgICAgaWYgKHJldCkgewo+ID4gKyAgICAgICAgICAgICBkZXZfZXJyKCZwZGV2LT5kZXYsCj4g PiArICAgICAgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGF0dHJz XG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICB9 Cj4KPiBVc2UgY2hhcmdlcl9jZmcuYXR0cl9ncnAgdG8gcmVnaXN0ZXIgY3VzdG9tIHN5c2ZzIGdy b3VwIGZvcgo+IHBvd2VyLXN1cHBseSBkZXZpY2VzLiBPdGhlcndpc2UgeW91ciBjb2RlIGlzIHJh Y3kgKHVkZXYgbWF5IG5vdCBwaWNrCj4gdXAgdGhlIHN5c2ZzIGF0dHJpYnV0ZXMpLiBBbHNvIGN1 c3RvbSBzeXNmcyBhdHRyaWJ1dGVzIG5lZWQgdG8gYmUKPiBkb2N1bWVudGVkIGluIERvY3VtZW50 YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtcG93ZXItPGRyaXZlcj4uCj4KPiBMb29raW5n IGF0IHRoZSBhdHRyaWJ1dGVzIHlvdSBhcmUgcGxhbm5pbmcgdG8gZXhwb3NlLCBJIGRvbid0IHRo aW5rIHRoZXkKPiBhcmUgc3VpdGFibGUgZm9yIHN5c2ZzIGFueXdheXMuIExvb2tzIG1vcmUgbGlr ZSBhIGRlYnVnIGludGVyZmFjZSwgd2hpY2gKPiBzaG91bGQgZ28gaW50byBkZWJ1Z2ZzIGluc3Rl YWQuIEJ1dCBpdCdzIGhhcmQgdG8gdGVsbCB3aXRob3V0IGFueSBkb2N1bWVudGF0aW9uCj4gYmVp bmcgcHJvdmlkZWQgOikKPgoKQUNLLCBJIHdpbGwgY2hhbmdlIHRvIGNoYXJnZXJfY2ZnLmF0dHJf Z3JwLgpJIGFzc3VtZWQgdGhlIGNoYXJnZXIgYWxnb3JpdGhtIHRocmVhZCBpcyBpbiB1c2VyIHNw YWNlLCBhbmQgdGFrZQpjb250cm9sIGJ5IHN5c2ZzIG5vZGUgZnJvbSBjaGFyZ2VyIGRldmljZSwg bGlrZSBicTI0MTkwLmMuClNob3VsZCBJIGNoYW5nZSB0byBkZWJ1Z2ZzPwoKPiA+ICsgICAgIHJl dHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9p ZCBfX21heWJlX3VudXNlZCBtdDYzNjBfY2hhcmdlcl9vZl9pZFtdID0gewo+ID4gKyAgICAgeyAu Y29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDYzNjAtY2hnIiwgfSwKPiA+ICsgICAgIHt9LAo+ID4g K307Cj4gPiArTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXQ2MzYwX2NoYXJnZXJfb2ZfaWQpOwo+ ID4gKwo+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIG10NjM2MF9j aGFyZ2VyX2lkW10gPSB7Cj4gPiArICAgICB7ICJtdDYzNjAtY2hnIiwgMCB9LAo+ID4gKyAgICAg e30sCj4gPiArfTsKPiA+ICtNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBtdDYzNjBfY2hh cmdlcl9pZCk7Cj4gPiArCj4gPiArc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXQ2MzYw X2NoYXJnZXJfZHJpdmVyID0gewo+ID4gKyAgICAgLmRyaXZlciA9IHsKPiA+ICsgICAgICAgICAg ICAgLm5hbWUgPSAibXQ2MzYwLWNoZyIsCj4gPiArICAgICAgICAgICAgIC5vZl9tYXRjaF90YWJs ZSA9IG9mX21hdGNoX3B0cihtdDYzNjBfY2hhcmdlcl9vZl9pZCksCj4gPiArICAgICB9LAo+ID4g KyAgICAgLnByb2JlID0gbXQ2MzYwX2NoYXJnZXJfcHJvYmUsCj4gPiArICAgICAuaWRfdGFibGUg PSBtdDYzNjBfY2hhcmdlcl9pZCwKPiA+ICt9Owo+ID4gK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIo bXQ2MzYwX2NoYXJnZXJfZHJpdmVyKTsKPiA+ICsKPiA+ICtNT0RVTEVfQVVUSE9SKCJDWV9IdWFu ZyA8Y3lfaHVhbmdAcmljaHRlay5jb20+Iik7Cj4KPiBDYW4geW91IGZpeCB0aGUgbmFtZT8gQWxz byBpdCBkaWZmZXJzIGZyb20geW91LCBidXQgSSBkbyBub3Qgc2VlIGFueQo+IGV4dHJhIFNpZ25l ZC1vZmYtYnkgbGluZT8KPgoKQUNLCgo+IFRoYW5rcywKPgo+IC0tIFNlYmFzdGlhbgo+Cj4gPiAr TU9EVUxFX0RFU0NSSVBUSU9OKCJNVDYzNjAgQ2hhcmdlciBEcml2ZXIiKTsKPiA+ICtNT0RVTEVf TElDRU5TRSgiR1BMIik7Cj4gPiAtLQo+ID4gMi43LjQKPiA+CgpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlz dApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJh ZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==