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=-11.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,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 E799ACA9EA0 for ; Fri, 25 Oct 2019 19:03:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9D7C021D7F for ; Fri, 25 Oct 2019 19:03:29 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ffwll.ch header.i=@ffwll.ch header.b="hFgQwJif" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726203AbfJYTD2 (ORCPT ); Fri, 25 Oct 2019 15:03:28 -0400 Received: from mail-pg1-f195.google.com ([209.85.215.195]:45219 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725847AbfJYTD2 (ORCPT ); Fri, 25 Oct 2019 15:03:28 -0400 Received: by mail-pg1-f195.google.com with SMTP id r1so2106759pgj.12 for ; Fri, 25 Oct 2019 12:03:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=hj/i16Oz3ttbHOZu54m4vyC0cEmTPwImzjB+4h1naI8=; b=hFgQwJifeWrgblDTYKBTY3Y3mtkyucjAM9oiofrZTG4htQgonKBSjaAUmxr0sx0vdd CkwKKPDPs/vuyDhcLqQIxI95oYX3RvYuQlOGsEzy8L0Vx4jLADD6upn8HvNCKVMxxUH3 lhqj6AuYau3YBBNXWqgRveGMHWJkiv6v8COv0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=hj/i16Oz3ttbHOZu54m4vyC0cEmTPwImzjB+4h1naI8=; b=oI5VUVI0iWJKWuZjqV0/NN2NsiMozlWvpytpn5Fxwiul4uclF9c34gZv0/D2JEJBNv 8Klnz0ct7uNqzgZI61OlW6xMtBu9SLL+ZrxzDzUD2CPe8IjVms7AP453VlHvRL3WORAu PbHQgr0USueA3m0I9XSIhkeirFQHlqVvKr46Qt/yjUtywR+E5AAMALPF548yMuaZqHBP 0xHZ+CR5TmgW011lRwIIPqemN7MtOvKKJDQVYMI5y/gajoywsFOC0fSeZmnsCMHxkTE+ BGiIZ7lAQYcKShcB/H1AHQn4+B+jp7+5uIQ3ShLe2VziPlPd2SSx1tpPOF3GUACLPxu9 kUxA== X-Gm-Message-State: APjAAAUABCwN3MAbZmATJOPqvRtka8GKtf5Ssh9fcHLS+T/SmruYULrd HkeebiTOEmvh7QmnM94euZFHmU+2w8tQ60ClcTymwQ== X-Google-Smtp-Source: APXvYqx1QntQpmmaG2tVUM7DRPf1xKWF3i+asEKdoEJbskpoGAJlHQLyADmx+TrZ6hEbYF8Oicsvx4ertzhB0zLyvhk= X-Received: by 2002:a63:2c53:: with SMTP id s80mr6038808pgs.377.1572030204942; Fri, 25 Oct 2019 12:03:24 -0700 (PDT) MIME-Version: 1.0 References: <20191023001206.15741-1-rajatja@google.com> <20191024112040.GE2825247@ulmo> <20191025113609.GB928835@ulmo> In-Reply-To: <20191025113609.GB928835@ulmo> From: Daniel Vetter Date: Fri, 25 Oct 2019 21:03:12 +0200 Message-ID: Subject: Re: [PATCH] drm: Add support for integrated privacy screens To: Thierry Reding Cc: Rajat Jain , Rajat Jain , Maarten Lankhorst , Maxime Ripard , Sean Paul , David Airlie , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , =?UTF-8?B?VmlsbGUgU3lyasOkbMOk?= , Chris Wilson , Imre Deak , =?UTF-8?Q?Jos=C3=A9_Roberto_de_Souza?= , Linux Kernel Mailing List , dri-devel , intel-gfx , Greg KH , Mat King , Daniel Thompson , Jonathan Corbet , Pavel Machek , Sean Paul , Duncan Laurie , Jesse Barnes Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Oct 25, 2019 at 1:36 PM Thierry Reding w= rote: > > On Thu, Oct 24, 2019 at 01:45:16PM -0700, Rajat Jain wrote: > > Hi, > > > > Thanks for your review and comments. Please see inline below. > > > > On Thu, Oct 24, 2019 at 4:20 AM Thierry Reding wrote: > > > > > > On Tue, Oct 22, 2019 at 05:12:06PM -0700, Rajat Jain wrote: > > > > Certain laptops now come with panels that have integrated privacy > > > > screens on them. This patch adds support for such panels by adding > > > > a privacy-screen property to the drm_connector for the panel, that > > > > the userspace can then use to control and check the status. The ide= a > > > > was discussed here: > > > > > > > > https://lkml.org/lkml/2019/10/1/786 > > > > > > > > ACPI methods are used to identify, query and control privacy screen= : > > > > > > > > * Identifying an ACPI object corresponding to the panel: The patch > > > > follows ACPI Spec 6.3 (available at > > > > https://uefi.org/sites/default/files/resources/ACPI_6_3_final_Jan30= .pdf). > > > > Pages 1119 - 1123 describe what I believe, is a standard way of > > > > identifying / addressing "display panels" in the ACPI tables, thus > > > > allowing kernel to attach ACPI nodes to the panel. IMHO, this abili= ty > > > > to identify and attach ACPI nodes to drm connectors may be useful f= or > > > > reasons other privacy-screens, in future. > > > > > > > > * Identifying the presence of privacy screen, and controlling it, i= s done > > > > via ACPI _DSM methods. > > > > > > > > Currently, this is done only for the Intel display ports. But in fu= ture, > > > > this can be done for any other ports if the hardware becomes availa= ble > > > > (e.g. external monitors supporting integrated privacy screens?). > > > > > > > > Also, this code can be extended in future to support non-ACPI metho= ds > > > > (e.g. using a kernel GPIO driver to toggle a gpio that controls the > > > > privacy-screen). > > > > > > > > Signed-off-by: Rajat Jain > > > > --- > > > > drivers/gpu/drm/Makefile | 1 + > > > > drivers/gpu/drm/drm_atomic_uapi.c | 5 + > > > > drivers/gpu/drm/drm_connector.c | 38 +++++ > > > > drivers/gpu/drm/drm_privacy_screen.c | 176 ++++++++++++++++++++= ++++ > > > > drivers/gpu/drm/i915/display/intel_dp.c | 3 + > > > > include/drm/drm_connector.h | 18 +++ > > > > include/drm/drm_mode_config.h | 7 + > > > > include/drm/drm_privacy_screen.h | 33 +++++ > > > > 8 files changed, 281 insertions(+) > > > > create mode 100644 drivers/gpu/drm/drm_privacy_screen.c > > > > create mode 100644 include/drm/drm_privacy_screen.h > > > > > > I like this much better than the prior proposal to use sysfs. However > > > the support currently looks a bit tangled. I realize that we only hav= e a > > > single implementation for this in hardware right now, so there's no u= se > > > in over-engineering things, but I think we can do a better job from t= he > > > start without getting into too many abstractions. See below. > > > > > > > diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile > > > > index 82ff826b33cc..e1fc33d69bb7 100644 > > > > --- a/drivers/gpu/drm/Makefile > > > > +++ b/drivers/gpu/drm/Makefile > > > > @@ -19,6 +19,7 @@ drm-y :=3D drm_auth.o drm_cache.o \ > > > > drm_syncobj.o drm_lease.o drm_writeback.o drm_client.= o \ > > > > drm_client_modeset.o drm_atomic_uapi.o drm_hdcp.o > > > > > > > > +drm-$(CONFIG_ACPI) +=3D drm_privacy_screen.o > > > > drm-$(CONFIG_DRM_LEGACY) +=3D drm_legacy_misc.o drm_bufs.o drm_con= text.o drm_dma.o drm_scatter.o drm_lock.o > > > > drm-$(CONFIG_DRM_LIB_RANDOM) +=3D lib/drm_random.o > > > > drm-$(CONFIG_DRM_VM) +=3D drm_vm.o > > > > diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/dr= m_atomic_uapi.c > > > > index 7a26bfb5329c..44131165e4ea 100644 > > > > --- a/drivers/gpu/drm/drm_atomic_uapi.c > > > > +++ b/drivers/gpu/drm/drm_atomic_uapi.c > > > > @@ -30,6 +30,7 @@ > > > > #include > > > > #include > > > > #include > > > > +#include > > > > #include > > > > #include > > > > > > > > @@ -766,6 +767,8 @@ static int drm_atomic_connector_set_property(st= ruct drm_connector *connector, > > > > fence_ptr); > > > > } else if (property =3D=3D connector->max_bpc_property) { > > > > state->max_requested_bpc =3D val; > > > > + } else if (property =3D=3D config->privacy_screen_property) { > > > > + drm_privacy_screen_set_val(connector, val); > > > > > > This doesn't look right. Shouldn't you store the value in the connect= or > > > state and then leave it up to the connector driver to set it > > > appropriately? I think that also has the advantage of untangling this > > > support a little. > > > > Hopefully this gets answered in my explanations below. > > > > > > > > > } else if (connector->funcs->atomic_set_property) { > > > > return connector->funcs->atomic_set_property(connecto= r, > > > > state, property, val); > > > > @@ -842,6 +845,8 @@ drm_atomic_connector_get_property(struct drm_co= nnector *connector, > > > > *val =3D 0; > > > > } else if (property =3D=3D connector->max_bpc_property) { > > > > *val =3D state->max_requested_bpc; > > > > + } else if (property =3D=3D config->privacy_screen_property) { > > > > + *val =3D drm_privacy_screen_get_val(connector); > > > > > > Similarly, I think this can just return the atomic state's value for > > > this. > > > > I did think about having a state variable in software to get and set > > this. However, I think it is not very far fetched that some platforms > > may have "hardware kill" switches that allow hardware to switch > > privacy-screen on and off directly, in addition to the software > > control that we are implementing. Privacy is a touchy subject in > > enterprise, and anything that reduces the possibility of having any > > inconsistency between software state and hardware state is desirable. > > So in this case, I chose to not have a state in software about this - > > we just report the hardware state everytime we are asked for it. > > So this doesn't really work with atomic KMS, then. The main idea behind > atomic KMS is that you apply a configuration either completely or not at > all. So at least for setting this property you'd have to go through the > state object. > > Now, for reading out the property you might be able to get away with the > above. I'm not sure if that's enough to keep the state up-to-date, > though. Is there some way for a kill switch to trigger an interrupt or > other event of some sort so that the state could be kept up-to-date? > > Daniel (or anyone else), do you know of any precedent for state that > might get modified behind the atomic helpers' back? Seems to me like we > need to find some point where we can actually read back the current > "hardware value" of this privacy screen property and store that back > into the state. We have atomic properties that the driver also updates, not just userspace: - link status - hdcp machinery But both still use the state structures like anything else, and then update that state structure through some worker. And yes I totally didn't catch this here, this breaks atomic, badly :-) > > > > > > > > > > } else if (connector->funcs->atomic_get_property) { > > > > return connector->funcs->atomic_get_property(connecto= r, > > > > state, property, val); > > > > diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_= connector.c > > > > index 4c766624b20d..a31e0382132b 100644 > > > > --- a/drivers/gpu/drm/drm_connector.c > > > > +++ b/drivers/gpu/drm/drm_connector.c > > > > @@ -821,6 +821,11 @@ static const struct drm_prop_enum_list drm_pan= el_orientation_enum_list[] =3D { > > > > { DRM_MODE_PANEL_ORIENTATION_RIGHT_UP, "Right Side Up" }, > > > > }; > > > > > > > > +static const struct drm_prop_enum_list drm_privacy_screen_enum_lis= t[] =3D { > > > > + { DRM_PRIVACY_SCREEN_DISABLED, "Disabled" }, > > > > + { DRM_PRIVACY_SCREEN_ENABLED, "Enabled" }, > > > > +}; > > > > + > > > > static const struct drm_prop_enum_list drm_dvi_i_select_enum_list[= ] =3D { > > > > { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I an= d TV-out */ > > > > { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DVI-I *= / > > > > @@ -2253,6 +2258,39 @@ static void drm_tile_group_free(struct kref = *kref) > > > > kfree(tg); > > > > } > > > > > > > > +/** > > > > + * drm_connector_init_privacy_screen_property - > > > > + * create and attach the connecter's privacy-screen property. > > > > + * @connector: connector for which to init the privacy-screen prop= erty. > > > > + * > > > > + * This function creates and attaches the "privacy-screen" propert= y to the > > > > + * connector. Initial state of privacy-screen is set to disabled. > > > > + * > > > > + * Returns: > > > > + * Zero on success, negative errno on failure. > > > > + */ > > > > +int drm_connector_init_privacy_screen_property(struct drm_connecto= r *connector) > > > > +{ > > > > + struct drm_device *dev =3D connector->dev; > > > > + struct drm_property *prop; > > > > + > > > > + prop =3D dev->mode_config.privacy_screen_property; > > > > + if (!prop) { > > > > + prop =3D drm_property_create_enum(dev, DRM_MODE_PROP_= ENUM, > > > > + "privacy-screen", drm_privacy_screen_= enum_list, > > > > > > Seems to me like the -screen suffix here is somewhat redundant. Yes, = the > > > thing that we enable/disable may be called a "privacy screen", but th= e > > > property that we enable/disable on the connector is the "privacy" of = the > > > user. I'd reflect that in all the related variable names and so on as > > > well. > > > > IMHO a property called "privacy" may be a little generic for the users > > to understand what it is. For e.g. when I started looking at code, I > > found the "Content Protection" property and I got confused thinking > > may be it provides something similar to what I'm trying to do. I think > > "privacy-screen" conveys the complete context without being long, so > > there is no confusion or ambiguity. But I don't mind changing it if a > > property "privacy" is what people think is better to convey what it > > is, as long as it is clear to user. > > This being a property of a display connector it doesn't seem very > ambiguous to me what this is. How this ends up being presented to the > users is mostly orthogonal anyway. We've got a bunch of properties whose > purpose may not be clear to the average user. The properties, while they > are UABI, don't typically face the user directly. They're still part of > an API, so as long as they are properly documented there shouldn't be > any ambiguities. Sometimes we go the cheap way with connector properties and say that those should be set by the user directly, through something like xrandr (mostly for stuff to hack around broken monitors). But ofc nicer if the property comes with some proper userspace integration. > > > > + ARRAY_SIZE(drm_privacy_screen_enum_li= st)); > > > > + if (!prop) > > > > + return -ENOMEM; > > > > + > > > > + dev->mode_config.privacy_screen_property =3D prop; > > > > + } > > > > + > > > > + drm_object_attach_property(&connector->base, prop, > > > > + DRM_PRIVACY_SCREEN_DISABLED); > > > > + return 0; > > > > +} > > > > +EXPORT_SYMBOL(drm_connector_init_privacy_screen_property); > > > > + > > > > /** > > > > * drm_mode_put_tile_group - drop a reference to a tile group. > > > > * @dev: DRM device > > > > diff --git a/drivers/gpu/drm/drm_privacy_screen.c b/drivers/gpu/drm= /drm_privacy_screen.c > > > > new file mode 100644 > > > > index 000000000000..1d68e8aa6c5f > > > > --- /dev/null > > > > +++ b/drivers/gpu/drm/drm_privacy_screen.c > > > > @@ -0,0 +1,176 @@ > > > > +// SPDX-License-Identifier: GPL-2.0-or-later > > > > +/* > > > > + * DRM privacy Screen code > > > > + * > > > > + * Copyright =C2=A9 2019 Google Inc. > > > > + */ > > > > + > > > > +#include > > > > +#include > > > > + > > > > +#include > > > > +#include > > > > +#include > > > > + > > > > +#define DRM_CONN_DSM_REVID 1 > > > > + > > > > +#define DRM_CONN_DSM_FN_PRIVACY_GET_STATUS 1 > > > > +#define DRM_CONN_DSM_FN_PRIVACY_ENABLE 2 > > > > +#define DRM_CONN_DSM_FN_PRIVACY_DISABLE 3 > > > > + > > > > +static const guid_t drm_conn_dsm_guid =3D > > > > + GUID_INIT(0xC7033113, 0x8720, 0x4CEB, > > > > + 0x90, 0x90, 0x9D, 0x52, 0xB3, 0xE5, 0x2D, 0x73); > > > > + > > > > +/* > > > > + * Makes _DSM call to set privacy screen status or get privacy scr= een. Return > > > > + * value matters only for PRIVACY_GET_STATUS case. Returns 0 if di= sabled, 1 if > > > > + * enabled. > > > > + */ > > > > +static int acpi_privacy_screen_call_dsm(acpi_handle conn_handle, u= 64 func) > > > > +{ > > > > + union acpi_object *obj; > > > > + int ret =3D 0; > > > > + > > > > + obj =3D acpi_evaluate_dsm(conn_handle, &drm_conn_dsm_guid, > > > > + DRM_CONN_DSM_REVID, func, NULL); > > > > + if (!obj) { > > > > + DRM_DEBUG_DRIVER("failed to evaluate _DSM for fn %llx= \n", func); > > > > + /* Can't do much. For get_val, assume privacy_screen = disabled */ > > > > + goto done; > > > > + } > > > > + > > > > + if (func =3D=3D DRM_CONN_DSM_FN_PRIVACY_GET_STATUS && > > > > + obj->type =3D=3D ACPI_TYPE_INTEGER) > > > > + ret =3D !!obj->integer.value; > > > > +done: > > > > + ACPI_FREE(obj); > > > > + return ret; > > > > +} > > > > + > > > > +void drm_privacy_screen_set_val(struct drm_connector *connector, > > > > + enum drm_privacy_screen val) > > > > +{ > > > > + acpi_handle acpi_handle =3D connector->privacy_screen_handle; > > > > + > > > > + if (!acpi_handle) > > > > + return; > > > > + > > > > + if (val =3D=3D DRM_PRIVACY_SCREEN_DISABLED) > > > > + acpi_privacy_screen_call_dsm(acpi_handle, > > > > + DRM_CONN_DSM_FN_PRIVACY_= DISABLE); > > > > + else if (val =3D=3D DRM_PRIVACY_SCREEN_ENABLED) > > > > + acpi_privacy_screen_call_dsm(acpi_handle, > > > > + DRM_CONN_DSM_FN_PRIVACY_= ENABLE); > > > > +} > > > > + > > > > +enum drm_privacy_screen drm_privacy_screen_get_val(struct drm_conn= ector > > > > + *connector) > > > > +{ > > > > + acpi_handle acpi_handle =3D connector->privacy_screen_handle; > > > > + > > > > + if (acpi_handle && > > > > + acpi_privacy_screen_call_dsm(acpi_handle, > > > > + DRM_CONN_DSM_FN_PRIVACY_GET_= STATUS)) > > > > + return DRM_PRIVACY_SCREEN_ENABLED; > > > > + > > > > + return DRM_PRIVACY_SCREEN_DISABLED; > > > > +} > > > > + > > > > +/* > > > > + * See ACPI Spec v6.3, Table B-2, "Display Type" for details. > > > > + * In short, these macros define the base _ADR values for ACPI nod= es > > > > + */ > > > > +#define ACPI_BASE_ADR_FOR_OTHERS (0ULL << 8) > > > > +#define ACPI_BASE_ADR_FOR_VGA (1ULL << 8) > > > > +#define ACPI_BASE_ADR_FOR_TV (2ULL << 8) > > > > +#define ACPI_BASE_ADR_FOR_EXT_MON (3ULL << 8) > > > > +#define ACPI_BASE_ADR_FOR_INTEGRATED (4ULL << 8) > > > > + > > > > +#define ACPI_DEVICE_ID_SCHEME (1ULL << 31) > > > > +#define ACPI_FIRMWARE_CAN_DETECT (1ULL << 16) > > > > + > > > > +/* > > > > + * Ref: ACPI Spec 6.3 > > > > + * https://uefi.org/sites/default/files/resources/ACPI_6_3_final_J= an30.pdf > > > > + * Pages 1119 - 1123 describe, what I believe, a standard way of > > > > + * identifying / addressing "display panels" in the ACPI. Thus it = provides > > > > + * a way for the ACPI to define devices for the display panels att= ached > > > > + * to the system. It thus provides a way for the BIOS to export an= y panel > > > > + * specific properties to the system via ACPI (like device trees). > > > > + * > > > > + * The following function looks up the ACPI node for a connector a= nd links > > > > + * to it. Technically it is independent from the privacy_screen co= de, and > > > > + * ideally may be called for all connectors. It is generally a goo= d idea to > > > > + * be able to attach an ACPI node to describe anything if needed. = (This can > > > > + * help in future for other panel specific features maybe). Howeve= r, it > > > > + * needs a "port index" which I believe is the index within a part= icular > > > > + * type of port (Ref to the pages of spec mentioned above). This p= ort index > > > > + * unfortunately is not available in DRM code, so currently its ca= ll is > > > > + * originated from i915 driver. > > > > + */ > > > > +static int drm_connector_attach_acpi_node(struct drm_connector *co= nnector, > > > > + u8 port_index) > > > > +{ > > > > + struct device *dev =3D &connector->dev->pdev->dev; > > > > + struct acpi_device *conn_dev; > > > > + u64 conn_addr; > > > > + > > > > + /* > > > > + * Determine what _ADR to look for, depending on device type = and > > > > + * port number. Potentially we only care about the > > > > + * eDP / integrated displays? > > > > + */ > > > > + switch (connector->connector_type) { > > > > + case DRM_MODE_CONNECTOR_eDP: > > > > + conn_addr =3D ACPI_BASE_ADR_FOR_INTEGRATED + port_ind= ex; > > > > + break; > > > > + case DRM_MODE_CONNECTOR_VGA: > > > > + conn_addr =3D ACPI_BASE_ADR_FOR_VGA + port_index; > > > > + break; > > > > + case DRM_MODE_CONNECTOR_TV: > > > > + conn_addr =3D ACPI_BASE_ADR_FOR_TV + port_index; > > > > + break; > > > > + case DRM_MODE_CONNECTOR_DisplayPort: > > > > + conn_addr =3D ACPI_BASE_ADR_FOR_EXT_MON + port_index; > > > > + break; > > > > + default: > > > > + return -ENOTSUPP; > > > > + } > > > > + > > > > + conn_addr |=3D ACPI_DEVICE_ID_SCHEME; > > > > + conn_addr |=3D ACPI_FIRMWARE_CAN_DETECT; > > > > + > > > > + DRM_DEV_DEBUG(dev, "%s: Finding drm_connector ACPI node at _A= DR=3D%llX\n", > > > > + __func__, conn_addr); > > > > + > > > > + /* Look up the connector device, under the PCI device */ > > > > + conn_dev =3D acpi_find_child_device(ACPI_COMPANION(dev), > > > > + conn_addr, false); > > > > + if (!conn_dev) > > > > + return -ENODEV; > > > > + > > > > + connector->privacy_screen_handle =3D conn_dev->handle; > > > > + return 0; > > > > +} > > > > + > > > > +bool drm_privacy_screen_present(struct drm_connector *connector, u= 8 port_index) > > > > > > This is the main part that I think is a little tangled. This is a ver= y > > > specific implementation that hides in a generic API. > > > > I agree that this is an ACPI specific implementation, but other than > > that, I think it does not have any driver specific details. More > > detailed thoughts on this below. > > Well, the port_index kind of ties this to i915 because that uses this > concept. Other drivers may not. > > Also, I'm wondering if you couldn't somehow derive the port_index from > the connector. If all this does is to find an ACPI node corresponding to > a connector, shouldn't the connector really be all that you need? Yeah port should be stored already plenty of times in i915 connector struct= s. > > > I we store the privacy setting in the atomic state, there isn't reall= y a > > > reason to store the privacy handle in the connector. Instead it could= be > > > simply stored in the driver that supports this. > > > > > > Ideally I think we'd have a very small drm_privacy_screen object type > > > that would just wrap this, but perhaps we don't need that right away, > > > given that we only have a single implementation so far. > > > > Yes, agreed. > > > > > > > > However, I think if we just pushed this specific implementation into = the > > > drivers that'd help pave the way for something more generic later on > > > without a lot of extra work up front. > > > > > > For example you could turn the drm_connector_attach_acpi_node() into = a > > > helper that simply returns the ACPI handle, something like this perha= ps: > > > > > > struct acpi_handle *drm_acpi_find_privacy_screen(struct drm_c= onnector *connector, > > > unsigned int= port) > > > { > > > ... > > > } > > > > Yes, I like that idea of making it a helper function. In fact, finding > > an ACPI node for the connector doesn't have to do anything with > > privacy screen (so it can be used for other purposes also, in future). > > Looks like I misunderstood the purpose of that function. You store the > ACPI handle as connector->privacy_screen_handle, so I was assuming that > it was getting an ACPI handle for some privacy screen subdevice. > > > > That the i915 driver would then call and store the returned value > > > internally. When it commits the atomic state for the connector it can > > > then call the drm_acpi_set_privacy() (I think that'd be a better name > > > for your drm_privacy_screen_set_val()) by passing that handle and the > > > value from the atomic state. > > > > > > The above has the advantage that we don't clutter the generic core wi= th > > > something that's not at all generic. If eventually we see that these > > > types of privacy screens are implemented in more device we can always > > > refactor this into something really generic and maybe even decide to = put > > > it into the drm_connector directly. > > > > This is where I think I'm in slight disagreement. I think the > > functionality we're adding is still "generic", just that the only > > hardware *I have today* to test is using Intel eDP ports. But I don't > > see why AMD CPU laptops can't have it (For E.g. HP's Elitebook 745 G5 > > seems to use AMD and has integrated privacy screen feature > > http://www8.hp.com/h20195/V2/GetPDF.aspx/4aa7-2802eee) . > > My worry is that if we don't make it generic today, we might see > > duplicate / similar-but-different / different ways of this in other > > places (e.g. https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/l= inux.git/commit/?id=3D110ea1d833ad) > > because unless it is generic to start with, it is difficult for some > > one to change later for the fear of breaking hardware that is already > > in market given that > > * hardware may not be available to new developer to test for > > regressions (also there is very little motivation to check any > > hardware other than your own). > > * specially for a code that relies on firmware ACPI (firmware > > upgrades in field are always costly). > > > > My understanding is that we're adding 2 functionalities here: > > > > 1) Identify and Attach ACPI node to DRM connector. Since this is > > following ACPI spec, I think this is generic enough. > > It's probably worth making this a separate patch in that case. If the > ACPI handle really represents the connector itself, then it seems fine > to store it in the connector. But it shouldn't be called privacy_screen > in that case. Probably still should be in i915. We have a few firmware handle things in there already. If other drivers need this, we could make an acpi helper library that drivers can call to find the right acpi handle for their connector. > > 2) Use ACPI _DSM mthods to identify screen, set and get values. This > > is where I think we're setting (generic) expectations for the ACPI > > methods in how they should behave if ACPI is to be used to control > > privacy screen. If we put this in generic code today, future > > developers can look at this to understand how their ACPI for new > > platforms is to behave if they want to use this generic code. If we > > put it in i915 specific code, this will be seen as driver specific > > behavior and developers may choose some other behavior in their > > driver. > > I think it's fine to put this functionality into generic code. What I > don't think is good to do is to have this code called from generic code. > It's opt-in functionality that drivers should call if they know that the > connector has an associated ACPI handle that can be used for privacy > screen control. > > After reading the patch again and realizing that you're not actually > dealing with an ACPI handle to the privacy screen directly but one for > the connector, I think this is okay. You do in fact call into this from > the i915 only. I still don't think the naming is great, and it'd be nice > to see ACPI as part of the function name to make that explicit. We could > always address that at a later point, but may as well do it right from > the start. > > > I agree that the functionality we're adding is ACPI specific (today - > > but can be extended to gpio in future for non x86 platforms), but not > > necessarily driver specific. Actually the only reason, I had to call > > the drm_privacy_screen_present() (and the > > drm_init_privacy_screen_property()) function from i915 code is because > > we need a port_index to lookup ACPI node. If we had that available in > > drm code, we wouldn't need to call anything from i915 at all. > > You're kind of proving my point about this API being driver-specific, or > at least ACPI specific. Non-ACPI devices (maybe even non-i915 devices?) > may not have a concept of a port index. Encoding this in the API makes > the API non-generic. > > As I mentioned above, if we could derive the port index from the > connector, that'd be much better. Could you perhaps use drm_connector's > index field? > > Unless there's a way to reliably detect this type of functionality from > generic code, I think it should always be called from the driver. Maybe time to pitch the old classic again: https://blog.ffwll.ch/2016/12/midlayers-once-more-with-feeling.html Especially all the links in the first part. > > So, for the reasons stated above, IMHO it is better to retain this > > functionality in drm code instead of i915 driver. But I'm new to the > > drm / i915 code, and would be happy to change my code if people have > > strong opinions about this. Let me know. > > Maybe I was being unclear. I wasn't arguing that all the code should be > moved into the i915 driver. All I was saying that instead of storing the > ACPI handle inside struct drm_connector, we should maybe store it inside > the i915 driver's connector structure. struct drm_connector is a very > generic concept and each and every connector object on every platform > will get that ACPI handle pointer if you add it there. I don't think an > ACPI handle belongs there. For example, on ARM SoCs it's common to have > connectors be backed by a struct device (or struct platform_device more > specifically). But we don't put that information into drm_connector > because PCI graphics adapters don't have a struct device that represents > the connector. +1 on all the stuff Thierry says here essentially. Cheers, Daniel > > Thierry > > > > > Thanks & Best Regards, > > > > Rajat > > > > > > > > > +{ > > > > + acpi_handle handle; > > > > + > > > > + if (drm_connector_attach_acpi_node(connector, port_index)) > > > > + return false; > > > > + > > > > + handle =3D connector->privacy_screen_handle; > > > > + if (!acpi_check_dsm(handle, &drm_conn_dsm_guid, > > > > + DRM_CONN_DSM_REVID, > > > > + 1 << DRM_CONN_DSM_FN_PRIVACY_GET_STATUS | > > > > + 1 << DRM_CONN_DSM_FN_PRIVACY_ENABLE | > > > > + 1 << DRM_CONN_DSM_FN_PRIVACY_DISABLE)) { > > > > + DRM_WARN("%s: Odd, connector ACPI node but no privacy= scrn?\n", > > > > + connector->dev->dev); > > > > + return false; > > > > + } > > > > + DRM_DEV_INFO(connector->dev->dev, "supports privacy screen\n"= ); > > > > + return true; > > > > +} > > > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/= drm/i915/display/intel_dp.c > > > > index 57e9f0ba331b..3ff3962d27db 100644 > > > > --- a/drivers/gpu/drm/i915/display/intel_dp.c > > > > +++ b/drivers/gpu/drm/i915/display/intel_dp.c > > > > @@ -39,6 +39,7 @@ > > > > #include > > > > #include > > > > #include > > > > +#include > > > > #include > > > > #include > > > > > > > > @@ -6354,6 +6355,8 @@ intel_dp_add_properties(struct intel_dp *inte= l_dp, struct drm_connector *connect > > > > > > > > connector->state->scaling_mode =3D DRM_MODE_SCALE_ASP= ECT; > > > > > > > > + if (drm_privacy_screen_present(connector, port - PORT= _A)) > > > > + drm_connector_init_privacy_screen_property(co= nnector); > > > > } > > > > } > > > > > > > > diff --git a/include/drm/drm_connector.h b/include/drm/drm_connecto= r.h > > > > index 681cb590f952..63b8318bd68c 100644 > > > > --- a/include/drm/drm_connector.h > > > > +++ b/include/drm/drm_connector.h > > > > @@ -225,6 +225,20 @@ enum drm_link_status { > > > > DRM_LINK_STATUS_BAD =3D DRM_MODE_LINK_STATUS_BAD, > > > > }; > > > > > > > > +/** > > > > + * enum drm_privacy_screen - privacy_screen status > > > > + * > > > > + * This enum is used to track and control the state of the privacy= screen. > > > > + * There are no separate #defines for the uapi! > > > > + * > > > > + * @DRM_PRIVACY_SCREEN_DISABLED: The privacy-screen on the panel i= s disabled > > > > + * @DRM_PRIVACY_SCREEN_ENABLED: The privacy-screen on the panel i= s enabled > > > > + */ > > > > +enum drm_privacy_screen { > > > > + DRM_PRIVACY_SCREEN_DISABLED =3D 0, > > > > + DRM_PRIVACY_SCREEN_ENABLED =3D 1, > > > > +}; > > > > + > > > > > > Shouldn't this go into include/uapi/drm/drm_mode.h? That would have t= he > > > advantage of giving userspace symbolic names to use when setting the > > > property. > > > > > > Maybe also rename these to something like: > > > > > > #define DRM_MODE_PRIVACY_DISABLED 0 > > > #define DRM_MODE_PRIVACY_ENABLED 1 > > > > > > for consistency with other properties. > > > > > > Thierry > > > > > > > /** > > > > * enum drm_panel_orientation - panel_orientation info for &drm_di= splay_info > > > > * > > > > @@ -1410,6 +1424,9 @@ struct drm_connector { > > > > > > > > /** @hdr_sink_metadata: HDR Metadata Information read from si= nk */ > > > > struct hdr_sink_metadata hdr_sink_metadata; > > > > + > > > > + /* Handle used by privacy screen code */ > > > > + void *privacy_screen_handle; > > > > }; > > > > > > > > #define obj_to_connector(x) container_of(x, struct drm_connector, = base) > > > > @@ -1543,6 +1560,7 @@ int drm_connector_init_panel_orientation_prop= erty( > > > > struct drm_connector *connector, int width, int height); > > > > int drm_connector_attach_max_bpc_property(struct drm_connector *co= nnector, > > > > int min, int max); > > > > +int drm_connector_init_privacy_screen_property(struct drm_connecto= r *connector); > > > > > > > > /** > > > > * struct drm_tile_group - Tile group metadata > > > > diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_c= onfig.h > > > > index 3bcbe30339f0..6d5d23da90d4 100644 > > > > --- a/include/drm/drm_mode_config.h > > > > +++ b/include/drm/drm_mode_config.h > > > > @@ -813,6 +813,13 @@ struct drm_mode_config { > > > > */ > > > > struct drm_property *panel_orientation_property; > > > > > > > > + /** > > > > + * @privacy_screen_property: Optional connector property to i= ndicate > > > > + * and control the state (enabled / disabled) of privacy-scre= en on the > > > > + * panel, if present. > > > > + */ > > > > + struct drm_property *privacy_screen_property; > > > > + > > > > /** > > > > * @writeback_fb_id_property: Property for writeback connecto= rs, storing > > > > * the ID of the output framebuffer. > > > > diff --git a/include/drm/drm_privacy_screen.h b/include/drm/drm_pri= vacy_screen.h > > > > new file mode 100644 > > > > index 000000000000..c589bbc47656 > > > > --- /dev/null > > > > +++ b/include/drm/drm_privacy_screen.h > > > > @@ -0,0 +1,33 @@ > > > > +/* SPDX-License-Identifier: GPL-2.0-or-later */ > > > > +/* > > > > + * Copyright =C2=A9 2019 Google Inc. > > > > + */ > > > > + > > > > +#ifndef __DRM_PRIVACY_SCREEN_H__ > > > > +#define __DRM_PRIVACY_SCREEN_H__ > > > > + > > > > +#ifdef CONFIG_ACPI > > > > +bool drm_privacy_screen_present(struct drm_connector *connector, u= 8 port); > > > > +void drm_privacy_screen_set_val(struct drm_connector *connector, > > > > + enum drm_privacy_screen val); > > > > +enum drm_privacy_screen drm_privacy_screen_get_val(struct drm_conn= ector > > > > + *connector); > > > > +#else > > > > +static inline bool drm_privacy_screen_present(struct drm_connector= *connector, > > > > + u8 port) > > > > +{ > > > > + return false; > > > > +} > > > > + > > > > +void drm_privacy_screen_set_val(struct drm_connector *connector, > > > > + enum drm_privacy_screen val) > > > > +{ } > > > > + > > > > +enum drm_privacy_screen drm_privacy_screen_get_val( > > > > + struct drm_connector *connect= or) > > > > +{ > > > > + return DRM_PRIVACY_SCREEN_DISABLED; > > > > +} > > > > +#endif /* CONFIG_ACPI */ > > > > + > > > > +#endif /* __DRM_PRIVACY_SCREEN_H__ */ > > > > -- > > > > 2.23.0.866.gb869b98d4c-goog > > > > --=20 Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH] drm: Add support for integrated privacy screens Date: Fri, 25 Oct 2019 21:03:12 +0200 Message-ID: References: <20191023001206.15741-1-rajatja@google.com> <20191024112040.GE2825247@ulmo> <20191025113609.GB928835@ulmo> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20191025113609.GB928835@ulmo> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Thierry Reding Cc: Sean Paul , David Airlie , dri-devel , Rajat Jain , Daniel Thompson , Jonathan Corbet , Jesse Barnes , Rajat Jain , intel-gfx , Maxime Ripard , Mat King , Duncan Laurie , Greg KH , Linux Kernel Mailing List , Pavel Machek List-Id: dri-devel@lists.freedesktop.org T24gRnJpLCBPY3QgMjUsIDIwMTkgYXQgMTozNiBQTSBUaGllcnJ5IFJlZGluZyA8dGhpZXJyeS5y ZWRpbmdAZ21haWwuY29tPiB3cm90ZToKPgo+IE9uIFRodSwgT2N0IDI0LCAyMDE5IGF0IDAxOjQ1 OjE2UE0gLTA3MDAsIFJhamF0IEphaW4gd3JvdGU6Cj4gPiBIaSwKPiA+Cj4gPiBUaGFua3MgZm9y IHlvdXIgcmV2aWV3IGFuZCBjb21tZW50cy4gUGxlYXNlIHNlZSBpbmxpbmUgYmVsb3cuCj4gPgo+ ID4gT24gVGh1LCBPY3QgMjQsIDIwMTkgYXQgNDoyMCBBTSBUaGllcnJ5IFJlZGluZyA8dGhpZXJy eS5yZWRpbmdAZ21haWwuY29tPiB3cm90ZToKPiA+ID4KPiA+ID4gT24gVHVlLCBPY3QgMjIsIDIw MTkgYXQgMDU6MTI6MDZQTSAtMDcwMCwgUmFqYXQgSmFpbiB3cm90ZToKPiA+ID4gPiBDZXJ0YWlu IGxhcHRvcHMgbm93IGNvbWUgd2l0aCBwYW5lbHMgdGhhdCBoYXZlIGludGVncmF0ZWQgcHJpdmFj eQo+ID4gPiA+IHNjcmVlbnMgb24gdGhlbS4gVGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgZm9yIHN1 Y2ggcGFuZWxzIGJ5IGFkZGluZwo+ID4gPiA+IGEgcHJpdmFjeS1zY3JlZW4gcHJvcGVydHkgdG8g dGhlIGRybV9jb25uZWN0b3IgZm9yIHRoZSBwYW5lbCwgdGhhdAo+ID4gPiA+IHRoZSB1c2Vyc3Bh Y2UgY2FuIHRoZW4gdXNlIHRvIGNvbnRyb2wgYW5kIGNoZWNrIHRoZSBzdGF0dXMuIFRoZSBpZGVh Cj4gPiA+ID4gd2FzIGRpc2N1c3NlZCBoZXJlOgo+ID4gPiA+Cj4gPiA+ID4gaHR0cHM6Ly9sa21s Lm9yZy9sa21sLzIwMTkvMTAvMS83ODYKPiA+ID4gPgo+ID4gPiA+IEFDUEkgbWV0aG9kcyBhcmUg dXNlZCB0byBpZGVudGlmeSwgcXVlcnkgYW5kIGNvbnRyb2wgcHJpdmFjeSBzY3JlZW46Cj4gPiA+ ID4KPiA+ID4gPiAqIElkZW50aWZ5aW5nIGFuIEFDUEkgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8g dGhlIHBhbmVsOiBUaGUgcGF0Y2gKPiA+ID4gPiBmb2xsb3dzIEFDUEkgU3BlYyA2LjMgKGF2YWls YWJsZSBhdAo+ID4gPiA+IGh0dHBzOi8vdWVmaS5vcmcvc2l0ZXMvZGVmYXVsdC9maWxlcy9yZXNv dXJjZXMvQUNQSV82XzNfZmluYWxfSmFuMzAucGRmKS4KPiA+ID4gPiBQYWdlcyAxMTE5IC0gMTEy MyBkZXNjcmliZSB3aGF0IEkgYmVsaWV2ZSwgaXMgYSBzdGFuZGFyZCB3YXkgb2YKPiA+ID4gPiBp ZGVudGlmeWluZyAvIGFkZHJlc3NpbmcgImRpc3BsYXkgcGFuZWxzIiBpbiB0aGUgQUNQSSB0YWJs ZXMsIHRodXMKPiA+ID4gPiBhbGxvd2luZyBrZXJuZWwgdG8gYXR0YWNoIEFDUEkgbm9kZXMgdG8g dGhlIHBhbmVsLiBJTUhPLCB0aGlzIGFiaWxpdHkKPiA+ID4gPiB0byBpZGVudGlmeSBhbmQgYXR0 YWNoIEFDUEkgbm9kZXMgdG8gZHJtIGNvbm5lY3RvcnMgbWF5IGJlIHVzZWZ1bCBmb3IKPiA+ID4g PiByZWFzb25zIG90aGVyIHByaXZhY3ktc2NyZWVucywgaW4gZnV0dXJlLgo+ID4gPiA+Cj4gPiA+ ID4gKiBJZGVudGlmeWluZyB0aGUgcHJlc2VuY2Ugb2YgcHJpdmFjeSBzY3JlZW4sIGFuZCBjb250 cm9sbGluZyBpdCwgaXMgZG9uZQo+ID4gPiA+IHZpYSBBQ1BJIF9EU00gbWV0aG9kcy4KPiA+ID4g Pgo+ID4gPiA+IEN1cnJlbnRseSwgdGhpcyBpcyBkb25lIG9ubHkgZm9yIHRoZSBJbnRlbCBkaXNw bGF5IHBvcnRzLiBCdXQgaW4gZnV0dXJlLAo+ID4gPiA+IHRoaXMgY2FuIGJlIGRvbmUgZm9yIGFu eSBvdGhlciBwb3J0cyBpZiB0aGUgaGFyZHdhcmUgYmVjb21lcyBhdmFpbGFibGUKPiA+ID4gPiAo ZS5nLiBleHRlcm5hbCBtb25pdG9ycyBzdXBwb3J0aW5nIGludGVncmF0ZWQgcHJpdmFjeSBzY3Jl ZW5zPykuCj4gPiA+ID4KPiA+ID4gPiBBbHNvLCB0aGlzIGNvZGUgY2FuIGJlIGV4dGVuZGVkIGlu IGZ1dHVyZSB0byBzdXBwb3J0IG5vbi1BQ1BJIG1ldGhvZHMKPiA+ID4gPiAoZS5nLiB1c2luZyBh IGtlcm5lbCBHUElPIGRyaXZlciB0byB0b2dnbGUgYSBncGlvIHRoYXQgY29udHJvbHMgdGhlCj4g PiA+ID4gcHJpdmFjeS1zY3JlZW4pLgo+ID4gPiA+Cj4gPiA+ID4gU2lnbmVkLW9mZi1ieTogUmFq YXQgSmFpbiA8cmFqYXRqYUBnb29nbGUuY29tPgo+ID4gPiA+IC0tLQo+ID4gPiA+ICBkcml2ZXJz L2dwdS9kcm0vTWFrZWZpbGUgICAgICAgICAgICAgICAgfCAgIDEgKwo+ID4gPiA+ICBkcml2ZXJz L2dwdS9kcm0vZHJtX2F0b21pY191YXBpLmMgICAgICAgfCAgIDUgKwo+ID4gPiA+ICBkcml2ZXJz L2dwdS9kcm0vZHJtX2Nvbm5lY3Rvci5jICAgICAgICAgfCAgMzggKysrKysKPiA+ID4gPiAgZHJp dmVycy9ncHUvZHJtL2RybV9wcml2YWN5X3NjcmVlbi5jICAgIHwgMTc2ICsrKysrKysrKysrKysr KysrKysrKysrKwo+ID4gPiA+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2Rw LmMgfCAgIDMgKwo+ID4gPiA+ICBpbmNsdWRlL2RybS9kcm1fY29ubmVjdG9yLmggICAgICAgICAg ICAgfCAgMTggKysrCj4gPiA+ID4gIGluY2x1ZGUvZHJtL2RybV9tb2RlX2NvbmZpZy5oICAgICAg ICAgICB8ICAgNyArCj4gPiA+ID4gIGluY2x1ZGUvZHJtL2RybV9wcml2YWN5X3NjcmVlbi5oICAg ICAgICB8ICAzMyArKysrKwo+ID4gPiA+ICA4IGZpbGVzIGNoYW5nZWQsIDI4MSBpbnNlcnRpb25z KCspCj4gPiA+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vZHJtX3ByaXZh Y3lfc2NyZWVuLmMKPiA+ID4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvZHJtL2RybV9w cml2YWN5X3NjcmVlbi5oCj4gPiA+Cj4gPiA+IEkgbGlrZSB0aGlzIG11Y2ggYmV0dGVyIHRoYW4g dGhlIHByaW9yIHByb3Bvc2FsIHRvIHVzZSBzeXNmcy4gSG93ZXZlcgo+ID4gPiB0aGUgc3VwcG9y dCBjdXJyZW50bHkgbG9va3MgYSBiaXQgdGFuZ2xlZC4gSSByZWFsaXplIHRoYXQgd2Ugb25seSBo YXZlIGEKPiA+ID4gc2luZ2xlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIGluIGhhcmR3YXJlIHJp Z2h0IG5vdywgc28gdGhlcmUncyBubyB1c2UKPiA+ID4gaW4gb3Zlci1lbmdpbmVlcmluZyB0aGlu Z3MsIGJ1dCBJIHRoaW5rIHdlIGNhbiBkbyBhIGJldHRlciBqb2IgZnJvbSB0aGUKPiA+ID4gc3Rh cnQgd2l0aG91dCBnZXR0aW5nIGludG8gdG9vIG1hbnkgYWJzdHJhY3Rpb25zLiBTZWUgYmVsb3cu Cj4gPiA+Cj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZSBiL2Ry aXZlcnMvZ3B1L2RybS9NYWtlZmlsZQo+ID4gPiA+IGluZGV4IDgyZmY4MjZiMzNjYy4uZTFmYzMz ZDY5YmI3IDEwMDY0NAo+ID4gPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQo+ID4g PiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQo+ID4gPiA+IEBAIC0xOSw2ICsxOSw3 IEBAIGRybS15ICAgICAgIDo9ICAgICAgZHJtX2F1dGgubyBkcm1fY2FjaGUubyBcCj4gPiA+ID4g ICAgICAgICAgICAgICBkcm1fc3luY29iai5vIGRybV9sZWFzZS5vIGRybV93cml0ZWJhY2subyBk cm1fY2xpZW50Lm8gXAo+ID4gPiA+ICAgICAgICAgICAgICAgZHJtX2NsaWVudF9tb2Rlc2V0Lm8g ZHJtX2F0b21pY191YXBpLm8gZHJtX2hkY3Aubwo+ID4gPiA+Cj4gPiA+ID4gK2RybS0kKENPTkZJ R19BQ1BJKSArPSBkcm1fcHJpdmFjeV9zY3JlZW4ubwo+ID4gPiA+ICBkcm0tJChDT05GSUdfRFJN X0xFR0FDWSkgKz0gZHJtX2xlZ2FjeV9taXNjLm8gZHJtX2J1ZnMubyBkcm1fY29udGV4dC5vIGRy bV9kbWEubyBkcm1fc2NhdHRlci5vIGRybV9sb2NrLm8KPiA+ID4gPiAgZHJtLSQoQ09ORklHX0RS TV9MSUJfUkFORE9NKSArPSBsaWIvZHJtX3JhbmRvbS5vCj4gPiA+ID4gIGRybS0kKENPTkZJR19E Uk1fVk0pICs9IGRybV92bS5vCj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9k cm1fYXRvbWljX3VhcGkuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX3VhcGkuYwo+ID4g PiA+IGluZGV4IDdhMjZiZmI1MzI5Yy4uNDQxMzExNjVlNGVhIDEwMDY0NAo+ID4gPiA+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX3VhcGkuYwo+ID4gPiA+ICsrKyBiL2RyaXZlcnMv Z3B1L2RybS9kcm1fYXRvbWljX3VhcGkuYwo+ID4gPiA+IEBAIC0zMCw2ICszMCw3IEBACj4gPiA+ ID4gICNpbmNsdWRlIDxkcm0vZHJtX2F0b21pYy5oPgo+ID4gPiA+ICAjaW5jbHVkZSA8ZHJtL2Ry bV9wcmludC5oPgo+ID4gPiA+ICAjaW5jbHVkZSA8ZHJtL2RybV9kcnYuaD4KPiA+ID4gPiArI2lu Y2x1ZGUgPGRybS9kcm1fcHJpdmFjeV9zY3JlZW4uaD4KPiA+ID4gPiAgI2luY2x1ZGUgPGRybS9k cm1fd3JpdGViYWNrLmg+Cj4gPiA+ID4gICNpbmNsdWRlIDxkcm0vZHJtX3ZibGFuay5oPgo+ID4g PiA+Cj4gPiA+ID4gQEAgLTc2Niw2ICs3NjcsOCBAQCBzdGF0aWMgaW50IGRybV9hdG9taWNfY29u bmVjdG9yX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ID4g PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5j ZV9wdHIpOwo+ID4gPiA+ICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgPT0gY29ubmVjdG9yLT5t YXhfYnBjX3Byb3BlcnR5KSB7Cj4gPiA+ID4gICAgICAgICAgICAgICBzdGF0ZS0+bWF4X3JlcXVl c3RlZF9icGMgPSB2YWw7Cj4gPiA+ID4gKyAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25m aWctPnByaXZhY3lfc2NyZWVuX3Byb3BlcnR5KSB7Cj4gPiA+ID4gKyAgICAgICAgICAgICBkcm1f cHJpdmFjeV9zY3JlZW5fc2V0X3ZhbChjb25uZWN0b3IsIHZhbCk7Cj4gPiA+Cj4gPiA+IFRoaXMg ZG9lc24ndCBsb29rIHJpZ2h0LiBTaG91bGRuJ3QgeW91IHN0b3JlIHRoZSB2YWx1ZSBpbiB0aGUg Y29ubmVjdG9yCj4gPiA+IHN0YXRlIGFuZCB0aGVuIGxlYXZlIGl0IHVwIHRvIHRoZSBjb25uZWN0 b3IgZHJpdmVyIHRvIHNldCBpdAo+ID4gPiBhcHByb3ByaWF0ZWx5PyBJIHRoaW5rIHRoYXQgYWxz byBoYXMgdGhlIGFkdmFudGFnZSBvZiB1bnRhbmdsaW5nIHRoaXMKPiA+ID4gc3VwcG9ydCBhIGxp dHRsZS4KPiA+Cj4gPiBIb3BlZnVsbHkgdGhpcyBnZXRzIGFuc3dlcmVkIGluIG15IGV4cGxhbmF0 aW9ucyBiZWxvdy4KPiA+Cj4gPiA+Cj4gPiA+ID4gICAgICAgfSBlbHNlIGlmIChjb25uZWN0b3It PmZ1bmNzLT5hdG9taWNfc2V0X3Byb3BlcnR5KSB7Cj4gPiA+ID4gICAgICAgICAgICAgICByZXR1 cm4gY29ubmVjdG9yLT5mdW5jcy0+YXRvbWljX3NldF9wcm9wZXJ0eShjb25uZWN0b3IsCj4gPiA+ ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIHByb3BlcnR5LCB2YWwpOwo+ ID4gPiA+IEBAIC04NDIsNiArODQ1LDggQEAgZHJtX2F0b21pY19jb25uZWN0b3JfZ2V0X3Byb3Bl cnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4gPiA+ID4gICAgICAgICAgICAg ICAqdmFsID0gMDsKPiA+ID4gPiAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbm5lY3Rv ci0+bWF4X2JwY19wcm9wZXJ0eSkgewo+ID4gPiA+ICAgICAgICAgICAgICAgKnZhbCA9IHN0YXRl LT5tYXhfcmVxdWVzdGVkX2JwYzsKPiA+ID4gPiArICAgICB9IGVsc2UgaWYgKHByb3BlcnR5ID09 IGNvbmZpZy0+cHJpdmFjeV9zY3JlZW5fcHJvcGVydHkpIHsKPiA+ID4gPiArICAgICAgICAgICAg ICp2YWwgPSBkcm1fcHJpdmFjeV9zY3JlZW5fZ2V0X3ZhbChjb25uZWN0b3IpOwo+ID4gPgo+ID4g PiBTaW1pbGFybHksIEkgdGhpbmsgdGhpcyBjYW4ganVzdCByZXR1cm4gdGhlIGF0b21pYyBzdGF0 ZSdzIHZhbHVlIGZvcgo+ID4gPiB0aGlzLgo+ID4KPiA+IEkgZGlkIHRoaW5rIGFib3V0IGhhdmlu ZyBhIHN0YXRlIHZhcmlhYmxlIGluIHNvZnR3YXJlIHRvIGdldCBhbmQgc2V0Cj4gPiB0aGlzLiBI b3dldmVyLCBJIHRoaW5rIGl0IGlzIG5vdCB2ZXJ5IGZhciBmZXRjaGVkIHRoYXQgc29tZSBwbGF0 Zm9ybXMKPiA+IG1heSBoYXZlICJoYXJkd2FyZSBraWxsIiBzd2l0Y2hlcyB0aGF0IGFsbG93IGhh cmR3YXJlIHRvIHN3aXRjaAo+ID4gcHJpdmFjeS1zY3JlZW4gb24gYW5kIG9mZiBkaXJlY3RseSwg aW4gYWRkaXRpb24gdG8gdGhlIHNvZnR3YXJlCj4gPiBjb250cm9sIHRoYXQgd2UgYXJlIGltcGxl bWVudGluZy4gUHJpdmFjeSBpcyBhIHRvdWNoeSBzdWJqZWN0IGluCj4gPiBlbnRlcnByaXNlLCBh bmQgYW55dGhpbmcgdGhhdCByZWR1Y2VzIHRoZSBwb3NzaWJpbGl0eSBvZiBoYXZpbmcgYW55Cj4g PiBpbmNvbnNpc3RlbmN5IGJldHdlZW4gc29mdHdhcmUgc3RhdGUgYW5kIGhhcmR3YXJlIHN0YXRl IGlzIGRlc2lyYWJsZS4KPiA+IFNvIGluIHRoaXMgY2FzZSwgSSBjaG9zZSB0byBub3QgaGF2ZSBh IHN0YXRlIGluIHNvZnR3YXJlIGFib3V0IHRoaXMgLQo+ID4gd2UganVzdCByZXBvcnQgdGhlIGhh cmR3YXJlIHN0YXRlIGV2ZXJ5dGltZSB3ZSBhcmUgYXNrZWQgZm9yIGl0Lgo+Cj4gU28gdGhpcyBk b2Vzbid0IHJlYWxseSB3b3JrIHdpdGggYXRvbWljIEtNUywgdGhlbi4gVGhlIG1haW4gaWRlYSBi ZWhpbmQKPiBhdG9taWMgS01TIGlzIHRoYXQgeW91IGFwcGx5IGEgY29uZmlndXJhdGlvbiBlaXRo ZXIgY29tcGxldGVseSBvciBub3QgYXQKPiBhbGwuIFNvIGF0IGxlYXN0IGZvciBzZXR0aW5nIHRo aXMgcHJvcGVydHkgeW91J2QgaGF2ZSB0byBnbyB0aHJvdWdoIHRoZQo+IHN0YXRlIG9iamVjdC4K Pgo+IE5vdywgZm9yIHJlYWRpbmcgb3V0IHRoZSBwcm9wZXJ0eSB5b3UgbWlnaHQgYmUgYWJsZSB0 byBnZXQgYXdheSB3aXRoIHRoZQo+IGFib3ZlLiBJJ20gbm90IHN1cmUgaWYgdGhhdCdzIGVub3Vn aCB0byBrZWVwIHRoZSBzdGF0ZSB1cC10by1kYXRlLAo+IHRob3VnaC4gSXMgdGhlcmUgc29tZSB3 YXkgZm9yIGEga2lsbCBzd2l0Y2ggdG8gdHJpZ2dlciBhbiBpbnRlcnJ1cHQgb3IKPiBvdGhlciBl dmVudCBvZiBzb21lIHNvcnQgc28gdGhhdCB0aGUgc3RhdGUgY291bGQgYmUga2VwdCB1cC10by1k YXRlPwo+Cj4gRGFuaWVsIChvciBhbnlvbmUgZWxzZSksIGRvIHlvdSBrbm93IG9mIGFueSBwcmVj ZWRlbnQgZm9yIHN0YXRlIHRoYXQKPiBtaWdodCBnZXQgbW9kaWZpZWQgYmVoaW5kIHRoZSBhdG9t aWMgaGVscGVycycgYmFjaz8gU2VlbXMgdG8gbWUgbGlrZSB3ZQo+IG5lZWQgdG8gZmluZCBzb21l IHBvaW50IHdoZXJlIHdlIGNhbiBhY3R1YWxseSByZWFkIGJhY2sgdGhlIGN1cnJlbnQKPiAiaGFy ZHdhcmUgdmFsdWUiIG9mIHRoaXMgcHJpdmFjeSBzY3JlZW4gcHJvcGVydHkgYW5kIHN0b3JlIHRo YXQgYmFjawo+IGludG8gdGhlIHN0YXRlLgoKV2UgaGF2ZSBhdG9taWMgcHJvcGVydGllcyB0aGF0 IHRoZSBkcml2ZXIgYWxzbyB1cGRhdGVzLCBub3QganVzdCB1c2Vyc3BhY2U6Ci0gbGluayBzdGF0 dXMKLSBoZGNwIG1hY2hpbmVyeQoKQnV0IGJvdGggc3RpbGwgdXNlIHRoZSBzdGF0ZSBzdHJ1Y3R1 cmVzIGxpa2UgYW55dGhpbmcgZWxzZSwgYW5kIHRoZW4KdXBkYXRlIHRoYXQgc3RhdGUgc3RydWN0 dXJlIHRocm91Z2ggc29tZSB3b3JrZXIuCgpBbmQgeWVzIEkgdG90YWxseSBkaWRuJ3QgY2F0Y2gg dGhpcyBoZXJlLCB0aGlzIGJyZWFrcyBhdG9taWMsIGJhZGx5IDotKQoKPgo+ID4KPiA+ID4KPiA+ ID4gPiAgICAgICB9IGVsc2UgaWYgKGNvbm5lY3Rvci0+ZnVuY3MtPmF0b21pY19nZXRfcHJvcGVy dHkpIHsKPiA+ID4gPiAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0b3ItPmZ1bmNzLT5hdG9t aWNfZ2V0X3Byb3BlcnR5KGNvbm5lY3RvciwKPiA+ID4gPiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzdGF0ZSwgcHJvcGVydHksIHZhbCk7Cj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9kcm1fY29ubmVjdG9yLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2Nvbm5lY3Rv ci5jCj4gPiA+ID4gaW5kZXggNGM3NjY2MjRiMjBkLi5hMzFlMDM4MjEzMmIgMTAwNjQ0Cj4gPiA+ ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9jb25uZWN0b3IuYwo+ID4gPiA+ICsrKyBiL2Ry aXZlcnMvZ3B1L2RybS9kcm1fY29ubmVjdG9yLmMKPiA+ID4gPiBAQCAtODIxLDYgKzgyMSwxMSBA QCBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9wcm9wX2VudW1fbGlzdCBkcm1fcGFuZWxfb3JpZW50 YXRpb25fZW51bV9saXN0W10gPSB7Cj4gPiA+ID4gICAgICAgeyBEUk1fTU9ERV9QQU5FTF9PUklF TlRBVElPTl9SSUdIVF9VUCwgICJSaWdodCBTaWRlIFVwIiB9LAo+ID4gPiA+ICB9Owo+ID4gPiA+ Cj4gPiA+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX3Byb3BfZW51bV9saXN0IGRybV9wcml2 YWN5X3NjcmVlbl9lbnVtX2xpc3RbXSA9IHsKPiA+ID4gPiArICAgICB7IERSTV9QUklWQUNZX1ND UkVFTl9ESVNBQkxFRCwgIkRpc2FibGVkIiB9LAo+ID4gPiA+ICsgICAgIHsgRFJNX1BSSVZBQ1lf U0NSRUVOX0VOQUJMRUQsICJFbmFibGVkIiB9LAo+ID4gPiA+ICt9Owo+ID4gPiA+ICsKPiA+ID4g PiAgc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fcHJvcF9lbnVtX2xpc3QgZHJtX2R2aV9pX3NlbGVj dF9lbnVtX2xpc3RbXSA9IHsKPiA+ID4gPiAgICAgICB7IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9B dXRvbWF0aWMsICJBdXRvbWF0aWMiIH0sIC8qIERWSS1JIGFuZCBUVi1vdXQgKi8KPiA+ID4gPiAg ICAgICB7IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9EVklELCAgICAgICJEVkktRCIgICAgIH0sIC8q IERWSS1JICAqLwo+ID4gPiA+IEBAIC0yMjUzLDYgKzIyNTgsMzkgQEAgc3RhdGljIHZvaWQgZHJt X3RpbGVfZ3JvdXBfZnJlZShzdHJ1Y3Qga3JlZiAqa3JlZikKPiA+ID4gPiAgICAgICBrZnJlZSh0 Zyk7Cj4gPiA+ID4gIH0KPiA+ID4gPgo+ID4gPiA+ICsvKioKPiA+ID4gPiArICogZHJtX2Nvbm5l Y3Rvcl9pbml0X3ByaXZhY3lfc2NyZWVuX3Byb3BlcnR5IC0KPiA+ID4gPiArICogICBjcmVhdGUg YW5kIGF0dGFjaCB0aGUgY29ubmVjdGVyJ3MgcHJpdmFjeS1zY3JlZW4gcHJvcGVydHkuCj4gPiA+ ID4gKyAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciBmb3Igd2hpY2ggdG8gaW5pdCB0aGUgcHJpdmFj eS1zY3JlZW4gcHJvcGVydHkuCj4gPiA+ID4gKyAqCj4gPiA+ID4gKyAqIFRoaXMgZnVuY3Rpb24g Y3JlYXRlcyBhbmQgYXR0YWNoZXMgdGhlICJwcml2YWN5LXNjcmVlbiIgcHJvcGVydHkgdG8gdGhl Cj4gPiA+ID4gKyAqIGNvbm5lY3Rvci4gSW5pdGlhbCBzdGF0ZSBvZiBwcml2YWN5LXNjcmVlbiBp cyBzZXQgdG8gZGlzYWJsZWQuCj4gPiA+ID4gKyAqCj4gPiA+ID4gKyAqIFJldHVybnM6Cj4gPiA+ ID4gKyAqIFplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZS4KPiA+ID4g PiArICovCj4gPiA+ID4gK2ludCBkcm1fY29ubmVjdG9yX2luaXRfcHJpdmFjeV9zY3JlZW5fcHJv cGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiA+ID4gPiArewo+ID4gPiA+ ICsgICAgIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKPiA+ID4gPiAr ICAgICBzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcm9wOwo+ID4gPiA+ICsKPiA+ID4gPiArICAgICBw cm9wID0gZGV2LT5tb2RlX2NvbmZpZy5wcml2YWN5X3NjcmVlbl9wcm9wZXJ0eTsKPiA+ID4gPiAr ICAgICBpZiAoIXByb3ApIHsKPiA+ID4gPiArICAgICAgICAgICAgIHByb3AgPSBkcm1fcHJvcGVy dHlfY3JlYXRlX2VudW0oZGV2LCBEUk1fTU9ERV9QUk9QX0VOVU0sCj4gPiA+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgInByaXZhY3ktc2NyZWVuIiwgZHJtX3ByaXZhY3lfc2NyZWVu X2VudW1fbGlzdCwKPiA+ID4KPiA+ID4gU2VlbXMgdG8gbWUgbGlrZSB0aGUgLXNjcmVlbiBzdWZm aXggaGVyZSBpcyBzb21ld2hhdCByZWR1bmRhbnQuIFllcywgdGhlCj4gPiA+IHRoaW5nIHRoYXQg d2UgZW5hYmxlL2Rpc2FibGUgbWF5IGJlIGNhbGxlZCBhICJwcml2YWN5IHNjcmVlbiIsIGJ1dCB0 aGUKPiA+ID4gcHJvcGVydHkgdGhhdCB3ZSBlbmFibGUvZGlzYWJsZSBvbiB0aGUgY29ubmVjdG9y IGlzIHRoZSAicHJpdmFjeSIgb2YgdGhlCj4gPiA+IHVzZXIuIEknZCByZWZsZWN0IHRoYXQgaW4g YWxsIHRoZSByZWxhdGVkIHZhcmlhYmxlIG5hbWVzIGFuZCBzbyBvbiBhcwo+ID4gPiB3ZWxsLgo+ ID4KPiA+IElNSE8gYSBwcm9wZXJ0eSBjYWxsZWQgInByaXZhY3kiIG1heSBiZSBhIGxpdHRsZSBn ZW5lcmljIGZvciB0aGUgdXNlcnMKPiA+IHRvIHVuZGVyc3RhbmQgd2hhdCBpdCBpcy4gRm9yIGUu Zy4gd2hlbiBJIHN0YXJ0ZWQgbG9va2luZyBhdCBjb2RlLCBJCj4gPiBmb3VuZCB0aGUgIkNvbnRl bnQgUHJvdGVjdGlvbiIgcHJvcGVydHkgYW5kIEkgZ290IGNvbmZ1c2VkIHRoaW5raW5nCj4gPiBt YXkgYmUgaXQgcHJvdmlkZXMgc29tZXRoaW5nIHNpbWlsYXIgdG8gd2hhdCBJJ20gdHJ5aW5nIHRv IGRvLiBJIHRoaW5rCj4gPiAicHJpdmFjeS1zY3JlZW4iIGNvbnZleXMgdGhlIGNvbXBsZXRlIGNv bnRleHQgd2l0aG91dCBiZWluZyBsb25nLCBzbwo+ID4gdGhlcmUgaXMgbm8gY29uZnVzaW9uIG9y IGFtYmlndWl0eS4gQnV0IEkgZG9uJ3QgbWluZCBjaGFuZ2luZyBpdCBpZiBhCj4gPiBwcm9wZXJ0 eSAicHJpdmFjeSIgaXMgd2hhdCBwZW9wbGUgdGhpbmsgaXMgYmV0dGVyIHRvIGNvbnZleSB3aGF0 IGl0Cj4gPiBpcywgYXMgbG9uZyBhcyBpdCBpcyBjbGVhciB0byB1c2VyLgo+Cj4gVGhpcyBiZWlu ZyBhIHByb3BlcnR5IG9mIGEgZGlzcGxheSBjb25uZWN0b3IgaXQgZG9lc24ndCBzZWVtIHZlcnkK PiBhbWJpZ3VvdXMgdG8gbWUgd2hhdCB0aGlzIGlzLiBIb3cgdGhpcyBlbmRzIHVwIGJlaW5nIHBy ZXNlbnRlZCB0byB0aGUKPiB1c2VycyBpcyBtb3N0bHkgb3J0aG9nb25hbCBhbnl3YXkuIFdlJ3Zl IGdvdCBhIGJ1bmNoIG9mIHByb3BlcnRpZXMgd2hvc2UKPiBwdXJwb3NlIG1heSBub3QgYmUgY2xl YXIgdG8gdGhlIGF2ZXJhZ2UgdXNlci4gVGhlIHByb3BlcnRpZXMsIHdoaWxlIHRoZXkKPiBhcmUg VUFCSSwgZG9uJ3QgdHlwaWNhbGx5IGZhY2UgdGhlIHVzZXIgZGlyZWN0bHkuIFRoZXkncmUgc3Rp bGwgcGFydCBvZgo+IGFuIEFQSSwgc28gYXMgbG9uZyBhcyB0aGV5IGFyZSBwcm9wZXJseSBkb2N1 bWVudGVkIHRoZXJlIHNob3VsZG4ndCBiZQo+IGFueSBhbWJpZ3VpdGllcy4KClNvbWV0aW1lcyB3 ZSBnbyB0aGUgY2hlYXAgd2F5IHdpdGggY29ubmVjdG9yIHByb3BlcnRpZXMgYW5kIHNheSB0aGF0 CnRob3NlIHNob3VsZCBiZSBzZXQgYnkgdGhlIHVzZXIgZGlyZWN0bHksIHRocm91Z2ggc29tZXRo aW5nIGxpa2UKeHJhbmRyIChtb3N0bHkgZm9yIHN0dWZmIHRvIGhhY2sgYXJvdW5kIGJyb2tlbiBt b25pdG9ycykuIEJ1dCBvZmMKbmljZXIgaWYgdGhlIHByb3BlcnR5IGNvbWVzIHdpdGggc29tZSBw cm9wZXIgdXNlcnNwYWNlIGludGVncmF0aW9uLgoKPiA+ID4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBBUlJBWV9TSVpFKGRybV9wcml2YWN5X3NjcmVlbl9lbnVtX2xpc3QpKTsKPiA+ ID4gPiArICAgICAgICAgICAgIGlmICghcHJvcCkKPiA+ID4gPiArICAgICAgICAgICAgICAgICAg ICAgcmV0dXJuIC1FTk9NRU07Cj4gPiA+ID4gKwo+ID4gPiA+ICsgICAgICAgICAgICAgZGV2LT5t b2RlX2NvbmZpZy5wcml2YWN5X3NjcmVlbl9wcm9wZXJ0eSA9IHByb3A7Cj4gPiA+ID4gKyAgICAg fQo+ID4gPiA+ICsKPiA+ID4gPiArICAgICBkcm1fb2JqZWN0X2F0dGFjaF9wcm9wZXJ0eSgmY29u bmVjdG9yLT5iYXNlLCBwcm9wLAo+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIERSTV9QUklWQUNZX1NDUkVFTl9ESVNBQkxFRCk7Cj4gPiA+ID4gKyAgICAgcmV0dXJuIDA7 Cj4gPiA+ID4gK30KPiA+ID4gPiArRVhQT1JUX1NZTUJPTChkcm1fY29ubmVjdG9yX2luaXRfcHJp dmFjeV9zY3JlZW5fcHJvcGVydHkpOwo+ID4gPiA+ICsKPiA+ID4gPiAgLyoqCj4gPiA+ID4gICAq IGRybV9tb2RlX3B1dF90aWxlX2dyb3VwIC0gZHJvcCBhIHJlZmVyZW5jZSB0byBhIHRpbGUgZ3Jv dXAuCj4gPiA+ID4gICAqIEBkZXY6IERSTSBkZXZpY2UKPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL2RybV9wcml2YWN5X3NjcmVlbi5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9w cml2YWN5X3NjcmVlbi5jCj4gPiA+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+ID4gPiBpbmRl eCAwMDAwMDAwMDAwMDAuLjFkNjhlOGFhNmM1Zgo+ID4gPiA+IC0tLSAvZGV2L251bGwKPiA+ID4g PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3ByaXZhY3lfc2NyZWVuLmMKPiA+ID4gPiBAQCAt MCwwICsxLDE3NiBAQAo+ID4gPiA+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MC1vci1sYXRlcgo+ID4gPiA+ICsvKgo+ID4gPiA+ICsgKiBEUk0gcHJpdmFjeSBTY3JlZW4gY29k ZQo+ID4gPiA+ICsgKgo+ID4gPiA+ICsgKiBDb3B5cmlnaHQgwqkgMjAxOSBHb29nbGUgSW5jLgo+ ID4gPiA+ICsgKi8KPiA+ID4gPiArCj4gPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+Cj4g PiA+ID4gKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KPiA+ID4gPiArCj4gPiA+ID4gKyNpbmNsdWRl IDxkcm0vZHJtX2Nvbm5lY3Rvci5oPgo+ID4gPiA+ICsjaW5jbHVkZSA8ZHJtL2RybV9kZXZpY2Uu aD4KPiA+ID4gPiArI2luY2x1ZGUgPGRybS9kcm1fcHJpbnQuaD4KPiA+ID4gPiArCj4gPiA+ID4g KyNkZWZpbmUgRFJNX0NPTk5fRFNNX1JFVklEIDEKPiA+ID4gPiArCj4gPiA+ID4gKyNkZWZpbmUg RFJNX0NPTk5fRFNNX0ZOX1BSSVZBQ1lfR0VUX1NUQVRVUyAgIDEKPiA+ID4gPiArI2RlZmluZSBE Uk1fQ09OTl9EU01fRk5fUFJJVkFDWV9FTkFCTEUgICAgICAgICAgICAgICAyCj4gPiA+ID4gKyNk ZWZpbmUgRFJNX0NPTk5fRFNNX0ZOX1BSSVZBQ1lfRElTQUJMRSAgICAgICAgICAgICAgMwo+ID4g PiA+ICsKPiA+ID4gPiArc3RhdGljIGNvbnN0IGd1aWRfdCBkcm1fY29ubl9kc21fZ3VpZCA9Cj4g PiA+ID4gKyAgICAgR1VJRF9JTklUKDB4QzcwMzMxMTMsIDB4ODcyMCwgMHg0Q0VCLAo+ID4gPiA+ ICsgICAgICAgICAgICAgICAweDkwLCAweDkwLCAweDlELCAweDUyLCAweEIzLCAweEU1LCAweDJE LCAweDczKTsKPiA+ID4gPiArCj4gPiA+ID4gKy8qCj4gPiA+ID4gKyAqIE1ha2VzIF9EU00gY2Fs bCB0byBzZXQgcHJpdmFjeSBzY3JlZW4gc3RhdHVzIG9yIGdldCBwcml2YWN5IHNjcmVlbi4gUmV0 dXJuCj4gPiA+ID4gKyAqIHZhbHVlIG1hdHRlcnMgb25seSBmb3IgUFJJVkFDWV9HRVRfU1RBVFVT IGNhc2UuIFJldHVybnMgMCBpZiBkaXNhYmxlZCwgMSBpZgo+ID4gPiA+ICsgKiBlbmFibGVkLgo+ ID4gPiA+ICsgKi8KPiA+ID4gPiArc3RhdGljIGludCBhY3BpX3ByaXZhY3lfc2NyZWVuX2NhbGxf ZHNtKGFjcGlfaGFuZGxlIGNvbm5faGFuZGxlLCB1NjQgZnVuYykKPiA+ID4gPiArewo+ID4gPiA+ ICsgICAgIHVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7Cj4gPiA+ID4gKyAgICAgaW50IHJldCA9IDA7 Cj4gPiA+ID4gKwo+ID4gPiA+ICsgICAgIG9iaiA9IGFjcGlfZXZhbHVhdGVfZHNtKGNvbm5faGFu ZGxlLCAmZHJtX2Nvbm5fZHNtX2d1aWQsCj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgRFJNX0NPTk5fRFNNX1JFVklELCBmdW5jLCBOVUxMKTsKPiA+ID4gPiArICAgICBpZiAo IW9iaikgewo+ID4gPiA+ICsgICAgICAgICAgICAgRFJNX0RFQlVHX0RSSVZFUigiZmFpbGVkIHRv IGV2YWx1YXRlIF9EU00gZm9yIGZuICVsbHhcbiIsIGZ1bmMpOwo+ID4gPiA+ICsgICAgICAgICAg ICAgLyogQ2FuJ3QgZG8gbXVjaC4gRm9yIGdldF92YWwsIGFzc3VtZSBwcml2YWN5X3NjcmVlbiBk aXNhYmxlZCAqLwo+ID4gPiA+ICsgICAgICAgICAgICAgZ290byBkb25lOwo+ID4gPiA+ICsgICAg IH0KPiA+ID4gPiArCj4gPiA+ID4gKyAgICAgaWYgKGZ1bmMgPT0gRFJNX0NPTk5fRFNNX0ZOX1BS SVZBQ1lfR0VUX1NUQVRVUyAmJgo+ID4gPiA+ICsgICAgICAgICBvYmotPnR5cGUgPT0gQUNQSV9U WVBFX0lOVEVHRVIpCj4gPiA+ID4gKyAgICAgICAgICAgICByZXQgPSAhIW9iai0+aW50ZWdlci52 YWx1ZTsKPiA+ID4gPiArZG9uZToKPiA+ID4gPiArICAgICBBQ1BJX0ZSRUUob2JqKTsKPiA+ID4g PiArICAgICByZXR1cm4gcmV0Owo+ID4gPiA+ICt9Cj4gPiA+ID4gKwo+ID4gPiA+ICt2b2lkIGRy bV9wcml2YWN5X3NjcmVlbl9zZXRfdmFsKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3Is Cj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gZHJtX3ByaXZhY3lf c2NyZWVuIHZhbCkKPiA+ID4gPiArewo+ID4gPiA+ICsgICAgIGFjcGlfaGFuZGxlIGFjcGlfaGFu ZGxlID0gY29ubmVjdG9yLT5wcml2YWN5X3NjcmVlbl9oYW5kbGU7Cj4gPiA+ID4gKwo+ID4gPiA+ ICsgICAgIGlmICghYWNwaV9oYW5kbGUpCj4gPiA+ID4gKyAgICAgICAgICAgICByZXR1cm47Cj4g PiA+ID4gKwo+ID4gPiA+ICsgICAgIGlmICh2YWwgPT0gRFJNX1BSSVZBQ1lfU0NSRUVOX0RJU0FC TEVEKQo+ID4gPiA+ICsgICAgICAgICAgICAgYWNwaV9wcml2YWN5X3NjcmVlbl9jYWxsX2RzbShh Y3BpX2hhbmRsZSwKPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgRFJNX0NPTk5fRFNNX0ZOX1BSSVZBQ1lfRElTQUJMRSk7Cj4gPiA+ID4gKyAgICAgZWxz ZSBpZiAodmFsID09IERSTV9QUklWQUNZX1NDUkVFTl9FTkFCTEVEKQo+ID4gPiA+ICsgICAgICAg ICAgICAgYWNwaV9wcml2YWN5X3NjcmVlbl9jYWxsX2RzbShhY3BpX2hhbmRsZSwKPiA+ID4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJNX0NPTk5fRFNNX0ZO X1BSSVZBQ1lfRU5BQkxFKTsKPiA+ID4gPiArfQo+ID4gPiA+ICsKPiA+ID4gPiArZW51bSBkcm1f cHJpdmFjeV9zY3JlZW4gZHJtX3ByaXZhY3lfc2NyZWVuX2dldF92YWwoc3RydWN0IGRybV9jb25u ZWN0b3IKPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKmNvbm5lY3RvcikKPiA+ID4gPiArewo+ID4gPiA+ICsgICAgIGFjcGlfaGFuZGxlIGFj cGlfaGFuZGxlID0gY29ubmVjdG9yLT5wcml2YWN5X3NjcmVlbl9oYW5kbGU7Cj4gPiA+ID4gKwo+ ID4gPiA+ICsgICAgIGlmIChhY3BpX2hhbmRsZSAmJgo+ID4gPiA+ICsgICAgICAgICBhY3BpX3By aXZhY3lfc2NyZWVuX2NhbGxfZHNtKGFjcGlfaGFuZGxlLAo+ID4gPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIERSTV9DT05OX0RTTV9GTl9QUklWQUNZX0dFVF9TVEFU VVMpKQo+ID4gPiA+ICsgICAgICAgICAgICAgcmV0dXJuIERSTV9QUklWQUNZX1NDUkVFTl9FTkFC TEVEOwo+ID4gPiA+ICsKPiA+ID4gPiArICAgICByZXR1cm4gRFJNX1BSSVZBQ1lfU0NSRUVOX0RJ U0FCTEVEOwo+ID4gPiA+ICt9Cj4gPiA+ID4gKwo+ID4gPiA+ICsvKgo+ID4gPiA+ICsgKiBTZWUg QUNQSSBTcGVjIHY2LjMsIFRhYmxlIEItMiwgIkRpc3BsYXkgVHlwZSIgZm9yIGRldGFpbHMuCj4g PiA+ID4gKyAqIEluIHNob3J0LCB0aGVzZSBtYWNyb3MgZGVmaW5lIHRoZSBiYXNlIF9BRFIgdmFs dWVzIGZvciBBQ1BJIG5vZGVzCj4gPiA+ID4gKyAqLwo+ID4gPiA+ICsjZGVmaW5lIEFDUElfQkFT RV9BRFJfRk9SX09USEVSUyAgICAgKDBVTEwgPDwgOCkKPiA+ID4gPiArI2RlZmluZSBBQ1BJX0JB U0VfQURSX0ZPUl9WR0EgICAgICAgICAgICAgICAgKDFVTEwgPDwgOCkKPiA+ID4gPiArI2RlZmlu ZSBBQ1BJX0JBU0VfQURSX0ZPUl9UViAgICAgICAgICgyVUxMIDw8IDgpCj4gPiA+ID4gKyNkZWZp bmUgQUNQSV9CQVNFX0FEUl9GT1JfRVhUX01PTiAgICAoM1VMTCA8PCA4KQo+ID4gPiA+ICsjZGVm aW5lIEFDUElfQkFTRV9BRFJfRk9SX0lOVEVHUkFURUQgKDRVTEwgPDwgOCkKPiA+ID4gPiArCj4g PiA+ID4gKyNkZWZpbmUgQUNQSV9ERVZJQ0VfSURfU0NIRU1FICAgICAgICAgICAgICAgICgxVUxM IDw8IDMxKQo+ID4gPiA+ICsjZGVmaW5lIEFDUElfRklSTVdBUkVfQ0FOX0RFVEVDVCAgICAgKDFV TEwgPDwgMTYpCj4gPiA+ID4gKwo+ID4gPiA+ICsvKgo+ID4gPiA+ICsgKiBSZWY6IEFDUEkgU3Bl YyA2LjMKPiA+ID4gPiArICogaHR0cHM6Ly91ZWZpLm9yZy9zaXRlcy9kZWZhdWx0L2ZpbGVzL3Jl c291cmNlcy9BQ1BJXzZfM19maW5hbF9KYW4zMC5wZGYKPiA+ID4gPiArICogUGFnZXMgMTExOSAt IDExMjMgZGVzY3JpYmUsIHdoYXQgSSBiZWxpZXZlLCBhIHN0YW5kYXJkIHdheSBvZgo+ID4gPiA+ ICsgKiBpZGVudGlmeWluZyAvIGFkZHJlc3NpbmcgImRpc3BsYXkgcGFuZWxzIiBpbiB0aGUgQUNQ SS4gVGh1cyBpdCBwcm92aWRlcwo+ID4gPiA+ICsgKiBhIHdheSBmb3IgdGhlIEFDUEkgdG8gZGVm aW5lIGRldmljZXMgZm9yIHRoZSBkaXNwbGF5IHBhbmVscyBhdHRhY2hlZAo+ID4gPiA+ICsgKiB0 byB0aGUgc3lzdGVtLiBJdCB0aHVzIHByb3ZpZGVzIGEgd2F5IGZvciB0aGUgQklPUyB0byBleHBv cnQgYW55IHBhbmVsCj4gPiA+ID4gKyAqIHNwZWNpZmljIHByb3BlcnRpZXMgdG8gdGhlIHN5c3Rl bSB2aWEgQUNQSSAobGlrZSBkZXZpY2UgdHJlZXMpLgo+ID4gPiA+ICsgKgo+ID4gPiA+ICsgKiBU aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGxvb2tzIHVwIHRoZSBBQ1BJIG5vZGUgZm9yIGEgY29ubmVj dG9yIGFuZCBsaW5rcwo+ID4gPiA+ICsgKiB0byBpdC4gVGVjaG5pY2FsbHkgaXQgaXMgaW5kZXBl bmRlbnQgZnJvbSB0aGUgcHJpdmFjeV9zY3JlZW4gY29kZSwgYW5kCj4gPiA+ID4gKyAqIGlkZWFs bHkgbWF5IGJlIGNhbGxlZCBmb3IgYWxsIGNvbm5lY3RvcnMuIEl0IGlzIGdlbmVyYWxseSBhIGdv b2QgaWRlYSB0bwo+ID4gPiA+ICsgKiBiZSBhYmxlIHRvIGF0dGFjaCBhbiBBQ1BJIG5vZGUgdG8g ZGVzY3JpYmUgYW55dGhpbmcgaWYgbmVlZGVkLiAoVGhpcyBjYW4KPiA+ID4gPiArICogaGVscCBp biBmdXR1cmUgZm9yIG90aGVyIHBhbmVsIHNwZWNpZmljIGZlYXR1cmVzIG1heWJlKS4gSG93ZXZl ciwgaXQKPiA+ID4gPiArICogbmVlZHMgYSAicG9ydCBpbmRleCIgd2hpY2ggSSBiZWxpZXZlIGlz IHRoZSBpbmRleCB3aXRoaW4gYSBwYXJ0aWN1bGFyCj4gPiA+ID4gKyAqIHR5cGUgb2YgcG9ydCAo UmVmIHRvIHRoZSBwYWdlcyBvZiBzcGVjIG1lbnRpb25lZCBhYm92ZSkuIFRoaXMgcG9ydCBpbmRl eAo+ID4gPiA+ICsgKiB1bmZvcnR1bmF0ZWx5IGlzIG5vdCBhdmFpbGFibGUgaW4gRFJNIGNvZGUs IHNvIGN1cnJlbnRseSBpdHMgY2FsbCBpcwo+ID4gPiA+ICsgKiBvcmlnaW5hdGVkIGZyb20gaTkx NSBkcml2ZXIuCj4gPiA+ID4gKyAqLwo+ID4gPiA+ICtzdGF0aWMgaW50IGRybV9jb25uZWN0b3Jf YXR0YWNoX2FjcGlfbm9kZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ID4gPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBwb3J0X2luZGV4KQo+ ID4gPiA+ICt7Cj4gPiA+ID4gKyAgICAgc3RydWN0IGRldmljZSAqZGV2ID0gJmNvbm5lY3Rvci0+ ZGV2LT5wZGV2LT5kZXY7Cj4gPiA+ID4gKyAgICAgc3RydWN0IGFjcGlfZGV2aWNlICpjb25uX2Rl djsKPiA+ID4gPiArICAgICB1NjQgY29ubl9hZGRyOwo+ID4gPiA+ICsKPiA+ID4gPiArICAgICAv Kgo+ID4gPiA+ICsgICAgICAqIERldGVybWluZSB3aGF0IF9BRFIgdG8gbG9vayBmb3IsIGRlcGVu ZGluZyBvbiBkZXZpY2UgdHlwZSBhbmQKPiA+ID4gPiArICAgICAgKiBwb3J0IG51bWJlci4gUG90 ZW50aWFsbHkgd2Ugb25seSBjYXJlIGFib3V0IHRoZQo+ID4gPiA+ICsgICAgICAqIGVEUCAvIGlu dGVncmF0ZWQgZGlzcGxheXM/Cj4gPiA+ID4gKyAgICAgICovCj4gPiA+ID4gKyAgICAgc3dpdGNo IChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlKSB7Cj4gPiA+ID4gKyAgICAgY2FzZSBEUk1fTU9E RV9DT05ORUNUT1JfZURQOgo+ID4gPiA+ICsgICAgICAgICAgICAgY29ubl9hZGRyID0gQUNQSV9C QVNFX0FEUl9GT1JfSU5URUdSQVRFRCArIHBvcnRfaW5kZXg7Cj4gPiA+ID4gKyAgICAgICAgICAg ICBicmVhazsKPiA+ID4gPiArICAgICBjYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9WR0E6Cj4gPiA+ ID4gKyAgICAgICAgICAgICBjb25uX2FkZHIgPSBBQ1BJX0JBU0VfQURSX0ZPUl9WR0EgKyBwb3J0 X2luZGV4Owo+ID4gPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiA+ID4gKyAgICAgY2FzZSBE Uk1fTU9ERV9DT05ORUNUT1JfVFY6Cj4gPiA+ID4gKyAgICAgICAgICAgICBjb25uX2FkZHIgPSBB Q1BJX0JBU0VfQURSX0ZPUl9UViArIHBvcnRfaW5kZXg7Cj4gPiA+ID4gKyAgICAgICAgICAgICBi cmVhazsKPiA+ID4gPiArICAgICBjYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydDoK PiA+ID4gPiArICAgICAgICAgICAgIGNvbm5fYWRkciA9IEFDUElfQkFTRV9BRFJfRk9SX0VYVF9N T04gKyBwb3J0X2luZGV4Owo+ID4gPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiA+ID4gKyAg ICAgZGVmYXVsdDoKPiA+ID4gPiArICAgICAgICAgICAgIHJldHVybiAtRU5PVFNVUFA7Cj4gPiA+ ID4gKyAgICAgfQo+ID4gPiA+ICsKPiA+ID4gPiArICAgICBjb25uX2FkZHIgfD0gQUNQSV9ERVZJ Q0VfSURfU0NIRU1FOwo+ID4gPiA+ICsgICAgIGNvbm5fYWRkciB8PSBBQ1BJX0ZJUk1XQVJFX0NB Tl9ERVRFQ1Q7Cj4gPiA+ID4gKwo+ID4gPiA+ICsgICAgIERSTV9ERVZfREVCVUcoZGV2LCAiJXM6 IEZpbmRpbmcgZHJtX2Nvbm5lY3RvciBBQ1BJIG5vZGUgYXQgX0FEUj0lbGxYXG4iLAo+ID4gPiA+ ICsgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvbm5fYWRkcik7Cj4gPiA+ID4gKwo+ID4g PiA+ICsgICAgIC8qIExvb2sgdXAgdGhlIGNvbm5lY3RvciBkZXZpY2UsIHVuZGVyIHRoZSBQQ0kg ZGV2aWNlICovCj4gPiA+ID4gKyAgICAgY29ubl9kZXYgPSBhY3BpX2ZpbmRfY2hpbGRfZGV2aWNl KEFDUElfQ09NUEFOSU9OKGRldiksCj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGNvbm5fYWRkciwgZmFsc2UpOwo+ID4gPiA+ICsgICAgIGlmICghY29ubl9k ZXYpCj4gPiA+ID4gKyAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKPiA+ID4gPiArCj4gPiA+ ID4gKyAgICAgY29ubmVjdG9yLT5wcml2YWN5X3NjcmVlbl9oYW5kbGUgPSBjb25uX2Rldi0+aGFu ZGxlOwo+ID4gPiA+ICsgICAgIHJldHVybiAwOwo+ID4gPiA+ICt9Cj4gPiA+ID4gKwo+ID4gPiA+ ICtib29sIGRybV9wcml2YWN5X3NjcmVlbl9wcmVzZW50KHN0cnVjdCBkcm1fY29ubmVjdG9yICpj b25uZWN0b3IsIHU4IHBvcnRfaW5kZXgpCj4gPiA+Cj4gPiA+IFRoaXMgaXMgdGhlIG1haW4gcGFy dCB0aGF0IEkgdGhpbmsgaXMgYSBsaXR0bGUgdGFuZ2xlZC4gVGhpcyBpcyBhIHZlcnkKPiA+ID4g c3BlY2lmaWMgaW1wbGVtZW50YXRpb24gdGhhdCBoaWRlcyBpbiBhIGdlbmVyaWMgQVBJLgo+ID4K PiA+IEkgYWdyZWUgdGhhdCB0aGlzIGlzIGFuIEFDUEkgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24s IGJ1dCBvdGhlciB0aGFuCj4gPiB0aGF0LCBJIHRoaW5rIGl0IGRvZXMgbm90IGhhdmUgYW55IGRy aXZlciBzcGVjaWZpYyBkZXRhaWxzLiBNb3JlCj4gPiBkZXRhaWxlZCB0aG91Z2h0cyBvbiB0aGlz IGJlbG93Lgo+Cj4gV2VsbCwgdGhlIHBvcnRfaW5kZXgga2luZCBvZiB0aWVzIHRoaXMgdG8gaTkx NSBiZWNhdXNlIHRoYXQgdXNlcyB0aGlzCj4gY29uY2VwdC4gT3RoZXIgZHJpdmVycyBtYXkgbm90 Lgo+Cj4gQWxzbywgSSdtIHdvbmRlcmluZyBpZiB5b3UgY291bGRuJ3Qgc29tZWhvdyBkZXJpdmUg dGhlIHBvcnRfaW5kZXggZnJvbQo+IHRoZSBjb25uZWN0b3IuIElmIGFsbCB0aGlzIGRvZXMgaXMg dG8gZmluZCBhbiBBQ1BJIG5vZGUgY29ycmVzcG9uZGluZyB0bwo+IGEgY29ubmVjdG9yLCBzaG91 bGRuJ3QgdGhlIGNvbm5lY3RvciByZWFsbHkgYmUgYWxsIHRoYXQgeW91IG5lZWQ/CgpZZWFoIHBv cnQgc2hvdWxkIGJlIHN0b3JlZCBhbHJlYWR5IHBsZW50eSBvZiB0aW1lcyBpbiBpOTE1IGNvbm5l Y3RvciBzdHJ1Y3RzLgoKPiA+ID4gSSB3ZSBzdG9yZSB0aGUgcHJpdmFjeSBzZXR0aW5nIGluIHRo ZSBhdG9taWMgc3RhdGUsIHRoZXJlIGlzbid0IHJlYWxseSBhCj4gPiA+IHJlYXNvbiB0byBzdG9y ZSB0aGUgcHJpdmFjeSBoYW5kbGUgaW4gdGhlIGNvbm5lY3Rvci4gSW5zdGVhZCBpdCBjb3VsZCBi ZQo+ID4gPiBzaW1wbHkgc3RvcmVkIGluIHRoZSBkcml2ZXIgdGhhdCBzdXBwb3J0cyB0aGlzLgo+ ID4gPgo+ID4gPiBJZGVhbGx5IEkgdGhpbmsgd2UnZCBoYXZlIGEgdmVyeSBzbWFsbCBkcm1fcHJp dmFjeV9zY3JlZW4gb2JqZWN0IHR5cGUKPiA+ID4gdGhhdCB3b3VsZCBqdXN0IHdyYXAgdGhpcywg YnV0IHBlcmhhcHMgd2UgZG9uJ3QgbmVlZCB0aGF0IHJpZ2h0IGF3YXksCj4gPiA+IGdpdmVuIHRo YXQgd2Ugb25seSBoYXZlIGEgc2luZ2xlIGltcGxlbWVudGF0aW9uIHNvIGZhci4KPiA+Cj4gPiBZ ZXMsIGFncmVlZC4KPiA+Cj4gPiA+Cj4gPiA+IEhvd2V2ZXIsIEkgdGhpbmsgaWYgd2UganVzdCBw dXNoZWQgdGhpcyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBpbnRvIHRoZQo+ID4gPiBkcml2ZXJz IHRoYXQnZCBoZWxwIHBhdmUgdGhlIHdheSBmb3Igc29tZXRoaW5nIG1vcmUgZ2VuZXJpYyBsYXRl ciBvbgo+ID4gPiB3aXRob3V0IGEgbG90IG9mIGV4dHJhIHdvcmsgdXAgZnJvbnQuCj4gPiA+Cj4g PiA+IEZvciBleGFtcGxlIHlvdSBjb3VsZCB0dXJuIHRoZSBkcm1fY29ubmVjdG9yX2F0dGFjaF9h Y3BpX25vZGUoKSBpbnRvIGEKPiA+ID4gaGVscGVyIHRoYXQgc2ltcGx5IHJldHVybnMgdGhlIEFD UEkgaGFuZGxlLCBzb21ldGhpbmcgbGlrZSB0aGlzIHBlcmhhcHM6Cj4gPiA+Cj4gPiA+ICAgICAg ICAgc3RydWN0IGFjcGlfaGFuZGxlICpkcm1fYWNwaV9maW5kX3ByaXZhY3lfc2NyZWVuKHN0cnVj dCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwb3J0KQo+ID4g PiAgICAgICAgIHsKPiA+ID4gICAgICAgICAgICAgICAgIC4uLgo+ID4gPiAgICAgICAgIH0KPiA+ Cj4gPiBZZXMsIEkgbGlrZSB0aGF0IGlkZWEgb2YgbWFraW5nIGl0IGEgaGVscGVyIGZ1bmN0aW9u LiBJbiBmYWN0LCBmaW5kaW5nCj4gPiBhbiBBQ1BJIG5vZGUgZm9yIHRoZSBjb25uZWN0b3IgZG9l c24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIHdpdGgKPiA+IHByaXZhY3kgc2NyZWVuIChzbyBpdCBj YW4gYmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYWxzbywgaW4gZnV0dXJlKS4KPgo+IExvb2tz IGxpa2UgSSBtaXN1bmRlcnN0b29kIHRoZSBwdXJwb3NlIG9mIHRoYXQgZnVuY3Rpb24uIFlvdSBz dG9yZSB0aGUKPiBBQ1BJIGhhbmRsZSBhcyBjb25uZWN0b3ItPnByaXZhY3lfc2NyZWVuX2hhbmRs ZSwgc28gSSB3YXMgYXNzdW1pbmcgdGhhdAo+IGl0IHdhcyBnZXR0aW5nIGFuIEFDUEkgaGFuZGxl IGZvciBzb21lIHByaXZhY3kgc2NyZWVuIHN1YmRldmljZS4KPgo+ID4gPiBUaGF0IHRoZSBpOTE1 IGRyaXZlciB3b3VsZCB0aGVuIGNhbGwgYW5kIHN0b3JlIHRoZSByZXR1cm5lZCB2YWx1ZQo+ID4g PiBpbnRlcm5hbGx5LiBXaGVuIGl0IGNvbW1pdHMgdGhlIGF0b21pYyBzdGF0ZSBmb3IgdGhlIGNv bm5lY3RvciBpdCBjYW4KPiA+ID4gdGhlbiBjYWxsIHRoZSBkcm1fYWNwaV9zZXRfcHJpdmFjeSgp IChJIHRoaW5rIHRoYXQnZCBiZSBhIGJldHRlciBuYW1lCj4gPiA+IGZvciB5b3VyIGRybV9wcml2 YWN5X3NjcmVlbl9zZXRfdmFsKCkpIGJ5IHBhc3NpbmcgdGhhdCBoYW5kbGUgYW5kIHRoZQo+ID4g PiB2YWx1ZSBmcm9tIHRoZSBhdG9taWMgc3RhdGUuCj4gPiA+Cj4gPiA+IFRoZSBhYm92ZSBoYXMg dGhlIGFkdmFudGFnZSB0aGF0IHdlIGRvbid0IGNsdXR0ZXIgdGhlIGdlbmVyaWMgY29yZSB3aXRo Cj4gPiA+IHNvbWV0aGluZyB0aGF0J3Mgbm90IGF0IGFsbCBnZW5lcmljLiBJZiBldmVudHVhbGx5 IHdlIHNlZSB0aGF0IHRoZXNlCj4gPiA+IHR5cGVzIG9mIHByaXZhY3kgc2NyZWVucyBhcmUgaW1w bGVtZW50ZWQgaW4gbW9yZSBkZXZpY2Ugd2UgY2FuIGFsd2F5cwo+ID4gPiByZWZhY3RvciB0aGlz IGludG8gc29tZXRoaW5nIHJlYWxseSBnZW5lcmljIGFuZCBtYXliZSBldmVuIGRlY2lkZSB0byBw dXQKPiA+ID4gaXQgaW50byB0aGUgZHJtX2Nvbm5lY3RvciBkaXJlY3RseS4KPiA+Cj4gPiBUaGlz IGlzIHdoZXJlIEkgdGhpbmsgSSdtIGluIHNsaWdodCBkaXNhZ3JlZW1lbnQuIEkgdGhpbmsgdGhl Cj4gPiBmdW5jdGlvbmFsaXR5IHdlJ3JlIGFkZGluZyBpcyBzdGlsbCAiZ2VuZXJpYyIsIGp1c3Qg dGhhdCB0aGUgb25seQo+ID4gaGFyZHdhcmUgKkkgaGF2ZSB0b2RheSogdG8gdGVzdCBpcyB1c2lu ZyBJbnRlbCBlRFAgcG9ydHMuIEJ1dCBJIGRvbid0Cj4gPiBzZWUgd2h5IEFNRCBDUFUgbGFwdG9w cyBjYW4ndCBoYXZlIGl0IChGb3IgRS5nLiBIUCdzIEVsaXRlYm9vayA3NDUgRzUKPiA+IHNlZW1z IHRvIHVzZSBBTUQgYW5kIGhhcyBpbnRlZ3JhdGVkIHByaXZhY3kgc2NyZWVuIGZlYXR1cmUKPiA+ IGh0dHA6Ly93d3c4LmhwLmNvbS9oMjAxOTUvVjIvR2V0UERGLmFzcHgvNGFhNy0yODAyZWVlKSAu Cj4gPiBNeSB3b3JyeSBpcyB0aGF0IGlmIHdlIGRvbid0IG1ha2UgaXQgZ2VuZXJpYyB0b2RheSwg d2UgbWlnaHQgc2VlCj4gPiBkdXBsaWNhdGUgLyBzaW1pbGFyLWJ1dC1kaWZmZXJlbnQgLyBkaWZm ZXJlbnQgd2F5cyBvZiB0aGlzIGluIG90aGVyCj4gPiBwbGFjZXMgKGUuZy4gaHR0cHM6Ly9naXQu a2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdG9ydmFsZHMvbGludXguZ2l0L2Nv bW1pdC8/aWQ9MTEwZWExZDgzM2FkKQo+ID4gYmVjYXVzZSB1bmxlc3MgaXQgaXMgZ2VuZXJpYyB0 byBzdGFydCB3aXRoLCBpdCBpcyBkaWZmaWN1bHQgZm9yIHNvbWUKPiA+IG9uZSB0byBjaGFuZ2Ug bGF0ZXIgZm9yIHRoZSBmZWFyIG9mIGJyZWFraW5nIGhhcmR3YXJlIHRoYXQgaXMgYWxyZWFkeQo+ ID4gaW4gbWFya2V0IGdpdmVuIHRoYXQKPiA+ICAqIGhhcmR3YXJlIG1heSBub3QgYmUgYXZhaWxh YmxlIHRvIG5ldyBkZXZlbG9wZXIgdG8gdGVzdCBmb3IKPiA+IHJlZ3Jlc3Npb25zIChhbHNvIHRo ZXJlIGlzIHZlcnkgbGl0dGxlIG1vdGl2YXRpb24gdG8gY2hlY2sgYW55Cj4gPiBoYXJkd2FyZSBv dGhlciB0aGFuIHlvdXIgb3duKS4KPiA+ICAqIHNwZWNpYWxseSBmb3IgYSBjb2RlIHRoYXQgcmVs aWVzIG9uIGZpcm13YXJlIEFDUEkgKGZpcm13YXJlCj4gPiB1cGdyYWRlcyBpbiBmaWVsZCBhcmUg YWx3YXlzIGNvc3RseSkuCj4gPgo+ID4gTXkgdW5kZXJzdGFuZGluZyBpcyB0aGF0IHdlJ3JlIGFk ZGluZyAyIGZ1bmN0aW9uYWxpdGllcyBoZXJlOgo+ID4KPiA+IDEpIElkZW50aWZ5IGFuZCBBdHRh Y2ggQUNQSSBub2RlIHRvIERSTSBjb25uZWN0b3IuIFNpbmNlIHRoaXMgaXMKPiA+IGZvbGxvd2lu ZyBBQ1BJIHNwZWMsIEkgdGhpbmsgdGhpcyBpcyAgZ2VuZXJpYyBlbm91Z2guCj4KPiBJdCdzIHBy b2JhYmx5IHdvcnRoIG1ha2luZyB0aGlzIGEgc2VwYXJhdGUgcGF0Y2ggaW4gdGhhdCBjYXNlLiBJ ZiB0aGUKPiBBQ1BJIGhhbmRsZSByZWFsbHkgcmVwcmVzZW50cyB0aGUgY29ubmVjdG9yIGl0c2Vs ZiwgdGhlbiBpdCBzZWVtcyBmaW5lCj4gdG8gc3RvcmUgaXQgaW4gdGhlIGNvbm5lY3Rvci4gQnV0 IGl0IHNob3VsZG4ndCBiZSBjYWxsZWQgcHJpdmFjeV9zY3JlZW4KPiBpbiB0aGF0IGNhc2UuCgpQ cm9iYWJseSBzdGlsbCBzaG91bGQgYmUgaW4gaTkxNS4gV2UgaGF2ZSBhIGZldyBmaXJtd2FyZSBo YW5kbGUgdGhpbmdzCmluIHRoZXJlIGFscmVhZHkuIElmIG90aGVyIGRyaXZlcnMgbmVlZCB0aGlz LCB3ZSBjb3VsZCBtYWtlIGFuIGFjcGkKaGVscGVyIGxpYnJhcnkgdGhhdCBkcml2ZXJzIGNhbiBj YWxsIHRvIGZpbmQgdGhlIHJpZ2h0IGFjcGkgaGFuZGxlIGZvcgp0aGVpciBjb25uZWN0b3IuCgo+ ID4gMikgVXNlIEFDUEkgX0RTTSBtdGhvZHMgdG8gaWRlbnRpZnkgc2NyZWVuLCBzZXQgYW5kIGdl dCB2YWx1ZXMuIFRoaXMKPiA+IGlzIHdoZXJlIEkgdGhpbmsgd2UncmUgc2V0dGluZyAoZ2VuZXJp YykgZXhwZWN0YXRpb25zIGZvciB0aGUgQUNQSQo+ID4gbWV0aG9kcyBpbiBob3cgdGhleSBzaG91 bGQgYmVoYXZlIGlmIEFDUEkgaXMgdG8gYmUgdXNlZCB0byBjb250cm9sCj4gPiBwcml2YWN5IHNj cmVlbi4gSWYgd2UgcHV0IHRoaXMgaW4gZ2VuZXJpYyBjb2RlIHRvZGF5LCBmdXR1cmUKPiA+IGRl dmVsb3BlcnMgY2FuIGxvb2sgYXQgdGhpcyB0byB1bmRlcnN0YW5kIGhvdyB0aGVpciBBQ1BJIGZv ciBuZXcKPiA+IHBsYXRmb3JtcyBpcyB0byBiZWhhdmUgaWYgdGhleSB3YW50IHRvIHVzZSB0aGlz IGdlbmVyaWMgY29kZS4gSWYgd2UKPiA+IHB1dCBpdCBpbiBpOTE1IHNwZWNpZmljIGNvZGUsIHRo aXMgd2lsbCBiZSBzZWVuIGFzIGRyaXZlciBzcGVjaWZpYwo+ID4gYmVoYXZpb3IgYW5kIGRldmVs b3BlcnMgbWF5IGNob29zZSBzb21lIG90aGVyIGJlaGF2aW9yIGluIHRoZWlyCj4gPiBkcml2ZXIu Cj4KPiBJIHRoaW5rIGl0J3MgZmluZSB0byBwdXQgdGhpcyBmdW5jdGlvbmFsaXR5IGludG8gZ2Vu ZXJpYyBjb2RlLiBXaGF0IEkKPiBkb24ndCB0aGluayBpcyBnb29kIHRvIGRvIGlzIHRvIGhhdmUg dGhpcyBjb2RlIGNhbGxlZCBmcm9tIGdlbmVyaWMgY29kZS4KPiBJdCdzIG9wdC1pbiBmdW5jdGlv bmFsaXR5IHRoYXQgZHJpdmVycyBzaG91bGQgY2FsbCBpZiB0aGV5IGtub3cgdGhhdCB0aGUKPiBj b25uZWN0b3IgaGFzIGFuIGFzc29jaWF0ZWQgQUNQSSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCBm b3IgcHJpdmFjeQo+IHNjcmVlbiBjb250cm9sLgo+Cj4gQWZ0ZXIgcmVhZGluZyB0aGUgcGF0Y2gg YWdhaW4gYW5kIHJlYWxpemluZyB0aGF0IHlvdSdyZSBub3QgYWN0dWFsbHkKPiBkZWFsaW5nIHdp dGggYW4gQUNQSSBoYW5kbGUgdG8gdGhlIHByaXZhY3kgc2NyZWVuIGRpcmVjdGx5IGJ1dCBvbmUg Zm9yCj4gdGhlIGNvbm5lY3RvciwgSSB0aGluayB0aGlzIGlzIG9rYXkuIFlvdSBkbyBpbiBmYWN0 IGNhbGwgaW50byB0aGlzIGZyb20KPiB0aGUgaTkxNSBvbmx5LiBJIHN0aWxsIGRvbid0IHRoaW5r IHRoZSBuYW1pbmcgaXMgZ3JlYXQsIGFuZCBpdCdkIGJlIG5pY2UKPiB0byBzZWUgQUNQSSBhcyBw YXJ0IG9mIHRoZSBmdW5jdGlvbiBuYW1lIHRvIG1ha2UgdGhhdCBleHBsaWNpdC4gV2UgY291bGQK PiBhbHdheXMgYWRkcmVzcyB0aGF0IGF0IGEgbGF0ZXIgcG9pbnQsIGJ1dCBtYXkgYXMgd2VsbCBk byBpdCByaWdodCBmcm9tCj4gdGhlIHN0YXJ0Lgo+Cj4gPiBJIGFncmVlIHRoYXQgdGhlIGZ1bmN0 aW9uYWxpdHkgd2UncmUgYWRkaW5nIGlzIEFDUEkgc3BlY2lmaWMgKHRvZGF5IC0KPiA+IGJ1dCBj YW4gYmUgZXh0ZW5kZWQgdG8gZ3BpbyBpbiBmdXR1cmUgZm9yIG5vbiB4ODYgcGxhdGZvcm1zKSwg YnV0IG5vdAo+ID4gbmVjZXNzYXJpbHkgZHJpdmVyIHNwZWNpZmljLiBBY3R1YWxseSB0aGUgb25s eSByZWFzb24sIEkgaGFkIHRvIGNhbGwKPiA+IHRoZSBkcm1fcHJpdmFjeV9zY3JlZW5fcHJlc2Vu dCgpIChhbmQgdGhlCj4gPiBkcm1faW5pdF9wcml2YWN5X3NjcmVlbl9wcm9wZXJ0eSgpKSBmdW5j dGlvbiBmcm9tIGk5MTUgY29kZSBpcyBiZWNhdXNlCj4gPiB3ZSBuZWVkIGEgcG9ydF9pbmRleCB0 byBsb29rdXAgQUNQSSBub2RlLiBJZiB3ZSBoYWQgdGhhdCBhdmFpbGFibGUgaW4KPiA+IGRybSBj b2RlLCB3ZSB3b3VsZG4ndCBuZWVkIHRvIGNhbGwgYW55dGhpbmcgZnJvbSBpOTE1IGF0IGFsbC4K Pgo+IFlvdSdyZSBraW5kIG9mIHByb3ZpbmcgbXkgcG9pbnQgYWJvdXQgdGhpcyBBUEkgYmVpbmcg ZHJpdmVyLXNwZWNpZmljLCBvcgo+IGF0IGxlYXN0IEFDUEkgc3BlY2lmaWMuIE5vbi1BQ1BJIGRl dmljZXMgKG1heWJlIGV2ZW4gbm9uLWk5MTUgZGV2aWNlcz8pCj4gbWF5IG5vdCBoYXZlIGEgY29u Y2VwdCBvZiBhIHBvcnQgaW5kZXguIEVuY29kaW5nIHRoaXMgaW4gdGhlIEFQSSBtYWtlcwo+IHRo ZSBBUEkgbm9uLWdlbmVyaWMuCj4KPiBBcyBJIG1lbnRpb25lZCBhYm92ZSwgaWYgd2UgY291bGQg ZGVyaXZlIHRoZSBwb3J0IGluZGV4IGZyb20gdGhlCj4gY29ubmVjdG9yLCB0aGF0J2QgYmUgbXVj aCBiZXR0ZXIuIENvdWxkIHlvdSBwZXJoYXBzIHVzZSBkcm1fY29ubmVjdG9yJ3MKPiBpbmRleCBm aWVsZD8KPgo+IFVubGVzcyB0aGVyZSdzIGEgd2F5IHRvIHJlbGlhYmx5IGRldGVjdCB0aGlzIHR5 cGUgb2YgZnVuY3Rpb25hbGl0eSBmcm9tCj4gZ2VuZXJpYyBjb2RlLCBJIHRoaW5rIGl0IHNob3Vs ZCBhbHdheXMgYmUgY2FsbGVkIGZyb20gdGhlIGRyaXZlci4KCk1heWJlIHRpbWUgdG8gcGl0Y2gg dGhlIG9sZCBjbGFzc2ljIGFnYWluOgoKaHR0cHM6Ly9ibG9nLmZmd2xsLmNoLzIwMTYvMTIvbWlk bGF5ZXJzLW9uY2UtbW9yZS13aXRoLWZlZWxpbmcuaHRtbAoKRXNwZWNpYWxseSBhbGwgdGhlIGxp bmtzIGluIHRoZSBmaXJzdCBwYXJ0LgoKPiA+IFNvLCBmb3IgdGhlIHJlYXNvbnMgc3RhdGVkIGFi b3ZlLCBJTUhPIGl0IGlzIGJldHRlciB0byByZXRhaW4gdGhpcwo+ID4gZnVuY3Rpb25hbGl0eSBp biBkcm0gY29kZSBpbnN0ZWFkIG9mIGk5MTUgZHJpdmVyLiBCdXQgSSdtIG5ldyB0byB0aGUKPiA+ IGRybSAvIGk5MTUgY29kZSwgYW5kIHdvdWxkIGJlIGhhcHB5IHRvIGNoYW5nZSBteSBjb2RlIGlm IHBlb3BsZSBoYXZlCj4gPiBzdHJvbmcgb3BpbmlvbnMgYWJvdXQgdGhpcy4gTGV0IG1lIGtub3cu Cj4KPiBNYXliZSBJIHdhcyBiZWluZyB1bmNsZWFyLiBJIHdhc24ndCBhcmd1aW5nIHRoYXQgYWxs IHRoZSBjb2RlIHNob3VsZCBiZQo+IG1vdmVkIGludG8gdGhlIGk5MTUgZHJpdmVyLiBBbGwgSSB3 YXMgc2F5aW5nIHRoYXQgaW5zdGVhZCBvZiBzdG9yaW5nIHRoZQo+IEFDUEkgaGFuZGxlIGluc2lk ZSBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvciwgd2Ugc2hvdWxkIG1heWJlIHN0b3JlIGl0IGluc2lkZQo+ IHRoZSBpOTE1IGRyaXZlcidzIGNvbm5lY3RvciBzdHJ1Y3R1cmUuIHN0cnVjdCBkcm1fY29ubmVj dG9yIGlzIGEgdmVyeQo+IGdlbmVyaWMgY29uY2VwdCBhbmQgZWFjaCBhbmQgZXZlcnkgY29ubmVj dG9yIG9iamVjdCBvbiBldmVyeSBwbGF0Zm9ybQo+IHdpbGwgZ2V0IHRoYXQgQUNQSSBoYW5kbGUg cG9pbnRlciBpZiB5b3UgYWRkIGl0IHRoZXJlLiBJIGRvbid0IHRoaW5rIGFuCj4gQUNQSSBoYW5k bGUgYmVsb25ncyB0aGVyZS4gRm9yIGV4YW1wbGUsIG9uIEFSTSBTb0NzIGl0J3MgY29tbW9uIHRv IGhhdmUKPiBjb25uZWN0b3JzIGJlIGJhY2tlZCBieSBhIHN0cnVjdCBkZXZpY2UgKG9yIHN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgbW9yZQo+IHNwZWNpZmljYWxseSkuIEJ1dCB3ZSBkb24ndCBwdXQg dGhhdCBpbmZvcm1hdGlvbiBpbnRvIGRybV9jb25uZWN0b3IKPiBiZWNhdXNlIFBDSSBncmFwaGlj cyBhZGFwdGVycyBkb24ndCBoYXZlIGEgc3RydWN0IGRldmljZSB0aGF0IHJlcHJlc2VudHMKPiB0 aGUgY29ubmVjdG9yLgoKKzEgb24gYWxsIHRoZSBzdHVmZiBUaGllcnJ5IHNheXMgaGVyZSBlc3Nl bnRpYWxseS4KCkNoZWVycywgRGFuaWVsCgo+Cj4gVGhpZXJyeQo+Cj4gPgo+ID4gVGhhbmtzICYg QmVzdCBSZWdhcmRzLAo+ID4KPiA+IFJhamF0Cj4gPgo+ID4gPgo+ID4gPiA+ICt7Cj4gPiA+ID4g KyAgICAgYWNwaV9oYW5kbGUgaGFuZGxlOwo+ID4gPiA+ICsKPiA+ID4gPiArICAgICBpZiAoZHJt X2Nvbm5lY3Rvcl9hdHRhY2hfYWNwaV9ub2RlKGNvbm5lY3RvciwgcG9ydF9pbmRleCkpCj4gPiA+ ID4gKyAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4gPiA+ID4gKwo+ID4gPiA+ICsgICAgIGhh bmRsZSA9IGNvbm5lY3Rvci0+cHJpdmFjeV9zY3JlZW5faGFuZGxlOwo+ID4gPiA+ICsgICAgIGlm ICghYWNwaV9jaGVja19kc20oaGFuZGxlLCAmZHJtX2Nvbm5fZHNtX2d1aWQsCj4gPiA+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICBEUk1fQ09OTl9EU01fUkVWSUQsCj4gPiA+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAxIDw8IERSTV9DT05OX0RTTV9GTl9QUklWQUNZX0dFVF9TVEFU VVMgfAo+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgMSA8PCBEUk1fQ09OTl9EU01f Rk5fUFJJVkFDWV9FTkFCTEUgfAo+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgMSA8 PCBEUk1fQ09OTl9EU01fRk5fUFJJVkFDWV9ESVNBQkxFKSkgewo+ID4gPiA+ICsgICAgICAgICAg ICAgRFJNX1dBUk4oIiVzOiBPZGQsIGNvbm5lY3RvciBBQ1BJIG5vZGUgYnV0IG5vIHByaXZhY3kg c2Nybj9cbiIsCj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3ItPmRldi0+ ZGV2KTsKPiA+ID4gPiArICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKPiA+ID4gPiArICAgICB9 Cj4gPiA+ID4gKyAgICAgRFJNX0RFVl9JTkZPKGNvbm5lY3Rvci0+ZGV2LT5kZXYsICJzdXBwb3J0 cyBwcml2YWN5IHNjcmVlblxuIik7Cj4gPiA+ID4gKyAgICAgcmV0dXJuIHRydWU7Cj4gPiA+ID4g K30KPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRl bF9kcC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kcC5jCj4gPiA+ID4g aW5kZXggNTdlOWYwYmEzMzFiLi4zZmYzOTYyZDI3ZGIgMTAwNjQ0Cj4gPiA+ID4gLS0tIGEvZHJp dmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kcC5jCj4gPiA+ID4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kcC5jCj4gPiA+ID4gQEAgLTM5LDYgKzM5LDcg QEAKPiA+ID4gPiAgI2luY2x1ZGUgPGRybS9kcm1fZHBfaGVscGVyLmg+Cj4gPiA+ID4gICNpbmNs dWRlIDxkcm0vZHJtX2VkaWQuaD4KPiA+ID4gPiAgI2luY2x1ZGUgPGRybS9kcm1faGRjcC5oPgo+ ID4gPiA+ICsjaW5jbHVkZSA8ZHJtL2RybV9wcml2YWN5X3NjcmVlbi5oPgo+ID4gPiA+ICAjaW5j bHVkZSA8ZHJtL2RybV9wcm9iZV9oZWxwZXIuaD4KPiA+ID4gPiAgI2luY2x1ZGUgPGRybS9pOTE1 X2RybS5oPgo+ID4gPiA+Cj4gPiA+ID4gQEAgLTYzNTQsNiArNjM1NSw4IEBAIGludGVsX2RwX2Fk ZF9wcm9wZXJ0aWVzKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAsIHN0cnVjdCBkcm1fY29ubmVj dG9yICpjb25uZWN0Cj4gPiA+ID4KPiA+ID4gPiAgICAgICAgICAgICAgIGNvbm5lY3Rvci0+c3Rh dGUtPnNjYWxpbmdfbW9kZSA9IERSTV9NT0RFX1NDQUxFX0FTUEVDVDsKPiA+ID4gPgo+ID4gPiA+ ICsgICAgICAgICAgICAgaWYgKGRybV9wcml2YWN5X3NjcmVlbl9wcmVzZW50KGNvbm5lY3Rvciwg cG9ydCAtIFBPUlRfQSkpCj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIGRybV9jb25uZWN0 b3JfaW5pdF9wcml2YWN5X3NjcmVlbl9wcm9wZXJ0eShjb25uZWN0b3IpOwo+ID4gPiA+ICAgICAg IH0KPiA+ID4gPiAgfQo+ID4gPiA+Cj4gPiA+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2Ry bV9jb25uZWN0b3IuaCBiL2luY2x1ZGUvZHJtL2RybV9jb25uZWN0b3IuaAo+ID4gPiA+IGluZGV4 IDY4MWNiNTkwZjk1Mi4uNjNiODMxOGJkNjhjIDEwMDY0NAo+ID4gPiA+IC0tLSBhL2luY2x1ZGUv ZHJtL2RybV9jb25uZWN0b3IuaAo+ID4gPiA+ICsrKyBiL2luY2x1ZGUvZHJtL2RybV9jb25uZWN0 b3IuaAo+ID4gPiA+IEBAIC0yMjUsNiArMjI1LDIwIEBAIGVudW0gZHJtX2xpbmtfc3RhdHVzIHsK PiA+ID4gPiAgICAgICBEUk1fTElOS19TVEFUVVNfQkFEID0gRFJNX01PREVfTElOS19TVEFUVVNf QkFELAo+ID4gPiA+ICB9Owo+ID4gPiA+Cj4gPiA+ID4gKy8qKgo+ID4gPiA+ICsgKiBlbnVtIGRy bV9wcml2YWN5X3NjcmVlbiAtIHByaXZhY3lfc2NyZWVuIHN0YXR1cwo+ID4gPiA+ICsgKgo+ID4g PiA+ICsgKiBUaGlzIGVudW0gaXMgdXNlZCB0byB0cmFjayBhbmQgY29udHJvbCB0aGUgc3RhdGUg b2YgdGhlIHByaXZhY3kgc2NyZWVuLgo+ID4gPiA+ICsgKiBUaGVyZSBhcmUgbm8gc2VwYXJhdGUg I2RlZmluZXMgZm9yIHRoZSB1YXBpIQo+ID4gPiA+ICsgKgo+ID4gPiA+ICsgKiBARFJNX1BSSVZB Q1lfU0NSRUVOX0RJU0FCTEVEOiBUaGUgcHJpdmFjeS1zY3JlZW4gb24gdGhlIHBhbmVsIGlzIGRp c2FibGVkCj4gPiA+ID4gKyAqIEBEUk1fUFJJVkFDWV9TQ1JFRU5fRU5BQkxFRDogIFRoZSBwcml2 YWN5LXNjcmVlbiBvbiB0aGUgcGFuZWwgaXMgZW5hYmxlZAo+ID4gPiA+ICsgKi8KPiA+ID4gPiAr ZW51bSBkcm1fcHJpdmFjeV9zY3JlZW4gewo+ID4gPiA+ICsgICAgIERSTV9QUklWQUNZX1NDUkVF Tl9ESVNBQkxFRCA9IDAsCj4gPiA+ID4gKyAgICAgRFJNX1BSSVZBQ1lfU0NSRUVOX0VOQUJMRUQg PSAxLAo+ID4gPiA+ICt9Owo+ID4gPiA+ICsKPiA+ID4KPiA+ID4gU2hvdWxkbid0IHRoaXMgZ28g aW50byBpbmNsdWRlL3VhcGkvZHJtL2RybV9tb2RlLmg/IFRoYXQgd291bGQgaGF2ZSB0aGUKPiA+ ID4gYWR2YW50YWdlIG9mIGdpdmluZyB1c2Vyc3BhY2Ugc3ltYm9saWMgbmFtZXMgdG8gdXNlIHdo ZW4gc2V0dGluZyB0aGUKPiA+ID4gcHJvcGVydHkuCj4gPiA+Cj4gPiA+IE1heWJlIGFsc28gcmVu YW1lIHRoZXNlIHRvIHNvbWV0aGluZyBsaWtlOgo+ID4gPgo+ID4gPiAgICAgICAgICNkZWZpbmUg RFJNX01PREVfUFJJVkFDWV9ESVNBQkxFRCAwCj4gPiA+ICAgICAgICAgI2RlZmluZSBEUk1fTU9E RV9QUklWQUNZX0VOQUJMRUQgMQo+ID4gPgo+ID4gPiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhl ciBwcm9wZXJ0aWVzLgo+ID4gPgo+ID4gPiBUaGllcnJ5Cj4gPiA+Cj4gPiA+ID4gIC8qKgo+ID4g PiA+ICAgKiBlbnVtIGRybV9wYW5lbF9vcmllbnRhdGlvbiAtIHBhbmVsX29yaWVudGF0aW9uIGlu Zm8gZm9yICZkcm1fZGlzcGxheV9pbmZvCj4gPiA+ID4gICAqCj4gPiA+ID4gQEAgLTE0MTAsNiAr MTQyNCw5IEBAIHN0cnVjdCBkcm1fY29ubmVjdG9yIHsKPiA+ID4gPgo+ID4gPiA+ICAgICAgIC8q KiBAaGRyX3NpbmtfbWV0YWRhdGE6IEhEUiBNZXRhZGF0YSBJbmZvcm1hdGlvbiByZWFkIGZyb20g c2luayAqLwo+ID4gPiA+ICAgICAgIHN0cnVjdCBoZHJfc2lua19tZXRhZGF0YSBoZHJfc2lua19t ZXRhZGF0YTsKPiA+ID4gPiArCj4gPiA+ID4gKyAgICAgLyogSGFuZGxlIHVzZWQgYnkgcHJpdmFj eSBzY3JlZW4gY29kZSAqLwo+ID4gPiA+ICsgICAgIHZvaWQgKnByaXZhY3lfc2NyZWVuX2hhbmRs ZTsKPiA+ID4gPiAgfTsKPiA+ID4gPgo+ID4gPiA+ICAjZGVmaW5lIG9ial90b19jb25uZWN0b3Io eCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBkcm1fY29ubmVjdG9yLCBiYXNlKQo+ID4gPiA+IEBA IC0xNTQzLDYgKzE1NjAsNyBAQCBpbnQgZHJtX2Nvbm5lY3Rvcl9pbml0X3BhbmVsX29yaWVudGF0 aW9uX3Byb3BlcnR5KAo+ID4gPiA+ICAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0 b3IsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Cj4gPiA+ID4gIGludCBkcm1fY29ubmVjdG9yX2F0 dGFjaF9tYXhfYnBjX3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4g PiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW4sIGlu dCBtYXgpOwo+ID4gPiA+ICtpbnQgZHJtX2Nvbm5lY3Rvcl9pbml0X3ByaXZhY3lfc2NyZWVuX3By b3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwo+ID4gPiA+Cj4gPiA+ID4g IC8qKgo+ID4gPiA+ICAgKiBzdHJ1Y3QgZHJtX3RpbGVfZ3JvdXAgLSBUaWxlIGdyb3VwIG1ldGFk YXRhCj4gPiA+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9tb2RlX2NvbmZpZy5oIGIv aW5jbHVkZS9kcm0vZHJtX21vZGVfY29uZmlnLmgKPiA+ID4gPiBpbmRleCAzYmNiZTMwMzM5ZjAu LjZkNWQyM2RhOTBkNCAxMDA2NDQKPiA+ID4gPiAtLS0gYS9pbmNsdWRlL2RybS9kcm1fbW9kZV9j b25maWcuaAo+ID4gPiA+ICsrKyBiL2luY2x1ZGUvZHJtL2RybV9tb2RlX2NvbmZpZy5oCj4gPiA+ ID4gQEAgLTgxMyw2ICs4MTMsMTMgQEAgc3RydWN0IGRybV9tb2RlX2NvbmZpZyB7Cj4gPiA+ID4g ICAgICAgICovCj4gPiA+ID4gICAgICAgc3RydWN0IGRybV9wcm9wZXJ0eSAqcGFuZWxfb3JpZW50 YXRpb25fcHJvcGVydHk7Cj4gPiA+ID4KPiA+ID4gPiArICAgICAvKioKPiA+ID4gPiArICAgICAg KiBAcHJpdmFjeV9zY3JlZW5fcHJvcGVydHk6IE9wdGlvbmFsIGNvbm5lY3RvciBwcm9wZXJ0eSB0 byBpbmRpY2F0ZQo+ID4gPiA+ICsgICAgICAqIGFuZCBjb250cm9sIHRoZSBzdGF0ZSAoZW5hYmxl ZCAvIGRpc2FibGVkKSBvZiBwcml2YWN5LXNjcmVlbiBvbiB0aGUKPiA+ID4gPiArICAgICAgKiBw YW5lbCwgaWYgcHJlc2VudC4KPiA+ID4gPiArICAgICAgKi8KPiA+ID4gPiArICAgICBzdHJ1Y3Qg ZHJtX3Byb3BlcnR5ICpwcml2YWN5X3NjcmVlbl9wcm9wZXJ0eTsKPiA+ID4gPiArCj4gPiA+ID4g ICAgICAgLyoqCj4gPiA+ID4gICAgICAgICogQHdyaXRlYmFja19mYl9pZF9wcm9wZXJ0eTogUHJv cGVydHkgZm9yIHdyaXRlYmFjayBjb25uZWN0b3JzLCBzdG9yaW5nCj4gPiA+ID4gICAgICAgICog dGhlIElEIG9mIHRoZSBvdXRwdXQgZnJhbWVidWZmZXIuCj4gPiA+ID4gZGlmZiAtLWdpdCBhL2lu Y2x1ZGUvZHJtL2RybV9wcml2YWN5X3NjcmVlbi5oIGIvaW5jbHVkZS9kcm0vZHJtX3ByaXZhY3lf c2NyZWVuLmgKPiA+ID4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gPiA+IGluZGV4IDAwMDAw MDAwMDAwMC4uYzU4OWJiYzQ3NjU2Cj4gPiA+ID4gLS0tIC9kZXYvbnVsbAo+ID4gPiA+ICsrKyBi L2luY2x1ZGUvZHJtL2RybV9wcml2YWN5X3NjcmVlbi5oCj4gPiA+ID4gQEAgLTAsMCArMSwzMyBA QAo+ID4gPiA+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlciAq Lwo+ID4gPiA+ICsvKgo+ID4gPiA+ICsgKiBDb3B5cmlnaHQgwqkgMjAxOSBHb29nbGUgSW5jLgo+ ID4gPiA+ICsgKi8KPiA+ID4gPiArCj4gPiA+ID4gKyNpZm5kZWYgX19EUk1fUFJJVkFDWV9TQ1JF RU5fSF9fCj4gPiA+ID4gKyNkZWZpbmUgX19EUk1fUFJJVkFDWV9TQ1JFRU5fSF9fCj4gPiA+ID4g Kwo+ID4gPiA+ICsjaWZkZWYgQ09ORklHX0FDUEkKPiA+ID4gPiArYm9vbCBkcm1fcHJpdmFjeV9z Y3JlZW5fcHJlc2VudChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCB1OCBwb3J0KTsK PiA+ID4gPiArdm9pZCBkcm1fcHJpdmFjeV9zY3JlZW5fc2V0X3ZhbChzdHJ1Y3QgZHJtX2Nvbm5l Y3RvciAqY29ubmVjdG9yLAo+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVu dW0gZHJtX3ByaXZhY3lfc2NyZWVuIHZhbCk7Cj4gPiA+ID4gK2VudW0gZHJtX3ByaXZhY3lfc2Ny ZWVuIGRybV9wcml2YWN5X3NjcmVlbl9nZXRfdmFsKHN0cnVjdCBkcm1fY29ubmVjdG9yCj4gPiA+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb25u ZWN0b3IpOwo+ID4gPiA+ICsjZWxzZQo+ID4gPiA+ICtzdGF0aWMgaW5saW5lIGJvb2wgZHJtX3By aXZhY3lfc2NyZWVuX3ByZXNlbnQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiA+ ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IHBvcnQp Cj4gPiA+ID4gK3sKPiA+ID4gPiArICAgICByZXR1cm4gZmFsc2U7Cj4gPiA+ID4gK30KPiA+ID4g PiArCj4gPiA+ID4gK3ZvaWQgZHJtX3ByaXZhY3lfc2NyZWVuX3NldF92YWwoc3RydWN0IGRybV9j b25uZWN0b3IgKmNvbm5lY3RvciwKPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBlbnVtIGRybV9wcml2YWN5X3NjcmVlbiB2YWwpCj4gPiA+ID4gK3sgfQo+ID4gPiA+ICsKPiA+ ID4gPiArZW51bSBkcm1fcHJpdmFjeV9zY3JlZW4gZHJtX3ByaXZhY3lfc2NyZWVuX2dldF92YWwo Cj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJt X2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ID4gPiA+ICt7Cj4gPiA+ID4gKyAgICAgcmV0dXJuIERS TV9QUklWQUNZX1NDUkVFTl9ESVNBQkxFRDsKPiA+ID4gPiArfQo+ID4gPiA+ICsjZW5kaWYgLyog Q09ORklHX0FDUEkgKi8KPiA+ID4gPiArCj4gPiA+ID4gKyNlbmRpZiAvKiBfX0RSTV9QUklWQUNZ X1NDUkVFTl9IX18gKi8KPiA+ID4gPiAtLQo+ID4gPiA+IDIuMjMuMC44NjYuZ2I4NjliOThkNGMt Z29vZwo+ID4gPiA+CgoKCi0tIApEYW5pZWwgVmV0dGVyClNvZnR3YXJlIEVuZ2luZWVyLCBJbnRl bCBDb3Jwb3JhdGlvbgorNDEgKDApIDc5IDM2NSA1NyA0OCAtIGh0dHA6Ly9ibG9nLmZmd2xsLmNo Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdm eCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xp c3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeA== 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=-11.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS 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 70976CA9EA0 for ; Fri, 25 Oct 2019 19:03:29 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 503AC21D7F for ; Fri, 25 Oct 2019 19:03:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 503AC21D7F Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ffwll.ch Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 732A06EB4B; Fri, 25 Oct 2019 19:03:27 +0000 (UTC) Received: from mail-pf1-x443.google.com (mail-pf1-x443.google.com [IPv6:2607:f8b0:4864:20::443]) by gabe.freedesktop.org (Postfix) with ESMTPS id 325DE6EB46 for ; Fri, 25 Oct 2019 19:03:26 +0000 (UTC) Received: by mail-pf1-x443.google.com with SMTP id c13so2192535pfp.5 for ; Fri, 25 Oct 2019 12:03:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=hj/i16Oz3ttbHOZu54m4vyC0cEmTPwImzjB+4h1naI8=; b=paIM03+6Y9x2Y5jFg5dSVzPzSx2GrkPbLariXBU/7HwysZulSF24Ub9JcGoQQnHBHc XcGFFCDRSS9gRZ664B06/DpZbH783du5llblIYXeB83HMfkb4cM1/crdSrSqAWEu+LDW lOT6mG8ktQogPMW7pbgfr1k63ozJiv65nshLOdGi8quq/C/1mYuVzokygjcPoZGC/Xun BChRAFNRFjmwweUGKFkJRx5EmKP57pho5LeiL40dxIVIj0ERPU+BzidyE7vybUI+MCmX RLmNIZCXhT6zz+b/0xMcowqEtaNbmekpIzt/xjdioYj0u6tiNl1w+YbBm37UuuJCA7Hf EU0g== X-Gm-Message-State: APjAAAXLu0h9PZR06WbJz/EJY183wy6JTWQBOHYQjfRpm9OJNtZShBQJ lRYqXd7HfxclSJ64/gg66wfo5PZ0NrrLlSnlExoDng== X-Google-Smtp-Source: APXvYqx1QntQpmmaG2tVUM7DRPf1xKWF3i+asEKdoEJbskpoGAJlHQLyADmx+TrZ6hEbYF8Oicsvx4ertzhB0zLyvhk= X-Received: by 2002:a63:2c53:: with SMTP id s80mr6038808pgs.377.1572030204942; Fri, 25 Oct 2019 12:03:24 -0700 (PDT) MIME-Version: 1.0 References: <20191023001206.15741-1-rajatja@google.com> <20191024112040.GE2825247@ulmo> <20191025113609.GB928835@ulmo> In-Reply-To: <20191025113609.GB928835@ulmo> From: Daniel Vetter Date: Fri, 25 Oct 2019 21:03:12 +0200 Message-ID: Subject: Re: [PATCH] drm: Add support for integrated privacy screens To: Thierry Reding X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=hj/i16Oz3ttbHOZu54m4vyC0cEmTPwImzjB+4h1naI8=; b=hFgQwJifeWrgblDTYKBTY3Y3mtkyucjAM9oiofrZTG4htQgonKBSjaAUmxr0sx0vdd CkwKKPDPs/vuyDhcLqQIxI95oYX3RvYuQlOGsEzy8L0Vx4jLADD6upn8HvNCKVMxxUH3 lhqj6AuYau3YBBNXWqgRveGMHWJkiv6v8COv0= X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Sean Paul , David Airlie , dri-devel , Rajat Jain , Daniel Thompson , Jonathan Corbet , Jesse Barnes , Rajat Jain , intel-gfx , Mat King , Rodrigo Vivi , =?UTF-8?Q?Jos=C3=A9_Roberto_de_Souza?= , Sean Paul , Duncan Laurie , Greg KH , Linux Kernel Mailing List , Pavel Machek Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Message-ID: <20191025190312.9OK5QEWDjpNOtig_CKnv0prRYyk-wXk929on_extV6I@z> T24gRnJpLCBPY3QgMjUsIDIwMTkgYXQgMTozNiBQTSBUaGllcnJ5IFJlZGluZyA8dGhpZXJyeS5y ZWRpbmdAZ21haWwuY29tPiB3cm90ZToKPgo+IE9uIFRodSwgT2N0IDI0LCAyMDE5IGF0IDAxOjQ1 OjE2UE0gLTA3MDAsIFJhamF0IEphaW4gd3JvdGU6Cj4gPiBIaSwKPiA+Cj4gPiBUaGFua3MgZm9y IHlvdXIgcmV2aWV3IGFuZCBjb21tZW50cy4gUGxlYXNlIHNlZSBpbmxpbmUgYmVsb3cuCj4gPgo+ ID4gT24gVGh1LCBPY3QgMjQsIDIwMTkgYXQgNDoyMCBBTSBUaGllcnJ5IFJlZGluZyA8dGhpZXJy eS5yZWRpbmdAZ21haWwuY29tPiB3cm90ZToKPiA+ID4KPiA+ID4gT24gVHVlLCBPY3QgMjIsIDIw MTkgYXQgMDU6MTI6MDZQTSAtMDcwMCwgUmFqYXQgSmFpbiB3cm90ZToKPiA+ID4gPiBDZXJ0YWlu IGxhcHRvcHMgbm93IGNvbWUgd2l0aCBwYW5lbHMgdGhhdCBoYXZlIGludGVncmF0ZWQgcHJpdmFj eQo+ID4gPiA+IHNjcmVlbnMgb24gdGhlbS4gVGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgZm9yIHN1 Y2ggcGFuZWxzIGJ5IGFkZGluZwo+ID4gPiA+IGEgcHJpdmFjeS1zY3JlZW4gcHJvcGVydHkgdG8g dGhlIGRybV9jb25uZWN0b3IgZm9yIHRoZSBwYW5lbCwgdGhhdAo+ID4gPiA+IHRoZSB1c2Vyc3Bh Y2UgY2FuIHRoZW4gdXNlIHRvIGNvbnRyb2wgYW5kIGNoZWNrIHRoZSBzdGF0dXMuIFRoZSBpZGVh Cj4gPiA+ID4gd2FzIGRpc2N1c3NlZCBoZXJlOgo+ID4gPiA+Cj4gPiA+ID4gaHR0cHM6Ly9sa21s Lm9yZy9sa21sLzIwMTkvMTAvMS83ODYKPiA+ID4gPgo+ID4gPiA+IEFDUEkgbWV0aG9kcyBhcmUg dXNlZCB0byBpZGVudGlmeSwgcXVlcnkgYW5kIGNvbnRyb2wgcHJpdmFjeSBzY3JlZW46Cj4gPiA+ ID4KPiA+ID4gPiAqIElkZW50aWZ5aW5nIGFuIEFDUEkgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8g dGhlIHBhbmVsOiBUaGUgcGF0Y2gKPiA+ID4gPiBmb2xsb3dzIEFDUEkgU3BlYyA2LjMgKGF2YWls YWJsZSBhdAo+ID4gPiA+IGh0dHBzOi8vdWVmaS5vcmcvc2l0ZXMvZGVmYXVsdC9maWxlcy9yZXNv dXJjZXMvQUNQSV82XzNfZmluYWxfSmFuMzAucGRmKS4KPiA+ID4gPiBQYWdlcyAxMTE5IC0gMTEy MyBkZXNjcmliZSB3aGF0IEkgYmVsaWV2ZSwgaXMgYSBzdGFuZGFyZCB3YXkgb2YKPiA+ID4gPiBp ZGVudGlmeWluZyAvIGFkZHJlc3NpbmcgImRpc3BsYXkgcGFuZWxzIiBpbiB0aGUgQUNQSSB0YWJs ZXMsIHRodXMKPiA+ID4gPiBhbGxvd2luZyBrZXJuZWwgdG8gYXR0YWNoIEFDUEkgbm9kZXMgdG8g dGhlIHBhbmVsLiBJTUhPLCB0aGlzIGFiaWxpdHkKPiA+ID4gPiB0byBpZGVudGlmeSBhbmQgYXR0 YWNoIEFDUEkgbm9kZXMgdG8gZHJtIGNvbm5lY3RvcnMgbWF5IGJlIHVzZWZ1bCBmb3IKPiA+ID4g PiByZWFzb25zIG90aGVyIHByaXZhY3ktc2NyZWVucywgaW4gZnV0dXJlLgo+ID4gPiA+Cj4gPiA+ ID4gKiBJZGVudGlmeWluZyB0aGUgcHJlc2VuY2Ugb2YgcHJpdmFjeSBzY3JlZW4sIGFuZCBjb250 cm9sbGluZyBpdCwgaXMgZG9uZQo+ID4gPiA+IHZpYSBBQ1BJIF9EU00gbWV0aG9kcy4KPiA+ID4g Pgo+ID4gPiA+IEN1cnJlbnRseSwgdGhpcyBpcyBkb25lIG9ubHkgZm9yIHRoZSBJbnRlbCBkaXNw bGF5IHBvcnRzLiBCdXQgaW4gZnV0dXJlLAo+ID4gPiA+IHRoaXMgY2FuIGJlIGRvbmUgZm9yIGFu eSBvdGhlciBwb3J0cyBpZiB0aGUgaGFyZHdhcmUgYmVjb21lcyBhdmFpbGFibGUKPiA+ID4gPiAo ZS5nLiBleHRlcm5hbCBtb25pdG9ycyBzdXBwb3J0aW5nIGludGVncmF0ZWQgcHJpdmFjeSBzY3Jl ZW5zPykuCj4gPiA+ID4KPiA+ID4gPiBBbHNvLCB0aGlzIGNvZGUgY2FuIGJlIGV4dGVuZGVkIGlu IGZ1dHVyZSB0byBzdXBwb3J0IG5vbi1BQ1BJIG1ldGhvZHMKPiA+ID4gPiAoZS5nLiB1c2luZyBh IGtlcm5lbCBHUElPIGRyaXZlciB0byB0b2dnbGUgYSBncGlvIHRoYXQgY29udHJvbHMgdGhlCj4g PiA+ID4gcHJpdmFjeS1zY3JlZW4pLgo+ID4gPiA+Cj4gPiA+ID4gU2lnbmVkLW9mZi1ieTogUmFq YXQgSmFpbiA8cmFqYXRqYUBnb29nbGUuY29tPgo+ID4gPiA+IC0tLQo+ID4gPiA+ICBkcml2ZXJz L2dwdS9kcm0vTWFrZWZpbGUgICAgICAgICAgICAgICAgfCAgIDEgKwo+ID4gPiA+ICBkcml2ZXJz L2dwdS9kcm0vZHJtX2F0b21pY191YXBpLmMgICAgICAgfCAgIDUgKwo+ID4gPiA+ICBkcml2ZXJz L2dwdS9kcm0vZHJtX2Nvbm5lY3Rvci5jICAgICAgICAgfCAgMzggKysrKysKPiA+ID4gPiAgZHJp dmVycy9ncHUvZHJtL2RybV9wcml2YWN5X3NjcmVlbi5jICAgIHwgMTc2ICsrKysrKysrKysrKysr KysrKysrKysrKwo+ID4gPiA+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2Rw LmMgfCAgIDMgKwo+ID4gPiA+ICBpbmNsdWRlL2RybS9kcm1fY29ubmVjdG9yLmggICAgICAgICAg ICAgfCAgMTggKysrCj4gPiA+ID4gIGluY2x1ZGUvZHJtL2RybV9tb2RlX2NvbmZpZy5oICAgICAg ICAgICB8ICAgNyArCj4gPiA+ID4gIGluY2x1ZGUvZHJtL2RybV9wcml2YWN5X3NjcmVlbi5oICAg ICAgICB8ICAzMyArKysrKwo+ID4gPiA+ICA4IGZpbGVzIGNoYW5nZWQsIDI4MSBpbnNlcnRpb25z KCspCj4gPiA+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vZHJtX3ByaXZh Y3lfc2NyZWVuLmMKPiA+ID4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvZHJtL2RybV9w cml2YWN5X3NjcmVlbi5oCj4gPiA+Cj4gPiA+IEkgbGlrZSB0aGlzIG11Y2ggYmV0dGVyIHRoYW4g dGhlIHByaW9yIHByb3Bvc2FsIHRvIHVzZSBzeXNmcy4gSG93ZXZlcgo+ID4gPiB0aGUgc3VwcG9y dCBjdXJyZW50bHkgbG9va3MgYSBiaXQgdGFuZ2xlZC4gSSByZWFsaXplIHRoYXQgd2Ugb25seSBo YXZlIGEKPiA+ID4gc2luZ2xlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIGluIGhhcmR3YXJlIHJp Z2h0IG5vdywgc28gdGhlcmUncyBubyB1c2UKPiA+ID4gaW4gb3Zlci1lbmdpbmVlcmluZyB0aGlu Z3MsIGJ1dCBJIHRoaW5rIHdlIGNhbiBkbyBhIGJldHRlciBqb2IgZnJvbSB0aGUKPiA+ID4gc3Rh cnQgd2l0aG91dCBnZXR0aW5nIGludG8gdG9vIG1hbnkgYWJzdHJhY3Rpb25zLiBTZWUgYmVsb3cu Cj4gPiA+Cj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZSBiL2Ry aXZlcnMvZ3B1L2RybS9NYWtlZmlsZQo+ID4gPiA+IGluZGV4IDgyZmY4MjZiMzNjYy4uZTFmYzMz ZDY5YmI3IDEwMDY0NAo+ID4gPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQo+ID4g PiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQo+ID4gPiA+IEBAIC0xOSw2ICsxOSw3 IEBAIGRybS15ICAgICAgIDo9ICAgICAgZHJtX2F1dGgubyBkcm1fY2FjaGUubyBcCj4gPiA+ID4g ICAgICAgICAgICAgICBkcm1fc3luY29iai5vIGRybV9sZWFzZS5vIGRybV93cml0ZWJhY2subyBk cm1fY2xpZW50Lm8gXAo+ID4gPiA+ICAgICAgICAgICAgICAgZHJtX2NsaWVudF9tb2Rlc2V0Lm8g ZHJtX2F0b21pY191YXBpLm8gZHJtX2hkY3Aubwo+ID4gPiA+Cj4gPiA+ID4gK2RybS0kKENPTkZJ R19BQ1BJKSArPSBkcm1fcHJpdmFjeV9zY3JlZW4ubwo+ID4gPiA+ICBkcm0tJChDT05GSUdfRFJN X0xFR0FDWSkgKz0gZHJtX2xlZ2FjeV9taXNjLm8gZHJtX2J1ZnMubyBkcm1fY29udGV4dC5vIGRy bV9kbWEubyBkcm1fc2NhdHRlci5vIGRybV9sb2NrLm8KPiA+ID4gPiAgZHJtLSQoQ09ORklHX0RS TV9MSUJfUkFORE9NKSArPSBsaWIvZHJtX3JhbmRvbS5vCj4gPiA+ID4gIGRybS0kKENPTkZJR19E Uk1fVk0pICs9IGRybV92bS5vCj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9k cm1fYXRvbWljX3VhcGkuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX3VhcGkuYwo+ID4g PiA+IGluZGV4IDdhMjZiZmI1MzI5Yy4uNDQxMzExNjVlNGVhIDEwMDY0NAo+ID4gPiA+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX3VhcGkuYwo+ID4gPiA+ICsrKyBiL2RyaXZlcnMv Z3B1L2RybS9kcm1fYXRvbWljX3VhcGkuYwo+ID4gPiA+IEBAIC0zMCw2ICszMCw3IEBACj4gPiA+ ID4gICNpbmNsdWRlIDxkcm0vZHJtX2F0b21pYy5oPgo+ID4gPiA+ICAjaW5jbHVkZSA8ZHJtL2Ry bV9wcmludC5oPgo+ID4gPiA+ICAjaW5jbHVkZSA8ZHJtL2RybV9kcnYuaD4KPiA+ID4gPiArI2lu Y2x1ZGUgPGRybS9kcm1fcHJpdmFjeV9zY3JlZW4uaD4KPiA+ID4gPiAgI2luY2x1ZGUgPGRybS9k cm1fd3JpdGViYWNrLmg+Cj4gPiA+ID4gICNpbmNsdWRlIDxkcm0vZHJtX3ZibGFuay5oPgo+ID4g PiA+Cj4gPiA+ID4gQEAgLTc2Niw2ICs3NjcsOCBAQCBzdGF0aWMgaW50IGRybV9hdG9taWNfY29u bmVjdG9yX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ID4g PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5j ZV9wdHIpOwo+ID4gPiA+ICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgPT0gY29ubmVjdG9yLT5t YXhfYnBjX3Byb3BlcnR5KSB7Cj4gPiA+ID4gICAgICAgICAgICAgICBzdGF0ZS0+bWF4X3JlcXVl c3RlZF9icGMgPSB2YWw7Cj4gPiA+ID4gKyAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25m aWctPnByaXZhY3lfc2NyZWVuX3Byb3BlcnR5KSB7Cj4gPiA+ID4gKyAgICAgICAgICAgICBkcm1f cHJpdmFjeV9zY3JlZW5fc2V0X3ZhbChjb25uZWN0b3IsIHZhbCk7Cj4gPiA+Cj4gPiA+IFRoaXMg ZG9lc24ndCBsb29rIHJpZ2h0LiBTaG91bGRuJ3QgeW91IHN0b3JlIHRoZSB2YWx1ZSBpbiB0aGUg Y29ubmVjdG9yCj4gPiA+IHN0YXRlIGFuZCB0aGVuIGxlYXZlIGl0IHVwIHRvIHRoZSBjb25uZWN0 b3IgZHJpdmVyIHRvIHNldCBpdAo+ID4gPiBhcHByb3ByaWF0ZWx5PyBJIHRoaW5rIHRoYXQgYWxz byBoYXMgdGhlIGFkdmFudGFnZSBvZiB1bnRhbmdsaW5nIHRoaXMKPiA+ID4gc3VwcG9ydCBhIGxp dHRsZS4KPiA+Cj4gPiBIb3BlZnVsbHkgdGhpcyBnZXRzIGFuc3dlcmVkIGluIG15IGV4cGxhbmF0 aW9ucyBiZWxvdy4KPiA+Cj4gPiA+Cj4gPiA+ID4gICAgICAgfSBlbHNlIGlmIChjb25uZWN0b3It PmZ1bmNzLT5hdG9taWNfc2V0X3Byb3BlcnR5KSB7Cj4gPiA+ID4gICAgICAgICAgICAgICByZXR1 cm4gY29ubmVjdG9yLT5mdW5jcy0+YXRvbWljX3NldF9wcm9wZXJ0eShjb25uZWN0b3IsCj4gPiA+ ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIHByb3BlcnR5LCB2YWwpOwo+ ID4gPiA+IEBAIC04NDIsNiArODQ1LDggQEAgZHJtX2F0b21pY19jb25uZWN0b3JfZ2V0X3Byb3Bl cnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4gPiA+ID4gICAgICAgICAgICAg ICAqdmFsID0gMDsKPiA+ID4gPiAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbm5lY3Rv ci0+bWF4X2JwY19wcm9wZXJ0eSkgewo+ID4gPiA+ICAgICAgICAgICAgICAgKnZhbCA9IHN0YXRl LT5tYXhfcmVxdWVzdGVkX2JwYzsKPiA+ID4gPiArICAgICB9IGVsc2UgaWYgKHByb3BlcnR5ID09 IGNvbmZpZy0+cHJpdmFjeV9zY3JlZW5fcHJvcGVydHkpIHsKPiA+ID4gPiArICAgICAgICAgICAg ICp2YWwgPSBkcm1fcHJpdmFjeV9zY3JlZW5fZ2V0X3ZhbChjb25uZWN0b3IpOwo+ID4gPgo+ID4g PiBTaW1pbGFybHksIEkgdGhpbmsgdGhpcyBjYW4ganVzdCByZXR1cm4gdGhlIGF0b21pYyBzdGF0 ZSdzIHZhbHVlIGZvcgo+ID4gPiB0aGlzLgo+ID4KPiA+IEkgZGlkIHRoaW5rIGFib3V0IGhhdmlu ZyBhIHN0YXRlIHZhcmlhYmxlIGluIHNvZnR3YXJlIHRvIGdldCBhbmQgc2V0Cj4gPiB0aGlzLiBI b3dldmVyLCBJIHRoaW5rIGl0IGlzIG5vdCB2ZXJ5IGZhciBmZXRjaGVkIHRoYXQgc29tZSBwbGF0 Zm9ybXMKPiA+IG1heSBoYXZlICJoYXJkd2FyZSBraWxsIiBzd2l0Y2hlcyB0aGF0IGFsbG93IGhh cmR3YXJlIHRvIHN3aXRjaAo+ID4gcHJpdmFjeS1zY3JlZW4gb24gYW5kIG9mZiBkaXJlY3RseSwg aW4gYWRkaXRpb24gdG8gdGhlIHNvZnR3YXJlCj4gPiBjb250cm9sIHRoYXQgd2UgYXJlIGltcGxl bWVudGluZy4gUHJpdmFjeSBpcyBhIHRvdWNoeSBzdWJqZWN0IGluCj4gPiBlbnRlcnByaXNlLCBh bmQgYW55dGhpbmcgdGhhdCByZWR1Y2VzIHRoZSBwb3NzaWJpbGl0eSBvZiBoYXZpbmcgYW55Cj4g PiBpbmNvbnNpc3RlbmN5IGJldHdlZW4gc29mdHdhcmUgc3RhdGUgYW5kIGhhcmR3YXJlIHN0YXRl IGlzIGRlc2lyYWJsZS4KPiA+IFNvIGluIHRoaXMgY2FzZSwgSSBjaG9zZSB0byBub3QgaGF2ZSBh IHN0YXRlIGluIHNvZnR3YXJlIGFib3V0IHRoaXMgLQo+ID4gd2UganVzdCByZXBvcnQgdGhlIGhh cmR3YXJlIHN0YXRlIGV2ZXJ5dGltZSB3ZSBhcmUgYXNrZWQgZm9yIGl0Lgo+Cj4gU28gdGhpcyBk b2Vzbid0IHJlYWxseSB3b3JrIHdpdGggYXRvbWljIEtNUywgdGhlbi4gVGhlIG1haW4gaWRlYSBi ZWhpbmQKPiBhdG9taWMgS01TIGlzIHRoYXQgeW91IGFwcGx5IGEgY29uZmlndXJhdGlvbiBlaXRo ZXIgY29tcGxldGVseSBvciBub3QgYXQKPiBhbGwuIFNvIGF0IGxlYXN0IGZvciBzZXR0aW5nIHRo aXMgcHJvcGVydHkgeW91J2QgaGF2ZSB0byBnbyB0aHJvdWdoIHRoZQo+IHN0YXRlIG9iamVjdC4K Pgo+IE5vdywgZm9yIHJlYWRpbmcgb3V0IHRoZSBwcm9wZXJ0eSB5b3UgbWlnaHQgYmUgYWJsZSB0 byBnZXQgYXdheSB3aXRoIHRoZQo+IGFib3ZlLiBJJ20gbm90IHN1cmUgaWYgdGhhdCdzIGVub3Vn aCB0byBrZWVwIHRoZSBzdGF0ZSB1cC10by1kYXRlLAo+IHRob3VnaC4gSXMgdGhlcmUgc29tZSB3 YXkgZm9yIGEga2lsbCBzd2l0Y2ggdG8gdHJpZ2dlciBhbiBpbnRlcnJ1cHQgb3IKPiBvdGhlciBl dmVudCBvZiBzb21lIHNvcnQgc28gdGhhdCB0aGUgc3RhdGUgY291bGQgYmUga2VwdCB1cC10by1k YXRlPwo+Cj4gRGFuaWVsIChvciBhbnlvbmUgZWxzZSksIGRvIHlvdSBrbm93IG9mIGFueSBwcmVj ZWRlbnQgZm9yIHN0YXRlIHRoYXQKPiBtaWdodCBnZXQgbW9kaWZpZWQgYmVoaW5kIHRoZSBhdG9t aWMgaGVscGVycycgYmFjaz8gU2VlbXMgdG8gbWUgbGlrZSB3ZQo+IG5lZWQgdG8gZmluZCBzb21l IHBvaW50IHdoZXJlIHdlIGNhbiBhY3R1YWxseSByZWFkIGJhY2sgdGhlIGN1cnJlbnQKPiAiaGFy ZHdhcmUgdmFsdWUiIG9mIHRoaXMgcHJpdmFjeSBzY3JlZW4gcHJvcGVydHkgYW5kIHN0b3JlIHRo YXQgYmFjawo+IGludG8gdGhlIHN0YXRlLgoKV2UgaGF2ZSBhdG9taWMgcHJvcGVydGllcyB0aGF0 IHRoZSBkcml2ZXIgYWxzbyB1cGRhdGVzLCBub3QganVzdCB1c2Vyc3BhY2U6Ci0gbGluayBzdGF0 dXMKLSBoZGNwIG1hY2hpbmVyeQoKQnV0IGJvdGggc3RpbGwgdXNlIHRoZSBzdGF0ZSBzdHJ1Y3R1 cmVzIGxpa2UgYW55dGhpbmcgZWxzZSwgYW5kIHRoZW4KdXBkYXRlIHRoYXQgc3RhdGUgc3RydWN0 dXJlIHRocm91Z2ggc29tZSB3b3JrZXIuCgpBbmQgeWVzIEkgdG90YWxseSBkaWRuJ3QgY2F0Y2gg dGhpcyBoZXJlLCB0aGlzIGJyZWFrcyBhdG9taWMsIGJhZGx5IDotKQoKPgo+ID4KPiA+ID4KPiA+ ID4gPiAgICAgICB9IGVsc2UgaWYgKGNvbm5lY3Rvci0+ZnVuY3MtPmF0b21pY19nZXRfcHJvcGVy dHkpIHsKPiA+ID4gPiAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0b3ItPmZ1bmNzLT5hdG9t aWNfZ2V0X3Byb3BlcnR5KGNvbm5lY3RvciwKPiA+ID4gPiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzdGF0ZSwgcHJvcGVydHksIHZhbCk7Cj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9kcm1fY29ubmVjdG9yLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2Nvbm5lY3Rv ci5jCj4gPiA+ID4gaW5kZXggNGM3NjY2MjRiMjBkLi5hMzFlMDM4MjEzMmIgMTAwNjQ0Cj4gPiA+ ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9jb25uZWN0b3IuYwo+ID4gPiA+ICsrKyBiL2Ry aXZlcnMvZ3B1L2RybS9kcm1fY29ubmVjdG9yLmMKPiA+ID4gPiBAQCAtODIxLDYgKzgyMSwxMSBA QCBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9wcm9wX2VudW1fbGlzdCBkcm1fcGFuZWxfb3JpZW50 YXRpb25fZW51bV9saXN0W10gPSB7Cj4gPiA+ID4gICAgICAgeyBEUk1fTU9ERV9QQU5FTF9PUklF TlRBVElPTl9SSUdIVF9VUCwgICJSaWdodCBTaWRlIFVwIiB9LAo+ID4gPiA+ICB9Owo+ID4gPiA+ Cj4gPiA+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX3Byb3BfZW51bV9saXN0IGRybV9wcml2 YWN5X3NjcmVlbl9lbnVtX2xpc3RbXSA9IHsKPiA+ID4gPiArICAgICB7IERSTV9QUklWQUNZX1ND UkVFTl9ESVNBQkxFRCwgIkRpc2FibGVkIiB9LAo+ID4gPiA+ICsgICAgIHsgRFJNX1BSSVZBQ1lf U0NSRUVOX0VOQUJMRUQsICJFbmFibGVkIiB9LAo+ID4gPiA+ICt9Owo+ID4gPiA+ICsKPiA+ID4g PiAgc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fcHJvcF9lbnVtX2xpc3QgZHJtX2R2aV9pX3NlbGVj dF9lbnVtX2xpc3RbXSA9IHsKPiA+ID4gPiAgICAgICB7IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9B dXRvbWF0aWMsICJBdXRvbWF0aWMiIH0sIC8qIERWSS1JIGFuZCBUVi1vdXQgKi8KPiA+ID4gPiAg ICAgICB7IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9EVklELCAgICAgICJEVkktRCIgICAgIH0sIC8q IERWSS1JICAqLwo+ID4gPiA+IEBAIC0yMjUzLDYgKzIyNTgsMzkgQEAgc3RhdGljIHZvaWQgZHJt X3RpbGVfZ3JvdXBfZnJlZShzdHJ1Y3Qga3JlZiAqa3JlZikKPiA+ID4gPiAgICAgICBrZnJlZSh0 Zyk7Cj4gPiA+ID4gIH0KPiA+ID4gPgo+ID4gPiA+ICsvKioKPiA+ID4gPiArICogZHJtX2Nvbm5l Y3Rvcl9pbml0X3ByaXZhY3lfc2NyZWVuX3Byb3BlcnR5IC0KPiA+ID4gPiArICogICBjcmVhdGUg YW5kIGF0dGFjaCB0aGUgY29ubmVjdGVyJ3MgcHJpdmFjeS1zY3JlZW4gcHJvcGVydHkuCj4gPiA+ ID4gKyAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciBmb3Igd2hpY2ggdG8gaW5pdCB0aGUgcHJpdmFj eS1zY3JlZW4gcHJvcGVydHkuCj4gPiA+ID4gKyAqCj4gPiA+ID4gKyAqIFRoaXMgZnVuY3Rpb24g Y3JlYXRlcyBhbmQgYXR0YWNoZXMgdGhlICJwcml2YWN5LXNjcmVlbiIgcHJvcGVydHkgdG8gdGhl Cj4gPiA+ID4gKyAqIGNvbm5lY3Rvci4gSW5pdGlhbCBzdGF0ZSBvZiBwcml2YWN5LXNjcmVlbiBp cyBzZXQgdG8gZGlzYWJsZWQuCj4gPiA+ID4gKyAqCj4gPiA+ID4gKyAqIFJldHVybnM6Cj4gPiA+ ID4gKyAqIFplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZS4KPiA+ID4g PiArICovCj4gPiA+ID4gK2ludCBkcm1fY29ubmVjdG9yX2luaXRfcHJpdmFjeV9zY3JlZW5fcHJv cGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiA+ID4gPiArewo+ID4gPiA+ ICsgICAgIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKPiA+ID4gPiAr ICAgICBzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcm9wOwo+ID4gPiA+ICsKPiA+ID4gPiArICAgICBw cm9wID0gZGV2LT5tb2RlX2NvbmZpZy5wcml2YWN5X3NjcmVlbl9wcm9wZXJ0eTsKPiA+ID4gPiAr ICAgICBpZiAoIXByb3ApIHsKPiA+ID4gPiArICAgICAgICAgICAgIHByb3AgPSBkcm1fcHJvcGVy dHlfY3JlYXRlX2VudW0oZGV2LCBEUk1fTU9ERV9QUk9QX0VOVU0sCj4gPiA+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgInByaXZhY3ktc2NyZWVuIiwgZHJtX3ByaXZhY3lfc2NyZWVu X2VudW1fbGlzdCwKPiA+ID4KPiA+ID4gU2VlbXMgdG8gbWUgbGlrZSB0aGUgLXNjcmVlbiBzdWZm aXggaGVyZSBpcyBzb21ld2hhdCByZWR1bmRhbnQuIFllcywgdGhlCj4gPiA+IHRoaW5nIHRoYXQg d2UgZW5hYmxlL2Rpc2FibGUgbWF5IGJlIGNhbGxlZCBhICJwcml2YWN5IHNjcmVlbiIsIGJ1dCB0 aGUKPiA+ID4gcHJvcGVydHkgdGhhdCB3ZSBlbmFibGUvZGlzYWJsZSBvbiB0aGUgY29ubmVjdG9y IGlzIHRoZSAicHJpdmFjeSIgb2YgdGhlCj4gPiA+IHVzZXIuIEknZCByZWZsZWN0IHRoYXQgaW4g YWxsIHRoZSByZWxhdGVkIHZhcmlhYmxlIG5hbWVzIGFuZCBzbyBvbiBhcwo+ID4gPiB3ZWxsLgo+ ID4KPiA+IElNSE8gYSBwcm9wZXJ0eSBjYWxsZWQgInByaXZhY3kiIG1heSBiZSBhIGxpdHRsZSBn ZW5lcmljIGZvciB0aGUgdXNlcnMKPiA+IHRvIHVuZGVyc3RhbmQgd2hhdCBpdCBpcy4gRm9yIGUu Zy4gd2hlbiBJIHN0YXJ0ZWQgbG9va2luZyBhdCBjb2RlLCBJCj4gPiBmb3VuZCB0aGUgIkNvbnRl bnQgUHJvdGVjdGlvbiIgcHJvcGVydHkgYW5kIEkgZ290IGNvbmZ1c2VkIHRoaW5raW5nCj4gPiBt YXkgYmUgaXQgcHJvdmlkZXMgc29tZXRoaW5nIHNpbWlsYXIgdG8gd2hhdCBJJ20gdHJ5aW5nIHRv IGRvLiBJIHRoaW5rCj4gPiAicHJpdmFjeS1zY3JlZW4iIGNvbnZleXMgdGhlIGNvbXBsZXRlIGNv bnRleHQgd2l0aG91dCBiZWluZyBsb25nLCBzbwo+ID4gdGhlcmUgaXMgbm8gY29uZnVzaW9uIG9y IGFtYmlndWl0eS4gQnV0IEkgZG9uJ3QgbWluZCBjaGFuZ2luZyBpdCBpZiBhCj4gPiBwcm9wZXJ0 eSAicHJpdmFjeSIgaXMgd2hhdCBwZW9wbGUgdGhpbmsgaXMgYmV0dGVyIHRvIGNvbnZleSB3aGF0 IGl0Cj4gPiBpcywgYXMgbG9uZyBhcyBpdCBpcyBjbGVhciB0byB1c2VyLgo+Cj4gVGhpcyBiZWlu ZyBhIHByb3BlcnR5IG9mIGEgZGlzcGxheSBjb25uZWN0b3IgaXQgZG9lc24ndCBzZWVtIHZlcnkK PiBhbWJpZ3VvdXMgdG8gbWUgd2hhdCB0aGlzIGlzLiBIb3cgdGhpcyBlbmRzIHVwIGJlaW5nIHBy ZXNlbnRlZCB0byB0aGUKPiB1c2VycyBpcyBtb3N0bHkgb3J0aG9nb25hbCBhbnl3YXkuIFdlJ3Zl IGdvdCBhIGJ1bmNoIG9mIHByb3BlcnRpZXMgd2hvc2UKPiBwdXJwb3NlIG1heSBub3QgYmUgY2xl YXIgdG8gdGhlIGF2ZXJhZ2UgdXNlci4gVGhlIHByb3BlcnRpZXMsIHdoaWxlIHRoZXkKPiBhcmUg VUFCSSwgZG9uJ3QgdHlwaWNhbGx5IGZhY2UgdGhlIHVzZXIgZGlyZWN0bHkuIFRoZXkncmUgc3Rp bGwgcGFydCBvZgo+IGFuIEFQSSwgc28gYXMgbG9uZyBhcyB0aGV5IGFyZSBwcm9wZXJseSBkb2N1 bWVudGVkIHRoZXJlIHNob3VsZG4ndCBiZQo+IGFueSBhbWJpZ3VpdGllcy4KClNvbWV0aW1lcyB3 ZSBnbyB0aGUgY2hlYXAgd2F5IHdpdGggY29ubmVjdG9yIHByb3BlcnRpZXMgYW5kIHNheSB0aGF0 CnRob3NlIHNob3VsZCBiZSBzZXQgYnkgdGhlIHVzZXIgZGlyZWN0bHksIHRocm91Z2ggc29tZXRo aW5nIGxpa2UKeHJhbmRyIChtb3N0bHkgZm9yIHN0dWZmIHRvIGhhY2sgYXJvdW5kIGJyb2tlbiBt b25pdG9ycykuIEJ1dCBvZmMKbmljZXIgaWYgdGhlIHByb3BlcnR5IGNvbWVzIHdpdGggc29tZSBw cm9wZXIgdXNlcnNwYWNlIGludGVncmF0aW9uLgoKPiA+ID4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBBUlJBWV9TSVpFKGRybV9wcml2YWN5X3NjcmVlbl9lbnVtX2xpc3QpKTsKPiA+ ID4gPiArICAgICAgICAgICAgIGlmICghcHJvcCkKPiA+ID4gPiArICAgICAgICAgICAgICAgICAg ICAgcmV0dXJuIC1FTk9NRU07Cj4gPiA+ID4gKwo+ID4gPiA+ICsgICAgICAgICAgICAgZGV2LT5t b2RlX2NvbmZpZy5wcml2YWN5X3NjcmVlbl9wcm9wZXJ0eSA9IHByb3A7Cj4gPiA+ID4gKyAgICAg fQo+ID4gPiA+ICsKPiA+ID4gPiArICAgICBkcm1fb2JqZWN0X2F0dGFjaF9wcm9wZXJ0eSgmY29u bmVjdG9yLT5iYXNlLCBwcm9wLAo+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIERSTV9QUklWQUNZX1NDUkVFTl9ESVNBQkxFRCk7Cj4gPiA+ID4gKyAgICAgcmV0dXJuIDA7 Cj4gPiA+ID4gK30KPiA+ID4gPiArRVhQT1JUX1NZTUJPTChkcm1fY29ubmVjdG9yX2luaXRfcHJp dmFjeV9zY3JlZW5fcHJvcGVydHkpOwo+ID4gPiA+ICsKPiA+ID4gPiAgLyoqCj4gPiA+ID4gICAq IGRybV9tb2RlX3B1dF90aWxlX2dyb3VwIC0gZHJvcCBhIHJlZmVyZW5jZSB0byBhIHRpbGUgZ3Jv dXAuCj4gPiA+ID4gICAqIEBkZXY6IERSTSBkZXZpY2UKPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL2RybV9wcml2YWN5X3NjcmVlbi5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9w cml2YWN5X3NjcmVlbi5jCj4gPiA+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+ID4gPiBpbmRl eCAwMDAwMDAwMDAwMDAuLjFkNjhlOGFhNmM1Zgo+ID4gPiA+IC0tLSAvZGV2L251bGwKPiA+ID4g PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3ByaXZhY3lfc2NyZWVuLmMKPiA+ID4gPiBAQCAt MCwwICsxLDE3NiBAQAo+ID4gPiA+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MC1vci1sYXRlcgo+ID4gPiA+ICsvKgo+ID4gPiA+ICsgKiBEUk0gcHJpdmFjeSBTY3JlZW4gY29k ZQo+ID4gPiA+ICsgKgo+ID4gPiA+ICsgKiBDb3B5cmlnaHQgwqkgMjAxOSBHb29nbGUgSW5jLgo+ ID4gPiA+ICsgKi8KPiA+ID4gPiArCj4gPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+Cj4g PiA+ID4gKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KPiA+ID4gPiArCj4gPiA+ID4gKyNpbmNsdWRl IDxkcm0vZHJtX2Nvbm5lY3Rvci5oPgo+ID4gPiA+ICsjaW5jbHVkZSA8ZHJtL2RybV9kZXZpY2Uu aD4KPiA+ID4gPiArI2luY2x1ZGUgPGRybS9kcm1fcHJpbnQuaD4KPiA+ID4gPiArCj4gPiA+ID4g KyNkZWZpbmUgRFJNX0NPTk5fRFNNX1JFVklEIDEKPiA+ID4gPiArCj4gPiA+ID4gKyNkZWZpbmUg RFJNX0NPTk5fRFNNX0ZOX1BSSVZBQ1lfR0VUX1NUQVRVUyAgIDEKPiA+ID4gPiArI2RlZmluZSBE Uk1fQ09OTl9EU01fRk5fUFJJVkFDWV9FTkFCTEUgICAgICAgICAgICAgICAyCj4gPiA+ID4gKyNk ZWZpbmUgRFJNX0NPTk5fRFNNX0ZOX1BSSVZBQ1lfRElTQUJMRSAgICAgICAgICAgICAgMwo+ID4g PiA+ICsKPiA+ID4gPiArc3RhdGljIGNvbnN0IGd1aWRfdCBkcm1fY29ubl9kc21fZ3VpZCA9Cj4g PiA+ID4gKyAgICAgR1VJRF9JTklUKDB4QzcwMzMxMTMsIDB4ODcyMCwgMHg0Q0VCLAo+ID4gPiA+ ICsgICAgICAgICAgICAgICAweDkwLCAweDkwLCAweDlELCAweDUyLCAweEIzLCAweEU1LCAweDJE LCAweDczKTsKPiA+ID4gPiArCj4gPiA+ID4gKy8qCj4gPiA+ID4gKyAqIE1ha2VzIF9EU00gY2Fs bCB0byBzZXQgcHJpdmFjeSBzY3JlZW4gc3RhdHVzIG9yIGdldCBwcml2YWN5IHNjcmVlbi4gUmV0 dXJuCj4gPiA+ID4gKyAqIHZhbHVlIG1hdHRlcnMgb25seSBmb3IgUFJJVkFDWV9HRVRfU1RBVFVT IGNhc2UuIFJldHVybnMgMCBpZiBkaXNhYmxlZCwgMSBpZgo+ID4gPiA+ICsgKiBlbmFibGVkLgo+ ID4gPiA+ICsgKi8KPiA+ID4gPiArc3RhdGljIGludCBhY3BpX3ByaXZhY3lfc2NyZWVuX2NhbGxf ZHNtKGFjcGlfaGFuZGxlIGNvbm5faGFuZGxlLCB1NjQgZnVuYykKPiA+ID4gPiArewo+ID4gPiA+ ICsgICAgIHVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7Cj4gPiA+ID4gKyAgICAgaW50IHJldCA9IDA7 Cj4gPiA+ID4gKwo+ID4gPiA+ICsgICAgIG9iaiA9IGFjcGlfZXZhbHVhdGVfZHNtKGNvbm5faGFu ZGxlLCAmZHJtX2Nvbm5fZHNtX2d1aWQsCj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgRFJNX0NPTk5fRFNNX1JFVklELCBmdW5jLCBOVUxMKTsKPiA+ID4gPiArICAgICBpZiAo IW9iaikgewo+ID4gPiA+ICsgICAgICAgICAgICAgRFJNX0RFQlVHX0RSSVZFUigiZmFpbGVkIHRv IGV2YWx1YXRlIF9EU00gZm9yIGZuICVsbHhcbiIsIGZ1bmMpOwo+ID4gPiA+ICsgICAgICAgICAg ICAgLyogQ2FuJ3QgZG8gbXVjaC4gRm9yIGdldF92YWwsIGFzc3VtZSBwcml2YWN5X3NjcmVlbiBk aXNhYmxlZCAqLwo+ID4gPiA+ICsgICAgICAgICAgICAgZ290byBkb25lOwo+ID4gPiA+ICsgICAg IH0KPiA+ID4gPiArCj4gPiA+ID4gKyAgICAgaWYgKGZ1bmMgPT0gRFJNX0NPTk5fRFNNX0ZOX1BS SVZBQ1lfR0VUX1NUQVRVUyAmJgo+ID4gPiA+ICsgICAgICAgICBvYmotPnR5cGUgPT0gQUNQSV9U WVBFX0lOVEVHRVIpCj4gPiA+ID4gKyAgICAgICAgICAgICByZXQgPSAhIW9iai0+aW50ZWdlci52 YWx1ZTsKPiA+ID4gPiArZG9uZToKPiA+ID4gPiArICAgICBBQ1BJX0ZSRUUob2JqKTsKPiA+ID4g PiArICAgICByZXR1cm4gcmV0Owo+ID4gPiA+ICt9Cj4gPiA+ID4gKwo+ID4gPiA+ICt2b2lkIGRy bV9wcml2YWN5X3NjcmVlbl9zZXRfdmFsKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3Is Cj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gZHJtX3ByaXZhY3lf c2NyZWVuIHZhbCkKPiA+ID4gPiArewo+ID4gPiA+ICsgICAgIGFjcGlfaGFuZGxlIGFjcGlfaGFu ZGxlID0gY29ubmVjdG9yLT5wcml2YWN5X3NjcmVlbl9oYW5kbGU7Cj4gPiA+ID4gKwo+ID4gPiA+ ICsgICAgIGlmICghYWNwaV9oYW5kbGUpCj4gPiA+ID4gKyAgICAgICAgICAgICByZXR1cm47Cj4g PiA+ID4gKwo+ID4gPiA+ICsgICAgIGlmICh2YWwgPT0gRFJNX1BSSVZBQ1lfU0NSRUVOX0RJU0FC TEVEKQo+ID4gPiA+ICsgICAgICAgICAgICAgYWNwaV9wcml2YWN5X3NjcmVlbl9jYWxsX2RzbShh Y3BpX2hhbmRsZSwKPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgRFJNX0NPTk5fRFNNX0ZOX1BSSVZBQ1lfRElTQUJMRSk7Cj4gPiA+ID4gKyAgICAgZWxz ZSBpZiAodmFsID09IERSTV9QUklWQUNZX1NDUkVFTl9FTkFCTEVEKQo+ID4gPiA+ICsgICAgICAg ICAgICAgYWNwaV9wcml2YWN5X3NjcmVlbl9jYWxsX2RzbShhY3BpX2hhbmRsZSwKPiA+ID4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJNX0NPTk5fRFNNX0ZO X1BSSVZBQ1lfRU5BQkxFKTsKPiA+ID4gPiArfQo+ID4gPiA+ICsKPiA+ID4gPiArZW51bSBkcm1f cHJpdmFjeV9zY3JlZW4gZHJtX3ByaXZhY3lfc2NyZWVuX2dldF92YWwoc3RydWN0IGRybV9jb25u ZWN0b3IKPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKmNvbm5lY3RvcikKPiA+ID4gPiArewo+ID4gPiA+ICsgICAgIGFjcGlfaGFuZGxlIGFj cGlfaGFuZGxlID0gY29ubmVjdG9yLT5wcml2YWN5X3NjcmVlbl9oYW5kbGU7Cj4gPiA+ID4gKwo+ ID4gPiA+ICsgICAgIGlmIChhY3BpX2hhbmRsZSAmJgo+ID4gPiA+ICsgICAgICAgICBhY3BpX3By aXZhY3lfc2NyZWVuX2NhbGxfZHNtKGFjcGlfaGFuZGxlLAo+ID4gPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIERSTV9DT05OX0RTTV9GTl9QUklWQUNZX0dFVF9TVEFU VVMpKQo+ID4gPiA+ICsgICAgICAgICAgICAgcmV0dXJuIERSTV9QUklWQUNZX1NDUkVFTl9FTkFC TEVEOwo+ID4gPiA+ICsKPiA+ID4gPiArICAgICByZXR1cm4gRFJNX1BSSVZBQ1lfU0NSRUVOX0RJ U0FCTEVEOwo+ID4gPiA+ICt9Cj4gPiA+ID4gKwo+ID4gPiA+ICsvKgo+ID4gPiA+ICsgKiBTZWUg QUNQSSBTcGVjIHY2LjMsIFRhYmxlIEItMiwgIkRpc3BsYXkgVHlwZSIgZm9yIGRldGFpbHMuCj4g PiA+ID4gKyAqIEluIHNob3J0LCB0aGVzZSBtYWNyb3MgZGVmaW5lIHRoZSBiYXNlIF9BRFIgdmFs dWVzIGZvciBBQ1BJIG5vZGVzCj4gPiA+ID4gKyAqLwo+ID4gPiA+ICsjZGVmaW5lIEFDUElfQkFT RV9BRFJfRk9SX09USEVSUyAgICAgKDBVTEwgPDwgOCkKPiA+ID4gPiArI2RlZmluZSBBQ1BJX0JB U0VfQURSX0ZPUl9WR0EgICAgICAgICAgICAgICAgKDFVTEwgPDwgOCkKPiA+ID4gPiArI2RlZmlu ZSBBQ1BJX0JBU0VfQURSX0ZPUl9UViAgICAgICAgICgyVUxMIDw8IDgpCj4gPiA+ID4gKyNkZWZp bmUgQUNQSV9CQVNFX0FEUl9GT1JfRVhUX01PTiAgICAoM1VMTCA8PCA4KQo+ID4gPiA+ICsjZGVm aW5lIEFDUElfQkFTRV9BRFJfRk9SX0lOVEVHUkFURUQgKDRVTEwgPDwgOCkKPiA+ID4gPiArCj4g PiA+ID4gKyNkZWZpbmUgQUNQSV9ERVZJQ0VfSURfU0NIRU1FICAgICAgICAgICAgICAgICgxVUxM IDw8IDMxKQo+ID4gPiA+ICsjZGVmaW5lIEFDUElfRklSTVdBUkVfQ0FOX0RFVEVDVCAgICAgKDFV TEwgPDwgMTYpCj4gPiA+ID4gKwo+ID4gPiA+ICsvKgo+ID4gPiA+ICsgKiBSZWY6IEFDUEkgU3Bl YyA2LjMKPiA+ID4gPiArICogaHR0cHM6Ly91ZWZpLm9yZy9zaXRlcy9kZWZhdWx0L2ZpbGVzL3Jl c291cmNlcy9BQ1BJXzZfM19maW5hbF9KYW4zMC5wZGYKPiA+ID4gPiArICogUGFnZXMgMTExOSAt IDExMjMgZGVzY3JpYmUsIHdoYXQgSSBiZWxpZXZlLCBhIHN0YW5kYXJkIHdheSBvZgo+ID4gPiA+ ICsgKiBpZGVudGlmeWluZyAvIGFkZHJlc3NpbmcgImRpc3BsYXkgcGFuZWxzIiBpbiB0aGUgQUNQ SS4gVGh1cyBpdCBwcm92aWRlcwo+ID4gPiA+ICsgKiBhIHdheSBmb3IgdGhlIEFDUEkgdG8gZGVm aW5lIGRldmljZXMgZm9yIHRoZSBkaXNwbGF5IHBhbmVscyBhdHRhY2hlZAo+ID4gPiA+ICsgKiB0 byB0aGUgc3lzdGVtLiBJdCB0aHVzIHByb3ZpZGVzIGEgd2F5IGZvciB0aGUgQklPUyB0byBleHBv cnQgYW55IHBhbmVsCj4gPiA+ID4gKyAqIHNwZWNpZmljIHByb3BlcnRpZXMgdG8gdGhlIHN5c3Rl bSB2aWEgQUNQSSAobGlrZSBkZXZpY2UgdHJlZXMpLgo+ID4gPiA+ICsgKgo+ID4gPiA+ICsgKiBU aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGxvb2tzIHVwIHRoZSBBQ1BJIG5vZGUgZm9yIGEgY29ubmVj dG9yIGFuZCBsaW5rcwo+ID4gPiA+ICsgKiB0byBpdC4gVGVjaG5pY2FsbHkgaXQgaXMgaW5kZXBl bmRlbnQgZnJvbSB0aGUgcHJpdmFjeV9zY3JlZW4gY29kZSwgYW5kCj4gPiA+ID4gKyAqIGlkZWFs bHkgbWF5IGJlIGNhbGxlZCBmb3IgYWxsIGNvbm5lY3RvcnMuIEl0IGlzIGdlbmVyYWxseSBhIGdv b2QgaWRlYSB0bwo+ID4gPiA+ICsgKiBiZSBhYmxlIHRvIGF0dGFjaCBhbiBBQ1BJIG5vZGUgdG8g ZGVzY3JpYmUgYW55dGhpbmcgaWYgbmVlZGVkLiAoVGhpcyBjYW4KPiA+ID4gPiArICogaGVscCBp biBmdXR1cmUgZm9yIG90aGVyIHBhbmVsIHNwZWNpZmljIGZlYXR1cmVzIG1heWJlKS4gSG93ZXZl ciwgaXQKPiA+ID4gPiArICogbmVlZHMgYSAicG9ydCBpbmRleCIgd2hpY2ggSSBiZWxpZXZlIGlz IHRoZSBpbmRleCB3aXRoaW4gYSBwYXJ0aWN1bGFyCj4gPiA+ID4gKyAqIHR5cGUgb2YgcG9ydCAo UmVmIHRvIHRoZSBwYWdlcyBvZiBzcGVjIG1lbnRpb25lZCBhYm92ZSkuIFRoaXMgcG9ydCBpbmRl eAo+ID4gPiA+ICsgKiB1bmZvcnR1bmF0ZWx5IGlzIG5vdCBhdmFpbGFibGUgaW4gRFJNIGNvZGUs IHNvIGN1cnJlbnRseSBpdHMgY2FsbCBpcwo+ID4gPiA+ICsgKiBvcmlnaW5hdGVkIGZyb20gaTkx NSBkcml2ZXIuCj4gPiA+ID4gKyAqLwo+ID4gPiA+ICtzdGF0aWMgaW50IGRybV9jb25uZWN0b3Jf YXR0YWNoX2FjcGlfbm9kZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ID4gPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBwb3J0X2luZGV4KQo+ ID4gPiA+ICt7Cj4gPiA+ID4gKyAgICAgc3RydWN0IGRldmljZSAqZGV2ID0gJmNvbm5lY3Rvci0+ ZGV2LT5wZGV2LT5kZXY7Cj4gPiA+ID4gKyAgICAgc3RydWN0IGFjcGlfZGV2aWNlICpjb25uX2Rl djsKPiA+ID4gPiArICAgICB1NjQgY29ubl9hZGRyOwo+ID4gPiA+ICsKPiA+ID4gPiArICAgICAv Kgo+ID4gPiA+ICsgICAgICAqIERldGVybWluZSB3aGF0IF9BRFIgdG8gbG9vayBmb3IsIGRlcGVu ZGluZyBvbiBkZXZpY2UgdHlwZSBhbmQKPiA+ID4gPiArICAgICAgKiBwb3J0IG51bWJlci4gUG90 ZW50aWFsbHkgd2Ugb25seSBjYXJlIGFib3V0IHRoZQo+ID4gPiA+ICsgICAgICAqIGVEUCAvIGlu dGVncmF0ZWQgZGlzcGxheXM/Cj4gPiA+ID4gKyAgICAgICovCj4gPiA+ID4gKyAgICAgc3dpdGNo IChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlKSB7Cj4gPiA+ID4gKyAgICAgY2FzZSBEUk1fTU9E RV9DT05ORUNUT1JfZURQOgo+ID4gPiA+ICsgICAgICAgICAgICAgY29ubl9hZGRyID0gQUNQSV9C QVNFX0FEUl9GT1JfSU5URUdSQVRFRCArIHBvcnRfaW5kZXg7Cj4gPiA+ID4gKyAgICAgICAgICAg ICBicmVhazsKPiA+ID4gPiArICAgICBjYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9WR0E6Cj4gPiA+ ID4gKyAgICAgICAgICAgICBjb25uX2FkZHIgPSBBQ1BJX0JBU0VfQURSX0ZPUl9WR0EgKyBwb3J0 X2luZGV4Owo+ID4gPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiA+ID4gKyAgICAgY2FzZSBE Uk1fTU9ERV9DT05ORUNUT1JfVFY6Cj4gPiA+ID4gKyAgICAgICAgICAgICBjb25uX2FkZHIgPSBB Q1BJX0JBU0VfQURSX0ZPUl9UViArIHBvcnRfaW5kZXg7Cj4gPiA+ID4gKyAgICAgICAgICAgICBi cmVhazsKPiA+ID4gPiArICAgICBjYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydDoK PiA+ID4gPiArICAgICAgICAgICAgIGNvbm5fYWRkciA9IEFDUElfQkFTRV9BRFJfRk9SX0VYVF9N T04gKyBwb3J0X2luZGV4Owo+ID4gPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiA+ID4gKyAg ICAgZGVmYXVsdDoKPiA+ID4gPiArICAgICAgICAgICAgIHJldHVybiAtRU5PVFNVUFA7Cj4gPiA+ ID4gKyAgICAgfQo+ID4gPiA+ICsKPiA+ID4gPiArICAgICBjb25uX2FkZHIgfD0gQUNQSV9ERVZJ Q0VfSURfU0NIRU1FOwo+ID4gPiA+ICsgICAgIGNvbm5fYWRkciB8PSBBQ1BJX0ZJUk1XQVJFX0NB Tl9ERVRFQ1Q7Cj4gPiA+ID4gKwo+ID4gPiA+ICsgICAgIERSTV9ERVZfREVCVUcoZGV2LCAiJXM6 IEZpbmRpbmcgZHJtX2Nvbm5lY3RvciBBQ1BJIG5vZGUgYXQgX0FEUj0lbGxYXG4iLAo+ID4gPiA+ ICsgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvbm5fYWRkcik7Cj4gPiA+ID4gKwo+ID4g PiA+ICsgICAgIC8qIExvb2sgdXAgdGhlIGNvbm5lY3RvciBkZXZpY2UsIHVuZGVyIHRoZSBQQ0kg ZGV2aWNlICovCj4gPiA+ID4gKyAgICAgY29ubl9kZXYgPSBhY3BpX2ZpbmRfY2hpbGRfZGV2aWNl KEFDUElfQ09NUEFOSU9OKGRldiksCj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGNvbm5fYWRkciwgZmFsc2UpOwo+ID4gPiA+ICsgICAgIGlmICghY29ubl9k ZXYpCj4gPiA+ID4gKyAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKPiA+ID4gPiArCj4gPiA+ ID4gKyAgICAgY29ubmVjdG9yLT5wcml2YWN5X3NjcmVlbl9oYW5kbGUgPSBjb25uX2Rldi0+aGFu ZGxlOwo+ID4gPiA+ICsgICAgIHJldHVybiAwOwo+ID4gPiA+ICt9Cj4gPiA+ID4gKwo+ID4gPiA+ ICtib29sIGRybV9wcml2YWN5X3NjcmVlbl9wcmVzZW50KHN0cnVjdCBkcm1fY29ubmVjdG9yICpj b25uZWN0b3IsIHU4IHBvcnRfaW5kZXgpCj4gPiA+Cj4gPiA+IFRoaXMgaXMgdGhlIG1haW4gcGFy dCB0aGF0IEkgdGhpbmsgaXMgYSBsaXR0bGUgdGFuZ2xlZC4gVGhpcyBpcyBhIHZlcnkKPiA+ID4g c3BlY2lmaWMgaW1wbGVtZW50YXRpb24gdGhhdCBoaWRlcyBpbiBhIGdlbmVyaWMgQVBJLgo+ID4K PiA+IEkgYWdyZWUgdGhhdCB0aGlzIGlzIGFuIEFDUEkgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24s IGJ1dCBvdGhlciB0aGFuCj4gPiB0aGF0LCBJIHRoaW5rIGl0IGRvZXMgbm90IGhhdmUgYW55IGRy aXZlciBzcGVjaWZpYyBkZXRhaWxzLiBNb3JlCj4gPiBkZXRhaWxlZCB0aG91Z2h0cyBvbiB0aGlz IGJlbG93Lgo+Cj4gV2VsbCwgdGhlIHBvcnRfaW5kZXgga2luZCBvZiB0aWVzIHRoaXMgdG8gaTkx NSBiZWNhdXNlIHRoYXQgdXNlcyB0aGlzCj4gY29uY2VwdC4gT3RoZXIgZHJpdmVycyBtYXkgbm90 Lgo+Cj4gQWxzbywgSSdtIHdvbmRlcmluZyBpZiB5b3UgY291bGRuJ3Qgc29tZWhvdyBkZXJpdmUg dGhlIHBvcnRfaW5kZXggZnJvbQo+IHRoZSBjb25uZWN0b3IuIElmIGFsbCB0aGlzIGRvZXMgaXMg dG8gZmluZCBhbiBBQ1BJIG5vZGUgY29ycmVzcG9uZGluZyB0bwo+IGEgY29ubmVjdG9yLCBzaG91 bGRuJ3QgdGhlIGNvbm5lY3RvciByZWFsbHkgYmUgYWxsIHRoYXQgeW91IG5lZWQ/CgpZZWFoIHBv cnQgc2hvdWxkIGJlIHN0b3JlZCBhbHJlYWR5IHBsZW50eSBvZiB0aW1lcyBpbiBpOTE1IGNvbm5l Y3RvciBzdHJ1Y3RzLgoKPiA+ID4gSSB3ZSBzdG9yZSB0aGUgcHJpdmFjeSBzZXR0aW5nIGluIHRo ZSBhdG9taWMgc3RhdGUsIHRoZXJlIGlzbid0IHJlYWxseSBhCj4gPiA+IHJlYXNvbiB0byBzdG9y ZSB0aGUgcHJpdmFjeSBoYW5kbGUgaW4gdGhlIGNvbm5lY3Rvci4gSW5zdGVhZCBpdCBjb3VsZCBi ZQo+ID4gPiBzaW1wbHkgc3RvcmVkIGluIHRoZSBkcml2ZXIgdGhhdCBzdXBwb3J0cyB0aGlzLgo+ ID4gPgo+ID4gPiBJZGVhbGx5IEkgdGhpbmsgd2UnZCBoYXZlIGEgdmVyeSBzbWFsbCBkcm1fcHJp dmFjeV9zY3JlZW4gb2JqZWN0IHR5cGUKPiA+ID4gdGhhdCB3b3VsZCBqdXN0IHdyYXAgdGhpcywg YnV0IHBlcmhhcHMgd2UgZG9uJ3QgbmVlZCB0aGF0IHJpZ2h0IGF3YXksCj4gPiA+IGdpdmVuIHRo YXQgd2Ugb25seSBoYXZlIGEgc2luZ2xlIGltcGxlbWVudGF0aW9uIHNvIGZhci4KPiA+Cj4gPiBZ ZXMsIGFncmVlZC4KPiA+Cj4gPiA+Cj4gPiA+IEhvd2V2ZXIsIEkgdGhpbmsgaWYgd2UganVzdCBw dXNoZWQgdGhpcyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBpbnRvIHRoZQo+ID4gPiBkcml2ZXJz IHRoYXQnZCBoZWxwIHBhdmUgdGhlIHdheSBmb3Igc29tZXRoaW5nIG1vcmUgZ2VuZXJpYyBsYXRl ciBvbgo+ID4gPiB3aXRob3V0IGEgbG90IG9mIGV4dHJhIHdvcmsgdXAgZnJvbnQuCj4gPiA+Cj4g PiA+IEZvciBleGFtcGxlIHlvdSBjb3VsZCB0dXJuIHRoZSBkcm1fY29ubmVjdG9yX2F0dGFjaF9h Y3BpX25vZGUoKSBpbnRvIGEKPiA+ID4gaGVscGVyIHRoYXQgc2ltcGx5IHJldHVybnMgdGhlIEFD UEkgaGFuZGxlLCBzb21ldGhpbmcgbGlrZSB0aGlzIHBlcmhhcHM6Cj4gPiA+Cj4gPiA+ICAgICAg ICAgc3RydWN0IGFjcGlfaGFuZGxlICpkcm1fYWNwaV9maW5kX3ByaXZhY3lfc2NyZWVuKHN0cnVj dCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwb3J0KQo+ID4g PiAgICAgICAgIHsKPiA+ID4gICAgICAgICAgICAgICAgIC4uLgo+ID4gPiAgICAgICAgIH0KPiA+ Cj4gPiBZZXMsIEkgbGlrZSB0aGF0IGlkZWEgb2YgbWFraW5nIGl0IGEgaGVscGVyIGZ1bmN0aW9u LiBJbiBmYWN0LCBmaW5kaW5nCj4gPiBhbiBBQ1BJIG5vZGUgZm9yIHRoZSBjb25uZWN0b3IgZG9l c24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIHdpdGgKPiA+IHByaXZhY3kgc2NyZWVuIChzbyBpdCBj YW4gYmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYWxzbywgaW4gZnV0dXJlKS4KPgo+IExvb2tz IGxpa2UgSSBtaXN1bmRlcnN0b29kIHRoZSBwdXJwb3NlIG9mIHRoYXQgZnVuY3Rpb24uIFlvdSBz dG9yZSB0aGUKPiBBQ1BJIGhhbmRsZSBhcyBjb25uZWN0b3ItPnByaXZhY3lfc2NyZWVuX2hhbmRs ZSwgc28gSSB3YXMgYXNzdW1pbmcgdGhhdAo+IGl0IHdhcyBnZXR0aW5nIGFuIEFDUEkgaGFuZGxl IGZvciBzb21lIHByaXZhY3kgc2NyZWVuIHN1YmRldmljZS4KPgo+ID4gPiBUaGF0IHRoZSBpOTE1 IGRyaXZlciB3b3VsZCB0aGVuIGNhbGwgYW5kIHN0b3JlIHRoZSByZXR1cm5lZCB2YWx1ZQo+ID4g PiBpbnRlcm5hbGx5LiBXaGVuIGl0IGNvbW1pdHMgdGhlIGF0b21pYyBzdGF0ZSBmb3IgdGhlIGNv bm5lY3RvciBpdCBjYW4KPiA+ID4gdGhlbiBjYWxsIHRoZSBkcm1fYWNwaV9zZXRfcHJpdmFjeSgp IChJIHRoaW5rIHRoYXQnZCBiZSBhIGJldHRlciBuYW1lCj4gPiA+IGZvciB5b3VyIGRybV9wcml2 YWN5X3NjcmVlbl9zZXRfdmFsKCkpIGJ5IHBhc3NpbmcgdGhhdCBoYW5kbGUgYW5kIHRoZQo+ID4g PiB2YWx1ZSBmcm9tIHRoZSBhdG9taWMgc3RhdGUuCj4gPiA+Cj4gPiA+IFRoZSBhYm92ZSBoYXMg dGhlIGFkdmFudGFnZSB0aGF0IHdlIGRvbid0IGNsdXR0ZXIgdGhlIGdlbmVyaWMgY29yZSB3aXRo Cj4gPiA+IHNvbWV0aGluZyB0aGF0J3Mgbm90IGF0IGFsbCBnZW5lcmljLiBJZiBldmVudHVhbGx5 IHdlIHNlZSB0aGF0IHRoZXNlCj4gPiA+IHR5cGVzIG9mIHByaXZhY3kgc2NyZWVucyBhcmUgaW1w bGVtZW50ZWQgaW4gbW9yZSBkZXZpY2Ugd2UgY2FuIGFsd2F5cwo+ID4gPiByZWZhY3RvciB0aGlz IGludG8gc29tZXRoaW5nIHJlYWxseSBnZW5lcmljIGFuZCBtYXliZSBldmVuIGRlY2lkZSB0byBw dXQKPiA+ID4gaXQgaW50byB0aGUgZHJtX2Nvbm5lY3RvciBkaXJlY3RseS4KPiA+Cj4gPiBUaGlz IGlzIHdoZXJlIEkgdGhpbmsgSSdtIGluIHNsaWdodCBkaXNhZ3JlZW1lbnQuIEkgdGhpbmsgdGhl Cj4gPiBmdW5jdGlvbmFsaXR5IHdlJ3JlIGFkZGluZyBpcyBzdGlsbCAiZ2VuZXJpYyIsIGp1c3Qg dGhhdCB0aGUgb25seQo+ID4gaGFyZHdhcmUgKkkgaGF2ZSB0b2RheSogdG8gdGVzdCBpcyB1c2lu ZyBJbnRlbCBlRFAgcG9ydHMuIEJ1dCBJIGRvbid0Cj4gPiBzZWUgd2h5IEFNRCBDUFUgbGFwdG9w cyBjYW4ndCBoYXZlIGl0IChGb3IgRS5nLiBIUCdzIEVsaXRlYm9vayA3NDUgRzUKPiA+IHNlZW1z IHRvIHVzZSBBTUQgYW5kIGhhcyBpbnRlZ3JhdGVkIHByaXZhY3kgc2NyZWVuIGZlYXR1cmUKPiA+ IGh0dHA6Ly93d3c4LmhwLmNvbS9oMjAxOTUvVjIvR2V0UERGLmFzcHgvNGFhNy0yODAyZWVlKSAu Cj4gPiBNeSB3b3JyeSBpcyB0aGF0IGlmIHdlIGRvbid0IG1ha2UgaXQgZ2VuZXJpYyB0b2RheSwg d2UgbWlnaHQgc2VlCj4gPiBkdXBsaWNhdGUgLyBzaW1pbGFyLWJ1dC1kaWZmZXJlbnQgLyBkaWZm ZXJlbnQgd2F5cyBvZiB0aGlzIGluIG90aGVyCj4gPiBwbGFjZXMgKGUuZy4gaHR0cHM6Ly9naXQu a2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdG9ydmFsZHMvbGludXguZ2l0L2Nv bW1pdC8/aWQ9MTEwZWExZDgzM2FkKQo+ID4gYmVjYXVzZSB1bmxlc3MgaXQgaXMgZ2VuZXJpYyB0 byBzdGFydCB3aXRoLCBpdCBpcyBkaWZmaWN1bHQgZm9yIHNvbWUKPiA+IG9uZSB0byBjaGFuZ2Ug bGF0ZXIgZm9yIHRoZSBmZWFyIG9mIGJyZWFraW5nIGhhcmR3YXJlIHRoYXQgaXMgYWxyZWFkeQo+ ID4gaW4gbWFya2V0IGdpdmVuIHRoYXQKPiA+ICAqIGhhcmR3YXJlIG1heSBub3QgYmUgYXZhaWxh YmxlIHRvIG5ldyBkZXZlbG9wZXIgdG8gdGVzdCBmb3IKPiA+IHJlZ3Jlc3Npb25zIChhbHNvIHRo ZXJlIGlzIHZlcnkgbGl0dGxlIG1vdGl2YXRpb24gdG8gY2hlY2sgYW55Cj4gPiBoYXJkd2FyZSBv dGhlciB0aGFuIHlvdXIgb3duKS4KPiA+ICAqIHNwZWNpYWxseSBmb3IgYSBjb2RlIHRoYXQgcmVs aWVzIG9uIGZpcm13YXJlIEFDUEkgKGZpcm13YXJlCj4gPiB1cGdyYWRlcyBpbiBmaWVsZCBhcmUg YWx3YXlzIGNvc3RseSkuCj4gPgo+ID4gTXkgdW5kZXJzdGFuZGluZyBpcyB0aGF0IHdlJ3JlIGFk ZGluZyAyIGZ1bmN0aW9uYWxpdGllcyBoZXJlOgo+ID4KPiA+IDEpIElkZW50aWZ5IGFuZCBBdHRh Y2ggQUNQSSBub2RlIHRvIERSTSBjb25uZWN0b3IuIFNpbmNlIHRoaXMgaXMKPiA+IGZvbGxvd2lu ZyBBQ1BJIHNwZWMsIEkgdGhpbmsgdGhpcyBpcyAgZ2VuZXJpYyBlbm91Z2guCj4KPiBJdCdzIHBy b2JhYmx5IHdvcnRoIG1ha2luZyB0aGlzIGEgc2VwYXJhdGUgcGF0Y2ggaW4gdGhhdCBjYXNlLiBJ ZiB0aGUKPiBBQ1BJIGhhbmRsZSByZWFsbHkgcmVwcmVzZW50cyB0aGUgY29ubmVjdG9yIGl0c2Vs ZiwgdGhlbiBpdCBzZWVtcyBmaW5lCj4gdG8gc3RvcmUgaXQgaW4gdGhlIGNvbm5lY3Rvci4gQnV0 IGl0IHNob3VsZG4ndCBiZSBjYWxsZWQgcHJpdmFjeV9zY3JlZW4KPiBpbiB0aGF0IGNhc2UuCgpQ cm9iYWJseSBzdGlsbCBzaG91bGQgYmUgaW4gaTkxNS4gV2UgaGF2ZSBhIGZldyBmaXJtd2FyZSBo YW5kbGUgdGhpbmdzCmluIHRoZXJlIGFscmVhZHkuIElmIG90aGVyIGRyaXZlcnMgbmVlZCB0aGlz LCB3ZSBjb3VsZCBtYWtlIGFuIGFjcGkKaGVscGVyIGxpYnJhcnkgdGhhdCBkcml2ZXJzIGNhbiBj YWxsIHRvIGZpbmQgdGhlIHJpZ2h0IGFjcGkgaGFuZGxlIGZvcgp0aGVpciBjb25uZWN0b3IuCgo+ ID4gMikgVXNlIEFDUEkgX0RTTSBtdGhvZHMgdG8gaWRlbnRpZnkgc2NyZWVuLCBzZXQgYW5kIGdl dCB2YWx1ZXMuIFRoaXMKPiA+IGlzIHdoZXJlIEkgdGhpbmsgd2UncmUgc2V0dGluZyAoZ2VuZXJp YykgZXhwZWN0YXRpb25zIGZvciB0aGUgQUNQSQo+ID4gbWV0aG9kcyBpbiBob3cgdGhleSBzaG91 bGQgYmVoYXZlIGlmIEFDUEkgaXMgdG8gYmUgdXNlZCB0byBjb250cm9sCj4gPiBwcml2YWN5IHNj cmVlbi4gSWYgd2UgcHV0IHRoaXMgaW4gZ2VuZXJpYyBjb2RlIHRvZGF5LCBmdXR1cmUKPiA+IGRl dmVsb3BlcnMgY2FuIGxvb2sgYXQgdGhpcyB0byB1bmRlcnN0YW5kIGhvdyB0aGVpciBBQ1BJIGZv ciBuZXcKPiA+IHBsYXRmb3JtcyBpcyB0byBiZWhhdmUgaWYgdGhleSB3YW50IHRvIHVzZSB0aGlz IGdlbmVyaWMgY29kZS4gSWYgd2UKPiA+IHB1dCBpdCBpbiBpOTE1IHNwZWNpZmljIGNvZGUsIHRo aXMgd2lsbCBiZSBzZWVuIGFzIGRyaXZlciBzcGVjaWZpYwo+ID4gYmVoYXZpb3IgYW5kIGRldmVs b3BlcnMgbWF5IGNob29zZSBzb21lIG90aGVyIGJlaGF2aW9yIGluIHRoZWlyCj4gPiBkcml2ZXIu Cj4KPiBJIHRoaW5rIGl0J3MgZmluZSB0byBwdXQgdGhpcyBmdW5jdGlvbmFsaXR5IGludG8gZ2Vu ZXJpYyBjb2RlLiBXaGF0IEkKPiBkb24ndCB0aGluayBpcyBnb29kIHRvIGRvIGlzIHRvIGhhdmUg dGhpcyBjb2RlIGNhbGxlZCBmcm9tIGdlbmVyaWMgY29kZS4KPiBJdCdzIG9wdC1pbiBmdW5jdGlv bmFsaXR5IHRoYXQgZHJpdmVycyBzaG91bGQgY2FsbCBpZiB0aGV5IGtub3cgdGhhdCB0aGUKPiBj b25uZWN0b3IgaGFzIGFuIGFzc29jaWF0ZWQgQUNQSSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCBm b3IgcHJpdmFjeQo+IHNjcmVlbiBjb250cm9sLgo+Cj4gQWZ0ZXIgcmVhZGluZyB0aGUgcGF0Y2gg YWdhaW4gYW5kIHJlYWxpemluZyB0aGF0IHlvdSdyZSBub3QgYWN0dWFsbHkKPiBkZWFsaW5nIHdp dGggYW4gQUNQSSBoYW5kbGUgdG8gdGhlIHByaXZhY3kgc2NyZWVuIGRpcmVjdGx5IGJ1dCBvbmUg Zm9yCj4gdGhlIGNvbm5lY3RvciwgSSB0aGluayB0aGlzIGlzIG9rYXkuIFlvdSBkbyBpbiBmYWN0 IGNhbGwgaW50byB0aGlzIGZyb20KPiB0aGUgaTkxNSBvbmx5LiBJIHN0aWxsIGRvbid0IHRoaW5r IHRoZSBuYW1pbmcgaXMgZ3JlYXQsIGFuZCBpdCdkIGJlIG5pY2UKPiB0byBzZWUgQUNQSSBhcyBw YXJ0IG9mIHRoZSBmdW5jdGlvbiBuYW1lIHRvIG1ha2UgdGhhdCBleHBsaWNpdC4gV2UgY291bGQK PiBhbHdheXMgYWRkcmVzcyB0aGF0IGF0IGEgbGF0ZXIgcG9pbnQsIGJ1dCBtYXkgYXMgd2VsbCBk byBpdCByaWdodCBmcm9tCj4gdGhlIHN0YXJ0Lgo+Cj4gPiBJIGFncmVlIHRoYXQgdGhlIGZ1bmN0 aW9uYWxpdHkgd2UncmUgYWRkaW5nIGlzIEFDUEkgc3BlY2lmaWMgKHRvZGF5IC0KPiA+IGJ1dCBj YW4gYmUgZXh0ZW5kZWQgdG8gZ3BpbyBpbiBmdXR1cmUgZm9yIG5vbiB4ODYgcGxhdGZvcm1zKSwg YnV0IG5vdAo+ID4gbmVjZXNzYXJpbHkgZHJpdmVyIHNwZWNpZmljLiBBY3R1YWxseSB0aGUgb25s eSByZWFzb24sIEkgaGFkIHRvIGNhbGwKPiA+IHRoZSBkcm1fcHJpdmFjeV9zY3JlZW5fcHJlc2Vu dCgpIChhbmQgdGhlCj4gPiBkcm1faW5pdF9wcml2YWN5X3NjcmVlbl9wcm9wZXJ0eSgpKSBmdW5j dGlvbiBmcm9tIGk5MTUgY29kZSBpcyBiZWNhdXNlCj4gPiB3ZSBuZWVkIGEgcG9ydF9pbmRleCB0 byBsb29rdXAgQUNQSSBub2RlLiBJZiB3ZSBoYWQgdGhhdCBhdmFpbGFibGUgaW4KPiA+IGRybSBj b2RlLCB3ZSB3b3VsZG4ndCBuZWVkIHRvIGNhbGwgYW55dGhpbmcgZnJvbSBpOTE1IGF0IGFsbC4K Pgo+IFlvdSdyZSBraW5kIG9mIHByb3ZpbmcgbXkgcG9pbnQgYWJvdXQgdGhpcyBBUEkgYmVpbmcg ZHJpdmVyLXNwZWNpZmljLCBvcgo+IGF0IGxlYXN0IEFDUEkgc3BlY2lmaWMuIE5vbi1BQ1BJIGRl dmljZXMgKG1heWJlIGV2ZW4gbm9uLWk5MTUgZGV2aWNlcz8pCj4gbWF5IG5vdCBoYXZlIGEgY29u Y2VwdCBvZiBhIHBvcnQgaW5kZXguIEVuY29kaW5nIHRoaXMgaW4gdGhlIEFQSSBtYWtlcwo+IHRo ZSBBUEkgbm9uLWdlbmVyaWMuCj4KPiBBcyBJIG1lbnRpb25lZCBhYm92ZSwgaWYgd2UgY291bGQg ZGVyaXZlIHRoZSBwb3J0IGluZGV4IGZyb20gdGhlCj4gY29ubmVjdG9yLCB0aGF0J2QgYmUgbXVj aCBiZXR0ZXIuIENvdWxkIHlvdSBwZXJoYXBzIHVzZSBkcm1fY29ubmVjdG9yJ3MKPiBpbmRleCBm aWVsZD8KPgo+IFVubGVzcyB0aGVyZSdzIGEgd2F5IHRvIHJlbGlhYmx5IGRldGVjdCB0aGlzIHR5 cGUgb2YgZnVuY3Rpb25hbGl0eSBmcm9tCj4gZ2VuZXJpYyBjb2RlLCBJIHRoaW5rIGl0IHNob3Vs ZCBhbHdheXMgYmUgY2FsbGVkIGZyb20gdGhlIGRyaXZlci4KCk1heWJlIHRpbWUgdG8gcGl0Y2gg dGhlIG9sZCBjbGFzc2ljIGFnYWluOgoKaHR0cHM6Ly9ibG9nLmZmd2xsLmNoLzIwMTYvMTIvbWlk bGF5ZXJzLW9uY2UtbW9yZS13aXRoLWZlZWxpbmcuaHRtbAoKRXNwZWNpYWxseSBhbGwgdGhlIGxp bmtzIGluIHRoZSBmaXJzdCBwYXJ0LgoKPiA+IFNvLCBmb3IgdGhlIHJlYXNvbnMgc3RhdGVkIGFi b3ZlLCBJTUhPIGl0IGlzIGJldHRlciB0byByZXRhaW4gdGhpcwo+ID4gZnVuY3Rpb25hbGl0eSBp biBkcm0gY29kZSBpbnN0ZWFkIG9mIGk5MTUgZHJpdmVyLiBCdXQgSSdtIG5ldyB0byB0aGUKPiA+ IGRybSAvIGk5MTUgY29kZSwgYW5kIHdvdWxkIGJlIGhhcHB5IHRvIGNoYW5nZSBteSBjb2RlIGlm IHBlb3BsZSBoYXZlCj4gPiBzdHJvbmcgb3BpbmlvbnMgYWJvdXQgdGhpcy4gTGV0IG1lIGtub3cu Cj4KPiBNYXliZSBJIHdhcyBiZWluZyB1bmNsZWFyLiBJIHdhc24ndCBhcmd1aW5nIHRoYXQgYWxs IHRoZSBjb2RlIHNob3VsZCBiZQo+IG1vdmVkIGludG8gdGhlIGk5MTUgZHJpdmVyLiBBbGwgSSB3 YXMgc2F5aW5nIHRoYXQgaW5zdGVhZCBvZiBzdG9yaW5nIHRoZQo+IEFDUEkgaGFuZGxlIGluc2lk ZSBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvciwgd2Ugc2hvdWxkIG1heWJlIHN0b3JlIGl0IGluc2lkZQo+ IHRoZSBpOTE1IGRyaXZlcidzIGNvbm5lY3RvciBzdHJ1Y3R1cmUuIHN0cnVjdCBkcm1fY29ubmVj dG9yIGlzIGEgdmVyeQo+IGdlbmVyaWMgY29uY2VwdCBhbmQgZWFjaCBhbmQgZXZlcnkgY29ubmVj dG9yIG9iamVjdCBvbiBldmVyeSBwbGF0Zm9ybQo+IHdpbGwgZ2V0IHRoYXQgQUNQSSBoYW5kbGUg cG9pbnRlciBpZiB5b3UgYWRkIGl0IHRoZXJlLiBJIGRvbid0IHRoaW5rIGFuCj4gQUNQSSBoYW5k bGUgYmVsb25ncyB0aGVyZS4gRm9yIGV4YW1wbGUsIG9uIEFSTSBTb0NzIGl0J3MgY29tbW9uIHRv IGhhdmUKPiBjb25uZWN0b3JzIGJlIGJhY2tlZCBieSBhIHN0cnVjdCBkZXZpY2UgKG9yIHN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgbW9yZQo+IHNwZWNpZmljYWxseSkuIEJ1dCB3ZSBkb24ndCBwdXQg dGhhdCBpbmZvcm1hdGlvbiBpbnRvIGRybV9jb25uZWN0b3IKPiBiZWNhdXNlIFBDSSBncmFwaGlj cyBhZGFwdGVycyBkb24ndCBoYXZlIGEgc3RydWN0IGRldmljZSB0aGF0IHJlcHJlc2VudHMKPiB0 aGUgY29ubmVjdG9yLgoKKzEgb24gYWxsIHRoZSBzdHVmZiBUaGllcnJ5IHNheXMgaGVyZSBlc3Nl bnRpYWxseS4KCkNoZWVycywgRGFuaWVsCgo+Cj4gVGhpZXJyeQo+Cj4gPgo+ID4gVGhhbmtzICYg QmVzdCBSZWdhcmRzLAo+ID4KPiA+IFJhamF0Cj4gPgo+ID4gPgo+ID4gPiA+ICt7Cj4gPiA+ID4g KyAgICAgYWNwaV9oYW5kbGUgaGFuZGxlOwo+ID4gPiA+ICsKPiA+ID4gPiArICAgICBpZiAoZHJt X2Nvbm5lY3Rvcl9hdHRhY2hfYWNwaV9ub2RlKGNvbm5lY3RvciwgcG9ydF9pbmRleCkpCj4gPiA+ ID4gKyAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4gPiA+ID4gKwo+ID4gPiA+ICsgICAgIGhh bmRsZSA9IGNvbm5lY3Rvci0+cHJpdmFjeV9zY3JlZW5faGFuZGxlOwo+ID4gPiA+ICsgICAgIGlm ICghYWNwaV9jaGVja19kc20oaGFuZGxlLCAmZHJtX2Nvbm5fZHNtX2d1aWQsCj4gPiA+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICBEUk1fQ09OTl9EU01fUkVWSUQsCj4gPiA+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAxIDw8IERSTV9DT05OX0RTTV9GTl9QUklWQUNZX0dFVF9TVEFU VVMgfAo+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgMSA8PCBEUk1fQ09OTl9EU01f Rk5fUFJJVkFDWV9FTkFCTEUgfAo+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgMSA8 PCBEUk1fQ09OTl9EU01fRk5fUFJJVkFDWV9ESVNBQkxFKSkgewo+ID4gPiA+ICsgICAgICAgICAg ICAgRFJNX1dBUk4oIiVzOiBPZGQsIGNvbm5lY3RvciBBQ1BJIG5vZGUgYnV0IG5vIHByaXZhY3kg c2Nybj9cbiIsCj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3ItPmRldi0+ ZGV2KTsKPiA+ID4gPiArICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKPiA+ID4gPiArICAgICB9 Cj4gPiA+ID4gKyAgICAgRFJNX0RFVl9JTkZPKGNvbm5lY3Rvci0+ZGV2LT5kZXYsICJzdXBwb3J0 cyBwcml2YWN5IHNjcmVlblxuIik7Cj4gPiA+ID4gKyAgICAgcmV0dXJuIHRydWU7Cj4gPiA+ID4g K30KPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRl bF9kcC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kcC5jCj4gPiA+ID4g aW5kZXggNTdlOWYwYmEzMzFiLi4zZmYzOTYyZDI3ZGIgMTAwNjQ0Cj4gPiA+ID4gLS0tIGEvZHJp dmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kcC5jCj4gPiA+ID4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kcC5jCj4gPiA+ID4gQEAgLTM5LDYgKzM5LDcg QEAKPiA+ID4gPiAgI2luY2x1ZGUgPGRybS9kcm1fZHBfaGVscGVyLmg+Cj4gPiA+ID4gICNpbmNs dWRlIDxkcm0vZHJtX2VkaWQuaD4KPiA+ID4gPiAgI2luY2x1ZGUgPGRybS9kcm1faGRjcC5oPgo+ ID4gPiA+ICsjaW5jbHVkZSA8ZHJtL2RybV9wcml2YWN5X3NjcmVlbi5oPgo+ID4gPiA+ICAjaW5j bHVkZSA8ZHJtL2RybV9wcm9iZV9oZWxwZXIuaD4KPiA+ID4gPiAgI2luY2x1ZGUgPGRybS9pOTE1 X2RybS5oPgo+ID4gPiA+Cj4gPiA+ID4gQEAgLTYzNTQsNiArNjM1NSw4IEBAIGludGVsX2RwX2Fk ZF9wcm9wZXJ0aWVzKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAsIHN0cnVjdCBkcm1fY29ubmVj dG9yICpjb25uZWN0Cj4gPiA+ID4KPiA+ID4gPiAgICAgICAgICAgICAgIGNvbm5lY3Rvci0+c3Rh dGUtPnNjYWxpbmdfbW9kZSA9IERSTV9NT0RFX1NDQUxFX0FTUEVDVDsKPiA+ID4gPgo+ID4gPiA+ ICsgICAgICAgICAgICAgaWYgKGRybV9wcml2YWN5X3NjcmVlbl9wcmVzZW50KGNvbm5lY3Rvciwg cG9ydCAtIFBPUlRfQSkpCj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIGRybV9jb25uZWN0 b3JfaW5pdF9wcml2YWN5X3NjcmVlbl9wcm9wZXJ0eShjb25uZWN0b3IpOwo+ID4gPiA+ICAgICAg IH0KPiA+ID4gPiAgfQo+ID4gPiA+Cj4gPiA+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2Ry bV9jb25uZWN0b3IuaCBiL2luY2x1ZGUvZHJtL2RybV9jb25uZWN0b3IuaAo+ID4gPiA+IGluZGV4 IDY4MWNiNTkwZjk1Mi4uNjNiODMxOGJkNjhjIDEwMDY0NAo+ID4gPiA+IC0tLSBhL2luY2x1ZGUv ZHJtL2RybV9jb25uZWN0b3IuaAo+ID4gPiA+ICsrKyBiL2luY2x1ZGUvZHJtL2RybV9jb25uZWN0 b3IuaAo+ID4gPiA+IEBAIC0yMjUsNiArMjI1LDIwIEBAIGVudW0gZHJtX2xpbmtfc3RhdHVzIHsK PiA+ID4gPiAgICAgICBEUk1fTElOS19TVEFUVVNfQkFEID0gRFJNX01PREVfTElOS19TVEFUVVNf QkFELAo+ID4gPiA+ICB9Owo+ID4gPiA+Cj4gPiA+ID4gKy8qKgo+ID4gPiA+ICsgKiBlbnVtIGRy bV9wcml2YWN5X3NjcmVlbiAtIHByaXZhY3lfc2NyZWVuIHN0YXR1cwo+ID4gPiA+ICsgKgo+ID4g PiA+ICsgKiBUaGlzIGVudW0gaXMgdXNlZCB0byB0cmFjayBhbmQgY29udHJvbCB0aGUgc3RhdGUg b2YgdGhlIHByaXZhY3kgc2NyZWVuLgo+ID4gPiA+ICsgKiBUaGVyZSBhcmUgbm8gc2VwYXJhdGUg I2RlZmluZXMgZm9yIHRoZSB1YXBpIQo+ID4gPiA+ICsgKgo+ID4gPiA+ICsgKiBARFJNX1BSSVZB Q1lfU0NSRUVOX0RJU0FCTEVEOiBUaGUgcHJpdmFjeS1zY3JlZW4gb24gdGhlIHBhbmVsIGlzIGRp c2FibGVkCj4gPiA+ID4gKyAqIEBEUk1fUFJJVkFDWV9TQ1JFRU5fRU5BQkxFRDogIFRoZSBwcml2 YWN5LXNjcmVlbiBvbiB0aGUgcGFuZWwgaXMgZW5hYmxlZAo+ID4gPiA+ICsgKi8KPiA+ID4gPiAr ZW51bSBkcm1fcHJpdmFjeV9zY3JlZW4gewo+ID4gPiA+ICsgICAgIERSTV9QUklWQUNZX1NDUkVF Tl9ESVNBQkxFRCA9IDAsCj4gPiA+ID4gKyAgICAgRFJNX1BSSVZBQ1lfU0NSRUVOX0VOQUJMRUQg PSAxLAo+ID4gPiA+ICt9Owo+ID4gPiA+ICsKPiA+ID4KPiA+ID4gU2hvdWxkbid0IHRoaXMgZ28g aW50byBpbmNsdWRlL3VhcGkvZHJtL2RybV9tb2RlLmg/IFRoYXQgd291bGQgaGF2ZSB0aGUKPiA+ ID4gYWR2YW50YWdlIG9mIGdpdmluZyB1c2Vyc3BhY2Ugc3ltYm9saWMgbmFtZXMgdG8gdXNlIHdo ZW4gc2V0dGluZyB0aGUKPiA+ID4gcHJvcGVydHkuCj4gPiA+Cj4gPiA+IE1heWJlIGFsc28gcmVu YW1lIHRoZXNlIHRvIHNvbWV0aGluZyBsaWtlOgo+ID4gPgo+ID4gPiAgICAgICAgICNkZWZpbmUg RFJNX01PREVfUFJJVkFDWV9ESVNBQkxFRCAwCj4gPiA+ICAgICAgICAgI2RlZmluZSBEUk1fTU9E RV9QUklWQUNZX0VOQUJMRUQgMQo+ID4gPgo+ID4gPiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhl ciBwcm9wZXJ0aWVzLgo+ID4gPgo+ID4gPiBUaGllcnJ5Cj4gPiA+Cj4gPiA+ID4gIC8qKgo+ID4g PiA+ICAgKiBlbnVtIGRybV9wYW5lbF9vcmllbnRhdGlvbiAtIHBhbmVsX29yaWVudGF0aW9uIGlu Zm8gZm9yICZkcm1fZGlzcGxheV9pbmZvCj4gPiA+ID4gICAqCj4gPiA+ID4gQEAgLTE0MTAsNiAr MTQyNCw5IEBAIHN0cnVjdCBkcm1fY29ubmVjdG9yIHsKPiA+ID4gPgo+ID4gPiA+ICAgICAgIC8q KiBAaGRyX3NpbmtfbWV0YWRhdGE6IEhEUiBNZXRhZGF0YSBJbmZvcm1hdGlvbiByZWFkIGZyb20g c2luayAqLwo+ID4gPiA+ICAgICAgIHN0cnVjdCBoZHJfc2lua19tZXRhZGF0YSBoZHJfc2lua19t ZXRhZGF0YTsKPiA+ID4gPiArCj4gPiA+ID4gKyAgICAgLyogSGFuZGxlIHVzZWQgYnkgcHJpdmFj eSBzY3JlZW4gY29kZSAqLwo+ID4gPiA+ICsgICAgIHZvaWQgKnByaXZhY3lfc2NyZWVuX2hhbmRs ZTsKPiA+ID4gPiAgfTsKPiA+ID4gPgo+ID4gPiA+ICAjZGVmaW5lIG9ial90b19jb25uZWN0b3Io eCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBkcm1fY29ubmVjdG9yLCBiYXNlKQo+ID4gPiA+IEBA IC0xNTQzLDYgKzE1NjAsNyBAQCBpbnQgZHJtX2Nvbm5lY3Rvcl9pbml0X3BhbmVsX29yaWVudGF0 aW9uX3Byb3BlcnR5KAo+ID4gPiA+ICAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0 b3IsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Cj4gPiA+ID4gIGludCBkcm1fY29ubmVjdG9yX2F0 dGFjaF9tYXhfYnBjX3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4g PiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW4sIGlu dCBtYXgpOwo+ID4gPiA+ICtpbnQgZHJtX2Nvbm5lY3Rvcl9pbml0X3ByaXZhY3lfc2NyZWVuX3By b3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwo+ID4gPiA+Cj4gPiA+ID4g IC8qKgo+ID4gPiA+ICAgKiBzdHJ1Y3QgZHJtX3RpbGVfZ3JvdXAgLSBUaWxlIGdyb3VwIG1ldGFk YXRhCj4gPiA+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9tb2RlX2NvbmZpZy5oIGIv aW5jbHVkZS9kcm0vZHJtX21vZGVfY29uZmlnLmgKPiA+ID4gPiBpbmRleCAzYmNiZTMwMzM5ZjAu LjZkNWQyM2RhOTBkNCAxMDA2NDQKPiA+ID4gPiAtLS0gYS9pbmNsdWRlL2RybS9kcm1fbW9kZV9j b25maWcuaAo+ID4gPiA+ICsrKyBiL2luY2x1ZGUvZHJtL2RybV9tb2RlX2NvbmZpZy5oCj4gPiA+ ID4gQEAgLTgxMyw2ICs4MTMsMTMgQEAgc3RydWN0IGRybV9tb2RlX2NvbmZpZyB7Cj4gPiA+ID4g ICAgICAgICovCj4gPiA+ID4gICAgICAgc3RydWN0IGRybV9wcm9wZXJ0eSAqcGFuZWxfb3JpZW50 YXRpb25fcHJvcGVydHk7Cj4gPiA+ID4KPiA+ID4gPiArICAgICAvKioKPiA+ID4gPiArICAgICAg KiBAcHJpdmFjeV9zY3JlZW5fcHJvcGVydHk6IE9wdGlvbmFsIGNvbm5lY3RvciBwcm9wZXJ0eSB0 byBpbmRpY2F0ZQo+ID4gPiA+ICsgICAgICAqIGFuZCBjb250cm9sIHRoZSBzdGF0ZSAoZW5hYmxl ZCAvIGRpc2FibGVkKSBvZiBwcml2YWN5LXNjcmVlbiBvbiB0aGUKPiA+ID4gPiArICAgICAgKiBw YW5lbCwgaWYgcHJlc2VudC4KPiA+ID4gPiArICAgICAgKi8KPiA+ID4gPiArICAgICBzdHJ1Y3Qg ZHJtX3Byb3BlcnR5ICpwcml2YWN5X3NjcmVlbl9wcm9wZXJ0eTsKPiA+ID4gPiArCj4gPiA+ID4g ICAgICAgLyoqCj4gPiA+ID4gICAgICAgICogQHdyaXRlYmFja19mYl9pZF9wcm9wZXJ0eTogUHJv cGVydHkgZm9yIHdyaXRlYmFjayBjb25uZWN0b3JzLCBzdG9yaW5nCj4gPiA+ID4gICAgICAgICog dGhlIElEIG9mIHRoZSBvdXRwdXQgZnJhbWVidWZmZXIuCj4gPiA+ID4gZGlmZiAtLWdpdCBhL2lu Y2x1ZGUvZHJtL2RybV9wcml2YWN5X3NjcmVlbi5oIGIvaW5jbHVkZS9kcm0vZHJtX3ByaXZhY3lf c2NyZWVuLmgKPiA+ID4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gPiA+IGluZGV4IDAwMDAw MDAwMDAwMC4uYzU4OWJiYzQ3NjU2Cj4gPiA+ID4gLS0tIC9kZXYvbnVsbAo+ID4gPiA+ICsrKyBi L2luY2x1ZGUvZHJtL2RybV9wcml2YWN5X3NjcmVlbi5oCj4gPiA+ID4gQEAgLTAsMCArMSwzMyBA QAo+ID4gPiA+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlciAq Lwo+ID4gPiA+ICsvKgo+ID4gPiA+ICsgKiBDb3B5cmlnaHQgwqkgMjAxOSBHb29nbGUgSW5jLgo+ ID4gPiA+ICsgKi8KPiA+ID4gPiArCj4gPiA+ID4gKyNpZm5kZWYgX19EUk1fUFJJVkFDWV9TQ1JF RU5fSF9fCj4gPiA+ID4gKyNkZWZpbmUgX19EUk1fUFJJVkFDWV9TQ1JFRU5fSF9fCj4gPiA+ID4g Kwo+ID4gPiA+ICsjaWZkZWYgQ09ORklHX0FDUEkKPiA+ID4gPiArYm9vbCBkcm1fcHJpdmFjeV9z Y3JlZW5fcHJlc2VudChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCB1OCBwb3J0KTsK PiA+ID4gPiArdm9pZCBkcm1fcHJpdmFjeV9zY3JlZW5fc2V0X3ZhbChzdHJ1Y3QgZHJtX2Nvbm5l Y3RvciAqY29ubmVjdG9yLAo+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVu dW0gZHJtX3ByaXZhY3lfc2NyZWVuIHZhbCk7Cj4gPiA+ID4gK2VudW0gZHJtX3ByaXZhY3lfc2Ny ZWVuIGRybV9wcml2YWN5X3NjcmVlbl9nZXRfdmFsKHN0cnVjdCBkcm1fY29ubmVjdG9yCj4gPiA+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb25u ZWN0b3IpOwo+ID4gPiA+ICsjZWxzZQo+ID4gPiA+ICtzdGF0aWMgaW5saW5lIGJvb2wgZHJtX3By aXZhY3lfc2NyZWVuX3ByZXNlbnQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiA+ ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IHBvcnQp Cj4gPiA+ID4gK3sKPiA+ID4gPiArICAgICByZXR1cm4gZmFsc2U7Cj4gPiA+ID4gK30KPiA+ID4g PiArCj4gPiA+ID4gK3ZvaWQgZHJtX3ByaXZhY3lfc2NyZWVuX3NldF92YWwoc3RydWN0IGRybV9j b25uZWN0b3IgKmNvbm5lY3RvciwKPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBlbnVtIGRybV9wcml2YWN5X3NjcmVlbiB2YWwpCj4gPiA+ID4gK3sgfQo+ID4gPiA+ICsKPiA+ ID4gPiArZW51bSBkcm1fcHJpdmFjeV9zY3JlZW4gZHJtX3ByaXZhY3lfc2NyZWVuX2dldF92YWwo Cj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJt X2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ID4gPiA+ICt7Cj4gPiA+ID4gKyAgICAgcmV0dXJuIERS TV9QUklWQUNZX1NDUkVFTl9ESVNBQkxFRDsKPiA+ID4gPiArfQo+ID4gPiA+ICsjZW5kaWYgLyog Q09ORklHX0FDUEkgKi8KPiA+ID4gPiArCj4gPiA+ID4gKyNlbmRpZiAvKiBfX0RSTV9QUklWQUNZ X1NDUkVFTl9IX18gKi8KPiA+ID4gPiAtLQo+ID4gPiA+IDIuMjMuMC44NjYuZ2I4NjliOThkNGMt Z29vZwo+ID4gPiA+CgoKCi0tIApEYW5pZWwgVmV0dGVyClNvZnR3YXJlIEVuZ2luZWVyLCBJbnRl bCBDb3Jwb3JhdGlvbgorNDEgKDApIDc5IDM2NSA1NyA0OCAtIGh0dHA6Ly9ibG9nLmZmd2xsLmNo Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZl bCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xp c3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbA== 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=-11.7 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,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 99221CA9EA0 for ; Fri, 25 Oct 2019 19:03:27 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 7418221D7F for ; Fri, 25 Oct 2019 19:03:27 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7418221D7F Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ffwll.ch Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id E7C016EB45; Fri, 25 Oct 2019 19:03:26 +0000 (UTC) Received: from mail-pf1-x442.google.com (mail-pf1-x442.google.com [IPv6:2607:f8b0:4864:20::442]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2A0306EB45 for ; Fri, 25 Oct 2019 19:03:26 +0000 (UTC) Received: by mail-pf1-x442.google.com with SMTP id c7so1008573pfo.12 for ; Fri, 25 Oct 2019 12:03:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=hj/i16Oz3ttbHOZu54m4vyC0cEmTPwImzjB+4h1naI8=; b=PlwYdhjct4ZrelLyZ4OEpmjnNzBuABkXpb7jMyWfnwFuLQGBf+ncjzB1NMCgkG4KIY t/41fmRnRzkSCZE8Cj06pAzwShKEv2IIZ8sOEfqvO9LHBIQ6N6jnEJ4uou5rs8pioWmu fUC0IgG0WO0vgRMLFTalEGXVnI2spJJvHdV6PZYa1fUj14ORQAqMpG4V6VX6Fzngrfbg s1oOK0bG+DBsUUt52BZFer/WJzT0sVoNTSze0oaq2v9irexAeMWqz6C7qgY6GxPf9qZM zxjYjd0/IgvcWl8sXZ0HpM7Tcmr8/EzN5h/vEdzRfDF272BT5IX5Y/8kJS4K8FBeJ0mA uvbA== X-Gm-Message-State: APjAAAVhTR0CvZ/nacjWC6OLG+dumBNWQO2iORn7L+Gs1IcGzPWLGWyi T+ehIwr8k4ZzoRS7wXriibXE+E1h6oL8ZBBmHU/AgA== X-Google-Smtp-Source: APXvYqx1QntQpmmaG2tVUM7DRPf1xKWF3i+asEKdoEJbskpoGAJlHQLyADmx+TrZ6hEbYF8Oicsvx4ertzhB0zLyvhk= X-Received: by 2002:a63:2c53:: with SMTP id s80mr6038808pgs.377.1572030204942; Fri, 25 Oct 2019 12:03:24 -0700 (PDT) MIME-Version: 1.0 References: <20191023001206.15741-1-rajatja@google.com> <20191024112040.GE2825247@ulmo> <20191025113609.GB928835@ulmo> In-Reply-To: <20191025113609.GB928835@ulmo> From: Daniel Vetter Date: Fri, 25 Oct 2019 21:03:12 +0200 Message-ID: To: Thierry Reding X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=hj/i16Oz3ttbHOZu54m4vyC0cEmTPwImzjB+4h1naI8=; b=hFgQwJifeWrgblDTYKBTY3Y3mtkyucjAM9oiofrZTG4htQgonKBSjaAUmxr0sx0vdd CkwKKPDPs/vuyDhcLqQIxI95oYX3RvYuQlOGsEzy8L0Vx4jLADD6upn8HvNCKVMxxUH3 lhqj6AuYau3YBBNXWqgRveGMHWJkiv6v8COv0= Subject: Re: [Intel-gfx] [PATCH] drm: Add support for integrated privacy screens X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Sean Paul , David Airlie , dri-devel , Rajat Jain , Daniel Thompson , Jonathan Corbet , Jesse Barnes , Rajat Jain , intel-gfx , Maxime Ripard , Mat King , Duncan Laurie , Greg KH , Linux Kernel Mailing List , Pavel Machek Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Message-ID: <20191025190312.jkl0vtLyqZWNxk8pIcNJ33NkVrj1D_pCMHcPfMU4d3M@z> T24gRnJpLCBPY3QgMjUsIDIwMTkgYXQgMTozNiBQTSBUaGllcnJ5IFJlZGluZyA8dGhpZXJyeS5y ZWRpbmdAZ21haWwuY29tPiB3cm90ZToKPgo+IE9uIFRodSwgT2N0IDI0LCAyMDE5IGF0IDAxOjQ1 OjE2UE0gLTA3MDAsIFJhamF0IEphaW4gd3JvdGU6Cj4gPiBIaSwKPiA+Cj4gPiBUaGFua3MgZm9y IHlvdXIgcmV2aWV3IGFuZCBjb21tZW50cy4gUGxlYXNlIHNlZSBpbmxpbmUgYmVsb3cuCj4gPgo+ ID4gT24gVGh1LCBPY3QgMjQsIDIwMTkgYXQgNDoyMCBBTSBUaGllcnJ5IFJlZGluZyA8dGhpZXJy eS5yZWRpbmdAZ21haWwuY29tPiB3cm90ZToKPiA+ID4KPiA+ID4gT24gVHVlLCBPY3QgMjIsIDIw MTkgYXQgMDU6MTI6MDZQTSAtMDcwMCwgUmFqYXQgSmFpbiB3cm90ZToKPiA+ID4gPiBDZXJ0YWlu IGxhcHRvcHMgbm93IGNvbWUgd2l0aCBwYW5lbHMgdGhhdCBoYXZlIGludGVncmF0ZWQgcHJpdmFj eQo+ID4gPiA+IHNjcmVlbnMgb24gdGhlbS4gVGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgZm9yIHN1 Y2ggcGFuZWxzIGJ5IGFkZGluZwo+ID4gPiA+IGEgcHJpdmFjeS1zY3JlZW4gcHJvcGVydHkgdG8g dGhlIGRybV9jb25uZWN0b3IgZm9yIHRoZSBwYW5lbCwgdGhhdAo+ID4gPiA+IHRoZSB1c2Vyc3Bh Y2UgY2FuIHRoZW4gdXNlIHRvIGNvbnRyb2wgYW5kIGNoZWNrIHRoZSBzdGF0dXMuIFRoZSBpZGVh Cj4gPiA+ID4gd2FzIGRpc2N1c3NlZCBoZXJlOgo+ID4gPiA+Cj4gPiA+ID4gaHR0cHM6Ly9sa21s Lm9yZy9sa21sLzIwMTkvMTAvMS83ODYKPiA+ID4gPgo+ID4gPiA+IEFDUEkgbWV0aG9kcyBhcmUg dXNlZCB0byBpZGVudGlmeSwgcXVlcnkgYW5kIGNvbnRyb2wgcHJpdmFjeSBzY3JlZW46Cj4gPiA+ ID4KPiA+ID4gPiAqIElkZW50aWZ5aW5nIGFuIEFDUEkgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8g dGhlIHBhbmVsOiBUaGUgcGF0Y2gKPiA+ID4gPiBmb2xsb3dzIEFDUEkgU3BlYyA2LjMgKGF2YWls YWJsZSBhdAo+ID4gPiA+IGh0dHBzOi8vdWVmaS5vcmcvc2l0ZXMvZGVmYXVsdC9maWxlcy9yZXNv dXJjZXMvQUNQSV82XzNfZmluYWxfSmFuMzAucGRmKS4KPiA+ID4gPiBQYWdlcyAxMTE5IC0gMTEy MyBkZXNjcmliZSB3aGF0IEkgYmVsaWV2ZSwgaXMgYSBzdGFuZGFyZCB3YXkgb2YKPiA+ID4gPiBp ZGVudGlmeWluZyAvIGFkZHJlc3NpbmcgImRpc3BsYXkgcGFuZWxzIiBpbiB0aGUgQUNQSSB0YWJs ZXMsIHRodXMKPiA+ID4gPiBhbGxvd2luZyBrZXJuZWwgdG8gYXR0YWNoIEFDUEkgbm9kZXMgdG8g dGhlIHBhbmVsLiBJTUhPLCB0aGlzIGFiaWxpdHkKPiA+ID4gPiB0byBpZGVudGlmeSBhbmQgYXR0 YWNoIEFDUEkgbm9kZXMgdG8gZHJtIGNvbm5lY3RvcnMgbWF5IGJlIHVzZWZ1bCBmb3IKPiA+ID4g PiByZWFzb25zIG90aGVyIHByaXZhY3ktc2NyZWVucywgaW4gZnV0dXJlLgo+ID4gPiA+Cj4gPiA+ ID4gKiBJZGVudGlmeWluZyB0aGUgcHJlc2VuY2Ugb2YgcHJpdmFjeSBzY3JlZW4sIGFuZCBjb250 cm9sbGluZyBpdCwgaXMgZG9uZQo+ID4gPiA+IHZpYSBBQ1BJIF9EU00gbWV0aG9kcy4KPiA+ID4g Pgo+ID4gPiA+IEN1cnJlbnRseSwgdGhpcyBpcyBkb25lIG9ubHkgZm9yIHRoZSBJbnRlbCBkaXNw bGF5IHBvcnRzLiBCdXQgaW4gZnV0dXJlLAo+ID4gPiA+IHRoaXMgY2FuIGJlIGRvbmUgZm9yIGFu eSBvdGhlciBwb3J0cyBpZiB0aGUgaGFyZHdhcmUgYmVjb21lcyBhdmFpbGFibGUKPiA+ID4gPiAo ZS5nLiBleHRlcm5hbCBtb25pdG9ycyBzdXBwb3J0aW5nIGludGVncmF0ZWQgcHJpdmFjeSBzY3Jl ZW5zPykuCj4gPiA+ID4KPiA+ID4gPiBBbHNvLCB0aGlzIGNvZGUgY2FuIGJlIGV4dGVuZGVkIGlu IGZ1dHVyZSB0byBzdXBwb3J0IG5vbi1BQ1BJIG1ldGhvZHMKPiA+ID4gPiAoZS5nLiB1c2luZyBh IGtlcm5lbCBHUElPIGRyaXZlciB0byB0b2dnbGUgYSBncGlvIHRoYXQgY29udHJvbHMgdGhlCj4g PiA+ID4gcHJpdmFjeS1zY3JlZW4pLgo+ID4gPiA+Cj4gPiA+ID4gU2lnbmVkLW9mZi1ieTogUmFq YXQgSmFpbiA8cmFqYXRqYUBnb29nbGUuY29tPgo+ID4gPiA+IC0tLQo+ID4gPiA+ICBkcml2ZXJz L2dwdS9kcm0vTWFrZWZpbGUgICAgICAgICAgICAgICAgfCAgIDEgKwo+ID4gPiA+ICBkcml2ZXJz L2dwdS9kcm0vZHJtX2F0b21pY191YXBpLmMgICAgICAgfCAgIDUgKwo+ID4gPiA+ICBkcml2ZXJz L2dwdS9kcm0vZHJtX2Nvbm5lY3Rvci5jICAgICAgICAgfCAgMzggKysrKysKPiA+ID4gPiAgZHJp dmVycy9ncHUvZHJtL2RybV9wcml2YWN5X3NjcmVlbi5jICAgIHwgMTc2ICsrKysrKysrKysrKysr KysrKysrKysrKwo+ID4gPiA+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2Rw LmMgfCAgIDMgKwo+ID4gPiA+ICBpbmNsdWRlL2RybS9kcm1fY29ubmVjdG9yLmggICAgICAgICAg ICAgfCAgMTggKysrCj4gPiA+ID4gIGluY2x1ZGUvZHJtL2RybV9tb2RlX2NvbmZpZy5oICAgICAg ICAgICB8ICAgNyArCj4gPiA+ID4gIGluY2x1ZGUvZHJtL2RybV9wcml2YWN5X3NjcmVlbi5oICAg ICAgICB8ICAzMyArKysrKwo+ID4gPiA+ICA4IGZpbGVzIGNoYW5nZWQsIDI4MSBpbnNlcnRpb25z KCspCj4gPiA+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vZHJtX3ByaXZh Y3lfc2NyZWVuLmMKPiA+ID4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvZHJtL2RybV9w cml2YWN5X3NjcmVlbi5oCj4gPiA+Cj4gPiA+IEkgbGlrZSB0aGlzIG11Y2ggYmV0dGVyIHRoYW4g dGhlIHByaW9yIHByb3Bvc2FsIHRvIHVzZSBzeXNmcy4gSG93ZXZlcgo+ID4gPiB0aGUgc3VwcG9y dCBjdXJyZW50bHkgbG9va3MgYSBiaXQgdGFuZ2xlZC4gSSByZWFsaXplIHRoYXQgd2Ugb25seSBo YXZlIGEKPiA+ID4gc2luZ2xlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIGluIGhhcmR3YXJlIHJp Z2h0IG5vdywgc28gdGhlcmUncyBubyB1c2UKPiA+ID4gaW4gb3Zlci1lbmdpbmVlcmluZyB0aGlu Z3MsIGJ1dCBJIHRoaW5rIHdlIGNhbiBkbyBhIGJldHRlciBqb2IgZnJvbSB0aGUKPiA+ID4gc3Rh cnQgd2l0aG91dCBnZXR0aW5nIGludG8gdG9vIG1hbnkgYWJzdHJhY3Rpb25zLiBTZWUgYmVsb3cu Cj4gPiA+Cj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZSBiL2Ry aXZlcnMvZ3B1L2RybS9NYWtlZmlsZQo+ID4gPiA+IGluZGV4IDgyZmY4MjZiMzNjYy4uZTFmYzMz ZDY5YmI3IDEwMDY0NAo+ID4gPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQo+ID4g PiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQo+ID4gPiA+IEBAIC0xOSw2ICsxOSw3 IEBAIGRybS15ICAgICAgIDo9ICAgICAgZHJtX2F1dGgubyBkcm1fY2FjaGUubyBcCj4gPiA+ID4g ICAgICAgICAgICAgICBkcm1fc3luY29iai5vIGRybV9sZWFzZS5vIGRybV93cml0ZWJhY2subyBk cm1fY2xpZW50Lm8gXAo+ID4gPiA+ICAgICAgICAgICAgICAgZHJtX2NsaWVudF9tb2Rlc2V0Lm8g ZHJtX2F0b21pY191YXBpLm8gZHJtX2hkY3Aubwo+ID4gPiA+Cj4gPiA+ID4gK2RybS0kKENPTkZJ R19BQ1BJKSArPSBkcm1fcHJpdmFjeV9zY3JlZW4ubwo+ID4gPiA+ICBkcm0tJChDT05GSUdfRFJN X0xFR0FDWSkgKz0gZHJtX2xlZ2FjeV9taXNjLm8gZHJtX2J1ZnMubyBkcm1fY29udGV4dC5vIGRy bV9kbWEubyBkcm1fc2NhdHRlci5vIGRybV9sb2NrLm8KPiA+ID4gPiAgZHJtLSQoQ09ORklHX0RS TV9MSUJfUkFORE9NKSArPSBsaWIvZHJtX3JhbmRvbS5vCj4gPiA+ID4gIGRybS0kKENPTkZJR19E Uk1fVk0pICs9IGRybV92bS5vCj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9k cm1fYXRvbWljX3VhcGkuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX3VhcGkuYwo+ID4g PiA+IGluZGV4IDdhMjZiZmI1MzI5Yy4uNDQxMzExNjVlNGVhIDEwMDY0NAo+ID4gPiA+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX3VhcGkuYwo+ID4gPiA+ICsrKyBiL2RyaXZlcnMv Z3B1L2RybS9kcm1fYXRvbWljX3VhcGkuYwo+ID4gPiA+IEBAIC0zMCw2ICszMCw3IEBACj4gPiA+ ID4gICNpbmNsdWRlIDxkcm0vZHJtX2F0b21pYy5oPgo+ID4gPiA+ICAjaW5jbHVkZSA8ZHJtL2Ry bV9wcmludC5oPgo+ID4gPiA+ICAjaW5jbHVkZSA8ZHJtL2RybV9kcnYuaD4KPiA+ID4gPiArI2lu Y2x1ZGUgPGRybS9kcm1fcHJpdmFjeV9zY3JlZW4uaD4KPiA+ID4gPiAgI2luY2x1ZGUgPGRybS9k cm1fd3JpdGViYWNrLmg+Cj4gPiA+ID4gICNpbmNsdWRlIDxkcm0vZHJtX3ZibGFuay5oPgo+ID4g PiA+Cj4gPiA+ID4gQEAgLTc2Niw2ICs3NjcsOCBAQCBzdGF0aWMgaW50IGRybV9hdG9taWNfY29u bmVjdG9yX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ID4g PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5j ZV9wdHIpOwo+ID4gPiA+ICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgPT0gY29ubmVjdG9yLT5t YXhfYnBjX3Byb3BlcnR5KSB7Cj4gPiA+ID4gICAgICAgICAgICAgICBzdGF0ZS0+bWF4X3JlcXVl c3RlZF9icGMgPSB2YWw7Cj4gPiA+ID4gKyAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25m aWctPnByaXZhY3lfc2NyZWVuX3Byb3BlcnR5KSB7Cj4gPiA+ID4gKyAgICAgICAgICAgICBkcm1f cHJpdmFjeV9zY3JlZW5fc2V0X3ZhbChjb25uZWN0b3IsIHZhbCk7Cj4gPiA+Cj4gPiA+IFRoaXMg ZG9lc24ndCBsb29rIHJpZ2h0LiBTaG91bGRuJ3QgeW91IHN0b3JlIHRoZSB2YWx1ZSBpbiB0aGUg Y29ubmVjdG9yCj4gPiA+IHN0YXRlIGFuZCB0aGVuIGxlYXZlIGl0IHVwIHRvIHRoZSBjb25uZWN0 b3IgZHJpdmVyIHRvIHNldCBpdAo+ID4gPiBhcHByb3ByaWF0ZWx5PyBJIHRoaW5rIHRoYXQgYWxz byBoYXMgdGhlIGFkdmFudGFnZSBvZiB1bnRhbmdsaW5nIHRoaXMKPiA+ID4gc3VwcG9ydCBhIGxp dHRsZS4KPiA+Cj4gPiBIb3BlZnVsbHkgdGhpcyBnZXRzIGFuc3dlcmVkIGluIG15IGV4cGxhbmF0 aW9ucyBiZWxvdy4KPiA+Cj4gPiA+Cj4gPiA+ID4gICAgICAgfSBlbHNlIGlmIChjb25uZWN0b3It PmZ1bmNzLT5hdG9taWNfc2V0X3Byb3BlcnR5KSB7Cj4gPiA+ID4gICAgICAgICAgICAgICByZXR1 cm4gY29ubmVjdG9yLT5mdW5jcy0+YXRvbWljX3NldF9wcm9wZXJ0eShjb25uZWN0b3IsCj4gPiA+ ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIHByb3BlcnR5LCB2YWwpOwo+ ID4gPiA+IEBAIC04NDIsNiArODQ1LDggQEAgZHJtX2F0b21pY19jb25uZWN0b3JfZ2V0X3Byb3Bl cnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4gPiA+ID4gICAgICAgICAgICAg ICAqdmFsID0gMDsKPiA+ID4gPiAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbm5lY3Rv ci0+bWF4X2JwY19wcm9wZXJ0eSkgewo+ID4gPiA+ICAgICAgICAgICAgICAgKnZhbCA9IHN0YXRl LT5tYXhfcmVxdWVzdGVkX2JwYzsKPiA+ID4gPiArICAgICB9IGVsc2UgaWYgKHByb3BlcnR5ID09 IGNvbmZpZy0+cHJpdmFjeV9zY3JlZW5fcHJvcGVydHkpIHsKPiA+ID4gPiArICAgICAgICAgICAg ICp2YWwgPSBkcm1fcHJpdmFjeV9zY3JlZW5fZ2V0X3ZhbChjb25uZWN0b3IpOwo+ID4gPgo+ID4g PiBTaW1pbGFybHksIEkgdGhpbmsgdGhpcyBjYW4ganVzdCByZXR1cm4gdGhlIGF0b21pYyBzdGF0 ZSdzIHZhbHVlIGZvcgo+ID4gPiB0aGlzLgo+ID4KPiA+IEkgZGlkIHRoaW5rIGFib3V0IGhhdmlu ZyBhIHN0YXRlIHZhcmlhYmxlIGluIHNvZnR3YXJlIHRvIGdldCBhbmQgc2V0Cj4gPiB0aGlzLiBI b3dldmVyLCBJIHRoaW5rIGl0IGlzIG5vdCB2ZXJ5IGZhciBmZXRjaGVkIHRoYXQgc29tZSBwbGF0 Zm9ybXMKPiA+IG1heSBoYXZlICJoYXJkd2FyZSBraWxsIiBzd2l0Y2hlcyB0aGF0IGFsbG93IGhh cmR3YXJlIHRvIHN3aXRjaAo+ID4gcHJpdmFjeS1zY3JlZW4gb24gYW5kIG9mZiBkaXJlY3RseSwg aW4gYWRkaXRpb24gdG8gdGhlIHNvZnR3YXJlCj4gPiBjb250cm9sIHRoYXQgd2UgYXJlIGltcGxl bWVudGluZy4gUHJpdmFjeSBpcyBhIHRvdWNoeSBzdWJqZWN0IGluCj4gPiBlbnRlcnByaXNlLCBh bmQgYW55dGhpbmcgdGhhdCByZWR1Y2VzIHRoZSBwb3NzaWJpbGl0eSBvZiBoYXZpbmcgYW55Cj4g PiBpbmNvbnNpc3RlbmN5IGJldHdlZW4gc29mdHdhcmUgc3RhdGUgYW5kIGhhcmR3YXJlIHN0YXRl IGlzIGRlc2lyYWJsZS4KPiA+IFNvIGluIHRoaXMgY2FzZSwgSSBjaG9zZSB0byBub3QgaGF2ZSBh IHN0YXRlIGluIHNvZnR3YXJlIGFib3V0IHRoaXMgLQo+ID4gd2UganVzdCByZXBvcnQgdGhlIGhh cmR3YXJlIHN0YXRlIGV2ZXJ5dGltZSB3ZSBhcmUgYXNrZWQgZm9yIGl0Lgo+Cj4gU28gdGhpcyBk b2Vzbid0IHJlYWxseSB3b3JrIHdpdGggYXRvbWljIEtNUywgdGhlbi4gVGhlIG1haW4gaWRlYSBi ZWhpbmQKPiBhdG9taWMgS01TIGlzIHRoYXQgeW91IGFwcGx5IGEgY29uZmlndXJhdGlvbiBlaXRo ZXIgY29tcGxldGVseSBvciBub3QgYXQKPiBhbGwuIFNvIGF0IGxlYXN0IGZvciBzZXR0aW5nIHRo aXMgcHJvcGVydHkgeW91J2QgaGF2ZSB0byBnbyB0aHJvdWdoIHRoZQo+IHN0YXRlIG9iamVjdC4K Pgo+IE5vdywgZm9yIHJlYWRpbmcgb3V0IHRoZSBwcm9wZXJ0eSB5b3UgbWlnaHQgYmUgYWJsZSB0 byBnZXQgYXdheSB3aXRoIHRoZQo+IGFib3ZlLiBJJ20gbm90IHN1cmUgaWYgdGhhdCdzIGVub3Vn aCB0byBrZWVwIHRoZSBzdGF0ZSB1cC10by1kYXRlLAo+IHRob3VnaC4gSXMgdGhlcmUgc29tZSB3 YXkgZm9yIGEga2lsbCBzd2l0Y2ggdG8gdHJpZ2dlciBhbiBpbnRlcnJ1cHQgb3IKPiBvdGhlciBl dmVudCBvZiBzb21lIHNvcnQgc28gdGhhdCB0aGUgc3RhdGUgY291bGQgYmUga2VwdCB1cC10by1k YXRlPwo+Cj4gRGFuaWVsIChvciBhbnlvbmUgZWxzZSksIGRvIHlvdSBrbm93IG9mIGFueSBwcmVj ZWRlbnQgZm9yIHN0YXRlIHRoYXQKPiBtaWdodCBnZXQgbW9kaWZpZWQgYmVoaW5kIHRoZSBhdG9t aWMgaGVscGVycycgYmFjaz8gU2VlbXMgdG8gbWUgbGlrZSB3ZQo+IG5lZWQgdG8gZmluZCBzb21l IHBvaW50IHdoZXJlIHdlIGNhbiBhY3R1YWxseSByZWFkIGJhY2sgdGhlIGN1cnJlbnQKPiAiaGFy ZHdhcmUgdmFsdWUiIG9mIHRoaXMgcHJpdmFjeSBzY3JlZW4gcHJvcGVydHkgYW5kIHN0b3JlIHRo YXQgYmFjawo+IGludG8gdGhlIHN0YXRlLgoKV2UgaGF2ZSBhdG9taWMgcHJvcGVydGllcyB0aGF0 IHRoZSBkcml2ZXIgYWxzbyB1cGRhdGVzLCBub3QganVzdCB1c2Vyc3BhY2U6Ci0gbGluayBzdGF0 dXMKLSBoZGNwIG1hY2hpbmVyeQoKQnV0IGJvdGggc3RpbGwgdXNlIHRoZSBzdGF0ZSBzdHJ1Y3R1 cmVzIGxpa2UgYW55dGhpbmcgZWxzZSwgYW5kIHRoZW4KdXBkYXRlIHRoYXQgc3RhdGUgc3RydWN0 dXJlIHRocm91Z2ggc29tZSB3b3JrZXIuCgpBbmQgeWVzIEkgdG90YWxseSBkaWRuJ3QgY2F0Y2gg dGhpcyBoZXJlLCB0aGlzIGJyZWFrcyBhdG9taWMsIGJhZGx5IDotKQoKPgo+ID4KPiA+ID4KPiA+ ID4gPiAgICAgICB9IGVsc2UgaWYgKGNvbm5lY3Rvci0+ZnVuY3MtPmF0b21pY19nZXRfcHJvcGVy dHkpIHsKPiA+ID4gPiAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0b3ItPmZ1bmNzLT5hdG9t aWNfZ2V0X3Byb3BlcnR5KGNvbm5lY3RvciwKPiA+ID4gPiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzdGF0ZSwgcHJvcGVydHksIHZhbCk7Cj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9kcm1fY29ubmVjdG9yLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2Nvbm5lY3Rv ci5jCj4gPiA+ID4gaW5kZXggNGM3NjY2MjRiMjBkLi5hMzFlMDM4MjEzMmIgMTAwNjQ0Cj4gPiA+ ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9jb25uZWN0b3IuYwo+ID4gPiA+ICsrKyBiL2Ry aXZlcnMvZ3B1L2RybS9kcm1fY29ubmVjdG9yLmMKPiA+ID4gPiBAQCAtODIxLDYgKzgyMSwxMSBA QCBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9wcm9wX2VudW1fbGlzdCBkcm1fcGFuZWxfb3JpZW50 YXRpb25fZW51bV9saXN0W10gPSB7Cj4gPiA+ID4gICAgICAgeyBEUk1fTU9ERV9QQU5FTF9PUklF TlRBVElPTl9SSUdIVF9VUCwgICJSaWdodCBTaWRlIFVwIiB9LAo+ID4gPiA+ICB9Owo+ID4gPiA+ Cj4gPiA+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX3Byb3BfZW51bV9saXN0IGRybV9wcml2 YWN5X3NjcmVlbl9lbnVtX2xpc3RbXSA9IHsKPiA+ID4gPiArICAgICB7IERSTV9QUklWQUNZX1ND UkVFTl9ESVNBQkxFRCwgIkRpc2FibGVkIiB9LAo+ID4gPiA+ICsgICAgIHsgRFJNX1BSSVZBQ1lf U0NSRUVOX0VOQUJMRUQsICJFbmFibGVkIiB9LAo+ID4gPiA+ICt9Owo+ID4gPiA+ICsKPiA+ID4g PiAgc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fcHJvcF9lbnVtX2xpc3QgZHJtX2R2aV9pX3NlbGVj dF9lbnVtX2xpc3RbXSA9IHsKPiA+ID4gPiAgICAgICB7IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9B dXRvbWF0aWMsICJBdXRvbWF0aWMiIH0sIC8qIERWSS1JIGFuZCBUVi1vdXQgKi8KPiA+ID4gPiAg ICAgICB7IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9EVklELCAgICAgICJEVkktRCIgICAgIH0sIC8q IERWSS1JICAqLwo+ID4gPiA+IEBAIC0yMjUzLDYgKzIyNTgsMzkgQEAgc3RhdGljIHZvaWQgZHJt X3RpbGVfZ3JvdXBfZnJlZShzdHJ1Y3Qga3JlZiAqa3JlZikKPiA+ID4gPiAgICAgICBrZnJlZSh0 Zyk7Cj4gPiA+ID4gIH0KPiA+ID4gPgo+ID4gPiA+ICsvKioKPiA+ID4gPiArICogZHJtX2Nvbm5l Y3Rvcl9pbml0X3ByaXZhY3lfc2NyZWVuX3Byb3BlcnR5IC0KPiA+ID4gPiArICogICBjcmVhdGUg YW5kIGF0dGFjaCB0aGUgY29ubmVjdGVyJ3MgcHJpdmFjeS1zY3JlZW4gcHJvcGVydHkuCj4gPiA+ ID4gKyAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciBmb3Igd2hpY2ggdG8gaW5pdCB0aGUgcHJpdmFj eS1zY3JlZW4gcHJvcGVydHkuCj4gPiA+ID4gKyAqCj4gPiA+ID4gKyAqIFRoaXMgZnVuY3Rpb24g Y3JlYXRlcyBhbmQgYXR0YWNoZXMgdGhlICJwcml2YWN5LXNjcmVlbiIgcHJvcGVydHkgdG8gdGhl Cj4gPiA+ID4gKyAqIGNvbm5lY3Rvci4gSW5pdGlhbCBzdGF0ZSBvZiBwcml2YWN5LXNjcmVlbiBp cyBzZXQgdG8gZGlzYWJsZWQuCj4gPiA+ID4gKyAqCj4gPiA+ID4gKyAqIFJldHVybnM6Cj4gPiA+ ID4gKyAqIFplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZS4KPiA+ID4g PiArICovCj4gPiA+ID4gK2ludCBkcm1fY29ubmVjdG9yX2luaXRfcHJpdmFjeV9zY3JlZW5fcHJv cGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiA+ID4gPiArewo+ID4gPiA+ ICsgICAgIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKPiA+ID4gPiAr ICAgICBzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcm9wOwo+ID4gPiA+ICsKPiA+ID4gPiArICAgICBw cm9wID0gZGV2LT5tb2RlX2NvbmZpZy5wcml2YWN5X3NjcmVlbl9wcm9wZXJ0eTsKPiA+ID4gPiAr ICAgICBpZiAoIXByb3ApIHsKPiA+ID4gPiArICAgICAgICAgICAgIHByb3AgPSBkcm1fcHJvcGVy dHlfY3JlYXRlX2VudW0oZGV2LCBEUk1fTU9ERV9QUk9QX0VOVU0sCj4gPiA+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgInByaXZhY3ktc2NyZWVuIiwgZHJtX3ByaXZhY3lfc2NyZWVu X2VudW1fbGlzdCwKPiA+ID4KPiA+ID4gU2VlbXMgdG8gbWUgbGlrZSB0aGUgLXNjcmVlbiBzdWZm aXggaGVyZSBpcyBzb21ld2hhdCByZWR1bmRhbnQuIFllcywgdGhlCj4gPiA+IHRoaW5nIHRoYXQg d2UgZW5hYmxlL2Rpc2FibGUgbWF5IGJlIGNhbGxlZCBhICJwcml2YWN5IHNjcmVlbiIsIGJ1dCB0 aGUKPiA+ID4gcHJvcGVydHkgdGhhdCB3ZSBlbmFibGUvZGlzYWJsZSBvbiB0aGUgY29ubmVjdG9y IGlzIHRoZSAicHJpdmFjeSIgb2YgdGhlCj4gPiA+IHVzZXIuIEknZCByZWZsZWN0IHRoYXQgaW4g YWxsIHRoZSByZWxhdGVkIHZhcmlhYmxlIG5hbWVzIGFuZCBzbyBvbiBhcwo+ID4gPiB3ZWxsLgo+ ID4KPiA+IElNSE8gYSBwcm9wZXJ0eSBjYWxsZWQgInByaXZhY3kiIG1heSBiZSBhIGxpdHRsZSBn ZW5lcmljIGZvciB0aGUgdXNlcnMKPiA+IHRvIHVuZGVyc3RhbmQgd2hhdCBpdCBpcy4gRm9yIGUu Zy4gd2hlbiBJIHN0YXJ0ZWQgbG9va2luZyBhdCBjb2RlLCBJCj4gPiBmb3VuZCB0aGUgIkNvbnRl bnQgUHJvdGVjdGlvbiIgcHJvcGVydHkgYW5kIEkgZ290IGNvbmZ1c2VkIHRoaW5raW5nCj4gPiBt YXkgYmUgaXQgcHJvdmlkZXMgc29tZXRoaW5nIHNpbWlsYXIgdG8gd2hhdCBJJ20gdHJ5aW5nIHRv IGRvLiBJIHRoaW5rCj4gPiAicHJpdmFjeS1zY3JlZW4iIGNvbnZleXMgdGhlIGNvbXBsZXRlIGNv bnRleHQgd2l0aG91dCBiZWluZyBsb25nLCBzbwo+ID4gdGhlcmUgaXMgbm8gY29uZnVzaW9uIG9y IGFtYmlndWl0eS4gQnV0IEkgZG9uJ3QgbWluZCBjaGFuZ2luZyBpdCBpZiBhCj4gPiBwcm9wZXJ0 eSAicHJpdmFjeSIgaXMgd2hhdCBwZW9wbGUgdGhpbmsgaXMgYmV0dGVyIHRvIGNvbnZleSB3aGF0 IGl0Cj4gPiBpcywgYXMgbG9uZyBhcyBpdCBpcyBjbGVhciB0byB1c2VyLgo+Cj4gVGhpcyBiZWlu ZyBhIHByb3BlcnR5IG9mIGEgZGlzcGxheSBjb25uZWN0b3IgaXQgZG9lc24ndCBzZWVtIHZlcnkK PiBhbWJpZ3VvdXMgdG8gbWUgd2hhdCB0aGlzIGlzLiBIb3cgdGhpcyBlbmRzIHVwIGJlaW5nIHBy ZXNlbnRlZCB0byB0aGUKPiB1c2VycyBpcyBtb3N0bHkgb3J0aG9nb25hbCBhbnl3YXkuIFdlJ3Zl IGdvdCBhIGJ1bmNoIG9mIHByb3BlcnRpZXMgd2hvc2UKPiBwdXJwb3NlIG1heSBub3QgYmUgY2xl YXIgdG8gdGhlIGF2ZXJhZ2UgdXNlci4gVGhlIHByb3BlcnRpZXMsIHdoaWxlIHRoZXkKPiBhcmUg VUFCSSwgZG9uJ3QgdHlwaWNhbGx5IGZhY2UgdGhlIHVzZXIgZGlyZWN0bHkuIFRoZXkncmUgc3Rp bGwgcGFydCBvZgo+IGFuIEFQSSwgc28gYXMgbG9uZyBhcyB0aGV5IGFyZSBwcm9wZXJseSBkb2N1 bWVudGVkIHRoZXJlIHNob3VsZG4ndCBiZQo+IGFueSBhbWJpZ3VpdGllcy4KClNvbWV0aW1lcyB3 ZSBnbyB0aGUgY2hlYXAgd2F5IHdpdGggY29ubmVjdG9yIHByb3BlcnRpZXMgYW5kIHNheSB0aGF0 CnRob3NlIHNob3VsZCBiZSBzZXQgYnkgdGhlIHVzZXIgZGlyZWN0bHksIHRocm91Z2ggc29tZXRo aW5nIGxpa2UKeHJhbmRyIChtb3N0bHkgZm9yIHN0dWZmIHRvIGhhY2sgYXJvdW5kIGJyb2tlbiBt b25pdG9ycykuIEJ1dCBvZmMKbmljZXIgaWYgdGhlIHByb3BlcnR5IGNvbWVzIHdpdGggc29tZSBw cm9wZXIgdXNlcnNwYWNlIGludGVncmF0aW9uLgoKPiA+ID4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBBUlJBWV9TSVpFKGRybV9wcml2YWN5X3NjcmVlbl9lbnVtX2xpc3QpKTsKPiA+ ID4gPiArICAgICAgICAgICAgIGlmICghcHJvcCkKPiA+ID4gPiArICAgICAgICAgICAgICAgICAg ICAgcmV0dXJuIC1FTk9NRU07Cj4gPiA+ID4gKwo+ID4gPiA+ICsgICAgICAgICAgICAgZGV2LT5t b2RlX2NvbmZpZy5wcml2YWN5X3NjcmVlbl9wcm9wZXJ0eSA9IHByb3A7Cj4gPiA+ID4gKyAgICAg fQo+ID4gPiA+ICsKPiA+ID4gPiArICAgICBkcm1fb2JqZWN0X2F0dGFjaF9wcm9wZXJ0eSgmY29u bmVjdG9yLT5iYXNlLCBwcm9wLAo+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIERSTV9QUklWQUNZX1NDUkVFTl9ESVNBQkxFRCk7Cj4gPiA+ID4gKyAgICAgcmV0dXJuIDA7 Cj4gPiA+ID4gK30KPiA+ID4gPiArRVhQT1JUX1NZTUJPTChkcm1fY29ubmVjdG9yX2luaXRfcHJp dmFjeV9zY3JlZW5fcHJvcGVydHkpOwo+ID4gPiA+ICsKPiA+ID4gPiAgLyoqCj4gPiA+ID4gICAq IGRybV9tb2RlX3B1dF90aWxlX2dyb3VwIC0gZHJvcCBhIHJlZmVyZW5jZSB0byBhIHRpbGUgZ3Jv dXAuCj4gPiA+ID4gICAqIEBkZXY6IERSTSBkZXZpY2UKPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL2RybV9wcml2YWN5X3NjcmVlbi5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9w cml2YWN5X3NjcmVlbi5jCj4gPiA+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+ID4gPiBpbmRl eCAwMDAwMDAwMDAwMDAuLjFkNjhlOGFhNmM1Zgo+ID4gPiA+IC0tLSAvZGV2L251bGwKPiA+ID4g PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3ByaXZhY3lfc2NyZWVuLmMKPiA+ID4gPiBAQCAt MCwwICsxLDE3NiBAQAo+ID4gPiA+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MC1vci1sYXRlcgo+ID4gPiA+ICsvKgo+ID4gPiA+ICsgKiBEUk0gcHJpdmFjeSBTY3JlZW4gY29k ZQo+ID4gPiA+ICsgKgo+ID4gPiA+ICsgKiBDb3B5cmlnaHQgwqkgMjAxOSBHb29nbGUgSW5jLgo+ ID4gPiA+ICsgKi8KPiA+ID4gPiArCj4gPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+Cj4g PiA+ID4gKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KPiA+ID4gPiArCj4gPiA+ID4gKyNpbmNsdWRl IDxkcm0vZHJtX2Nvbm5lY3Rvci5oPgo+ID4gPiA+ICsjaW5jbHVkZSA8ZHJtL2RybV9kZXZpY2Uu aD4KPiA+ID4gPiArI2luY2x1ZGUgPGRybS9kcm1fcHJpbnQuaD4KPiA+ID4gPiArCj4gPiA+ID4g KyNkZWZpbmUgRFJNX0NPTk5fRFNNX1JFVklEIDEKPiA+ID4gPiArCj4gPiA+ID4gKyNkZWZpbmUg RFJNX0NPTk5fRFNNX0ZOX1BSSVZBQ1lfR0VUX1NUQVRVUyAgIDEKPiA+ID4gPiArI2RlZmluZSBE Uk1fQ09OTl9EU01fRk5fUFJJVkFDWV9FTkFCTEUgICAgICAgICAgICAgICAyCj4gPiA+ID4gKyNk ZWZpbmUgRFJNX0NPTk5fRFNNX0ZOX1BSSVZBQ1lfRElTQUJMRSAgICAgICAgICAgICAgMwo+ID4g PiA+ICsKPiA+ID4gPiArc3RhdGljIGNvbnN0IGd1aWRfdCBkcm1fY29ubl9kc21fZ3VpZCA9Cj4g PiA+ID4gKyAgICAgR1VJRF9JTklUKDB4QzcwMzMxMTMsIDB4ODcyMCwgMHg0Q0VCLAo+ID4gPiA+ ICsgICAgICAgICAgICAgICAweDkwLCAweDkwLCAweDlELCAweDUyLCAweEIzLCAweEU1LCAweDJE LCAweDczKTsKPiA+ID4gPiArCj4gPiA+ID4gKy8qCj4gPiA+ID4gKyAqIE1ha2VzIF9EU00gY2Fs bCB0byBzZXQgcHJpdmFjeSBzY3JlZW4gc3RhdHVzIG9yIGdldCBwcml2YWN5IHNjcmVlbi4gUmV0 dXJuCj4gPiA+ID4gKyAqIHZhbHVlIG1hdHRlcnMgb25seSBmb3IgUFJJVkFDWV9HRVRfU1RBVFVT IGNhc2UuIFJldHVybnMgMCBpZiBkaXNhYmxlZCwgMSBpZgo+ID4gPiA+ICsgKiBlbmFibGVkLgo+ ID4gPiA+ICsgKi8KPiA+ID4gPiArc3RhdGljIGludCBhY3BpX3ByaXZhY3lfc2NyZWVuX2NhbGxf ZHNtKGFjcGlfaGFuZGxlIGNvbm5faGFuZGxlLCB1NjQgZnVuYykKPiA+ID4gPiArewo+ID4gPiA+ ICsgICAgIHVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7Cj4gPiA+ID4gKyAgICAgaW50IHJldCA9IDA7 Cj4gPiA+ID4gKwo+ID4gPiA+ICsgICAgIG9iaiA9IGFjcGlfZXZhbHVhdGVfZHNtKGNvbm5faGFu ZGxlLCAmZHJtX2Nvbm5fZHNtX2d1aWQsCj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgRFJNX0NPTk5fRFNNX1JFVklELCBmdW5jLCBOVUxMKTsKPiA+ID4gPiArICAgICBpZiAo IW9iaikgewo+ID4gPiA+ICsgICAgICAgICAgICAgRFJNX0RFQlVHX0RSSVZFUigiZmFpbGVkIHRv IGV2YWx1YXRlIF9EU00gZm9yIGZuICVsbHhcbiIsIGZ1bmMpOwo+ID4gPiA+ICsgICAgICAgICAg ICAgLyogQ2FuJ3QgZG8gbXVjaC4gRm9yIGdldF92YWwsIGFzc3VtZSBwcml2YWN5X3NjcmVlbiBk aXNhYmxlZCAqLwo+ID4gPiA+ICsgICAgICAgICAgICAgZ290byBkb25lOwo+ID4gPiA+ICsgICAg IH0KPiA+ID4gPiArCj4gPiA+ID4gKyAgICAgaWYgKGZ1bmMgPT0gRFJNX0NPTk5fRFNNX0ZOX1BS SVZBQ1lfR0VUX1NUQVRVUyAmJgo+ID4gPiA+ICsgICAgICAgICBvYmotPnR5cGUgPT0gQUNQSV9U WVBFX0lOVEVHRVIpCj4gPiA+ID4gKyAgICAgICAgICAgICByZXQgPSAhIW9iai0+aW50ZWdlci52 YWx1ZTsKPiA+ID4gPiArZG9uZToKPiA+ID4gPiArICAgICBBQ1BJX0ZSRUUob2JqKTsKPiA+ID4g PiArICAgICByZXR1cm4gcmV0Owo+ID4gPiA+ICt9Cj4gPiA+ID4gKwo+ID4gPiA+ICt2b2lkIGRy bV9wcml2YWN5X3NjcmVlbl9zZXRfdmFsKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3Is Cj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gZHJtX3ByaXZhY3lf c2NyZWVuIHZhbCkKPiA+ID4gPiArewo+ID4gPiA+ICsgICAgIGFjcGlfaGFuZGxlIGFjcGlfaGFu ZGxlID0gY29ubmVjdG9yLT5wcml2YWN5X3NjcmVlbl9oYW5kbGU7Cj4gPiA+ID4gKwo+ID4gPiA+ ICsgICAgIGlmICghYWNwaV9oYW5kbGUpCj4gPiA+ID4gKyAgICAgICAgICAgICByZXR1cm47Cj4g PiA+ID4gKwo+ID4gPiA+ICsgICAgIGlmICh2YWwgPT0gRFJNX1BSSVZBQ1lfU0NSRUVOX0RJU0FC TEVEKQo+ID4gPiA+ICsgICAgICAgICAgICAgYWNwaV9wcml2YWN5X3NjcmVlbl9jYWxsX2RzbShh Y3BpX2hhbmRsZSwKPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgRFJNX0NPTk5fRFNNX0ZOX1BSSVZBQ1lfRElTQUJMRSk7Cj4gPiA+ID4gKyAgICAgZWxz ZSBpZiAodmFsID09IERSTV9QUklWQUNZX1NDUkVFTl9FTkFCTEVEKQo+ID4gPiA+ICsgICAgICAg ICAgICAgYWNwaV9wcml2YWN5X3NjcmVlbl9jYWxsX2RzbShhY3BpX2hhbmRsZSwKPiA+ID4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJNX0NPTk5fRFNNX0ZO X1BSSVZBQ1lfRU5BQkxFKTsKPiA+ID4gPiArfQo+ID4gPiA+ICsKPiA+ID4gPiArZW51bSBkcm1f cHJpdmFjeV9zY3JlZW4gZHJtX3ByaXZhY3lfc2NyZWVuX2dldF92YWwoc3RydWN0IGRybV9jb25u ZWN0b3IKPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKmNvbm5lY3RvcikKPiA+ID4gPiArewo+ID4gPiA+ICsgICAgIGFjcGlfaGFuZGxlIGFj cGlfaGFuZGxlID0gY29ubmVjdG9yLT5wcml2YWN5X3NjcmVlbl9oYW5kbGU7Cj4gPiA+ID4gKwo+ ID4gPiA+ICsgICAgIGlmIChhY3BpX2hhbmRsZSAmJgo+ID4gPiA+ICsgICAgICAgICBhY3BpX3By aXZhY3lfc2NyZWVuX2NhbGxfZHNtKGFjcGlfaGFuZGxlLAo+ID4gPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIERSTV9DT05OX0RTTV9GTl9QUklWQUNZX0dFVF9TVEFU VVMpKQo+ID4gPiA+ICsgICAgICAgICAgICAgcmV0dXJuIERSTV9QUklWQUNZX1NDUkVFTl9FTkFC TEVEOwo+ID4gPiA+ICsKPiA+ID4gPiArICAgICByZXR1cm4gRFJNX1BSSVZBQ1lfU0NSRUVOX0RJ U0FCTEVEOwo+ID4gPiA+ICt9Cj4gPiA+ID4gKwo+ID4gPiA+ICsvKgo+ID4gPiA+ICsgKiBTZWUg QUNQSSBTcGVjIHY2LjMsIFRhYmxlIEItMiwgIkRpc3BsYXkgVHlwZSIgZm9yIGRldGFpbHMuCj4g PiA+ID4gKyAqIEluIHNob3J0LCB0aGVzZSBtYWNyb3MgZGVmaW5lIHRoZSBiYXNlIF9BRFIgdmFs dWVzIGZvciBBQ1BJIG5vZGVzCj4gPiA+ID4gKyAqLwo+ID4gPiA+ICsjZGVmaW5lIEFDUElfQkFT RV9BRFJfRk9SX09USEVSUyAgICAgKDBVTEwgPDwgOCkKPiA+ID4gPiArI2RlZmluZSBBQ1BJX0JB U0VfQURSX0ZPUl9WR0EgICAgICAgICAgICAgICAgKDFVTEwgPDwgOCkKPiA+ID4gPiArI2RlZmlu ZSBBQ1BJX0JBU0VfQURSX0ZPUl9UViAgICAgICAgICgyVUxMIDw8IDgpCj4gPiA+ID4gKyNkZWZp bmUgQUNQSV9CQVNFX0FEUl9GT1JfRVhUX01PTiAgICAoM1VMTCA8PCA4KQo+ID4gPiA+ICsjZGVm aW5lIEFDUElfQkFTRV9BRFJfRk9SX0lOVEVHUkFURUQgKDRVTEwgPDwgOCkKPiA+ID4gPiArCj4g PiA+ID4gKyNkZWZpbmUgQUNQSV9ERVZJQ0VfSURfU0NIRU1FICAgICAgICAgICAgICAgICgxVUxM IDw8IDMxKQo+ID4gPiA+ICsjZGVmaW5lIEFDUElfRklSTVdBUkVfQ0FOX0RFVEVDVCAgICAgKDFV TEwgPDwgMTYpCj4gPiA+ID4gKwo+ID4gPiA+ICsvKgo+ID4gPiA+ICsgKiBSZWY6IEFDUEkgU3Bl YyA2LjMKPiA+ID4gPiArICogaHR0cHM6Ly91ZWZpLm9yZy9zaXRlcy9kZWZhdWx0L2ZpbGVzL3Jl c291cmNlcy9BQ1BJXzZfM19maW5hbF9KYW4zMC5wZGYKPiA+ID4gPiArICogUGFnZXMgMTExOSAt IDExMjMgZGVzY3JpYmUsIHdoYXQgSSBiZWxpZXZlLCBhIHN0YW5kYXJkIHdheSBvZgo+ID4gPiA+ ICsgKiBpZGVudGlmeWluZyAvIGFkZHJlc3NpbmcgImRpc3BsYXkgcGFuZWxzIiBpbiB0aGUgQUNQ SS4gVGh1cyBpdCBwcm92aWRlcwo+ID4gPiA+ICsgKiBhIHdheSBmb3IgdGhlIEFDUEkgdG8gZGVm aW5lIGRldmljZXMgZm9yIHRoZSBkaXNwbGF5IHBhbmVscyBhdHRhY2hlZAo+ID4gPiA+ICsgKiB0 byB0aGUgc3lzdGVtLiBJdCB0aHVzIHByb3ZpZGVzIGEgd2F5IGZvciB0aGUgQklPUyB0byBleHBv cnQgYW55IHBhbmVsCj4gPiA+ID4gKyAqIHNwZWNpZmljIHByb3BlcnRpZXMgdG8gdGhlIHN5c3Rl bSB2aWEgQUNQSSAobGlrZSBkZXZpY2UgdHJlZXMpLgo+ID4gPiA+ICsgKgo+ID4gPiA+ICsgKiBU aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGxvb2tzIHVwIHRoZSBBQ1BJIG5vZGUgZm9yIGEgY29ubmVj dG9yIGFuZCBsaW5rcwo+ID4gPiA+ICsgKiB0byBpdC4gVGVjaG5pY2FsbHkgaXQgaXMgaW5kZXBl bmRlbnQgZnJvbSB0aGUgcHJpdmFjeV9zY3JlZW4gY29kZSwgYW5kCj4gPiA+ID4gKyAqIGlkZWFs bHkgbWF5IGJlIGNhbGxlZCBmb3IgYWxsIGNvbm5lY3RvcnMuIEl0IGlzIGdlbmVyYWxseSBhIGdv b2QgaWRlYSB0bwo+ID4gPiA+ICsgKiBiZSBhYmxlIHRvIGF0dGFjaCBhbiBBQ1BJIG5vZGUgdG8g ZGVzY3JpYmUgYW55dGhpbmcgaWYgbmVlZGVkLiAoVGhpcyBjYW4KPiA+ID4gPiArICogaGVscCBp biBmdXR1cmUgZm9yIG90aGVyIHBhbmVsIHNwZWNpZmljIGZlYXR1cmVzIG1heWJlKS4gSG93ZXZl ciwgaXQKPiA+ID4gPiArICogbmVlZHMgYSAicG9ydCBpbmRleCIgd2hpY2ggSSBiZWxpZXZlIGlz IHRoZSBpbmRleCB3aXRoaW4gYSBwYXJ0aWN1bGFyCj4gPiA+ID4gKyAqIHR5cGUgb2YgcG9ydCAo UmVmIHRvIHRoZSBwYWdlcyBvZiBzcGVjIG1lbnRpb25lZCBhYm92ZSkuIFRoaXMgcG9ydCBpbmRl eAo+ID4gPiA+ICsgKiB1bmZvcnR1bmF0ZWx5IGlzIG5vdCBhdmFpbGFibGUgaW4gRFJNIGNvZGUs IHNvIGN1cnJlbnRseSBpdHMgY2FsbCBpcwo+ID4gPiA+ICsgKiBvcmlnaW5hdGVkIGZyb20gaTkx NSBkcml2ZXIuCj4gPiA+ID4gKyAqLwo+ID4gPiA+ICtzdGF0aWMgaW50IGRybV9jb25uZWN0b3Jf YXR0YWNoX2FjcGlfbm9kZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ID4gPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBwb3J0X2luZGV4KQo+ ID4gPiA+ICt7Cj4gPiA+ID4gKyAgICAgc3RydWN0IGRldmljZSAqZGV2ID0gJmNvbm5lY3Rvci0+ ZGV2LT5wZGV2LT5kZXY7Cj4gPiA+ID4gKyAgICAgc3RydWN0IGFjcGlfZGV2aWNlICpjb25uX2Rl djsKPiA+ID4gPiArICAgICB1NjQgY29ubl9hZGRyOwo+ID4gPiA+ICsKPiA+ID4gPiArICAgICAv Kgo+ID4gPiA+ICsgICAgICAqIERldGVybWluZSB3aGF0IF9BRFIgdG8gbG9vayBmb3IsIGRlcGVu ZGluZyBvbiBkZXZpY2UgdHlwZSBhbmQKPiA+ID4gPiArICAgICAgKiBwb3J0IG51bWJlci4gUG90 ZW50aWFsbHkgd2Ugb25seSBjYXJlIGFib3V0IHRoZQo+ID4gPiA+ICsgICAgICAqIGVEUCAvIGlu dGVncmF0ZWQgZGlzcGxheXM/Cj4gPiA+ID4gKyAgICAgICovCj4gPiA+ID4gKyAgICAgc3dpdGNo IChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlKSB7Cj4gPiA+ID4gKyAgICAgY2FzZSBEUk1fTU9E RV9DT05ORUNUT1JfZURQOgo+ID4gPiA+ICsgICAgICAgICAgICAgY29ubl9hZGRyID0gQUNQSV9C QVNFX0FEUl9GT1JfSU5URUdSQVRFRCArIHBvcnRfaW5kZXg7Cj4gPiA+ID4gKyAgICAgICAgICAg ICBicmVhazsKPiA+ID4gPiArICAgICBjYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9WR0E6Cj4gPiA+ ID4gKyAgICAgICAgICAgICBjb25uX2FkZHIgPSBBQ1BJX0JBU0VfQURSX0ZPUl9WR0EgKyBwb3J0 X2luZGV4Owo+ID4gPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiA+ID4gKyAgICAgY2FzZSBE Uk1fTU9ERV9DT05ORUNUT1JfVFY6Cj4gPiA+ID4gKyAgICAgICAgICAgICBjb25uX2FkZHIgPSBB Q1BJX0JBU0VfQURSX0ZPUl9UViArIHBvcnRfaW5kZXg7Cj4gPiA+ID4gKyAgICAgICAgICAgICBi cmVhazsKPiA+ID4gPiArICAgICBjYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydDoK PiA+ID4gPiArICAgICAgICAgICAgIGNvbm5fYWRkciA9IEFDUElfQkFTRV9BRFJfRk9SX0VYVF9N T04gKyBwb3J0X2luZGV4Owo+ID4gPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiA+ID4gKyAg ICAgZGVmYXVsdDoKPiA+ID4gPiArICAgICAgICAgICAgIHJldHVybiAtRU5PVFNVUFA7Cj4gPiA+ ID4gKyAgICAgfQo+ID4gPiA+ICsKPiA+ID4gPiArICAgICBjb25uX2FkZHIgfD0gQUNQSV9ERVZJ Q0VfSURfU0NIRU1FOwo+ID4gPiA+ICsgICAgIGNvbm5fYWRkciB8PSBBQ1BJX0ZJUk1XQVJFX0NB Tl9ERVRFQ1Q7Cj4gPiA+ID4gKwo+ID4gPiA+ICsgICAgIERSTV9ERVZfREVCVUcoZGV2LCAiJXM6 IEZpbmRpbmcgZHJtX2Nvbm5lY3RvciBBQ1BJIG5vZGUgYXQgX0FEUj0lbGxYXG4iLAo+ID4gPiA+ ICsgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvbm5fYWRkcik7Cj4gPiA+ID4gKwo+ID4g PiA+ICsgICAgIC8qIExvb2sgdXAgdGhlIGNvbm5lY3RvciBkZXZpY2UsIHVuZGVyIHRoZSBQQ0kg ZGV2aWNlICovCj4gPiA+ID4gKyAgICAgY29ubl9kZXYgPSBhY3BpX2ZpbmRfY2hpbGRfZGV2aWNl KEFDUElfQ09NUEFOSU9OKGRldiksCj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGNvbm5fYWRkciwgZmFsc2UpOwo+ID4gPiA+ICsgICAgIGlmICghY29ubl9k ZXYpCj4gPiA+ID4gKyAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKPiA+ID4gPiArCj4gPiA+ ID4gKyAgICAgY29ubmVjdG9yLT5wcml2YWN5X3NjcmVlbl9oYW5kbGUgPSBjb25uX2Rldi0+aGFu ZGxlOwo+ID4gPiA+ICsgICAgIHJldHVybiAwOwo+ID4gPiA+ICt9Cj4gPiA+ID4gKwo+ID4gPiA+ ICtib29sIGRybV9wcml2YWN5X3NjcmVlbl9wcmVzZW50KHN0cnVjdCBkcm1fY29ubmVjdG9yICpj b25uZWN0b3IsIHU4IHBvcnRfaW5kZXgpCj4gPiA+Cj4gPiA+IFRoaXMgaXMgdGhlIG1haW4gcGFy dCB0aGF0IEkgdGhpbmsgaXMgYSBsaXR0bGUgdGFuZ2xlZC4gVGhpcyBpcyBhIHZlcnkKPiA+ID4g c3BlY2lmaWMgaW1wbGVtZW50YXRpb24gdGhhdCBoaWRlcyBpbiBhIGdlbmVyaWMgQVBJLgo+ID4K PiA+IEkgYWdyZWUgdGhhdCB0aGlzIGlzIGFuIEFDUEkgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24s IGJ1dCBvdGhlciB0aGFuCj4gPiB0aGF0LCBJIHRoaW5rIGl0IGRvZXMgbm90IGhhdmUgYW55IGRy aXZlciBzcGVjaWZpYyBkZXRhaWxzLiBNb3JlCj4gPiBkZXRhaWxlZCB0aG91Z2h0cyBvbiB0aGlz IGJlbG93Lgo+Cj4gV2VsbCwgdGhlIHBvcnRfaW5kZXgga2luZCBvZiB0aWVzIHRoaXMgdG8gaTkx NSBiZWNhdXNlIHRoYXQgdXNlcyB0aGlzCj4gY29uY2VwdC4gT3RoZXIgZHJpdmVycyBtYXkgbm90 Lgo+Cj4gQWxzbywgSSdtIHdvbmRlcmluZyBpZiB5b3UgY291bGRuJ3Qgc29tZWhvdyBkZXJpdmUg dGhlIHBvcnRfaW5kZXggZnJvbQo+IHRoZSBjb25uZWN0b3IuIElmIGFsbCB0aGlzIGRvZXMgaXMg dG8gZmluZCBhbiBBQ1BJIG5vZGUgY29ycmVzcG9uZGluZyB0bwo+IGEgY29ubmVjdG9yLCBzaG91 bGRuJ3QgdGhlIGNvbm5lY3RvciByZWFsbHkgYmUgYWxsIHRoYXQgeW91IG5lZWQ/CgpZZWFoIHBv cnQgc2hvdWxkIGJlIHN0b3JlZCBhbHJlYWR5IHBsZW50eSBvZiB0aW1lcyBpbiBpOTE1IGNvbm5l Y3RvciBzdHJ1Y3RzLgoKPiA+ID4gSSB3ZSBzdG9yZSB0aGUgcHJpdmFjeSBzZXR0aW5nIGluIHRo ZSBhdG9taWMgc3RhdGUsIHRoZXJlIGlzbid0IHJlYWxseSBhCj4gPiA+IHJlYXNvbiB0byBzdG9y ZSB0aGUgcHJpdmFjeSBoYW5kbGUgaW4gdGhlIGNvbm5lY3Rvci4gSW5zdGVhZCBpdCBjb3VsZCBi ZQo+ID4gPiBzaW1wbHkgc3RvcmVkIGluIHRoZSBkcml2ZXIgdGhhdCBzdXBwb3J0cyB0aGlzLgo+ ID4gPgo+ID4gPiBJZGVhbGx5IEkgdGhpbmsgd2UnZCBoYXZlIGEgdmVyeSBzbWFsbCBkcm1fcHJp dmFjeV9zY3JlZW4gb2JqZWN0IHR5cGUKPiA+ID4gdGhhdCB3b3VsZCBqdXN0IHdyYXAgdGhpcywg YnV0IHBlcmhhcHMgd2UgZG9uJ3QgbmVlZCB0aGF0IHJpZ2h0IGF3YXksCj4gPiA+IGdpdmVuIHRo YXQgd2Ugb25seSBoYXZlIGEgc2luZ2xlIGltcGxlbWVudGF0aW9uIHNvIGZhci4KPiA+Cj4gPiBZ ZXMsIGFncmVlZC4KPiA+Cj4gPiA+Cj4gPiA+IEhvd2V2ZXIsIEkgdGhpbmsgaWYgd2UganVzdCBw dXNoZWQgdGhpcyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBpbnRvIHRoZQo+ID4gPiBkcml2ZXJz IHRoYXQnZCBoZWxwIHBhdmUgdGhlIHdheSBmb3Igc29tZXRoaW5nIG1vcmUgZ2VuZXJpYyBsYXRl ciBvbgo+ID4gPiB3aXRob3V0IGEgbG90IG9mIGV4dHJhIHdvcmsgdXAgZnJvbnQuCj4gPiA+Cj4g PiA+IEZvciBleGFtcGxlIHlvdSBjb3VsZCB0dXJuIHRoZSBkcm1fY29ubmVjdG9yX2F0dGFjaF9h Y3BpX25vZGUoKSBpbnRvIGEKPiA+ID4gaGVscGVyIHRoYXQgc2ltcGx5IHJldHVybnMgdGhlIEFD UEkgaGFuZGxlLCBzb21ldGhpbmcgbGlrZSB0aGlzIHBlcmhhcHM6Cj4gPiA+Cj4gPiA+ICAgICAg ICAgc3RydWN0IGFjcGlfaGFuZGxlICpkcm1fYWNwaV9maW5kX3ByaXZhY3lfc2NyZWVuKHN0cnVj dCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwb3J0KQo+ID4g PiAgICAgICAgIHsKPiA+ID4gICAgICAgICAgICAgICAgIC4uLgo+ID4gPiAgICAgICAgIH0KPiA+ Cj4gPiBZZXMsIEkgbGlrZSB0aGF0IGlkZWEgb2YgbWFraW5nIGl0IGEgaGVscGVyIGZ1bmN0aW9u LiBJbiBmYWN0LCBmaW5kaW5nCj4gPiBhbiBBQ1BJIG5vZGUgZm9yIHRoZSBjb25uZWN0b3IgZG9l c24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIHdpdGgKPiA+IHByaXZhY3kgc2NyZWVuIChzbyBpdCBj YW4gYmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYWxzbywgaW4gZnV0dXJlKS4KPgo+IExvb2tz IGxpa2UgSSBtaXN1bmRlcnN0b29kIHRoZSBwdXJwb3NlIG9mIHRoYXQgZnVuY3Rpb24uIFlvdSBz dG9yZSB0aGUKPiBBQ1BJIGhhbmRsZSBhcyBjb25uZWN0b3ItPnByaXZhY3lfc2NyZWVuX2hhbmRs ZSwgc28gSSB3YXMgYXNzdW1pbmcgdGhhdAo+IGl0IHdhcyBnZXR0aW5nIGFuIEFDUEkgaGFuZGxl IGZvciBzb21lIHByaXZhY3kgc2NyZWVuIHN1YmRldmljZS4KPgo+ID4gPiBUaGF0IHRoZSBpOTE1 IGRyaXZlciB3b3VsZCB0aGVuIGNhbGwgYW5kIHN0b3JlIHRoZSByZXR1cm5lZCB2YWx1ZQo+ID4g PiBpbnRlcm5hbGx5LiBXaGVuIGl0IGNvbW1pdHMgdGhlIGF0b21pYyBzdGF0ZSBmb3IgdGhlIGNv bm5lY3RvciBpdCBjYW4KPiA+ID4gdGhlbiBjYWxsIHRoZSBkcm1fYWNwaV9zZXRfcHJpdmFjeSgp IChJIHRoaW5rIHRoYXQnZCBiZSBhIGJldHRlciBuYW1lCj4gPiA+IGZvciB5b3VyIGRybV9wcml2 YWN5X3NjcmVlbl9zZXRfdmFsKCkpIGJ5IHBhc3NpbmcgdGhhdCBoYW5kbGUgYW5kIHRoZQo+ID4g PiB2YWx1ZSBmcm9tIHRoZSBhdG9taWMgc3RhdGUuCj4gPiA+Cj4gPiA+IFRoZSBhYm92ZSBoYXMg dGhlIGFkdmFudGFnZSB0aGF0IHdlIGRvbid0IGNsdXR0ZXIgdGhlIGdlbmVyaWMgY29yZSB3aXRo Cj4gPiA+IHNvbWV0aGluZyB0aGF0J3Mgbm90IGF0IGFsbCBnZW5lcmljLiBJZiBldmVudHVhbGx5 IHdlIHNlZSB0aGF0IHRoZXNlCj4gPiA+IHR5cGVzIG9mIHByaXZhY3kgc2NyZWVucyBhcmUgaW1w bGVtZW50ZWQgaW4gbW9yZSBkZXZpY2Ugd2UgY2FuIGFsd2F5cwo+ID4gPiByZWZhY3RvciB0aGlz IGludG8gc29tZXRoaW5nIHJlYWxseSBnZW5lcmljIGFuZCBtYXliZSBldmVuIGRlY2lkZSB0byBw dXQKPiA+ID4gaXQgaW50byB0aGUgZHJtX2Nvbm5lY3RvciBkaXJlY3RseS4KPiA+Cj4gPiBUaGlz IGlzIHdoZXJlIEkgdGhpbmsgSSdtIGluIHNsaWdodCBkaXNhZ3JlZW1lbnQuIEkgdGhpbmsgdGhl Cj4gPiBmdW5jdGlvbmFsaXR5IHdlJ3JlIGFkZGluZyBpcyBzdGlsbCAiZ2VuZXJpYyIsIGp1c3Qg dGhhdCB0aGUgb25seQo+ID4gaGFyZHdhcmUgKkkgaGF2ZSB0b2RheSogdG8gdGVzdCBpcyB1c2lu ZyBJbnRlbCBlRFAgcG9ydHMuIEJ1dCBJIGRvbid0Cj4gPiBzZWUgd2h5IEFNRCBDUFUgbGFwdG9w cyBjYW4ndCBoYXZlIGl0IChGb3IgRS5nLiBIUCdzIEVsaXRlYm9vayA3NDUgRzUKPiA+IHNlZW1z IHRvIHVzZSBBTUQgYW5kIGhhcyBpbnRlZ3JhdGVkIHByaXZhY3kgc2NyZWVuIGZlYXR1cmUKPiA+ IGh0dHA6Ly93d3c4LmhwLmNvbS9oMjAxOTUvVjIvR2V0UERGLmFzcHgvNGFhNy0yODAyZWVlKSAu Cj4gPiBNeSB3b3JyeSBpcyB0aGF0IGlmIHdlIGRvbid0IG1ha2UgaXQgZ2VuZXJpYyB0b2RheSwg d2UgbWlnaHQgc2VlCj4gPiBkdXBsaWNhdGUgLyBzaW1pbGFyLWJ1dC1kaWZmZXJlbnQgLyBkaWZm ZXJlbnQgd2F5cyBvZiB0aGlzIGluIG90aGVyCj4gPiBwbGFjZXMgKGUuZy4gaHR0cHM6Ly9naXQu a2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdG9ydmFsZHMvbGludXguZ2l0L2Nv bW1pdC8/aWQ9MTEwZWExZDgzM2FkKQo+ID4gYmVjYXVzZSB1bmxlc3MgaXQgaXMgZ2VuZXJpYyB0 byBzdGFydCB3aXRoLCBpdCBpcyBkaWZmaWN1bHQgZm9yIHNvbWUKPiA+IG9uZSB0byBjaGFuZ2Ug bGF0ZXIgZm9yIHRoZSBmZWFyIG9mIGJyZWFraW5nIGhhcmR3YXJlIHRoYXQgaXMgYWxyZWFkeQo+ ID4gaW4gbWFya2V0IGdpdmVuIHRoYXQKPiA+ICAqIGhhcmR3YXJlIG1heSBub3QgYmUgYXZhaWxh YmxlIHRvIG5ldyBkZXZlbG9wZXIgdG8gdGVzdCBmb3IKPiA+IHJlZ3Jlc3Npb25zIChhbHNvIHRo ZXJlIGlzIHZlcnkgbGl0dGxlIG1vdGl2YXRpb24gdG8gY2hlY2sgYW55Cj4gPiBoYXJkd2FyZSBv dGhlciB0aGFuIHlvdXIgb3duKS4KPiA+ICAqIHNwZWNpYWxseSBmb3IgYSBjb2RlIHRoYXQgcmVs aWVzIG9uIGZpcm13YXJlIEFDUEkgKGZpcm13YXJlCj4gPiB1cGdyYWRlcyBpbiBmaWVsZCBhcmUg YWx3YXlzIGNvc3RseSkuCj4gPgo+ID4gTXkgdW5kZXJzdGFuZGluZyBpcyB0aGF0IHdlJ3JlIGFk ZGluZyAyIGZ1bmN0aW9uYWxpdGllcyBoZXJlOgo+ID4KPiA+IDEpIElkZW50aWZ5IGFuZCBBdHRh Y2ggQUNQSSBub2RlIHRvIERSTSBjb25uZWN0b3IuIFNpbmNlIHRoaXMgaXMKPiA+IGZvbGxvd2lu ZyBBQ1BJIHNwZWMsIEkgdGhpbmsgdGhpcyBpcyAgZ2VuZXJpYyBlbm91Z2guCj4KPiBJdCdzIHBy b2JhYmx5IHdvcnRoIG1ha2luZyB0aGlzIGEgc2VwYXJhdGUgcGF0Y2ggaW4gdGhhdCBjYXNlLiBJ ZiB0aGUKPiBBQ1BJIGhhbmRsZSByZWFsbHkgcmVwcmVzZW50cyB0aGUgY29ubmVjdG9yIGl0c2Vs ZiwgdGhlbiBpdCBzZWVtcyBmaW5lCj4gdG8gc3RvcmUgaXQgaW4gdGhlIGNvbm5lY3Rvci4gQnV0 IGl0IHNob3VsZG4ndCBiZSBjYWxsZWQgcHJpdmFjeV9zY3JlZW4KPiBpbiB0aGF0IGNhc2UuCgpQ cm9iYWJseSBzdGlsbCBzaG91bGQgYmUgaW4gaTkxNS4gV2UgaGF2ZSBhIGZldyBmaXJtd2FyZSBo YW5kbGUgdGhpbmdzCmluIHRoZXJlIGFscmVhZHkuIElmIG90aGVyIGRyaXZlcnMgbmVlZCB0aGlz LCB3ZSBjb3VsZCBtYWtlIGFuIGFjcGkKaGVscGVyIGxpYnJhcnkgdGhhdCBkcml2ZXJzIGNhbiBj YWxsIHRvIGZpbmQgdGhlIHJpZ2h0IGFjcGkgaGFuZGxlIGZvcgp0aGVpciBjb25uZWN0b3IuCgo+ ID4gMikgVXNlIEFDUEkgX0RTTSBtdGhvZHMgdG8gaWRlbnRpZnkgc2NyZWVuLCBzZXQgYW5kIGdl dCB2YWx1ZXMuIFRoaXMKPiA+IGlzIHdoZXJlIEkgdGhpbmsgd2UncmUgc2V0dGluZyAoZ2VuZXJp YykgZXhwZWN0YXRpb25zIGZvciB0aGUgQUNQSQo+ID4gbWV0aG9kcyBpbiBob3cgdGhleSBzaG91 bGQgYmVoYXZlIGlmIEFDUEkgaXMgdG8gYmUgdXNlZCB0byBjb250cm9sCj4gPiBwcml2YWN5IHNj cmVlbi4gSWYgd2UgcHV0IHRoaXMgaW4gZ2VuZXJpYyBjb2RlIHRvZGF5LCBmdXR1cmUKPiA+IGRl dmVsb3BlcnMgY2FuIGxvb2sgYXQgdGhpcyB0byB1bmRlcnN0YW5kIGhvdyB0aGVpciBBQ1BJIGZv ciBuZXcKPiA+IHBsYXRmb3JtcyBpcyB0byBiZWhhdmUgaWYgdGhleSB3YW50IHRvIHVzZSB0aGlz IGdlbmVyaWMgY29kZS4gSWYgd2UKPiA+IHB1dCBpdCBpbiBpOTE1IHNwZWNpZmljIGNvZGUsIHRo aXMgd2lsbCBiZSBzZWVuIGFzIGRyaXZlciBzcGVjaWZpYwo+ID4gYmVoYXZpb3IgYW5kIGRldmVs b3BlcnMgbWF5IGNob29zZSBzb21lIG90aGVyIGJlaGF2aW9yIGluIHRoZWlyCj4gPiBkcml2ZXIu Cj4KPiBJIHRoaW5rIGl0J3MgZmluZSB0byBwdXQgdGhpcyBmdW5jdGlvbmFsaXR5IGludG8gZ2Vu ZXJpYyBjb2RlLiBXaGF0IEkKPiBkb24ndCB0aGluayBpcyBnb29kIHRvIGRvIGlzIHRvIGhhdmUg dGhpcyBjb2RlIGNhbGxlZCBmcm9tIGdlbmVyaWMgY29kZS4KPiBJdCdzIG9wdC1pbiBmdW5jdGlv bmFsaXR5IHRoYXQgZHJpdmVycyBzaG91bGQgY2FsbCBpZiB0aGV5IGtub3cgdGhhdCB0aGUKPiBj b25uZWN0b3IgaGFzIGFuIGFzc29jaWF0ZWQgQUNQSSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCBm b3IgcHJpdmFjeQo+IHNjcmVlbiBjb250cm9sLgo+Cj4gQWZ0ZXIgcmVhZGluZyB0aGUgcGF0Y2gg YWdhaW4gYW5kIHJlYWxpemluZyB0aGF0IHlvdSdyZSBub3QgYWN0dWFsbHkKPiBkZWFsaW5nIHdp dGggYW4gQUNQSSBoYW5kbGUgdG8gdGhlIHByaXZhY3kgc2NyZWVuIGRpcmVjdGx5IGJ1dCBvbmUg Zm9yCj4gdGhlIGNvbm5lY3RvciwgSSB0aGluayB0aGlzIGlzIG9rYXkuIFlvdSBkbyBpbiBmYWN0 IGNhbGwgaW50byB0aGlzIGZyb20KPiB0aGUgaTkxNSBvbmx5LiBJIHN0aWxsIGRvbid0IHRoaW5r IHRoZSBuYW1pbmcgaXMgZ3JlYXQsIGFuZCBpdCdkIGJlIG5pY2UKPiB0byBzZWUgQUNQSSBhcyBw YXJ0IG9mIHRoZSBmdW5jdGlvbiBuYW1lIHRvIG1ha2UgdGhhdCBleHBsaWNpdC4gV2UgY291bGQK PiBhbHdheXMgYWRkcmVzcyB0aGF0IGF0IGEgbGF0ZXIgcG9pbnQsIGJ1dCBtYXkgYXMgd2VsbCBk byBpdCByaWdodCBmcm9tCj4gdGhlIHN0YXJ0Lgo+Cj4gPiBJIGFncmVlIHRoYXQgdGhlIGZ1bmN0 aW9uYWxpdHkgd2UncmUgYWRkaW5nIGlzIEFDUEkgc3BlY2lmaWMgKHRvZGF5IC0KPiA+IGJ1dCBj YW4gYmUgZXh0ZW5kZWQgdG8gZ3BpbyBpbiBmdXR1cmUgZm9yIG5vbiB4ODYgcGxhdGZvcm1zKSwg YnV0IG5vdAo+ID4gbmVjZXNzYXJpbHkgZHJpdmVyIHNwZWNpZmljLiBBY3R1YWxseSB0aGUgb25s eSByZWFzb24sIEkgaGFkIHRvIGNhbGwKPiA+IHRoZSBkcm1fcHJpdmFjeV9zY3JlZW5fcHJlc2Vu dCgpIChhbmQgdGhlCj4gPiBkcm1faW5pdF9wcml2YWN5X3NjcmVlbl9wcm9wZXJ0eSgpKSBmdW5j dGlvbiBmcm9tIGk5MTUgY29kZSBpcyBiZWNhdXNlCj4gPiB3ZSBuZWVkIGEgcG9ydF9pbmRleCB0 byBsb29rdXAgQUNQSSBub2RlLiBJZiB3ZSBoYWQgdGhhdCBhdmFpbGFibGUgaW4KPiA+IGRybSBj b2RlLCB3ZSB3b3VsZG4ndCBuZWVkIHRvIGNhbGwgYW55dGhpbmcgZnJvbSBpOTE1IGF0IGFsbC4K Pgo+IFlvdSdyZSBraW5kIG9mIHByb3ZpbmcgbXkgcG9pbnQgYWJvdXQgdGhpcyBBUEkgYmVpbmcg ZHJpdmVyLXNwZWNpZmljLCBvcgo+IGF0IGxlYXN0IEFDUEkgc3BlY2lmaWMuIE5vbi1BQ1BJIGRl dmljZXMgKG1heWJlIGV2ZW4gbm9uLWk5MTUgZGV2aWNlcz8pCj4gbWF5IG5vdCBoYXZlIGEgY29u Y2VwdCBvZiBhIHBvcnQgaW5kZXguIEVuY29kaW5nIHRoaXMgaW4gdGhlIEFQSSBtYWtlcwo+IHRo ZSBBUEkgbm9uLWdlbmVyaWMuCj4KPiBBcyBJIG1lbnRpb25lZCBhYm92ZSwgaWYgd2UgY291bGQg ZGVyaXZlIHRoZSBwb3J0IGluZGV4IGZyb20gdGhlCj4gY29ubmVjdG9yLCB0aGF0J2QgYmUgbXVj aCBiZXR0ZXIuIENvdWxkIHlvdSBwZXJoYXBzIHVzZSBkcm1fY29ubmVjdG9yJ3MKPiBpbmRleCBm aWVsZD8KPgo+IFVubGVzcyB0aGVyZSdzIGEgd2F5IHRvIHJlbGlhYmx5IGRldGVjdCB0aGlzIHR5 cGUgb2YgZnVuY3Rpb25hbGl0eSBmcm9tCj4gZ2VuZXJpYyBjb2RlLCBJIHRoaW5rIGl0IHNob3Vs ZCBhbHdheXMgYmUgY2FsbGVkIGZyb20gdGhlIGRyaXZlci4KCk1heWJlIHRpbWUgdG8gcGl0Y2gg dGhlIG9sZCBjbGFzc2ljIGFnYWluOgoKaHR0cHM6Ly9ibG9nLmZmd2xsLmNoLzIwMTYvMTIvbWlk bGF5ZXJzLW9uY2UtbW9yZS13aXRoLWZlZWxpbmcuaHRtbAoKRXNwZWNpYWxseSBhbGwgdGhlIGxp bmtzIGluIHRoZSBmaXJzdCBwYXJ0LgoKPiA+IFNvLCBmb3IgdGhlIHJlYXNvbnMgc3RhdGVkIGFi b3ZlLCBJTUhPIGl0IGlzIGJldHRlciB0byByZXRhaW4gdGhpcwo+ID4gZnVuY3Rpb25hbGl0eSBp biBkcm0gY29kZSBpbnN0ZWFkIG9mIGk5MTUgZHJpdmVyLiBCdXQgSSdtIG5ldyB0byB0aGUKPiA+ IGRybSAvIGk5MTUgY29kZSwgYW5kIHdvdWxkIGJlIGhhcHB5IHRvIGNoYW5nZSBteSBjb2RlIGlm IHBlb3BsZSBoYXZlCj4gPiBzdHJvbmcgb3BpbmlvbnMgYWJvdXQgdGhpcy4gTGV0IG1lIGtub3cu Cj4KPiBNYXliZSBJIHdhcyBiZWluZyB1bmNsZWFyLiBJIHdhc24ndCBhcmd1aW5nIHRoYXQgYWxs IHRoZSBjb2RlIHNob3VsZCBiZQo+IG1vdmVkIGludG8gdGhlIGk5MTUgZHJpdmVyLiBBbGwgSSB3 YXMgc2F5aW5nIHRoYXQgaW5zdGVhZCBvZiBzdG9yaW5nIHRoZQo+IEFDUEkgaGFuZGxlIGluc2lk ZSBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvciwgd2Ugc2hvdWxkIG1heWJlIHN0b3JlIGl0IGluc2lkZQo+ IHRoZSBpOTE1IGRyaXZlcidzIGNvbm5lY3RvciBzdHJ1Y3R1cmUuIHN0cnVjdCBkcm1fY29ubmVj dG9yIGlzIGEgdmVyeQo+IGdlbmVyaWMgY29uY2VwdCBhbmQgZWFjaCBhbmQgZXZlcnkgY29ubmVj dG9yIG9iamVjdCBvbiBldmVyeSBwbGF0Zm9ybQo+IHdpbGwgZ2V0IHRoYXQgQUNQSSBoYW5kbGUg cG9pbnRlciBpZiB5b3UgYWRkIGl0IHRoZXJlLiBJIGRvbid0IHRoaW5rIGFuCj4gQUNQSSBoYW5k bGUgYmVsb25ncyB0aGVyZS4gRm9yIGV4YW1wbGUsIG9uIEFSTSBTb0NzIGl0J3MgY29tbW9uIHRv IGhhdmUKPiBjb25uZWN0b3JzIGJlIGJhY2tlZCBieSBhIHN0cnVjdCBkZXZpY2UgKG9yIHN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgbW9yZQo+IHNwZWNpZmljYWxseSkuIEJ1dCB3ZSBkb24ndCBwdXQg dGhhdCBpbmZvcm1hdGlvbiBpbnRvIGRybV9jb25uZWN0b3IKPiBiZWNhdXNlIFBDSSBncmFwaGlj cyBhZGFwdGVycyBkb24ndCBoYXZlIGEgc3RydWN0IGRldmljZSB0aGF0IHJlcHJlc2VudHMKPiB0 aGUgY29ubmVjdG9yLgoKKzEgb24gYWxsIHRoZSBzdHVmZiBUaGllcnJ5IHNheXMgaGVyZSBlc3Nl bnRpYWxseS4KCkNoZWVycywgRGFuaWVsCgo+Cj4gVGhpZXJyeQo+Cj4gPgo+ID4gVGhhbmtzICYg QmVzdCBSZWdhcmRzLAo+ID4KPiA+IFJhamF0Cj4gPgo+ID4gPgo+ID4gPiA+ICt7Cj4gPiA+ID4g KyAgICAgYWNwaV9oYW5kbGUgaGFuZGxlOwo+ID4gPiA+ICsKPiA+ID4gPiArICAgICBpZiAoZHJt X2Nvbm5lY3Rvcl9hdHRhY2hfYWNwaV9ub2RlKGNvbm5lY3RvciwgcG9ydF9pbmRleCkpCj4gPiA+ ID4gKyAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4gPiA+ID4gKwo+ID4gPiA+ICsgICAgIGhh bmRsZSA9IGNvbm5lY3Rvci0+cHJpdmFjeV9zY3JlZW5faGFuZGxlOwo+ID4gPiA+ICsgICAgIGlm ICghYWNwaV9jaGVja19kc20oaGFuZGxlLCAmZHJtX2Nvbm5fZHNtX2d1aWQsCj4gPiA+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICBEUk1fQ09OTl9EU01fUkVWSUQsCj4gPiA+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAxIDw8IERSTV9DT05OX0RTTV9GTl9QUklWQUNZX0dFVF9TVEFU VVMgfAo+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgMSA8PCBEUk1fQ09OTl9EU01f Rk5fUFJJVkFDWV9FTkFCTEUgfAo+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgMSA8 PCBEUk1fQ09OTl9EU01fRk5fUFJJVkFDWV9ESVNBQkxFKSkgewo+ID4gPiA+ICsgICAgICAgICAg ICAgRFJNX1dBUk4oIiVzOiBPZGQsIGNvbm5lY3RvciBBQ1BJIG5vZGUgYnV0IG5vIHByaXZhY3kg c2Nybj9cbiIsCj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3ItPmRldi0+ ZGV2KTsKPiA+ID4gPiArICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKPiA+ID4gPiArICAgICB9 Cj4gPiA+ID4gKyAgICAgRFJNX0RFVl9JTkZPKGNvbm5lY3Rvci0+ZGV2LT5kZXYsICJzdXBwb3J0 cyBwcml2YWN5IHNjcmVlblxuIik7Cj4gPiA+ID4gKyAgICAgcmV0dXJuIHRydWU7Cj4gPiA+ID4g K30KPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRl bF9kcC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kcC5jCj4gPiA+ID4g aW5kZXggNTdlOWYwYmEzMzFiLi4zZmYzOTYyZDI3ZGIgMTAwNjQ0Cj4gPiA+ID4gLS0tIGEvZHJp dmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kcC5jCj4gPiA+ID4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kcC5jCj4gPiA+ID4gQEAgLTM5LDYgKzM5LDcg QEAKPiA+ID4gPiAgI2luY2x1ZGUgPGRybS9kcm1fZHBfaGVscGVyLmg+Cj4gPiA+ID4gICNpbmNs dWRlIDxkcm0vZHJtX2VkaWQuaD4KPiA+ID4gPiAgI2luY2x1ZGUgPGRybS9kcm1faGRjcC5oPgo+ ID4gPiA+ICsjaW5jbHVkZSA8ZHJtL2RybV9wcml2YWN5X3NjcmVlbi5oPgo+ID4gPiA+ICAjaW5j bHVkZSA8ZHJtL2RybV9wcm9iZV9oZWxwZXIuaD4KPiA+ID4gPiAgI2luY2x1ZGUgPGRybS9pOTE1 X2RybS5oPgo+ID4gPiA+Cj4gPiA+ID4gQEAgLTYzNTQsNiArNjM1NSw4IEBAIGludGVsX2RwX2Fk ZF9wcm9wZXJ0aWVzKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAsIHN0cnVjdCBkcm1fY29ubmVj dG9yICpjb25uZWN0Cj4gPiA+ID4KPiA+ID4gPiAgICAgICAgICAgICAgIGNvbm5lY3Rvci0+c3Rh dGUtPnNjYWxpbmdfbW9kZSA9IERSTV9NT0RFX1NDQUxFX0FTUEVDVDsKPiA+ID4gPgo+ID4gPiA+ ICsgICAgICAgICAgICAgaWYgKGRybV9wcml2YWN5X3NjcmVlbl9wcmVzZW50KGNvbm5lY3Rvciwg cG9ydCAtIFBPUlRfQSkpCj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIGRybV9jb25uZWN0 b3JfaW5pdF9wcml2YWN5X3NjcmVlbl9wcm9wZXJ0eShjb25uZWN0b3IpOwo+ID4gPiA+ICAgICAg IH0KPiA+ID4gPiAgfQo+ID4gPiA+Cj4gPiA+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2Ry bV9jb25uZWN0b3IuaCBiL2luY2x1ZGUvZHJtL2RybV9jb25uZWN0b3IuaAo+ID4gPiA+IGluZGV4 IDY4MWNiNTkwZjk1Mi4uNjNiODMxOGJkNjhjIDEwMDY0NAo+ID4gPiA+IC0tLSBhL2luY2x1ZGUv ZHJtL2RybV9jb25uZWN0b3IuaAo+ID4gPiA+ICsrKyBiL2luY2x1ZGUvZHJtL2RybV9jb25uZWN0 b3IuaAo+ID4gPiA+IEBAIC0yMjUsNiArMjI1LDIwIEBAIGVudW0gZHJtX2xpbmtfc3RhdHVzIHsK PiA+ID4gPiAgICAgICBEUk1fTElOS19TVEFUVVNfQkFEID0gRFJNX01PREVfTElOS19TVEFUVVNf QkFELAo+ID4gPiA+ICB9Owo+ID4gPiA+Cj4gPiA+ID4gKy8qKgo+ID4gPiA+ICsgKiBlbnVtIGRy bV9wcml2YWN5X3NjcmVlbiAtIHByaXZhY3lfc2NyZWVuIHN0YXR1cwo+ID4gPiA+ICsgKgo+ID4g PiA+ICsgKiBUaGlzIGVudW0gaXMgdXNlZCB0byB0cmFjayBhbmQgY29udHJvbCB0aGUgc3RhdGUg b2YgdGhlIHByaXZhY3kgc2NyZWVuLgo+ID4gPiA+ICsgKiBUaGVyZSBhcmUgbm8gc2VwYXJhdGUg I2RlZmluZXMgZm9yIHRoZSB1YXBpIQo+ID4gPiA+ICsgKgo+ID4gPiA+ICsgKiBARFJNX1BSSVZB Q1lfU0NSRUVOX0RJU0FCTEVEOiBUaGUgcHJpdmFjeS1zY3JlZW4gb24gdGhlIHBhbmVsIGlzIGRp c2FibGVkCj4gPiA+ID4gKyAqIEBEUk1fUFJJVkFDWV9TQ1JFRU5fRU5BQkxFRDogIFRoZSBwcml2 YWN5LXNjcmVlbiBvbiB0aGUgcGFuZWwgaXMgZW5hYmxlZAo+ID4gPiA+ICsgKi8KPiA+ID4gPiAr ZW51bSBkcm1fcHJpdmFjeV9zY3JlZW4gewo+ID4gPiA+ICsgICAgIERSTV9QUklWQUNZX1NDUkVF Tl9ESVNBQkxFRCA9IDAsCj4gPiA+ID4gKyAgICAgRFJNX1BSSVZBQ1lfU0NSRUVOX0VOQUJMRUQg PSAxLAo+ID4gPiA+ICt9Owo+ID4gPiA+ICsKPiA+ID4KPiA+ID4gU2hvdWxkbid0IHRoaXMgZ28g aW50byBpbmNsdWRlL3VhcGkvZHJtL2RybV9tb2RlLmg/IFRoYXQgd291bGQgaGF2ZSB0aGUKPiA+ ID4gYWR2YW50YWdlIG9mIGdpdmluZyB1c2Vyc3BhY2Ugc3ltYm9saWMgbmFtZXMgdG8gdXNlIHdo ZW4gc2V0dGluZyB0aGUKPiA+ID4gcHJvcGVydHkuCj4gPiA+Cj4gPiA+IE1heWJlIGFsc28gcmVu YW1lIHRoZXNlIHRvIHNvbWV0aGluZyBsaWtlOgo+ID4gPgo+ID4gPiAgICAgICAgICNkZWZpbmUg RFJNX01PREVfUFJJVkFDWV9ESVNBQkxFRCAwCj4gPiA+ICAgICAgICAgI2RlZmluZSBEUk1fTU9E RV9QUklWQUNZX0VOQUJMRUQgMQo+ID4gPgo+ID4gPiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhl ciBwcm9wZXJ0aWVzLgo+ID4gPgo+ID4gPiBUaGllcnJ5Cj4gPiA+Cj4gPiA+ID4gIC8qKgo+ID4g PiA+ICAgKiBlbnVtIGRybV9wYW5lbF9vcmllbnRhdGlvbiAtIHBhbmVsX29yaWVudGF0aW9uIGlu Zm8gZm9yICZkcm1fZGlzcGxheV9pbmZvCj4gPiA+ID4gICAqCj4gPiA+ID4gQEAgLTE0MTAsNiAr MTQyNCw5IEBAIHN0cnVjdCBkcm1fY29ubmVjdG9yIHsKPiA+ID4gPgo+ID4gPiA+ICAgICAgIC8q KiBAaGRyX3NpbmtfbWV0YWRhdGE6IEhEUiBNZXRhZGF0YSBJbmZvcm1hdGlvbiByZWFkIGZyb20g c2luayAqLwo+ID4gPiA+ICAgICAgIHN0cnVjdCBoZHJfc2lua19tZXRhZGF0YSBoZHJfc2lua19t ZXRhZGF0YTsKPiA+ID4gPiArCj4gPiA+ID4gKyAgICAgLyogSGFuZGxlIHVzZWQgYnkgcHJpdmFj eSBzY3JlZW4gY29kZSAqLwo+ID4gPiA+ICsgICAgIHZvaWQgKnByaXZhY3lfc2NyZWVuX2hhbmRs ZTsKPiA+ID4gPiAgfTsKPiA+ID4gPgo+ID4gPiA+ICAjZGVmaW5lIG9ial90b19jb25uZWN0b3Io eCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBkcm1fY29ubmVjdG9yLCBiYXNlKQo+ID4gPiA+IEBA IC0xNTQzLDYgKzE1NjAsNyBAQCBpbnQgZHJtX2Nvbm5lY3Rvcl9pbml0X3BhbmVsX29yaWVudGF0 aW9uX3Byb3BlcnR5KAo+ID4gPiA+ICAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0 b3IsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Cj4gPiA+ID4gIGludCBkcm1fY29ubmVjdG9yX2F0 dGFjaF9tYXhfYnBjX3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4g PiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW4sIGlu dCBtYXgpOwo+ID4gPiA+ICtpbnQgZHJtX2Nvbm5lY3Rvcl9pbml0X3ByaXZhY3lfc2NyZWVuX3By b3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwo+ID4gPiA+Cj4gPiA+ID4g IC8qKgo+ID4gPiA+ICAgKiBzdHJ1Y3QgZHJtX3RpbGVfZ3JvdXAgLSBUaWxlIGdyb3VwIG1ldGFk YXRhCj4gPiA+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9tb2RlX2NvbmZpZy5oIGIv aW5jbHVkZS9kcm0vZHJtX21vZGVfY29uZmlnLmgKPiA+ID4gPiBpbmRleCAzYmNiZTMwMzM5ZjAu LjZkNWQyM2RhOTBkNCAxMDA2NDQKPiA+ID4gPiAtLS0gYS9pbmNsdWRlL2RybS9kcm1fbW9kZV9j b25maWcuaAo+ID4gPiA+ICsrKyBiL2luY2x1ZGUvZHJtL2RybV9tb2RlX2NvbmZpZy5oCj4gPiA+ ID4gQEAgLTgxMyw2ICs4MTMsMTMgQEAgc3RydWN0IGRybV9tb2RlX2NvbmZpZyB7Cj4gPiA+ID4g ICAgICAgICovCj4gPiA+ID4gICAgICAgc3RydWN0IGRybV9wcm9wZXJ0eSAqcGFuZWxfb3JpZW50 YXRpb25fcHJvcGVydHk7Cj4gPiA+ID4KPiA+ID4gPiArICAgICAvKioKPiA+ID4gPiArICAgICAg KiBAcHJpdmFjeV9zY3JlZW5fcHJvcGVydHk6IE9wdGlvbmFsIGNvbm5lY3RvciBwcm9wZXJ0eSB0 byBpbmRpY2F0ZQo+ID4gPiA+ICsgICAgICAqIGFuZCBjb250cm9sIHRoZSBzdGF0ZSAoZW5hYmxl ZCAvIGRpc2FibGVkKSBvZiBwcml2YWN5LXNjcmVlbiBvbiB0aGUKPiA+ID4gPiArICAgICAgKiBw YW5lbCwgaWYgcHJlc2VudC4KPiA+ID4gPiArICAgICAgKi8KPiA+ID4gPiArICAgICBzdHJ1Y3Qg ZHJtX3Byb3BlcnR5ICpwcml2YWN5X3NjcmVlbl9wcm9wZXJ0eTsKPiA+ID4gPiArCj4gPiA+ID4g ICAgICAgLyoqCj4gPiA+ID4gICAgICAgICogQHdyaXRlYmFja19mYl9pZF9wcm9wZXJ0eTogUHJv cGVydHkgZm9yIHdyaXRlYmFjayBjb25uZWN0b3JzLCBzdG9yaW5nCj4gPiA+ID4gICAgICAgICog dGhlIElEIG9mIHRoZSBvdXRwdXQgZnJhbWVidWZmZXIuCj4gPiA+ID4gZGlmZiAtLWdpdCBhL2lu Y2x1ZGUvZHJtL2RybV9wcml2YWN5X3NjcmVlbi5oIGIvaW5jbHVkZS9kcm0vZHJtX3ByaXZhY3lf c2NyZWVuLmgKPiA+ID4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gPiA+IGluZGV4IDAwMDAw MDAwMDAwMC4uYzU4OWJiYzQ3NjU2Cj4gPiA+ID4gLS0tIC9kZXYvbnVsbAo+ID4gPiA+ICsrKyBi L2luY2x1ZGUvZHJtL2RybV9wcml2YWN5X3NjcmVlbi5oCj4gPiA+ID4gQEAgLTAsMCArMSwzMyBA QAo+ID4gPiA+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlciAq Lwo+ID4gPiA+ICsvKgo+ID4gPiA+ICsgKiBDb3B5cmlnaHQgwqkgMjAxOSBHb29nbGUgSW5jLgo+ ID4gPiA+ICsgKi8KPiA+ID4gPiArCj4gPiA+ID4gKyNpZm5kZWYgX19EUk1fUFJJVkFDWV9TQ1JF RU5fSF9fCj4gPiA+ID4gKyNkZWZpbmUgX19EUk1fUFJJVkFDWV9TQ1JFRU5fSF9fCj4gPiA+ID4g Kwo+ID4gPiA+ICsjaWZkZWYgQ09ORklHX0FDUEkKPiA+ID4gPiArYm9vbCBkcm1fcHJpdmFjeV9z Y3JlZW5fcHJlc2VudChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCB1OCBwb3J0KTsK PiA+ID4gPiArdm9pZCBkcm1fcHJpdmFjeV9zY3JlZW5fc2V0X3ZhbChzdHJ1Y3QgZHJtX2Nvbm5l Y3RvciAqY29ubmVjdG9yLAo+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVu dW0gZHJtX3ByaXZhY3lfc2NyZWVuIHZhbCk7Cj4gPiA+ID4gK2VudW0gZHJtX3ByaXZhY3lfc2Ny ZWVuIGRybV9wcml2YWN5X3NjcmVlbl9nZXRfdmFsKHN0cnVjdCBkcm1fY29ubmVjdG9yCj4gPiA+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb25u ZWN0b3IpOwo+ID4gPiA+ICsjZWxzZQo+ID4gPiA+ICtzdGF0aWMgaW5saW5lIGJvb2wgZHJtX3By aXZhY3lfc2NyZWVuX3ByZXNlbnQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiA+ ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IHBvcnQp Cj4gPiA+ID4gK3sKPiA+ID4gPiArICAgICByZXR1cm4gZmFsc2U7Cj4gPiA+ID4gK30KPiA+ID4g PiArCj4gPiA+ID4gK3ZvaWQgZHJtX3ByaXZhY3lfc2NyZWVuX3NldF92YWwoc3RydWN0IGRybV9j b25uZWN0b3IgKmNvbm5lY3RvciwKPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBlbnVtIGRybV9wcml2YWN5X3NjcmVlbiB2YWwpCj4gPiA+ID4gK3sgfQo+ID4gPiA+ICsKPiA+ ID4gPiArZW51bSBkcm1fcHJpdmFjeV9zY3JlZW4gZHJtX3ByaXZhY3lfc2NyZWVuX2dldF92YWwo Cj4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJt X2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ID4gPiA+ICt7Cj4gPiA+ID4gKyAgICAgcmV0dXJuIERS TV9QUklWQUNZX1NDUkVFTl9ESVNBQkxFRDsKPiA+ID4gPiArfQo+ID4gPiA+ICsjZW5kaWYgLyog Q09ORklHX0FDUEkgKi8KPiA+ID4gPiArCj4gPiA+ID4gKyNlbmRpZiAvKiBfX0RSTV9QUklWQUNZ X1NDUkVFTl9IX18gKi8KPiA+ID4gPiAtLQo+ID4gPiA+IDIuMjMuMC44NjYuZ2I4NjliOThkNGMt Z29vZwo+ID4gPiA+CgoKCi0tIApEYW5pZWwgVmV0dGVyClNvZnR3YXJlIEVuZ2luZWVyLCBJbnRl bCBDb3Jwb3JhdGlvbgorNDEgKDApIDc5IDM2NSA1NyA0OCAtIGh0dHA6Ly9ibG9nLmZmd2xsLmNo Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdm eCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xp c3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeA==