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=-6.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,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 1FE08C48BD6 for ; Tue, 25 Jun 2019 13:40:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CDA0F2133F for ; Tue, 25 Jun 2019 13:40:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729191AbfFYNk0 (ORCPT ); Tue, 25 Jun 2019 09:40:26 -0400 Received: from mga02.intel.com ([134.134.136.20]:37976 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727138AbfFYNkZ (ORCPT ); Tue, 25 Jun 2019 09:40:25 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Jun 2019 06:40:23 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.63,416,1557212400"; d="scan'208";a="163627242" Received: from syhu-mobl.ccr.corp.intel.com ([10.249.173.95]) by fmsmga007.fm.intel.com with ESMTP; 25 Jun 2019 06:40:18 -0700 Message-ID: <1561470011.19713.1.camel@intel.com> Subject: Re: [PATCH v1 04/22] docs: thermal: convert to ReST From: Zhang Rui To: Mauro Carvalho Chehab , Linux Doc Mailing List Cc: Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Jonathan Corbet , Amit Daniel Kachhap , Viresh Kumar , Javi Merino , Kukjin Kim , Krzysztof Kozlowski , Eduardo Valentin , Daniel Lezcano , linux-pm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, Arjan van de Ven Date: Tue, 25 Jun 2019 21:40:11 +0800 In-Reply-To: <23fafb70bfc9bd8b7f306f2502617d8f8794eae5.1560891322.git.mchehab+samsung@kernel.org> References: <23fafb70bfc9bd8b7f306f2502617d8f8794eae5.1560891322.git.mchehab+samsung@kernel.org> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.2-0ubuntu3.2 Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 二, 2019-06-18 at 18:05 -0300, Mauro Carvalho Chehab wrote: > Rename the thermal documentation files to ReST, add an > index for them and adjust in order to produce a nice html > output via the Sphinx build system. > > At its new index.rst, let's add a :orphan: while this is not linked > to > the main index.rst file, in order to avoid build warnings. > > Signed-off-by: Mauro Carvalho Chehab Acked-by: Zhang Rui should I apply this patch or you have a separate tree for all these changes? thanks, rui > --- >  ...pu-cooling-api.txt => cpu-cooling-api.rst} |  39 +- >  .../{exynos_thermal => exynos_thermal.rst}    |  47 +- >  ...emulation => exynos_thermal_emulation.rst} |  66 +-- >  Documentation/thermal/index.rst               |  18 + >  ...el_powerclamp.txt => intel_powerclamp.rst} | 177 +++---- >  .../{nouveau_thermal => nouveau_thermal.rst}  |  54 +- >  ...ower_allocator.txt => power_allocator.rst} | 140 ++--- >  .../thermal/{sysfs-api.txt => sysfs-api.rst}  | 490 ++++++++++++-- > ---- >  ...hermal => x86_pkg_temperature_thermal.rst} |  28 +- >  MAINTAINERS                                   |   2 +- >  include/linux/thermal.h                       |   4 +- >  11 files changed, 665 insertions(+), 400 deletions(-) >  rename Documentation/thermal/{cpu-cooling-api.txt => cpu-cooling- > api.rst} (82%) >  rename Documentation/thermal/{exynos_thermal => exynos_thermal.rst} > (67%) >  rename Documentation/thermal/{exynos_thermal_emulation => > exynos_thermal_emulation.rst} (36%) >  create mode 100644 Documentation/thermal/index.rst >  rename Documentation/thermal/{intel_powerclamp.txt => > intel_powerclamp.rst} (76%) >  rename Documentation/thermal/{nouveau_thermal => > nouveau_thermal.rst} (64%) >  rename Documentation/thermal/{power_allocator.txt => > power_allocator.rst} (74%) >  rename Documentation/thermal/{sysfs-api.txt => sysfs-api.rst} (66%) >  rename Documentation/thermal/{x86_pkg_temperature_thermal => > x86_pkg_temperature_thermal.rst} (80%) > > diff --git a/Documentation/thermal/cpu-cooling-api.txt > b/Documentation/thermal/cpu-cooling-api.rst > similarity index 82% > rename from Documentation/thermal/cpu-cooling-api.txt > rename to Documentation/thermal/cpu-cooling-api.rst > index 7df567eaea1a..645d914c45a6 100644 > --- a/Documentation/thermal/cpu-cooling-api.txt > +++ b/Documentation/thermal/cpu-cooling-api.rst > @@ -1,5 +1,6 @@ > +======================= >  CPU cooling APIs How To > -=================================== > +======================= >   >  Written by Amit Daniel Kachhap >   > @@ -8,40 +9,54 @@ Updated: 6 Jan 2015 >  Copyright (c)  2012 Samsung Electronics Co., Ltd(http://www.samsung. > com) >   >  0. Introduction > +=============== >   >  The generic cpu cooling(freq clipping) provides > registration/unregistration APIs >  to the caller. The binding of the cooling devices to the trip point > is left for >  the user. The registration APIs returns the cooling device pointer. >   >  1. cpu cooling APIs > +=================== >   >  1.1 cpufreq registration/unregistration APIs > -1.1.1 struct thermal_cooling_device *cpufreq_cooling_register( > - struct cpumask *clip_cpus) > +-------------------------------------------- > + > +    :: > + > + struct thermal_cooling_device > + *cpufreq_cooling_register(struct cpumask *clip_cpus) >   >      This interface function registers the cpufreq cooling device > with the name >      "thermal-cpufreq-%x". This api can support multiple instances of > cpufreq >      cooling devices. >   > -   clip_cpus: cpumask of cpus where the frequency constraints will > happen. > +   clip_cpus: > + cpumask of cpus where the frequency constraints will happen. >   > -1.1.2 struct thermal_cooling_device *of_cpufreq_cooling_register( > - struct cpufreq_policy > *policy) > +    :: > + > + struct thermal_cooling_device > + *of_cpufreq_cooling_register(struct cpufreq_policy *policy) >   >      This interface function registers the cpufreq cooling device > with >      the name "thermal-cpufreq-%x" linking it with a device tree > node, in >      order to bind it via the thermal DT code. This api can support > multiple >      instances of cpufreq cooling devices. >   > -    policy: CPUFreq policy. > +    policy: > + CPUFreq policy. >   > -1.1.3 void cpufreq_cooling_unregister(struct thermal_cooling_device > *cdev) > + > +    :: > + > + void cpufreq_cooling_unregister(struct > thermal_cooling_device *cdev) >   >      This interface function unregisters the "thermal-cpufreq-%x" > cooling device. >   >      cdev: Cooling device pointer which has to be unregistered. >   >  2. Power models > +=============== >   >  The power API registration functions provide a simple power model > for >  CPUs.  The current power is calculated as dynamic power (static > power isn't > @@ -65,9 +80,9 @@ For a given processor implementation the primary > factors are: >    variation.  In pathological cases this variation can be > significant, >    but typically it is of a much lesser impact than the factors > above. >   > -A high level dynamic power consumption model may then be represented > as: > +A high level dynamic power consumption model may then be represented > as:: >   > -Pdyn = f(run) * Voltage^2 * Frequency * Utilisation > + Pdyn = f(run) * Voltage^2 * Frequency * Utilisation >   >  f(run) here represents the described execution behaviour and its >  result has a units of Watts/Hz/Volt^2 (this often expressed in > @@ -80,9 +95,9 @@ factors.  Therefore, in initial implementation that > contribution is >  represented as a constant coefficient.  This is a simplification >  consistent with the relative contribution to overall power > variation. >   > -In this simplified representation our model becomes: > +In this simplified representation our model becomes:: >   > -Pdyn = Capacitance * Voltage^2 * Frequency * Utilisation > + Pdyn = Capacitance * Voltage^2 * Frequency * Utilisation >   >  Where `capacitance` is a constant that represents an indicative >  running time dynamic power coefficient in fundamental units of > diff --git a/Documentation/thermal/exynos_thermal > b/Documentation/thermal/exynos_thermal.rst > similarity index 67% > rename from Documentation/thermal/exynos_thermal > rename to Documentation/thermal/exynos_thermal.rst > index 9010c4416967..5bd556566c70 100644 > --- a/Documentation/thermal/exynos_thermal > +++ b/Documentation/thermal/exynos_thermal.rst > @@ -1,8 +1,11 @@ > +======================== >  Kernel driver exynos_tmu > -================= > +======================== >   >  Supported chips: > + >  * ARM SAMSUNG EXYNOS4, EXYNOS5 series of SoC > + >    Datasheet: Not publicly available >   >  Authors: Donggeun Kim > @@ -19,32 +22,39 @@ Temperature can be taken from the temperature > code. >  There are three equations converting from temperature to temperature > code. >   >  The three equations are: > -  1. Two point trimming > +  1. Two point trimming:: > + >   Tc = (T - 25) * (TI2 - TI1) / (85 - 25) + TI1 >   > -  2. One point trimming > +  2. One point trimming:: > + >   Tc = T + TI1 - 25 >   > -  3. No trimming > +  3. No trimming:: > + >   Tc = T + 50 >   > -  Tc: Temperature code, T: Temperature, > -  TI1: Trimming info for 25 degree Celsius (stored at TRIMINFO > register) > +  Tc: > +       Temperature code, T: Temperature, > +  TI1: > +       Trimming info for 25 degree Celsius (stored at TRIMINFO > register) >         Temperature code measured at 25 degree Celsius which is > unchanged > -  TI2: Trimming info for 85 degree Celsius (stored at TRIMINFO > register) > +  TI2: > +       Trimming info for 85 degree Celsius (stored at TRIMINFO > register) >         Temperature code measured at 85 degree Celsius which is > unchanged >   >  TMU(Thermal Management Unit) in EXYNOS4/5 generates interrupt >  when temperature exceeds pre-defined levels. >  The maximum number of configurable threshold is five. > -The threshold levels are defined as follows: > +The threshold levels are defined as follows:: > + >    Level_0: current temperature > trigger_level_0 + threshold >    Level_1: current temperature > trigger_level_1 + threshold >    Level_2: current temperature > trigger_level_2 + threshold >    Level_3: current temperature > trigger_level_3 + threshold >   > -  The threshold and each trigger_level are set > -  through the corresponding registers. > +The threshold and each trigger_level are set > +through the corresponding registers. >   >  When an interrupt occurs, this driver notify kernel thermal > framework >  with the function exynos_report_trigger. > @@ -54,24 +64,27 @@ it can be used to synchronize the cooling action. >  TMU driver description: >  ----------------------- >   > -The exynos thermal driver is structured as, > +The exynos thermal driver is structured as:: >   >   Kernel Core thermal > framework >   (thermal_core.c, step_wise.c, > cpu_cooling.c) >   ^ >   | >   | > -TMU configuration data -------> TMU Driver  <------> Exynos Core > thermal wrapper > -(exynos_tmu_data.c)       (exynos_tmu.c)    (exynos_th > ermal_common.c) > -(exynos_tmu_data.h)       (exynos_tmu.h)    (exynos_th > ermal_common.h) > +  TMU configuration data -----> TMU Driver  <----> Exynos Core > thermal wrapper > +  (exynos_tmu_data.c)       (exynos_tmu.c)    (exynos_ > thermal_common.c) > +  (exynos_tmu_data.h)       (exynos_tmu.h)    (exynos_ > thermal_common.h) >   > -a) TMU configuration data: This consist of TMU register > offsets/bitfields > +a) TMU configuration data: > + This consist of TMU register offsets/bitfields >   described through structure exynos_tmu_registers. > Also several >   other platform data (struct > exynos_tmu_platform_data) members >   are used to configure the TMU. > -b) TMU driver: This component initialises the TMU controller and > sets different > +b) TMU driver: > + This component initialises the TMU controller and > sets different >   thresholds. It invokes core thermal implementation > with the call >   exynos_report_trigger. > -c) Exynos Core thermal wrapper: This provides 3 wrapper function to > use the > +c) Exynos Core thermal wrapper: > + This provides 3 wrapper function to use the >   Kernel core thermal framework. They are > exynos_unregister_thermal, >   exynos_register_thermal and exynos_report_trigger. > diff --git a/Documentation/thermal/exynos_thermal_emulation > b/Documentation/thermal/exynos_thermal_emulation.rst > similarity index 36% > rename from Documentation/thermal/exynos_thermal_emulation > rename to Documentation/thermal/exynos_thermal_emulation.rst > index b15efec6ca28..c21d10838bc5 100644 > --- a/Documentation/thermal/exynos_thermal_emulation > +++ b/Documentation/thermal/exynos_thermal_emulation.rst > @@ -1,5 +1,6 @@ > -EXYNOS EMULATION MODE > -======================== > +===================== > +Exynos Emulation Mode > +===================== >   >  Copyright (C) 2012 Samsung Electronics >   > @@ -8,46 +9,53 @@ Written by Jonghwa Lee >  Description >  ----------- >   > -Exynos 4x12 (4212, 4412) and 5 series provide emulation mode for > thermal management unit. > -Thermal emulation mode supports software debug for TMU's operation. > User can set temperature > -manually with software code and TMU will read current temperature > from user value not from > -sensor's value. > +Exynos 4x12 (4212, 4412) and 5 series provide emulation mode for > thermal > +management unit. Thermal emulation mode supports software debug for > +TMU's operation. User can set temperature manually with software > code > +and TMU will read current temperature from user value not from > sensor's > +value. >   > -Enabling CONFIG_THERMAL_EMULATION option will make this support > available. > -When it's enabled, sysfs node will be created as > +Enabling CONFIG_THERMAL_EMULATION option will make this support > +available. When it's enabled, sysfs node will be created as >  /sys/devices/virtual/thermal/thermal_zone'zone id'/emul_temp. >   > -The sysfs node, 'emul_node', will contain value 0 for the initial > state. When you input any > -temperature you want to update to sysfs node, it automatically > enable emulation mode and > -current temperature will be changed into it. > -(Exynos also supports user changeable delay time which would be used > to delay of > - changing temperature. However, this node only uses same delay of > real sensing time, 938us.) > +The sysfs node, 'emul_node', will contain value 0 for the initial > state. > +When you input any temperature you want to update to sysfs node, it > +automatically enable emulation mode and current temperature will be > +changed into it. >   > -Exynos emulation mode requires synchronous of value changing and > enabling. It means when you > -want to update the any value of delay or next temperature, then you > have to enable emulation > -mode at the same time. (Or you have to keep the mode enabling.) If > you don't, it fails to > -change the value to updated one and just use last succeessful value > repeatedly. That's why > -this node gives users the right to change termerpature only. Just > one interface makes it more > -simply to use. > +(Exynos also supports user changeable delay time which would be used > to > +delay of changing temperature. However, this node only uses same > delay > +of real sensing time, 938us.) > + > +Exynos emulation mode requires synchronous of value changing and > +enabling. It means when you want to update the any value of delay or > +next temperature, then you have to enable emulation mode at the same > +time. (Or you have to keep the mode enabling.) If you don't, it > fails to > +change the value to updated one and just use last succeessful value > +repeatedly. That's why this node gives users the right to change > +termerpature only. Just one interface makes it more simply to use. >   >  Disabling emulation mode only requires writing value 0 to sysfs > node. >   > +:: >   > -TEMP 120 | > + > +  TEMP 120 | >       | >   100 | >       | >    80 | > -     |          +----------- > -  60 |              |     | > -     |            +-------------|          | > +     |  +----------- > +  60 |        |     | > +     |    +-------------|          | >    40 |              |           |          | > -     |    |        |          | > -  20 |    |        |          +- > --------- > -     |      |        |          | >           | > +     |    |  |          | > +  20 |    |  |          +---- > ------ > +     |    |  |          |       >     | >     0 > |______________|_____________|__________|__________|_________ > -    A       A     A     >        A     TIME > +    A  A     A   >       A     TIME >      |<----->|  |<----->|  |<----->|     >     | >      | 938us |    |  |  |       |        >    | > -emulation    :  0  50    |    70      |  20      |     >       0 > -current temp :   sensor   50  70         20    >     sensor > +  emulation   : 0  50    |    70      |  20      |     >       0 > +  current temp:   sensor   50  70         20   >      sensor > diff --git a/Documentation/thermal/index.rst > b/Documentation/thermal/index.rst > new file mode 100644 > index 000000000000..8c1c00146cad > --- /dev/null > +++ b/Documentation/thermal/index.rst > @@ -0,0 +1,18 @@ > +:orphan: > + > +======= > +Thermal > +======= > + > +.. toctree:: > +   :maxdepth: 1 > + > +   cpu-cooling-api > +   sysfs-api > +   power_allocator > + > +   exynos_thermal > +   exynos_thermal_emulation > +   intel_powerclamp > +   nouveau_thermal > +   x86_pkg_temperature_thermal > diff --git a/Documentation/thermal/intel_powerclamp.txt > b/Documentation/thermal/intel_powerclamp.rst > similarity index 76% > rename from Documentation/thermal/intel_powerclamp.txt > rename to Documentation/thermal/intel_powerclamp.rst > index b5df21168fbc..3f6dfb0b3ea6 100644 > --- a/Documentation/thermal/intel_powerclamp.txt > +++ b/Documentation/thermal/intel_powerclamp.rst > @@ -1,10 +1,13 @@ > -  ======================= > -  INTEL POWERCLAMP DRIVER > -  ======================= > -By: Arjan van de Ven > -    Jacob Pan > +======================= > +Intel Powerclamp Driver > +======================= > + > +By: > +  - Arjan van de Ven > +  - Jacob Pan > + > +.. Contents: >   > -Contents: >   (*) Introduction >       - Goals and Objectives >   > @@ -23,7 +26,6 @@ Contents: >       - Generic Thermal Layer (sysfs) >       - Kernel APIs (TBD) >   > -============ >  INTRODUCTION >  ============ >   > @@ -47,7 +49,6 @@ scalability, and user experience. In many cases, > clear advantage is >  shown over taking the CPU offline or modulating the CPU clock. >   >   > -=================== >  THEORY OF OPERATION >  =================== >   > @@ -57,11 +58,12 @@ Idle Injection >  On modern Intel processors (Nehalem or later), package level C-state >  residency is available in MSRs, thus also available to the kernel. >   > -These MSRs are: > -      #define MSR_PKG_C2_RESIDENCY 0x60D > -      #define MSR_PKG_C3_RESIDENCY 0x3F8 > -      #define MSR_PKG_C6_RESIDENCY 0x3F9 > -      #define MSR_PKG_C7_RESIDENCY 0x3FA > +These MSRs are:: > + > +      #define MSR_PKG_C2_RESIDENCY      0x60D > +      #define MSR_PKG_C3_RESIDENCY      0x3F8 > +      #define MSR_PKG_C6_RESIDENCY      0x3F9 > +      #define MSR_PKG_C7_RESIDENCY      0x3FA >   >  If the kernel can also inject idle time to the system, then a >  closed-loop control system can be established that manages package > @@ -96,19 +98,21 @@ are not masked. Tests show that the extra wakeups > from scheduler tick >  have a dramatic impact on the effectiveness of the powerclamp driver >  on large scale systems (Westmere system with 80 processors). >   > -CPU0 > -   ____________          ____________ > -kidle_inject/0   |   sleep    |  mwait |  sleep     | > - _________|            |________|            |_______ > -        duration > -CPU1 > -   ____________          ____________ > -kidle_inject/1   |   sleep    |  mwait |  sleep     | > - _________|            |________|            |_______ > -       ^ > -       | > -       | > -       roundup(jiffies, interval) > +:: > + > +  CPU0 > +     ____________          ____________ > +  kidle_inject/0   |   sleep    |  mwait |  sleep     | > +   _________|            |________|            |_______ > +  duration > +  CPU1 > +     ____________          ____________ > +  kidle_inject/1   |   sleep    |  mwait |  sleep     | > +   _________|            |________|            |_______ > + ^ > + | > + | > + roundup(jiffies, interval) >   >  Only one CPU is allowed to collect statistics and update global >  control parameters. This CPU is referred to as the controlling CPU > in > @@ -148,7 +152,7 @@ b) determine the amount of compensation needed at > each target ratio >   >  Compensation to each target ratio consists of two parts: >   > -        a) steady state error compensation > + a) steady state error compensation >   This is to offset the error occurring when the system can >   enter idle without extra wakeups (such as external > interrupts). >   > @@ -158,41 +162,42 @@ Compensation to each target ratio consists of > two parts: >   slowing down CPU activities. >   >  A debugfs file is provided for the user to examine compensation > -progress and results, such as on a Westmere system. > -[jacob@nex01 ~]$ cat > -/sys/kernel/debug/intel_powerclamp/powerclamp_calib > -controlling cpu: 0 > -pct confidence steady dynamic (compensation) > -0 0 0 0 > -1 1 0 0 > -2 1 1 0 > -3 3 1 0 > -4 3 1 0 > -5 3 1 0 > -6 3 1 0 > -7 3 1 0 > -8 3 1 0 > -... > -30 3 2 0 > -31 3 2 0 > -32 3 1 0 > -33 3 2 0 > -34 3 1 0 > -35 3 2 0 > -36 3 1 0 > -37 3 2 0 > -38 3 1 0 > -39 3 2 0 > -40 3 3 0 > -41 3 1 0 > -42 3 2 0 > -43 3 1 0 > -44 3 1 0 > -45 3 2 0 > -46 3 3 0 > -47 3 0 0 > -48 3 2 0 > -49 3 3 0 > +progress and results, such as on a Westmere system:: > + > +  [jacob@nex01 ~]$ cat > +  /sys/kernel/debug/intel_powerclamp/powerclamp_calib > +  controlling cpu: 0 > +  pct confidence steady dynamic (compensation) > +  0       0       0       0 > +  1       1       0       0 > +  2       1       1       0 > +  3       3       1       0 > +  4       3       1       0 > +  5       3       1       0 > +  6       3       1       0 > +  7       3       1       0 > +  8       3       1       0 > +  ... > +  30      3       2       0 > +  31      3       2       0 > +  32      3       1       0 > +  33      3       2       0 > +  34      3       1       0 > +  35      3       2       0 > +  36      3       1       0 > +  37      3       2       0 > +  38      3       1       0 > +  39      3       2       0 > +  40      3       3       0 > +  41      3       1       0 > +  42      3       2       0 > +  43      3       1       0 > +  44      3       1       0 > +  45      3       2       0 > +  46      3       3       0 > +  47      3       0       0 > +  48      3       2       0 > +  49      3       3       0 >   >  Calibration occurs during runtime. No offline method is available. >  Steady state compensation is used only when confidence levels of all > @@ -217,9 +222,8 @@ keeps track of clamping kernel threads, even > after they are migrated >  to other CPUs, after a CPU offline event. >   >   > -===================== >  Performance Analysis > -===================== > +==================== >  This section describes the general performance data collected on >  multiple systems, including Westmere (80P) and Ivy Bridge (4P, 8P). >   > @@ -257,16 +261,15 @@ achieve up to 40% better performance per watt. > (measured by a spin >  counter summed over per CPU counting threads spawned for all running >  CPUs). >   > -==================== >  Usage and Interfaces >  ==================== >  The powerclamp driver is registered to the generic thermal layer as > a > -cooling device. Currently, it’s not bound to any thermal zones. > +cooling device. Currently, it’s not bound to any thermal zones:: >   > -jacob@chromoly:/sys/class/thermal/cooling_device14$ grep . * > -cur_state:0 > -max_state:50 > -type:intel_powerclamp > +  jacob@chromoly:/sys/class/thermal/cooling_device14$ grep . * > +  cur_state:0 > +  max_state:50 > +  type:intel_powerclamp >   >  cur_state allows user to set the desired idle percentage. Writing 0 > to >  cur_state will stop idle injection. Writing a value between 1 and > @@ -278,9 +281,9 @@ cur_state returns value -1 instead of 0 which is > to avoid confusing >  100% busy state with the disabled state. >   >  Example usage: > -- To inject 25% idle time > -$ sudo sh -c "echo 25 > > /sys/class/thermal/cooling_device80/cur_state > -" > +- To inject 25% idle time:: > + > + $ sudo sh -c "echo 25 > > /sys/class/thermal/cooling_device80/cur_state >   >  If the system is not busy and has more than 25% idle time already, >  then the powerclamp driver will not start idle injection. Using Top > @@ -292,23 +295,23 @@ idle time is accounted as normal idle in that > common code path is >  taken as the idle task. >   >  In this example, 24.1% idle is shown. This helps the system admin or > -user determine the cause of slowdown, when a powerclamp driver is in > action. > +user determine the cause of slowdown, when a powerclamp driver is in > action:: >   >   > -Tasks: 197 total,   1 running, 196 sleeping,   0 stopped,   0 zombie > -Cpu(s): 71.2%us,  4.7%sy,  0.0%ni, > 24.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st > -Mem:   3943228k total,  1689632k used,  2253596k free,    74960k > buffers > -Swap:  4087804k total,        0k used,  4087804k free,   945336k > cached > +  Tasks: 197 total,   1 running, 196 sleeping,   0 stopped,   0 > zombie > +  Cpu(s): 71.2%us,  4.7%sy,  0.0%ni, > 24.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st > +  Mem:   3943228k total,  1689632k used,  2253596k free,    74960k > buffers > +  Swap:  4087804k total,        0k used,  4087804k free,   945336k > cached >   > -  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND > - 3352 jacob     20   0  262m  644  428 S  286  0.0   0:17.16 spin > - 3341 root     -51   0     0    0    0 D   25  0.0   0:01.62 > kidle_inject/0 > - 3344 root     -51   0     0    0    0 D   25  0.0   0:01.60 > kidle_inject/3 > - 3342 root     -51   0     0    0    0 D   25  0.0   0:01.61 > kidle_inject/1 > - 3343 root     -51   0     0    0    0 D   25  0.0   0:01.60 > kidle_inject/2 > - 2935 jacob     20   0  696m 125m  35m S    5  3.3   0:31.11 firefox > - 1546 root      20   0  158m  20m 6640 S    3  0.5   0:26.97 Xorg > - 2100 jacob     20   0 1223m  88m  30m S    3  2.3   0:23.68 compiz > +    PID USER      PR  NI  VIRT  RES  SHR S %CPU > %MEM    TIME+  COMMAND > +   3352 jacob     20   0  262m  644  428 S  286  0.0   0:17.16 spin > +   3341 root     -51   0     0    0    0 D   25  0.0   0:01.62 > kidle_inject/0 > +   3344 root     -51   0     0    0    0 D   25  0.0   0:01.60 > kidle_inject/3 > +   3342 root     -51   0     0    0    0 D   25  0.0   0:01.61 > kidle_inject/1 > +   3343 root     -51   0     0    0    0 D   25  0.0   0:01.60 > kidle_inject/2 > +   2935 jacob     20   0  696m 125m  35m S    5  3.3   0:31.11 > firefox > +   1546 root      20   0  158m  20m 6640 S    3  0.5   0:26.97 Xorg > +   2100 jacob     20   0 1223m  88m  30m S    3  2.3   0:23.68 > compiz >   >  Tests have shown that by using the powerclamp driver as a cooling >  device, a PID based userspace thermal controller can manage to > diff --git a/Documentation/thermal/nouveau_thermal > b/Documentation/thermal/nouveau_thermal.rst > similarity index 64% > rename from Documentation/thermal/nouveau_thermal > rename to Documentation/thermal/nouveau_thermal.rst > index 6e17a11efcb0..37255fd6735d 100644 > --- a/Documentation/thermal/nouveau_thermal > +++ b/Documentation/thermal/nouveau_thermal.rst > @@ -1,13 +1,15 @@ > +===================== >  Kernel driver nouveau > -=================== > +===================== >   >  Supported chips: > + >  * NV43+ >   >  Authors: Martin Peres (mupuf) >   >  Description > ---------- > +----------- >   >  This driver allows to read the GPU core temperature, drive the GPU > fan and >  set temperature alarms. > @@ -19,20 +21,25 @@ interface is likely not to work. This document > may then not cover your situation >  entirely. >   >  Temperature management > --------------------- > +---------------------- >   >  Temperature is exposed under as a read-only HWMON attribute > temp1_input. >   >  In order to protect the GPU from overheating, Nouveau supports 4 > configurable >  temperature thresholds: >   > - * Fan_boost: Fan speed is set to 100% when reaching this > temperature; > - * Downclock: The GPU will be downclocked to reduce its power > dissipation; > - * Critical: The GPU is put on hold to further lower power > dissipation; > - * Shutdown: Shut the computer down to protect your GPU. > + * Fan_boost: > + Fan speed is set to 100% when reaching this temperature; > + * Downclock: > + The GPU will be downclocked to reduce its power dissipation; > + * Critical: > + The GPU is put on hold to further lower power dissipation; > + * Shutdown: > + Shut the computer down to protect your GPU. >   > -WARNING: Some of these thresholds may not be used by Nouveau > depending > -on your chipset. > +WARNING: > + Some of these thresholds may not be used by Nouveau > depending > + on your chipset. >   >  The default value for these thresholds comes from the GPU's vbios. > These >  thresholds can be configured thanks to the following HWMON > attributes: > @@ -46,19 +53,24 @@ NOTE: Remember that the values are stored as > milli degrees Celsius. Don't forget >  to multiply! >   >  Fan management > ------------- > +-------------- >   >  Not all cards have a drivable fan. If you do, then the following > HWMON >  attributes should be available: >   > - * pwm1_enable: Current fan management mode (NONE, MANUAL or AUTO); > - * pwm1: Current PWM value (power percentage); > - * pwm1_min: The minimum PWM speed allowed; > - * pwm1_max: The maximum PWM speed allowed (bypassed when hitting > Fan_boost); > + * pwm1_enable: > + Current fan management mode (NONE, MANUAL or AUTO); > + * pwm1: > + Current PWM value (power percentage); > + * pwm1_min: > + The minimum PWM speed allowed; > + * pwm1_max: > + The maximum PWM speed allowed (bypassed when hitting > Fan_boost); >   >  You may also have the following attribute: >   > - * fan1_input: Speed in RPM of your fan. > + * fan1_input: > + Speed in RPM of your fan. >   >  Your fan can be driven in different modes: >   > @@ -66,14 +78,16 @@ Your fan can be driven in different modes: >   * 1: The fan can be driven in manual (use pwm1 to change the > speed); >   * 2; The fan is driven automatically depending on the temperature. >   > -NOTE: Be sure to use the manual mode if you want to drive the fan > speed manually > +NOTE: > +  Be sure to use the manual mode if you want to drive the fan speed > manually >   > -NOTE2: When operating in manual mode outside the vbios-defined > -[PWM_min, PWM_max] range, the reported fan speed (RPM) may not be > accurate > -depending on your hardware. > +NOTE2: > +  When operating in manual mode outside the vbios-defined > +  [PWM_min, PWM_max] range, the reported fan speed (RPM) may not be > accurate > +  depending on your hardware. >   >  Bug reports > ---------- > +----------- >   >  Thermal management on Nouveau is new and may not work on all cards. > If you have >  inquiries, please ping mupuf on IRC (#nouveau, freenode). > diff --git a/Documentation/thermal/power_allocator.txt > b/Documentation/thermal/power_allocator.rst > similarity index 74% > rename from Documentation/thermal/power_allocator.txt > rename to Documentation/thermal/power_allocator.rst > index 9fb0ff06dca9..67b6a3297238 100644 > --- a/Documentation/thermal/power_allocator.txt > +++ b/Documentation/thermal/power_allocator.rst > @@ -1,3 +1,4 @@ > +================================= >  Power allocator governor tunables >  ================================= >   > @@ -25,36 +26,36 @@ temperature as the control input and power as the > controlled output: >      P_max = k_p * e + k_i * err_integral + k_d * diff_err + > sustainable_power >   >  where > -    e = desired_temperature - current_temperature > -    err_integral is the sum of previous errors > -    diff_err = e - previous_error > +   -  e = desired_temperature - current_temperature > +   -  err_integral is the sum of previous errors > +   -  diff_err = e - previous_error >   > -It is similar to the one depicted below: > +It is similar to the one depicted below:: >   > -                                      k_d > -                                       | > -current_temp                           | > -     |                                 v > -     |                +----------+   +---+ > -     |         +----->| diff_err |-->| X |------+ > -     |         |      +----------+   +---+      | > -     |         |                                |      tdp        ac > tor > -     |         |                      k_i       |       |  get_reque > sted_power() > -     |         |                       |        |       |        |   >    | > -     |         |                       |        |       |        |   >    | ... > -     v         |                       v        v       v        v   >    v > -   +---+       |      +-------+      +---+    +---+   +---+   +----- > -----+ > -   | S |-------+----->| sum e |----->| X |--->| S |-->| S | > -->|power     | > -   +---+       |      +-------+      +---+    +---+   +--- > +   |allocation| > -     ^         |                                ^             +----- > -----+ > -     |         |                                |                |   >    | > -     |         |        +--- > +                   |                |     | > -     |         +------->| X |------------------- > +                v     v > -     |                  +---+                               granted > performance > -desired_temperature       ^ > -                          | > -                          | > -                      k_po/k_pu > +       k_d > +        | > +  current_temp                         | > +       |                               v > +       |              +----------+   +---+ > +       |       +----->| diff_err |-->| X |------+ > +       |       |      +----------+   +---+      | > +       |       |                                |      tdp        ac > tor > +       |       |                      k_i       |       |  get_reque > sted_power() > +       |       |                       |        |       |        |   >    | > +       |       |                       |        |       |        |   >    | ... > +       v       |                       v        v       v        v   >    v > +     +---+     |      +-------+      +---+    +---+   +---+   +----- > -----+ > +     | S |-----+----->| sum e |----->| X |--->| S |-->| S | > -->|power     | > +     +---+     |      +-------+      +---+    +---+   +--- > +   |allocation| > +       ^       |                                ^             +----- > -----+ > +       |       |                                |                |   >    | > +       |       |        +--- > +                   |                |     | > +       |       +------->| X |------------------- > +                v     v > +       |                +---+                               granted > performance > +  desired_temperature     ^ > +   | > +   | > +       k_po/k_pu >   >  Sustainable power >  ----------------- > @@ -73,7 +74,7 @@ is typically 2000mW, while on a 10" tablet is > around 4500mW (may vary >  depending on screen size). >   >  If you are using device tree, do add it as a property of the > -thermal-zone.  For example: > +thermal-zone.  For example:: >   >   thermal-zones { >   soc_thermal { > @@ -85,7 +86,7 @@ thermal-zone.  For example: >  Instead, if the thermal zone is registered from the platform code, > pass a >  `thermal_zone_params` that has a `sustainable_power`.  If no >  `thermal_zone_params` were being passed, then something like below > -will suffice: > +will suffice:: >   >   static const struct thermal_zone_params tz_params = { >   .sustainable_power = 3500, > @@ -112,18 +113,18 @@ available capacity at a low temperature.  On > the other hand, a high >  value of `k_pu` will result in the governor granting very high power >  while temperature is low, and may lead to temperature overshooting. >   > -The default value for `k_pu` is: > +The default value for `k_pu` is:: >   >      2 * sustainable_power / (desired_temperature - switch_on_temp) >   >  This means that at `switch_on_temp` the output of the controller's >  proportional term will be 2 * `sustainable_power`.  The default > value > -for `k_po` is: > +for `k_po` is:: >   >      sustainable_power / (desired_temperature - switch_on_temp) >   >  Focusing on the proportional and feed forward values of the PID > -controller equation we have: > +controller equation we have:: >   >      P_max = k_p * e + sustainable_power >   > @@ -134,21 +135,23 @@ is the desired one, then the proportional > component is zero and >  thermal equilibrium under constant load.  `sustainable_power` is > only >  an estimate, which is the reason for closed-loop control such as > this. >   > -Expanding `k_pu` we get: > +Expanding `k_pu` we get:: > + >      P_max = 2 * sustainable_power * (T_set - T) / (T_set - T_on) + > -        sustainable_power > + sustainable_power >   > -where > -    T_set is the desired temperature > -    T is the current temperature > -    T_on is the switch on temperature > +where: > + > +    - T_set is the desired temperature > +    - T is the current temperature > +    - T_on is the switch on temperature >   >  When the current temperature is the switch_on temperature, the above > -formula becomes: > +formula becomes:: >   >      P_max = 2 * sustainable_power * (T_set - T_on) / (T_set - T_on) > + > -        sustainable_power = 2 * sustainable_power + > sustainable_power = > -        3 * sustainable_power > + sustainable_power = 2 * sustainable_power + > sustainable_power = > + 3 * sustainable_power >   >  Therefore, the proportional term alone linearly decreases power from >  3 * `sustainable_power` to `sustainable_power` as the temperature > @@ -178,11 +181,18 @@ Cooling device power API >  Cooling devices controlled by this governor must supply the > additional >  "power" API in their `cooling_device_ops`.  It consists on three > ops: >   > -1. int get_requested_power(struct thermal_cooling_device *cdev, > - struct thermal_zone_device *tz, u32 *power); > -@cdev: The `struct thermal_cooling_device` pointer > -@tz: thermal zone in which we are currently operating > -@power: pointer in which to store the calculated power > +1. :: > + > +    int get_requested_power(struct thermal_cooling_device *cdev, > +     struct thermal_zone_device *tz, u32 > *power); > + > + > +@cdev: > + The `struct thermal_cooling_device` pointer > +@tz: > + thermal zone in which we are currently operating > +@power: > + pointer in which to store the calculated power >   >  `get_requested_power()` calculates the power requested by the device >  in milliwatts and stores it in @power .  It should return 0 on > @@ -190,23 +200,37 @@ success, -E* on failure.  This is currently > used by the power >  allocator governor to calculate how much power to give to each > cooling >  device. >   > -2. int state2power(struct thermal_cooling_device *cdev, struct > -        thermal_zone_device *tz, unsigned long state, u32 *power); > -@cdev: The `struct thermal_cooling_device` pointer > -@tz: thermal zone in which we are currently operating > -@state: A cooling device state > -@power: pointer in which to store the equivalent power > +2. :: > + > + int state2power(struct thermal_cooling_device *cdev, struct > + thermal_zone_device *tz, unsigned long > state, > + u32 *power); > + > +@cdev: > + The `struct thermal_cooling_device` pointer > +@tz: > + thermal zone in which we are currently operating > +@state: > + A cooling device state > +@power: > + pointer in which to store the equivalent power >   >  Convert cooling device state @state into power consumption in >  milliwatts and store it in @power.  It should return 0 on success, > -E* >  on failure.  This is currently used by thermal core to calculate the >  maximum power that an actor can consume. >   > -3. int power2state(struct thermal_cooling_device *cdev, u32 power, > - unsigned long *state); > -@cdev: The `struct thermal_cooling_device` pointer > -@power: power in milliwatts > -@state: pointer in which to store the resulting state > +3. :: > + > + int power2state(struct thermal_cooling_device *cdev, u32 > power, > + unsigned long *state); > + > +@cdev: > + The `struct thermal_cooling_device` pointer > +@power: > + power in milliwatts > +@state: > + pointer in which to store the resulting state >   >  Calculate a cooling device state that would make the device consume > at >  most @power mW and store it in @state.  It should return 0 on > success, > diff --git a/Documentation/thermal/sysfs-api.txt > b/Documentation/thermal/sysfs-api.rst > similarity index 66% > rename from Documentation/thermal/sysfs-api.txt > rename to Documentation/thermal/sysfs-api.rst > index c3fa500df92c..e4930761d3e5 100644 > --- a/Documentation/thermal/sysfs-api.txt > +++ b/Documentation/thermal/sysfs-api.rst > @@ -1,3 +1,4 @@ > +=================================== >  Generic Thermal Sysfs driver How To >  =================================== >   > @@ -9,6 +10,7 @@ Copyright (c)  2008 Intel Corporation >   >   >  0. Introduction > +=============== >   >  The generic thermal sysfs provides a set of interfaces for thermal > zone >  devices (sensors) and thermal cooling devices (fan, processor...) to > register > @@ -25,59 +27,90 @@ An intelligent thermal management application can > make decisions based on >  inputs from thermal zone attributes (the current temperature and > trip point >  temperature) and throttle appropriate devices. >   > -[0-*] denotes any positive number starting from 0 > -[1-*] denotes any positive number starting from 1 > +- `[0-*]` denotes any positive number starting from 0 > +- `[1-*]` denotes any positive number starting from 1 >   >  1. thermal sysfs driver interface functions > +=========================================== >   >  1.1 thermal zone device interface > -1.1.1 struct thermal_zone_device *thermal_zone_device_register(char > *type, > - int trips, int mask, void *devdata, > - struct thermal_zone_device_ops *ops, > - const struct thermal_zone_params *tzp, > - int passive_delay, int polling_delay)) > +--------------------------------- > + > +    :: > + > + struct thermal_zone_device > + *thermal_zone_device_register(char *type, > +       int trips, int mask, void > *devdata, > +       struct thermal_zone_device_ops > *ops, > +       const struct > thermal_zone_params *tzp, > +       int passive_delay, int > polling_delay)) >   >      This interface function adds a new thermal zone device (sensor) > to > -    /sys/class/thermal folder as thermal_zone[0-*]. It tries to bind > all the > +    /sys/class/thermal folder as `thermal_zone[0-*]`. It tries to > bind all the >      thermal cooling devices registered at the same time. >   > -    type: the thermal zone type. > -    trips: the total number of trip points this thermal zone > supports. > -    mask: Bit string: If 'n'th bit is set, then trip point 'n' is > writeable. > -    devdata: device private data > -    ops: thermal zone device call-backs. > - .bind: bind the thermal zone device with a thermal cooling > device. > - .unbind: unbind the thermal zone device with a thermal > cooling device. > - .get_temp: get the current temperature of the thermal zone. > - .set_trips: set the trip points window. Whenever the current > temperature > +    type: > + the thermal zone type. > +    trips: > + the total number of trip points this thermal zone supports. > +    mask: > + Bit string: If 'n'th bit is set, then trip point 'n' is > writeable. > +    devdata: > + device private data > +    ops: > + thermal zone device call-backs. > + > + .bind: > + bind the thermal zone device with a thermal cooling > device. > + .unbind: > + unbind the thermal zone device with a thermal > cooling device. > + .get_temp: > + get the current temperature of the thermal zone. > + .set_trips: > +     set the trip points window. Whenever the current > temperature >       is updated, the trip points immediately below > and above the >       current temperature are found. > - .get_mode: get the current mode (enabled/disabled) of the > thermal zone. > -     - "enabled" means the kernel thermal management is > enabled. > -     - "disabled" will prevent kernel thermal driver action > upon trip points > -       so that user applications can take charge of thermal > management. > - .set_mode: set the mode (enabled/disabled) of the thermal > zone. > - .get_trip_type: get the type of certain trip point. > - .get_trip_temp: get the temperature above which the certain > trip point > + .get_mode: > +    get the current mode (enabled/disabled) of the > thermal zone. > + > + - "enabled" means the kernel thermal > management is > +   enabled. > + - "disabled" will prevent kernel thermal > driver action > +   upon trip points so that user applications > can take > +   charge of thermal management. > + .set_mode: > + set the mode (enabled/disabled) of the thermal zone. > + .get_trip_type: > + get the type of certain trip point. > + .get_trip_temp: > + get the temperature above which the certain > trip point >   will be fired. > - .set_emul_temp: set the emulation temperature which helps in > debugging > + .set_emul_temp: > + set the emulation temperature which helps in > debugging >   different threshold temperature points. > -    tzp: thermal zone platform parameters. > -    passive_delay: number of milliseconds to wait between polls when > +    tzp: > + thermal zone platform parameters. > +    passive_delay: > + number of milliseconds to wait between polls when >   performing passive cooling. > -    polling_delay: number of milliseconds to wait between polls when > checking > +    polling_delay: > + number of milliseconds to wait between polls when checking >   whether trip points have been crossed (0 for interrupt > driven systems). >   > +    :: >   > -1.1.2 void thermal_zone_device_unregister(struct thermal_zone_device > *tz) > + void thermal_zone_device_unregister(struct > thermal_zone_device *tz) >   >      This interface function removes the thermal zone device. >      It deletes the corresponding entry from /sys/class/thermal > folder and >      unbinds all the thermal cooling devices it uses. >   > -1.1.3 struct thermal_zone_device *thermal_zone_of_sensor_register( > - struct device *dev, int sensor_id, void *data, > - const struct thermal_zone_of_device_ops *ops) > + :: > + > +    struct thermal_zone_device > +    *thermal_zone_of_sensor_register(struct device *dev, int > sensor_id, > + void *data, > + const struct > thermal_zone_of_device_ops *ops) >   >   This interface adds a new sensor to a DT thermal zone. >   This function will search the list of thermal zones > described in > @@ -87,25 +120,33 @@ temperature) and throttle appropriate devices. >   thermal zone device. >   >   The parameters for this interface are: > - dev: Device node of sensor containing valid > node pointer in > + > + dev: > + Device node of sensor containing valid node > pointer in >   dev->of_node. > - sensor_id: a sensor identifier, in case the sensor IP > has more > + sensor_id: > + a sensor identifier, in case the sensor IP > has more >   than one sensors > - data: a private pointer (owned by the caller) > that will be > + data: > + a private pointer (owned by the caller) that > will be >   passed back, when a temperature reading is > needed. > - ops: struct thermal_zone_of_device_ops *. > + ops: > + `struct thermal_zone_of_device_ops *`. >   > - get_temp: a pointer to a function > that reads the > + ==============  ============================ > =========== > + get_temp a pointer to a function that > reads the >   sensor temperature. This is > mandatory >   callback provided by sensor > driver. > - set_trips:      a pointer to a function that > sets a > + set_trips a pointer to a function > that sets a >   temperature window. When > this window is >   left the driver must inform > the thermal >   core via > thermal_zone_device_update. > - get_trend:  a pointer to a function > that reads the > + get_trend  a pointer to a function > that reads the >   sensor temperature trend. > - set_emul_temp: a pointer to a > function that sets > + set_emul_temp a pointer to a function > that sets >   sensor emulated temperature. > + ==============  ============================ > =========== > + >   The thermal zone temperature is provided by the get_temp() > function >   pointer of thermal_zone_of_device_ops. When called, it will >   have the private pointer @data back. > @@ -114,8 +155,10 @@ temperature) and throttle appropriate devices. >   handle. Caller should check the return handle with IS_ERR() > for finding >   whether success or not. >   > -1.1.4 void thermal_zone_of_sensor_unregister(struct device *dev, > - struct thermal_zone_device *tzd) > + :: > + > +     void thermal_zone_of_sensor_unregister(struct device > *dev, > +    struct > thermal_zone_device *tzd) >   >   This interface unregisters a sensor from a DT thermal zone > which was >   successfully added by interface > thermal_zone_of_sensor_register(). > @@ -124,21 +167,29 @@ temperature) and throttle appropriate devices. >   interface. It will also silent the zone by remove the > .get_temp() and >   get_trend() thermal zone device callbacks. >   > -1.1.5 struct thermal_zone_device > *devm_thermal_zone_of_sensor_register( > - struct device *dev, int sensor_id, > - void *data, const struct thermal_zone_of_device_ops > *ops) > + :: > + > +   struct thermal_zone_device > +   *devm_thermal_zone_of_sensor_register(struct device *dev, > + int sensor_id, > + void *data, > + const struct > thermal_zone_of_device_ops *ops) >   >   This interface is resource managed version of >   thermal_zone_of_sensor_register(). > + >   All details of thermal_zone_of_sensor_register() described > in >   section 1.1.3 is applicable here. > + >   The benefit of using this interface to register sensor is > that it >   is not require to explicitly call > thermal_zone_of_sensor_unregister() >   in error path or during driver unbinding as this is done by > driver >   resource manager. >   > -1.1.6 void devm_thermal_zone_of_sensor_unregister(struct device > *dev, > - struct thermal_zone_device *tzd) > + :: > + > + void devm_thermal_zone_of_sensor_unregister(struct > device *dev, > + struct > thermal_zone_device *tzd) >   >   This interface is resource managed version of >   thermal_zone_of_sensor_unregister(). > @@ -147,123 +198,186 @@ temperature) and throttle appropriate > devices. >   Normally this function will not need to be called and the > resource >   management code will ensure that the resource is freed. >   > -1.1.7 int thermal_zone_get_slope(struct thermal_zone_device *tz) > + :: > + > + int thermal_zone_get_slope(struct > thermal_zone_device *tz) >   >   This interface is used to read the slope attribute value >   for the thermal zone device, which might be useful for > platform >   drivers for temperature calculations. >   > -1.1.8 int thermal_zone_get_offset(struct thermal_zone_device *tz) > + :: > + > + int thermal_zone_get_offset(struct > thermal_zone_device *tz) >   >   This interface is used to read the offset attribute value >   for the thermal zone device, which might be useful for > platform >   drivers for temperature calculations. >   >  1.2 thermal cooling device interface > -1.2.1 struct thermal_cooling_device > *thermal_cooling_device_register(char *name, > - void *devdata, struct thermal_cooling_device_ops *) > +------------------------------------ > + > + > +    :: > + > + struct thermal_cooling_device > + *thermal_cooling_device_register(char *name, > + void *devdata, struct > thermal_cooling_device_ops *) >   >      This interface function adds a new thermal cooling device > (fan/processor/...) > -    to /sys/class/thermal/ folder as cooling_device[0-*]. It tries > to bind itself > +    to /sys/class/thermal/ folder as `cooling_device[0-*]`. It tries > to bind itself >      to all the thermal zone devices registered at the same time. > -    name: the cooling device name. > -    devdata: device private data. > -    ops: thermal cooling devices call-backs. > - .get_max_state: get the Maximum throttle state of the > cooling device. > - .get_cur_state: get the Currently requested throttle state > of the cooling device. > - .set_cur_state: set the Current throttle state of the > cooling device. > - > -1.2.2 void thermal_cooling_device_unregister(struct > thermal_cooling_device *cdev) > + > +    name: > + the cooling device name. > +    devdata: > + device private data. > +    ops: > + thermal cooling devices call-backs. > + > + .get_max_state: > + get the Maximum throttle state of the cooling > device. > + .get_cur_state: > + get the Currently requested throttle state of the > + cooling device. > + .set_cur_state: > + set the Current throttle state of the cooling > device. > + > +    :: > + > + void thermal_cooling_device_unregister(struct > thermal_cooling_device *cdev) >   >      This interface function removes the thermal cooling device. >      It deletes the corresponding entry from /sys/class/thermal > folder and >      unbinds itself from all the thermal zone devices using it. >   >  1.3 interface for binding a thermal zone device with a thermal > cooling device > -1.3.1 int thermal_zone_bind_cooling_device(struct > thermal_zone_device *tz, > - int trip, struct thermal_cooling_device *cdev, > - unsigned long upper, unsigned long lower, unsigned int > weight); > +------------------------------------------------------------------ > ----------- > + > +    :: > + > + int thermal_zone_bind_cooling_device(struct > thermal_zone_device *tz, > + int trip, struct thermal_cooling_device *cdev, > + unsigned long upper, unsigned long lower, unsigned > int weight); >   >      This interface function binds a thermal cooling device to a > particular trip >      point of a thermal zone device. > + >      This function is usually called in the thermal zone device .bind > callback. > -    tz: the thermal zone device > -    cdev: thermal cooling device > -    trip: indicates which trip point in this thermal zone the > cooling device > -          is associated with. > -    upper:the Maximum cooling state for this trip point. > -          THERMAL_NO_LIMIT means no upper limit, > + > +    tz: > +   the thermal zone device > +    cdev: > +   thermal cooling device > +    trip: > +   indicates which trip point in this thermal zone the > cooling device > +   is associated with. > +    upper: > +   the Maximum cooling state for this trip point. > +   THERMAL_NO_LIMIT means no upper limit, >     and the cooling device can be in max_state. > -    lower:the Minimum cooling state can be used for this trip point. > -          THERMAL_NO_LIMIT means no lower limit, > +    lower: > +   the Minimum cooling state can be used for this trip point. > +   THERMAL_NO_LIMIT means no lower limit, >     and the cooling device can be in cooling state 0. > -    weight: the influence of this cooling device in this thermal > -            zone.  See 1.4.1 below for more information. > +    weight: > +   the influence of this cooling device in this thermal > +   zone.  See 1.4.1 below for more information. >   > -1.3.2 int thermal_zone_unbind_cooling_device(struct > thermal_zone_device *tz, > - int trip, struct thermal_cooling_device *cdev); > +    :: > + > + int thermal_zone_unbind_cooling_device(struct > thermal_zone_device *tz, > + int trip, struct > thermal_cooling_device *cdev); >   >      This interface function unbinds a thermal cooling device from a > particular >      trip point of a thermal zone device. This function is usually > called in >      the thermal zone device .unbind callback. > -    tz: the thermal zone device > -    cdev: thermal cooling device > -    trip: indicates which trip point in this thermal zone the > cooling device > -          is associated with. > + > +    tz: > + the thermal zone device > +    cdev: > + thermal cooling device > +    trip: > + indicates which trip point in this thermal zone the cooling > device > + is associated with. >   >  1.4 Thermal Zone Parameters > -1.4.1 struct thermal_bind_params > +--------------------------- > + > +    :: > + > + struct thermal_bind_params > + >      This structure defines the following parameters that are used to > bind >      a zone with a cooling device for a particular trip point. > -    .cdev: The cooling device pointer > -    .weight: The 'influence' of a particular cooling device on this > -             zone. This is relative to the rest of the cooling > -             devices. For example, if all cooling devices have a > -             weight of 1, then they all contribute the same. You can > -             use percentages if you want, but it's not mandatory. A > -             weight of 0 means that this cooling device doesn't > -             contribute to the cooling of this zone unless all > cooling > -             devices have a weight of 0. If all weights are 0, then > -             they all contribute the same. > -    .trip_mask:This is a bit mask that gives the binding relation > between > -               this thermal zone and cdev, for a particular trip > point. > -               If nth bit is set, then the cdev and thermal zone are > bound > -               for trip point n. > -    .binding_limits: This is an array of cooling state limits. Must > have > -                     exactly 2 * thermal_zone.number_of_trip_points. > It is an > -                     array consisting of tuples state> of > -                     state limits. Each trip will be associated with > one state > -                     limit tuple when binding. A NULL pointer means > -                      on all > trips. > -                     These limits are used when binding a cdev to a > trip point. > -    .match: This call back returns success(0) if the 'tz and cdev' > need to > + > +    .cdev: > +      The cooling device pointer > +    .weight: > +      The 'influence' of a particular cooling device on this > +      zone. This is relative to the rest of the cooling > +      devices. For example, if all cooling devices have a > +      weight of 1, then they all contribute the same. You can > +      use percentages if you want, but it's not mandatory. A > +      weight of 0 means that this cooling device doesn't > +      contribute to the cooling of this zone unless all > cooling > +      devices have a weight of 0. If all weights are 0, then > +      they all contribute the same. > +    .trip_mask: > +        This is a bit mask that gives the binding relation > between > +        this thermal zone and cdev, for a particular trip > point. > +        If nth bit is set, then the cdev and thermal zone are > bound > +        for trip point n. > +    .binding_limits: > +      This is an array of cooling state limits. Must > have > +      exactly 2 * thermal_zone.number_of_trip_points. > It is an > +      array consisting of tuples state> of > +      state limits. Each trip will be associated with > one state > +      limit tuple when binding. A NULL pointer means > +       on all > trips. > +      These limits are used when binding a cdev to a > trip point. > +    .match: > +     This call back returns success(0) if the 'tz and cdev' > need to >       be bound, as per platform data. > -1.4.2 struct thermal_zone_params > + > +    :: > + > + struct thermal_zone_params > + >      This structure defines the platform level parameters for a > thermal zone. >      This data, for each thermal zone should come from the platform > layer. >      This is an optional feature where some platforms can choose not > to >      provide this data. > -    .governor_name: Name of the thermal governor used for this zone > -    .no_hwmon: a boolean to indicate if the thermal to hwmon sysfs > interface > -               is required. when no_hwmon == false, a hwmon sysfs > interface > -               will be created. when no_hwmon == true, nothing will > be done. > -               In case the thermal_zone_params is NULL, the hwmon > interface > -               will be created (for backward compatibility). > -    .num_tbps: Number of thermal_bind_params entries for this zone > -    .tbp: thermal_bind_params entries > + > +    .governor_name: > +        Name of the thermal governor used for this zone > +    .no_hwmon: > +        a boolean to indicate if the thermal to hwmon sysfs > interface > +        is required. when no_hwmon == false, a hwmon sysfs > interface > +        will be created. when no_hwmon == true, nothing will > be done. > +        In case the thermal_zone_params is NULL, the hwmon > interface > +        will be created (for backward compatibility). > +    .num_tbps: > +        Number of thermal_bind_params entries for this zone > +    .tbp: > +        thermal_bind_params entries >   >  2. sysfs attributes structure > +============================= >   > +== ================ >  RO read only value >  WO write only value >  RW read/write value > +== ================ >   >  Thermal sysfs attributes will be represented under > /sys/class/thermal. >  Hwmon sysfs I/F extension is also available under /sys/class/hwmon >  if hwmon is compiled in or built as a module. >   > -Thermal zone device sys I/F, created once it's registered: > -/sys/class/thermal/thermal_zone[0-*]: > +Thermal zone device sys I/F, created once it's registered:: > + > +  /sys/class/thermal/thermal_zone[0-*]: >      |---type: Type of the thermal zone >      |---temp: Current temperature >      |---mode: Working mode of the thermal > zone > @@ -282,8 +396,9 @@ Thermal zone device sys I/F, created once it's > registered: >      |---slope:                  Slope constant applied as linear > extrapolation >      |---offset:                 Offset constant applied as linear > extrapolation >   > -Thermal cooling device sys I/F, created once it's registered: > -/sys/class/thermal/cooling_device[0-*]: > +Thermal cooling device sys I/F, created once it's registered:: > + > +  /sys/class/thermal/cooling_device[0-*]: >      |---type: Type of the cooling > device(processor/fan/...) >      |---max_state: Maximum cooling state of the > cooling device >      |---cur_state: Current cooling state of the > cooling device > @@ -299,11 +414,13 @@ the relationship between a thermal zone and its > associated cooling device. >  They are created/removed for each successful execution of >  thermal_zone_bind_cooling_device/thermal_zone_unbind_cooling_device. >   > -/sys/class/thermal/thermal_zone[0-*]: > +:: > + > +  /sys/class/thermal/thermal_zone[0-*]: >      |---cdev[0-*]: [0-*]th cooling device in current > thermal zone >      |---cdev[0-*]_trip_point: Trip point that cdev[0-*] is > associated with >      |---cdev[0-*]_weight:       Influence of the cooling device in > -                                this thermal zone > + this thermal zone >   >  Besides the thermal zone device sysfs I/F and cooling device sysfs > I/F, >  the generic thermal driver also creates a hwmon sysfs I/F for each > _type_ > @@ -311,16 +428,17 @@ of thermal zone device. E.g. the generic > thermal driver registers one hwmon >  class device and build the associated hwmon sysfs I/F for all the > registered >  ACPI thermal zones. >   > -/sys/class/hwmon/hwmon[0-*]: > +:: > + > +  /sys/class/hwmon/hwmon[0-*]: >      |---name: The type of the thermal zone > devices >      |---temp[1-*]_input: The current temperature of thermal > zone [1-*] >      |---temp[1-*]_critical: The critical trip point of > thermal zone [1-*] >   >  Please read Documentation/hwmon/sysfs-interface.rst for additional > information. >   > -*************************** > -* Thermal zone attributes * > -*************************** > +Thermal zone attributes > +----------------------- >   >  type >   Strings which represent the thermal zone type. > @@ -340,54 +458,67 @@ mode >   This file gives information about the algorithm that is > currently >   managing the thermal zone. It can be either default kernel > based >   algorithm or user space application. > - enabled = enable Kernel Thermal management. > - disabled = Preventing kernel thermal zone driver > actions upon > + > + enabled > +   enable Kernel Thermal management. > + disabled > +   Preventing kernel thermal zone driver > actions upon >     trip points so that user application can > take full >     charge of the thermal management. > + >   RW, Optional >   >  policy >   One of the various thermal governors used for a particular > zone. > + >   RW, Required >   >  available_policies >   Available thermal governors which can be used for a > particular zone. > + >   RO, Required >   > -trip_point_[0-*]_temp > +`trip_point_[0-*]_temp` >   The temperature above which trip point will be fired. > + >   Unit: millidegree Celsius > + >   RO, Optional >   > -trip_point_[0-*]_type > +`trip_point_[0-*]_type` >   Strings which indicate the type of the trip point. > - E.g. it can be one of critical, hot, passive, active[0-*] > for ACPI > + > + E.g. it can be one of critical, hot, passive, `active[0-*]` > for ACPI >   thermal zone. > + >   RO, Optional >   > -trip_point_[0-*]_hyst > +`trip_point_[0-*]_hyst` >   The hysteresis value for a trip point, represented as an > integer >   Unit: Celsius >   RW, Optional >   > -cdev[0-*] > +`cdev[0-*]` >   Sysfs link to the thermal cooling device node where the sys > I/F >   for cooling device throttling control represents. > + >   RO, Optional >   > -cdev[0-*]_trip_point > - The trip point in this thermal zone which cdev[0-*] is > associated > +`cdev[0-*]_trip_point` > + The trip point in this thermal zone which `cdev[0-*]` is > associated >   with; -1 means the cooling device is not associated with any > trip >   point. > + >   RO, Optional >   > -cdev[0-*]_weight > -        The influence of cdev[0-*] in this thermal zone. This value > -        is relative to the rest of cooling devices in the thermal > -        zone. For example, if a cooling device has a weight double > -        than that of other, it's twice as effective in cooling the > -        thermal zone. > -        RW, Optional > +`cdev[0-*]_weight` > + The influence of `cdev[0-*]` in this thermal zone. This > value > + is relative to the rest of cooling devices in the thermal > + zone. For example, if a cooling device has a weight double > + than that of other, it's twice as effective in cooling the > + thermal zone. > + > + RW, Optional >   >  passive >   Attribute is only present for zones in which the passive > cooling > @@ -395,8 +526,11 @@ passive >   and can be set to a temperature (in millidegrees) to enable > a >   passive trip point for the zone. Activation is done by > polling with >   an interval of 1 second. > + >   Unit: millidegrees Celsius > + >   Valid values: 0 (disabled) or greater than 1000 > + >   RW, Optional >   >  emul_temp > @@ -407,17 +541,21 @@ emul_temp >   threshold and its associated cooling action. This is write > only node >   and writing 0 on this node should disable emulation. >   Unit: millidegree Celsius > + >   WO, Optional >   > -   WARNING: Be careful while enabling this option on > production systems, > -   because userland can easily disable the thermal policy by > simply > -   flooding this sysfs node with low temperature values. > +   WARNING: > +     Be careful while enabling this option on production > systems, > +     because userland can easily disable the thermal policy > by simply > +     flooding this sysfs node with low temperature values. >   >  sustainable_power >   An estimate of the sustained power that can be dissipated by >   the thermal zone. Used by the power allocator governor. For > - more information see > Documentation/thermal/power_allocator.txt > + more information see > Documentation/thermal/power_allocator.rst > + >   Unit: milliwatts > + >   RW, Optional >   >  k_po > @@ -425,7 +563,8 @@ k_po >   controller during temperature overshoot. Temperature > overshoot >   is when the current temperature is above the "desired >   temperature" trip point. For more information see > - Documentation/thermal/power_allocator.txt > + Documentation/thermal/power_allocator.rst > + >   RW, Optional >   >  k_pu > @@ -433,20 +572,23 @@ k_pu >   controller during temperature undershoot. Temperature > undershoot >   is when the current temperature is below the "desired >   temperature" trip point. For more information see > - Documentation/thermal/power_allocator.txt > + Documentation/thermal/power_allocator.rst > + >   RW, Optional >   >  k_i >   The integral term of the power allocator governor's PID >   controller. This term allows the PID controller to > compensate >   for long term drift. For more information see > - Documentation/thermal/power_allocator.txt > + Documentation/thermal/power_allocator.rst > + >   RW, Optional >   >  k_d >   The derivative term of the power allocator governor's PID >   controller. For more information see > - Documentation/thermal/power_allocator.txt > + Documentation/thermal/power_allocator.rst > + >   RW, Optional >   >  integral_cutoff > @@ -456,8 +598,10 @@ integral_cutoff >   example, if integral_cutoff is 0, then the integral term > only >   accumulates error when temperature is above the desired >   temperature trip point. For more information see > - Documentation/thermal/power_allocator.txt > + Documentation/thermal/power_allocator.rst > + >   Unit: millidegree Celsius > + >   RW, Optional >   >  slope > @@ -465,6 +609,7 @@ slope >   to determine a hotspot temperature based off the sensor's >   raw readings. It is up to the device driver to determine >   the usage of these values. > + >   RW, Optional >   >  offset > @@ -472,28 +617,33 @@ offset >   to determine a hotspot temperature based off the sensor's >   raw readings. It is up to the device driver to determine >   the usage of these values. > + >   RW, Optional >   > -***************************** > -* Cooling device attributes * > -***************************** > +Cooling device attributes > +------------------------- >   >  type >   String which represents the type of device, e.g: > + >   - for generic ACPI: should be "Fan", "Processor" or "LCD" >   - for memory controller device on intel_menlow platform: >     should be "Memory controller". > + >   RO, Required >   >  max_state >   The maximum permissible cooling state of this cooling > device. > + >   RO, Required >   >  cur_state >   The current cooling state of this cooling device. >   The value can any integer numbers between 0 and max_state: > + >   - cur_state == 0 means no cooling >   - cur_state == max_state means the maximum cooling. > + >   RW, Required >   >  stats/reset > @@ -508,9 +658,11 @@ stats/time_in_state_ms: >   units here is 10mS (similar to other time exported in > /proc). >   RO, Required >   > + >  stats/total_trans: >   A single positive value showing the total number of times > the state of a >   cooling device is changed. > + >   RO, Required >   >  stats/trans_table: > @@ -522,6 +674,7 @@ stats/trans_table: >   RO, Required >   >  3. A simple implementation > +========================== >   >  ACPI thermal zone may support multiple trip points like critical, > hot, >  passive, active. If an ACPI thermal zone supports critical, passive, > @@ -532,11 +685,10 @@ thermal_cooling_device. Both are considered to > have the same >  effectiveness in cooling the thermal zone. >   >  If the processor is listed in _PSL method, and the fan is listed in > _AL0 > -method, the sys I/F structure will be built like this: > +method, the sys I/F structure will be built like this:: >   > -/sys/class/thermal: > - > -|thermal_zone1: > + /sys/class/thermal: > +  |thermal_zone1: >      |---type: acpitz >      |---temp: 37000 >      |---mode: enabled > @@ -557,24 +709,24 @@ method, the sys I/F structure will be built > like this: >      |---cdev1_trip_point: 2 /* cdev1 can be used for > active[0]*/ >      |---cdev1_weight:           1024 >   > -|cooling_device0: > +  |cooling_device0: >      |---type: Processor >      |---max_state: 8 >      |---cur_state: 0 >   > -|cooling_device3: > +  |cooling_device3: >      |---type: Fan >      |---max_state: 2 >      |---cur_state: 0 >   > -/sys/class/hwmon: > - > -|hwmon0: > + /sys/class/hwmon: > +  |hwmon0: >      |---name: acpitz >      |---temp1_input: 37000 >      |---temp1_crit: 100000 >   >  4. Event Notification > +===================== >   >  The framework includes a simple notification mechanism, in the form > of a >  netlink event. Netlink socket initialization is done during the > _init_ > @@ -587,21 +739,28 @@ event will be one of:{THERMAL_AUX0, > THERMAL_AUX1, THERMAL_CRITICAL, >  THERMAL_DEV_FAULT}. Notification can be sent when the current > temperature >  crosses any of the configured thresholds. >   > -5. Export Symbol APIs: > +5. Export Symbol APIs > +===================== > + > +5.1. get_tz_trend > +----------------- >   > -5.1: get_tz_trend: >  This function returns the trend of a thermal zone, i.e the rate of > change >  of temperature of the thermal zone. Ideally, the thermal sensor > drivers >  are supposed to implement the callback. If they don't, the thermal >  framework calculated the trend by comparing the previous and the > current >  temperature values. >   > -5.2:get_thermal_instance: > +5.2. get_thermal_instance > +------------------------- > + >  This function returns the thermal_instance corresponding to a given >  {thermal_zone, cooling_device, trip_point} combination. Returns NULL >  if such an instance does not exist. >   > -5.3:thermal_notify_framework: > +5.3. thermal_notify_framework > +----------------------------- > + >  This function handles the trip events from sensor drivers. It starts >  throttling the cooling devices according to the policy configured. >  For CRITICAL and HOT trip points, this notifies the respective > drivers, > @@ -609,12 +768,15 @@ and does actual throttling for other trip > points i.e ACTIVE and PASSIVE. >  The throttling policy is based on the configured platform data; if > no >  platform data is provided, this uses the step_wise throttling > policy. >   > -5.4:thermal_cdev_update: > +5.4. thermal_cdev_update > +------------------------ > + >  This function serves as an arbitrator to set the state of a cooling >  device. It sets the cooling device to the deepest cooling state if >  possible. >   > -6. thermal_emergency_poweroff: > +6. thermal_emergency_poweroff > +============================= >   >  On an event of critical trip temperature crossing. Thermal framework >  allows the system to shutdown gracefully by calling > orderly_poweroff(). > diff --git a/Documentation/thermal/x86_pkg_temperature_thermal > b/Documentation/thermal/x86_pkg_temperature_thermal.rst > similarity index 80% > rename from Documentation/thermal/x86_pkg_temperature_thermal > rename to Documentation/thermal/x86_pkg_temperature_thermal.rst > index 17a3a4c0a0ca..f134dbd3f5a9 100644 > --- a/Documentation/thermal/x86_pkg_temperature_thermal > +++ b/Documentation/thermal/x86_pkg_temperature_thermal.rst > @@ -1,19 +1,23 @@ > +=================================== >  Kernel driver: x86_pkg_temp_thermal > -=================== > +=================================== >   >  Supported chips: > + >  * x86: with package level thermal management > + >  (Verify using: CPUID.06H:EAX[bit 6] =1) >   >  Authors: Srinivas Pandruvada >   >  Reference > ---- > +--------- > + >  Intel® 64 and IA-32 Architectures Software Developer’s Manual (Jan, > 2013): >  Chapter 14.6: PACKAGE LEVEL THERMAL MANAGEMENT >   >  Description > ---------- > +----------- >   >  This driver register CPU digital temperature package level sensor as > a thermal >  zone with maximum two user mode configurable trip points. Number of > trip points > @@ -25,23 +29,27 @@ take any action to control temperature. >  Threshold management >  -------------------- >  Each package will register as a thermal zone under > /sys/class/thermal. > -Example: > -/sys/class/thermal/thermal_zone1 > + > +Example:: > + > + /sys/class/thermal/thermal_zone1 >   >  This contains two trip points: > + >  - trip_point_0_temp >  - trip_point_1_temp >   >  User can set any temperature between 0 to TJ-Max temperature. > Temperature units > -are in milli-degree Celsius. Refer to "Documentation/thermal/sysfs- > api.txt" for > +are in milli-degree Celsius. Refer to "Documentation/thermal/sysfs- > api.rst" for >  thermal sys-fs details. >   >  Any value other than 0 in these trip points, can trigger thermal > notifications. >  Setting 0, stops sending thermal notifications. >   > -Thermal notifications: To get kobject-uevent notifications, set the > thermal zone > -policy to "user_space". For example: echo -n "user_space" > policy > - > - > +Thermal notifications: > +To get kobject-uevent notifications, set the thermal zone > +policy to "user_space". >   > +For example:: >   > + echo -n "user_space" > policy > diff --git a/MAINTAINERS b/MAINTAINERS > index d9e214f68e52..b2254bc8e495 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -15687,7 +15687,7 @@ M: Viresh Kumar rg> >  M: Javi Merino >  L: linux-pm@vger.kernel.org >  S: Supported > -F: Documentation/thermal/cpu-cooling-api.txt > +F: Documentation/thermal/cpu-cooling-api.rst >  F: drivers/thermal/cpu_cooling.c >  F: include/linux/cpu_cooling.h >   > diff --git a/include/linux/thermal.h b/include/linux/thermal.h > index 15a4ca5d7099..681047f8cc05 100644 > --- a/include/linux/thermal.h > +++ b/include/linux/thermal.h > @@ -251,7 +251,7 @@ struct thermal_bind_params { >    * platform characterization. This value is relative to the >    * rest of the weights so a cooling device whose weight is >    * double that of another cooling device is twice as > -  * effective. See Documentation/thermal/sysfs-api.txt for > more > +  * effective. See Documentation/thermal/sysfs-api.rst for > more >    * information. >    */ >   int weight; > @@ -259,7 +259,7 @@ struct thermal_bind_params { >   /* >    * This is a bit mask that gives the binding relation > between this >    * thermal zone and cdev, for a particular trip point. > -  * See Documentation/thermal/sysfs-api.txt for more > information. > +  * See Documentation/thermal/sysfs-api.rst for more > information. >    */ >   int trip_mask; >   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=-6.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,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 C49A7C48BD4 for ; Tue, 25 Jun 2019 13:40:40 +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 7AE912133F for ; Tue, 25 Jun 2019 13:40:40 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="rO0bI+GF" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7AE912133F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-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=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Mime-Version:References:In-Reply-To: Date: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=bsp8K1Asy45W4T3Dtl/yqa0Gp9j9TBHif0llWgSDQ44=; b=rO0bI+GFRDrFV2 JGZQY7Ccgo9Ztu3mNjNou+AivJKayF8sR0Q7BwLPTY1/tqfufc+z2QPUsFN82BZcl+agClFjFZmQf yaM/Dw45cxYVGyZ+PFxClv4uvQI7bL68X1uh5GFANVIl8KdVXToJBl3iy1Z3zDfWGl1OkITGW5VTL oOTf2fM4pIHAIn1wxyahfP2snHPv87xtWLi9Z1thWH80Yhlujbsn7HYMssCAhnvfW1oEeFdsY7bcY ozjq1Xl4zeov45qrViSbOvJNynQ/nhGk0YwHKxfEByT/4SJLnNAHtDW9KSUVtoZQ9stNT64tjl5+4 VuU2PS9r0MDcMsZIxnOg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hflgX-0006S4-0R; Tue, 25 Jun 2019 13:40:33 +0000 Received: from mga09.intel.com ([134.134.136.24]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hflgP-0006Qt-MI for linux-arm-kernel@lists.infradead.org; Tue, 25 Jun 2019 13:40:31 +0000 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Jun 2019 06:40:23 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.63,416,1557212400"; d="scan'208";a="163627242" Received: from syhu-mobl.ccr.corp.intel.com ([10.249.173.95]) by fmsmga007.fm.intel.com with ESMTP; 25 Jun 2019 06:40:18 -0700 Message-ID: <1561470011.19713.1.camel@intel.com> Subject: Re: [PATCH v1 04/22] docs: thermal: convert to ReST From: Zhang Rui To: Mauro Carvalho Chehab , Linux Doc Mailing List Date: Tue, 25 Jun 2019 21:40:11 +0800 In-Reply-To: <23fafb70bfc9bd8b7f306f2502617d8f8794eae5.1560891322.git.mchehab+samsung@kernel.org> References: <23fafb70bfc9bd8b7f306f2502617d8f8794eae5.1560891322.git.mchehab+samsung@kernel.org> X-Mailer: Evolution 3.18.5.2-0ubuntu3.2 Mime-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190625_064025_916965_7F71C4EC X-CRM114-Status: GOOD ( 34.56 ) 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: linux-samsung-soc@vger.kernel.org, Jonathan Corbet , Viresh Kumar , Amit Daniel Kachhap , Daniel Lezcano , linux-kernel@vger.kernel.org, Krzysztof Kozlowski , Mauro Carvalho Chehab , Eduardo Valentin , Kukjin Kim , linux-pm@vger.kernel.org, Javi Merino , Arjan van de Ven , linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24g5LqMLCAyMDE5LTA2LTE4IGF0IDE4OjA1IC0wMzAwLCBNYXVybyBDYXJ2YWxobyBDaGVoYWIg d3JvdGU6Cj4gUmVuYW1lIHRoZSB0aGVybWFsIGRvY3VtZW50YXRpb24gZmlsZXMgdG8gUmVTVCwg YWRkIGFuCj4gaW5kZXggZm9yIHRoZW0gYW5kIGFkanVzdCBpbiBvcmRlciB0byBwcm9kdWNlIGEg bmljZSBodG1sCj4gb3V0cHV0IHZpYSB0aGUgU3BoaW54IGJ1aWxkIHN5c3RlbS4KPiAKPiBBdCBp dHMgbmV3IGluZGV4LnJzdCwgbGV0J3MgYWRkIGEgOm9ycGhhbjogd2hpbGUgdGhpcyBpcyBub3Qg bGlua2VkCj4gdG8KPiB0aGUgbWFpbiBpbmRleC5yc3QgZmlsZSwgaW4gb3JkZXIgdG8gYXZvaWQg YnVpbGQgd2FybmluZ3MuCj4gCj4gU2lnbmVkLW9mZi1ieTogTWF1cm8gQ2FydmFsaG8gQ2hlaGFi IDxtY2hlaGFiK3NhbXN1bmdAa2VybmVsLm9yZz4KCkFja2VkLWJ5OiBaaGFuZyBSdWkgPHJ1aS56 aGFuZ0BpbnRlbC5jb20+CgpzaG91bGQgSSBhcHBseSB0aGlzIHBhdGNoIG9yIHlvdSBoYXZlIGEg c2VwYXJhdGUgdHJlZSBmb3IgYWxsIHRoZXNlCmNoYW5nZXM/Cgp0aGFua3MsCnJ1aQo+IC0tLQo+ IMKgLi4ucHUtY29vbGluZy1hcGkudHh0ID0+IGNwdS1jb29saW5nLWFwaS5yc3R9IHzCoMKgMzkg Ky0KPiDCoC4uLi97ZXh5bm9zX3RoZXJtYWwgPT4gZXh5bm9zX3RoZXJtYWwucnN0fcKgwqDCoMKg fMKgwqA0NyArLQo+IMKgLi4uZW11bGF0aW9uID0+IGV4eW5vc190aGVybWFsX2VtdWxhdGlvbi5y c3R9IHzCoMKgNjYgKy0tCj4gwqBEb2N1bWVudGF0aW9uL3RoZXJtYWwvaW5kZXgucnN0wqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfMKgwqAxOCArCj4gwqAuLi5lbF9wb3dlcmNsYW1wLnR4 dCA9PiBpbnRlbF9wb3dlcmNsYW1wLnJzdH0gfCAxNzcgKysrLS0tLQo+IMKgLi4uL3tub3V2ZWF1 X3RoZXJtYWwgPT4gbm91dmVhdV90aGVybWFsLnJzdH3CoMKgfMKgwqA1NCArLQo+IMKgLi4ub3dl cl9hbGxvY2F0b3IudHh0ID0+IHBvd2VyX2FsbG9jYXRvci5yc3R9IHwgMTQwICsrLS0tCj4gwqAu Li4vdGhlcm1hbC97c3lzZnMtYXBpLnR4dCA9PiBzeXNmcy1hcGkucnN0fcKgwqB8IDQ5MCArKysr KysrKysrKystLQo+IC0tLS0KPiDCoC4uLmhlcm1hbCA9PiB4ODZfcGtnX3RlbXBlcmF0dXJlX3Ro ZXJtYWwucnN0fSB8wqDCoDI4ICstCj4gwqBNQUlOVEFJTkVSU8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8wqDCoMKg MiArLQo+IMKgaW5jbHVkZS9saW51eC90aGVybWFsLmjCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgfMKgwqDCoDQgKy0KPiDCoDExIGZpbGVzIGNoYW5nZWQsIDY2 NSBpbnNlcnRpb25zKCspLCA0MDAgZGVsZXRpb25zKC0pCj4gwqByZW5hbWUgRG9jdW1lbnRhdGlv bi90aGVybWFsL3tjcHUtY29vbGluZy1hcGkudHh0ID0+IGNwdS1jb29saW5nLQo+IGFwaS5yc3R9 ICg4MiUpCj4gwqByZW5hbWUgRG9jdW1lbnRhdGlvbi90aGVybWFsL3tleHlub3NfdGhlcm1hbCA9 PiBleHlub3NfdGhlcm1hbC5yc3R9Cj4gKDY3JSkKPiDCoHJlbmFtZSBEb2N1bWVudGF0aW9uL3Ro ZXJtYWwve2V4eW5vc190aGVybWFsX2VtdWxhdGlvbiA9Pgo+IGV4eW5vc190aGVybWFsX2VtdWxh dGlvbi5yc3R9ICgzNiUpCj4gwqBjcmVhdGUgbW9kZSAxMDA2NDQgRG9jdW1lbnRhdGlvbi90aGVy bWFsL2luZGV4LnJzdAo+IMKgcmVuYW1lIERvY3VtZW50YXRpb24vdGhlcm1hbC97aW50ZWxfcG93 ZXJjbGFtcC50eHQgPT4KPiBpbnRlbF9wb3dlcmNsYW1wLnJzdH0gKDc2JSkKPiDCoHJlbmFtZSBE b2N1bWVudGF0aW9uL3RoZXJtYWwve25vdXZlYXVfdGhlcm1hbCA9Pgo+IG5vdXZlYXVfdGhlcm1h bC5yc3R9ICg2NCUpCj4gwqByZW5hbWUgRG9jdW1lbnRhdGlvbi90aGVybWFsL3twb3dlcl9hbGxv Y2F0b3IudHh0ID0+Cj4gcG93ZXJfYWxsb2NhdG9yLnJzdH0gKDc0JSkKPiDCoHJlbmFtZSBEb2N1 bWVudGF0aW9uL3RoZXJtYWwve3N5c2ZzLWFwaS50eHQgPT4gc3lzZnMtYXBpLnJzdH0gKDY2JSkK PiDCoHJlbmFtZSBEb2N1bWVudGF0aW9uL3RoZXJtYWwve3g4Nl9wa2dfdGVtcGVyYXR1cmVfdGhl cm1hbCA9Pgo+IHg4Nl9wa2dfdGVtcGVyYXR1cmVfdGhlcm1hbC5yc3R9ICg4MCUpCj4gCj4gZGlm ZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGhlcm1hbC9jcHUtY29vbGluZy1hcGkudHh0Cj4gYi9E b2N1bWVudGF0aW9uL3RoZXJtYWwvY3B1LWNvb2xpbmctYXBpLnJzdAo+IHNpbWlsYXJpdHkgaW5k ZXggODIlCj4gcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi90aGVybWFsL2NwdS1jb29saW5nLWFw aS50eHQKPiByZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi90aGVybWFsL2NwdS1jb29saW5nLWFwaS5y c3QKPiBpbmRleCA3ZGY1NjdlYWVhMWEuLjY0NWQ5MTRjNDVhNiAxMDA2NDQKPiAtLS0gYS9Eb2N1 bWVudGF0aW9uL3RoZXJtYWwvY3B1LWNvb2xpbmctYXBpLnR4dAo+ICsrKyBiL0RvY3VtZW50YXRp b24vdGhlcm1hbC9jcHUtY29vbGluZy1hcGkucnN0Cj4gQEAgLTEsNSArMSw2IEBACj4gKz09PT09 PT09PT09PT09PT09PT09PT09Cj4gwqBDUFUgY29vbGluZyBBUElzIEhvdyBUbwo+IC09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo+ICs9PT09PT09PT09PT09PT09PT09PT09PQo+ IMKgCj4gwqBXcml0dGVuIGJ5IEFtaXQgRGFuaWVsIEthY2hoYXAgPGFtaXQua2FjaGhhcEBsaW5h cm8ub3JnPgo+IMKgCj4gQEAgLTgsNDAgKzksNTQgQEAgVXBkYXRlZDogNiBKYW4gMjAxNQo+IMKg Q29weXJpZ2h0IChjKcKgwqAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQoaHR0cDov L3d3dy5zYW1zdW5nLgo+IGNvbSkKPiDCoAo+IMKgMC4gSW50cm9kdWN0aW9uCj4gKz09PT09PT09 PT09PT09PQo+IMKgCj4gwqBUaGUgZ2VuZXJpYyBjcHUgY29vbGluZyhmcmVxIGNsaXBwaW5nKSBw cm92aWRlcwo+IHJlZ2lzdHJhdGlvbi91bnJlZ2lzdHJhdGlvbiBBUElzCj4gwqB0byB0aGUgY2Fs bGVyLiBUaGUgYmluZGluZyBvZiB0aGUgY29vbGluZyBkZXZpY2VzIHRvIHRoZSB0cmlwIHBvaW50 Cj4gaXMgbGVmdCBmb3IKPiDCoHRoZSB1c2VyLiBUaGUgcmVnaXN0cmF0aW9uIEFQSXMgcmV0dXJu cyB0aGUgY29vbGluZyBkZXZpY2UgcG9pbnRlci4KPiDCoAo+IMKgMS4gY3B1IGNvb2xpbmcgQVBJ cwo+ICs9PT09PT09PT09PT09PT09PT09Cj4gwqAKPiDCoDEuMSBjcHVmcmVxIHJlZ2lzdHJhdGlv bi91bnJlZ2lzdHJhdGlvbiBBUElzCj4gLTEuMS4xIHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2 aWNlICpjcHVmcmVxX2Nvb2xpbmdfcmVnaXN0ZXIoCj4gLQlzdHJ1Y3QgY3B1bWFzayAqY2xpcF9j cHVzKQo+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsK PiArwqDCoMKgwqA6Ogo+ICsKPiArCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlCj4gKwkq Y3B1ZnJlcV9jb29saW5nX3JlZ2lzdGVyKHN0cnVjdCBjcHVtYXNrICpjbGlwX2NwdXMpCj4gwqAK PiDCoMKgwqDCoMKgVGhpcyBpbnRlcmZhY2UgZnVuY3Rpb24gcmVnaXN0ZXJzIHRoZSBjcHVmcmVx IGNvb2xpbmcgZGV2aWNlCj4gd2l0aCB0aGUgbmFtZQo+IMKgwqDCoMKgwqAidGhlcm1hbC1jcHVm cmVxLSV4Ii4gVGhpcyBhcGkgY2FuIHN1cHBvcnQgbXVsdGlwbGUgaW5zdGFuY2VzIG9mCj4gY3B1 ZnJlcQo+IMKgwqDCoMKgwqBjb29saW5nIGRldmljZXMuCj4gwqAKPiAtwqDCoMKgY2xpcF9jcHVz OiBjcHVtYXNrIG9mIGNwdXMgd2hlcmUgdGhlIGZyZXF1ZW5jeSBjb25zdHJhaW50cyB3aWxsCj4g aGFwcGVuLgo+ICvCoMKgwqBjbGlwX2NwdXM6Cj4gKwljcHVtYXNrIG9mIGNwdXMgd2hlcmUgdGhl IGZyZXF1ZW5jeSBjb25zdHJhaW50cyB3aWxsIGhhcHBlbi4KPiDCoAo+IC0xLjEuMiBzdHJ1Y3Qg dGhlcm1hbF9jb29saW5nX2RldmljZSAqb2ZfY3B1ZnJlcV9jb29saW5nX3JlZ2lzdGVyKAo+IC0J CQkJCXN0cnVjdCBjcHVmcmVxX3BvbGljeQo+ICpwb2xpY3kpCj4gK8KgwqDCoMKgOjoKPiArCj4g KwlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZQo+ICsJKm9mX2NwdWZyZXFfY29vbGluZ19y ZWdpc3RlcihzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKPiDCoAo+IMKgwqDCoMKgwqBU aGlzIGludGVyZmFjZSBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIGNwdWZyZXEgY29vbGluZyBkZXZp Y2UKPiB3aXRoCj4gwqDCoMKgwqDCoHRoZSBuYW1lICJ0aGVybWFsLWNwdWZyZXEtJXgiIGxpbmtp bmcgaXQgd2l0aCBhIGRldmljZSB0cmVlCj4gbm9kZSwgaW4KPiDCoMKgwqDCoMKgb3JkZXIgdG8g YmluZCBpdCB2aWEgdGhlIHRoZXJtYWwgRFQgY29kZS4gVGhpcyBhcGkgY2FuIHN1cHBvcnQKPiBt dWx0aXBsZQo+IMKgwqDCoMKgwqBpbnN0YW5jZXMgb2YgY3B1ZnJlcSBjb29saW5nIGRldmljZXMu Cj4gwqAKPiAtwqDCoMKgwqBwb2xpY3k6IENQVUZyZXEgcG9saWN5Lgo+ICvCoMKgwqDCoHBvbGlj eToKPiArCUNQVUZyZXEgcG9saWN5Lgo+IMKgCj4gLTEuMS4zIHZvaWQgY3B1ZnJlcV9jb29saW5n X3VucmVnaXN0ZXIoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UKPiAqY2RldikKPiArCj4g K8KgwqDCoMKgOjoKPiArCj4gKwl2b2lkIGNwdWZyZXFfY29vbGluZ191bnJlZ2lzdGVyKHN0cnVj dAo+IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYpCj4gwqAKPiDCoMKgwqDCoMKgVGhpcyBp bnRlcmZhY2UgZnVuY3Rpb24gdW5yZWdpc3RlcnMgdGhlICJ0aGVybWFsLWNwdWZyZXEtJXgiCj4g Y29vbGluZyBkZXZpY2UuCj4gwqAKPiDCoMKgwqDCoMKgY2RldjogQ29vbGluZyBkZXZpY2UgcG9p bnRlciB3aGljaCBoYXMgdG8gYmUgdW5yZWdpc3RlcmVkLgo+IMKgCj4gwqAyLiBQb3dlciBtb2Rl bHMKPiArPT09PT09PT09PT09PT09Cj4gwqAKPiDCoFRoZSBwb3dlciBBUEkgcmVnaXN0cmF0aW9u IGZ1bmN0aW9ucyBwcm92aWRlIGEgc2ltcGxlIHBvd2VyIG1vZGVsCj4gZm9yCj4gwqBDUFVzLsKg wqBUaGUgY3VycmVudCBwb3dlciBpcyBjYWxjdWxhdGVkIGFzIGR5bmFtaWMgcG93ZXIgKHN0YXRp Ywo+IHBvd2VyIGlzbid0Cj4gQEAgLTY1LDkgKzgwLDkgQEAgRm9yIGEgZ2l2ZW4gcHJvY2Vzc29y IGltcGxlbWVudGF0aW9uIHRoZSBwcmltYXJ5Cj4gZmFjdG9ycyBhcmU6Cj4gwqDCoMKgdmFyaWF0 aW9uLsKgwqBJbiBwYXRob2xvZ2ljYWwgY2FzZXMgdGhpcyB2YXJpYXRpb24gY2FuIGJlCj4gc2ln bmlmaWNhbnQsCj4gwqDCoMKgYnV0IHR5cGljYWxseSBpdCBpcyBvZiBhIG11Y2ggbGVzc2VyIGlt cGFjdCB0aGFuIHRoZSBmYWN0b3JzCj4gYWJvdmUuCj4gwqAKPiAtQSBoaWdoIGxldmVsIGR5bmFt aWMgcG93ZXIgY29uc3VtcHRpb24gbW9kZWwgbWF5IHRoZW4gYmUgcmVwcmVzZW50ZWQKPiBhczoK PiArQSBoaWdoIGxldmVsIGR5bmFtaWMgcG93ZXIgY29uc3VtcHRpb24gbW9kZWwgbWF5IHRoZW4g YmUgcmVwcmVzZW50ZWQKPiBhczo6Cj4gwqAKPiAtUGR5biA9IGYocnVuKSAqIFZvbHRhZ2VeMiAq IEZyZXF1ZW5jeSAqIFV0aWxpc2F0aW9uCj4gKwlQZHluID0gZihydW4pICogVm9sdGFnZV4yICog RnJlcXVlbmN5ICogVXRpbGlzYXRpb24KPiDCoAo+IMKgZihydW4pIGhlcmUgcmVwcmVzZW50cyB0 aGUgZGVzY3JpYmVkIGV4ZWN1dGlvbiBiZWhhdmlvdXIgYW5kIGl0cwo+IMKgcmVzdWx0IGhhcyBh IHVuaXRzIG9mIFdhdHRzL0h6L1ZvbHReMiAodGhpcyBvZnRlbiBleHByZXNzZWQgaW4KPiBAQCAt ODAsOSArOTUsOSBAQCBmYWN0b3JzLsKgwqBUaGVyZWZvcmUsIGluIGluaXRpYWwgaW1wbGVtZW50 YXRpb24gdGhhdAo+IGNvbnRyaWJ1dGlvbiBpcwo+IMKgcmVwcmVzZW50ZWQgYXMgYSBjb25zdGFu dCBjb2VmZmljaWVudC7CoMKgVGhpcyBpcyBhIHNpbXBsaWZpY2F0aW9uCj4gwqBjb25zaXN0ZW50 IHdpdGggdGhlIHJlbGF0aXZlIGNvbnRyaWJ1dGlvbiB0byBvdmVyYWxsIHBvd2VyCj4gdmFyaWF0 aW9uLgo+IMKgCj4gLUluIHRoaXMgc2ltcGxpZmllZCByZXByZXNlbnRhdGlvbiBvdXIgbW9kZWwg YmVjb21lczoKPiArSW4gdGhpcyBzaW1wbGlmaWVkIHJlcHJlc2VudGF0aW9uIG91ciBtb2RlbCBi ZWNvbWVzOjoKPiDCoAo+IC1QZHluID0gQ2FwYWNpdGFuY2UgKiBWb2x0YWdlXjIgKiBGcmVxdWVu Y3kgKiBVdGlsaXNhdGlvbgo+ICsJUGR5biA9IENhcGFjaXRhbmNlICogVm9sdGFnZV4yICogRnJl cXVlbmN5ICogVXRpbGlzYXRpb24KPiDCoAo+IMKgV2hlcmUgYGNhcGFjaXRhbmNlYCBpcyBhIGNv bnN0YW50IHRoYXQgcmVwcmVzZW50cyBhbiBpbmRpY2F0aXZlCj4gwqBydW5uaW5nIHRpbWUgZHlu YW1pYyBwb3dlciBjb2VmZmljaWVudCBpbiBmdW5kYW1lbnRhbCB1bml0cyBvZgo+IGRpZmYgLS1n aXQgYS9Eb2N1bWVudGF0aW9uL3RoZXJtYWwvZXh5bm9zX3RoZXJtYWwKPiBiL0RvY3VtZW50YXRp b24vdGhlcm1hbC9leHlub3NfdGhlcm1hbC5yc3QKPiBzaW1pbGFyaXR5IGluZGV4IDY3JQo+IHJl bmFtZSBmcm9tIERvY3VtZW50YXRpb24vdGhlcm1hbC9leHlub3NfdGhlcm1hbAo+IHJlbmFtZSB0 byBEb2N1bWVudGF0aW9uL3RoZXJtYWwvZXh5bm9zX3RoZXJtYWwucnN0Cj4gaW5kZXggOTAxMGM0 NDE2OTY3Li41YmQ1NTY1NjZjNzAgMTAwNjQ0Cj4gLS0tIGEvRG9jdW1lbnRhdGlvbi90aGVybWFs L2V4eW5vc190aGVybWFsCj4gKysrIGIvRG9jdW1lbnRhdGlvbi90aGVybWFsL2V4eW5vc190aGVy bWFsLnJzdAo+IEBAIC0xLDggKzEsMTEgQEAKPiArPT09PT09PT09PT09PT09PT09PT09PT09Cj4g wqBLZXJuZWwgZHJpdmVyIGV4eW5vc190bXUKPiAtPT09PT09PT09PT09PT09PT0KPiArPT09PT09 PT09PT09PT09PT09PT09PT09Cj4gwqAKPiDCoFN1cHBvcnRlZCBjaGlwczoKPiArCj4gwqAqIEFS TSBTQU1TVU5HIEVYWU5PUzQsIEVYWU5PUzUgc2VyaWVzIG9mIFNvQwo+ICsKPiDCoMKgwqBEYXRh c2hlZXQ6IE5vdCBwdWJsaWNseSBhdmFpbGFibGUKPiDCoAo+IMKgQXV0aG9yczogRG9uZ2dldW4g S2ltIDxkZzc3LmtpbUBzYW1zdW5nLmNvbT4KPiBAQCAtMTksMzIgKzIyLDM5IEBAIFRlbXBlcmF0 dXJlIGNhbiBiZSB0YWtlbiBmcm9tIHRoZSB0ZW1wZXJhdHVyZQo+IGNvZGUuCj4gwqBUaGVyZSBh cmUgdGhyZWUgZXF1YXRpb25zIGNvbnZlcnRpbmcgZnJvbSB0ZW1wZXJhdHVyZSB0byB0ZW1wZXJh dHVyZQo+IGNvZGUuCj4gwqAKPiDCoFRoZSB0aHJlZSBlcXVhdGlvbnMgYXJlOgo+IC3CoMKgMS4g VHdvIHBvaW50IHRyaW1taW5nCj4gK8KgwqAxLiBUd28gcG9pbnQgdHJpbW1pbmc6Ogo+ICsKPiDC oAlUYyA9IChUIC0gMjUpICogKFRJMiAtIFRJMSkgLyAoODUgLSAyNSkgKyBUSTEKPiDCoAo+IC3C oMKgMi4gT25lIHBvaW50IHRyaW1taW5nCj4gK8KgwqAyLiBPbmUgcG9pbnQgdHJpbW1pbmc6Ogo+ ICsKPiDCoAlUYyA9IFQgKyBUSTEgLSAyNQo+IMKgCj4gLcKgwqAzLiBObyB0cmltbWluZwo+ICvC oMKgMy4gTm8gdHJpbW1pbmc6Ogo+ICsKPiDCoAlUYyA9IFQgKyA1MAo+IMKgCj4gLcKgwqBUYzog VGVtcGVyYXR1cmUgY29kZSwgVDogVGVtcGVyYXR1cmUsCj4gLcKgwqBUSTE6IFRyaW1taW5nIGlu Zm8gZm9yIDI1IGRlZ3JlZSBDZWxzaXVzIChzdG9yZWQgYXQgVFJJTUlORk8KPiByZWdpc3RlcikK PiArwqDCoFRjOgo+ICvCoMKgwqDCoMKgwqDCoFRlbXBlcmF0dXJlIGNvZGUsIFQ6IFRlbXBlcmF0 dXJlLAo+ICvCoMKgVEkxOgo+ICvCoMKgwqDCoMKgwqDCoFRyaW1taW5nIGluZm8gZm9yIDI1IGRl Z3JlZSBDZWxzaXVzIChzdG9yZWQgYXQgVFJJTUlORk8KPiByZWdpc3RlcikKPiDCoMKgwqDCoMKg wqDCoMKgVGVtcGVyYXR1cmUgY29kZSBtZWFzdXJlZCBhdCAyNSBkZWdyZWUgQ2Vsc2l1cyB3aGlj aCBpcwo+IHVuY2hhbmdlZAo+IC3CoMKgVEkyOiBUcmltbWluZyBpbmZvIGZvciA4NSBkZWdyZWUg Q2Vsc2l1cyAoc3RvcmVkIGF0IFRSSU1JTkZPCj4gcmVnaXN0ZXIpCj4gK8KgwqBUSTI6Cj4gK8Kg wqDCoMKgwqDCoMKgVHJpbW1pbmcgaW5mbyBmb3IgODUgZGVncmVlIENlbHNpdXMgKHN0b3JlZCBh dCBUUklNSU5GTwo+IHJlZ2lzdGVyKQo+IMKgwqDCoMKgwqDCoMKgwqBUZW1wZXJhdHVyZSBjb2Rl IG1lYXN1cmVkIGF0IDg1IGRlZ3JlZSBDZWxzaXVzIHdoaWNoIGlzCj4gdW5jaGFuZ2VkCj4gwqAK PiDCoFRNVShUaGVybWFsIE1hbmFnZW1lbnQgVW5pdCkgaW4gRVhZTk9TNC81IGdlbmVyYXRlcyBp bnRlcnJ1cHQKPiDCoHdoZW4gdGVtcGVyYXR1cmUgZXhjZWVkcyBwcmUtZGVmaW5lZCBsZXZlbHMu Cj4gwqBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29uZmlndXJhYmxlIHRocmVzaG9sZCBpcyBmaXZl Lgo+IC1UaGUgdGhyZXNob2xkIGxldmVscyBhcmUgZGVmaW5lZCBhcyBmb2xsb3dzOgo+ICtUaGUg dGhyZXNob2xkIGxldmVscyBhcmUgZGVmaW5lZCBhcyBmb2xsb3dzOjoKPiArCj4gwqDCoMKgTGV2 ZWxfMDogY3VycmVudCB0ZW1wZXJhdHVyZSA+IHRyaWdnZXJfbGV2ZWxfMCArIHRocmVzaG9sZAo+ IMKgwqDCoExldmVsXzE6IGN1cnJlbnQgdGVtcGVyYXR1cmUgPiB0cmlnZ2VyX2xldmVsXzEgKyB0 aHJlc2hvbGQKPiDCoMKgwqBMZXZlbF8yOiBjdXJyZW50IHRlbXBlcmF0dXJlID4gdHJpZ2dlcl9s ZXZlbF8yICsgdGhyZXNob2xkCj4gwqDCoMKgTGV2ZWxfMzogY3VycmVudCB0ZW1wZXJhdHVyZSA+ IHRyaWdnZXJfbGV2ZWxfMyArIHRocmVzaG9sZAo+IMKgCj4gLcKgwqBUaGUgdGhyZXNob2xkIGFu ZCBlYWNoIHRyaWdnZXJfbGV2ZWwgYXJlIHNldAo+IC3CoMKgdGhyb3VnaCB0aGUgY29ycmVzcG9u ZGluZyByZWdpc3RlcnMuCj4gK1RoZSB0aHJlc2hvbGQgYW5kIGVhY2ggdHJpZ2dlcl9sZXZlbCBh cmUgc2V0Cj4gK3Rocm91Z2ggdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXJzLgo+IMKgCj4gwqBX aGVuIGFuIGludGVycnVwdCBvY2N1cnMsIHRoaXMgZHJpdmVyIG5vdGlmeSBrZXJuZWwgdGhlcm1h bAo+IGZyYW1ld29yawo+IMKgd2l0aCB0aGUgZnVuY3Rpb24gZXh5bm9zX3JlcG9ydF90cmlnZ2Vy Lgo+IEBAIC01NCwyNCArNjQsMjcgQEAgaXQgY2FuIGJlIHVzZWQgdG8gc3luY2hyb25pemUgdGhl IGNvb2xpbmcgYWN0aW9uLgo+IMKgVE1VIGRyaXZlciBkZXNjcmlwdGlvbjoKPiDCoC0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCj4gwqAKPiAtVGhlIGV4eW5vcyB0aGVybWFsIGRyaXZlciBpcyBzdHJ1 Y3R1cmVkIGFzLAo+ICtUaGUgZXh5bm9zIHRoZXJtYWwgZHJpdmVyIGlzIHN0cnVjdHVyZWQgYXM6 Ogo+IMKgCj4gwqAJCQkJCUtlcm5lbCBDb3JlIHRoZXJtYWwKPiBmcmFtZXdvcmsKPiDCoAkJCQko dGhlcm1hbF9jb3JlLmMsIHN0ZXBfd2lzZS5jLAo+IGNwdV9jb29saW5nLmMpCj4gwqAJCQkJCQkJ CV4KPiDCoAkJCQkJCQkJfAo+IMKgCQkJCQkJCQl8Cj4gLVRNVSBjb25maWd1cmF0aW9uIGRhdGEg LS0tLS0tLT4gVE1VIERyaXZlcsKgwqA8LS0tLS0tPiBFeHlub3MgQ29yZQo+IHRoZXJtYWwgd3Jh cHBlcgo+IC0oZXh5bm9zX3RtdV9kYXRhLmMpCcKgwqDCoMKgwqDCoChleHlub3NfdG11LmMpCcKg wqDCoChleHlub3NfdGgKPiBlcm1hbF9jb21tb24uYykKPiAtKGV4eW5vc190bXVfZGF0YS5oKQnC oMKgwqDCoMKgwqAoZXh5bm9zX3RtdS5oKQnCoMKgwqAoZXh5bm9zX3RoCj4gZXJtYWxfY29tbW9u LmgpCj4gK8KgwqBUTVUgY29uZmlndXJhdGlvbiBkYXRhIC0tLS0tPiBUTVUgRHJpdmVywqDCoDwt LS0tPiBFeHlub3MgQ29yZQo+IHRoZXJtYWwgd3JhcHBlcgo+ICvCoMKgKGV4eW5vc190bXVfZGF0 YS5jKQnCoMKgwqDCoMKgwqAoZXh5bm9zX3RtdS5jKQnCoMKgwqAoZXh5bm9zXwo+IHRoZXJtYWxf Y29tbW9uLmMpCj4gK8KgwqAoZXh5bm9zX3RtdV9kYXRhLmgpCcKgwqDCoMKgwqDCoChleHlub3Nf dG11LmgpCcKgwqDCoChleHlub3NfCj4gdGhlcm1hbF9jb21tb24uaCkKPiDCoAo+IC1hKSBUTVUg Y29uZmlndXJhdGlvbiBkYXRhOiBUaGlzIGNvbnNpc3Qgb2YgVE1VIHJlZ2lzdGVyCj4gb2Zmc2V0 cy9iaXRmaWVsZHMKPiArYSkgVE1VIGNvbmZpZ3VyYXRpb24gZGF0YToKPiArCQlUaGlzIGNvbnNp c3Qgb2YgVE1VIHJlZ2lzdGVyIG9mZnNldHMvYml0ZmllbGRzCj4gwqAJCWRlc2NyaWJlZCB0aHJv dWdoIHN0cnVjdHVyZSBleHlub3NfdG11X3JlZ2lzdGVycy4KPiBBbHNvIHNldmVyYWwKPiDCoAkJ b3RoZXIgcGxhdGZvcm0gZGF0YSAoc3RydWN0Cj4gZXh5bm9zX3RtdV9wbGF0Zm9ybV9kYXRhKSBt ZW1iZXJzCj4gwqAJCWFyZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgVE1VLgo+IC1iKSBUTVUgZHJp dmVyOiBUaGlzIGNvbXBvbmVudCBpbml0aWFsaXNlcyB0aGUgVE1VIGNvbnRyb2xsZXIgYW5kCj4g c2V0cyBkaWZmZXJlbnQKPiArYikgVE1VIGRyaXZlcjoKPiArCQlUaGlzIGNvbXBvbmVudCBpbml0 aWFsaXNlcyB0aGUgVE1VIGNvbnRyb2xsZXIgYW5kCj4gc2V0cyBkaWZmZXJlbnQKPiDCoAkJdGhy ZXNob2xkcy4gSXQgaW52b2tlcyBjb3JlIHRoZXJtYWwgaW1wbGVtZW50YXRpb24KPiB3aXRoIHRo ZSBjYWxsCj4gwqAJCWV4eW5vc19yZXBvcnRfdHJpZ2dlci4KPiAtYykgRXh5bm9zIENvcmUgdGhl cm1hbCB3cmFwcGVyOiBUaGlzIHByb3ZpZGVzIDMgd3JhcHBlciBmdW5jdGlvbiB0bwo+IHVzZSB0 aGUKPiArYykgRXh5bm9zIENvcmUgdGhlcm1hbCB3cmFwcGVyOgo+ICsJCVRoaXMgcHJvdmlkZXMg MyB3cmFwcGVyIGZ1bmN0aW9uIHRvIHVzZSB0aGUKPiDCoAkJS2VybmVsIGNvcmUgdGhlcm1hbCBm cmFtZXdvcmsuIFRoZXkgYXJlCj4gZXh5bm9zX3VucmVnaXN0ZXJfdGhlcm1hbCwKPiDCoAkJZXh5 bm9zX3JlZ2lzdGVyX3RoZXJtYWwgYW5kIGV4eW5vc19yZXBvcnRfdHJpZ2dlci4KPiBkaWZmIC0t Z2l0IGEvRG9jdW1lbnRhdGlvbi90aGVybWFsL2V4eW5vc190aGVybWFsX2VtdWxhdGlvbgo+IGIv RG9jdW1lbnRhdGlvbi90aGVybWFsL2V4eW5vc190aGVybWFsX2VtdWxhdGlvbi5yc3QKPiBzaW1p bGFyaXR5IGluZGV4IDM2JQo+IHJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vdGhlcm1hbC9leHlu b3NfdGhlcm1hbF9lbXVsYXRpb24KPiByZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi90aGVybWFsL2V4 eW5vc190aGVybWFsX2VtdWxhdGlvbi5yc3QKPiBpbmRleCBiMTVlZmVjNmNhMjguLmMyMWQxMDgz OGJjNSAxMDA2NDQKPiAtLS0gYS9Eb2N1bWVudGF0aW9uL3RoZXJtYWwvZXh5bm9zX3RoZXJtYWxf ZW11bGF0aW9uCj4gKysrIGIvRG9jdW1lbnRhdGlvbi90aGVybWFsL2V4eW5vc190aGVybWFsX2Vt dWxhdGlvbi5yc3QKPiBAQCAtMSw1ICsxLDYgQEAKPiAtRVhZTk9TIEVNVUxBVElPTiBNT0RFCj4g LT09PT09PT09PT09PT09PT09PT09PT09PQo+ICs9PT09PT09PT09PT09PT09PT09PT0KPiArRXh5 bm9zIEVtdWxhdGlvbiBNb2RlCj4gKz09PT09PT09PT09PT09PT09PT09PQo+IMKgCj4gwqBDb3B5 cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcwo+IMKgCj4gQEAgLTgsNDYgKzksNTMg QEAgV3JpdHRlbiBieSBKb25naHdhIExlZSA8am9uZ2h3YTMubGVlQHNhbXN1bmcuY29tPgo+IMKg RGVzY3JpcHRpb24KPiDCoC0tLS0tLS0tLS0tCj4gwqAKPiAtRXh5bm9zIDR4MTIgKDQyMTIsIDQ0 MTIpIGFuZCA1IHNlcmllcyBwcm92aWRlIGVtdWxhdGlvbiBtb2RlIGZvcgo+IHRoZXJtYWwgbWFu YWdlbWVudCB1bml0Lgo+IC1UaGVybWFsIGVtdWxhdGlvbiBtb2RlIHN1cHBvcnRzIHNvZnR3YXJl IGRlYnVnIGZvciBUTVUncyBvcGVyYXRpb24uCj4gVXNlciBjYW4gc2V0IHRlbXBlcmF0dXJlCj4g LW1hbnVhbGx5IHdpdGggc29mdHdhcmUgY29kZSBhbmQgVE1VIHdpbGwgcmVhZCBjdXJyZW50IHRl bXBlcmF0dXJlCj4gZnJvbSB1c2VyIHZhbHVlIG5vdCBmcm9tCj4gLXNlbnNvcidzIHZhbHVlLgo+ ICtFeHlub3MgNHgxMiAoNDIxMiwgNDQxMikgYW5kIDUgc2VyaWVzIHByb3ZpZGUgZW11bGF0aW9u IG1vZGUgZm9yCj4gdGhlcm1hbAo+ICttYW5hZ2VtZW50IHVuaXQuIFRoZXJtYWwgZW11bGF0aW9u IG1vZGUgc3VwcG9ydHMgc29mdHdhcmUgZGVidWcgZm9yCj4gK1RNVSdzIG9wZXJhdGlvbi4gVXNl ciBjYW4gc2V0IHRlbXBlcmF0dXJlIG1hbnVhbGx5IHdpdGggc29mdHdhcmUKPiBjb2RlCj4gK2Fu ZCBUTVUgd2lsbCByZWFkIGN1cnJlbnQgdGVtcGVyYXR1cmUgZnJvbSB1c2VyIHZhbHVlIG5vdCBm cm9tCj4gc2Vuc29yJ3MKPiArdmFsdWUuCj4gwqAKPiAtRW5hYmxpbmcgQ09ORklHX1RIRVJNQUxf RU1VTEFUSU9OIG9wdGlvbiB3aWxsIG1ha2UgdGhpcyBzdXBwb3J0Cj4gYXZhaWxhYmxlLgo+IC1X aGVuIGl0J3MgZW5hYmxlZCwgc3lzZnMgbm9kZSB3aWxsIGJlIGNyZWF0ZWQgYXMKPiArRW5hYmxp bmcgQ09ORklHX1RIRVJNQUxfRU1VTEFUSU9OIG9wdGlvbiB3aWxsIG1ha2UgdGhpcyBzdXBwb3J0 Cj4gK2F2YWlsYWJsZS4gV2hlbiBpdCdzIGVuYWJsZWQsIHN5c2ZzIG5vZGUgd2lsbCBiZSBjcmVh dGVkIGFzCj4gwqAvc3lzL2RldmljZXMvdmlydHVhbC90aGVybWFsL3RoZXJtYWxfem9uZSd6b25l IGlkJy9lbXVsX3RlbXAuCj4gwqAKPiAtVGhlIHN5c2ZzIG5vZGUsICdlbXVsX25vZGUnLCB3aWxs IGNvbnRhaW4gdmFsdWUgMCBmb3IgdGhlIGluaXRpYWwKPiBzdGF0ZS4gV2hlbiB5b3UgaW5wdXQg YW55Cj4gLXRlbXBlcmF0dXJlIHlvdSB3YW50IHRvIHVwZGF0ZSB0byBzeXNmcyBub2RlLCBpdCBh dXRvbWF0aWNhbGx5Cj4gZW5hYmxlIGVtdWxhdGlvbiBtb2RlIGFuZAo+IC1jdXJyZW50IHRlbXBl cmF0dXJlIHdpbGwgYmUgY2hhbmdlZCBpbnRvIGl0Lgo+IC0oRXh5bm9zIGFsc28gc3VwcG9ydHMg dXNlciBjaGFuZ2VhYmxlIGRlbGF5IHRpbWUgd2hpY2ggd291bGQgYmUgdXNlZAo+IHRvIGRlbGF5 IG9mCj4gLSBjaGFuZ2luZyB0ZW1wZXJhdHVyZS4gSG93ZXZlciwgdGhpcyBub2RlIG9ubHkgdXNl cyBzYW1lIGRlbGF5IG9mCj4gcmVhbCBzZW5zaW5nIHRpbWUsIDkzOHVzLikKPiArVGhlIHN5c2Zz IG5vZGUsICdlbXVsX25vZGUnLCB3aWxsIGNvbnRhaW4gdmFsdWUgMCBmb3IgdGhlIGluaXRpYWwK PiBzdGF0ZS4KPiArV2hlbiB5b3UgaW5wdXQgYW55IHRlbXBlcmF0dXJlIHlvdSB3YW50IHRvIHVw ZGF0ZSB0byBzeXNmcyBub2RlLCBpdAo+ICthdXRvbWF0aWNhbGx5IGVuYWJsZSBlbXVsYXRpb24g bW9kZSBhbmQgY3VycmVudCB0ZW1wZXJhdHVyZSB3aWxsIGJlCj4gK2NoYW5nZWQgaW50byBpdC4K PiDCoAo+IC1FeHlub3MgZW11bGF0aW9uIG1vZGUgcmVxdWlyZXMgc3luY2hyb25vdXMgb2YgdmFs dWUgY2hhbmdpbmcgYW5kCj4gZW5hYmxpbmcuIEl0IG1lYW5zIHdoZW4geW91Cj4gLXdhbnQgdG8g dXBkYXRlIHRoZSBhbnkgdmFsdWUgb2YgZGVsYXkgb3IgbmV4dCB0ZW1wZXJhdHVyZSwgdGhlbiB5 b3UKPiBoYXZlIHRvIGVuYWJsZSBlbXVsYXRpb24KPiAtbW9kZSBhdCB0aGUgc2FtZSB0aW1lLiAo T3IgeW91IGhhdmUgdG8ga2VlcCB0aGUgbW9kZSBlbmFibGluZy4pIElmCj4geW91IGRvbid0LCBp dCBmYWlscyB0bwo+IC1jaGFuZ2UgdGhlIHZhbHVlIHRvIHVwZGF0ZWQgb25lIGFuZCBqdXN0IHVz ZSBsYXN0IHN1Y2NlZXNzZnVsIHZhbHVlCj4gcmVwZWF0ZWRseS4gVGhhdCdzIHdoeQo+IC10aGlz IG5vZGUgZ2l2ZXMgdXNlcnMgdGhlIHJpZ2h0IHRvIGNoYW5nZSB0ZXJtZXJwYXR1cmUgb25seS4g SnVzdAo+IG9uZSBpbnRlcmZhY2UgbWFrZXMgaXQgbW9yZQo+IC1zaW1wbHkgdG8gdXNlLgo+ICso RXh5bm9zIGFsc28gc3VwcG9ydHMgdXNlciBjaGFuZ2VhYmxlIGRlbGF5IHRpbWUgd2hpY2ggd291 bGQgYmUgdXNlZAo+IHRvCj4gK2RlbGF5IG9mIGNoYW5naW5nIHRlbXBlcmF0dXJlLiBIb3dldmVy LCB0aGlzIG5vZGUgb25seSB1c2VzIHNhbWUKPiBkZWxheQo+ICtvZiByZWFsIHNlbnNpbmcgdGlt ZSwgOTM4dXMuKQo+ICsKPiArRXh5bm9zIGVtdWxhdGlvbiBtb2RlIHJlcXVpcmVzIHN5bmNocm9u b3VzIG9mIHZhbHVlIGNoYW5naW5nIGFuZAo+ICtlbmFibGluZy4gSXQgbWVhbnMgd2hlbiB5b3Ug d2FudCB0byB1cGRhdGUgdGhlIGFueSB2YWx1ZSBvZiBkZWxheSBvcgo+ICtuZXh0IHRlbXBlcmF0 dXJlLCB0aGVuIHlvdSBoYXZlIHRvIGVuYWJsZSBlbXVsYXRpb24gbW9kZSBhdCB0aGUgc2FtZQo+ ICt0aW1lLiAoT3IgeW91IGhhdmUgdG8ga2VlcCB0aGUgbW9kZSBlbmFibGluZy4pIElmIHlvdSBk b24ndCwgaXQKPiBmYWlscyB0bwo+ICtjaGFuZ2UgdGhlIHZhbHVlIHRvIHVwZGF0ZWQgb25lIGFu ZCBqdXN0IHVzZSBsYXN0IHN1Y2NlZXNzZnVsIHZhbHVlCj4gK3JlcGVhdGVkbHkuIFRoYXQncyB3 aHkgdGhpcyBub2RlIGdpdmVzIHVzZXJzIHRoZSByaWdodCB0byBjaGFuZ2UKPiArdGVybWVycGF0 dXJlIG9ubHkuIEp1c3Qgb25lIGludGVyZmFjZSBtYWtlcyBpdCBtb3JlIHNpbXBseSB0byB1c2Uu Cj4gwqAKPiDCoERpc2FibGluZyBlbXVsYXRpb24gbW9kZSBvbmx5IHJlcXVpcmVzIHdyaXRpbmcg dmFsdWUgMCB0byBzeXNmcwo+IG5vZGUuCj4gwqAKPiArOjoKPiDCoAo+IC1URU1QCTEyMCB8Cj4g Kwo+ICvCoMKgVEVNUAkxMjAgfAo+IMKgCcKgwqDCoMKgfAo+IMKgCTEwMCB8Cj4gwqAJwqDCoMKg wqB8Cj4gwqAJwqA4MCB8Cj4gLQnCoMKgwqDCoHwJCcKgwqDCoMKgwqAJwqAJwqArLS0tLS0tLS0t LS0KPiAtCcKgNjAgfMKgwqDCoMKgwqDCoAkJwqDCoMKgwqDCoAnCoHwJwqDCoMKgwqB8Cj4gLQnC oMKgwqDCoHwJwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCstLS0tLS0tLS0tLS0tfMKgwqDCoMKgwqDC oMKgwqDCoMKgfAo+ICsJwqDCoMKgwqB8CQkJCcKgKy0tLS0tLS0tLS0tCj4gKwnCoDYwIHzCoMKg wqDCoMKgwqAJCQnCoHwJwqDCoMKgwqB8Cj4gKwnCoMKgwqDCoHwJCcKgwqDCoCstLS0tLS0tLS0t LS0tfMKgwqDCoMKgwqDCoMKgwqDCoMKgfAo+IMKgCcKgNDAgfMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqB8wqDCoMKgwqDCoMKgwqDCoMKgCcKgfMKgwqDCoMKgwqDCoMKgwqDCoMKgfAo+IC0J wqDCoMKgwqB8CQnCoMKgwqB8CcKgwqDCoMKgwqAJwqB8wqDCoMKgwqDCoMKgwqDCoMKgwqB8Cj4g LQnCoDIwIHwJCcKgwqDCoHwJwqDCoMKgwqDCoAnCoHzCoMKgwqDCoMKgwqDCoMKgwqDCoCstCj4g LS0tLS0tLS0tCj4gLQnCoMKgwqDCoHwJwqAJwqDCoMKgfAnCoMKgwqDCoMKgCcKgfMKgwqDCoMKg wqDCoMKgwqDCoMKgfAo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgfAo+ICsJwqDCoMKgwqB8CQnCoMKg wqB8CQnCoHzCoMKgwqDCoMKgwqDCoMKgwqDCoHwKPiArCcKgMjAgfAkJwqDCoMKgfAkJwqB8wqDC oMKgwqDCoMKgwqDCoMKgwqArLS0tLQo+IC0tLS0tLQo+ICsJwqDCoMKgwqB8CQnCoMKgwqB8CQnC oHzCoMKgwqDCoMKgwqDCoMKgwqDCoHzCoMKgwqDCoMKgwqAKPiDCoMKgwqDCoHwKPiDCoAnCoMKg MAo+IHxfX19fX19fX19fX19fX3xfX19fX19fX19fX19ffF9fX19fX19fX198X19fX19fX19fX3xf X19fX19fX18KPiAtCQnCoMKgwqBBCcKgwqDCoMKgCcKgQQnCoMKgwqDCoEEJwqDCoMKgCQo+IMKg wqDCoMKgwqDCoMKgQcKgwqDCoMKgwqBUSU1FCj4gKwkJwqDCoMKgQQkJwqBBCcKgwqDCoMKgQQkJ wqAKPiDCoMKgwqDCoMKgwqBBwqDCoMKgwqDCoFRJTUUKPiDCoAkJwqDCoMKgfDwtLS0tLT58CcKg fDwtLS0tLT58wqDCoHw8LS0tLS0+fAnCoMKgwqAKPiDCoMKgwqDCoHwKPiDCoAkJwqDCoMKgfCA5 Mzh1cyB8wqDCoAnCoHwJwqB8wqDCoHzCoMKgwqDCoMKgwqDCoHzCoMKgwqDCoMKgwqDCoAo+IMKg wqDCoHwKPiAtZW11bGF0aW9uwqDCoMKgwqA6wqDCoDDCoMKgNTAJwqDCoMKgfMKgwqAJwqA3MMKg wqDCoMKgwqDCoHzCoMKgMjDCoMKgwqDCoMKgwqB8wqDCoMKgwqAKPiDCoMKgwqDCoMKgwqAwCj4g LWN1cnJlbnQgdGVtcCA6wqDCoMKgc2Vuc29ywqDCoMKgNTAJCcKgNzDCoMKgwqDCoMKgwqDCoMKg wqAyMAnCoMKgCj4gwqDCoMKgwqBzZW5zb3IKPiArwqDCoGVtdWxhdGlvbsKgwqDCoDogMMKgwqA1 MAnCoMKgwqB8wqDCoAnCoDcwwqDCoMKgwqDCoMKgfMKgwqAyMMKgwqDCoMKgwqDCoHzCoMKgwqDC oAo+IMKgwqDCoMKgwqDCoDAKPiArwqDCoGN1cnJlbnQgdGVtcDrCoMKgwqBzZW5zb3LCoMKgwqA1 MAkJwqA3MMKgwqDCoMKgwqDCoMKgwqDCoDIwCcKgCj4gwqDCoMKgwqDCoHNlbnNvcgo+IGRpZmYg LS1naXQgYS9Eb2N1bWVudGF0aW9uL3RoZXJtYWwvaW5kZXgucnN0Cj4gYi9Eb2N1bWVudGF0aW9u L3RoZXJtYWwvaW5kZXgucnN0Cj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAw MDAwMDAuLjhjMWMwMDE0NmNhZAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9Eb2N1bWVudGF0aW9u L3RoZXJtYWwvaW5kZXgucnN0Cj4gQEAgLTAsMCArMSwxOCBAQAo+ICs6b3JwaGFuOgo+ICsKPiAr PT09PT09PQo+ICtUaGVybWFsCj4gKz09PT09PT0KPiArCj4gKy4uIHRvY3RyZWU6Ogo+ICvCoMKg wqA6bWF4ZGVwdGg6IDEKPiArCj4gK8KgwqDCoGNwdS1jb29saW5nLWFwaQo+ICvCoMKgwqBzeXNm cy1hcGkKPiArwqDCoMKgcG93ZXJfYWxsb2NhdG9yCj4gKwo+ICvCoMKgwqBleHlub3NfdGhlcm1h bAo+ICvCoMKgwqBleHlub3NfdGhlcm1hbF9lbXVsYXRpb24KPiArwqDCoMKgaW50ZWxfcG93ZXJj bGFtcAo+ICvCoMKgwqBub3V2ZWF1X3RoZXJtYWwKPiArwqDCoMKgeDg2X3BrZ190ZW1wZXJhdHVy ZV90aGVybWFsCj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGhlcm1hbC9pbnRlbF9wb3dl cmNsYW1wLnR4dAo+IGIvRG9jdW1lbnRhdGlvbi90aGVybWFsL2ludGVsX3Bvd2VyY2xhbXAucnN0 Cj4gc2ltaWxhcml0eSBpbmRleCA3NiUKPiByZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL3RoZXJt YWwvaW50ZWxfcG93ZXJjbGFtcC50eHQKPiByZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi90aGVybWFs L2ludGVsX3Bvd2VyY2xhbXAucnN0Cj4gaW5kZXggYjVkZjIxMTY4ZmJjLi4zZjZkZmIwYjNlYTYg MTAwNjQ0Cj4gLS0tIGEvRG9jdW1lbnRhdGlvbi90aGVybWFsL2ludGVsX3Bvd2VyY2xhbXAudHh0 Cj4gKysrIGIvRG9jdW1lbnRhdGlvbi90aGVybWFsL2ludGVsX3Bvd2VyY2xhbXAucnN0Cj4gQEAg LTEsMTAgKzEsMTMgQEAKPiAtCQkJwqA9PT09PT09PT09PT09PT09PT09PT09PQo+IC0JCQnCoElO VEVMIFBPV0VSQ0xBTVAgRFJJVkVSCj4gLQkJCcKgPT09PT09PT09PT09PT09PT09PT09PT0KPiAt Qnk6IEFyamFuIHZhbiBkZSBWZW4gPGFyamFuQGxpbnV4LmludGVsLmNvbT4KPiAtwqDCoMKgwqBK YWNvYiBQYW4gPGphY29iLmp1bi5wYW5AbGludXguaW50ZWwuY29tPgo+ICs9PT09PT09PT09PT09 PT09PT09PT09PQo+ICtJbnRlbCBQb3dlcmNsYW1wIERyaXZlcgo+ICs9PT09PT09PT09PT09PT09 PT09PT09PQo+ICsKPiArQnk6Cj4gK8KgwqAtIEFyamFuIHZhbiBkZSBWZW4gPGFyamFuQGxpbnV4 LmludGVsLmNvbT4KPiArwqDCoC0gSmFjb2IgUGFuIDxqYWNvYi5qdW4ucGFuQGxpbnV4LmludGVs LmNvbT4KPiArCj4gKy4uIENvbnRlbnRzOgo+IMKgCj4gLUNvbnRlbnRzOgo+IMKgCSgqKSBJbnRy b2R1Y3Rpb24KPiDCoAnCoMKgwqDCoC0gR29hbHMgYW5kIE9iamVjdGl2ZXMKPiDCoAo+IEBAIC0y Myw3ICsyNiw2IEBAIENvbnRlbnRzOgo+IMKgCcKgwqDCoMKgLSBHZW5lcmljIFRoZXJtYWwgTGF5 ZXIgKHN5c2ZzKQo+IMKgCcKgwqDCoMKgLSBLZXJuZWwgQVBJcyAoVEJEKQo+IMKgCj4gLT09PT09 PT09PT09PQo+IMKgSU5UUk9EVUNUSU9OCj4gwqA9PT09PT09PT09PT0KPiDCoAo+IEBAIC00Nyw3 ICs0OSw2IEBAIHNjYWxhYmlsaXR5LCBhbmQgdXNlciBleHBlcmllbmNlLiBJbiBtYW55IGNhc2Vz LAo+IGNsZWFyIGFkdmFudGFnZSBpcwo+IMKgc2hvd24gb3ZlciB0YWtpbmcgdGhlIENQVSBvZmZs aW5lIG9yIG1vZHVsYXRpbmcgdGhlIENQVSBjbG9jay4KPiDCoAo+IMKgCj4gLT09PT09PT09PT09 PT09PT09PT0KPiDCoFRIRU9SWSBPRiBPUEVSQVRJT04KPiDCoD09PT09PT09PT09PT09PT09PT0K PiDCoAo+IEBAIC01NywxMSArNTgsMTIgQEAgSWRsZSBJbmplY3Rpb24KPiDCoE9uIG1vZGVybiBJ bnRlbCBwcm9jZXNzb3JzIChOZWhhbGVtIG9yIGxhdGVyKSwgcGFja2FnZSBsZXZlbCBDLXN0YXRl Cj4gwqByZXNpZGVuY3kgaXMgYXZhaWxhYmxlIGluIE1TUnMsIHRodXMgYWxzbyBhdmFpbGFibGUg dG8gdGhlIGtlcm5lbC4KPiDCoAo+IC1UaGVzZSBNU1JzIGFyZToKPiAtwqDCoMKgwqDCoMKgI2Rl ZmluZSBNU1JfUEtHX0MyX1JFU0lERU5DWQkweDYwRAo+IC3CoMKgwqDCoMKgwqAjZGVmaW5lIE1T Ul9QS0dfQzNfUkVTSURFTkNZCTB4M0Y4Cj4gLcKgwqDCoMKgwqDCoCNkZWZpbmUgTVNSX1BLR19D Nl9SRVNJREVOQ1kJMHgzRjkKPiAtwqDCoMKgwqDCoMKgI2RlZmluZSBNU1JfUEtHX0M3X1JFU0lE RU5DWQkweDNGQQo+ICtUaGVzZSBNU1JzIGFyZTo6Cj4gKwo+ICvCoMKgwqDCoMKgwqAjZGVmaW5l IE1TUl9QS0dfQzJfUkVTSURFTkNZwqDCoMKgwqDCoMKgMHg2MEQKPiArwqDCoMKgwqDCoMKgI2Rl ZmluZSBNU1JfUEtHX0MzX1JFU0lERU5DWcKgwqDCoMKgwqDCoDB4M0Y4Cj4gK8KgwqDCoMKgwqDC oCNkZWZpbmUgTVNSX1BLR19DNl9SRVNJREVOQ1nCoMKgwqDCoMKgwqAweDNGOQo+ICvCoMKgwqDC oMKgwqAjZGVmaW5lIE1TUl9QS0dfQzdfUkVTSURFTkNZwqDCoMKgwqDCoMKgMHgzRkEKPiDCoAo+ IMKgSWYgdGhlIGtlcm5lbCBjYW4gYWxzbyBpbmplY3QgaWRsZSB0aW1lIHRvIHRoZSBzeXN0ZW0s IHRoZW4gYQo+IMKgY2xvc2VkLWxvb3AgY29udHJvbCBzeXN0ZW0gY2FuIGJlIGVzdGFibGlzaGVk IHRoYXQgbWFuYWdlcyBwYWNrYWdlCj4gQEAgLTk2LDE5ICs5OCwyMSBAQCBhcmUgbm90IG1hc2tl ZC4gVGVzdHMgc2hvdyB0aGF0IHRoZSBleHRyYSB3YWtldXBzCj4gZnJvbSBzY2hlZHVsZXIgdGlj awo+IMKgaGF2ZSBhIGRyYW1hdGljIGltcGFjdCBvbiB0aGUgZWZmZWN0aXZlbmVzcyBvZiB0aGUg cG93ZXJjbGFtcCBkcml2ZXIKPiDCoG9uIGxhcmdlIHNjYWxlIHN5c3RlbXMgKFdlc3RtZXJlIHN5 c3RlbSB3aXRoIDgwIHByb2Nlc3NvcnMpLgo+IMKgCj4gLUNQVTAKPiAtCQnCoMKgX19fX19fX19f X19fwqDCoMKgwqDCoMKgwqDCoMKgwqBfX19fX19fX19fX18KPiAta2lkbGVfaW5qZWN0LzDCoMKg wqB8wqDCoMKgc2xlZXDCoMKgwqDCoHzCoMKgbXdhaXQgfMKgwqBzbGVlcMKgwqDCoMKgwqB8Cj4g LQlfX19fX19fX198wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfF9fX19fX19ffMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHxfX19fX19fCj4gLQkJCcKgwqDCoMKgwqDCoMKgZHVyYXRpb24KPiAtQ1BV MQo+IC0JCcKgwqBfX19fX19fX19fX1/CoMKgwqDCoMKgwqDCoMKgwqDCoF9fX19fX19fX19fXwo+ IC1raWRsZV9pbmplY3QvMcKgwqDCoHzCoMKgwqBzbGVlcMKgwqDCoMKgfMKgwqBtd2FpdCB8wqDC oHNsZWVwwqDCoMKgwqDCoHwKPiAtCV9fX19fX19fX3zCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8 X19fX19fX198wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfF9fX19fX18KPiAtCQkJwqDCoMKgwqDC oMKgXgo+IC0JCQnCoMKgwqDCoMKgwqB8Cj4gLQkJCcKgwqDCoMKgwqDCoHwKPiAtCQkJwqDCoMKg wqDCoMKgcm91bmR1cChqaWZmaWVzLCBpbnRlcnZhbCkKPiArOjoKPiArCj4gK8KgwqBDUFUwCj4g KwkJwqDCoMKgwqBfX19fX19fX19fX1/CoMKgwqDCoMKgwqDCoMKgwqDCoF9fX19fX19fX19fXwo+ ICvCoMKga2lkbGVfaW5qZWN0LzDCoMKgwqB8wqDCoMKgc2xlZXDCoMKgwqDCoHzCoMKgbXdhaXQg fMKgwqBzbGVlcMKgwqDCoMKgwqB8Cj4gKwnCoMKgX19fX19fX19ffMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHxfX19fX19fX3zCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8X19fX19fXwo+ICsJCQkJ wqBkdXJhdGlvbgo+ICvCoMKgQ1BVMQo+ICsJCcKgwqDCoMKgX19fX19fX19fX19fwqDCoMKgwqDC oMKgwqDCoMKgwqBfX19fX19fX19fX18KPiArwqDCoGtpZGxlX2luamVjdC8xwqDCoMKgfMKgwqDC oHNsZWVwwqDCoMKgwqB8wqDCoG13YWl0IHzCoMKgc2xlZXDCoMKgwqDCoMKgfAo+ICsJwqDCoF9f X19fX19fX3zCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8X19fX19fX198wqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgfF9fX19fX18KPiArCQkJCV4KPiArCQkJCXwKPiArCQkJCXwKPiArCQkJCXJvdW5k dXAoamlmZmllcywgaW50ZXJ2YWwpCj4gwqAKPiDCoE9ubHkgb25lIENQVSBpcyBhbGxvd2VkIHRv IGNvbGxlY3Qgc3RhdGlzdGljcyBhbmQgdXBkYXRlIGdsb2JhbAo+IMKgY29udHJvbCBwYXJhbWV0 ZXJzLiBUaGlzIENQVSBpcyByZWZlcnJlZCB0byBhcyB0aGUgY29udHJvbGxpbmcgQ1BVCj4gaW4K PiBAQCAtMTQ4LDcgKzE1Miw3IEBAIGIpIGRldGVybWluZSB0aGUgYW1vdW50IG9mIGNvbXBlbnNh dGlvbiBuZWVkZWQgYXQKPiBlYWNoIHRhcmdldCByYXRpbwo+IMKgCj4gwqBDb21wZW5zYXRpb24g dG8gZWFjaCB0YXJnZXQgcmF0aW8gY29uc2lzdHMgb2YgdHdvIHBhcnRzOgo+IMKgCj4gLcKgwqDC oMKgwqDCoMKgwqBhKSBzdGVhZHkgc3RhdGUgZXJyb3IgY29tcGVuc2F0aW9uCj4gKwlhKSBzdGVh ZHkgc3RhdGUgZXJyb3IgY29tcGVuc2F0aW9uCj4gwqAJVGhpcyBpcyB0byBvZmZzZXQgdGhlIGVy cm9yIG9jY3VycmluZyB3aGVuIHRoZSBzeXN0ZW0gY2FuCj4gwqAJZW50ZXIgaWRsZSB3aXRob3V0 IGV4dHJhIHdha2V1cHMgKHN1Y2ggYXMgZXh0ZXJuYWwKPiBpbnRlcnJ1cHRzKS4KPiDCoAo+IEBA IC0xNTgsNDEgKzE2Miw0MiBAQCBDb21wZW5zYXRpb24gdG8gZWFjaCB0YXJnZXQgcmF0aW8gY29u c2lzdHMgb2YKPiB0d28gcGFydHM6Cj4gwqAJc2xvd2luZyBkb3duIENQVSBhY3Rpdml0aWVzLgo+ IMKgCj4gwqBBIGRlYnVnZnMgZmlsZSBpcyBwcm92aWRlZCBmb3IgdGhlIHVzZXIgdG8gZXhhbWlu ZSBjb21wZW5zYXRpb24KPiAtcHJvZ3Jlc3MgYW5kIHJlc3VsdHMsIHN1Y2ggYXMgb24gYSBXZXN0 bWVyZSBzeXN0ZW0uCj4gLVtqYWNvYkBuZXgwMSB+XSQgY2F0Cj4gLS9zeXMva2VybmVsL2RlYnVn L2ludGVsX3Bvd2VyY2xhbXAvcG93ZXJjbGFtcF9jYWxpYgo+IC1jb250cm9sbGluZyBjcHU6IDAK PiAtcGN0IGNvbmZpZGVuY2Ugc3RlYWR5IGR5bmFtaWMgKGNvbXBlbnNhdGlvbikKPiAtMAkwCTAJ MAo+IC0xCTEJMAkwCj4gLTIJMQkxCTAKPiAtMwkzCTEJMAo+IC00CTMJMQkwCj4gLTUJMwkxCTAK PiAtNgkzCTEJMAo+IC03CTMJMQkwCj4gLTgJMwkxCTAKPiAtLi4uCj4gLTMwCTMJMgkwCj4gLTMx CTMJMgkwCj4gLTMyCTMJMQkwCj4gLTMzCTMJMgkwCj4gLTM0CTMJMQkwCj4gLTM1CTMJMgkwCj4g LTM2CTMJMQkwCj4gLTM3CTMJMgkwCj4gLTM4CTMJMQkwCj4gLTM5CTMJMgkwCj4gLTQwCTMJMwkw Cj4gLTQxCTMJMQkwCj4gLTQyCTMJMgkwCj4gLTQzCTMJMQkwCj4gLTQ0CTMJMQkwCj4gLTQ1CTMJ MgkwCj4gLTQ2CTMJMwkwCj4gLTQ3CTMJMAkwCj4gLTQ4CTMJMgkwCj4gLTQ5CTMJMwkwCj4gK3By b2dyZXNzIGFuZCByZXN1bHRzLCBzdWNoIGFzIG9uIGEgV2VzdG1lcmUgc3lzdGVtOjoKPiArCj4g K8KgwqBbamFjb2JAbmV4MDEgfl0kIGNhdAo+ICvCoMKgL3N5cy9rZXJuZWwvZGVidWcvaW50ZWxf cG93ZXJjbGFtcC9wb3dlcmNsYW1wX2NhbGliCj4gK8KgwqBjb250cm9sbGluZyBjcHU6IDAKPiAr wqDCoHBjdCBjb25maWRlbmNlIHN0ZWFkeSBkeW5hbWljIChjb21wZW5zYXRpb24pCj4gK8KgwqAw wqDCoMKgwqDCoMKgwqAwwqDCoMKgwqDCoMKgwqAwwqDCoMKgwqDCoMKgwqAwCj4gK8KgwqAxwqDC oMKgwqDCoMKgwqAxwqDCoMKgwqDCoMKgwqAwwqDCoMKgwqDCoMKgwqAwCj4gK8KgwqAywqDCoMKg wqDCoMKgwqAxwqDCoMKgwqDCoMKgwqAxwqDCoMKgwqDCoMKgwqAwCj4gK8KgwqAzwqDCoMKgwqDC oMKgwqAzwqDCoMKgwqDCoMKgwqAxwqDCoMKgwqDCoMKgwqAwCj4gK8KgwqA0wqDCoMKgwqDCoMKg wqAzwqDCoMKgwqDCoMKgwqAxwqDCoMKgwqDCoMKgwqAwCj4gK8KgwqA1wqDCoMKgwqDCoMKgwqAz wqDCoMKgwqDCoMKgwqAxwqDCoMKgwqDCoMKgwqAwCj4gK8KgwqA2wqDCoMKgwqDCoMKgwqAzwqDC oMKgwqDCoMKgwqAxwqDCoMKgwqDCoMKgwqAwCj4gK8KgwqA3wqDCoMKgwqDCoMKgwqAzwqDCoMKg wqDCoMKgwqAxwqDCoMKgwqDCoMKgwqAwCj4gK8KgwqA4wqDCoMKgwqDCoMKgwqAzwqDCoMKgwqDC oMKgwqAxwqDCoMKgwqDCoMKgwqAwCj4gK8KgwqAuLi4KPiArwqDCoDMwwqDCoMKgwqDCoMKgM8Kg wqDCoMKgwqDCoMKgMsKgwqDCoMKgwqDCoMKgMAo+ICvCoMKgMzHCoMKgwqDCoMKgwqAzwqDCoMKg wqDCoMKgwqAywqDCoMKgwqDCoMKgwqAwCj4gK8KgwqAzMsKgwqDCoMKgwqDCoDPCoMKgwqDCoMKg wqDCoDHCoMKgwqDCoMKgwqDCoDAKPiArwqDCoDMzwqDCoMKgwqDCoMKgM8KgwqDCoMKgwqDCoMKg MsKgwqDCoMKgwqDCoMKgMAo+ICvCoMKgMzTCoMKgwqDCoMKgwqAzwqDCoMKgwqDCoMKgwqAxwqDC oMKgwqDCoMKgwqAwCj4gK8KgwqAzNcKgwqDCoMKgwqDCoDPCoMKgwqDCoMKgwqDCoDLCoMKgwqDC oMKgwqDCoDAKPiArwqDCoDM2wqDCoMKgwqDCoMKgM8KgwqDCoMKgwqDCoMKgMcKgwqDCoMKgwqDC oMKgMAo+ICvCoMKgMzfCoMKgwqDCoMKgwqAzwqDCoMKgwqDCoMKgwqAywqDCoMKgwqDCoMKgwqAw Cj4gK8KgwqAzOMKgwqDCoMKgwqDCoDPCoMKgwqDCoMKgwqDCoDHCoMKgwqDCoMKgwqDCoDAKPiAr wqDCoDM5wqDCoMKgwqDCoMKgM8KgwqDCoMKgwqDCoMKgMsKgwqDCoMKgwqDCoMKgMAo+ICvCoMKg NDDCoMKgwqDCoMKgwqAzwqDCoMKgwqDCoMKgwqAzwqDCoMKgwqDCoMKgwqAwCj4gK8KgwqA0McKg wqDCoMKgwqDCoDPCoMKgwqDCoMKgwqDCoDHCoMKgwqDCoMKgwqDCoDAKPiArwqDCoDQywqDCoMKg wqDCoMKgM8KgwqDCoMKgwqDCoMKgMsKgwqDCoMKgwqDCoMKgMAo+ICvCoMKgNDPCoMKgwqDCoMKg wqAzwqDCoMKgwqDCoMKgwqAxwqDCoMKgwqDCoMKgwqAwCj4gK8KgwqA0NMKgwqDCoMKgwqDCoDPC oMKgwqDCoMKgwqDCoDHCoMKgwqDCoMKgwqDCoDAKPiArwqDCoDQ1wqDCoMKgwqDCoMKgM8KgwqDC oMKgwqDCoMKgMsKgwqDCoMKgwqDCoMKgMAo+ICvCoMKgNDbCoMKgwqDCoMKgwqAzwqDCoMKgwqDC oMKgwqAzwqDCoMKgwqDCoMKgwqAwCj4gK8KgwqA0N8KgwqDCoMKgwqDCoDPCoMKgwqDCoMKgwqDC oDDCoMKgwqDCoMKgwqDCoDAKPiArwqDCoDQ4wqDCoMKgwqDCoMKgM8KgwqDCoMKgwqDCoMKgMsKg wqDCoMKgwqDCoMKgMAo+ICvCoMKgNDnCoMKgwqDCoMKgwqAzwqDCoMKgwqDCoMKgwqAzwqDCoMKg wqDCoMKgwqAwCj4gwqAKPiDCoENhbGlicmF0aW9uIG9jY3VycyBkdXJpbmcgcnVudGltZS4gTm8g b2ZmbGluZSBtZXRob2QgaXMgYXZhaWxhYmxlLgo+IMKgU3RlYWR5IHN0YXRlIGNvbXBlbnNhdGlv biBpcyB1c2VkIG9ubHkgd2hlbiBjb25maWRlbmNlIGxldmVscyBvZiBhbGwKPiBAQCAtMjE3LDkg KzIyMiw4IEBAIGtlZXBzIHRyYWNrIG9mIGNsYW1waW5nIGtlcm5lbCB0aHJlYWRzLCBldmVuCj4g YWZ0ZXIgdGhleSBhcmUgbWlncmF0ZWQKPiDCoHRvIG90aGVyIENQVXMsIGFmdGVyIGEgQ1BVIG9m ZmxpbmUgZXZlbnQuCj4gwqAKPiDCoAo+IC09PT09PT09PT09PT09PT09PT09PT0KPiDCoFBlcmZv cm1hbmNlIEFuYWx5c2lzCj4gLT09PT09PT09PT09PT09PT09PT09PQo+ICs9PT09PT09PT09PT09 PT09PT09PQo+IMKgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZ2VuZXJhbCBwZXJmb3JtYW5j ZSBkYXRhIGNvbGxlY3RlZCBvbgo+IMKgbXVsdGlwbGUgc3lzdGVtcywgaW5jbHVkaW5nIFdlc3Rt ZXJlICg4MFApIGFuZCBJdnkgQnJpZGdlICg0UCwgOFApLgo+IMKgCj4gQEAgLTI1NywxNiArMjYx LDE1IEBAIGFjaGlldmUgdXAgdG8gNDAlIGJldHRlciBwZXJmb3JtYW5jZSBwZXIgd2F0dC4KPiAo bWVhc3VyZWQgYnkgYSBzcGluCj4gwqBjb3VudGVyIHN1bW1lZCBvdmVyIHBlciBDUFUgY291bnRp bmcgdGhyZWFkcyBzcGF3bmVkIGZvciBhbGwgcnVubmluZwo+IMKgQ1BVcykuCj4gwqAKPiAtPT09 PT09PT09PT09PT09PT09PT0KPiDCoFVzYWdlIGFuZCBJbnRlcmZhY2VzCj4gwqA9PT09PT09PT09 PT09PT09PT09PQo+IMKgVGhlIHBvd2VyY2xhbXAgZHJpdmVyIGlzIHJlZ2lzdGVyZWQgdG8gdGhl IGdlbmVyaWMgdGhlcm1hbCBsYXllciBhcwo+IGEKPiAtY29vbGluZyBkZXZpY2UuIEN1cnJlbnRs eSwgaXTigJlzIG5vdCBib3VuZCB0byBhbnkgdGhlcm1hbCB6b25lcy4KPiArY29vbGluZyBkZXZp Y2UuIEN1cnJlbnRseSwgaXTigJlzIG5vdCBib3VuZCB0byBhbnkgdGhlcm1hbCB6b25lczo6Cj4g wqAKPiAtamFjb2JAY2hyb21vbHk6L3N5cy9jbGFzcy90aGVybWFsL2Nvb2xpbmdfZGV2aWNlMTQk IGdyZXAgLiAqCj4gLWN1cl9zdGF0ZTowCj4gLW1heF9zdGF0ZTo1MAo+IC10eXBlOmludGVsX3Bv d2VyY2xhbXAKPiArwqDCoGphY29iQGNocm9tb2x5Oi9zeXMvY2xhc3MvdGhlcm1hbC9jb29saW5n X2RldmljZTE0JCBncmVwIC4gKgo+ICvCoMKgY3VyX3N0YXRlOjAKPiArwqDCoG1heF9zdGF0ZTo1 MAo+ICvCoMKgdHlwZTppbnRlbF9wb3dlcmNsYW1wCj4gwqAKPiDCoGN1cl9zdGF0ZSBhbGxvd3Mg dXNlciB0byBzZXQgdGhlIGRlc2lyZWQgaWRsZSBwZXJjZW50YWdlLiBXcml0aW5nIDAKPiB0bwo+ IMKgY3VyX3N0YXRlIHdpbGwgc3RvcCBpZGxlIGluamVjdGlvbi4gV3JpdGluZyBhIHZhbHVlIGJl dHdlZW4gMSBhbmQKPiBAQCAtMjc4LDkgKzI4MSw5IEBAIGN1cl9zdGF0ZSByZXR1cm5zIHZhbHVl IC0xIGluc3RlYWQgb2YgMCB3aGljaCBpcwo+IHRvIGF2b2lkIGNvbmZ1c2luZwo+IMKgMTAwJSBi dXN5IHN0YXRlIHdpdGggdGhlIGRpc2FibGVkIHN0YXRlLgo+IMKgCj4gwqBFeGFtcGxlIHVzYWdl Ogo+IC0tIFRvIGluamVjdCAyNSUgaWRsZSB0aW1lCj4gLSQgc3VkbyBzaCAtYyAiZWNobyAyNSA+ Cj4gL3N5cy9jbGFzcy90aGVybWFsL2Nvb2xpbmdfZGV2aWNlODAvY3VyX3N0YXRlCj4gLSIKPiAr LSBUbyBpbmplY3QgMjUlIGlkbGUgdGltZTo6Cj4gKwo+ICsJJCBzdWRvIHNoIC1jICJlY2hvIDI1 ID4KPiAvc3lzL2NsYXNzL3RoZXJtYWwvY29vbGluZ19kZXZpY2U4MC9jdXJfc3RhdGUKPiDCoAo+ IMKgSWYgdGhlIHN5c3RlbSBpcyBub3QgYnVzeSBhbmQgaGFzIG1vcmUgdGhhbiAyNSUgaWRsZSB0 aW1lIGFscmVhZHksCj4gwqB0aGVuIHRoZSBwb3dlcmNsYW1wIGRyaXZlciB3aWxsIG5vdCBzdGFy dCBpZGxlIGluamVjdGlvbi4gVXNpbmcgVG9wCj4gQEAgLTI5MiwyMyArMjk1LDIzIEBAIGlkbGUg dGltZSBpcyBhY2NvdW50ZWQgYXMgbm9ybWFsIGlkbGUgaW4gdGhhdAo+IGNvbW1vbiBjb2RlIHBh dGggaXMKPiDCoHRha2VuIGFzIHRoZSBpZGxlIHRhc2suCj4gwqAKPiDCoEluIHRoaXMgZXhhbXBs ZSwgMjQuMSUgaWRsZSBpcyBzaG93bi4gVGhpcyBoZWxwcyB0aGUgc3lzdGVtIGFkbWluIG9yCj4g LXVzZXIgZGV0ZXJtaW5lIHRoZSBjYXVzZSBvZiBzbG93ZG93biwgd2hlbiBhIHBvd2VyY2xhbXAg ZHJpdmVyIGlzIGluCj4gYWN0aW9uLgo+ICt1c2VyIGRldGVybWluZSB0aGUgY2F1c2Ugb2Ygc2xv d2Rvd24sIHdoZW4gYSBwb3dlcmNsYW1wIGRyaXZlciBpcyBpbgo+IGFjdGlvbjo6Cj4gwqAKPiDC oAo+IC1UYXNrczogMTk3IHRvdGFsLMKgwqDCoDEgcnVubmluZywgMTk2IHNsZWVwaW5nLMKgwqDC oDAgc3RvcHBlZCzCoMKgwqAwIHpvbWJpZQo+IC1DcHUocyk6IDcxLjIldXMswqDCoDQuNyVzeSzC oMKgMC4wJW5pLAo+IDI0LjElaWQswqDCoDAuMCV3YSzCoMKgMC4wJWhpLMKgwqAwLjAlc2kswqDC oDAuMCVzdAo+IC1NZW06wqDCoMKgMzk0MzIyOGsgdG90YWwswqDCoDE2ODk2MzJrIHVzZWQswqDC oDIyNTM1OTZrIGZyZWUswqDCoMKgwqA3NDk2MGsKPiBidWZmZXJzCj4gLVN3YXA6wqDCoDQwODc4 MDRrIHRvdGFsLMKgwqDCoMKgwqDCoMKgwqAwayB1c2VkLMKgwqA0MDg3ODA0ayBmcmVlLMKgwqDC oDk0NTMzNmsKPiBjYWNoZWQKPiArwqDCoFRhc2tzOiAxOTcgdG90YWwswqDCoMKgMSBydW5uaW5n LCAxOTYgc2xlZXBpbmcswqDCoMKgMCBzdG9wcGVkLMKgwqDCoDAKPiB6b21iaWUKPiArwqDCoENw dShzKTogNzEuMiV1cyzCoMKgNC43JXN5LMKgwqAwLjAlbmksCj4gMjQuMSVpZCzCoMKgMC4wJXdh LMKgwqAwLjAlaGkswqDCoDAuMCVzaSzCoMKgMC4wJXN0Cj4gK8KgwqBNZW06wqDCoMKgMzk0MzIy OGsgdG90YWwswqDCoDE2ODk2MzJrIHVzZWQswqDCoDIyNTM1OTZrIGZyZWUswqDCoMKgwqA3NDk2 MGsKPiBidWZmZXJzCj4gK8KgwqBTd2FwOsKgwqA0MDg3ODA0ayB0b3RhbCzCoMKgwqDCoMKgwqDC oMKgMGsgdXNlZCzCoMKgNDA4NzgwNGsgZnJlZSzCoMKgwqA5NDUzMzZrCj4gY2FjaGVkCj4gwqAK PiAtwqDCoFBJRCBVU0VSwqDCoMKgwqDCoMKgUFLCoMKgTknCoMKgVklSVMKgwqBSRVPCoMKgU0hS IFMgJUNQVSAlTUVNwqDCoMKgwqBUSU1FK8KgwqBDT01NQU5ECj4gLSAzMzUyIGphY29iwqDCoMKg wqDCoDIwwqDCoMKgMMKgwqAyNjJtwqDCoDY0NMKgwqA0MjggU8KgwqAyODbCoMKgMC4wwqDCoMKg MDoxNy4xNiBzcGluCj4gLSAzMzQxIHJvb3TCoMKgwqDCoMKgLTUxwqDCoMKgMMKgwqDCoMKgwqAw wqDCoMKgwqAwwqDCoMKgwqAwIETCoMKgwqAyNcKgwqAwLjDCoMKgwqAwOjAxLjYyCj4ga2lkbGVf aW5qZWN0LzAKPiAtIDMzNDQgcm9vdMKgwqDCoMKgwqAtNTHCoMKgwqAwwqDCoMKgwqDCoDDCoMKg wqDCoDDCoMKgwqDCoDAgRMKgwqDCoDI1wqDCoDAuMMKgwqDCoDA6MDEuNjAKPiBraWRsZV9pbmpl Y3QvMwo+IC0gMzM0MiByb290wqDCoMKgwqDCoC01McKgwqDCoDDCoMKgwqDCoMKgMMKgwqDCoMKg MMKgwqDCoMKgMCBEwqDCoMKgMjXCoMKgMC4wwqDCoMKgMDowMS42MQo+IGtpZGxlX2luamVjdC8x Cj4gLSAzMzQzIHJvb3TCoMKgwqDCoMKgLTUxwqDCoMKgMMKgwqDCoMKgwqAwwqDCoMKgwqAwwqDC oMKgwqAwIETCoMKgwqAyNcKgwqAwLjDCoMKgwqAwOjAxLjYwCj4ga2lkbGVfaW5qZWN0LzIKPiAt IDI5MzUgamFjb2LCoMKgwqDCoMKgMjDCoMKgwqAwwqDCoDY5Nm0gMTI1bcKgwqAzNW0gU8KgwqDC oMKgNcKgwqAzLjPCoMKgwqAwOjMxLjExIGZpcmVmb3gKPiAtIDE1NDYgcm9vdMKgwqDCoMKgwqDC oDIwwqDCoMKgMMKgwqAxNThtwqDCoDIwbSA2NjQwIFPCoMKgwqDCoDPCoMKgMC41wqDCoMKgMDoy Ni45NyBYb3JnCj4gLSAyMTAwIGphY29iwqDCoMKgwqDCoDIwwqDCoMKgMCAxMjIzbcKgwqA4OG3C oMKgMzBtIFPCoMKgwqDCoDPCoMKgMi4zwqDCoMKgMDoyMy42OCBjb21waXoKPiArwqDCoMKgwqBQ SUQgVVNFUsKgwqDCoMKgwqDCoFBSwqDCoE5JwqDCoFZJUlTCoMKgUkVTwqDCoFNIUiBTICVDUFUK PiAlTUVNwqDCoMKgwqBUSU1FK8KgwqBDT01NQU5ECj4gK8KgwqDCoDMzNTIgamFjb2LCoMKgwqDC oMKgMjDCoMKgwqAwwqDCoDI2Mm3CoMKgNjQ0wqDCoDQyOCBTwqDCoDI4NsKgwqAwLjDCoMKgwqAw OjE3LjE2IHNwaW4KPiArwqDCoMKgMzM0MSByb290wqDCoMKgwqDCoC01McKgwqDCoDDCoMKgwqDC oMKgMMKgwqDCoMKgMMKgwqDCoMKgMCBEwqDCoMKgMjXCoMKgMC4wwqDCoMKgMDowMS42Mgo+IGtp ZGxlX2luamVjdC8wCj4gK8KgwqDCoDMzNDQgcm9vdMKgwqDCoMKgwqAtNTHCoMKgwqAwwqDCoMKg wqDCoDDCoMKgwqDCoDDCoMKgwqDCoDAgRMKgwqDCoDI1wqDCoDAuMMKgwqDCoDA6MDEuNjAKPiBr aWRsZV9pbmplY3QvMwo+ICvCoMKgwqAzMzQyIHJvb3TCoMKgwqDCoMKgLTUxwqDCoMKgMMKgwqDC oMKgwqAwwqDCoMKgwqAwwqDCoMKgwqAwIETCoMKgwqAyNcKgwqAwLjDCoMKgwqAwOjAxLjYxCj4g a2lkbGVfaW5qZWN0LzEKPiArwqDCoMKgMzM0MyByb290wqDCoMKgwqDCoC01McKgwqDCoDDCoMKg wqDCoMKgMMKgwqDCoMKgMMKgwqDCoMKgMCBEwqDCoMKgMjXCoMKgMC4wwqDCoMKgMDowMS42MAo+ IGtpZGxlX2luamVjdC8yCj4gK8KgwqDCoDI5MzUgamFjb2LCoMKgwqDCoMKgMjDCoMKgwqAwwqDC oDY5Nm0gMTI1bcKgwqAzNW0gU8KgwqDCoMKgNcKgwqAzLjPCoMKgwqAwOjMxLjExCj4gZmlyZWZv eAo+ICvCoMKgwqAxNTQ2IHJvb3TCoMKgwqDCoMKgwqAyMMKgwqDCoDDCoMKgMTU4bcKgwqAyMG0g NjY0MCBTwqDCoMKgwqAzwqDCoDAuNcKgwqDCoDA6MjYuOTcgWG9yZwo+ICvCoMKgwqAyMTAwIGph Y29iwqDCoMKgwqDCoDIwwqDCoMKgMCAxMjIzbcKgwqA4OG3CoMKgMzBtIFPCoMKgwqDCoDPCoMKg Mi4zwqDCoMKgMDoyMy42OAo+IGNvbXBpego+IMKgCj4gwqBUZXN0cyBoYXZlIHNob3duIHRoYXQg YnkgdXNpbmcgdGhlIHBvd2VyY2xhbXAgZHJpdmVyIGFzIGEgY29vbGluZwo+IMKgZGV2aWNlLCBh IFBJRCBiYXNlZCB1c2Vyc3BhY2UgdGhlcm1hbCBjb250cm9sbGVyIGNhbiBtYW5hZ2UgdG8KPiBk aWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90aGVybWFsL25vdXZlYXVfdGhlcm1hbAo+IGIvRG9j dW1lbnRhdGlvbi90aGVybWFsL25vdXZlYXVfdGhlcm1hbC5yc3QKPiBzaW1pbGFyaXR5IGluZGV4 IDY0JQo+IHJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vdGhlcm1hbC9ub3V2ZWF1X3RoZXJtYWwK PiByZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi90aGVybWFsL25vdXZlYXVfdGhlcm1hbC5yc3QKPiBp bmRleCA2ZTE3YTExZWZjYjAuLjM3MjU1ZmQ2NzM1ZCAxMDA2NDQKPiAtLS0gYS9Eb2N1bWVudGF0 aW9uL3RoZXJtYWwvbm91dmVhdV90aGVybWFsCj4gKysrIGIvRG9jdW1lbnRhdGlvbi90aGVybWFs L25vdXZlYXVfdGhlcm1hbC5yc3QKPiBAQCAtMSwxMyArMSwxNSBAQAo+ICs9PT09PT09PT09PT09 PT09PT09PT0KPiDCoEtlcm5lbCBkcml2ZXIgbm91dmVhdQo+IC09PT09PT09PT09PT09PT09PT09 Cj4gKz09PT09PT09PT09PT09PT09PT09PQo+IMKgCj4gwqBTdXBwb3J0ZWQgY2hpcHM6Cj4gKwo+ IMKgKiBOVjQzKwo+IMKgCj4gwqBBdXRob3JzOiBNYXJ0aW4gUGVyZXMgKG11cHVmKSA8bWFydGlu LnBlcmVzQGZyZWUuZnI+Cj4gwqAKPiDCoERlc2NyaXB0aW9uCj4gLS0tLS0tLS0tLQo+ICstLS0t LS0tLS0tLQo+IMKgCj4gwqBUaGlzIGRyaXZlciBhbGxvd3MgdG8gcmVhZCB0aGUgR1BVIGNvcmUg dGVtcGVyYXR1cmUsIGRyaXZlIHRoZSBHUFUKPiBmYW4gYW5kCj4gwqBzZXQgdGVtcGVyYXR1cmUg YWxhcm1zLgo+IEBAIC0xOSwyMCArMjEsMjUgQEAgaW50ZXJmYWNlIGlzIGxpa2VseSBub3QgdG8g d29yay4gVGhpcyBkb2N1bWVudAo+IG1heSB0aGVuIG5vdCBjb3ZlciB5b3VyIHNpdHVhdGlvbgo+ IMKgZW50aXJlbHkuCj4gwqAKPiDCoFRlbXBlcmF0dXJlIG1hbmFnZW1lbnQKPiAtLS0tLS0tLS0t LS0tLS0tLS0tLS0KPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+IMKgCj4gwqBUZW1wZXJhdHVy ZSBpcyBleHBvc2VkIHVuZGVyIGFzIGEgcmVhZC1vbmx5IEhXTU9OIGF0dHJpYnV0ZQo+IHRlbXAx X2lucHV0Lgo+IMKgCj4gwqBJbiBvcmRlciB0byBwcm90ZWN0IHRoZSBHUFUgZnJvbSBvdmVyaGVh dGluZywgTm91dmVhdSBzdXBwb3J0cyA0Cj4gY29uZmlndXJhYmxlCj4gwqB0ZW1wZXJhdHVyZSB0 aHJlc2hvbGRzOgo+IMKgCj4gLSAqIEZhbl9ib29zdDogRmFuIHNwZWVkIGlzIHNldCB0byAxMDAl IHdoZW4gcmVhY2hpbmcgdGhpcwo+IHRlbXBlcmF0dXJlOwo+IC0gKiBEb3duY2xvY2s6IFRoZSBH UFUgd2lsbCBiZSBkb3duY2xvY2tlZCB0byByZWR1Y2UgaXRzIHBvd2VyCj4gZGlzc2lwYXRpb247 Cj4gLSAqIENyaXRpY2FsOiBUaGUgR1BVIGlzIHB1dCBvbiBob2xkIHRvIGZ1cnRoZXIgbG93ZXIg cG93ZXIKPiBkaXNzaXBhdGlvbjsKPiAtICogU2h1dGRvd246IFNodXQgdGhlIGNvbXB1dGVyIGRv d24gdG8gcHJvdGVjdCB5b3VyIEdQVS4KPiArICogRmFuX2Jvb3N0Ogo+ICsJRmFuIHNwZWVkIGlz IHNldCB0byAxMDAlIHdoZW4gcmVhY2hpbmcgdGhpcyB0ZW1wZXJhdHVyZTsKPiArICogRG93bmNs b2NrOgo+ICsJVGhlIEdQVSB3aWxsIGJlIGRvd25jbG9ja2VkIHRvIHJlZHVjZSBpdHMgcG93ZXIg ZGlzc2lwYXRpb247Cj4gKyAqIENyaXRpY2FsOgo+ICsJVGhlIEdQVSBpcyBwdXQgb24gaG9sZCB0 byBmdXJ0aGVyIGxvd2VyIHBvd2VyIGRpc3NpcGF0aW9uOwo+ICsgKiBTaHV0ZG93bjoKPiArCVNo dXQgdGhlIGNvbXB1dGVyIGRvd24gdG8gcHJvdGVjdCB5b3VyIEdQVS4KPiDCoAo+IC1XQVJOSU5H OiBTb21lIG9mIHRoZXNlIHRocmVzaG9sZHMgbWF5IG5vdCBiZSB1c2VkIGJ5IE5vdXZlYXUKPiBk ZXBlbmRpbmcKPiAtb24geW91ciBjaGlwc2V0Lgo+ICtXQVJOSU5HOgo+ICsJU29tZSBvZiB0aGVz ZSB0aHJlc2hvbGRzIG1heSBub3QgYmUgdXNlZCBieSBOb3V2ZWF1Cj4gZGVwZW5kaW5nCj4gKwlv biB5b3VyIGNoaXBzZXQuCj4gwqAKPiDCoFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGVzZSB0aHJl c2hvbGRzIGNvbWVzIGZyb20gdGhlIEdQVSdzIHZiaW9zLgo+IFRoZXNlCj4gwqB0aHJlc2hvbGRz IGNhbiBiZSBjb25maWd1cmVkIHRoYW5rcyB0byB0aGUgZm9sbG93aW5nIEhXTU9OCj4gYXR0cmli dXRlczoKPiBAQCAtNDYsMTkgKzUzLDI0IEBAIE5PVEU6IFJlbWVtYmVyIHRoYXQgdGhlIHZhbHVl cyBhcmUgc3RvcmVkIGFzCj4gbWlsbGkgZGVncmVlcyBDZWxzaXVzLiBEb24ndCBmb3JnZXQKPiDC oHRvIG11bHRpcGx5IQo+IMKgCj4gwqBGYW4gbWFuYWdlbWVudAo+IC0tLS0tLS0tLS0tLS0KPiAr LS0tLS0tLS0tLS0tLS0KPiDCoAo+IMKgTm90IGFsbCBjYXJkcyBoYXZlIGEgZHJpdmFibGUgZmFu LiBJZiB5b3UgZG8sIHRoZW4gdGhlIGZvbGxvd2luZwo+IEhXTU9OCj4gwqBhdHRyaWJ1dGVzIHNo b3VsZCBiZSBhdmFpbGFibGU6Cj4gwqAKPiAtICogcHdtMV9lbmFibGU6IEN1cnJlbnQgZmFuIG1h bmFnZW1lbnQgbW9kZSAoTk9ORSwgTUFOVUFMIG9yIEFVVE8pOwo+IC0gKiBwd20xOiBDdXJyZW50 IFBXTSB2YWx1ZSAocG93ZXIgcGVyY2VudGFnZSk7Cj4gLSAqIHB3bTFfbWluOiBUaGUgbWluaW11 bSBQV00gc3BlZWQgYWxsb3dlZDsKPiAtICogcHdtMV9tYXg6IFRoZSBtYXhpbXVtIFBXTSBzcGVl ZCBhbGxvd2VkIChieXBhc3NlZCB3aGVuIGhpdHRpbmcKPiBGYW5fYm9vc3QpOwo+ICsgKiBwd20x X2VuYWJsZToKPiArCUN1cnJlbnQgZmFuIG1hbmFnZW1lbnQgbW9kZSAoTk9ORSwgTUFOVUFMIG9y IEFVVE8pOwo+ICsgKiBwd20xOgo+ICsJQ3VycmVudCBQV00gdmFsdWUgKHBvd2VyIHBlcmNlbnRh Z2UpOwo+ICsgKiBwd20xX21pbjoKPiArCVRoZSBtaW5pbXVtIFBXTSBzcGVlZCBhbGxvd2VkOwo+ ICsgKiBwd20xX21heDoKPiArCVRoZSBtYXhpbXVtIFBXTSBzcGVlZCBhbGxvd2VkIChieXBhc3Nl ZCB3aGVuIGhpdHRpbmcKPiBGYW5fYm9vc3QpOwo+IMKgCj4gwqBZb3UgbWF5IGFsc28gaGF2ZSB0 aGUgZm9sbG93aW5nIGF0dHJpYnV0ZToKPiDCoAo+IC0gKiBmYW4xX2lucHV0OiBTcGVlZCBpbiBS UE0gb2YgeW91ciBmYW4uCj4gKyAqIGZhbjFfaW5wdXQ6Cj4gKwlTcGVlZCBpbiBSUE0gb2YgeW91 ciBmYW4uCj4gwqAKPiDCoFlvdXIgZmFuIGNhbiBiZSBkcml2ZW4gaW4gZGlmZmVyZW50IG1vZGVz Ogo+IMKgCj4gQEAgLTY2LDE0ICs3OCwxNiBAQCBZb3VyIGZhbiBjYW4gYmUgZHJpdmVuIGluIGRp ZmZlcmVudCBtb2RlczoKPiDCoCAqIDE6IFRoZSBmYW4gY2FuIGJlIGRyaXZlbiBpbiBtYW51YWwg KHVzZSBwd20xIHRvIGNoYW5nZSB0aGUKPiBzcGVlZCk7Cj4gwqAgKiAyOyBUaGUgZmFuIGlzIGRy aXZlbiBhdXRvbWF0aWNhbGx5IGRlcGVuZGluZyBvbiB0aGUgdGVtcGVyYXR1cmUuCj4gwqAKPiAt Tk9URTogQmUgc3VyZSB0byB1c2UgdGhlIG1hbnVhbCBtb2RlIGlmIHlvdSB3YW50IHRvIGRyaXZl IHRoZSBmYW4KPiBzcGVlZCBtYW51YWxseQo+ICtOT1RFOgo+ICvCoMKgQmUgc3VyZSB0byB1c2Ug dGhlIG1hbnVhbCBtb2RlIGlmIHlvdSB3YW50IHRvIGRyaXZlIHRoZSBmYW4gc3BlZWQKPiBtYW51 YWxseQo+IMKgCj4gLU5PVEUyOiBXaGVuIG9wZXJhdGluZyBpbiBtYW51YWwgbW9kZSBvdXRzaWRl IHRoZSB2Ymlvcy1kZWZpbmVkCj4gLVtQV01fbWluLCBQV01fbWF4XSByYW5nZSwgdGhlIHJlcG9y dGVkIGZhbiBzcGVlZCAoUlBNKSBtYXkgbm90IGJlCj4gYWNjdXJhdGUKPiAtZGVwZW5kaW5nIG9u IHlvdXIgaGFyZHdhcmUuCj4gK05PVEUyOgo+ICvCoMKgV2hlbiBvcGVyYXRpbmcgaW4gbWFudWFs IG1vZGUgb3V0c2lkZSB0aGUgdmJpb3MtZGVmaW5lZAo+ICvCoMKgW1BXTV9taW4sIFBXTV9tYXhd IHJhbmdlLCB0aGUgcmVwb3J0ZWQgZmFuIHNwZWVkIChSUE0pIG1heSBub3QgYmUKPiBhY2N1cmF0 ZQo+ICvCoMKgZGVwZW5kaW5nIG9uIHlvdXIgaGFyZHdhcmUuCj4gwqAKPiDCoEJ1ZyByZXBvcnRz Cj4gLS0tLS0tLS0tLQo+ICstLS0tLS0tLS0tLQo+IMKgCj4gwqBUaGVybWFsIG1hbmFnZW1lbnQg b24gTm91dmVhdSBpcyBuZXcgYW5kIG1heSBub3Qgd29yayBvbiBhbGwgY2FyZHMuCj4gSWYgeW91 IGhhdmUKPiDCoGlucXVpcmllcywgcGxlYXNlIHBpbmcgbXVwdWYgb24gSVJDICgjbm91dmVhdSwg ZnJlZW5vZGUpLgo+IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RoZXJtYWwvcG93ZXJfYWxs b2NhdG9yLnR4dAo+IGIvRG9jdW1lbnRhdGlvbi90aGVybWFsL3Bvd2VyX2FsbG9jYXRvci5yc3QK PiBzaW1pbGFyaXR5IGluZGV4IDc0JQo+IHJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vdGhlcm1h bC9wb3dlcl9hbGxvY2F0b3IudHh0Cj4gcmVuYW1lIHRvIERvY3VtZW50YXRpb24vdGhlcm1hbC9w b3dlcl9hbGxvY2F0b3IucnN0Cj4gaW5kZXggOWZiMGZmMDZkY2E5Li42N2I2YTMyOTcyMzggMTAw NjQ0Cj4gLS0tIGEvRG9jdW1lbnRhdGlvbi90aGVybWFsL3Bvd2VyX2FsbG9jYXRvci50eHQKPiAr KysgYi9Eb2N1bWVudGF0aW9uL3RoZXJtYWwvcG93ZXJfYWxsb2NhdG9yLnJzdAo+IEBAIC0xLDMg KzEsNCBAQAo+ICs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KPiDCoFBvd2VyIGFs bG9jYXRvciBnb3Zlcm5vciB0dW5hYmxlcwo+IMKgPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09Cj4gwqAKPiBAQCAtMjUsMzYgKzI2LDM2IEBAIHRlbXBlcmF0dXJlIGFzIHRoZSBjb250 cm9sIGlucHV0IGFuZCBwb3dlciBhcyB0aGUKPiBjb250cm9sbGVkIG91dHB1dDoKPiDCoMKgwqDC oMKgUF9tYXggPSBrX3AgKiBlICsga19pICogZXJyX2ludGVncmFsICsga19kICogZGlmZl9lcnIg Kwo+IHN1c3RhaW5hYmxlX3Bvd2VyCj4gwqAKPiDCoHdoZXJlCj4gLcKgwqDCoMKgZSA9IGRlc2ly ZWRfdGVtcGVyYXR1cmUgLSBjdXJyZW50X3RlbXBlcmF0dXJlCj4gLcKgwqDCoMKgZXJyX2ludGVn cmFsIGlzIHRoZSBzdW0gb2YgcHJldmlvdXMgZXJyb3JzCj4gLcKgwqDCoMKgZGlmZl9lcnIgPSBl IC0gcHJldmlvdXNfZXJyb3IKPiArwqDCoMKgLcKgwqBlID0gZGVzaXJlZF90ZW1wZXJhdHVyZSAt IGN1cnJlbnRfdGVtcGVyYXR1cmUKPiArwqDCoMKgLcKgwqBlcnJfaW50ZWdyYWwgaXMgdGhlIHN1 bSBvZiBwcmV2aW91cyBlcnJvcnMKPiArwqDCoMKgLcKgwqBkaWZmX2VyciA9IGUgLSBwcmV2aW91 c19lcnJvcgo+IMKgCj4gLUl0IGlzIHNpbWlsYXIgdG8gdGhlIG9uZSBkZXBpY3RlZCBiZWxvdzoK PiArSXQgaXMgc2ltaWxhciB0byB0aGUgb25lIGRlcGljdGVkIGJlbG93OjoKPiDCoAo+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKga19kCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHwKPiAtY3VycmVudF90 ZW1wwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg fAo+IC3CoMKgwqDCoMKgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHYKPiAtwqDCoMKgwqDCoHzCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCstLS0tLS0tLS0tK8KgwqDCoCstLS0rCj4gLcKgwqDCoMKgwqB8wqDC oMKgwqDCoMKgwqDCoMKgKy0tLS0tPnwgZGlmZl9lcnIgfC0tPnwgWCB8LS0tLS0tKwo+IC3CoMKg wqDCoMKgfMKgwqDCoMKgwqDCoMKgwqDCoHzCoMKgwqDCoMKgwqArLS0tLS0tLS0tLSvCoMKgwqAr LS0tK8KgwqDCoMKgwqDCoHwKPiAtwqDCoMKgwqDCoHzCoMKgwqDCoMKgwqDCoMKgwqB8wqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHzCoMKgwqDCoMKgwqB0ZHDCoMKgwqDCoMKgwqDCoMKgYWMKPiB0b3IKPiAtwqDCoMKgwqDCoHzC oMKgwqDCoMKgwqDCoMKgwqB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBrX2nCoMKgwqDCoMKgwqDCoHzCoMKgwqDCoMKgwqDCoHzCoMKgZ2V0X3JlcXVlCj4gc3Rl ZF9wb3dlcigpCj4gLcKgwqDCoMKgwqB8wqDCoMKgwqDCoMKgwqDCoMKgfMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8wqDCoMKgwqDCoMKgwqDCoHzCoMKgwqDC oMKgwqDCoHzCoMKgwqDCoMKgwqDCoMKgfMKgwqAKPiDCoMKgwqB8Cj4gLcKgwqDCoMKgwqB8wqDC oMKgwqDCoMKgwqDCoMKgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqB8wqDCoMKgwqDCoMKgwqDCoHzCoMKgwqDCoMKgwqDCoHzCoMKgwqDCoMKgwqDCoMKgfMKg wqAKPiDCoMKgwqB8IC4uLgo+IC3CoMKgwqDCoMKgdsKgwqDCoMKgwqDCoMKgwqDCoHzCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdsKgwqDCoMKgwqDCoMKgwqB2 wqDCoMKgwqDCoMKgwqB2wqDCoMKgwqDCoMKgwqDCoHbCoMKgCj4gwqDCoMKgdgo+IC3CoMKgwqAr LS0tK8KgwqDCoMKgwqDCoMKgfMKgwqDCoMKgwqDCoCstLS0tLS0tK8KgwqDCoMKgwqDCoCstLS0r wqDCoMKgwqArLS0tK8KgwqDCoCstLS0rwqDCoMKgKy0tLS0tCj4gLS0tLS0rCj4gLcKgwqDCoHwg UyB8LS0tLS0tLSstLS0tLT58IHN1bSBlIHwtLS0tLT58IFggfC0tLT58IFMgfC0tPnwgUyB8Cj4g LS0+fHBvd2VywqDCoMKgwqDCoHwKPiAtwqDCoMKgKy0tLSvCoMKgwqDCoMKgwqDCoHzCoMKgwqDC oMKgwqArLS0tLS0tLSvCoMKgwqDCoMKgwqArLS0tK8KgwqDCoMKgKy0tLSvCoMKgwqArLS0tCj4g K8KgwqDCoHxhbGxvY2F0aW9ufAo+IC3CoMKgwqDCoMKgXsKgwqDCoMKgwqDCoMKgwqDCoHzCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgXsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgKy0tLS0tCj4gLS0tLS0rCj4gLcKgwqDCoMKg wqB8wqDCoMKgwqDCoMKgwqDCoMKgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqB8wqDCoAo+IMKgwqDCoHwKPiAtwqDCoMKgwqDCoHzCoMKgwqDCoMKgwqDCoMKgwqB8wqDC oMKgwqDCoMKgwqDCoCstLS0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8wqDCoMKgwqDCoHwKPiAtwqDCoMKg wqDCoHzCoMKgwqDCoMKgwqDCoMKgwqArLS0tLS0tLT58IFggfC0tLS0tLS0tLS0tLS0tLS0tLS0K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2wqDCoMKgwqDCoHYKPiAtwqDCoMKg wqDCoHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqArLS0tK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZ3JhbnRl ZAo+IHBlcmZvcm1hbmNlCj4gLWRlc2lyZWRfdGVtcGVyYXR1cmXCoMKgwqDCoMKgwqDCoF4KPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHwKPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHwKPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrX3BvL2tfcHUKPiAr CQkJCcKgwqDCoMKgwqDCoGtfZAo+ICsJCQkJwqDCoMKgwqDCoMKgwqB8Cj4gK8KgwqBjdXJyZW50 X3RlbXDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHwK PiArwqDCoMKgwqDCoMKgwqB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2Cj4gK8KgwqDCoMKgwqDCoMKgfMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqArLS0tLS0tLS0tLSvCoMKgwqArLS0tKwo+ICvCoMKgwqDCoMKgwqDCoHzC oMKgwqDCoMKgwqDCoCstLS0tLT58IGRpZmZfZXJyIHwtLT58IFggfC0tLS0tLSsKPiArwqDCoMKg wqDCoMKgwqB8wqDCoMKgwqDCoMKgwqB8wqDCoMKgwqDCoMKgKy0tLS0tLS0tLS0rwqDCoMKgKy0t LSvCoMKgwqDCoMKgwqB8Cj4gK8KgwqDCoMKgwqDCoMKgfMKgwqDCoMKgwqDCoMKgfMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8 wqDCoMKgwqDCoMKgdGRwwqDCoMKgwqDCoMKgwqDCoGFjCj4gdG9yCj4gK8KgwqDCoMKgwqDCoMKg fMKgwqDCoMKgwqDCoMKgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKga19pwqDCoMKgwqDCoMKgwqB8wqDCoMKgwqDCoMKgwqB8wqDCoGdldF9yZXF1ZQo+IHN0ZWRf cG93ZXIoKQo+ICvCoMKgwqDCoMKgwqDCoHzCoMKgwqDCoMKgwqDCoHzCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfMKgwqDCoMKgwqDCoMKgwqB8wqDCoMKgwqDC oMKgwqB8wqDCoMKgwqDCoMKgwqDCoHzCoMKgCj4gwqDCoMKgfAo+ICvCoMKgwqDCoMKgwqDCoHzC oMKgwqDCoMKgwqDCoHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgfMKgwqDCoMKgwqDCoMKgwqB8wqDCoMKgwqDCoMKgwqB8wqDCoMKgwqDCoMKgwqDCoHzCoMKg Cj4gwqDCoMKgfCAuLi4KPiArwqDCoMKgwqDCoMKgwqB2wqDCoMKgwqDCoMKgwqB8wqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHbCoMKgwqDCoMKgwqDCoMKgdsKg wqDCoMKgwqDCoMKgdsKgwqDCoMKgwqDCoMKgwqB2wqDCoAo+IMKgwqDCoHYKPiArwqDCoMKgwqDC oCstLS0rwqDCoMKgwqDCoHzCoMKgwqDCoMKgwqArLS0tLS0tLSvCoMKgwqDCoMKgwqArLS0tK8Kg wqDCoMKgKy0tLSvCoMKgwqArLS0tK8KgwqDCoCstLS0tLQo+IC0tLS0tKwo+ICvCoMKgwqDCoMKg fCBTIHwtLS0tLSstLS0tLT58IHN1bSBlIHwtLS0tLT58IFggfC0tLT58IFMgfC0tPnwgUyB8Cj4g LS0+fHBvd2VywqDCoMKgwqDCoHwKPiArwqDCoMKgwqDCoCstLS0rwqDCoMKgwqDCoHzCoMKgwqDC oMKgwqArLS0tLS0tLSvCoMKgwqDCoMKgwqArLS0tK8KgwqDCoMKgKy0tLSvCoMKgwqArLS0tCj4g K8KgwqDCoHxhbGxvY2F0aW9ufAo+ICvCoMKgwqDCoMKgwqDCoF7CoMKgwqDCoMKgwqDCoHzCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgXsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgKy0tLS0tCj4gLS0tLS0rCj4gK8KgwqDCoMKg wqDCoMKgfMKgwqDCoMKgwqDCoMKgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqB8wqDCoAo+IMKgwqDCoHwKPiArwqDCoMKgwqDCoMKgwqB8wqDCoMKgwqDCoMKgwqB8wqDC oMKgwqDCoMKgwqDCoCstLS0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8wqDCoMKgwqDCoHwKPiArwqDCoMKg wqDCoMKgwqB8wqDCoMKgwqDCoMKgwqArLS0tLS0tLT58IFggfC0tLS0tLS0tLS0tLS0tLS0tLS0K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2wqDCoMKgwqDCoHYKPiArwqDCoMKg wqDCoMKgwqB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqArLS0tK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZ3JhbnRl ZAo+IHBlcmZvcm1hbmNlCj4gK8KgwqBkZXNpcmVkX3RlbXBlcmF0dXJlwqDCoMKgwqDCoF4KPiAr CQkJwqDCoHwKPiArCQkJwqDCoHwKPiArCQnCoMKgwqDCoMKgwqBrX3BvL2tfcHUKPiDCoAo+IMKg U3VzdGFpbmFibGUgcG93ZXIKPiDCoC0tLS0tLS0tLS0tLS0tLS0tCj4gQEAgLTczLDcgKzc0LDcg QEAgaXMgdHlwaWNhbGx5IDIwMDBtVywgd2hpbGUgb24gYSAxMCIgdGFibGV0IGlzCj4gYXJvdW5k IDQ1MDBtVyAobWF5IHZhcnkKPiDCoGRlcGVuZGluZyBvbiBzY3JlZW4gc2l6ZSkuCj4gwqAKPiDC oElmIHlvdSBhcmUgdXNpbmcgZGV2aWNlIHRyZWUsIGRvIGFkZCBpdCBhcyBhIHByb3BlcnR5IG9m IHRoZQo+IC10aGVybWFsLXpvbmUuwqDCoEZvciBleGFtcGxlOgo+ICt0aGVybWFsLXpvbmUuwqDC oEZvciBleGFtcGxlOjoKPiDCoAo+IMKgCXRoZXJtYWwtem9uZXMgewo+IMKgCQlzb2NfdGhlcm1h bCB7Cj4gQEAgLTg1LDcgKzg2LDcgQEAgdGhlcm1hbC16b25lLsKgwqBGb3IgZXhhbXBsZToKPiDC oEluc3RlYWQsIGlmIHRoZSB0aGVybWFsIHpvbmUgaXMgcmVnaXN0ZXJlZCBmcm9tIHRoZSBwbGF0 Zm9ybSBjb2RlLAo+IHBhc3MgYQo+IMKgYHRoZXJtYWxfem9uZV9wYXJhbXNgIHRoYXQgaGFzIGEg YHN1c3RhaW5hYmxlX3Bvd2VyYC7CoMKgSWYgbm8KPiDCoGB0aGVybWFsX3pvbmVfcGFyYW1zYCB3 ZXJlIGJlaW5nIHBhc3NlZCwgdGhlbiBzb21ldGhpbmcgbGlrZSBiZWxvdwo+IC13aWxsIHN1ZmZp Y2U6Cj4gK3dpbGwgc3VmZmljZTo6Cj4gwqAKPiDCoAlzdGF0aWMgY29uc3Qgc3RydWN0IHRoZXJt YWxfem9uZV9wYXJhbXMgdHpfcGFyYW1zID0gewo+IMKgCQkuc3VzdGFpbmFibGVfcG93ZXIgPSAz NTAwLAo+IEBAIC0xMTIsMTggKzExMywxOCBAQCBhdmFpbGFibGUgY2FwYWNpdHkgYXQgYSBsb3cg dGVtcGVyYXR1cmUuwqDCoE9uCj4gdGhlIG90aGVyIGhhbmQsIGEgaGlnaAo+IMKgdmFsdWUgb2Yg YGtfcHVgIHdpbGwgcmVzdWx0IGluIHRoZSBnb3Zlcm5vciBncmFudGluZyB2ZXJ5IGhpZ2ggcG93 ZXIKPiDCoHdoaWxlIHRlbXBlcmF0dXJlIGlzIGxvdywgYW5kIG1heSBsZWFkIHRvIHRlbXBlcmF0 dXJlIG92ZXJzaG9vdGluZy4KPiDCoAo+IC1UaGUgZGVmYXVsdCB2YWx1ZSBmb3IgYGtfcHVgIGlz Ogo+ICtUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgYGtfcHVgIGlzOjoKPiDCoAo+IMKgwqDCoMKgwqAy ICogc3VzdGFpbmFibGVfcG93ZXIgLyAoZGVzaXJlZF90ZW1wZXJhdHVyZSAtIHN3aXRjaF9vbl90 ZW1wKQo+IMKgCj4gwqBUaGlzIG1lYW5zIHRoYXQgYXQgYHN3aXRjaF9vbl90ZW1wYCB0aGUgb3V0 cHV0IG9mIHRoZSBjb250cm9sbGVyJ3MKPiDCoHByb3BvcnRpb25hbCB0ZXJtIHdpbGwgYmUgMiAq IGBzdXN0YWluYWJsZV9wb3dlcmAuwqDCoFRoZSBkZWZhdWx0Cj4gdmFsdWUKPiAtZm9yIGBrX3Bv YCBpczoKPiArZm9yIGBrX3BvYCBpczo6Cj4gwqAKPiDCoMKgwqDCoMKgc3VzdGFpbmFibGVfcG93 ZXIgLyAoZGVzaXJlZF90ZW1wZXJhdHVyZSAtIHN3aXRjaF9vbl90ZW1wKQo+IMKgCj4gwqBGb2N1 c2luZyBvbiB0aGUgcHJvcG9ydGlvbmFsIGFuZCBmZWVkIGZvcndhcmQgdmFsdWVzIG9mIHRoZSBQ SUQKPiAtY29udHJvbGxlciBlcXVhdGlvbiB3ZSBoYXZlOgo+ICtjb250cm9sbGVyIGVxdWF0aW9u IHdlIGhhdmU6Ogo+IMKgCj4gwqDCoMKgwqDCoFBfbWF4ID0ga19wICogZSArIHN1c3RhaW5hYmxl X3Bvd2VyCj4gwqAKPiBAQCAtMTM0LDIxICsxMzUsMjMgQEAgaXMgdGhlIGRlc2lyZWQgb25lLCB0 aGVuIHRoZSBwcm9wb3J0aW9uYWwKPiBjb21wb25lbnQgaXMgemVybyBhbmQKPiDCoHRoZXJtYWwg ZXF1aWxpYnJpdW0gdW5kZXIgY29uc3RhbnQgbG9hZC7CoMKgYHN1c3RhaW5hYmxlX3Bvd2VyYCBp cwo+IG9ubHkKPiDCoGFuIGVzdGltYXRlLCB3aGljaCBpcyB0aGUgcmVhc29uIGZvciBjbG9zZWQt bG9vcCBjb250cm9sIHN1Y2ggYXMKPiB0aGlzLgo+IMKgCj4gLUV4cGFuZGluZyBga19wdWAgd2Ug Z2V0Ogo+ICtFeHBhbmRpbmcgYGtfcHVgIHdlIGdldDo6Cj4gKwo+IMKgwqDCoMKgwqBQX21heCA9 IDIgKiBzdXN0YWluYWJsZV9wb3dlciAqIChUX3NldCAtIFQpIC8gKFRfc2V0IC0gVF9vbikgKwo+ IC3CoMKgwqDCoMKgwqDCoMKgc3VzdGFpbmFibGVfcG93ZXIKPiArCXN1c3RhaW5hYmxlX3Bvd2Vy Cj4gwqAKPiAtd2hlcmUKPiAtwqDCoMKgwqBUX3NldCBpcyB0aGUgZGVzaXJlZCB0ZW1wZXJhdHVy ZQo+IC3CoMKgwqDCoFQgaXMgdGhlIGN1cnJlbnQgdGVtcGVyYXR1cmUKPiAtwqDCoMKgwqBUX29u IGlzIHRoZSBzd2l0Y2ggb24gdGVtcGVyYXR1cmUKPiArd2hlcmU6Cj4gKwo+ICvCoMKgwqDCoC0g VF9zZXQgaXMgdGhlIGRlc2lyZWQgdGVtcGVyYXR1cmUKPiArwqDCoMKgwqAtIFQgaXMgdGhlIGN1 cnJlbnQgdGVtcGVyYXR1cmUKPiArwqDCoMKgwqAtIFRfb24gaXMgdGhlIHN3aXRjaCBvbiB0ZW1w ZXJhdHVyZQo+IMKgCj4gwqBXaGVuIHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGlzIHRoZSBzd2l0 Y2hfb24gdGVtcGVyYXR1cmUsIHRoZSBhYm92ZQo+IC1mb3JtdWxhIGJlY29tZXM6Cj4gK2Zvcm11 bGEgYmVjb21lczo6Cj4gwqAKPiDCoMKgwqDCoMKgUF9tYXggPSAyICogc3VzdGFpbmFibGVfcG93 ZXIgKiAoVF9zZXQgLSBUX29uKSAvIChUX3NldCAtIFRfb24pCj4gKwo+IC3CoMKgwqDCoMKgwqDC oMKgc3VzdGFpbmFibGVfcG93ZXIgPSAyICogc3VzdGFpbmFibGVfcG93ZXIgKwo+IHN1c3RhaW5h YmxlX3Bvd2VyID0KPiAtwqDCoMKgwqDCoMKgwqDCoDMgKiBzdXN0YWluYWJsZV9wb3dlcgo+ICsJ c3VzdGFpbmFibGVfcG93ZXIgPSAyICogc3VzdGFpbmFibGVfcG93ZXIgKwo+IHN1c3RhaW5hYmxl X3Bvd2VyID0KPiArCTMgKiBzdXN0YWluYWJsZV9wb3dlcgo+IMKgCj4gwqBUaGVyZWZvcmUsIHRo ZSBwcm9wb3J0aW9uYWwgdGVybSBhbG9uZSBsaW5lYXJseSBkZWNyZWFzZXMgcG93ZXIgZnJvbQo+ IMKgMyAqIGBzdXN0YWluYWJsZV9wb3dlcmAgdG8gYHN1c3RhaW5hYmxlX3Bvd2VyYCBhcyB0aGUg dGVtcGVyYXR1cmUKPiBAQCAtMTc4LDExICsxODEsMTggQEAgQ29vbGluZyBkZXZpY2UgcG93ZXIg QVBJCj4gwqBDb29saW5nIGRldmljZXMgY29udHJvbGxlZCBieSB0aGlzIGdvdmVybm9yIG11c3Qg c3VwcGx5IHRoZQo+IGFkZGl0aW9uYWwKPiDCoCJwb3dlciIgQVBJIGluIHRoZWlyIGBjb29saW5n X2RldmljZV9vcHNgLsKgwqBJdCBjb25zaXN0cyBvbiB0aHJlZQo+IG9wczoKPiDCoAo+IC0xLiBp bnQgZ2V0X3JlcXVlc3RlZF9wb3dlcihzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2Rl diwKPiAtCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eiwgdTMyICpwb3dlcik7Cj4gLUBj ZGV2OiBUaGUgYHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlYCBwb2ludGVyCj4gLUB0ejog dGhlcm1hbCB6b25lIGluIHdoaWNoIHdlIGFyZSBjdXJyZW50bHkgb3BlcmF0aW5nCj4gLUBwb3dl cjogcG9pbnRlciBpbiB3aGljaCB0byBzdG9yZSB0aGUgY2FsY3VsYXRlZCBwb3dlcgo+ICsxLiA6 Ogo+ICsKPiArwqDCoMKgwqBpbnQgZ2V0X3JlcXVlc3RlZF9wb3dlcihzdHJ1Y3QgdGhlcm1hbF9j b29saW5nX2RldmljZSAqY2RldiwKPiArCQkJwqDCoMKgwqBzdHJ1Y3QgdGhlcm1hbF96b25lX2Rl dmljZSAqdHosIHUzMgo+ICpwb3dlcik7Cj4gKwo+ICsKPiArQGNkZXY6Cj4gKwlUaGUgYHN0cnVj dCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlYCBwb2ludGVyCj4gK0B0ejoKPiArCXRoZXJtYWwgem9u ZSBpbiB3aGljaCB3ZSBhcmUgY3VycmVudGx5IG9wZXJhdGluZwo+ICtAcG93ZXI6Cj4gKwlwb2lu dGVyIGluIHdoaWNoIHRvIHN0b3JlIHRoZSBjYWxjdWxhdGVkIHBvd2VyCj4gwqAKPiDCoGBnZXRf cmVxdWVzdGVkX3Bvd2VyKClgIGNhbGN1bGF0ZXMgdGhlIHBvd2VyIHJlcXVlc3RlZCBieSB0aGUg ZGV2aWNlCj4gwqBpbiBtaWxsaXdhdHRzIGFuZCBzdG9yZXMgaXQgaW4gQHBvd2VyIC7CoMKgSXQg c2hvdWxkIHJldHVybiAwIG9uCj4gQEAgLTE5MCwyMyArMjAwLDM3IEBAIHN1Y2Nlc3MsIC1FKiBv biBmYWlsdXJlLsKgwqBUaGlzIGlzIGN1cnJlbnRseQo+IHVzZWQgYnkgdGhlIHBvd2VyCj4gwqBh bGxvY2F0b3IgZ292ZXJub3IgdG8gY2FsY3VsYXRlIGhvdyBtdWNoIHBvd2VyIHRvIGdpdmUgdG8g ZWFjaAo+IGNvb2xpbmcKPiDCoGRldmljZS4KPiDCoAo+IC0yLiBpbnQgc3RhdGUycG93ZXIoc3Ry dWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYsIHN0cnVjdAo+IC3CoMKgwqDCoMKgwqDC oMKgdGhlcm1hbF96b25lX2RldmljZSAqdHosIHVuc2lnbmVkIGxvbmcgc3RhdGUsIHUzMiAqcG93 ZXIpOwo+IC1AY2RldjogVGhlIGBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZWAgcG9pbnRl cgo+IC1AdHo6IHRoZXJtYWwgem9uZSBpbiB3aGljaCB3ZSBhcmUgY3VycmVudGx5IG9wZXJhdGlu Zwo+IC1Ac3RhdGU6IEEgY29vbGluZyBkZXZpY2Ugc3RhdGUKPiAtQHBvd2VyOiBwb2ludGVyIGlu IHdoaWNoIHRvIHN0b3JlIHRoZSBlcXVpdmFsZW50IHBvd2VyCj4gKzIuIDo6Cj4gKwo+ICsJaW50 IHN0YXRlMnBvd2VyKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2LCBzdHJ1Y3QK PiArCQkJdGhlcm1hbF96b25lX2RldmljZSAqdHosIHVuc2lnbmVkIGxvbmcKPiBzdGF0ZSwKPiAr CQkJdTMyICpwb3dlcik7Cj4gKwo+ICtAY2RldjoKPiArCVRoZSBgc3RydWN0IHRoZXJtYWxfY29v bGluZ19kZXZpY2VgIHBvaW50ZXIKPiArQHR6Ogo+ICsJdGhlcm1hbCB6b25lIGluIHdoaWNoIHdl IGFyZSBjdXJyZW50bHkgb3BlcmF0aW5nCj4gK0BzdGF0ZToKPiArCUEgY29vbGluZyBkZXZpY2Ug c3RhdGUKPiArQHBvd2VyOgo+ICsJcG9pbnRlciBpbiB3aGljaCB0byBzdG9yZSB0aGUgZXF1aXZh bGVudCBwb3dlcgo+IMKgCj4gwqBDb252ZXJ0IGNvb2xpbmcgZGV2aWNlIHN0YXRlIEBzdGF0ZSBp bnRvIHBvd2VyIGNvbnN1bXB0aW9uIGluCj4gwqBtaWxsaXdhdHRzIGFuZCBzdG9yZSBpdCBpbiBA cG93ZXIuwqDCoEl0IHNob3VsZCByZXR1cm4gMCBvbiBzdWNjZXNzLAo+IC1FKgo+IMKgb24gZmFp bHVyZS7CoMKgVGhpcyBpcyBjdXJyZW50bHkgdXNlZCBieSB0aGVybWFsIGNvcmUgdG8gY2FsY3Vs YXRlIHRoZQo+IMKgbWF4aW11bSBwb3dlciB0aGF0IGFuIGFjdG9yIGNhbiBjb25zdW1lLgo+IMKg Cj4gLTMuIGludCBwb3dlcjJzdGF0ZShzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2Rl diwgdTMyIHBvd2VyLAo+IC0JdW5zaWduZWQgbG9uZyAqc3RhdGUpOwo+IC1AY2RldjogVGhlIGBz dHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZWAgcG9pbnRlcgo+IC1AcG93ZXI6IHBvd2VyIGlu IG1pbGxpd2F0dHMKPiAtQHN0YXRlOiBwb2ludGVyIGluIHdoaWNoIHRvIHN0b3JlIHRoZSByZXN1 bHRpbmcgc3RhdGUKPiArMy4gOjoKPiArCj4gKwlpbnQgcG93ZXIyc3RhdGUoc3RydWN0IHRoZXJt YWxfY29vbGluZ19kZXZpY2UgKmNkZXYsIHUzMgo+IHBvd2VyLAo+ICsJCQl1bnNpZ25lZCBsb25n ICpzdGF0ZSk7Cj4gKwo+ICtAY2RldjoKPiArCVRoZSBgc3RydWN0IHRoZXJtYWxfY29vbGluZ19k ZXZpY2VgIHBvaW50ZXIKPiArQHBvd2VyOgo+ICsJcG93ZXIgaW4gbWlsbGl3YXR0cwo+ICtAc3Rh dGU6Cj4gKwlwb2ludGVyIGluIHdoaWNoIHRvIHN0b3JlIHRoZSByZXN1bHRpbmcgc3RhdGUKPiDC oAo+IMKgQ2FsY3VsYXRlIGEgY29vbGluZyBkZXZpY2Ugc3RhdGUgdGhhdCB3b3VsZCBtYWtlIHRo ZSBkZXZpY2UgY29uc3VtZQo+IGF0Cj4gwqBtb3N0IEBwb3dlciBtVyBhbmQgc3RvcmUgaXQgaW4g QHN0YXRlLsKgwqBJdCBzaG91bGQgcmV0dXJuIDAgb24KPiBzdWNjZXNzLAo+IGRpZmYgLS1naXQg YS9Eb2N1bWVudGF0aW9uL3RoZXJtYWwvc3lzZnMtYXBpLnR4dAo+IGIvRG9jdW1lbnRhdGlvbi90 aGVybWFsL3N5c2ZzLWFwaS5yc3QKPiBzaW1pbGFyaXR5IGluZGV4IDY2JQo+IHJlbmFtZSBmcm9t IERvY3VtZW50YXRpb24vdGhlcm1hbC9zeXNmcy1hcGkudHh0Cj4gcmVuYW1lIHRvIERvY3VtZW50 YXRpb24vdGhlcm1hbC9zeXNmcy1hcGkucnN0Cj4gaW5kZXggYzNmYTUwMGRmOTJjLi5lNDkzMDc2 MWQzZTUgMTAwNjQ0Cj4gLS0tIGEvRG9jdW1lbnRhdGlvbi90aGVybWFsL3N5c2ZzLWFwaS50eHQK PiArKysgYi9Eb2N1bWVudGF0aW9uL3RoZXJtYWwvc3lzZnMtYXBpLnJzdAo+IEBAIC0xLDMgKzEs NCBAQAo+ICs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo+IMKgR2VuZXJpYyBU aGVybWFsIFN5c2ZzIGRyaXZlciBIb3cgVG8KPiDCoD09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09Cj4gwqAKPiBAQCAtOSw2ICsxMCw3IEBAIENvcHlyaWdodCAoYynCoMKgMjAwOCBJ bnRlbCBDb3Jwb3JhdGlvbgo+IMKgCj4gwqAKPiDCoDAuIEludHJvZHVjdGlvbgo+ICs9PT09PT09 PT09PT09PT0KPiDCoAo+IMKgVGhlIGdlbmVyaWMgdGhlcm1hbCBzeXNmcyBwcm92aWRlcyBhIHNl dCBvZiBpbnRlcmZhY2VzIGZvciB0aGVybWFsCj4gem9uZQo+IMKgZGV2aWNlcyAoc2Vuc29ycykg YW5kIHRoZXJtYWwgY29vbGluZyBkZXZpY2VzIChmYW4sIHByb2Nlc3Nvci4uLikgdG8KPiByZWdp c3Rlcgo+IEBAIC0yNSw1OSArMjcsOTAgQEAgQW4gaW50ZWxsaWdlbnQgdGhlcm1hbCBtYW5hZ2Vt ZW50IGFwcGxpY2F0aW9uIGNhbgo+IG1ha2UgZGVjaXNpb25zIGJhc2VkIG9uCj4gwqBpbnB1dHMg ZnJvbSB0aGVybWFsIHpvbmUgYXR0cmlidXRlcyAodGhlIGN1cnJlbnQgdGVtcGVyYXR1cmUgYW5k Cj4gdHJpcCBwb2ludAo+IMKgdGVtcGVyYXR1cmUpIGFuZCB0aHJvdHRsZSBhcHByb3ByaWF0ZSBk ZXZpY2VzLgo+IMKgCj4gLVswLSpdCWRlbm90ZXMgYW55IHBvc2l0aXZlIG51bWJlciBzdGFydGlu ZyBmcm9tIDAKPiAtWzEtKl0JZGVub3RlcyBhbnkgcG9zaXRpdmUgbnVtYmVyIHN0YXJ0aW5nIGZy b20gMQo+ICstIGBbMC0qXWAJZGVub3RlcyBhbnkgcG9zaXRpdmUgbnVtYmVyIHN0YXJ0aW5nIGZy b20gMAo+ICstIGBbMS0qXWAJZGVub3RlcyBhbnkgcG9zaXRpdmUgbnVtYmVyIHN0YXJ0aW5nIGZy b20gMQo+IMKgCj4gwqAxLiB0aGVybWFsIHN5c2ZzIGRyaXZlciBpbnRlcmZhY2UgZnVuY3Rpb25z Cj4gKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KPiDCoAo+IMKg MS4xIHRoZXJtYWwgem9uZSBkZXZpY2UgaW50ZXJmYWNlCj4gLTEuMS4xIHN0cnVjdCB0aGVybWFs X3pvbmVfZGV2aWNlICp0aGVybWFsX3pvbmVfZGV2aWNlX3JlZ2lzdGVyKGNoYXIKPiAqdHlwZSwK PiAtCQlpbnQgdHJpcHMsIGludCBtYXNrLCB2b2lkICpkZXZkYXRhLAo+IC0JCXN0cnVjdCB0aGVy bWFsX3pvbmVfZGV2aWNlX29wcyAqb3BzLAo+IC0JCWNvbnN0IHN0cnVjdCB0aGVybWFsX3pvbmVf cGFyYW1zICp0enAsCj4gLQkJaW50IHBhc3NpdmVfZGVsYXksIGludCBwb2xsaW5nX2RlbGF5KSkK PiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKwo+ICvCoMKgwqDCoDo6Cj4g Kwo+ICsJc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UKPiArCSp0aGVybWFsX3pvbmVfZGV2aWNl X3JlZ2lzdGVyKGNoYXIgKnR5cGUsCj4gKwkJCQnCoMKgwqDCoMKgwqBpbnQgdHJpcHMsIGludCBt YXNrLCB2b2lkCj4gKmRldmRhdGEsCj4gKwkJCQnCoMKgwqDCoMKgwqBzdHJ1Y3QgdGhlcm1hbF96 b25lX2RldmljZV9vcHMKPiAqb3BzLAo+ICsJCQkJwqDCoMKgwqDCoMKgY29uc3Qgc3RydWN0Cj4g dGhlcm1hbF96b25lX3BhcmFtcyAqdHpwLAo+ICsJCQkJwqDCoMKgwqDCoMKgaW50IHBhc3NpdmVf ZGVsYXksIGludAo+IHBvbGxpbmdfZGVsYXkpKQo+IMKgCj4gwqDCoMKgwqDCoFRoaXMgaW50ZXJm YWNlIGZ1bmN0aW9uIGFkZHMgYSBuZXcgdGhlcm1hbCB6b25lIGRldmljZSAoc2Vuc29yKQo+IHRv Cj4gLcKgwqDCoMKgL3N5cy9jbGFzcy90aGVybWFsIGZvbGRlciBhcyB0aGVybWFsX3pvbmVbMC0q XS4gSXQgdHJpZXMgdG8gYmluZAo+IGFsbCB0aGUKPiArwqDCoMKgwqAvc3lzL2NsYXNzL3RoZXJt YWwgZm9sZGVyIGFzIGB0aGVybWFsX3pvbmVbMC0qXWAuIEl0IHRyaWVzIHRvCj4gYmluZCBhbGwg dGhlCj4gwqDCoMKgwqDCoHRoZXJtYWwgY29vbGluZyBkZXZpY2VzIHJlZ2lzdGVyZWQgYXQgdGhl IHNhbWUgdGltZS4KPiDCoAo+IC3CoMKgwqDCoHR5cGU6IHRoZSB0aGVybWFsIHpvbmUgdHlwZS4K PiAtwqDCoMKgwqB0cmlwczogdGhlIHRvdGFsIG51bWJlciBvZiB0cmlwIHBvaW50cyB0aGlzIHRo ZXJtYWwgem9uZQo+IHN1cHBvcnRzLgo+IC3CoMKgwqDCoG1hc2s6IEJpdCBzdHJpbmc6IElmICdu J3RoIGJpdCBpcyBzZXQsIHRoZW4gdHJpcCBwb2ludCAnbicgaXMKPiB3cml0ZWFibGUuCj4gLcKg wqDCoMKgZGV2ZGF0YTogZGV2aWNlIHByaXZhdGUgZGF0YQo+IC3CoMKgwqDCoG9wczogdGhlcm1h bCB6b25lIGRldmljZSBjYWxsLWJhY2tzLgo+IC0JLmJpbmQ6IGJpbmQgdGhlIHRoZXJtYWwgem9u ZSBkZXZpY2Ugd2l0aCBhIHRoZXJtYWwgY29vbGluZwo+IGRldmljZS4KPiAtCS51bmJpbmQ6IHVu YmluZCB0aGUgdGhlcm1hbCB6b25lIGRldmljZSB3aXRoIGEgdGhlcm1hbAo+IGNvb2xpbmcgZGV2 aWNlLgo+IC0JLmdldF90ZW1wOiBnZXQgdGhlIGN1cnJlbnQgdGVtcGVyYXR1cmUgb2YgdGhlIHRo ZXJtYWwgem9uZS4KPiAtCS5zZXRfdHJpcHM6IHNldCB0aGUgdHJpcCBwb2ludHMgd2luZG93LiBX aGVuZXZlciB0aGUgY3VycmVudAo+IHRlbXBlcmF0dXJlCj4gK8KgwqDCoMKgdHlwZToKPiArCXRo ZSB0aGVybWFsIHpvbmUgdHlwZS4KPiArwqDCoMKgwqB0cmlwczoKPiArCXRoZSB0b3RhbCBudW1i ZXIgb2YgdHJpcCBwb2ludHMgdGhpcyB0aGVybWFsIHpvbmUgc3VwcG9ydHMuCj4gK8KgwqDCoMKg bWFzazoKPiArCUJpdCBzdHJpbmc6IElmICduJ3RoIGJpdCBpcyBzZXQsIHRoZW4gdHJpcCBwb2lu dCAnbicgaXMKPiB3cml0ZWFibGUuCj4gK8KgwqDCoMKgZGV2ZGF0YToKPiArCWRldmljZSBwcml2 YXRlIGRhdGEKPiArwqDCoMKgwqBvcHM6Cj4gKwl0aGVybWFsIHpvbmUgZGV2aWNlIGNhbGwtYmFj a3MuCj4gKwo+ICsJLmJpbmQ6Cj4gKwkJYmluZCB0aGUgdGhlcm1hbCB6b25lIGRldmljZSB3aXRo IGEgdGhlcm1hbCBjb29saW5nCj4gZGV2aWNlLgo+ICsJLnVuYmluZDoKPiArCQl1bmJpbmQgdGhl IHRoZXJtYWwgem9uZSBkZXZpY2Ugd2l0aCBhIHRoZXJtYWwKPiBjb29saW5nIGRldmljZS4KPiAr CS5nZXRfdGVtcDoKPiArCQlnZXQgdGhlIGN1cnJlbnQgdGVtcGVyYXR1cmUgb2YgdGhlIHRoZXJt YWwgem9uZS4KPiArCS5zZXRfdHJpcHM6Cj4gKwkJwqDCoMKgwqBzZXQgdGhlIHRyaXAgcG9pbnRz IHdpbmRvdy4gV2hlbmV2ZXIgdGhlIGN1cnJlbnQKPiB0ZW1wZXJhdHVyZQo+IMKgCQnCoMKgwqDC oGlzIHVwZGF0ZWQsIHRoZSB0cmlwIHBvaW50cyBpbW1lZGlhdGVseSBiZWxvdwo+IGFuZCBhYm92 ZSB0aGUKPiDCoAkJwqDCoMKgwqBjdXJyZW50IHRlbXBlcmF0dXJlIGFyZSBmb3VuZC4KPiAtCS5n ZXRfbW9kZTogZ2V0IHRoZSBjdXJyZW50IG1vZGUgKGVuYWJsZWQvZGlzYWJsZWQpIG9mIHRoZQo+ IHRoZXJtYWwgem9uZS4KPiAtCcKgwqDCoMKgLSAiZW5hYmxlZCIgbWVhbnMgdGhlIGtlcm5lbCB0 aGVybWFsIG1hbmFnZW1lbnQgaXMKPiBlbmFibGVkLgo+IC0JwqDCoMKgwqAtICJkaXNhYmxlZCIg d2lsbCBwcmV2ZW50IGtlcm5lbCB0aGVybWFsIGRyaXZlciBhY3Rpb24KPiB1cG9uIHRyaXAgcG9p bnRzCj4gLQnCoMKgwqDCoMKgwqBzbyB0aGF0IHVzZXIgYXBwbGljYXRpb25zIGNhbiB0YWtlIGNo YXJnZSBvZiB0aGVybWFsCj4gbWFuYWdlbWVudC4KPiAtCS5zZXRfbW9kZTogc2V0IHRoZSBtb2Rl IChlbmFibGVkL2Rpc2FibGVkKSBvZiB0aGUgdGhlcm1hbAo+IHpvbmUuCj4gLQkuZ2V0X3RyaXBf dHlwZTogZ2V0IHRoZSB0eXBlIG9mIGNlcnRhaW4gdHJpcCBwb2ludC4KPiAtCS5nZXRfdHJpcF90 ZW1wOiBnZXQgdGhlIHRlbXBlcmF0dXJlIGFib3ZlIHdoaWNoIHRoZSBjZXJ0YWluCj4gdHJpcCBw b2ludAo+ICsJLmdldF9tb2RlOgo+ICsJCcKgwqDCoGdldCB0aGUgY3VycmVudCBtb2RlIChlbmFi bGVkL2Rpc2FibGVkKSBvZiB0aGUKPiB0aGVybWFsIHpvbmUuCj4gKwo+ICsJCQktICJlbmFibGVk IiBtZWFucyB0aGUga2VybmVsIHRoZXJtYWwKPiBtYW5hZ2VtZW50IGlzCj4gKwkJCcKgwqBlbmFi bGVkLgo+ICsJCQktICJkaXNhYmxlZCIgd2lsbCBwcmV2ZW50IGtlcm5lbCB0aGVybWFsCj4gZHJp dmVyIGFjdGlvbgo+ICsJCQnCoMKgdXBvbiB0cmlwIHBvaW50cyBzbyB0aGF0IHVzZXIgYXBwbGlj YXRpb25zCj4gY2FuIHRha2UKPiArCQkJwqDCoGNoYXJnZSBvZiB0aGVybWFsIG1hbmFnZW1lbnQu Cj4gKwkuc2V0X21vZGU6Cj4gKwkJc2V0IHRoZSBtb2RlIChlbmFibGVkL2Rpc2FibGVkKSBvZiB0 aGUgdGhlcm1hbCB6b25lLgo+ICsJLmdldF90cmlwX3R5cGU6Cj4gKwkJZ2V0IHRoZSB0eXBlIG9m IGNlcnRhaW4gdHJpcCBwb2ludC4KPiArCS5nZXRfdHJpcF90ZW1wOgo+ICsJCQlnZXQgdGhlIHRl bXBlcmF0dXJlIGFib3ZlIHdoaWNoIHRoZSBjZXJ0YWluCj4gdHJpcCBwb2ludAo+IMKgCQkJd2ls bCBiZSBmaXJlZC4KPiAtCS5zZXRfZW11bF90ZW1wOiBzZXQgdGhlIGVtdWxhdGlvbiB0ZW1wZXJh dHVyZSB3aGljaCBoZWxwcyBpbgo+IGRlYnVnZ2luZwo+ICsJLnNldF9lbXVsX3RlbXA6Cj4gKwkJ CXNldCB0aGUgZW11bGF0aW9uIHRlbXBlcmF0dXJlIHdoaWNoIGhlbHBzIGluCj4gZGVidWdnaW5n Cj4gwqAJCQlkaWZmZXJlbnQgdGhyZXNob2xkIHRlbXBlcmF0dXJlIHBvaW50cy4KPiAtwqDCoMKg wqB0enA6IHRoZXJtYWwgem9uZSBwbGF0Zm9ybSBwYXJhbWV0ZXJzLgo+IC3CoMKgwqDCoHBhc3Np dmVfZGVsYXk6IG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZXR3ZWVuIHBvbGxzIHdo ZW4KPiArwqDCoMKgwqB0enA6Cj4gKwl0aGVybWFsIHpvbmUgcGxhdGZvcm0gcGFyYW1ldGVycy4K PiArwqDCoMKgwqBwYXNzaXZlX2RlbGF5Ogo+ICsJbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3 YWl0IGJldHdlZW4gcG9sbHMgd2hlbgo+IMKgCXBlcmZvcm1pbmcgcGFzc2l2ZSBjb29saW5nLgo+ IC3CoMKgwqDCoHBvbGxpbmdfZGVsYXk6IG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBi ZXR3ZWVuIHBvbGxzIHdoZW4KPiBjaGVja2luZwo+ICvCoMKgwqDCoHBvbGxpbmdfZGVsYXk6Cj4g KwludW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmV0d2VlbiBwb2xscyB3aGVuIGNoZWNr aW5nCj4gwqAJd2hldGhlciB0cmlwIHBvaW50cyBoYXZlIGJlZW4gY3Jvc3NlZCAoMCBmb3IgaW50 ZXJydXB0Cj4gZHJpdmVuIHN5c3RlbXMpLgo+IMKgCj4gK8KgwqDCoMKgOjoKPiDCoAo+IC0xLjEu MiB2b2lkIHRoZXJtYWxfem9uZV9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgdGhlcm1hbF96b25l X2RldmljZQo+ICp0eikKPiArCXZvaWQgdGhlcm1hbF96b25lX2RldmljZV91bnJlZ2lzdGVyKHN0 cnVjdAo+IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6KQo+IMKgCj4gwqDCoMKgwqDCoFRoaXMgaW50 ZXJmYWNlIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIHRoZXJtYWwgem9uZSBkZXZpY2UuCj4gwqDCoMKg wqDCoEl0IGRlbGV0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgZnJvbSAvc3lzL2NsYXNzL3Ro ZXJtYWwKPiBmb2xkZXIgYW5kCj4gwqDCoMKgwqDCoHVuYmluZHMgYWxsIHRoZSB0aGVybWFsIGNv b2xpbmcgZGV2aWNlcyBpdCB1c2VzLgo+IMKgCj4gLTEuMS4zIHN0cnVjdCB0aGVybWFsX3pvbmVf ZGV2aWNlICp0aGVybWFsX3pvbmVfb2Zfc2Vuc29yX3JlZ2lzdGVyKAo+IC0JCXN0cnVjdCBkZXZp Y2UgKmRldiwgaW50IHNlbnNvcl9pZCwgdm9pZCAqZGF0YSwKPiAtCQljb25zdCBzdHJ1Y3QgdGhl cm1hbF96b25lX29mX2RldmljZV9vcHMgKm9wcykKPiArCTo6Cj4gKwo+ICsJwqDCoMKgc3RydWN0 IHRoZXJtYWxfem9uZV9kZXZpY2UKPiArCcKgwqDCoCp0aGVybWFsX3pvbmVfb2Zfc2Vuc29yX3Jl Z2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50Cj4gc2Vuc29yX2lkLAo+ICsJCQkJdm9pZCAq ZGF0YSwKPiArCQkJCWNvbnN0IHN0cnVjdAo+IHRoZXJtYWxfem9uZV9vZl9kZXZpY2Vfb3BzICpv cHMpCj4gwqAKPiDCoAlUaGlzIGludGVyZmFjZSBhZGRzIGEgbmV3IHNlbnNvciB0byBhIERUIHRo ZXJtYWwgem9uZS4KPiDCoAlUaGlzIGZ1bmN0aW9uIHdpbGwgc2VhcmNoIHRoZSBsaXN0IG9mIHRo ZXJtYWwgem9uZXMKPiBkZXNjcmliZWQgaW4KPiBAQCAtODcsMjUgKzEyMCwzMyBAQCB0ZW1wZXJh dHVyZSkgYW5kIHRocm90dGxlIGFwcHJvcHJpYXRlIGRldmljZXMuCj4gwqAJdGhlcm1hbCB6b25l IGRldmljZS4KPiDCoAo+IMKgCVRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIGludGVyZmFjZSBhcmU6 Cj4gLQlkZXY6CQlEZXZpY2Ugbm9kZSBvZiBzZW5zb3IgY29udGFpbmluZyB2YWxpZAo+IG5vZGUg cG9pbnRlciBpbgo+ICsKPiArCWRldjoKPiArCQkJRGV2aWNlIG5vZGUgb2Ygc2Vuc29yIGNvbnRh aW5pbmcgdmFsaWQgbm9kZQo+IHBvaW50ZXIgaW4KPiDCoAkJCWRldi0+b2Zfbm9kZS4KPiAtCXNl bnNvcl9pZDoJYSBzZW5zb3IgaWRlbnRpZmllciwgaW4gY2FzZSB0aGUgc2Vuc29yIElQCj4gaGFz IG1vcmUKPiArCXNlbnNvcl9pZDoKPiArCQkJYSBzZW5zb3IgaWRlbnRpZmllciwgaW4gY2FzZSB0 aGUgc2Vuc29yIElQCj4gaGFzIG1vcmUKPiDCoAkJCXRoYW4gb25lIHNlbnNvcnMKPiAtCWRhdGE6 CQlhIHByaXZhdGUgcG9pbnRlciAob3duZWQgYnkgdGhlIGNhbGxlcikKPiB0aGF0IHdpbGwgYmUK PiArCWRhdGE6Cj4gKwkJCWEgcHJpdmF0ZSBwb2ludGVyIChvd25lZCBieSB0aGUgY2FsbGVyKSB0 aGF0Cj4gd2lsbCBiZQo+IMKgCQkJcGFzc2VkIGJhY2ssIHdoZW4gYSB0ZW1wZXJhdHVyZSByZWFk aW5nIGlzCj4gbmVlZGVkLgo+IC0Jb3BzOgkJc3RydWN0IHRoZXJtYWxfem9uZV9vZl9kZXZpY2Vf b3BzICouCj4gKwlvcHM6Cj4gKwkJCWBzdHJ1Y3QgdGhlcm1hbF96b25lX29mX2RldmljZV9vcHMg KmAuCj4gwqAKPiAtCQkJZ2V0X3RlbXA6CWEgcG9pbnRlciB0byBhIGZ1bmN0aW9uCj4gdGhhdCBy ZWFkcyB0aGUKPiArCQkJPT09PT09PT09PT09PT3CoMKgPT09PT09PT09PT09PT09PT09PT09PT09 PT09PQo+ID09PT09PT09PT09Cj4gKwkJCWdldF90ZW1wCWEgcG9pbnRlciB0byBhIGZ1bmN0aW9u IHRoYXQKPiByZWFkcyB0aGUKPiDCoAkJCQkJc2Vuc29yIHRlbXBlcmF0dXJlLiBUaGlzIGlzCj4g bWFuZGF0b3J5Cj4gwqAJCQkJCWNhbGxiYWNrIHByb3ZpZGVkIGJ5IHNlbnNvcgo+IGRyaXZlci4K PiAtCQkJc2V0X3RyaXBzOsKgwqDCoMKgwqDCoGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQK PiBzZXRzIGEKPiArCQkJc2V0X3RyaXBzCWEgcG9pbnRlciB0byBhIGZ1bmN0aW9uCj4gdGhhdCBz ZXRzIGEKPiDCoAkJCQkJdGVtcGVyYXR1cmUgd2luZG93LiBXaGVuCj4gdGhpcyB3aW5kb3cgaXMK PiDCoAkJCQkJbGVmdCB0aGUgZHJpdmVyIG11c3QgaW5mb3JtCj4gdGhlIHRoZXJtYWwKPiDCoAkJ CQkJY29yZSB2aWEKPiB0aGVybWFsX3pvbmVfZGV2aWNlX3VwZGF0ZS4KPiAtCQkJZ2V0X3RyZW5k OsKgCWEgcG9pbnRlciB0byBhIGZ1bmN0aW9uCj4gdGhhdCByZWFkcyB0aGUKPiArCQkJZ2V0X3Ry ZW5kwqAJYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24KPiB0aGF0IHJlYWRzIHRoZQo+IMKgCQkJCQlz ZW5zb3IgdGVtcGVyYXR1cmUgdHJlbmQuCj4gLQkJCXNldF9lbXVsX3RlbXA6CWEgcG9pbnRlciB0 byBhCj4gZnVuY3Rpb24gdGhhdCBzZXRzCj4gKwkJCXNldF9lbXVsX3RlbXAJYSBwb2ludGVyIHRv IGEgZnVuY3Rpb24KPiB0aGF0IHNldHMKPiDCoAkJCQkJc2Vuc29yIGVtdWxhdGVkIHRlbXBlcmF0 dXJlLgo+ICsJCQk9PT09PT09PT09PT09PcKgwqA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 Cj4gPT09PT09PT09PT0KPiArCj4gwqAJVGhlIHRoZXJtYWwgem9uZSB0ZW1wZXJhdHVyZSBpcyBw cm92aWRlZCBieSB0aGUgZ2V0X3RlbXAoKQo+IGZ1bmN0aW9uCj4gwqAJcG9pbnRlciBvZiB0aGVy bWFsX3pvbmVfb2ZfZGV2aWNlX29wcy4gV2hlbiBjYWxsZWQsIGl0IHdpbGwKPiDCoAloYXZlIHRo ZSBwcml2YXRlIHBvaW50ZXIgQGRhdGEgYmFjay4KPiBAQCAtMTE0LDggKzE1NSwxMCBAQCB0ZW1w ZXJhdHVyZSkgYW5kIHRocm90dGxlIGFwcHJvcHJpYXRlIGRldmljZXMuCj4gwqAJaGFuZGxlLiBD YWxsZXIgc2hvdWxkIGNoZWNrIHRoZSByZXR1cm4gaGFuZGxlIHdpdGggSVNfRVJSKCkKPiBmb3Ig ZmluZGluZwo+IMKgCXdoZXRoZXIgc3VjY2VzcyBvciBub3QuCj4gwqAKPiAtMS4xLjQgdm9pZCB0 aGVybWFsX3pvbmVfb2Zfc2Vuc29yX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LAo+IC0J CXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0emQpCj4gKwk6Ogo+ICsKPiArCcKgwqDCoMKg dm9pZCB0aGVybWFsX3pvbmVfb2Zfc2Vuc29yX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZQo+ICpk ZXYsCj4gKwkJCQkJCcKgwqDCoHN0cnVjdAo+IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6ZCkKPiDC oAo+IMKgCVRoaXMgaW50ZXJmYWNlIHVucmVnaXN0ZXJzIGEgc2Vuc29yIGZyb20gYSBEVCB0aGVy bWFsIHpvbmUKPiB3aGljaCB3YXMKPiDCoAlzdWNjZXNzZnVsbHkgYWRkZWQgYnkgaW50ZXJmYWNl Cj4gdGhlcm1hbF96b25lX29mX3NlbnNvcl9yZWdpc3RlcigpLgo+IEBAIC0xMjQsMjEgKzE2Nywy OSBAQCB0ZW1wZXJhdHVyZSkgYW5kIHRocm90dGxlIGFwcHJvcHJpYXRlIGRldmljZXMuCj4gwqAJ aW50ZXJmYWNlLiBJdCB3aWxsIGFsc28gc2lsZW50IHRoZSB6b25lIGJ5IHJlbW92ZSB0aGUKPiAu Z2V0X3RlbXAoKSBhbmQKPiDCoAlnZXRfdHJlbmQoKSB0aGVybWFsIHpvbmUgZGV2aWNlIGNhbGxi YWNrcy4KPiDCoAo+IC0xLjEuNSBzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZQo+ICpkZXZtX3Ro ZXJtYWxfem9uZV9vZl9zZW5zb3JfcmVnaXN0ZXIoCj4gLQkJc3RydWN0IGRldmljZSAqZGV2LCBp bnQgc2Vuc29yX2lkLAo+IC0JCXZvaWQgKmRhdGEsIGNvbnN0IHN0cnVjdCB0aGVybWFsX3pvbmVf b2ZfZGV2aWNlX29wcwo+ICpvcHMpCj4gKwk6Ogo+ICsKPiArCcKgwqBzdHJ1Y3QgdGhlcm1hbF96 b25lX2RldmljZQo+ICsJwqDCoCpkZXZtX3RoZXJtYWxfem9uZV9vZl9zZW5zb3JfcmVnaXN0ZXIo c3RydWN0IGRldmljZSAqZGV2LAo+ICsJCQkJaW50IHNlbnNvcl9pZCwKPiArCQkJCXZvaWQgKmRh dGEsCj4gKwkJCQljb25zdCBzdHJ1Y3QKPiB0aGVybWFsX3pvbmVfb2ZfZGV2aWNlX29wcyAqb3Bz KQo+IMKgCj4gwqAJVGhpcyBpbnRlcmZhY2UgaXMgcmVzb3VyY2UgbWFuYWdlZCB2ZXJzaW9uIG9m Cj4gwqAJdGhlcm1hbF96b25lX29mX3NlbnNvcl9yZWdpc3RlcigpLgo+ICsKPiDCoAlBbGwgZGV0 YWlscyBvZiB0aGVybWFsX3pvbmVfb2Zfc2Vuc29yX3JlZ2lzdGVyKCkgZGVzY3JpYmVkCj4gaW4K PiDCoAlzZWN0aW9uIDEuMS4zIGlzIGFwcGxpY2FibGUgaGVyZS4KPiArCj4gwqAJVGhlIGJlbmVm aXQgb2YgdXNpbmcgdGhpcyBpbnRlcmZhY2UgdG8gcmVnaXN0ZXIgc2Vuc29yIGlzCj4gdGhhdCBp dAo+IMKgCWlzIG5vdCByZXF1aXJlIHRvIGV4cGxpY2l0bHkgY2FsbAo+IHRoZXJtYWxfem9uZV9v Zl9zZW5zb3JfdW5yZWdpc3RlcigpCj4gwqAJaW4gZXJyb3IgcGF0aCBvciBkdXJpbmcgZHJpdmVy IHVuYmluZGluZyBhcyB0aGlzIGlzIGRvbmUgYnkKPiBkcml2ZXIKPiDCoAlyZXNvdXJjZSBtYW5h Z2VyLgo+IMKgCj4gLTEuMS42IHZvaWQgZGV2bV90aGVybWFsX3pvbmVfb2Zfc2Vuc29yX3VucmVn aXN0ZXIoc3RydWN0IGRldmljZQo+ICpkZXYsCj4gLQkJc3RydWN0IHRoZXJtYWxfem9uZV9kZXZp Y2UgKnR6ZCkKPiArCTo6Cj4gKwo+ICsJCXZvaWQgZGV2bV90aGVybWFsX3pvbmVfb2Zfc2Vuc29y X3VucmVnaXN0ZXIoc3RydWN0Cj4gZGV2aWNlICpkZXYsCj4gKwkJCQkJCXN0cnVjdAo+IHRoZXJt YWxfem9uZV9kZXZpY2UgKnR6ZCkKPiDCoAo+IMKgCVRoaXMgaW50ZXJmYWNlIGlzIHJlc291cmNl IG1hbmFnZWQgdmVyc2lvbiBvZgo+IMKgCXRoZXJtYWxfem9uZV9vZl9zZW5zb3JfdW5yZWdpc3Rl cigpLgo+IEBAIC0xNDcsMTIzICsxOTgsMTg2IEBAIHRlbXBlcmF0dXJlKSBhbmQgdGhyb3R0bGUg YXBwcm9wcmlhdGUKPiBkZXZpY2VzLgo+IMKgCU5vcm1hbGx5IHRoaXMgZnVuY3Rpb24gd2lsbCBu b3QgbmVlZCB0byBiZSBjYWxsZWQgYW5kIHRoZQo+IHJlc291cmNlCj4gwqAJbWFuYWdlbWVudCBj b2RlIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHJlc291cmNlIGlzIGZyZWVkLgo+IMKgCj4gLTEuMS43 IGludCB0aGVybWFsX3pvbmVfZ2V0X3Nsb3BlKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0 eikKPiArCTo6Cj4gKwo+ICsJCWludCB0aGVybWFsX3pvbmVfZ2V0X3Nsb3BlKHN0cnVjdAo+IHRo ZXJtYWxfem9uZV9kZXZpY2UgKnR6KQo+IMKgCj4gwqAJVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0 byByZWFkIHRoZSBzbG9wZSBhdHRyaWJ1dGUgdmFsdWUKPiDCoAlmb3IgdGhlIHRoZXJtYWwgem9u ZSBkZXZpY2UsIHdoaWNoIG1pZ2h0IGJlIHVzZWZ1bCBmb3IKPiBwbGF0Zm9ybQo+IMKgCWRyaXZl cnMgZm9yIHRlbXBlcmF0dXJlIGNhbGN1bGF0aW9ucy4KPiDCoAo+IC0xLjEuOCBpbnQgdGhlcm1h bF96b25lX2dldF9vZmZzZXQoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6KQo+ICsJOjoK PiArCj4gKwkJaW50IHRoZXJtYWxfem9uZV9nZXRfb2Zmc2V0KHN0cnVjdAo+IHRoZXJtYWxfem9u ZV9kZXZpY2UgKnR6KQo+IMKgCj4gwqAJVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byByZWFkIHRo ZSBvZmZzZXQgYXR0cmlidXRlIHZhbHVlCj4gwqAJZm9yIHRoZSB0aGVybWFsIHpvbmUgZGV2aWNl LCB3aGljaCBtaWdodCBiZSB1c2VmdWwgZm9yCj4gcGxhdGZvcm0KPiDCoAlkcml2ZXJzIGZvciB0 ZW1wZXJhdHVyZSBjYWxjdWxhdGlvbnMuCj4gwqAKPiDCoDEuMiB0aGVybWFsIGNvb2xpbmcgZGV2 aWNlIGludGVyZmFjZQo+IC0xLjIuMSBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZQo+ICp0 aGVybWFsX2Nvb2xpbmdfZGV2aWNlX3JlZ2lzdGVyKGNoYXIgKm5hbWUsCj4gLQkJdm9pZCAqZGV2 ZGF0YSwgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzICopCj4gKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsKPiArCj4gK8KgwqDCoMKgOjoKPiArCj4gKwlz dHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZQo+ICsJKnRoZXJtYWxfY29vbGluZ19kZXZpY2Vf cmVnaXN0ZXIoY2hhciAqbmFtZSwKPiArCQkJdm9pZCAqZGV2ZGF0YSwgc3RydWN0Cj4gdGhlcm1h bF9jb29saW5nX2RldmljZV9vcHMgKikKPiDCoAo+IMKgwqDCoMKgwqBUaGlzIGludGVyZmFjZSBm dW5jdGlvbiBhZGRzIGEgbmV3IHRoZXJtYWwgY29vbGluZyBkZXZpY2UKPiAoZmFuL3Byb2Nlc3Nv ci8uLi4pCj4gLcKgwqDCoMKgdG8gL3N5cy9jbGFzcy90aGVybWFsLyBmb2xkZXIgYXMgY29vbGlu Z19kZXZpY2VbMC0qXS4gSXQgdHJpZXMKPiB0byBiaW5kIGl0c2VsZgo+ICvCoMKgwqDCoHRvIC9z eXMvY2xhc3MvdGhlcm1hbC8gZm9sZGVyIGFzIGBjb29saW5nX2RldmljZVswLSpdYC4gSXQgdHJp ZXMKPiB0byBiaW5kIGl0c2VsZgo+IMKgwqDCoMKgwqB0byBhbGwgdGhlIHRoZXJtYWwgem9uZSBk ZXZpY2VzIHJlZ2lzdGVyZWQgYXQgdGhlIHNhbWUgdGltZS4KPiAtwqDCoMKgwqBuYW1lOiB0aGUg Y29vbGluZyBkZXZpY2UgbmFtZS4KPiAtwqDCoMKgwqBkZXZkYXRhOiBkZXZpY2UgcHJpdmF0ZSBk YXRhLgo+IC3CoMKgwqDCoG9wczogdGhlcm1hbCBjb29saW5nIGRldmljZXMgY2FsbC1iYWNrcy4K PiAtCS5nZXRfbWF4X3N0YXRlOiBnZXQgdGhlIE1heGltdW0gdGhyb3R0bGUgc3RhdGUgb2YgdGhl Cj4gY29vbGluZyBkZXZpY2UuCj4gLQkuZ2V0X2N1cl9zdGF0ZTogZ2V0IHRoZSBDdXJyZW50bHkg cmVxdWVzdGVkIHRocm90dGxlIHN0YXRlCj4gb2YgdGhlIGNvb2xpbmcgZGV2aWNlLgo+IC0JLnNl dF9jdXJfc3RhdGU6IHNldCB0aGUgQ3VycmVudCB0aHJvdHRsZSBzdGF0ZSBvZiB0aGUKPiBjb29s aW5nIGRldmljZS4KPiAtCj4gLTEuMi4yIHZvaWQgdGhlcm1hbF9jb29saW5nX2RldmljZV91bnJl Z2lzdGVyKHN0cnVjdAo+IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYpCj4gKwo+ICvCoMKg wqDCoG5hbWU6Cj4gKwl0aGUgY29vbGluZyBkZXZpY2UgbmFtZS4KPiArwqDCoMKgwqBkZXZkYXRh Ogo+ICsJZGV2aWNlIHByaXZhdGUgZGF0YS4KPiArwqDCoMKgwqBvcHM6Cj4gKwl0aGVybWFsIGNv b2xpbmcgZGV2aWNlcyBjYWxsLWJhY2tzLgo+ICsKPiArCS5nZXRfbWF4X3N0YXRlOgo+ICsJCWdl dCB0aGUgTWF4aW11bSB0aHJvdHRsZSBzdGF0ZSBvZiB0aGUgY29vbGluZwo+IGRldmljZS4KPiAr CS5nZXRfY3VyX3N0YXRlOgo+ICsJCWdldCB0aGUgQ3VycmVudGx5IHJlcXVlc3RlZCB0aHJvdHRs ZSBzdGF0ZSBvZiB0aGUKPiArCQljb29saW5nIGRldmljZS4KPiArCS5zZXRfY3VyX3N0YXRlOgo+ ICsJCXNldCB0aGUgQ3VycmVudCB0aHJvdHRsZSBzdGF0ZSBvZiB0aGUgY29vbGluZwo+IGRldmlj ZS4KPiArCj4gK8KgwqDCoMKgOjoKPiArCj4gKwl2b2lkIHRoZXJtYWxfY29vbGluZ19kZXZpY2Vf dW5yZWdpc3RlcihzdHJ1Y3QKPiB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2KQo+IMKgCj4g wqDCoMKgwqDCoFRoaXMgaW50ZXJmYWNlIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIHRoZXJtYWwgY29v bGluZyBkZXZpY2UuCj4gwqDCoMKgwqDCoEl0IGRlbGV0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgZW50 cnkgZnJvbSAvc3lzL2NsYXNzL3RoZXJtYWwKPiBmb2xkZXIgYW5kCj4gwqDCoMKgwqDCoHVuYmlu ZHMgaXRzZWxmIGZyb20gYWxsIHRoZSB0aGVybWFsIHpvbmUgZGV2aWNlcyB1c2luZyBpdC4KPiDC oAo+IMKgMS4zIGludGVyZmFjZSBmb3IgYmluZGluZyBhIHRoZXJtYWwgem9uZSBkZXZpY2Ugd2l0 aCBhIHRoZXJtYWwKPiBjb29saW5nIGRldmljZQo+IC0xLjMuMSBpbnQgdGhlcm1hbF96b25lX2Jp bmRfY29vbGluZ19kZXZpY2Uoc3RydWN0Cj4gdGhlcm1hbF96b25lX2RldmljZSAqdHosCj4gLQlp bnQgdHJpcCwgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYsCj4gLQl1bnNpZ25l ZCBsb25nIHVwcGVyLCB1bnNpZ25lZCBsb25nIGxvd2VyLCB1bnNpZ25lZCBpbnQKPiB3ZWlnaHQp Owo+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KPiAtLS0tLS0tLS0tLQo+ICsKPiArwqDCoMKgwqA6Ogo+ICsKPiArCWlu dCB0aGVybWFsX3pvbmVfYmluZF9jb29saW5nX2RldmljZShzdHJ1Y3QKPiB0aGVybWFsX3pvbmVf ZGV2aWNlICp0eiwKPiArCQlpbnQgdHJpcCwgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Ug KmNkZXYsCj4gKwkJdW5zaWduZWQgbG9uZyB1cHBlciwgdW5zaWduZWQgbG9uZyBsb3dlciwgdW5z aWduZWQKPiBpbnQgd2VpZ2h0KTsKPiDCoAo+IMKgwqDCoMKgwqBUaGlzIGludGVyZmFjZSBmdW5j dGlvbiBiaW5kcyBhIHRoZXJtYWwgY29vbGluZyBkZXZpY2UgdG8gYQo+IHBhcnRpY3VsYXIgdHJp cAo+IMKgwqDCoMKgwqBwb2ludCBvZiBhIHRoZXJtYWwgem9uZSBkZXZpY2UuCj4gKwo+IMKgwqDC oMKgwqBUaGlzIGZ1bmN0aW9uIGlzIHVzdWFsbHkgY2FsbGVkIGluIHRoZSB0aGVybWFsIHpvbmUg ZGV2aWNlIC5iaW5kCj4gY2FsbGJhY2suCj4gLcKgwqDCoMKgdHo6IHRoZSB0aGVybWFsIHpvbmUg ZGV2aWNlCj4gLcKgwqDCoMKgY2RldjogdGhlcm1hbCBjb29saW5nIGRldmljZQo+IC3CoMKgwqDC oHRyaXA6IGluZGljYXRlcyB3aGljaCB0cmlwIHBvaW50IGluIHRoaXMgdGhlcm1hbCB6b25lIHRo ZQo+IGNvb2xpbmcgZGV2aWNlCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgaXMgYXNzb2NpYXRlZCB3 aXRoLgo+IC3CoMKgwqDCoHVwcGVyOnRoZSBNYXhpbXVtIGNvb2xpbmcgc3RhdGUgZm9yIHRoaXMg dHJpcCBwb2ludC4KPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqBUSEVSTUFMX05PX0xJTUlUIG1lYW5z IG5vIHVwcGVyIGxpbWl0LAo+ICsKPiArwqDCoMKgwqB0ejoKPiArCcKgwqB0aGUgdGhlcm1hbCB6 b25lIGRldmljZQo+ICvCoMKgwqDCoGNkZXY6Cj4gKwnCoMKgdGhlcm1hbCBjb29saW5nIGRldmlj ZQo+ICvCoMKgwqDCoHRyaXA6Cj4gKwnCoMKgaW5kaWNhdGVzIHdoaWNoIHRyaXAgcG9pbnQgaW4g dGhpcyB0aGVybWFsIHpvbmUgdGhlCj4gY29vbGluZyBkZXZpY2UKPiArCcKgwqBpcyBhc3NvY2lh dGVkIHdpdGguCj4gK8KgwqDCoMKgdXBwZXI6Cj4gKwnCoMKgdGhlIE1heGltdW0gY29vbGluZyBz dGF0ZSBmb3IgdGhpcyB0cmlwIHBvaW50Lgo+ICsJwqDCoFRIRVJNQUxfTk9fTElNSVQgbWVhbnMg bm8gdXBwZXIgbGltaXQsCj4gwqAJwqDCoGFuZCB0aGUgY29vbGluZyBkZXZpY2UgY2FuIGJlIGlu IG1heF9zdGF0ZS4KPiAtwqDCoMKgwqBsb3dlcjp0aGUgTWluaW11bSBjb29saW5nIHN0YXRlIGNh biBiZSB1c2VkIGZvciB0aGlzIHRyaXAgcG9pbnQuCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgVEhF Uk1BTF9OT19MSU1JVCBtZWFucyBubyBsb3dlciBsaW1pdCwKPiArwqDCoMKgwqBsb3dlcjoKPiAr CcKgwqB0aGUgTWluaW11bSBjb29saW5nIHN0YXRlIGNhbiBiZSB1c2VkIGZvciB0aGlzIHRyaXAg cG9pbnQuCj4gKwnCoMKgVEhFUk1BTF9OT19MSU1JVCBtZWFucyBubyBsb3dlciBsaW1pdCwKPiDC oAnCoMKgYW5kIHRoZSBjb29saW5nIGRldmljZSBjYW4gYmUgaW4gY29vbGluZyBzdGF0ZSAwLgo+ IC3CoMKgwqDCoHdlaWdodDogdGhlIGluZmx1ZW5jZSBvZiB0aGlzIGNvb2xpbmcgZGV2aWNlIGlu IHRoaXMgdGhlcm1hbAo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB6b25lLsKgwqBTZWUgMS40 LjEgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uCj4gK8KgwqDCoMKgd2VpZ2h0Ogo+ICsJwqDC oHRoZSBpbmZsdWVuY2Ugb2YgdGhpcyBjb29saW5nIGRldmljZSBpbiB0aGlzIHRoZXJtYWwKPiAr CcKgwqB6b25lLsKgwqBTZWUgMS40LjEgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uCj4gwqAK PiAtMS4zLjIgaW50IHRoZXJtYWxfem9uZV91bmJpbmRfY29vbGluZ19kZXZpY2Uoc3RydWN0Cj4g dGhlcm1hbF96b25lX2RldmljZSAqdHosCj4gLQkJaW50IHRyaXAsIHN0cnVjdCB0aGVybWFsX2Nv b2xpbmdfZGV2aWNlICpjZGV2KTsKPiArwqDCoMKgwqA6Ogo+ICsKPiArCWludCB0aGVybWFsX3pv bmVfdW5iaW5kX2Nvb2xpbmdfZGV2aWNlKHN0cnVjdAo+IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6 LAo+ICsJCQkJaW50IHRyaXAsIHN0cnVjdAo+IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYp Owo+IMKgCj4gwqDCoMKgwqDCoFRoaXMgaW50ZXJmYWNlIGZ1bmN0aW9uIHVuYmluZHMgYSB0aGVy bWFsIGNvb2xpbmcgZGV2aWNlIGZyb20gYQo+IHBhcnRpY3VsYXIKPiDCoMKgwqDCoMKgdHJpcCBw b2ludCBvZiBhIHRoZXJtYWwgem9uZSBkZXZpY2UuIFRoaXMgZnVuY3Rpb24gaXMgdXN1YWxseQo+ IGNhbGxlZCBpbgo+IMKgwqDCoMKgwqB0aGUgdGhlcm1hbCB6b25lIGRldmljZSAudW5iaW5kIGNh bGxiYWNrLgo+IC3CoMKgwqDCoHR6OiB0aGUgdGhlcm1hbCB6b25lIGRldmljZQo+IC3CoMKgwqDC oGNkZXY6IHRoZXJtYWwgY29vbGluZyBkZXZpY2UKPiAtwqDCoMKgwqB0cmlwOiBpbmRpY2F0ZXMg d2hpY2ggdHJpcCBwb2ludCBpbiB0aGlzIHRoZXJtYWwgem9uZSB0aGUKPiBjb29saW5nIGRldmlj ZQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoGlzIGFzc29jaWF0ZWQgd2l0aC4KPiArCj4gK8KgwqDC oMKgdHo6Cj4gKwl0aGUgdGhlcm1hbCB6b25lIGRldmljZQo+ICvCoMKgwqDCoGNkZXY6Cj4gKwl0 aGVybWFsIGNvb2xpbmcgZGV2aWNlCj4gK8KgwqDCoMKgdHJpcDoKPiArCWluZGljYXRlcyB3aGlj aCB0cmlwIHBvaW50IGluIHRoaXMgdGhlcm1hbCB6b25lIHRoZSBjb29saW5nCj4gZGV2aWNlCj4g KwlpcyBhc3NvY2lhdGVkIHdpdGguCj4gwqAKPiDCoDEuNCBUaGVybWFsIFpvbmUgUGFyYW1ldGVy cwo+IC0xLjQuMSBzdHJ1Y3QgdGhlcm1hbF9iaW5kX3BhcmFtcwo+ICstLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KPiArCj4gK8KgwqDCoMKgOjoKPiArCj4gKwlzdHJ1Y3QgdGhlcm1hbF9iaW5k X3BhcmFtcwo+ICsKPiDCoMKgwqDCoMKgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZm9sbG93 aW5nIHBhcmFtZXRlcnMgdGhhdCBhcmUgdXNlZCB0bwo+IGJpbmQKPiDCoMKgwqDCoMKgYSB6b25l IHdpdGggYSBjb29saW5nIGRldmljZSBmb3IgYSBwYXJ0aWN1bGFyIHRyaXAgcG9pbnQuCj4gLcKg wqDCoMKgLmNkZXY6IFRoZSBjb29saW5nIGRldmljZSBwb2ludGVyCj4gLcKgwqDCoMKgLndlaWdo dDogVGhlICdpbmZsdWVuY2UnIG9mIGEgcGFydGljdWxhciBjb29saW5nIGRldmljZSBvbiB0aGlz Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgem9uZS4gVGhpcyBpcyByZWxhdGl2ZSB0byB0 aGUgcmVzdCBvZiB0aGUgY29vbGluZwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRldmlj ZXMuIEZvciBleGFtcGxlLCBpZiBhbGwgY29vbGluZyBkZXZpY2VzIGhhdmUgYQo+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHdlaWdodCBvZiAxLCB0aGVuIHRoZXkgYWxsIGNvbnRyaWJ1dGUg dGhlIHNhbWUuIFlvdSBjYW4KPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB1c2UgcGVyY2Vu dGFnZXMgaWYgeW91IHdhbnQsIGJ1dCBpdCdzIG5vdCBtYW5kYXRvcnkuIEEKPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqB3ZWlnaHQgb2YgMCBtZWFucyB0aGF0IHRoaXMgY29vbGluZyBkZXZp Y2UgZG9lc24ndAo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNvbnRyaWJ1dGUgdG8gdGhl IGNvb2xpbmcgb2YgdGhpcyB6b25lIHVubGVzcyBhbGwKPiBjb29saW5nCj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZGV2aWNlcyBoYXZlIGEgd2VpZ2h0IG9mIDAuIElmIGFsbCB3ZWlnaHRz IGFyZSAwLCB0aGVuCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdGhleSBhbGwgY29udHJp YnV0ZSB0aGUgc2FtZS4KPiAtwqDCoMKgwqAudHJpcF9tYXNrOlRoaXMgaXMgYSBiaXQgbWFzayB0 aGF0IGdpdmVzIHRoZSBiaW5kaW5nIHJlbGF0aW9uCj4gYmV0d2Vlbgo+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqB0aGlzIHRoZXJtYWwgem9uZSBhbmQgY2RldiwgZm9yIGEgcGFydGlj dWxhciB0cmlwCj4gcG9pbnQuCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoElmIG50 aCBiaXQgaXMgc2V0LCB0aGVuIHRoZSBjZGV2IGFuZCB0aGVybWFsIHpvbmUgYXJlCj4gYm91bmQK PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZm9yIHRyaXAgcG9pbnQgbi4KPiAtwqDC oMKgwqAuYmluZGluZ19saW1pdHM6IFRoaXMgaXMgYW4gYXJyYXkgb2YgY29vbGluZyBzdGF0ZSBs aW1pdHMuIE11c3QKPiBoYXZlCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGV4YWN0bHkgMiAqIHRoZXJtYWxfem9uZS5udW1iZXJfb2ZfdHJpcF9wb2ludHMuCj4g SXQgaXMgYW4KPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYXJy YXkgY29uc2lzdGluZyBvZiB0dXBsZXMgPGxvd2VyLXN0YXRlIHVwcGVyLQo+IHN0YXRlPiBvZgo+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzdGF0ZSBsaW1pdHMu IEVhY2ggdHJpcCB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aAo+IG9uZSBzdGF0ZQo+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsaW1pdCB0dXBsZSB3aGVuIGJpbmRp bmcuIEEgTlVMTCBwb2ludGVyIG1lYW5zCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoDxUSEVSTUFMX05PX0xJTUlUUyBUSEVSTUFMX05PX0xJTUlUUz4gb24gYWxs Cj4gdHJpcHMuCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFRo ZXNlIGxpbWl0cyBhcmUgdXNlZCB3aGVuIGJpbmRpbmcgYSBjZGV2IHRvIGEKPiB0cmlwIHBvaW50 Lgo+IC3CoMKgwqDCoC5tYXRjaDogVGhpcyBjYWxsIGJhY2sgcmV0dXJucyBzdWNjZXNzKDApIGlm IHRoZSAndHogYW5kIGNkZXYnCj4gbmVlZCB0bwo+ICsKPiArwqDCoMKgwqAuY2RldjoKPiArCcKg wqDCoMKgwqBUaGUgY29vbGluZyBkZXZpY2UgcG9pbnRlcgo+ICvCoMKgwqDCoC53ZWlnaHQ6Cj4g KwnCoMKgwqDCoMKgVGhlICdpbmZsdWVuY2UnIG9mIGEgcGFydGljdWxhciBjb29saW5nIGRldmlj ZSBvbiB0aGlzCj4gKwnCoMKgwqDCoMKgem9uZS4gVGhpcyBpcyByZWxhdGl2ZSB0byB0aGUgcmVz dCBvZiB0aGUgY29vbGluZwo+ICsJwqDCoMKgwqDCoGRldmljZXMuIEZvciBleGFtcGxlLCBpZiBh bGwgY29vbGluZyBkZXZpY2VzIGhhdmUgYQo+ICsJwqDCoMKgwqDCoHdlaWdodCBvZiAxLCB0aGVu IHRoZXkgYWxsIGNvbnRyaWJ1dGUgdGhlIHNhbWUuIFlvdSBjYW4KPiArCcKgwqDCoMKgwqB1c2Ug cGVyY2VudGFnZXMgaWYgeW91IHdhbnQsIGJ1dCBpdCdzIG5vdCBtYW5kYXRvcnkuIEEKPiArCcKg wqDCoMKgwqB3ZWlnaHQgb2YgMCBtZWFucyB0aGF0IHRoaXMgY29vbGluZyBkZXZpY2UgZG9lc24n dAo+ICsJwqDCoMKgwqDCoGNvbnRyaWJ1dGUgdG8gdGhlIGNvb2xpbmcgb2YgdGhpcyB6b25lIHVu bGVzcyBhbGwKPiBjb29saW5nCj4gKwnCoMKgwqDCoMKgZGV2aWNlcyBoYXZlIGEgd2VpZ2h0IG9m IDAuIElmIGFsbCB3ZWlnaHRzIGFyZSAwLCB0aGVuCj4gKwnCoMKgwqDCoMKgdGhleSBhbGwgY29u dHJpYnV0ZSB0aGUgc2FtZS4KPiArwqDCoMKgwqAudHJpcF9tYXNrOgo+ICsJwqDCoMKgwqDCoMKg wqBUaGlzIGlzIGEgYml0IG1hc2sgdGhhdCBnaXZlcyB0aGUgYmluZGluZyByZWxhdGlvbgo+IGJl dHdlZW4KPiArCcKgwqDCoMKgwqDCoMKgdGhpcyB0aGVybWFsIHpvbmUgYW5kIGNkZXYsIGZvciBh IHBhcnRpY3VsYXIgdHJpcAo+IHBvaW50Lgo+ICsJwqDCoMKgwqDCoMKgwqBJZiBudGggYml0IGlz IHNldCwgdGhlbiB0aGUgY2RldiBhbmQgdGhlcm1hbCB6b25lIGFyZQo+IGJvdW5kCj4gKwnCoMKg wqDCoMKgwqDCoGZvciB0cmlwIHBvaW50IG4uCj4gK8KgwqDCoMKgLmJpbmRpbmdfbGltaXRzOgo+ ICsJCcKgwqDCoMKgwqBUaGlzIGlzIGFuIGFycmF5IG9mIGNvb2xpbmcgc3RhdGUgbGltaXRzLiBN dXN0Cj4gaGF2ZQo+ICsJCcKgwqDCoMKgwqBleGFjdGx5IDIgKiB0aGVybWFsX3pvbmUubnVtYmVy X29mX3RyaXBfcG9pbnRzLgo+IEl0IGlzIGFuCj4gKwkJwqDCoMKgwqDCoGFycmF5IGNvbnNpc3Rp bmcgb2YgdHVwbGVzIDxsb3dlci1zdGF0ZSB1cHBlci0KPiBzdGF0ZT4gb2YKPiArCQnCoMKgwqDC oMKgc3RhdGUgbGltaXRzLiBFYWNoIHRyaXAgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGgKPiBvbmUg c3RhdGUKPiArCQnCoMKgwqDCoMKgbGltaXQgdHVwbGUgd2hlbiBiaW5kaW5nLiBBIE5VTEwgcG9p bnRlciBtZWFucwo+ICsJCcKgwqDCoMKgwqA8VEhFUk1BTF9OT19MSU1JVFMgVEhFUk1BTF9OT19M SU1JVFM+IG9uIGFsbAo+IHRyaXBzLgo+ICsJCcKgwqDCoMKgwqBUaGVzZSBsaW1pdHMgYXJlIHVz ZWQgd2hlbiBiaW5kaW5nIGEgY2RldiB0byBhCj4gdHJpcCBwb2ludC4KPiArwqDCoMKgwqAubWF0 Y2g6Cj4gKwnCoMKgwqDCoFRoaXMgY2FsbCBiYWNrIHJldHVybnMgc3VjY2VzcygwKSBpZiB0aGUg J3R6IGFuZCBjZGV2Jwo+IG5lZWQgdG8KPiDCoAnCoMKgwqDCoGJlIGJvdW5kLCBhcyBwZXIgcGxh dGZvcm0gZGF0YS4KPiAtMS40LjIgc3RydWN0IHRoZXJtYWxfem9uZV9wYXJhbXMKPiArCj4gK8Kg wqDCoMKgOjoKPiArCj4gKwlzdHJ1Y3QgdGhlcm1hbF96b25lX3BhcmFtcwo+ICsKPiDCoMKgwqDC oMKgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgcGxhdGZvcm0gbGV2ZWwgcGFyYW1ldGVycyBm b3IgYQo+IHRoZXJtYWwgem9uZS4KPiDCoMKgwqDCoMKgVGhpcyBkYXRhLCBmb3IgZWFjaCB0aGVy bWFsIHpvbmUgc2hvdWxkIGNvbWUgZnJvbSB0aGUgcGxhdGZvcm0KPiBsYXllci4KPiDCoMKgwqDC oMKgVGhpcyBpcyBhbiBvcHRpb25hbCBmZWF0dXJlIHdoZXJlIHNvbWUgcGxhdGZvcm1zIGNhbiBj aG9vc2Ugbm90Cj4gdG8KPiDCoMKgwqDCoMKgcHJvdmlkZSB0aGlzIGRhdGEuCj4gLcKgwqDCoMKg LmdvdmVybm9yX25hbWU6IE5hbWUgb2YgdGhlIHRoZXJtYWwgZ292ZXJub3IgdXNlZCBmb3IgdGhp cyB6b25lCj4gLcKgwqDCoMKgLm5vX2h3bW9uOiBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgaWYgdGhl IHRoZXJtYWwgdG8gaHdtb24gc3lzZnMKPiBpbnRlcmZhY2UKPiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgaXMgcmVxdWlyZWQuIHdoZW4gbm9faHdtb24gPT0gZmFsc2UsIGEgaHdtb24g c3lzZnMKPiBpbnRlcmZhY2UKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgd2lsbCBi ZSBjcmVhdGVkLiB3aGVuIG5vX2h3bW9uID09IHRydWUsIG5vdGhpbmcgd2lsbAo+IGJlIGRvbmUu Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoEluIGNhc2UgdGhlIHRoZXJtYWxfem9u ZV9wYXJhbXMgaXMgTlVMTCwgdGhlIGh3bW9uCj4gaW50ZXJmYWNlCj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHdpbGwgYmUgY3JlYXRlZCAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxp dHkpLgo+IC3CoMKgwqDCoC5udW1fdGJwczogTnVtYmVyIG9mIHRoZXJtYWxfYmluZF9wYXJhbXMg ZW50cmllcyBmb3IgdGhpcyB6b25lCj4gLcKgwqDCoMKgLnRicDogdGhlcm1hbF9iaW5kX3BhcmFt cyBlbnRyaWVzCj4gKwo+ICvCoMKgwqDCoC5nb3Zlcm5vcl9uYW1lOgo+ICsJwqDCoMKgwqDCoMKg wqBOYW1lIG9mIHRoZSB0aGVybWFsIGdvdmVybm9yIHVzZWQgZm9yIHRoaXMgem9uZQo+ICvCoMKg wqDCoC5ub19od21vbjoKPiArCcKgwqDCoMKgwqDCoMKgYSBib29sZWFuIHRvIGluZGljYXRlIGlm IHRoZSB0aGVybWFsIHRvIGh3bW9uIHN5c2ZzCj4gaW50ZXJmYWNlCj4gKwnCoMKgwqDCoMKgwqDC oGlzIHJlcXVpcmVkLiB3aGVuIG5vX2h3bW9uID09IGZhbHNlLCBhIGh3bW9uIHN5c2ZzCj4gaW50 ZXJmYWNlCj4gKwnCoMKgwqDCoMKgwqDCoHdpbGwgYmUgY3JlYXRlZC4gd2hlbiBub19od21vbiA9 PSB0cnVlLCBub3RoaW5nIHdpbGwKPiBiZSBkb25lLgo+ICsJwqDCoMKgwqDCoMKgwqBJbiBjYXNl IHRoZSB0aGVybWFsX3pvbmVfcGFyYW1zIGlzIE5VTEwsIHRoZSBod21vbgo+IGludGVyZmFjZQo+ ICsJwqDCoMKgwqDCoMKgwqB3aWxsIGJlIGNyZWF0ZWQgKGZvciBiYWNrd2FyZCBjb21wYXRpYmls aXR5KS4KPiArwqDCoMKgwqAubnVtX3RicHM6Cj4gKwnCoMKgwqDCoMKgwqDCoE51bWJlciBvZiB0 aGVybWFsX2JpbmRfcGFyYW1zIGVudHJpZXMgZm9yIHRoaXMgem9uZQo+ICvCoMKgwqDCoC50YnA6 Cj4gKwnCoMKgwqDCoMKgwqDCoHRoZXJtYWxfYmluZF9wYXJhbXMgZW50cmllcwo+IMKgCj4gwqAy LiBzeXNmcyBhdHRyaWJ1dGVzIHN0cnVjdHVyZQo+ICs9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQo+IMKgCj4gKz09CT09PT09PT09PT09PT09PT0KPiDCoFJPCXJlYWQgb25seSB2YWx1ZQo+ IMKgV08Jd3JpdGUgb25seSB2YWx1ZQo+IMKgUlcJcmVhZC93cml0ZSB2YWx1ZQo+ICs9PQk9PT09 PT09PT09PT09PT09Cj4gwqAKPiDCoFRoZXJtYWwgc3lzZnMgYXR0cmlidXRlcyB3aWxsIGJlIHJl cHJlc2VudGVkIHVuZGVyCj4gL3N5cy9jbGFzcy90aGVybWFsLgo+IMKgSHdtb24gc3lzZnMgSS9G IGV4dGVuc2lvbiBpcyBhbHNvIGF2YWlsYWJsZSB1bmRlciAvc3lzL2NsYXNzL2h3bW9uCj4gwqBp ZiBod21vbiBpcyBjb21waWxlZCBpbiBvciBidWlsdCBhcyBhIG1vZHVsZS4KPiDCoAo+IC1UaGVy bWFsIHpvbmUgZGV2aWNlIHN5cyBJL0YsIGNyZWF0ZWQgb25jZSBpdCdzIHJlZ2lzdGVyZWQ6Cj4g LS9zeXMvY2xhc3MvdGhlcm1hbC90aGVybWFsX3pvbmVbMC0qXToKPiArVGhlcm1hbCB6b25lIGRl dmljZSBzeXMgSS9GLCBjcmVhdGVkIG9uY2UgaXQncyByZWdpc3RlcmVkOjoKPiArCj4gK8KgwqAv c3lzL2NsYXNzL3RoZXJtYWwvdGhlcm1hbF96b25lWzAtKl06Cj4gwqDCoMKgwqDCoHwtLS10eXBl OgkJCVR5cGUgb2YgdGhlIHRoZXJtYWwgem9uZQo+IMKgwqDCoMKgwqB8LS0tdGVtcDoJCQlDdXJy ZW50IHRlbXBlcmF0dXJlCj4gwqDCoMKgwqDCoHwtLS1tb2RlOgkJCVdvcmtpbmcgbW9kZSBvZiB0 aGUgdGhlcm1hbAo+IHpvbmUKPiBAQCAtMjgyLDggKzM5Niw5IEBAIFRoZXJtYWwgem9uZSBkZXZp Y2Ugc3lzIEkvRiwgY3JlYXRlZCBvbmNlIGl0J3MKPiByZWdpc3RlcmVkOgo+IMKgwqDCoMKgwqB8 LS0tc2xvcGU6wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgU2xvcGUgY29uc3Rh bnQgYXBwbGllZCBhcyBsaW5lYXIKPiBleHRyYXBvbGF0aW9uCj4gwqDCoMKgwqDCoHwtLS1vZmZz ZXQ6wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoE9mZnNldCBjb25zdGFudCBhcHBs aWVkIGFzIGxpbmVhcgo+IGV4dHJhcG9sYXRpb24KPiDCoAo+IC1UaGVybWFsIGNvb2xpbmcgZGV2 aWNlIHN5cyBJL0YsIGNyZWF0ZWQgb25jZSBpdCdzIHJlZ2lzdGVyZWQ6Cj4gLS9zeXMvY2xhc3Mv dGhlcm1hbC9jb29saW5nX2RldmljZVswLSpdOgo+ICtUaGVybWFsIGNvb2xpbmcgZGV2aWNlIHN5 cyBJL0YsIGNyZWF0ZWQgb25jZSBpdCdzIHJlZ2lzdGVyZWQ6Ogo+ICsKPiArwqDCoC9zeXMvY2xh c3MvdGhlcm1hbC9jb29saW5nX2RldmljZVswLSpdOgo+IMKgwqDCoMKgwqB8LS0tdHlwZToJCQlU eXBlIG9mIHRoZSBjb29saW5nCj4gZGV2aWNlKHByb2Nlc3Nvci9mYW4vLi4uKQo+IMKgwqDCoMKg wqB8LS0tbWF4X3N0YXRlOgkJTWF4aW11bSBjb29saW5nIHN0YXRlIG9mIHRoZQo+IGNvb2xpbmcg ZGV2aWNlCj4gwqDCoMKgwqDCoHwtLS1jdXJfc3RhdGU6CQlDdXJyZW50IGNvb2xpbmcgc3RhdGUg b2YgdGhlCj4gY29vbGluZyBkZXZpY2UKPiBAQCAtMjk5LDExICs0MTQsMTMgQEAgdGhlIHJlbGF0 aW9uc2hpcCBiZXR3ZWVuIGEgdGhlcm1hbCB6b25lIGFuZCBpdHMKPiBhc3NvY2lhdGVkIGNvb2xp bmcgZGV2aWNlLgo+IMKgVGhleSBhcmUgY3JlYXRlZC9yZW1vdmVkIGZvciBlYWNoIHN1Y2Nlc3Nm dWwgZXhlY3V0aW9uIG9mCj4gwqB0aGVybWFsX3pvbmVfYmluZF9jb29saW5nX2RldmljZS90aGVy bWFsX3pvbmVfdW5iaW5kX2Nvb2xpbmdfZGV2aWNlLgo+IMKgCj4gLS9zeXMvY2xhc3MvdGhlcm1h bC90aGVybWFsX3pvbmVbMC0qXToKPiArOjoKPiArCj4gK8KgwqAvc3lzL2NsYXNzL3RoZXJtYWwv dGhlcm1hbF96b25lWzAtKl06Cj4gwqDCoMKgwqDCoHwtLS1jZGV2WzAtKl06CQlbMC0qXXRoIGNv b2xpbmcgZGV2aWNlIGluIGN1cnJlbnQKPiB0aGVybWFsIHpvbmUKPiDCoMKgwqDCoMKgfC0tLWNk ZXZbMC0qXV90cmlwX3BvaW50OglUcmlwIHBvaW50IHRoYXQgY2RldlswLSpdIGlzCj4gYXNzb2Np YXRlZCB3aXRoCj4gwqDCoMKgwqDCoHwtLS1jZGV2WzAtKl1fd2VpZ2h0OsKgwqDCoMKgwqDCoMKg SW5mbHVlbmNlIG9mIHRoZSBjb29saW5nIGRldmljZSBpbgo+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdGhpcyB0aGVybWFs IHpvbmUKPiArCQkJCXRoaXMgdGhlcm1hbCB6b25lCj4gwqAKPiDCoEJlc2lkZXMgdGhlIHRoZXJt YWwgem9uZSBkZXZpY2Ugc3lzZnMgSS9GIGFuZCBjb29saW5nIGRldmljZSBzeXNmcwo+IEkvRiwK PiDCoHRoZSBnZW5lcmljIHRoZXJtYWwgZHJpdmVyIGFsc28gY3JlYXRlcyBhIGh3bW9uIHN5c2Zz IEkvRiBmb3IgZWFjaAo+IF90eXBlXwo+IEBAIC0zMTEsMTYgKzQyOCwxNyBAQCBvZiB0aGVybWFs IHpvbmUgZGV2aWNlLiBFLmcuIHRoZSBnZW5lcmljCj4gdGhlcm1hbCBkcml2ZXIgcmVnaXN0ZXJz IG9uZSBod21vbgo+IMKgY2xhc3MgZGV2aWNlIGFuZCBidWlsZCB0aGUgYXNzb2NpYXRlZCBod21v biBzeXNmcyBJL0YgZm9yIGFsbCB0aGUKPiByZWdpc3RlcmVkCj4gwqBBQ1BJIHRoZXJtYWwgem9u ZXMuCj4gwqAKPiAtL3N5cy9jbGFzcy9od21vbi9od21vblswLSpdOgo+ICs6Ogo+ICsKPiArwqDC oC9zeXMvY2xhc3MvaHdtb24vaHdtb25bMC0qXToKPiDCoMKgwqDCoMKgfC0tLW5hbWU6CQkJVGhl IHR5cGUgb2YgdGhlIHRoZXJtYWwgem9uZQo+IGRldmljZXMKPiDCoMKgwqDCoMKgfC0tLXRlbXBb MS0qXV9pbnB1dDoJVGhlIGN1cnJlbnQgdGVtcGVyYXR1cmUgb2YgdGhlcm1hbAo+IHpvbmUgWzEt Kl0KPiDCoMKgwqDCoMKgfC0tLXRlbXBbMS0qXV9jcml0aWNhbDoJVGhlIGNyaXRpY2FsIHRyaXAg cG9pbnQgb2YKPiB0aGVybWFsIHpvbmUgWzEtKl0KPiDCoAo+IMKgUGxlYXNlIHJlYWQgRG9jdW1l bnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UucnN0IGZvciBhZGRpdGlvbmFsCj4gaW5mb3Jt YXRpb24uCj4gwqAKPiAtKioqKioqKioqKioqKioqKioqKioqKioqKioqCj4gLSogVGhlcm1hbCB6 b25lIGF0dHJpYnV0ZXMgKgo+IC0qKioqKioqKioqKioqKioqKioqKioqKioqKioKPiArVGhlcm1h bCB6b25lIGF0dHJpYnV0ZXMKPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiDCoAo+IMKgdHlw ZQo+IMKgCVN0cmluZ3Mgd2hpY2ggcmVwcmVzZW50IHRoZSB0aGVybWFsIHpvbmUgdHlwZS4KPiBA QCAtMzQwLDU0ICs0NTgsNjcgQEAgbW9kZQo+IMKgCVRoaXMgZmlsZSBnaXZlcyBpbmZvcm1hdGlv biBhYm91dCB0aGUgYWxnb3JpdGhtIHRoYXQgaXMKPiBjdXJyZW50bHkKPiDCoAltYW5hZ2luZyB0 aGUgdGhlcm1hbCB6b25lLiBJdCBjYW4gYmUgZWl0aGVyIGRlZmF1bHQga2VybmVsCj4gYmFzZWQK PiDCoAlhbGdvcml0aG0gb3IgdXNlciBzcGFjZSBhcHBsaWNhdGlvbi4KPiAtCWVuYWJsZWQJCT0g ZW5hYmxlIEtlcm5lbCBUaGVybWFsIG1hbmFnZW1lbnQuCj4gLQlkaXNhYmxlZAk9IFByZXZlbnRp bmcga2VybmVsIHRoZXJtYWwgem9uZSBkcml2ZXIKPiBhY3Rpb25zIHVwb24KPiArCj4gKwllbmFi bGVkCj4gKwkJCcKgwqBlbmFibGUgS2VybmVsIFRoZXJtYWwgbWFuYWdlbWVudC4KPiArCWRpc2Fi bGVkCj4gKwkJCcKgwqBQcmV2ZW50aW5nIGtlcm5lbCB0aGVybWFsIHpvbmUgZHJpdmVyCj4gYWN0 aW9ucyB1cG9uCj4gwqAJCQnCoMKgdHJpcCBwb2ludHMgc28gdGhhdCB1c2VyIGFwcGxpY2F0aW9u IGNhbgo+IHRha2UgZnVsbAo+IMKgCQkJwqDCoGNoYXJnZSBvZiB0aGUgdGhlcm1hbCBtYW5hZ2Vt ZW50Lgo+ICsKPiDCoAlSVywgT3B0aW9uYWwKPiDCoAo+IMKgcG9saWN5Cj4gwqAJT25lIG9mIHRo ZSB2YXJpb3VzIHRoZXJtYWwgZ292ZXJub3JzIHVzZWQgZm9yIGEgcGFydGljdWxhcgo+IHpvbmUu Cj4gKwo+IMKgCVJXLCBSZXF1aXJlZAo+IMKgCj4gwqBhdmFpbGFibGVfcG9saWNpZXMKPiDCoAlB dmFpbGFibGUgdGhlcm1hbCBnb3Zlcm5vcnMgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGEKPiBwYXJ0 aWN1bGFyIHpvbmUuCj4gKwo+IMKgCVJPLCBSZXF1aXJlZAo+IMKgCj4gLXRyaXBfcG9pbnRfWzAt Kl1fdGVtcAo+ICtgdHJpcF9wb2ludF9bMC0qXV90ZW1wYAo+IMKgCVRoZSB0ZW1wZXJhdHVyZSBh Ym92ZSB3aGljaCB0cmlwIHBvaW50IHdpbGwgYmUgZmlyZWQuCj4gKwo+IMKgCVVuaXQ6IG1pbGxp ZGVncmVlIENlbHNpdXMKPiArCj4gwqAJUk8sIE9wdGlvbmFsCj4gwqAKPiAtdHJpcF9wb2ludF9b MC0qXV90eXBlCj4gK2B0cmlwX3BvaW50X1swLSpdX3R5cGVgCj4gwqAJU3RyaW5ncyB3aGljaCBp bmRpY2F0ZSB0aGUgdHlwZSBvZiB0aGUgdHJpcCBwb2ludC4KPiAtCUUuZy4gaXQgY2FuIGJlIG9u ZSBvZiBjcml0aWNhbCwgaG90LCBwYXNzaXZlLCBhY3RpdmVbMC0qXQo+IGZvciBBQ1BJCj4gKwo+ ICsJRS5nLiBpdCBjYW4gYmUgb25lIG9mIGNyaXRpY2FsLCBob3QsIHBhc3NpdmUsIGBhY3RpdmVb MC0qXWAKPiBmb3IgQUNQSQo+IMKgCXRoZXJtYWwgem9uZS4KPiArCj4gwqAJUk8sIE9wdGlvbmFs Cj4gwqAKPiAtdHJpcF9wb2ludF9bMC0qXV9oeXN0Cj4gK2B0cmlwX3BvaW50X1swLSpdX2h5c3Rg Cj4gwqAJVGhlIGh5c3RlcmVzaXMgdmFsdWUgZm9yIGEgdHJpcCBwb2ludCwgcmVwcmVzZW50ZWQg YXMgYW4KPiBpbnRlZ2VyCj4gwqAJVW5pdDogQ2Vsc2l1cwo+IMKgCVJXLCBPcHRpb25hbAo+IMKg Cj4gLWNkZXZbMC0qXQo+ICtgY2RldlswLSpdYAo+IMKgCVN5c2ZzIGxpbmsgdG8gdGhlIHRoZXJt YWwgY29vbGluZyBkZXZpY2Ugbm9kZSB3aGVyZSB0aGUgc3lzCj4gSS9GCj4gwqAJZm9yIGNvb2xp bmcgZGV2aWNlIHRocm90dGxpbmcgY29udHJvbCByZXByZXNlbnRzLgo+ICsKPiDCoAlSTywgT3B0 aW9uYWwKPiDCoAo+IC1jZGV2WzAtKl1fdHJpcF9wb2ludAo+IC0JVGhlIHRyaXAgcG9pbnQgaW4g dGhpcyB0aGVybWFsIHpvbmUgd2hpY2ggY2RldlswLSpdIGlzCj4gYXNzb2NpYXRlZAo+ICtgY2Rl dlswLSpdX3RyaXBfcG9pbnRgCj4gKwlUaGUgdHJpcCBwb2ludCBpbiB0aGlzIHRoZXJtYWwgem9u ZSB3aGljaCBgY2RldlswLSpdYCBpcwo+IGFzc29jaWF0ZWQKPiDCoAl3aXRoOyAtMSBtZWFucyB0 aGUgY29vbGluZyBkZXZpY2UgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkKPiB0cmlwCj4gwqAJ cG9pbnQuCj4gKwo+IMKgCVJPLCBPcHRpb25hbAo+IMKgCj4gLWNkZXZbMC0qXV93ZWlnaHQKPiAt wqDCoMKgwqDCoMKgwqDCoFRoZSBpbmZsdWVuY2Ugb2YgY2RldlswLSpdIGluIHRoaXMgdGhlcm1h bCB6b25lLiBUaGlzIHZhbHVlCj4gLcKgwqDCoMKgwqDCoMKgwqBpcyByZWxhdGl2ZSB0byB0aGUg cmVzdCBvZiBjb29saW5nIGRldmljZXMgaW4gdGhlIHRoZXJtYWwKPiAtwqDCoMKgwqDCoMKgwqDC oHpvbmUuIEZvciBleGFtcGxlLCBpZiBhIGNvb2xpbmcgZGV2aWNlIGhhcyBhIHdlaWdodCBkb3Vi bGUKPiAtwqDCoMKgwqDCoMKgwqDCoHRoYW4gdGhhdCBvZiBvdGhlciwgaXQncyB0d2ljZSBhcyBl ZmZlY3RpdmUgaW4gY29vbGluZyB0aGUKPiAtwqDCoMKgwqDCoMKgwqDCoHRoZXJtYWwgem9uZS4K PiAtwqDCoMKgwqDCoMKgwqDCoFJXLCBPcHRpb25hbAo+ICtgY2RldlswLSpdX3dlaWdodGAKPiAr CVRoZSBpbmZsdWVuY2Ugb2YgYGNkZXZbMC0qXWAgaW4gdGhpcyB0aGVybWFsIHpvbmUuIFRoaXMK PiB2YWx1ZQo+ICsJaXMgcmVsYXRpdmUgdG8gdGhlIHJlc3Qgb2YgY29vbGluZyBkZXZpY2VzIGlu IHRoZSB0aGVybWFsCj4gKwl6b25lLiBGb3IgZXhhbXBsZSwgaWYgYSBjb29saW5nIGRldmljZSBo YXMgYSB3ZWlnaHQgZG91YmxlCj4gKwl0aGFuIHRoYXQgb2Ygb3RoZXIsIGl0J3MgdHdpY2UgYXMg ZWZmZWN0aXZlIGluIGNvb2xpbmcgdGhlCj4gKwl0aGVybWFsIHpvbmUuCj4gKwo+ICsJUlcsIE9w dGlvbmFsCj4gwqAKPiDCoHBhc3NpdmUKPiDCoAlBdHRyaWJ1dGUgaXMgb25seSBwcmVzZW50IGZv ciB6b25lcyBpbiB3aGljaCB0aGUgcGFzc2l2ZQo+IGNvb2xpbmcKPiBAQCAtMzk1LDggKzUyNiwx MSBAQCBwYXNzaXZlCj4gwqAJYW5kIGNhbiBiZSBzZXQgdG8gYSB0ZW1wZXJhdHVyZSAoaW4gbWls bGlkZWdyZWVzKSB0byBlbmFibGUKPiBhCj4gwqAJcGFzc2l2ZSB0cmlwIHBvaW50IGZvciB0aGUg em9uZS4gQWN0aXZhdGlvbiBpcyBkb25lIGJ5Cj4gcG9sbGluZyB3aXRoCj4gwqAJYW4gaW50ZXJ2 YWwgb2YgMSBzZWNvbmQuCj4gKwo+IMKgCVVuaXQ6IG1pbGxpZGVncmVlcyBDZWxzaXVzCj4gKwo+ IMKgCVZhbGlkIHZhbHVlczogMCAoZGlzYWJsZWQpIG9yIGdyZWF0ZXIgdGhhbiAxMDAwCj4gKwo+ IMKgCVJXLCBPcHRpb25hbAo+IMKgCj4gwqBlbXVsX3RlbXAKPiBAQCAtNDA3LDE3ICs1NDEsMjEg QEAgZW11bF90ZW1wCj4gwqAJdGhyZXNob2xkIGFuZCBpdHMgYXNzb2NpYXRlZCBjb29saW5nIGFj dGlvbi4gVGhpcyBpcyB3cml0ZQo+IG9ubHkgbm9kZQo+IMKgCWFuZCB3cml0aW5nIDAgb24gdGhp cyBub2RlIHNob3VsZCBkaXNhYmxlIGVtdWxhdGlvbi4KPiDCoAlVbml0OiBtaWxsaWRlZ3JlZSBD ZWxzaXVzCj4gKwo+IMKgCVdPLCBPcHRpb25hbAo+IMKgCj4gLQnCoMKgV0FSTklORzogQmUgY2Fy ZWZ1bCB3aGlsZSBlbmFibGluZyB0aGlzIG9wdGlvbiBvbgo+IHByb2R1Y3Rpb24gc3lzdGVtcywK PiAtCcKgwqBiZWNhdXNlIHVzZXJsYW5kIGNhbiBlYXNpbHkgZGlzYWJsZSB0aGUgdGhlcm1hbCBw b2xpY3kgYnkKPiBzaW1wbHkKPiAtCcKgwqBmbG9vZGluZyB0aGlzIHN5c2ZzIG5vZGUgd2l0aCBs b3cgdGVtcGVyYXR1cmUgdmFsdWVzLgo+ICsJwqDCoFdBUk5JTkc6Cj4gKwnCoMKgwqDCoEJlIGNh cmVmdWwgd2hpbGUgZW5hYmxpbmcgdGhpcyBvcHRpb24gb24gcHJvZHVjdGlvbgo+IHN5c3RlbXMs Cj4gKwnCoMKgwqDCoGJlY2F1c2UgdXNlcmxhbmQgY2FuIGVhc2lseSBkaXNhYmxlIHRoZSB0aGVy bWFsIHBvbGljeQo+IGJ5IHNpbXBseQo+ICsJwqDCoMKgwqBmbG9vZGluZyB0aGlzIHN5c2ZzIG5v ZGUgd2l0aCBsb3cgdGVtcGVyYXR1cmUgdmFsdWVzLgo+IMKgCj4gwqBzdXN0YWluYWJsZV9wb3dl cgo+IMKgCUFuIGVzdGltYXRlIG9mIHRoZSBzdXN0YWluZWQgcG93ZXIgdGhhdCBjYW4gYmUgZGlz c2lwYXRlZCBieQo+IMKgCXRoZSB0aGVybWFsIHpvbmUuIFVzZWQgYnkgdGhlIHBvd2VyIGFsbG9j YXRvciBnb3Zlcm5vci4gRm9yCj4gLQltb3JlIGluZm9ybWF0aW9uIHNlZQo+IERvY3VtZW50YXRp b24vdGhlcm1hbC9wb3dlcl9hbGxvY2F0b3IudHh0Cj4gKwltb3JlIGluZm9ybWF0aW9uIHNlZQo+ IERvY3VtZW50YXRpb24vdGhlcm1hbC9wb3dlcl9hbGxvY2F0b3IucnN0Cj4gKwo+IMKgCVVuaXQ6 IG1pbGxpd2F0dHMKPiArCj4gwqAJUlcsIE9wdGlvbmFsCj4gwqAKPiDCoGtfcG8KPiBAQCAtNDI1 LDcgKzU2Myw4IEBAIGtfcG8KPiDCoAljb250cm9sbGVyIGR1cmluZyB0ZW1wZXJhdHVyZSBvdmVy c2hvb3QuIFRlbXBlcmF0dXJlCj4gb3ZlcnNob290Cj4gwqAJaXMgd2hlbiB0aGUgY3VycmVudCB0 ZW1wZXJhdHVyZSBpcyBhYm92ZSB0aGUgImRlc2lyZWQKPiDCoAl0ZW1wZXJhdHVyZSIgdHJpcCBw b2ludC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlCj4gLQlEb2N1bWVudGF0aW9uL3RoZXJtYWwv cG93ZXJfYWxsb2NhdG9yLnR4dAo+ICsJRG9jdW1lbnRhdGlvbi90aGVybWFsL3Bvd2VyX2FsbG9j YXRvci5yc3QKPiArCj4gwqAJUlcsIE9wdGlvbmFsCj4gwqAKPiDCoGtfcHUKPiBAQCAtNDMzLDIw ICs1NzIsMjMgQEAga19wdQo+IMKgCWNvbnRyb2xsZXIgZHVyaW5nIHRlbXBlcmF0dXJlIHVuZGVy c2hvb3QuIFRlbXBlcmF0dXJlCj4gdW5kZXJzaG9vdAo+IMKgCWlzIHdoZW4gdGhlIGN1cnJlbnQg dGVtcGVyYXR1cmUgaXMgYmVsb3cgdGhlICJkZXNpcmVkCj4gwqAJdGVtcGVyYXR1cmUiIHRyaXAg cG9pbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZQo+IC0JRG9jdW1lbnRhdGlvbi90aGVybWFs L3Bvd2VyX2FsbG9jYXRvci50eHQKPiArCURvY3VtZW50YXRpb24vdGhlcm1hbC9wb3dlcl9hbGxv Y2F0b3IucnN0Cj4gKwo+IMKgCVJXLCBPcHRpb25hbAo+IMKgCj4gwqBrX2kKPiDCoAlUaGUgaW50 ZWdyYWwgdGVybSBvZiB0aGUgcG93ZXIgYWxsb2NhdG9yIGdvdmVybm9yJ3MgUElECj4gwqAJY29u dHJvbGxlci4gVGhpcyB0ZXJtIGFsbG93cyB0aGUgUElEIGNvbnRyb2xsZXIgdG8KPiBjb21wZW5z YXRlCj4gwqAJZm9yIGxvbmcgdGVybSBkcmlmdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlCj4g LQlEb2N1bWVudGF0aW9uL3RoZXJtYWwvcG93ZXJfYWxsb2NhdG9yLnR4dAo+ICsJRG9jdW1lbnRh dGlvbi90aGVybWFsL3Bvd2VyX2FsbG9jYXRvci5yc3QKPiArCj4gwqAJUlcsIE9wdGlvbmFsCj4g wqAKPiDCoGtfZAo+IMKgCVRoZSBkZXJpdmF0aXZlIHRlcm0gb2YgdGhlIHBvd2VyIGFsbG9jYXRv ciBnb3Zlcm5vcidzIFBJRAo+IMKgCWNvbnRyb2xsZXIuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNl ZQo+IC0JRG9jdW1lbnRhdGlvbi90aGVybWFsL3Bvd2VyX2FsbG9jYXRvci50eHQKPiArCURvY3Vt ZW50YXRpb24vdGhlcm1hbC9wb3dlcl9hbGxvY2F0b3IucnN0Cj4gKwo+IMKgCVJXLCBPcHRpb25h bAo+IMKgCj4gwqBpbnRlZ3JhbF9jdXRvZmYKPiBAQCAtNDU2LDggKzU5OCwxMCBAQCBpbnRlZ3Jh bF9jdXRvZmYKPiDCoAlleGFtcGxlLCBpZiBpbnRlZ3JhbF9jdXRvZmYgaXMgMCwgdGhlbiB0aGUg aW50ZWdyYWwgdGVybQo+IG9ubHkKPiDCoAlhY2N1bXVsYXRlcyBlcnJvciB3aGVuIHRlbXBlcmF0 dXJlIGlzIGFib3ZlIHRoZSBkZXNpcmVkCj4gwqAJdGVtcGVyYXR1cmUgdHJpcCBwb2ludC4gRm9y IG1vcmUgaW5mb3JtYXRpb24gc2VlCj4gLQlEb2N1bWVudGF0aW9uL3RoZXJtYWwvcG93ZXJfYWxs b2NhdG9yLnR4dAo+ICsJRG9jdW1lbnRhdGlvbi90aGVybWFsL3Bvd2VyX2FsbG9jYXRvci5yc3QK PiArCj4gwqAJVW5pdDogbWlsbGlkZWdyZWUgQ2Vsc2l1cwo+ICsKPiDCoAlSVywgT3B0aW9uYWwK PiDCoAo+IMKgc2xvcGUKPiBAQCAtNDY1LDYgKzYwOSw3IEBAIHNsb3BlCj4gwqAJdG8gZGV0ZXJt aW5lIGEgaG90c3BvdCB0ZW1wZXJhdHVyZSBiYXNlZCBvZmYgdGhlIHNlbnNvcidzCj4gwqAJcmF3 IHJlYWRpbmdzLiBJdCBpcyB1cCB0byB0aGUgZGV2aWNlIGRyaXZlciB0byBkZXRlcm1pbmUKPiDC oAl0aGUgdXNhZ2Ugb2YgdGhlc2UgdmFsdWVzLgo+ICsKPiDCoAlSVywgT3B0aW9uYWwKPiDCoAo+ IMKgb2Zmc2V0Cj4gQEAgLTQ3MiwyOCArNjE3LDMzIEBAIG9mZnNldAo+IMKgCXRvIGRldGVybWlu ZSBhIGhvdHNwb3QgdGVtcGVyYXR1cmUgYmFzZWQgb2ZmIHRoZSBzZW5zb3Incwo+IMKgCXJhdyBy ZWFkaW5ncy4gSXQgaXMgdXAgdG8gdGhlIGRldmljZSBkcml2ZXIgdG8gZGV0ZXJtaW5lCj4gwqAJ dGhlIHVzYWdlIG9mIHRoZXNlIHZhbHVlcy4KPiArCj4gwqAJUlcsIE9wdGlvbmFsCj4gwqAKPiAt KioqKioqKioqKioqKioqKioqKioqKioqKioqKioKPiAtKiBDb29saW5nIGRldmljZSBhdHRyaWJ1 dGVzICoKPiAtKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKPiArQ29vbGluZyBkZXZpY2Ug YXR0cmlidXRlcwo+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gwqAKPiDCoHR5cGUKPiDC oAlTdHJpbmcgd2hpY2ggcmVwcmVzZW50cyB0aGUgdHlwZSBvZiBkZXZpY2UsIGUuZzoKPiArCj4g wqAJLSBmb3IgZ2VuZXJpYyBBQ1BJOiBzaG91bGQgYmUgIkZhbiIsICJQcm9jZXNzb3IiIG9yICJM Q0QiCj4gwqAJLSBmb3IgbWVtb3J5IGNvbnRyb2xsZXIgZGV2aWNlIG9uIGludGVsX21lbmxvdyBw bGF0Zm9ybToKPiDCoAnCoMKgc2hvdWxkIGJlICJNZW1vcnkgY29udHJvbGxlciIuCj4gKwo+IMKg CVJPLCBSZXF1aXJlZAo+IMKgCj4gwqBtYXhfc3RhdGUKPiDCoAlUaGUgbWF4aW11bSBwZXJtaXNz aWJsZSBjb29saW5nIHN0YXRlIG9mIHRoaXMgY29vbGluZwo+IGRldmljZS4KPiArCj4gwqAJUk8s IFJlcXVpcmVkCj4gwqAKPiDCoGN1cl9zdGF0ZQo+IMKgCVRoZSBjdXJyZW50IGNvb2xpbmcgc3Rh dGUgb2YgdGhpcyBjb29saW5nIGRldmljZS4KPiDCoAlUaGUgdmFsdWUgY2FuIGFueSBpbnRlZ2Vy IG51bWJlcnMgYmV0d2VlbiAwIGFuZCBtYXhfc3RhdGU6Cj4gKwo+IMKgCS0gY3VyX3N0YXRlID09 IDAgbWVhbnMgbm8gY29vbGluZwo+IMKgCS0gY3VyX3N0YXRlID09IG1heF9zdGF0ZSBtZWFucyB0 aGUgbWF4aW11bSBjb29saW5nLgo+ICsKPiDCoAlSVywgUmVxdWlyZWQKPiDCoAo+IMKgc3RhdHMv cmVzZXQKPiBAQCAtNTA4LDkgKzY1OCwxMSBAQCBzdGF0cy90aW1lX2luX3N0YXRlX21zOgo+IMKg CXVuaXRzIGhlcmUgaXMgMTBtUyAoc2ltaWxhciB0byBvdGhlciB0aW1lIGV4cG9ydGVkIGluCj4g L3Byb2MpLgo+IMKgCVJPLCBSZXF1aXJlZAo+IMKgCj4gKwo+IMKgc3RhdHMvdG90YWxfdHJhbnM6 Cj4gwqAJQSBzaW5nbGUgcG9zaXRpdmUgdmFsdWUgc2hvd2luZyB0aGUgdG90YWwgbnVtYmVyIG9m IHRpbWVzCj4gdGhlIHN0YXRlIG9mIGEKPiDCoAljb29saW5nIGRldmljZSBpcyBjaGFuZ2VkLgo+ ICsKPiDCoAlSTywgUmVxdWlyZWQKPiDCoAo+IMKgc3RhdHMvdHJhbnNfdGFibGU6Cj4gQEAgLTUy Miw2ICs2NzQsNyBAQCBzdGF0cy90cmFuc190YWJsZToKPiDCoAlSTywgUmVxdWlyZWQKPiDCoAo+ IMKgMy4gQSBzaW1wbGUgaW1wbGVtZW50YXRpb24KPiArPT09PT09PT09PT09PT09PT09PT09PT09 PT0KPiDCoAo+IMKgQUNQSSB0aGVybWFsIHpvbmUgbWF5IHN1cHBvcnQgbXVsdGlwbGUgdHJpcCBw b2ludHMgbGlrZSBjcml0aWNhbCwKPiBob3QsCj4gwqBwYXNzaXZlLCBhY3RpdmUuIElmIGFuIEFD UEkgdGhlcm1hbCB6b25lIHN1cHBvcnRzIGNyaXRpY2FsLCBwYXNzaXZlLAo+IEBAIC01MzIsMTEg KzY4NSwxMCBAQCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlLiBCb3RoIGFyZSBjb25zaWRlcmVkIHRv Cj4gaGF2ZSB0aGUgc2FtZQo+IMKgZWZmZWN0aXZlbmVzcyBpbiBjb29saW5nIHRoZSB0aGVybWFs IHpvbmUuCj4gwqAKPiDCoElmIHRoZSBwcm9jZXNzb3IgaXMgbGlzdGVkIGluIF9QU0wgbWV0aG9k LCBhbmQgdGhlIGZhbiBpcyBsaXN0ZWQgaW4KPiBfQUwwCj4gLW1ldGhvZCwgdGhlIHN5cyBJL0Yg c3RydWN0dXJlIHdpbGwgYmUgYnVpbHQgbGlrZSB0aGlzOgo+ICttZXRob2QsIHRoZSBzeXMgSS9G IHN0cnVjdHVyZSB3aWxsIGJlIGJ1aWx0IGxpa2UgdGhpczo6Cj4gwqAKPiAtL3N5cy9jbGFzcy90 aGVybWFsOgo+IC0KPiAtfHRoZXJtYWxfem9uZTE6Cj4gKyAvc3lzL2NsYXNzL3RoZXJtYWw6Cj4g K8KgwqB8dGhlcm1hbF96b25lMToKPiDCoMKgwqDCoMKgfC0tLXR5cGU6CQkJYWNwaXR6Cj4gwqDC oMKgwqDCoHwtLS10ZW1wOgkJCTM3MDAwCj4gwqDCoMKgwqDCoHwtLS1tb2RlOgkJCWVuYWJsZWQK PiBAQCAtNTU3LDI0ICs3MDksMjQgQEAgbWV0aG9kLCB0aGUgc3lzIEkvRiBzdHJ1Y3R1cmUgd2ls bCBiZSBidWlsdAo+IGxpa2UgdGhpczoKPiDCoMKgwqDCoMKgfC0tLWNkZXYxX3RyaXBfcG9pbnQ6 CTIJLyogY2RldjEgY2FuIGJlIHVzZWQgZm9yCj4gYWN0aXZlWzBdKi8KPiDCoMKgwqDCoMKgfC0t LWNkZXYxX3dlaWdodDrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMTAyNAo+IMKgCj4gLXxjb29saW5n X2RldmljZTA6Cj4gK8KgwqB8Y29vbGluZ19kZXZpY2UwOgo+IMKgwqDCoMKgwqB8LS0tdHlwZToJ CQlQcm9jZXNzb3IKPiDCoMKgwqDCoMKgfC0tLW1heF9zdGF0ZToJCTgKPiDCoMKgwqDCoMKgfC0t LWN1cl9zdGF0ZToJCTAKPiDCoAo+IC18Y29vbGluZ19kZXZpY2UzOgo+ICvCoMKgfGNvb2xpbmdf ZGV2aWNlMzoKPiDCoMKgwqDCoMKgfC0tLXR5cGU6CQkJRmFuCj4gwqDCoMKgwqDCoHwtLS1tYXhf c3RhdGU6CQkyCj4gwqDCoMKgwqDCoHwtLS1jdXJfc3RhdGU6CQkwCj4gwqAKPiAtL3N5cy9jbGFz cy9od21vbjoKPiAtCj4gLXxod21vbjA6Cj4gKyAvc3lzL2NsYXNzL2h3bW9uOgo+ICvCoMKgfGh3 bW9uMDoKPiDCoMKgwqDCoMKgfC0tLW5hbWU6CQkJYWNwaXR6Cj4gwqDCoMKgwqDCoHwtLS10ZW1w MV9pbnB1dDoJCTM3MDAwCj4gwqDCoMKgwqDCoHwtLS10ZW1wMV9jcml0OgkJMTAwMDAwCj4gwqAK PiDCoDQuIEV2ZW50IE5vdGlmaWNhdGlvbgo+ICs9PT09PT09PT09PT09PT09PT09PT0KPiDCoAo+ IMKgVGhlIGZyYW1ld29yayBpbmNsdWRlcyBhIHNpbXBsZSBub3RpZmljYXRpb24gbWVjaGFuaXNt LCBpbiB0aGUgZm9ybQo+IG9mIGEKPiDCoG5ldGxpbmsgZXZlbnQuIE5ldGxpbmsgc29ja2V0IGlu aXRpYWxpemF0aW9uIGlzIGRvbmUgZHVyaW5nIHRoZQo+IF9pbml0Xwo+IEBAIC01ODcsMjEgKzcz OSwyOCBAQCBldmVudCB3aWxsIGJlIG9uZSBvZjp7VEhFUk1BTF9BVVgwLAo+IFRIRVJNQUxfQVVY MSwgVEhFUk1BTF9DUklUSUNBTCwKPiDCoFRIRVJNQUxfREVWX0ZBVUxUfS4gTm90aWZpY2F0aW9u IGNhbiBiZSBzZW50IHdoZW4gdGhlIGN1cnJlbnQKPiB0ZW1wZXJhdHVyZQo+IMKgY3Jvc3NlcyBh bnkgb2YgdGhlIGNvbmZpZ3VyZWQgdGhyZXNob2xkcy4KPiDCoAo+IC01LiBFeHBvcnQgU3ltYm9s IEFQSXM6Cj4gKzUuIEV4cG9ydCBTeW1ib2wgQVBJcwo+ICs9PT09PT09PT09PT09PT09PT09PT0K PiArCj4gKzUuMS4gZ2V0X3R6X3RyZW5kCj4gKy0tLS0tLS0tLS0tLS0tLS0tCj4gwqAKPiAtNS4x OiBnZXRfdHpfdHJlbmQ6Cj4gwqBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRyZW5kIG9mIGEg dGhlcm1hbCB6b25lLCBpLmUgdGhlIHJhdGUgb2YKPiBjaGFuZ2UKPiDCoG9mIHRlbXBlcmF0dXJl IG9mIHRoZSB0aGVybWFsIHpvbmUuIElkZWFsbHksIHRoZSB0aGVybWFsIHNlbnNvcgo+IGRyaXZl cnMKPiDCoGFyZSBzdXBwb3NlZCB0byBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrLiBJZiB0aGV5IGRv bid0LCB0aGUgdGhlcm1hbAo+IMKgZnJhbWV3b3JrIGNhbGN1bGF0ZWQgdGhlIHRyZW5kIGJ5IGNv bXBhcmluZyB0aGUgcHJldmlvdXMgYW5kIHRoZQo+IGN1cnJlbnQKPiDCoHRlbXBlcmF0dXJlIHZh bHVlcy4KPiDCoAo+IC01LjI6Z2V0X3RoZXJtYWxfaW5zdGFuY2U6Cj4gKzUuMi4gZ2V0X3RoZXJt YWxfaW5zdGFuY2UKPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsKPiDCoFRoaXMgZnVu Y3Rpb24gcmV0dXJucyB0aGUgdGhlcm1hbF9pbnN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2 ZW4KPiDCoHt0aGVybWFsX3pvbmUsIGNvb2xpbmdfZGV2aWNlLCB0cmlwX3BvaW50fSBjb21iaW5h dGlvbi4gUmV0dXJucyBOVUxMCj4gwqBpZiBzdWNoIGFuIGluc3RhbmNlIGRvZXMgbm90IGV4aXN0 Lgo+IMKgCj4gLTUuMzp0aGVybWFsX25vdGlmeV9mcmFtZXdvcms6Cj4gKzUuMy4gdGhlcm1hbF9u b3RpZnlfZnJhbWV3b3JrCj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKwo+IMKg VGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSB0cmlwIGV2ZW50cyBmcm9tIHNlbnNvciBkcml2ZXJz LiBJdCBzdGFydHMKPiDCoHRocm90dGxpbmcgdGhlIGNvb2xpbmcgZGV2aWNlcyBhY2NvcmRpbmcg dG8gdGhlIHBvbGljeSBjb25maWd1cmVkLgo+IMKgRm9yIENSSVRJQ0FMIGFuZCBIT1QgdHJpcCBw b2ludHMsIHRoaXMgbm90aWZpZXMgdGhlIHJlc3BlY3RpdmUKPiBkcml2ZXJzLAo+IEBAIC02MDks MTIgKzc2OCwxNSBAQCBhbmQgZG9lcyBhY3R1YWwgdGhyb3R0bGluZyBmb3Igb3RoZXIgdHJpcAo+ IHBvaW50cyBpLmUgQUNUSVZFIGFuZCBQQVNTSVZFLgo+IMKgVGhlIHRocm90dGxpbmcgcG9saWN5 IGlzIGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIHBsYXRmb3JtIGRhdGE7IGlmCj4gbm8KPiDCoHBs YXRmb3JtIGRhdGEgaXMgcHJvdmlkZWQsIHRoaXMgdXNlcyB0aGUgc3RlcF93aXNlIHRocm90dGxp bmcKPiBwb2xpY3kuCj4gwqAKPiAtNS40OnRoZXJtYWxfY2Rldl91cGRhdGU6Cj4gKzUuNC4gdGhl cm1hbF9jZGV2X3VwZGF0ZQo+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiArCj4gwqBUaGlz IGZ1bmN0aW9uIHNlcnZlcyBhcyBhbiBhcmJpdHJhdG9yIHRvIHNldCB0aGUgc3RhdGUgb2YgYSBj b29saW5nCj4gwqBkZXZpY2UuIEl0IHNldHMgdGhlIGNvb2xpbmcgZGV2aWNlIHRvIHRoZSBkZWVw ZXN0IGNvb2xpbmcgc3RhdGUgaWYKPiDCoHBvc3NpYmxlLgo+IMKgCj4gLTYuIHRoZXJtYWxfZW1l cmdlbmN5X3Bvd2Vyb2ZmOgo+ICs2LiB0aGVybWFsX2VtZXJnZW5jeV9wb3dlcm9mZgo+ICs9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQo+IMKgCj4gwqBPbiBhbiBldmVudCBvZiBjcml0aWNh bCB0cmlwIHRlbXBlcmF0dXJlIGNyb3NzaW5nLiBUaGVybWFsIGZyYW1ld29yawo+IMKgYWxsb3dz IHRoZSBzeXN0ZW0gdG8gc2h1dGRvd24gZ3JhY2VmdWxseSBieSBjYWxsaW5nCj4gb3JkZXJseV9w b3dlcm9mZigpLgo+IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RoZXJtYWwveDg2X3BrZ190 ZW1wZXJhdHVyZV90aGVybWFsCj4gYi9Eb2N1bWVudGF0aW9uL3RoZXJtYWwveDg2X3BrZ190ZW1w ZXJhdHVyZV90aGVybWFsLnJzdAo+IHNpbWlsYXJpdHkgaW5kZXggODAlCj4gcmVuYW1lIGZyb20g RG9jdW1lbnRhdGlvbi90aGVybWFsL3g4Nl9wa2dfdGVtcGVyYXR1cmVfdGhlcm1hbAo+IHJlbmFt ZSB0byBEb2N1bWVudGF0aW9uL3RoZXJtYWwveDg2X3BrZ190ZW1wZXJhdHVyZV90aGVybWFsLnJz dAo+IGluZGV4IDE3YTNhNGMwYTBjYS4uZjEzNGRiZDNmNWE5IDEwMDY0NAo+IC0tLSBhL0RvY3Vt ZW50YXRpb24vdGhlcm1hbC94ODZfcGtnX3RlbXBlcmF0dXJlX3RoZXJtYWwKPiArKysgYi9Eb2N1 bWVudGF0aW9uL3RoZXJtYWwveDg2X3BrZ190ZW1wZXJhdHVyZV90aGVybWFsLnJzdAo+IEBAIC0x LDE5ICsxLDIzIEBACj4gKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cj4gwqBL ZXJuZWwgZHJpdmVyOiB4ODZfcGtnX3RlbXBfdGhlcm1hbAo+IC09PT09PT09PT09PT09PT09PT09 Cj4gKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cj4gwqAKPiDCoFN1cHBvcnRl ZCBjaGlwczoKPiArCj4gwqAqIHg4Njogd2l0aCBwYWNrYWdlIGxldmVsIHRoZXJtYWwgbWFuYWdl bWVudAo+ICsKPiDCoChWZXJpZnkgdXNpbmc6IENQVUlELjA2SDpFQVhbYml0IDZdID0xKQo+IMKg Cj4gwqBBdXRob3JzOiBTcmluaXZhcyBQYW5kcnV2YWRhIDxzcmluaXZhcy5wYW5kcnV2YWRhQGxp bnV4LmludGVsLmNvbT4KPiDCoAo+IMKgUmVmZXJlbmNlCj4gLS0tLQo+ICstLS0tLS0tLS0KPiAr Cj4gwqBJbnRlbMKuIDY0IGFuZCBJQS0zMiBBcmNoaXRlY3R1cmVzIFNvZnR3YXJlIERldmVsb3Bl cuKAmXMgTWFudWFsIChKYW4sCj4gMjAxMyk6Cj4gwqBDaGFwdGVyIDE0LjY6IFBBQ0tBR0UgTEVW RUwgVEhFUk1BTCBNQU5BR0VNRU5UCj4gwqAKPiDCoERlc2NyaXB0aW9uCj4gLS0tLS0tLS0tLQo+ ICstLS0tLS0tLS0tLQo+IMKgCj4gwqBUaGlzIGRyaXZlciByZWdpc3RlciBDUFUgZGlnaXRhbCB0 ZW1wZXJhdHVyZSBwYWNrYWdlIGxldmVsIHNlbnNvciBhcwo+IGEgdGhlcm1hbAo+IMKgem9uZSB3 aXRoIG1heGltdW0gdHdvIHVzZXIgbW9kZSBjb25maWd1cmFibGUgdHJpcCBwb2ludHMuIE51bWJl ciBvZgo+IHRyaXAgcG9pbnRzCj4gQEAgLTI1LDIzICsyOSwyNyBAQCB0YWtlIGFueSBhY3Rpb24g dG8gY29udHJvbCB0ZW1wZXJhdHVyZS4KPiDCoFRocmVzaG9sZCBtYW5hZ2VtZW50Cj4gwqAtLS0t LS0tLS0tLS0tLS0tLS0tLQo+IMKgRWFjaCBwYWNrYWdlIHdpbGwgcmVnaXN0ZXIgYXMgYSB0aGVy bWFsIHpvbmUgdW5kZXIKPiAvc3lzL2NsYXNzL3RoZXJtYWwuCj4gLUV4YW1wbGU6Cj4gLS9zeXMv Y2xhc3MvdGhlcm1hbC90aGVybWFsX3pvbmUxCj4gKwo+ICtFeGFtcGxlOjoKPiArCj4gKwkvc3lz L2NsYXNzL3RoZXJtYWwvdGhlcm1hbF96b25lMQo+IMKgCj4gwqBUaGlzIGNvbnRhaW5zIHR3byB0 cmlwIHBvaW50czoKPiArCj4gwqAtIHRyaXBfcG9pbnRfMF90ZW1wCj4gwqAtIHRyaXBfcG9pbnRf MV90ZW1wCj4gwqAKPiDCoFVzZXIgY2FuIHNldCBhbnkgdGVtcGVyYXR1cmUgYmV0d2VlbiAwIHRv IFRKLU1heCB0ZW1wZXJhdHVyZS4KPiBUZW1wZXJhdHVyZSB1bml0cwo+IC1hcmUgaW4gbWlsbGkt ZGVncmVlIENlbHNpdXMuIFJlZmVyIHRvICJEb2N1bWVudGF0aW9uL3RoZXJtYWwvc3lzZnMtCj4g YXBpLnR4dCIgZm9yCj4gK2FyZSBpbiBtaWxsaS1kZWdyZWUgQ2Vsc2l1cy4gUmVmZXIgdG8gIkRv Y3VtZW50YXRpb24vdGhlcm1hbC9zeXNmcy0KPiBhcGkucnN0IiBmb3IKPiDCoHRoZXJtYWwgc3lz LWZzIGRldGFpbHMuCj4gwqAKPiDCoEFueSB2YWx1ZSBvdGhlciB0aGFuIDAgaW4gdGhlc2UgdHJp cCBwb2ludHMsIGNhbiB0cmlnZ2VyIHRoZXJtYWwKPiBub3RpZmljYXRpb25zLgo+IMKgU2V0dGlu ZyAwLCBzdG9wcyBzZW5kaW5nIHRoZXJtYWwgbm90aWZpY2F0aW9ucy4KPiDCoAo+IC1UaGVybWFs IG5vdGlmaWNhdGlvbnM6IFRvIGdldCBrb2JqZWN0LXVldmVudCBub3RpZmljYXRpb25zLCBzZXQg dGhlCj4gdGhlcm1hbCB6b25lCj4gLXBvbGljeSB0byAidXNlcl9zcGFjZSIuIEZvciBleGFtcGxl OiBlY2hvIC1uICJ1c2VyX3NwYWNlIiA+IHBvbGljeQo+IC0KPiAtCj4gK1RoZXJtYWwgbm90aWZp Y2F0aW9uczoKPiArVG8gZ2V0IGtvYmplY3QtdWV2ZW50IG5vdGlmaWNhdGlvbnMsIHNldCB0aGUg dGhlcm1hbCB6b25lCj4gK3BvbGljeSB0byAidXNlcl9zcGFjZSIuCj4gwqAKPiArRm9yIGV4YW1w bGU6Ogo+IMKgCj4gKwllY2hvIC1uICJ1c2VyX3NwYWNlIiA+IHBvbGljeQo+IGRpZmYgLS1naXQg YS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCj4gaW5kZXggZDllMjE0ZjY4ZTUyLi5iMjI1NGJj OGU0OTUgMTAwNjQ0Cj4gLS0tIGEvTUFJTlRBSU5FUlMKPiArKysgYi9NQUlOVEFJTkVSUwo+IEBA IC0xNTY4Nyw3ICsxNTY4Nyw3IEBAIE06CVZpcmVzaCBLdW1hciA8dmlyZXNoLmt1bWFyQGxpbmFy by5vCj4gcmc+Cj4gwqBNOglKYXZpIE1lcmlubyA8amF2aS5tZXJpbm9Aa2VybmVsLm9yZz4KPiDC oEw6CWxpbnV4LXBtQHZnZXIua2VybmVsLm9yZwo+IMKgUzoJU3VwcG9ydGVkCj4gLUY6CURvY3Vt ZW50YXRpb24vdGhlcm1hbC9jcHUtY29vbGluZy1hcGkudHh0Cj4gK0Y6CURvY3VtZW50YXRpb24v dGhlcm1hbC9jcHUtY29vbGluZy1hcGkucnN0Cj4gwqBGOglkcml2ZXJzL3RoZXJtYWwvY3B1X2Nv b2xpbmcuYwo+IMKgRjoJaW5jbHVkZS9saW51eC9jcHVfY29vbGluZy5oCj4gwqAKPiBkaWZmIC0t Z2l0IGEvaW5jbHVkZS9saW51eC90aGVybWFsLmggYi9pbmNsdWRlL2xpbnV4L3RoZXJtYWwuaAo+ IGluZGV4IDE1YTRjYTVkNzA5OS4uNjgxMDQ3ZjhjYzA1IDEwMDY0NAo+IC0tLSBhL2luY2x1ZGUv bGludXgvdGhlcm1hbC5oCj4gKysrIGIvaW5jbHVkZS9saW51eC90aGVybWFsLmgKPiBAQCAtMjUx LDcgKzI1MSw3IEBAIHN0cnVjdCB0aGVybWFsX2JpbmRfcGFyYW1zIHsKPiDCoAnCoCogcGxhdGZv cm0gY2hhcmFjdGVyaXphdGlvbi4gVGhpcyB2YWx1ZSBpcyByZWxhdGl2ZSB0byB0aGUKPiDCoAnC oCogcmVzdCBvZiB0aGUgd2VpZ2h0cyBzbyBhIGNvb2xpbmcgZGV2aWNlIHdob3NlIHdlaWdodCBp cwo+IMKgCcKgKiBkb3VibGUgdGhhdCBvZiBhbm90aGVyIGNvb2xpbmcgZGV2aWNlIGlzIHR3aWNl IGFzCj4gLQnCoCogZWZmZWN0aXZlLiBTZWUgRG9jdW1lbnRhdGlvbi90aGVybWFsL3N5c2ZzLWFw aS50eHQgZm9yCj4gbW9yZQo+ICsJwqAqIGVmZmVjdGl2ZS4gU2VlIERvY3VtZW50YXRpb24vdGhl cm1hbC9zeXNmcy1hcGkucnN0IGZvcgo+IG1vcmUKPiDCoAnCoCogaW5mb3JtYXRpb24uCj4gwqAJ wqAqLwo+IMKgCWludCB3ZWlnaHQ7Cj4gQEAgLTI1OSw3ICsyNTksNyBAQCBzdHJ1Y3QgdGhlcm1h bF9iaW5kX3BhcmFtcyB7Cj4gwqAJLyoKPiDCoAnCoCogVGhpcyBpcyBhIGJpdCBtYXNrIHRoYXQg Z2l2ZXMgdGhlIGJpbmRpbmcgcmVsYXRpb24KPiBiZXR3ZWVuIHRoaXMKPiDCoAnCoCogdGhlcm1h bCB6b25lIGFuZCBjZGV2LCBmb3IgYSBwYXJ0aWN1bGFyIHRyaXAgcG9pbnQuCj4gLQnCoCogU2Vl IERvY3VtZW50YXRpb24vdGhlcm1hbC9zeXNmcy1hcGkudHh0IGZvciBtb3JlCj4gaW5mb3JtYXRp b24uCj4gKwnCoCogU2VlIERvY3VtZW50YXRpb24vdGhlcm1hbC9zeXNmcy1hcGkucnN0IGZvciBt b3JlCj4gaW5mb3JtYXRpb24uCj4gwqAJwqAqLwo+IMKgCWludCB0cmlwX21hc2s7Cj4gwqAKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1r ZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpo dHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJu ZWwK