From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtpbg.qq.com (smtpbg127.qq.com [109.244.180.96]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AA14C70 for ; Mon, 2 Aug 2021 09:05:26 +0000 (UTC) X-QQ-mid: bizesmtp43t1627895013tynlxyhr Received: from [192.168.0.46] (unknown [113.89.245.207]) by esmtp6.qq.com (ESMTP) with id ; Mon, 02 Aug 2021 17:03:33 +0800 (CST) X-QQ-SSF: 00100000002000208000D00A0000000 X-QQ-FEAT: dMLGSgzcGosioRzVDyqmmclh5TC7ofhwWZPRAjF0duMSAtrgLqM4KfXyUsxO4 7/lLsqx0fi5DeB8VAJm0EQhrkubZyBHi2hIzo/SL8KB7dsGTmSuUq8zAu3tSWvdfC85TxI+ f1iMX8cau+LtW2Uo7JBD+A5YgOsvTWIKmbr9ym5XAnCDWjcSlaDQCDx24EWQpz15gXPyehr gFq8uQZV8FuKhZlLZqD1JbO1ZRwBRSOcmDnnKHS9HMgl8QdHC13EC/RMgEDgvvkAwXFq1Cy xFiqyffD/o065iR1gP6vfLlZ9+8JjxzF6Y7C055jJd79DFhyIQbT5kjD7Vtbriu/z+QrGF0 E1cLsWGjDFHtpdkJRUNlE/zjntmMMSMvzMreTeSMWz1wSxng54= X-QQ-GoodBg: 0 Message-ID: +88AC50AA4723D6F3 Subject: Re: [PATCH 10/17] clk: sunxi=ng: add support for R329 R-CCU From: Icenowy Zheng To: Rob Herring , Maxime Ripard , Chen-Yu Tsai , Jernej Skrabec , Ulf Hansson , Linus Walleij , Alexandre Belloni , Andre Przywara , Samuel Holland Cc: devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org Date: Mon, 02 Aug 2021 17:03:32 +0800 In-Reply-To: <20210802062212.73220-11-icenowy@sipeed.com> References: <20210802062212.73220-1-icenowy@sipeed.com> <20210802062212.73220-11-icenowy@sipeed.com> Organization: Sipeed Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.40.0 Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:sipeed.com:qybgspam:qybgspam1 在 2021-08-02星期一的 14:22 +0800,Icenowy Zheng写道: > Allwinner R329 has clock controls in PRCM, like other new Allwinner > SoCs. > > Add support for them. > > This driver is added before the main CCU because PLLs are controlled > by > R-CCU on R329. Well, I forgot to mention that the R_DMA bus clock gates/resets are not documented on the user manual, and the info here is get by experiment. There seems to be another hidden bus clock gate/reset according to a register dump of R_CCU done on BSP kernel, but I have no idea what it is. > > Signed-off-by: Icenowy Zheng > --- >  drivers/clk/sunxi-ng/Kconfig                  |   5 + >  drivers/clk/sunxi-ng/Makefile                 |   1 + >  drivers/clk/sunxi-ng/ccu-sun50i-r329-r.c      | 374 > ++++++++++++++++++ >  drivers/clk/sunxi-ng/ccu-sun50i-r329-r.h      |  33 ++ >  include/dt-bindings/clock/sun50i-r329-r-ccu.h |  33 ++ >  include/dt-bindings/reset/sun50i-r329-r-ccu.h |  24 ++ >  6 files changed, 470 insertions(+) >  create mode 100644 drivers/clk/sunxi-ng/ccu-sun50i-r329-r.c >  create mode 100644 drivers/clk/sunxi-ng/ccu-sun50i-r329-r.h >  create mode 100644 include/dt-bindings/clock/sun50i-r329-r-ccu.h >  create mode 100644 include/dt-bindings/reset/sun50i-r329-r-ccu.h > > diff --git a/drivers/clk/sunxi-ng/Kconfig b/drivers/clk/sunxi- > ng/Kconfig > index cd46d8853876..e49b2c2fa5b7 100644 > --- a/drivers/clk/sunxi-ng/Kconfig > +++ b/drivers/clk/sunxi-ng/Kconfig > @@ -42,6 +42,11 @@ config SUN50I_H6_R_CCU >         default ARM64 && ARCH_SUNXI >         depends on (ARM64 && ARCH_SUNXI) || COMPILE_TEST >   > +config SUN50I_R329_R_CCU > +       bool "Support for the Allwinner R329 PRCM CCU" > +       default ARM64 && ARCH_SUNXI > +       depends on (ARM64 && ARCH_SUNXI) || COMPILE_TEST > + >  config SUN4I_A10_CCU >         bool "Support for the Allwinner A10/A20 CCU" >         default MACH_SUN4I > diff --git a/drivers/clk/sunxi-ng/Makefile b/drivers/clk/sunxi- > ng/Makefile > index 96c324306d97..db338a2188fd 100644 > --- a/drivers/clk/sunxi-ng/Makefile > +++ b/drivers/clk/sunxi-ng/Makefile > @@ -28,6 +28,7 @@ obj-$(CONFIG_SUN50I_A100_R_CCU)       += ccu- > sun50i-a100-r.o >  obj-$(CONFIG_SUN50I_H6_CCU)    += ccu-sun50i-h6.o >  obj-$(CONFIG_SUN50I_H616_CCU)  += ccu-sun50i-h616.o >  obj-$(CONFIG_SUN50I_H6_R_CCU)  += ccu-sun50i-h6-r.o > +obj-$(CONFIG_SUN50I_R329_R_CCU)        += ccu-sun50i-r329-r.o >  obj-$(CONFIG_SUN4I_A10_CCU)    += ccu-sun4i-a10.o >  obj-$(CONFIG_SUN5I_CCU)                += ccu-sun5i.o >  obj-$(CONFIG_SUN6I_A31_CCU)    += ccu-sun6i-a31.o > diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-r329-r.c > b/drivers/clk/sunxi-ng/ccu-sun50i-r329-r.c > new file mode 100644 > index 000000000000..5413a701cb57 > --- /dev/null > +++ b/drivers/clk/sunxi-ng/ccu-sun50i-r329-r.c > @@ -0,0 +1,374 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (c) 2021 Sipeed > + * Based on the H616 CCU driver, which is: > + *   Copyright (c) 2020 Arm Ltd. > + */ > + > +#include > +#include > +#include > +#include > + > +#include "ccu_common.h" > +#include "ccu_reset.h" > + > +#include "ccu_div.h" > +#include "ccu_gate.h" > +#include "ccu_mp.h" > +#include "ccu_mult.h" > +#include "ccu_nk.h" > +#include "ccu_nkm.h" > +#include "ccu_nkmp.h" > +#include "ccu_nm.h" > + > +#include "ccu-sun50i-r329-r.h" > + > +/* > + * The M factor is present in the register's description, but not in > the > + * frequency formula, and it's documented as "The bit is only for > + * testing", so it's not modelled and then force to 0. > + */ > +#define SUN50I_R329_PLL_CPUX_REG       0x1000 > +static struct ccu_mult pll_cpux_clk = { > +       .enable         = BIT(31), > +       .lock           = BIT(28), > +       .mult           = _SUNXI_CCU_MULT_MIN(8, 8, 12), > +       .common         = { > +               .reg            = 0x1000, > +               .hw.init        = CLK_HW_INIT("pll-cpux", "osc24M", > +                                             &ccu_mult_ops, > +                                             CLK_SET_RATE_UNGATE), > +       }, > +}; > + > +#define SUN50I_R329_PLL_PERIPH_REG     0x1010 > +static struct ccu_nm pll_periph_base_clk = { > +       .enable         = BIT(31), > +       .lock           = BIT(28), > +       .n              = _SUNXI_CCU_MULT_MIN(8, 8, 12), > +       .m              = _SUNXI_CCU_DIV(1, 1), /* input divider */ > +       .common         = { > +               .reg            = 0x1010, > +               .hw.init        = CLK_HW_INIT("pll-periph-base", > "osc24M", > +                                             &ccu_nm_ops, > +                                             CLK_SET_RATE_UNGATE), > +       }, > +}; > + > +static SUNXI_CCU_M(pll_periph_2x_clk, "pll-periph-2x", "pll-periph- > base", > +                  0x1010, 16, 3, 0); > +static SUNXI_CCU_M(pll_periph_800m_clk, "pll-periph-800m", "pll- > periph-base", > +                  0x1010, 20, 3, 0); > +static CLK_FIXED_FACTOR_HW(pll_periph_clk, "pll-periph", > +                          &pll_periph_2x_clk.common.hw, 2, 1, 0); > + > +#define SUN50I_R329_PLL_AUDIO0_REG     0x1020 > +static struct ccu_sdm_setting pll_audio0_sdm_table[] = { > +       { .rate = 1548288000, .pattern = 0xc0070624, .m = 1, .n = 64 > }, > +}; > + > +static struct ccu_nm pll_audio0_clk = { > +       .enable         = BIT(31), > +       .lock           = BIT(28), > +       .n              = _SUNXI_CCU_MULT_MIN(8, 8, 12), > +       .m              = _SUNXI_CCU_DIV(1, 1), > +       .sdm            = _SUNXI_CCU_SDM(pll_audio0_sdm_table, > +                                        BIT(24), 0x1120, BIT(31)), > +       .common         = { > +               .features       = CCU_FEATURE_SIGMA_DELTA_MOD, > +               .reg            = 0x1020, > +               .hw.init        = CLK_HW_INIT("pll-audio0", "osc24M", > +                                             &ccu_nm_ops, > +                                             CLK_SET_RATE_UNGATE), > +       }, > +}; > + > +static SUNXI_CCU_M(pll_audio0_div2_clk, "pll-audio0-div2", "pll- > audio0", > +                  0x1020, 16, 3, 0); > +static SUNXI_CCU_M(pll_audio0_div5_clk, "pll-audio0-div5", "pll- > audio0", > +                  0x1020, 20, 3, 0); > + > +/* > + * PLL-AUDIO1 has 3 dividers defined in the datasheet, however the > + * BSP driver always has M0 = 1 and M1 = 2 (this is also the > + * reset value in the register). > + * > + * Here just module it as NM clock, and force M0 = 1 and M1 = 2. > + */ > +#define SUN50I_R329_PLL_AUDIO1_REG     0x1030 > +static struct ccu_sdm_setting pll_audio1_4x_sdm_table[] = { > +       { .rate = 22579200, .pattern = 0xc001288d, .m = 12, .n = 22 > }, > +       { .rate = 24576000, .pattern = 0xc00126e9, .m = 12, .n = 24 > }, > +       { .rate = 90316800, .pattern = 0xc001288d, .m = 3, .n = 22 }, > +       { .rate = 98304000, .pattern = 0xc00126e9, .m = 3, .n = 24 }, > +}; > +static struct ccu_nm pll_audio1_4x_clk = { > +       .enable         = BIT(31), > +       .lock           = BIT(28), > +       .n              = _SUNXI_CCU_MULT_MIN(8, 8, 12), > +       .m              = _SUNXI_CCU_DIV(16, 6), > +       .fixed_post_div = 2, > +       .sdm            = _SUNXI_CCU_SDM(pll_audio1_4x_sdm_table, > +                                        BIT(24), 0x1130, BIT(31)), > +       .common         = { > +               .features       = CCU_FEATURE_FIXED_POSTDIV | > +                                 CCU_FEATURE_SIGMA_DELTA_MOD, > +               .reg            = 0x1030, > +               .hw.init        = CLK_HW_INIT("pll-audio1-4x", > "osc24M", > +                                             &ccu_nm_ops, > +                                             CLK_SET_RATE_UNGATE), > +       }, > +}; > + > +static CLK_FIXED_FACTOR_HW(pll_audio1_2x_clk, "pll-audio1-2x", > +                          &pll_audio1_4x_clk.common.hw, 2, 1, > +                          CLK_SET_RATE_PARENT); > +static CLK_FIXED_FACTOR_HW(pll_audio1_clk, "pll-audio1", > +                          &pll_audio1_4x_clk.common.hw, 4, 1, > +                          CLK_SET_RATE_PARENT); > + > +static const char * const r_bus_parents[] = { "osc24M", "osc32k", > "iosc", > +                                             "pll-periph-2x", > +                                             "pll-audio0-div2" }; > +static SUNXI_CCU_MP_WITH_MUX(r_ahb_clk, "r-ahb", r_bus_parents, > 0x000, > +                            0, 5,      /* M */ > +                            8, 2,      /* P */ > +                            24, 3,     /* mux */ > +                            0); > + > +static SUNXI_CCU_MP_WITH_MUX(r_apb1_clk, "r-apb1", r_bus_parents, > 0x00c, > +                            0, 5,      /* M */ > +                            8, 2,      /* P */ > +                            24, 3,     /* mux */ > +                            0); > + > +static SUNXI_CCU_MP_WITH_MUX(r_apb2_clk, "r-apb2", r_bus_parents, > 0x010, > +                            0, 5,      /* M */ > +                            8, 2,      /* P */ > +                            24, 3,     /* mux */ > +                            0); > + > +static SUNXI_CCU_GATE(r_bus_gpadc_clk, "r-bus-gpadc", "r-apb1", > +                     0x0ec, BIT(0), 0); > +static SUNXI_CCU_GATE(r_bus_ths_clk, "r-bus-ths", "r-apb1", 0x0fc, > BIT(0), 0); > + > +static SUNXI_CCU_GATE(r_bus_dma_clk, "r-bus-dma", "r-apb1", 0x10c, > BIT(0), 0); > + > +static const char * const r_pwm_parents[] = { "osc24M", "osc32k", > "iosc" }; > +static SUNXI_CCU_MUX_WITH_GATE(r_pwm_clk, "r-pwm", r_pwm_parents, > 0x130, > +                              24, 3,   /* mux */ > +                              BIT(31), /* gate */ > +                              0); > + > +static SUNXI_CCU_GATE(r_bus_pwm_clk, "r-bus-pwm", "r-apb1", 0x13c, > BIT(0), 0); > + > +static const char * const r_audio_parents[] = { "pll-audio0-div5", > "pll-audio0-div2", > +                                               "pll-audio1-1x", > "pll-audio1-4x" }; > +static SUNXI_CCU_MP_WITH_MUX_GATE(r_codec_adc_clk, "r-codec-adc", > r_audio_parents, 0x140, > +                                 0, 5,         /* M */ > +                                 8, 2,         /* P */ > +                                 24, 3,        /* mux */ > +                                 BIT(31),      /* gate */ > +                                 0); > +static SUNXI_CCU_MP_WITH_MUX_GATE(r_codec_dac_clk, "r-codec-dac", > r_audio_parents, 0x144, > +                                 0, 5,         /* M */ > +                                 8, 2,         /* P */ > +                                 24, 3,        /* mux */ > +                                 BIT(31),      /* gate */ > +                                 0); > + > +static SUNXI_CCU_GATE(r_bus_codec_clk, "r-bus-codec", "r-apb1", > +                     0x14c, BIT(0), 0); > + > +static SUNXI_CCU_MP_WITH_MUX_GATE(r_dmic_clk, "r-dmic", > r_audio_parents, 0x150, > +                                 0, 5,         /* M */ > +                                 8, 2,         /* P */ > +                                 24, 3,        /* mux */ > +                                 BIT(31),      /* gate */ > +                                 0); > + > +static SUNXI_CCU_GATE(r_bus_dmic_clk, "r-bus-dmic", "r-apb1", 0x15c, > BIT(0), 0); > +static SUNXI_CCU_GATE(r_bus_lradc_clk, "r-bus-lradc", "r-apb1", > +                     0x16c, BIT(0), 0); > + > +static SUNXI_CCU_MP_WITH_MUX_GATE(r_i2s_clk, "r-i2s", > r_audio_parents, 0x170, > +                                 0, 5,         /* M */ > +                                 8, 2,         /* P */ > +                                 24, 3,        /* mux */ > +                                 BIT(31),      /* gate */ > +                                 0); > +static SUNXI_CCU_MP_WITH_MUX_GATE(r_i2s_asrc_clk, "r-i2s-asrc", > +                                 r_audio_parents, 0x174, > +                                 0, 5,         /* M */ > +                                 8, 2,         /* P */ > +                                 24, 3,        /* mux */ > +                                 BIT(31),      /* gate */ > +                                 0); > +static SUNXI_CCU_GATE(r_bus_i2s_clk, "r-bus-i2s", "r-apb1", 0x17c, > BIT(0), 0); > +static SUNXI_CCU_GATE(r_bus_uart_clk, "r-bus-uart", "r-apb2", 0x18c, > BIT(0), 0); > +static SUNXI_CCU_GATE(r_bus_i2c_clk, "r-bus-i2c", "r-apb2", 0x19c, > BIT(0), 0); > + > +static const char * const r_ir_parents[] = { "osc32k", "osc24M" }; > +static SUNXI_CCU_MP_WITH_MUX_GATE(r_ir_clk, "r-ir", r_ir_parents, > 0x1c0, > +                                 0, 5,         /* M */ > +                                 8, 2,         /* P */ > +                                 24, 3,        /* mux */ > +                                 BIT(31),      /* gate */ > +                                 0); > + > +static SUNXI_CCU_GATE(r_bus_ir_clk, "r-bus-ir", "r-apb1", 0x1cc, > BIT(0), 0); > +static SUNXI_CCU_GATE(r_bus_msgbox_clk, "r-bus-msgbox", "r-apb1", > +                     0x1dc, BIT(0), 0); > +static SUNXI_CCU_GATE(r_bus_spinlock_clk, "r-bus-spinlock", "r- > apb1", > +                     0x1ec, BIT(0), 0); > +static SUNXI_CCU_GATE(r_bus_rtc_clk, "r-bus-rtc", "r-ahb", > +                     0x20c, BIT(0), CLK_IS_CRITICAL); > + > +static struct ccu_common *sun50i_r329_r_ccu_clks[] = { > +       &pll_cpux_clk.common, > +       &pll_periph_base_clk.common, > +       &pll_periph_2x_clk.common, > +       &pll_periph_800m_clk.common, > +       &pll_audio0_clk.common, > +       &pll_audio0_div2_clk.common, > +       &pll_audio0_div5_clk.common, > +       &pll_audio1_4x_clk.common, > +       &r_ahb_clk.common, > +       &r_apb1_clk.common, > +       &r_apb2_clk.common, > +       &r_bus_gpadc_clk.common, > +       &r_bus_ths_clk.common, > +       &r_bus_dma_clk.common, > +       &r_pwm_clk.common, > +       &r_bus_pwm_clk.common, > +       &r_codec_adc_clk.common, > +       &r_codec_dac_clk.common, > +       &r_bus_codec_clk.common, > +       &r_dmic_clk.common, > +       &r_bus_dmic_clk.common, > +       &r_bus_lradc_clk.common, > +       &r_i2s_clk.common, > +       &r_i2s_asrc_clk.common, > +       &r_bus_i2s_clk.common, > +       &r_bus_uart_clk.common, > +       &r_bus_i2c_clk.common, > +       &r_ir_clk.common, > +       &r_bus_ir_clk.common, > +       &r_bus_msgbox_clk.common, > +       &r_bus_spinlock_clk.common, > +       &r_bus_rtc_clk.common, > +}; > + > +static struct clk_hw_onecell_data sun50i_r329_r_hw_clks = { > +       .hws    = { > +               [CLK_PLL_CPUX]          = &pll_cpux_clk.common.hw, > +               [CLK_PLL_PERIPH_BASE]   = > &pll_periph_base_clk.common.hw, > +               [CLK_PLL_PERIPH_2X]     = > &pll_periph_2x_clk.common.hw, > +               [CLK_PLL_PERIPH_800M]   = > &pll_periph_800m_clk.common.hw, > +               [CLK_PLL_PERIPH]        = &pll_periph_clk.hw, > +               [CLK_PLL_AUDIO0]        = &pll_audio0_clk.common.hw, > +               [CLK_PLL_AUDIO0_DIV2]   = > &pll_audio0_div2_clk.common.hw, > +               [CLK_PLL_AUDIO0_DIV5]   = > &pll_audio0_div5_clk.common.hw, > +               [CLK_PLL_AUDIO1_4X]     = > &pll_audio1_4x_clk.common.hw, > +               [CLK_PLL_AUDIO1_2X]     = &pll_audio1_2x_clk.hw, > +               [CLK_PLL_AUDIO1]        = &pll_audio1_clk.hw, > +               [CLK_R_AHB]             = &r_ahb_clk.common.hw, > +               [CLK_R_APB1]            = &r_apb1_clk.common.hw, > +               [CLK_R_APB2]            = &r_apb2_clk.common.hw, > +               [CLK_R_BUS_GPADC]       = &r_bus_gpadc_clk.common.hw, > +               [CLK_R_BUS_THS]         = &r_bus_ths_clk.common.hw, > +               [CLK_R_BUS_DMA]         = &r_bus_dma_clk.common.hw, > +               [CLK_R_PWM]             = &r_pwm_clk.common.hw, > +               [CLK_R_BUS_PWM]         = &r_bus_pwm_clk.common.hw, > +               [CLK_R_CODEC_ADC]       = &r_codec_adc_clk.common.hw, > +               [CLK_R_CODEC_DAC]       = &r_codec_dac_clk.common.hw, > +               [CLK_R_BUS_CODEC]       = &r_bus_codec_clk.common.hw, > +               [CLK_R_DMIC]            = &r_dmic_clk.common.hw, > +               [CLK_R_BUS_DMIC]        = &r_bus_dmic_clk.common.hw, > +               [CLK_R_BUS_LRADC]       = &r_bus_lradc_clk.common.hw, > +               [CLK_R_I2S]             = &r_i2s_clk.common.hw, > +               [CLK_R_I2S_ASRC]        = &r_i2s_asrc_clk.common.hw, > +               [CLK_R_BUS_I2S]         = &r_bus_i2s_clk.common.hw, > +               [CLK_R_BUS_UART]        = &r_bus_uart_clk.common.hw, > +               [CLK_R_BUS_I2C]         = &r_bus_i2c_clk.common.hw, > +               [CLK_R_IR]              = &r_ir_clk.common.hw, > +               [CLK_R_BUS_IR]          = &r_bus_ir_clk.common.hw, > +               [CLK_R_BUS_MSGBOX]      = > &r_bus_msgbox_clk.common.hw, > +               [CLK_R_BUS_SPINLOCK]    = > &r_bus_spinlock_clk.common.hw, > +               [CLK_R_BUS_RTC]         = &r_bus_rtc_clk.common.hw, > +       }, > +       .num = CLK_NUMBER, > +}; > + > +static struct ccu_reset_map sun50i_r329_r_ccu_resets[] = { > +       [RST_R_BUS_GPADC]       = { 0x0ec, BIT(16) }, > +       [RST_R_BUS_THS]         = { 0x0fc, BIT(16) }, > +       [RST_R_BUS_DMA]         = { 0x10c, BIT(16) }, > +       [RST_R_BUS_PWM]         = { 0x13c, BIT(16) }, > +       [RST_R_BUS_CODEC]       = { 0x14c, BIT(16) }, > +       [RST_R_BUS_DMIC]        = { 0x15c, BIT(16) }, > +       [RST_R_BUS_LRADC]       = { 0x16c, BIT(16) }, > +       [RST_R_BUS_I2S]         = { 0x17c, BIT(16) }, > +       [RST_R_BUS_UART]        = { 0x18c, BIT(16) }, > +       [RST_R_BUS_I2C]         = { 0x19c, BIT(16) }, > +       [RST_R_BUS_IR]          = { 0x1cc, BIT(16) }, > +       [RST_R_BUS_MSGBOX]      = { 0x1dc, BIT(16) }, > +       [RST_R_BUS_SPINLOCK]    = { 0x1ec, BIT(16) }, > +       [RST_R_BUS_RTC]         = { 0x20c, BIT(16) }, > +}; > + > +static const struct sunxi_ccu_desc sun50i_r329_r_ccu_desc = { > +       .ccu_clks       = sun50i_r329_r_ccu_clks, > +       .num_ccu_clks   = ARRAY_SIZE(sun50i_r329_r_ccu_clks), > + > +       .hw_clks        = &sun50i_r329_r_hw_clks, > + > +       .resets         = sun50i_r329_r_ccu_resets, > +       .num_resets     = ARRAY_SIZE(sun50i_r329_r_ccu_resets), > +}; > + > +static const u32 pll_regs[] = { > +       SUN50I_R329_PLL_CPUX_REG, > +       SUN50I_R329_PLL_PERIPH_REG, > +       SUN50I_R329_PLL_AUDIO0_REG, > +       SUN50I_R329_PLL_AUDIO1_REG, > +}; > + > +static void __init sun50i_r329_r_ccu_setup(struct device_node *node) > +{ > +       void __iomem *reg; > +       u32 val; > +       int i; > + > +       reg = of_io_request_and_map(node, 0, > of_node_full_name(node)); > +       if (IS_ERR(reg)) { > +               pr_err("%pOF: Could not map clock registers\n", > node); > +               return; > +       } > + > +       /* Enable the lock bits and the output enable bits on all > PLLs */ > +       for (i = 0; i < ARRAY_SIZE(pll_regs); i++) { > +               val = readl(reg + pll_regs[i]); > +               val |= BIT(29) | BIT(27); > +               writel(val, reg + pll_regs[i]); > +       } > + > +       /* > +        * Force the I/O dividers of PLL-AUDIO1 to reset default > value > +        * > +        * See the comment before pll-audio1 definition for the > reason. > +        */ > + > +       val = readl(reg + SUN50I_R329_PLL_AUDIO1_REG); > +       val &= ~BIT(1); > +       val |= BIT(0); > +       writel(val, reg + SUN50I_R329_PLL_AUDIO1_REG); > + > +       i = sunxi_ccu_probe(node, reg, &sun50i_r329_r_ccu_desc); > +       if (i) > +               pr_err("%pOF: probing clocks fails: %d\n", node, i); > +} > + > +CLK_OF_DECLARE(sun50i_r329_r_ccu, "allwinner,sun50i-r329-r-ccu", > +              sun50i_r329_r_ccu_setup); > diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-r329-r.h > b/drivers/clk/sunxi-ng/ccu-sun50i-r329-r.h > new file mode 100644 > index 000000000000..62cf65322116 > --- /dev/null > +++ b/drivers/clk/sunxi-ng/ccu-sun50i-r329-r.h > @@ -0,0 +1,33 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (c) 2021 Sipeed > + */ > + > +#ifndef _CCU_SUN50I_R329_R_H > +#define _CCU_SUN50I_R329_R_H > + > +#include > +#include > + > +#define CLK_PLL_CPUX           0 > +#define CLK_PLL_PERIPH_BASE    1 > +#define CLK_PLL_PERIPH_2X      2 > +#define CLK_PLL_PERIPH_800M    3 > +#define CLK_PLL_PERIPH         4 > +#define CLK_PLL_AUDIO0         5 > +#define CLK_PLL_AUDIO0_DIV2    6 > +#define CLK_PLL_AUDIO0_DIV5    7 > +#define CLK_PLL_AUDIO1_4X      8 > +#define CLK_PLL_AUDIO1_2X      9 > +#define CLK_PLL_AUDIO1         10 > +#define CLK_R_AHB              11 > + > +/* R_APB1 exported for PIO */ > + > +#define CLK_R_APB2             13 > + > +/* All module / bus gate clocks exported */ > + > +#define CLK_NUMBER     (CLK_R_BUS_RTC + 1) > + > +#endif /* _CCU_SUN50I_R329_R_H */ > diff --git a/include/dt-bindings/clock/sun50i-r329-r-ccu.h > b/include/dt-bindings/clock/sun50i-r329-r-ccu.h > new file mode 100644 > index 000000000000..df9bc58de5c4 > --- /dev/null > +++ b/include/dt-bindings/clock/sun50i-r329-r-ccu.h > @@ -0,0 +1,33 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (c) 2021 Sipeed > + */ > + > +#ifndef _DT_BINDINGS_CLK_SUN50I_R329_R_CCU_H_ > +#define _DT_BINDINGS_CLK_SUN50I_R329_R_CCU_H_ > + > +#define CLK_R_APB1             12 > + > +#define CLK_R_BUS_GPADC                14 > +#define CLK_R_BUS_THS          15 > +#define CLK_R_BUS_DMA          16 > +#define CLK_R_PWM              17 > +#define CLK_R_BUS_PWM          18 > +#define CLK_R_CODEC_ADC                19 > +#define CLK_R_CODEC_DAC                20 > +#define CLK_R_BUS_CODEC                21 > +#define CLK_R_DMIC             22 > +#define CLK_R_BUS_DMIC         23 > +#define CLK_R_BUS_LRADC                24 > +#define CLK_R_I2S              25 > +#define CLK_R_I2S_ASRC         26 > +#define CLK_R_BUS_I2S          27 > +#define CLK_R_BUS_UART         28 > +#define CLK_R_BUS_I2C          29 > +#define CLK_R_IR               30 > +#define CLK_R_BUS_IR           31 > +#define CLK_R_BUS_MSGBOX       32 > +#define CLK_R_BUS_SPINLOCK     33 > +#define CLK_R_BUS_RTC          34 > + > +#endif /* _DT_BINDINGS_CLK_SUN50I_R329_R_CCU_H_ */ > diff --git a/include/dt-bindings/reset/sun50i-r329-r-ccu.h > b/include/dt-bindings/reset/sun50i-r329-r-ccu.h > new file mode 100644 > index 000000000000..40644f2f21c6 > --- /dev/null > +++ b/include/dt-bindings/reset/sun50i-r329-r-ccu.h > @@ -0,0 +1,24 @@ > +/* SPDX-License-Identifier: (GPL-2.0+ or MIT) */ > +/* > + * Copyright (c) 2021 Sipeed > + */ > + > +#ifndef _DT_BINDINGS_RST_SUN50I_R329_R_CCU_H_ > +#define _DT_BINDINGS_RST_SUN50I_R329_R_CCU_H_ > + > +#define RST_R_BUS_GPADC                0 > +#define RST_R_BUS_THS          1 > +#define RST_R_BUS_DMA          2 > +#define RST_R_BUS_PWM          3 > +#define RST_R_BUS_CODEC                4 > +#define RST_R_BUS_DMIC         5 > +#define RST_R_BUS_LRADC                6 > +#define RST_R_BUS_I2S          7 > +#define RST_R_BUS_UART         8 > +#define RST_R_BUS_I2C          9 > +#define RST_R_BUS_IR           10 > +#define RST_R_BUS_MSGBOX       11 > +#define RST_R_BUS_SPINLOCK     12 > +#define RST_R_BUS_RTC          13 > + > +#endif /* _DT_BINDINGS_RST_SUN50I_R329_R_CCU_H_ */ 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=-13.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,INVALID_MSGID,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 0F634C4338F for ; Mon, 2 Aug 2021 09:06:51 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CB85D60F4B for ; Mon, 2 Aug 2021 09:06:50 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org CB85D60F4B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=sipeed.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:Cc:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=um9hXIuNaBDdaUD8A3ad3vUMHqg+5KZuhGH0I3cS6I8=; b=iOOXfRcDdwEobX 6O8FDTwUc8ih+j3p3F7o55VnUtckhTIfCWCxfKiZpOsGira/64pOK5cFhBVMPNokwiJvmXqFCd0JF 3fymOmHp2MazcfB7Y4CUhZm0oxK8OxrRamI9Eiz4K4YHhF6x+SPUXNgYp7FtWpZKwprCHwS0Iznfy r+jfOS0Ap7z6I8BH55T6mSaLv4ZfGonaOsgoQqeI45oFwqAIiCDrEl6GFlLCpUPGEEQtFbGUHcEKs DZSIoQk/6b/y2Ivhz4h2KzhlIFtREO07eYp8J43JDNoza8q3M5A5SexfJVcE9g4OrRIDUk5DiewII RkZp0BF8y5ngIMsU6g6w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mATsz-00FV4w-Ny; Mon, 02 Aug 2021 09:05:25 +0000 Received: from smtpbg127.qq.com ([109.244.180.96] helo=smtpbg.qq.com) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mATsq-00FUt3-C0 for linux-arm-kernel@lists.infradead.org; Mon, 02 Aug 2021 09:05:23 +0000 X-QQ-mid: bizesmtp43t1627895013tynlxyhr Received: from [192.168.0.46] (unknown [113.89.245.207]) by esmtp6.qq.com (ESMTP) with id ; Mon, 02 Aug 2021 17:03:33 +0800 (CST) X-QQ-SSF: 00100000002000208000D00A0000000 X-QQ-FEAT: dMLGSgzcGosioRzVDyqmmclh5TC7ofhwWZPRAjF0duMSAtrgLqM4KfXyUsxO4 7/lLsqx0fi5DeB8VAJm0EQhrkubZyBHi2hIzo/SL8KB7dsGTmSuUq8zAu3tSWvdfC85TxI+ f1iMX8cau+LtW2Uo7JBD+A5YgOsvTWIKmbr9ym5XAnCDWjcSlaDQCDx24EWQpz15gXPyehr gFq8uQZV8FuKhZlLZqD1JbO1ZRwBRSOcmDnnKHS9HMgl8QdHC13EC/RMgEDgvvkAwXFq1Cy xFiqyffD/o065iR1gP6vfLlZ9+8JjxzF6Y7C055jJd79DFhyIQbT5kjD7Vtbriu/z+QrGF0 E1cLsWGjDFHtpdkJRUNlE/zjntmMMSMvzMreTeSMWz1wSxng54= X-QQ-GoodBg: 0 Message-ID: +88AC50AA4723D6F3 Subject: Re: [PATCH 10/17] clk: sunxi=ng: add support for R329 R-CCU From: Icenowy Zheng To: Rob Herring , Maxime Ripard , Chen-Yu Tsai , Jernej Skrabec , Ulf Hansson , Linus Walleij , Alexandre Belloni , Andre Przywara , Samuel Holland Cc: devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org Date: Mon, 02 Aug 2021 17:03:32 +0800 In-Reply-To: <20210802062212.73220-11-icenowy@sipeed.com> References: <20210802062212.73220-1-icenowy@sipeed.com> <20210802062212.73220-11-icenowy@sipeed.com> Organization: Sipeed User-Agent: Evolution 3.40.0 MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:sipeed.com:qybgspam:qybgspam1 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210802_020517_002565_D3499057 X-CRM114-Status: GOOD ( 30.55 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , 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 5ZyoIDIwMjEtMDgtMDLmmJ/mnJ/kuIDnmoQgMTQ6MjIgKzA4MDDvvIxJY2Vub3d5IFpoZW5n5YaZ 6YGT77yaCj4gQWxsd2lubmVyIFIzMjkgaGFzIGNsb2NrIGNvbnRyb2xzIGluIFBSQ00sIGxpa2Ug b3RoZXIgbmV3IEFsbHdpbm5lcgo+IFNvQ3MuCj4gCj4gQWRkIHN1cHBvcnQgZm9yIHRoZW0uCj4g Cj4gVGhpcyBkcml2ZXIgaXMgYWRkZWQgYmVmb3JlIHRoZSBtYWluIENDVSBiZWNhdXNlIFBMTHMg YXJlIGNvbnRyb2xsZWQKPiBieQo+IFItQ0NVIG9uIFIzMjkuCgpXZWxsLCBJIGZvcmdvdCB0byBt ZW50aW9uIHRoYXQgdGhlIFJfRE1BIGJ1cyBjbG9jayBnYXRlcy9yZXNldHMgYXJlIG5vdApkb2N1 bWVudGVkIG9uIHRoZSB1c2VyIG1hbnVhbCwgYW5kIHRoZSBpbmZvIGhlcmUgaXMgZ2V0IGJ5IGV4 cGVyaW1lbnQuCgpUaGVyZSBzZWVtcyB0byBiZSBhbm90aGVyIGhpZGRlbiBidXMgY2xvY2sgZ2F0 ZS9yZXNldCBhY2NvcmRpbmcgdG8gYQpyZWdpc3RlciBkdW1wIG9mIFJfQ0NVIGRvbmUgb24gQlNQ IGtlcm5lbCwgYnV0IEkgaGF2ZSBubyBpZGVhIHdoYXQgaXQKaXMuCgo+IAo+IFNpZ25lZC1vZmYt Ynk6IEljZW5vd3kgWmhlbmcgPGljZW5vd3lAc2lwZWVkLmNvbT4KPiAtLS0KPiDCoGRyaXZlcnMv Y2xrL3N1bnhpLW5nL0tjb25maWfCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzC oMKgIDUgKwo+IMKgZHJpdmVycy9jbGsvc3VueGktbmcvTWFrZWZpbGXCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB8wqDCoCAxICsKPiDCoGRyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1z dW41MGktcjMyOS1yLmPCoMKgwqDCoMKgIHwgMzc0Cj4gKysrKysrKysrKysrKysrKysrCj4gwqBk cml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNTBpLXIzMjktci5owqDCoMKgwqDCoCB8wqAgMzMg KysKPiDCoGluY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svc3VuNTBpLXIzMjktci1jY3UuaCB8wqAg MzMgKysKPiDCoGluY2x1ZGUvZHQtYmluZGluZ3MvcmVzZXQvc3VuNTBpLXIzMjktci1jY3UuaCB8 wqAgMjQgKysKPiDCoDYgZmlsZXMgY2hhbmdlZCwgNDcwIGluc2VydGlvbnMoKykKPiDCoGNyZWF0 ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNTBpLXIzMjktci5jCj4g wqBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjUwaS1yMzI5 LXIuaAo+IMKgY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svc3Vu NTBpLXIzMjktci1jY3UuaAo+IMKgY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvZHQtYmluZGlu Z3MvcmVzZXQvc3VuNTBpLXIzMjktci1jY3UuaAo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Ns ay9zdW54aS1uZy9LY29uZmlnIGIvZHJpdmVycy9jbGsvc3VueGktCj4gbmcvS2NvbmZpZwo+IGlu ZGV4IGNkNDZkODg1Mzg3Ni4uZTQ5YjJjMmZhNWI3IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvY2xr L3N1bnhpLW5nL0tjb25maWcKPiArKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9LY29uZmlnCj4g QEAgLTQyLDYgKzQyLDExIEBAIGNvbmZpZyBTVU41MElfSDZfUl9DQ1UKPiDCoMKgwqDCoMKgwqDC oMKgZGVmYXVsdCBBUk02NCAmJiBBUkNIX1NVTlhJCj4gwqDCoMKgwqDCoMKgwqDCoGRlcGVuZHMg b24gKEFSTTY0ICYmIEFSQ0hfU1VOWEkpIHx8IENPTVBJTEVfVEVTVAo+IMKgCj4gK2NvbmZpZyBT VU41MElfUjMyOV9SX0NDVQo+ICvCoMKgwqDCoMKgwqDCoGJvb2wgIlN1cHBvcnQgZm9yIHRoZSBB bGx3aW5uZXIgUjMyOSBQUkNNIENDVSIKPiArwqDCoMKgwqDCoMKgwqBkZWZhdWx0IEFSTTY0ICYm IEFSQ0hfU1VOWEkKPiArwqDCoMKgwqDCoMKgwqBkZXBlbmRzIG9uIChBUk02NCAmJiBBUkNIX1NV TlhJKSB8fCBDT01QSUxFX1RFU1QKPiArCj4gwqBjb25maWcgU1VONElfQTEwX0NDVQo+IMKgwqDC oMKgwqDCoMKgwqBib29sICJTdXBwb3J0IGZvciB0aGUgQWxsd2lubmVyIEExMC9BMjAgQ0NVIgo+ IMKgwqDCoMKgwqDCoMKgwqBkZWZhdWx0IE1BQ0hfU1VONEkKPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9jbGsvc3VueGktbmcvTWFrZWZpbGUgYi9kcml2ZXJzL2Nsay9zdW54aS0KPiBuZy9NYWtlZmls ZQo+IGluZGV4IDk2YzMyNDMwNmQ5Ny4uZGIzMzhhMjE4OGZkIDEwMDY0NAo+IC0tLSBhL2RyaXZl cnMvY2xrL3N1bnhpLW5nL01ha2VmaWxlCj4gKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvTWFr ZWZpbGUKPiBAQCAtMjgsNiArMjgsNyBAQCBvYmotJChDT05GSUdfU1VONTBJX0ExMDBfUl9DQ1Up wqDCoMKgwqDCoMKgwqArPSBjY3UtCj4gc3VuNTBpLWExMDAtci5vCj4gwqBvYmotJChDT05GSUdf U1VONTBJX0g2X0NDVSnCoMKgwqDCoCs9IGNjdS1zdW41MGktaDYubwo+IMKgb2JqLSQoQ09ORklH X1NVTjUwSV9INjE2X0NDVSnCoMKgKz0gY2N1LXN1bjUwaS1oNjE2Lm8KPiDCoG9iai0kKENPTkZJ R19TVU41MElfSDZfUl9DQ1UpwqDCoCs9IGNjdS1zdW41MGktaDYtci5vCj4gK29iai0kKENPTkZJ R19TVU41MElfUjMyOV9SX0NDVSnCoMKgwqDCoMKgwqDCoMKgKz0gY2N1LXN1bjUwaS1yMzI5LXIu bwo+IMKgb2JqLSQoQ09ORklHX1NVTjRJX0ExMF9DQ1UpwqDCoMKgwqArPSBjY3Utc3VuNGktYTEw Lm8KPiDCoG9iai0kKENPTkZJR19TVU41SV9DQ1UpwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqArPSBjY3Utc3VuNWkubwo+IMKgb2JqLSQoQ09ORklHX1NVTjZJX0EzMV9DQ1UpwqDCoMKg wqArPSBjY3Utc3VuNmktYTMxLm8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcv Y2N1LXN1bjUwaS1yMzI5LXIuYwo+IGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjUwaS1y MzI5LXIuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi41NDEz YTcwMWNiNTcKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1 LXN1bjUwaS1yMzI5LXIuYwo+IEBAIC0wLDAgKzEsMzc0IEBACj4gKy8vIFNQRFgtTGljZW5zZS1J ZGVudGlmaWVyOiBHUEwtMi4wCj4gKy8qCj4gKyAqIENvcHlyaWdodCAoYykgMjAyMSBTaXBlZWQK PiArICogQmFzZWQgb24gdGhlIEg2MTYgQ0NVIGRyaXZlciwgd2hpY2ggaXM6Cj4gKyAqwqDCoCBD b3B5cmlnaHQgKGMpIDIwMjAgQXJtIEx0ZC4KPiArICovCj4gKwo+ICsjaW5jbHVkZSA8bGludXgv Y2xrLXByb3ZpZGVyLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pby5oPgo+ICsjaW5jbHVkZSA8bGlu dXgvb2ZfYWRkcmVzcy5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4g Kwo+ICsjaW5jbHVkZSAiY2N1X2NvbW1vbi5oIgo+ICsjaW5jbHVkZSAiY2N1X3Jlc2V0LmgiCj4g Kwo+ICsjaW5jbHVkZSAiY2N1X2Rpdi5oIgo+ICsjaW5jbHVkZSAiY2N1X2dhdGUuaCIKPiArI2lu Y2x1ZGUgImNjdV9tcC5oIgo+ICsjaW5jbHVkZSAiY2N1X211bHQuaCIKPiArI2luY2x1ZGUgImNj dV9uay5oIgo+ICsjaW5jbHVkZSAiY2N1X25rbS5oIgo+ICsjaW5jbHVkZSAiY2N1X25rbXAuaCIK PiArI2luY2x1ZGUgImNjdV9ubS5oIgo+ICsKPiArI2luY2x1ZGUgImNjdS1zdW41MGktcjMyOS1y LmgiCj4gKwo+ICsvKgo+ICsgKiBUaGUgTSBmYWN0b3IgaXMgcHJlc2VudCBpbiB0aGUgcmVnaXN0 ZXIncyBkZXNjcmlwdGlvbiwgYnV0IG5vdCBpbgo+IHRoZQo+ICsgKiBmcmVxdWVuY3kgZm9ybXVs YSwgYW5kIGl0J3MgZG9jdW1lbnRlZCBhcyAiVGhlIGJpdCBpcyBvbmx5IGZvcgo+ICsgKiB0ZXN0 aW5nIiwgc28gaXQncyBub3QgbW9kZWxsZWQgYW5kIHRoZW4gZm9yY2UgdG8gMC4KPiArICovCj4g KyNkZWZpbmUgU1VONTBJX1IzMjlfUExMX0NQVVhfUkVHwqDCoMKgwqDCoMKgwqAweDEwMDAKPiAr c3RhdGljIHN0cnVjdCBjY3VfbXVsdCBwbGxfY3B1eF9jbGsgPSB7Cj4gK8KgwqDCoMKgwqDCoMKg LmVuYWJsZcKgwqDCoMKgwqDCoMKgwqDCoD0gQklUKDMxKSwKPiArwqDCoMKgwqDCoMKgwqAubG9j a8KgwqDCoMKgwqDCoMKgwqDCoMKgwqA9IEJJVCgyOCksCj4gK8KgwqDCoMKgwqDCoMKgLm11bHTC oMKgwqDCoMKgwqDCoMKgwqDCoMKgPSBfU1VOWElfQ0NVX01VTFRfTUlOKDgsIDgsIDEyKSwKPiAr wqDCoMKgwqDCoMKgwqAuY29tbW9uwqDCoMKgwqDCoMKgwqDCoMKgPSB7Cj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoC5yZWfCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA9IDB4MTAwMCwK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLmh3LmluaXTCoMKgwqDCoMKgwqDCoMKg PSBDTEtfSFdfSU5JVCgicGxsLWNwdXgiLCAib3NjMjRNIiwKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAmY2N1X211bHRfb3BzLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIENMS19TRVRfUkFURV9VTkdBVEUpLAo+ICvCoMKgwqDCoMKgwqDCoH0sCj4gK307Cj4g Kwo+ICsjZGVmaW5lIFNVTjUwSV9SMzI5X1BMTF9QRVJJUEhfUkVHwqDCoMKgwqDCoDB4MTAxMAo+ ICtzdGF0aWMgc3RydWN0IGNjdV9ubSBwbGxfcGVyaXBoX2Jhc2VfY2xrID0gewo+ICvCoMKgwqDC oMKgwqDCoC5lbmFibGXCoMKgwqDCoMKgwqDCoMKgwqA9IEJJVCgzMSksCj4gK8KgwqDCoMKgwqDC oMKgLmxvY2vCoMKgwqDCoMKgwqDCoMKgwqDCoMKgPSBCSVQoMjgpLAo+ICvCoMKgwqDCoMKgwqDC oC5uwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoD0gX1NVTlhJX0NDVV9NVUxUX01JTig4LCA4 LCAxMiksCj4gK8KgwqDCoMKgwqDCoMKgLm3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgPSBf U1VOWElfQ0NVX0RJVigxLCAxKSwgLyogaW5wdXQgZGl2aWRlciAqLwo+ICvCoMKgwqDCoMKgwqDC oC5jb21tb27CoMKgwqDCoMKgwqDCoMKgwqA9IHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgLnJlZ8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoD0gMHgxMDEwLAo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAuaHcuaW5pdMKgwqDCoMKgwqDCoMKgwqA9IENMS19IV19JTklU KCJwbGwtcGVyaXBoLWJhc2UiLAo+ICJvc2MyNE0iLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgICZjY3Vfbm1fb3BzLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IENMS19TRVRfUkFURV9VTkdBVEUpLAo+ICvCoMKgwqDCoMKgwqDCoH0sCj4gK307Cj4gKwo+ICtz dGF0aWMgU1VOWElfQ0NVX00ocGxsX3BlcmlwaF8yeF9jbGssICJwbGwtcGVyaXBoLTJ4IiwgInBs bC1wZXJpcGgtCj4gYmFzZSIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg MHgxMDEwLCAxNiwgMywgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfTShwbGxfcGVyaXBoXzgwMG1f Y2xrLCAicGxsLXBlcmlwaC04MDBtIiwgInBsbC0KPiBwZXJpcGgtYmFzZSIsCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMHgxMDEwLCAyMCwgMywgMCk7Cj4gK3N0YXRpYyBD TEtfRklYRURfRkFDVE9SX0hXKHBsbF9wZXJpcGhfY2xrLCAicGxsLXBlcmlwaCIsCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICZwbGxfcGVyaXBo XzJ4X2Nsay5jb21tb24uaHcsIDIsIDEsIDApOwo+ICsKPiArI2RlZmluZSBTVU41MElfUjMyOV9Q TExfQVVESU8wX1JFR8KgwqDCoMKgwqAweDEwMjAKPiArc3RhdGljIHN0cnVjdCBjY3Vfc2RtX3Nl dHRpbmcgcGxsX2F1ZGlvMF9zZG1fdGFibGVbXSA9IHsKPiArwqDCoMKgwqDCoMKgwqB7IC5yYXRl ID0gMTU0ODI4ODAwMCwgLnBhdHRlcm4gPSAweGMwMDcwNjI0LCAubSA9IDEsIC5uID0gNjQKPiB9 LAo+ICt9Owo+ICsKPiArc3RhdGljIHN0cnVjdCBjY3Vfbm0gcGxsX2F1ZGlvMF9jbGsgPSB7Cj4g K8KgwqDCoMKgwqDCoMKgLmVuYWJsZcKgwqDCoMKgwqDCoMKgwqDCoD0gQklUKDMxKSwKPiArwqDC oMKgwqDCoMKgwqAubG9ja8KgwqDCoMKgwqDCoMKgwqDCoMKgwqA9IEJJVCgyOCksCj4gK8KgwqDC oMKgwqDCoMKgLm7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgPSBfU1VOWElfQ0NVX01VTFRf TUlOKDgsIDgsIDEyKSwKPiArwqDCoMKgwqDCoMKgwqAubcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqA9IF9TVU5YSV9DQ1VfRElWKDEsIDEpLAo+ICvCoMKgwqDCoMKgwqDCoC5zZG3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqA9IF9TVU5YSV9DQ1VfU0RNKHBsbF9hdWRpbzBfc2RtX3RhYmxlLAo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQklUKDI0KSwgMHgxMTIwLCBCSVQoMzEpKSwKPiArwqDC oMKgwqDCoMKgwqAuY29tbW9uwqDCoMKgwqDCoMKgwqDCoMKgPSB7Cj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoC5mZWF0dXJlc8KgwqDCoMKgwqDCoMKgPSBDQ1VfRkVBVFVSRV9TSUdN QV9ERUxUQV9NT0QsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5yZWfCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqA9IDB4MTAyMCwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgLmh3LmluaXTCoMKgwqDCoMKgwqDCoMKgPSBDTEtfSFdfSU5JVCgicGxsLWF1ZGlvMCIsICJv c2MyNE0iLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICZjY3Vfbm1fb3BzLAo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIENMS19TRVRfUkFURV9VTkdBVEUpLAo+ ICvCoMKgwqDCoMKgwqDCoH0sCj4gK307Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX00ocGxsX2F1 ZGlvMF9kaXYyX2NsaywgInBsbC1hdWRpbzAtZGl2MiIsICJwbGwtCj4gYXVkaW8wIiwKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAweDEwMjAsIDE2LCAzLCAwKTsKPiArc3Rh dGljIFNVTlhJX0NDVV9NKHBsbF9hdWRpbzBfZGl2NV9jbGssICJwbGwtYXVkaW8wLWRpdjUiLCAi cGxsLQo+IGF1ZGlvMCIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMHgx MDIwLCAyMCwgMywgMCk7Cj4gKwo+ICsvKgo+ICsgKiBQTEwtQVVESU8xIGhhcyAzIGRpdmlkZXJz IGRlZmluZWQgaW4gdGhlIGRhdGFzaGVldCwgaG93ZXZlciB0aGUKPiArICogQlNQIGRyaXZlciBh bHdheXMgaGFzIE0wID0gMSBhbmQgTTEgPSAyICh0aGlzIGlzIGFsc28gdGhlCj4gKyAqIHJlc2V0 IHZhbHVlIGluIHRoZSByZWdpc3RlcikuCj4gKyAqCj4gKyAqIEhlcmUganVzdCBtb2R1bGUgaXQg YXMgTk0gY2xvY2ssIGFuZCBmb3JjZSBNMCA9IDEgYW5kIE0xID0gMi4KPiArICovCj4gKyNkZWZp bmUgU1VONTBJX1IzMjlfUExMX0FVRElPMV9SRUfCoMKgwqDCoMKgMHgxMDMwCj4gK3N0YXRpYyBz dHJ1Y3QgY2N1X3NkbV9zZXR0aW5nIHBsbF9hdWRpbzFfNHhfc2RtX3RhYmxlW10gPSB7Cj4gK8Kg wqDCoMKgwqDCoMKgeyAucmF0ZSA9IDIyNTc5MjAwLCAucGF0dGVybiA9IDB4YzAwMTI4OGQsIC5t ID0gMTIsIC5uID0gMjIKPiB9LAo+ICvCoMKgwqDCoMKgwqDCoHsgLnJhdGUgPSAyNDU3NjAwMCwg LnBhdHRlcm4gPSAweGMwMDEyNmU5LCAubSA9IDEyLCAubiA9IDI0Cj4gfSwKPiArwqDCoMKgwqDC oMKgwqB7IC5yYXRlID0gOTAzMTY4MDAsIC5wYXR0ZXJuID0gMHhjMDAxMjg4ZCwgLm0gPSAzLCAu biA9IDIyIH0sCj4gK8KgwqDCoMKgwqDCoMKgeyAucmF0ZSA9IDk4MzA0MDAwLCAucGF0dGVybiA9 IDB4YzAwMTI2ZTksIC5tID0gMywgLm4gPSAyNCB9LAo+ICt9Owo+ICtzdGF0aWMgc3RydWN0IGNj dV9ubSBwbGxfYXVkaW8xXzR4X2NsayA9IHsKPiArwqDCoMKgwqDCoMKgwqAuZW5hYmxlwqDCoMKg wqDCoMKgwqDCoMKgPSBCSVQoMzEpLAo+ICvCoMKgwqDCoMKgwqDCoC5sb2NrwqDCoMKgwqDCoMKg wqDCoMKgwqDCoD0gQklUKDI4KSwKPiArwqDCoMKgwqDCoMKgwqAubsKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqA9IF9TVU5YSV9DQ1VfTVVMVF9NSU4oOCwgOCwgMTIpLAo+ICvCoMKgwqDCoMKg wqDCoC5twqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoD0gX1NVTlhJX0NDVV9ESVYoMTYsIDYp LAo+ICvCoMKgwqDCoMKgwqDCoC5maXhlZF9wb3N0X2RpdsKgPSAyLAo+ICvCoMKgwqDCoMKgwqDC oC5zZG3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA9IF9TVU5YSV9DQ1VfU0RNKHBsbF9hdWRpbzFf NHhfc2RtX3RhYmxlLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQklUKDI0KSwgMHgxMTMwLCBC SVQoMzEpKSwKPiArwqDCoMKgwqDCoMKgwqAuY29tbW9uwqDCoMKgwqDCoMKgwqDCoMKgPSB7Cj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5mZWF0dXJlc8KgwqDCoMKgwqDCoMKgPSBD Q1VfRkVBVFVSRV9GSVhFRF9QT1NURElWIHwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBDQ1VfRkVBVFVSRV9TSUdNQV9E RUxUQV9NT0QsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5yZWfCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqA9IDB4MTAzMCwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg Lmh3LmluaXTCoMKgwqDCoMKgwqDCoMKgPSBDTEtfSFdfSU5JVCgicGxsLWF1ZGlvMS00eCIsCj4g Im9zYzI0TSIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJmNjdV9ubV9vcHMs Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQ0xLX1NFVF9SQVRFX1VOR0FURSks Cj4gK8KgwqDCoMKgwqDCoMKgfSwKPiArfTsKPiArCj4gK3N0YXRpYyBDTEtfRklYRURfRkFDVE9S X0hXKHBsbF9hdWRpbzFfMnhfY2xrLCAicGxsLWF1ZGlvMS0yeCIsCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICZwbGxfYXVkaW8xXzR4X2Nsay5j b21tb24uaHcsIDIsIDEsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIENMS19TRVRfUkFURV9QQVJFTlQpOwo+ICtzdGF0aWMgQ0xLX0ZJWEVEX0ZB Q1RPUl9IVyhwbGxfYXVkaW8xX2NsaywgInBsbC1hdWRpbzEiLAo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmcGxsX2F1ZGlvMV80eF9jbGsuY29t bW9uLmh3LCA0LCAxLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKPiArCj4gK3N0YXRpYyBjb25zdCBjaGFy ICogY29uc3Qgcl9idXNfcGFyZW50c1tdID0geyAib3NjMjRNIiwgIm9zYzMyayIsCj4gImlvc2Mi LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJwbGwtcGVyaXBoLTJ4IiwKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAicGxsLWF1ZGlvMC1kaXYyIiB9Owo+ICtz dGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYKHJfYWhiX2NsaywgInItYWhiIiwgcl9idXNfcGFy ZW50cywKPiAweDAwMCwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIDAsIDUswqDCoMKgwqDCoMKgLyogTSAqLwo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOCwgMizCoMKgwqDCoMKg wqAvKiBQICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAyNCwgMyzCoMKgwqDCoMKgLyogbXV4ICovCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAwKTsKPiArCj4gK3N0YXRpYyBT VU5YSV9DQ1VfTVBfV0lUSF9NVVgocl9hcGIxX2NsaywgInItYXBiMSIsIHJfYnVzX3BhcmVudHMs Cj4gMHgwMGMsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAwLCA1LMKgwqDCoMKgwqDCoC8qIE0gKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDgsIDIswqDCoMKgwqDCoMKgLyog UCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgMjQsIDMswqDCoMKgwqDCoC8qIG11eCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElf Q0NVX01QX1dJVEhfTVVYKHJfYXBiMl9jbGssICJyLWFwYjIiLCByX2J1c19wYXJlbnRzLAo+IDB4 MDEwLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgMCwgNSzCoMKgwqDCoMKgwqAvKiBNICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA4LCAyLMKgwqDCoMKgwqDCoC8qIFAgKi8K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IDI0LCAzLMKgwqDCoMKgwqAvKiBtdXggKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDApOwo+ICsKPiArc3RhdGljIFNVTlhJX0NDVV9H QVRFKHJfYnVzX2dwYWRjX2NsaywgInItYnVzLWdwYWRjIiwgInItYXBiMSIsCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMHgwZWMsIEJJVCgwKSwgMCk7Cj4gK3N0 YXRpYyBTVU5YSV9DQ1VfR0FURShyX2J1c190aHNfY2xrLCAici1idXMtdGhzIiwgInItYXBiMSIs IDB4MGZjLAo+IEJJVCgwKSwgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEUocl9idXNf ZG1hX2NsaywgInItYnVzLWRtYSIsICJyLWFwYjEiLCAweDEwYywKPiBCSVQoMCksIDApOwo+ICsK PiArc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByX3B3bV9wYXJlbnRzW10gPSB7ICJvc2MyNE0i LCAib3NjMzJrIiwKPiAiaW9zYyIgfTsKPiArc3RhdGljIFNVTlhJX0NDVV9NVVhfV0lUSF9HQVRF KHJfcHdtX2NsaywgInItcHdtIiwgcl9wd21fcGFyZW50cywKPiAweDEzMCwKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAyNCwgMyzC oMKgwqAvKiBtdXggKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBCSVQoMzEpLMKgLyogZ2F0ZSAqLwo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDApOwo+ICsKPiAr c3RhdGljIFNVTlhJX0NDVV9HQVRFKHJfYnVzX3B3bV9jbGssICJyLWJ1cy1wd20iLCAici1hcGIx IiwgMHgxM2MsCj4gQklUKDApLCAwKTsKPiArCj4gK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qg cl9hdWRpb19wYXJlbnRzW10gPSB7ICJwbGwtYXVkaW8wLWRpdjUiLAo+ICJwbGwtYXVkaW8wLWRp djIiLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgInBsbC1hdWRpbzEt MXgiLAo+ICJwbGwtYXVkaW8xLTR4IiB9Owo+ICtzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVY X0dBVEUocl9jb2RlY19hZGNfY2xrLCAici1jb2RlYy1hZGMiLAo+IHJfYXVkaW9fcGFyZW50cywg MHgxNDAsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgMCwgNSzCoMKgwqDCoMKgwqDCoMKgwqAvKiBNICovCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgOCwgMizCoMKgwqDCoMKgwqDCoMKgwqAvKiBQICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMjQsIDMswqDCoMKg wqDCoMKgwqDCoC8qIG11eCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEJJVCgzMSkswqDCoMKgwqDCoMKgLyogZ2F0 ZSAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUo cl9jb2RlY19kYWNfY2xrLCAici1jb2RlYy1kYWMiLAo+IHJfYXVkaW9fcGFyZW50cywgMHgxNDQs Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgMCwgNSzCoMKgwqDCoMKgwqDCoMKgwqAvKiBNICovCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOCwg MizCoMKgwqDCoMKgwqDCoMKgwqAvKiBQICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMjQsIDMswqDCoMKgwqDCoMKg wqDCoC8qIG11eCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEJJVCgzMSkswqDCoMKgwqDCoMKgLyogZ2F0ZSAqLwo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIDApOwo+ICsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFKHJfYnVzX2NvZGVjX2Ns aywgInItYnVzLWNvZGVjIiwgInItYXBiMSIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgMHgxNGMsIEJJVCgwKSwgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NV X01QX1dJVEhfTVVYX0dBVEUocl9kbWljX2NsaywgInItZG1pYyIsCj4gcl9hdWRpb19wYXJlbnRz LCAweDE1MCwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAwLCA1LMKgwqDCoMKgwqDCoMKgwqDCoC8qIE0gKi8KPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCA4LCAyLMKgwqDCoMKgwqDCoMKgwqDCoC8qIFAgKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAyNCwgMyzCoMKg wqDCoMKgwqDCoMKgLyogbXV4ICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQklUKDMxKSzCoMKgwqDCoMKgwqAvKiBn YXRlICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEUocl9idXNf ZG1pY19jbGssICJyLWJ1cy1kbWljIiwgInItYXBiMSIsIDB4MTVjLAo+IEJJVCgwKSwgMCk7Cj4g K3N0YXRpYyBTVU5YSV9DQ1VfR0FURShyX2J1c19scmFkY19jbGssICJyLWJ1cy1scmFkYyIsICJy LWFwYjEiLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDB4MTZj LCBCSVQoMCksIDApOwo+ICsKPiArc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKHJf aTJzX2NsaywgInItaTJzIiwKPiByX2F1ZGlvX3BhcmVudHMsIDB4MTcwLAo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDAs IDUswqDCoMKgwqDCoMKgwqDCoMKgLyogTSAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDgsIDIswqDCoMKgwqDCoMKg wqDCoMKgLyogUCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDI0LCAzLMKgwqDCoMKgwqDCoMKgwqAvKiBtdXggKi8K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBCSVQoMzEpLMKgwqDCoMKgwqDCoC8qIGdhdGUgKi8KPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAwKTsK PiArc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKHJfaTJzX2FzcmNfY2xrLCAici1p MnMtYXNyYyIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgcl9hdWRpb19wYXJlbnRzLCAweDE3NCwKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAw LCA1LMKgwqDCoMKgwqDCoMKgwqDCoC8qIE0gKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA4LCAyLMKgwqDCoMKgwqDC oMKgwqDCoC8qIFAgKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAyNCwgMyzCoMKgwqDCoMKgwqDCoMKgLyogbXV4ICov Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgQklUKDMxKSzCoMKgwqDCoMKgwqAvKiBnYXRlICovCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMCk7 Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShyX2J1c19pMnNfY2xrLCAici1idXMtaTJzIiwgInIt YXBiMSIsIDB4MTdjLAo+IEJJVCgwKSwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShyX2J1 c191YXJ0X2NsaywgInItYnVzLXVhcnQiLCAici1hcGIyIiwgMHgxOGMsCj4gQklUKDApLCAwKTsK PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFKHJfYnVzX2kyY19jbGssICJyLWJ1cy1pMmMiLCAici1h cGIyIiwgMHgxOWMsCj4gQklUKDApLCAwKTsKPiArCj4gK3N0YXRpYyBjb25zdCBjaGFyICogY29u c3Qgcl9pcl9wYXJlbnRzW10gPSB7ICJvc2MzMmsiLCAib3NjMjRNIiB9Owo+ICtzdGF0aWMgU1VO WElfQ0NVX01QX1dJVEhfTVVYX0dBVEUocl9pcl9jbGssICJyLWlyIiwgcl9pcl9wYXJlbnRzLAo+ IDB4MWMwLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIDAsIDUswqDCoMKgwqDCoMKgwqDCoMKgLyogTSAqLwo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIDgsIDIswqDCoMKgwqDCoMKgwqDCoMKgLyogUCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDI0LCAzLMKgwqDC oMKgwqDCoMKgwqAvKiBtdXggKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBCSVQoMzEpLMKgwqDCoMKgwqDCoC8qIGdh dGUgKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShyX2J1c19p cl9jbGssICJyLWJ1cy1pciIsICJyLWFwYjEiLCAweDFjYywKPiBCSVQoMCksIDApOwo+ICtzdGF0 aWMgU1VOWElfQ0NVX0dBVEUocl9idXNfbXNnYm94X2NsaywgInItYnVzLW1zZ2JveCIsICJyLWFw YjEiLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDB4MWRjLCBC SVQoMCksIDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEUocl9idXNfc3BpbmxvY2tfY2xrLCAi ci1idXMtc3BpbmxvY2siLCAici0KPiBhcGIxIiwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAweDFlYywgQklUKDApLCAwKTsKPiArc3RhdGljIFNVTlhJX0NDVV9H QVRFKHJfYnVzX3J0Y19jbGssICJyLWJ1cy1ydGMiLCAici1haGIiLAo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDB4MjBjLCBCSVQoMCksIENMS19JU19DUklUSUNB TCk7Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGNjdV9jb21tb24gKnN1bjUwaV9yMzI5X3JfY2N1X2Ns a3NbXSA9IHsKPiArwqDCoMKgwqDCoMKgwqAmcGxsX2NwdXhfY2xrLmNvbW1vbiwKPiArwqDCoMKg wqDCoMKgwqAmcGxsX3BlcmlwaF9iYXNlX2Nsay5jb21tb24sCj4gK8KgwqDCoMKgwqDCoMKgJnBs bF9wZXJpcGhfMnhfY2xrLmNvbW1vbiwKPiArwqDCoMKgwqDCoMKgwqAmcGxsX3BlcmlwaF84MDBt X2Nsay5jb21tb24sCj4gK8KgwqDCoMKgwqDCoMKgJnBsbF9hdWRpbzBfY2xrLmNvbW1vbiwKPiAr wqDCoMKgwqDCoMKgwqAmcGxsX2F1ZGlvMF9kaXYyX2Nsay5jb21tb24sCj4gK8KgwqDCoMKgwqDC oMKgJnBsbF9hdWRpbzBfZGl2NV9jbGsuY29tbW9uLAo+ICvCoMKgwqDCoMKgwqDCoCZwbGxfYXVk aW8xXzR4X2Nsay5jb21tb24sCj4gK8KgwqDCoMKgwqDCoMKgJnJfYWhiX2Nsay5jb21tb24sCj4g K8KgwqDCoMKgwqDCoMKgJnJfYXBiMV9jbGsuY29tbW9uLAo+ICvCoMKgwqDCoMKgwqDCoCZyX2Fw YjJfY2xrLmNvbW1vbiwKPiArwqDCoMKgwqDCoMKgwqAmcl9idXNfZ3BhZGNfY2xrLmNvbW1vbiwK PiArwqDCoMKgwqDCoMKgwqAmcl9idXNfdGhzX2Nsay5jb21tb24sCj4gK8KgwqDCoMKgwqDCoMKg JnJfYnVzX2RtYV9jbGsuY29tbW9uLAo+ICvCoMKgwqDCoMKgwqDCoCZyX3B3bV9jbGsuY29tbW9u LAo+ICvCoMKgwqDCoMKgwqDCoCZyX2J1c19wd21fY2xrLmNvbW1vbiwKPiArwqDCoMKgwqDCoMKg wqAmcl9jb2RlY19hZGNfY2xrLmNvbW1vbiwKPiArwqDCoMKgwqDCoMKgwqAmcl9jb2RlY19kYWNf Y2xrLmNvbW1vbiwKPiArwqDCoMKgwqDCoMKgwqAmcl9idXNfY29kZWNfY2xrLmNvbW1vbiwKPiAr wqDCoMKgwqDCoMKgwqAmcl9kbWljX2Nsay5jb21tb24sCj4gK8KgwqDCoMKgwqDCoMKgJnJfYnVz X2RtaWNfY2xrLmNvbW1vbiwKPiArwqDCoMKgwqDCoMKgwqAmcl9idXNfbHJhZGNfY2xrLmNvbW1v biwKPiArwqDCoMKgwqDCoMKgwqAmcl9pMnNfY2xrLmNvbW1vbiwKPiArwqDCoMKgwqDCoMKgwqAm cl9pMnNfYXNyY19jbGsuY29tbW9uLAo+ICvCoMKgwqDCoMKgwqDCoCZyX2J1c19pMnNfY2xrLmNv bW1vbiwKPiArwqDCoMKgwqDCoMKgwqAmcl9idXNfdWFydF9jbGsuY29tbW9uLAo+ICvCoMKgwqDC oMKgwqDCoCZyX2J1c19pMmNfY2xrLmNvbW1vbiwKPiArwqDCoMKgwqDCoMKgwqAmcl9pcl9jbGsu Y29tbW9uLAo+ICvCoMKgwqDCoMKgwqDCoCZyX2J1c19pcl9jbGsuY29tbW9uLAo+ICvCoMKgwqDC oMKgwqDCoCZyX2J1c19tc2dib3hfY2xrLmNvbW1vbiwKPiArwqDCoMKgwqDCoMKgwqAmcl9idXNf c3BpbmxvY2tfY2xrLmNvbW1vbiwKPiArwqDCoMKgwqDCoMKgwqAmcl9idXNfcnRjX2Nsay5jb21t b24sCj4gK307Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgc3VuNTBp X3IzMjlfcl9od19jbGtzID0gewo+ICvCoMKgwqDCoMKgwqDCoC5od3PCoMKgwqDCoD0gewo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbQ0xLX1BMTF9DUFVYXcKgwqDCoMKgwqDCoMKg wqDCoMKgPSAmcGxsX2NwdXhfY2xrLmNvbW1vbi5odywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgW0NMS19QTExfUEVSSVBIX0JBU0VdwqDCoMKgPQo+ICZwbGxfcGVyaXBoX2Jhc2Vf Y2xrLmNvbW1vbi5odywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19QTExf UEVSSVBIXzJYXcKgwqDCoMKgwqA9Cj4gJnBsbF9wZXJpcGhfMnhfY2xrLmNvbW1vbi5odywKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19QTExfUEVSSVBIXzgwME1dwqDCoMKg PQo+ICZwbGxfcGVyaXBoXzgwMG1fY2xrLmNvbW1vbi5odywKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgW0NMS19QTExfUEVSSVBIXcKgwqDCoMKgwqDCoMKgwqA9ICZwbGxfcGVyaXBo X2Nsay5odywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19QTExfQVVESU8w XcKgwqDCoMKgwqDCoMKgwqA9ICZwbGxfYXVkaW8wX2Nsay5jb21tb24uaHcsCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoFtDTEtfUExMX0FVRElPMF9ESVYyXcKgwqDCoD0KPiAmcGxs X2F1ZGlvMF9kaXYyX2Nsay5jb21tb24uaHcsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoFtDTEtfUExMX0FVRElPMF9ESVY1XcKgwqDCoD0KPiAmcGxsX2F1ZGlvMF9kaXY1X2Nsay5j b21tb24uaHcsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFtDTEtfUExMX0FVRElP MV80WF3CoMKgwqDCoMKgPQo+ICZwbGxfYXVkaW8xXzR4X2Nsay5jb21tb24uaHcsCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFtDTEtfUExMX0FVRElPMV8yWF3CoMKgwqDCoMKgPSAm cGxsX2F1ZGlvMV8yeF9jbGsuaHcsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFtD TEtfUExMX0FVRElPMV3CoMKgwqDCoMKgwqDCoMKgPSAmcGxsX2F1ZGlvMV9jbGsuaHcsCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFtDTEtfUl9BSEJdwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqA9ICZyX2FoYl9jbGsuY29tbW9uLmh3LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBbQ0xLX1JfQVBCMV3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA9ICZyX2FwYjFfY2xr LmNvbW1vbi5odywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19SX0FQQjJd wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgPSAmcl9hcGIyX2Nsay5jb21tb24uaHcsCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFtDTEtfUl9CVVNfR1BBRENdwqDCoMKgwqDCoMKgwqA9 ICZyX2J1c19ncGFkY19jbGsuY29tbW9uLmh3LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBbQ0xLX1JfQlVTX1RIU13CoMKgwqDCoMKgwqDCoMKgwqA9ICZyX2J1c190aHNfY2xrLmNv bW1vbi5odywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19SX0JVU19ETUFd wqDCoMKgwqDCoMKgwqDCoMKgPSAmcl9idXNfZG1hX2Nsay5jb21tb24uaHcsCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoFtDTEtfUl9QV01dwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqA9ICZyX3B3bV9jbGsuY29tbW9uLmh3LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBbQ0xLX1JfQlVTX1BXTV3CoMKgwqDCoMKgwqDCoMKgwqA9ICZyX2J1c19wd21fY2xrLmNvbW1v bi5odywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19SX0NPREVDX0FEQ13C oMKgwqDCoMKgwqDCoD0gJnJfY29kZWNfYWRjX2Nsay5jb21tb24uaHcsCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoFtDTEtfUl9DT0RFQ19EQUNdwqDCoMKgwqDCoMKgwqA9ICZyX2Nv ZGVjX2RhY19jbGsuY29tbW9uLmh3LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBb Q0xLX1JfQlVTX0NPREVDXcKgwqDCoMKgwqDCoMKgPSAmcl9idXNfY29kZWNfY2xrLmNvbW1vbi5o dywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19SX0RNSUNdwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgPSAmcl9kbWljX2Nsay5jb21tb24uaHcsCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoFtDTEtfUl9CVVNfRE1JQ13CoMKgwqDCoMKgwqDCoMKgPSAmcl9idXNf ZG1pY19jbGsuY29tbW9uLmh3LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbQ0xL X1JfQlVTX0xSQURDXcKgwqDCoMKgwqDCoMKgPSAmcl9idXNfbHJhZGNfY2xrLmNvbW1vbi5odywK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19SX0kyU13CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoD0gJnJfaTJzX2Nsay5jb21tb24uaHcsCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoFtDTEtfUl9JMlNfQVNSQ13CoMKgwqDCoMKgwqDCoMKgPSAmcl9pMnNfYXNy Y19jbGsuY29tbW9uLmh3LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbQ0xLX1Jf QlVTX0kyU13CoMKgwqDCoMKgwqDCoMKgwqA9ICZyX2J1c19pMnNfY2xrLmNvbW1vbi5odywKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19SX0JVU19VQVJUXcKgwqDCoMKgwqDC oMKgwqA9ICZyX2J1c191YXJ0X2Nsay5jb21tb24uaHcsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoFtDTEtfUl9CVVNfSTJDXcKgwqDCoMKgwqDCoMKgwqDCoD0gJnJfYnVzX2kyY19j bGsuY29tbW9uLmh3LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbQ0xLX1JfSVJd wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoD0gJnJfaXJfY2xrLmNvbW1vbi5odywKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19SX0JVU19JUl3CoMKgwqDCoMKgwqDCoMKg wqDCoD0gJnJfYnVzX2lyX2Nsay5jb21tb24uaHcsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoFtDTEtfUl9CVVNfTVNHQk9YXcKgwqDCoMKgwqDCoD0KPiAmcl9idXNfbXNnYm94X2Ns ay5jb21tb24uaHcsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFtDTEtfUl9CVVNf U1BJTkxPQ0tdwqDCoMKgwqA9Cj4gJnJfYnVzX3NwaW5sb2NrX2Nsay5jb21tb24uaHcsCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFtDTEtfUl9CVVNfUlRDXcKgwqDCoMKgwqDCoMKg wqDCoD0gJnJfYnVzX3J0Y19jbGsuY29tbW9uLmh3LAo+ICvCoMKgwqDCoMKgwqDCoH0sCj4gK8Kg wqDCoMKgwqDCoMKgLm51bSA9IENMS19OVU1CRVIsCj4gK307Cj4gKwo+ICtzdGF0aWMgc3RydWN0 IGNjdV9yZXNldF9tYXAgc3VuNTBpX3IzMjlfcl9jY3VfcmVzZXRzW10gPSB7Cj4gK8KgwqDCoMKg wqDCoMKgW1JTVF9SX0JVU19HUEFEQ13CoMKgwqDCoMKgwqDCoD0geyAweDBlYywgQklUKDE2KSB9 LAo+ICvCoMKgwqDCoMKgwqDCoFtSU1RfUl9CVVNfVEhTXcKgwqDCoMKgwqDCoMKgwqDCoD0geyAw eDBmYywgQklUKDE2KSB9LAo+ICvCoMKgwqDCoMKgwqDCoFtSU1RfUl9CVVNfRE1BXcKgwqDCoMKg wqDCoMKgwqDCoD0geyAweDEwYywgQklUKDE2KSB9LAo+ICvCoMKgwqDCoMKgwqDCoFtSU1RfUl9C VVNfUFdNXcKgwqDCoMKgwqDCoMKgwqDCoD0geyAweDEzYywgQklUKDE2KSB9LAo+ICvCoMKgwqDC oMKgwqDCoFtSU1RfUl9CVVNfQ09ERUNdwqDCoMKgwqDCoMKgwqA9IHsgMHgxNGMsIEJJVCgxNikg fSwKPiArwqDCoMKgwqDCoMKgwqBbUlNUX1JfQlVTX0RNSUNdwqDCoMKgwqDCoMKgwqDCoD0geyAw eDE1YywgQklUKDE2KSB9LAo+ICvCoMKgwqDCoMKgwqDCoFtSU1RfUl9CVVNfTFJBRENdwqDCoMKg wqDCoMKgwqA9IHsgMHgxNmMsIEJJVCgxNikgfSwKPiArwqDCoMKgwqDCoMKgwqBbUlNUX1JfQlVT X0kyU13CoMKgwqDCoMKgwqDCoMKgwqA9IHsgMHgxN2MsIEJJVCgxNikgfSwKPiArwqDCoMKgwqDC oMKgwqBbUlNUX1JfQlVTX1VBUlRdwqDCoMKgwqDCoMKgwqDCoD0geyAweDE4YywgQklUKDE2KSB9 LAo+ICvCoMKgwqDCoMKgwqDCoFtSU1RfUl9CVVNfSTJDXcKgwqDCoMKgwqDCoMKgwqDCoD0geyAw eDE5YywgQklUKDE2KSB9LAo+ICvCoMKgwqDCoMKgwqDCoFtSU1RfUl9CVVNfSVJdwqDCoMKgwqDC oMKgwqDCoMKgwqA9IHsgMHgxY2MsIEJJVCgxNikgfSwKPiArwqDCoMKgwqDCoMKgwqBbUlNUX1Jf QlVTX01TR0JPWF3CoMKgwqDCoMKgwqA9IHsgMHgxZGMsIEJJVCgxNikgfSwKPiArwqDCoMKgwqDC oMKgwqBbUlNUX1JfQlVTX1NQSU5MT0NLXcKgwqDCoMKgPSB7IDB4MWVjLCBCSVQoMTYpIH0sCj4g K8KgwqDCoMKgwqDCoMKgW1JTVF9SX0JVU19SVENdwqDCoMKgwqDCoMKgwqDCoMKgPSB7IDB4MjBj LCBCSVQoMTYpIH0sCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHN1bnhpX2NjdV9k ZXNjIHN1bjUwaV9yMzI5X3JfY2N1X2Rlc2MgPSB7Cj4gK8KgwqDCoMKgwqDCoMKgLmNjdV9jbGtz wqDCoMKgwqDCoMKgwqA9IHN1bjUwaV9yMzI5X3JfY2N1X2Nsa3MsCj4gK8KgwqDCoMKgwqDCoMKg Lm51bV9jY3VfY2xrc8KgwqDCoD0gQVJSQVlfU0laRShzdW41MGlfcjMyOV9yX2NjdV9jbGtzKSwK PiArCj4gK8KgwqDCoMKgwqDCoMKgLmh3X2Nsa3PCoMKgwqDCoMKgwqDCoMKgPSAmc3VuNTBpX3Iz Mjlfcl9od19jbGtzLAo+ICsKPiArwqDCoMKgwqDCoMKgwqAucmVzZXRzwqDCoMKgwqDCoMKgwqDC oMKgPSBzdW41MGlfcjMyOV9yX2NjdV9yZXNldHMsCj4gK8KgwqDCoMKgwqDCoMKgLm51bV9yZXNl dHPCoMKgwqDCoMKgPSBBUlJBWV9TSVpFKHN1bjUwaV9yMzI5X3JfY2N1X3Jlc2V0cyksCj4gK307 Cj4gKwo+ICtzdGF0aWMgY29uc3QgdTMyIHBsbF9yZWdzW10gPSB7Cj4gK8KgwqDCoMKgwqDCoMKg U1VONTBJX1IzMjlfUExMX0NQVVhfUkVHLAo+ICvCoMKgwqDCoMKgwqDCoFNVTjUwSV9SMzI5X1BM TF9QRVJJUEhfUkVHLAo+ICvCoMKgwqDCoMKgwqDCoFNVTjUwSV9SMzI5X1BMTF9BVURJTzBfUkVH LAo+ICvCoMKgwqDCoMKgwqDCoFNVTjUwSV9SMzI5X1BMTF9BVURJTzFfUkVHLAo+ICt9Owo+ICsK PiArc3RhdGljIHZvaWQgX19pbml0IHN1bjUwaV9yMzI5X3JfY2N1X3NldHVwKHN0cnVjdCBkZXZp Y2Vfbm9kZSAqbm9kZSkKPiArewo+ICvCoMKgwqDCoMKgwqDCoHZvaWQgX19pb21lbSAqcmVnOwo+ ICvCoMKgwqDCoMKgwqDCoHUzMiB2YWw7Cj4gK8KgwqDCoMKgwqDCoMKgaW50IGk7Cj4gKwo+ICvC oMKgwqDCoMKgwqDCoHJlZyA9IG9mX2lvX3JlcXVlc3RfYW5kX21hcChub2RlLCAwLAo+IG9mX25v ZGVfZnVsbF9uYW1lKG5vZGUpKTsKPiArwqDCoMKgwqDCoMKgwqBpZiAoSVNfRVJSKHJlZykpIHsK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHJfZXJyKCIlcE9GOiBDb3VsZCBub3Qg bWFwIGNsb2NrIHJlZ2lzdGVyc1xuIiwKPiBub2RlKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgcmV0dXJuOwo+ICvCoMKgwqDCoMKgwqDCoH0KPiArCj4gK8KgwqDCoMKgwqDCoMKg LyogRW5hYmxlIHRoZSBsb2NrIGJpdHMgYW5kIHRoZSBvdXRwdXQgZW5hYmxlIGJpdHMgb24gYWxs Cj4gUExMcyAqLwo+ICvCoMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBs bF9yZWdzKTsgaSsrKSB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHZhbCA9IHJl YWRsKHJlZyArIHBsbF9yZWdzW2ldKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg dmFsIHw9IEJJVCgyOSkgfCBCSVQoMjcpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqB3cml0ZWwodmFsLCByZWcgKyBwbGxfcmVnc1tpXSk7Cj4gK8KgwqDCoMKgwqDCoMKgfQo+ICsK PiArwqDCoMKgwqDCoMKgwqAvKgo+ICvCoMKgwqDCoMKgwqDCoCAqIEZvcmNlIHRoZSBJL08gZGl2 aWRlcnMgb2YgUExMLUFVRElPMSB0byByZXNldCBkZWZhdWx0Cj4gdmFsdWUKPiArwqDCoMKgwqDC oMKgwqAgKgo+ICvCoMKgwqDCoMKgwqDCoCAqIFNlZSB0aGUgY29tbWVudCBiZWZvcmUgcGxsLWF1 ZGlvMSBkZWZpbml0aW9uIGZvciB0aGUKPiByZWFzb24uCj4gK8KgwqDCoMKgwqDCoMKgICovCj4g Kwo+ICvCoMKgwqDCoMKgwqDCoHZhbCA9IHJlYWRsKHJlZyArIFNVTjUwSV9SMzI5X1BMTF9BVURJ TzFfUkVHKTsKPiArwqDCoMKgwqDCoMKgwqB2YWwgJj0gfkJJVCgxKTsKPiArwqDCoMKgwqDCoMKg wqB2YWwgfD0gQklUKDApOwo+ICvCoMKgwqDCoMKgwqDCoHdyaXRlbCh2YWwsIHJlZyArIFNVTjUw SV9SMzI5X1BMTF9BVURJTzFfUkVHKTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgaSA9IHN1bnhpX2Nj dV9wcm9iZShub2RlLCByZWcsICZzdW41MGlfcjMyOV9yX2NjdV9kZXNjKTsKPiArwqDCoMKgwqDC oMKgwqBpZiAoaSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHJfZXJyKCIlcE9G OiBwcm9iaW5nIGNsb2NrcyBmYWlsczogJWRcbiIsIG5vZGUsIGkpOwo+ICt9Cj4gKwo+ICtDTEtf T0ZfREVDTEFSRShzdW41MGlfcjMyOV9yX2NjdSwgImFsbHdpbm5lcixzdW41MGktcjMyOS1yLWNj dSIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN1bjUwaV9yMzI5X3JfY2N1X3NldHVw KTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjUwaS1yMzI5LXIu aAo+IGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjUwaS1yMzI5LXIuaAo+IG5ldyBmaWxl IG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi42MmNmNjUzMjIxMTYKPiAtLS0gL2Rl di9udWxsCj4gKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjUwaS1yMzI5LXIuaAo+ IEBAIC0wLDAgKzEsMzMgQEAKPiArLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAg Ki8KPiArLyoKPiArICogQ29weXJpZ2h0IChjKSAyMDIxIFNpcGVlZAo+ICsgKi8KPiArCj4gKyNp Zm5kZWYgX0NDVV9TVU41MElfUjMyOV9SX0gKPiArI2RlZmluZSBfQ0NVX1NVTjUwSV9SMzI5X1Jf SAo+ICsKPiArI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3N1bjUwaS1yMzI5LXItY2N1Lmg+ Cj4gKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9yZXNldC9zdW41MGktcjMyOS1yLWNjdS5oPgo+ICsK PiArI2RlZmluZSBDTEtfUExMX0NQVVjCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMAo+ICsjZGVmaW5l IENMS19QTExfUEVSSVBIX0JBU0XCoMKgwqDCoDEKPiArI2RlZmluZSBDTEtfUExMX1BFUklQSF8y WMKgwqDCoMKgwqDCoDIKPiArI2RlZmluZSBDTEtfUExMX1BFUklQSF84MDBNwqDCoMKgwqAzCj4g KyNkZWZpbmUgQ0xLX1BMTF9QRVJJUEjCoMKgwqDCoMKgwqDCoMKgwqA0Cj4gKyNkZWZpbmUgQ0xL X1BMTF9BVURJTzDCoMKgwqDCoMKgwqDCoMKgwqA1Cj4gKyNkZWZpbmUgQ0xLX1BMTF9BVURJTzBf RElWMsKgwqDCoMKgNgo+ICsjZGVmaW5lIENMS19QTExfQVVESU8wX0RJVjXCoMKgwqDCoDcKPiAr I2RlZmluZSBDTEtfUExMX0FVRElPMV80WMKgwqDCoMKgwqDCoDgKPiArI2RlZmluZSBDTEtfUExM X0FVRElPMV8yWMKgwqDCoMKgwqDCoDkKPiArI2RlZmluZSBDTEtfUExMX0FVRElPMcKgwqDCoMKg wqDCoMKgwqDCoDEwCj4gKyNkZWZpbmUgQ0xLX1JfQUhCwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoDExCj4gKwo+ICsvKiBSX0FQQjEgZXhwb3J0ZWQgZm9yIFBJTyAqLwo+ICsKPiArI2RlZmlu ZSBDTEtfUl9BUEIywqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAxMwo+ICsKPiArLyogQWxsIG1v ZHVsZSAvIGJ1cyBnYXRlIGNsb2NrcyBleHBvcnRlZCAqLwo+ICsKPiArI2RlZmluZSBDTEtfTlVN QkVSwqDCoMKgwqDCoChDTEtfUl9CVVNfUlRDICsgMSkKPiArCj4gKyNlbmRpZiAvKiBfQ0NVX1NV TjUwSV9SMzI5X1JfSCAqLwo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2Nr L3N1bjUwaS1yMzI5LXItY2N1LmgKPiBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svc3VuNTBp LXIzMjktci1jY3UuaAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAw Li5kZjliYzU4ZGU1YzQKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5n cy9jbG9jay9zdW41MGktcjMyOS1yLWNjdS5oCj4gQEAgLTAsMCArMSwzMyBAQAo+ICsvKiBTUERY LUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLwo+ICsvKgo+ICsgKiBDb3B5cmlnaHQgKGMp IDIwMjEgU2lwZWVkCj4gKyAqLwo+ICsKPiArI2lmbmRlZiBfRFRfQklORElOR1NfQ0xLX1NVTjUw SV9SMzI5X1JfQ0NVX0hfCj4gKyNkZWZpbmUgX0RUX0JJTkRJTkdTX0NMS19TVU41MElfUjMyOV9S X0NDVV9IXwo+ICsKPiArI2RlZmluZSBDTEtfUl9BUEIxwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAxMgo+ICsKPiArI2RlZmluZSBDTEtfUl9CVVNfR1BBREPCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoDE0Cj4gKyNkZWZpbmUgQ0xLX1JfQlVTX1RIU8KgwqDCoMKgwqDCoMKgwqDCoMKg MTUKPiArI2RlZmluZSBDTEtfUl9CVVNfRE1BwqDCoMKgwqDCoMKgwqDCoMKgwqAxNgo+ICsjZGVm aW5lIENMS19SX1BXTcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAxNwo+ICsjZGVmaW5lIENM S19SX0JVU19QV03CoMKgwqDCoMKgwqDCoMKgwqDCoDE4Cj4gKyNkZWZpbmUgQ0xLX1JfQ09ERUNf QURDwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAxOQo+ICsjZGVmaW5lIENMS19SX0NP REVDX0RBQ8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMjAKPiArI2RlZmluZSBDTEtf Ul9CVVNfQ09ERUPCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDIxCj4gKyNkZWZpbmUg Q0xLX1JfRE1JQ8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMjIKPiArI2RlZmluZSBDTEtfUl9C VVNfRE1JQ8KgwqDCoMKgwqDCoMKgwqDCoDIzCj4gKyNkZWZpbmUgQ0xLX1JfQlVTX0xSQURDwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAyNAo+ICsjZGVmaW5lIENMS19SX0kyU8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAyNQo+ICsjZGVmaW5lIENMS19SX0kyU19BU1JDwqDCoMKg wqDCoMKgwqDCoMKgMjYKPiArI2RlZmluZSBDTEtfUl9CVVNfSTJTwqDCoMKgwqDCoMKgwqDCoMKg wqAyNwo+ICsjZGVmaW5lIENMS19SX0JVU19VQVJUwqDCoMKgwqDCoMKgwqDCoMKgMjgKPiArI2Rl ZmluZSBDTEtfUl9CVVNfSTJDwqDCoMKgwqDCoMKgwqDCoMKgwqAyOQo+ICsjZGVmaW5lIENMS19S X0lSwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMzAKPiArI2RlZmluZSBDTEtfUl9CVVNf SVLCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMzEKPiArI2RlZmluZSBDTEtfUl9CVVNfTVNHQk9YwqDC oMKgwqDCoMKgwqAzMgo+ICsjZGVmaW5lIENMS19SX0JVU19TUElOTE9DS8KgwqDCoMKgwqAzMwo+ ICsjZGVmaW5lIENMS19SX0JVU19SVEPCoMKgwqDCoMKgwqDCoMKgwqDCoDM0Cj4gKwo+ICsjZW5k aWYgLyogX0RUX0JJTkRJTkdTX0NMS19TVU41MElfUjMyOV9SX0NDVV9IXyAqLwo+IGRpZmYgLS1n aXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L3N1bjUwaS1yMzI5LXItY2N1LmgKPiBiL2lu Y2x1ZGUvZHQtYmluZGluZ3MvcmVzZXQvc3VuNTBpLXIzMjktci1jY3UuaAo+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi40MDY0NGYyZjIxYzYKPiAtLS0gL2Rldi9u dWxsCj4gKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9zdW41MGktcjMyOS1yLWNjdS5o Cj4gQEAgLTAsMCArMSwyNCBAQAo+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogKEdQTC0y LjArIG9yIE1JVCkgKi8KPiArLyoKPiArICogQ29weXJpZ2h0IChjKSAyMDIxIFNpcGVlZAo+ICsg Ki8KPiArCj4gKyNpZm5kZWYgX0RUX0JJTkRJTkdTX1JTVF9TVU41MElfUjMyOV9SX0NDVV9IXwo+ ICsjZGVmaW5lIF9EVF9CSU5ESU5HU19SU1RfU1VONTBJX1IzMjlfUl9DQ1VfSF8KPiArCj4gKyNk ZWZpbmUgUlNUX1JfQlVTX0dQQURDwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAwCj4g KyNkZWZpbmUgUlNUX1JfQlVTX1RIU8KgwqDCoMKgwqDCoMKgwqDCoMKgMQo+ICsjZGVmaW5lIFJT VF9SX0JVU19ETUHCoMKgwqDCoMKgwqDCoMKgwqDCoDIKPiArI2RlZmluZSBSU1RfUl9CVVNfUFdN wqDCoMKgwqDCoMKgwqDCoMKgwqAzCj4gKyNkZWZpbmUgUlNUX1JfQlVTX0NPREVDwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA0Cj4gKyNkZWZpbmUgUlNUX1JfQlVTX0RNSUPCoMKgwqDC oMKgwqDCoMKgwqA1Cj4gKyNkZWZpbmUgUlNUX1JfQlVTX0xSQURDwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqA2Cj4gKyNkZWZpbmUgUlNUX1JfQlVTX0kyU8KgwqDCoMKgwqDCoMKgwqDC oMKgNwo+ICsjZGVmaW5lIFJTVF9SX0JVU19VQVJUwqDCoMKgwqDCoMKgwqDCoMKgOAo+ICsjZGVm aW5lIFJTVF9SX0JVU19JMkPCoMKgwqDCoMKgwqDCoMKgwqDCoDkKPiArI2RlZmluZSBSU1RfUl9C VVNfSVLCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMTAKPiArI2RlZmluZSBSU1RfUl9CVVNfTVNHQk9Y wqDCoMKgwqDCoMKgwqAxMQo+ICsjZGVmaW5lIFJTVF9SX0JVU19TUElOTE9DS8KgwqDCoMKgwqAx Mgo+ICsjZGVmaW5lIFJTVF9SX0JVU19SVEPCoMKgwqDCoMKgwqDCoMKgwqDCoDEzCj4gKwo+ICsj ZW5kaWYgLyogX0RUX0JJTkRJTkdTX1JTVF9TVU41MElfUjMyOV9SX0NDVV9IXyAqLwoKCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2Vy bmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0 cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVs Cg==