From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_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 DBF2CECDE44 for ; Wed, 24 Oct 2018 23:02:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8F7232075D for ; Wed, 24 Oct 2018 23:02:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8F7232075D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727030AbeJYHcV (ORCPT ); Thu, 25 Oct 2018 03:32:21 -0400 Received: from mail-qk1-f194.google.com ([209.85.222.194]:42387 "EHLO mail-qk1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726238AbeJYHcU (ORCPT ); Thu, 25 Oct 2018 03:32:20 -0400 Received: by mail-qk1-f194.google.com with SMTP id u20-v6so4521970qkk.9 for ; Wed, 24 Oct 2018 16:02:19 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:organization:mime-version:content-transfer-encoding; bh=MXL72rO8W4rqRJphwy92sMoYalg1+2LWLd8TUvA1EOg=; b=rXs/qN4Wdrm7rp5zA/g50bwp8lfZOqYl8F4dXzPRkNNHM33175rYyVe5aBtq7QJe2X P+i76Au19pdI+nlU1sz9ACPqNEDWMmvf8TKltiiz90VvprNDqdIQGAvnFt1xFjqJoCwV 0jeNaacvg9v1fjsRcX/j0GsRxfOg8cgyfoIb63BE4hBuaZyckD6p+ogO+eC6tLaw2r+q HDibCcAc2Slyupj1gtIMnfk0RIQHxcS7pPlKov4jbDRmp5SQpbfQyuE4Xcw45whKTW6g dkGMywVNwtgqgWD9nkoZ+4XRis6Q9eYwuXm7wQ9u/K3cdNc6kHrFcc1DcwRaYrzbMwjx 7wcw== X-Gm-Message-State: AGRZ1gKCo1R4SglCuoBgOJ/8oqKnPC40bEwa5RUPkwVAcnP02Sy8ckp4 sKDDnWuRLR7msNpEO8GspsbZuQ== X-Google-Smtp-Source: AJdET5dHcMlooyoP6vHGrEUM8knVDSD0vPoj8iLtYI8EGfQVWu8fatejHZtIZO2G8Y/ysjbqaHrwZw== X-Received: by 2002:ae9:e20b:: with SMTP id c11-v6mr4269762qkc.339.1540422139278; Wed, 24 Oct 2018 16:02:19 -0700 (PDT) Received: from dhcp-10-20-1-11.bss.redhat.com ([144.121.20.162]) by smtp.gmail.com with ESMTPSA id l18-v6sm648245qkl.21.2018.10.24.16.02.18 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 24 Oct 2018 16:02:18 -0700 (PDT) Message-ID: Subject: Re: [RESEND PATCH v2 1/2] drm/dp/mst: Reprobe EDID for MST ports on resume From: Lyude Paul To: Juston Li , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Cc: clinton.a.taylor@intel.com, nathan.d.ciobanu@intel.com, mario.limonciello@dell.com, jared_dominguez@dell.com, linux-kernel@vger.kernel.org, Lyude , stable@vger.kernel.org Date: Wed, 24 Oct 2018 19:02:16 -0400 In-Reply-To: References: <20181024021925.27026-1-juston.li@intel.com> <20181024021925.27026-2-juston.li@intel.com> Organization: Red Hat Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.28.5 (3.28.5-1.fc28) Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Gah, the more I think about this the more I realize this was never the correct approach to begin with. I wrote this patch a long time ago when I wasn't nearly as experienced, so that's not terribly surprising. So: the thing is this isn't actually a problem that's specific to MST. Pretty much all of the different connector types have this issue, since any GPU is going to miss hotplugs if the entire system is in S3. So it doesn't make much sense to have this be in MST helpers; we should just reprobe all of the connectors on the system. Honestly: I think it might just be a better idea to just send a sysfs hotplug when we wake up from suspend/resume, so that userspace just rechecks all of the connectors anyway. Nouveau already does this, jfyi. On Wed, 2018-10-24 at 18:09 -0400, Lyude Paul wrote: > Thought this was going to be an easy review until I realized that there's > multiple problems in nouveau this would cause issues with, even if we didn't > pay attention to the -EINVAL that gets returned. The suspend/resume order in > nouveau needs some fixing up to prevent this patch from causing timeouts, > and > then also there's a hidden surprise > > [ 972.294437] ============================================ > [ 972.295225] WARNING: possible recursive locking detected > [ 972.296042] 4.19.0-rc8mst-reprobe+ #2 Not tainted > [ 972.296842] -------------------------------------------- > [ 972.297614] zsh/6840 is trying to acquire lock: > [ 972.298441] 0000000072e521f7 (&dev->mode_config.mutex){+.+.}, at: > drm_dp_mst_edids_changed+0xc0/0x180 [drm_kms_helper] > [ 972.299299] > but task is already holding lock: > [ 972.300991] 0000000072e521f7 (&dev->mode_config.mutex){+.+.}, at: > status_store+0x34/0x180 [drm] > [ 972.301875] > other info that might help us debug this: > [ 972.303563] Possible unsafe locking scenario: > > [ 972.305315] CPU0 > [ 972.306182] ---- > [ 972.307061] lock(&dev->mode_config.mutex); > [ 972.307943] lock(&dev->mode_config.mutex); > [ 972.308819] > *** DEADLOCK *** > > [ 972.311446] May be due to missing lock nesting notation > > [ 972.313234] 6 locks held by zsh/6840: > [ 972.314135] #0: 0000000092b5ba9d (sb_writers#4){.+.+}, at: > vfs_write+0x13e/0x1a0 > [ 972.315049] #1: 00000000e628e6e9 (&of->mutex){+.+.}, at: > kernfs_fop_write+0xbd/0x1a0 > [ 972.315980] #2: 000000000fb65e6c (kn->count#240){.+.+}, at: > kernfs_fop_write+0xc5/0x1a0 > [ 972.316928] #3: 0000000072e521f7 (&dev->mode_config.mutex){+.+.}, at: > status_store+0x34/0x180 [drm] > [ 972.317892] #4: 00000000344224c2 (crtc_ww_class_acquire){+.+.}, at: > drm_helper_probe_single_connector_modes+0x66/0x6c0 [drm_kms_helper] > [ 972.318863] #5: 00000000d65352e2 (crtc_ww_class_mutex){+.+.}, at: > drm_modeset_lock+0x44/0x110 [drm] > [ 972.319860] > stack backtrace: > [ 972.321800] CPU: 5 PID: 6840 Comm: zsh Kdump: loaded Not tainted 4.19.0- > rc8mst-reprobe+ #2 > [ 972.322772] Hardware name: LENOVO 20EQZ1J7US/20EQZ1J7US, BIOS N1EET80W > (1.53 ) 09/14/2018 > [ 972.323792] Call Trace: > [ 972.324821] dump_stack+0x85/0xc0 > [ 972.325832] __lock_acquire.cold.59+0x158/0x227 > [ 972.326887] ? retint_kernel+0x10/0x10 > [ 972.327918] lock_acquire+0x9e/0x170 > [ 972.328948] ? drm_dp_mst_edids_changed+0xc0/0x180 [drm_kms_helper] > [ 972.329986] ? drm_dp_mst_edids_changed+0xc0/0x180 [drm_kms_helper] > [ 972.331066] __mutex_lock+0x68/0x900 > [ 972.332094] ? drm_dp_mst_edids_changed+0xc0/0x180 [drm_kms_helper] > [ 972.333146] ? __mutex_unlock_slowpath+0x4b/0x2b0 > [ 972.334221] ? drm_dp_mst_edids_changed+0xc0/0x180 [drm_kms_helper] > [ 972.335255] drm_dp_mst_edids_changed+0xc0/0x180 [drm_kms_helper] > [ 972.336318] drm_dp_mst_topology_mgr_resume+0x104/0x190 [drm_kms_helper] > [ 972.337397] nv50_display_init+0x73/0xd0 [nouveau] > [ 972.338483] nouveau_display_init+0x8e/0xe0 [nouveau] > [ 972.339547] nouveau_display_resume+0x39/0x250 [nouveau] > [ 972.340634] ? pci_restore_standard_config+0x40/0x40 > [ 972.341762] nouveau_do_resume+0x79/0x150 [nouveau] > [ 972.342850] nouveau_pmops_runtime_resume+0x88/0x150 [nouveau] > [ 972.343915] pci_pm_runtime_resume+0x78/0xb0 > [ 972.345004] __rpm_callback+0x75/0x1b0 > [ 972.346084] ? pci_restore_standard_config+0x40/0x40 > [ 972.347148] rpm_callback+0x1f/0x70 > [ 972.348256] ? pci_restore_standard_config+0x40/0x40 > [ 972.349351] rpm_resume+0x5d4/0x810 > [ 972.350446] ? drm_modeset_lock+0x44/0x110 [drm] > [ 972.351573] __pm_runtime_resume+0x47/0x70 > [ 972.352737] nouveau_connector_detect+0x373/0x470 [nouveau] > [ 972.353841] ? _cond_resched+0x15/0x30 > [ 972.354945] ? ww_mutex_lock+0x30/0x60 > [ 972.356044] ? drm_modeset_lock+0x44/0x110 [drm] > [ 972.357146] drm_helper_probe_single_connector_modes+0xd9/0x6c0 > [drm_kms_helper] > [ 972.358274] ? printk+0x58/0x6f > [ 972.359400] status_store+0xb2/0x180 [drm] > [ 972.360519] kernfs_fop_write+0xf0/0x1a0 > [ 972.361711] __vfs_write+0x36/0x180 > [ 972.362842] ? rcu_read_lock_sched_held+0x55/0x60 > [ 972.363974] ? rcu_sync_lockdep_assert+0x2e/0x60 > [ 972.365103] ? __sb_start_write+0x115/0x170 > [ 972.366241] ? vfs_write+0x13e/0x1a0 > [ 972.367365] vfs_write+0xa5/0x1a0 > [ 972.368486] ksys_write+0x52/0xc0 > [ 972.369596] do_syscall_64+0x60/0x1a0 > [ 972.370782] entry_SYSCALL_64_after_hwframe+0x49/0xbe > [ 972.371890] RIP: 0033:0x7fc93e169ef4 > [ 972.373012] Code: 89 02 48 c7 c0 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 > 00 > 00 66 90 48 8d 05 f1 3a 2d 00 8b 00 85 c0 75 13 b8 01 00 00 00 0f 05 <48> 3d > 00 f0 ff ff 77 54 c3 0f 1f 00 41 54 49 89 d4 55 48 89 f5 53 > [ 972.374214] RSP: 002b:00007ffcd7ad1918 EFLAGS: 00000246 ORIG_RAX: > 0000000000000001 > [ 972.375421] RAX: ffffffffffffffda RBX: 0000000000000007 RCX: > 00007fc93e169ef4 > [ 972.376628] RDX: 0000000000000007 RSI: 000055aefe5c30c0 RDI: > 0000000000000001 > [ 972.377872] RBP: 000055aefe5c30c0 R08: 00007fc93e43a8c0 R09: > 00007fc93f6cdb80 > [ 972.379082] R10: 000000000000000a R11: 0000000000000246 R12: > 00007fc93e439760 > [ 972.380311] R13: 0000000000000007 R14: 00007fc93e434760 R15: > 0000000000000007 > > I must not have noticed that back when I wrote these patches! Whoops. > > Since there's going to be quite a number of changes I need to make to this > I'm > just going to make the changes myself! I'll make sure to Cc you with the > respin > > On Tue, 2018-10-23 at 19:19 -0700, Juston Li wrote: > > From: Lyude > > > > As observed with the latest ThinkPad docks, we unfortunately can't rely > > on docks keeping us updated with hotplug events that happened while we > > were suspended. On top of that, even if the number of connectors remains > > the same between suspend and resume it's still not safe to assume that > > there were no hotplugs, since a different monitor might have been > > plugged into a port another monitor previously occupied. As such, we > > need to go through all of the MST ports and check whether or not their > > EDIDs have changed. > > > > In addition to that, we also now return -EINVAL from > > drm_dp_mst_topology_mgr_resume to indicate to callers that they need to > > reset the MST connection, and that they can't rely on any other method > > of reprobing. > > > > Cc: stable@vger.kernel.org > > Signed-off-by: Lyude > > Signed-off-by: Juston Li > > --- > > drivers/gpu/drm/drm_dp_mst_topology.c | 94 ++++++++++++++++++++++++++- > > 1 file changed, 93 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c > > b/drivers/gpu/drm/drm_dp_mst_topology.c > > index 5ff1d79b86c4..88abebe52021 100644 > > --- a/drivers/gpu/drm/drm_dp_mst_topology.c > > +++ b/drivers/gpu/drm/drm_dp_mst_topology.c > > @@ -29,6 +29,7 @@ > > #include > > #include > > #include > > +#include > > > > #include > > #include > > @@ -2201,6 +2202,64 @@ void drm_dp_mst_topology_mgr_suspend(struct > > drm_dp_mst_topology_mgr *mgr) > > } > > EXPORT_SYMBOL(drm_dp_mst_topology_mgr_suspend); > > > > +static bool drm_dp_mst_edids_changed(struct drm_dp_mst_topology_mgr *mgr, > > + struct drm_dp_mst_port *port) > > +{ > > + struct drm_device *dev; > > + struct drm_connector *connector; > > + struct drm_dp_mst_port *dport; > > + struct drm_dp_mst_branch *mstb; > > + struct edid *current_edid, *cached_edid; > > + bool ret = false; > > + > > + port = drm_dp_get_validated_port_ref(mgr, port); > > + if (!port) > > + return false; > > + > > + mstb = drm_dp_get_validated_mstb_ref(mgr, port->mstb); > > + if (mstb) { > > + list_for_each_entry(dport, &port->mstb->ports, next) { > > + ret = drm_dp_mst_edids_changed(mgr, dport); > > + if (ret) > > + break; > > + } > > + > > + drm_dp_put_mst_branch_device(mstb); > > + if (ret) > > + goto out; > > + } > > + > > + connector = port->connector; > > + if (!connector || !port->aux.ddc.algo) > > + goto out; > > + > > + dev = connector->dev; > > + mutex_lock(&dev->mode_config.mutex); > > + > > + current_edid = drm_get_edid(connector, &port->aux.ddc); > > + if (connector->edid_blob_ptr) > > + cached_edid = (void *)connector->edid_blob_ptr->data; > > + else > > + return false; > > + > > + if ((current_edid && cached_edid && memcmp(current_edid, cached_edid, > > + sizeof(struct edid)) != 0) > > > > > > > > + (!current_edid && cached_edid) || (current_edid && !cached_edid)) > > { > > + ret = true; > > + DRM_DEBUG_KMS("EDID on %s changed, reprobing connectors\n", > > + connector->name); > > + } > > + > > + mutex_unlock(&dev->mode_config.mutex); > > + > > + kfree(current_edid); > > + > > +out: > > + drm_dp_put_port(port); > > + > > + return ret; > > +} > > + > > /** > > * drm_dp_mst_topology_mgr_resume() - resume the MST manager > > * @mgr: manager to resume > > @@ -2210,9 +2269,15 @@ EXPORT_SYMBOL(drm_dp_mst_topology_mgr_suspend); > > * > > * if the device fails this returns -1, and the driver should do > > * a full MST reprobe, in case we were undocked. > > + * > > + * if the device can no longer be trusted, this returns -EINVAL > > + * and the driver should unconditionally disconnect and reconnect > > + * the dock. > > */ > > int drm_dp_mst_topology_mgr_resume(struct drm_dp_mst_topology_mgr *mgr) > > { > > + struct drm_dp_mst_branch *mstb; > > + struct drm_dp_mst_port *port; > > int ret = 0; > > > > mutex_lock(&mgr->lock); > > @@ -2246,8 +2311,35 @@ int drm_dp_mst_topology_mgr_resume(struct > > drm_dp_mst_topology_mgr *mgr) > > drm_dp_check_mstb_guid(mgr->mst_primary, guid); > > > > ret = 0; > > - } else > > + > > + /* > > + * Some hubs also forget to notify us of hotplugs that > > happened > > + * while we were in suspend, so we need to verify that the > > edid > > + * hasn't changed for any of the connectors. If it has been, > > + * we unfortunately can't rely on the dock updating us with > > + * hotplug events, so indicate we need a full reconnect. > > + */ > > + > > + /* MST's I2C helpers can't be used while holding this lock */ > > + mutex_unlock(&mgr->lock); > > + > > + mstb = drm_dp_get_validated_mstb_ref(mgr, mgr->mst_primary); > > + if (mstb) { > > + list_for_each_entry(port, &mstb->ports, next) { > > + if (drm_dp_mst_edids_changed(mgr, port)) { > > + ret = -EINVAL; > > + break; > > + } > > + } > > + > > + drm_dp_put_mst_branch_device(mstb); > > + } > > + } else { > > ret = -1; > > + mutex_unlock(&mgr->lock); > > + } > > + > > + return ret; > > > > out_unlock: > > mutex_unlock(&mgr->lock); -- Cheers, Lyude Paul From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lyude Paul Subject: Re: [RESEND PATCH v2 1/2] drm/dp/mst: Reprobe EDID for MST ports on resume Date: Wed, 24 Oct 2018 19:02:16 -0400 Message-ID: References: <20181024021925.27026-1-juston.li@intel.com> <20181024021925.27026-2-juston.li@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-qk1-f196.google.com (mail-qk1-f196.google.com [209.85.222.196]) by gabe.freedesktop.org (Postfix) with ESMTPS id 414BB6E347 for ; Wed, 24 Oct 2018 23:02:20 +0000 (UTC) Received: by mail-qk1-f196.google.com with SMTP id q184-v6so4538995qkd.3 for ; Wed, 24 Oct 2018 16:02:20 -0700 (PDT) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Juston Li , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Cc: mario.limonciello@dell.com, linux-kernel@vger.kernel.org, nathan.d.ciobanu@intel.com, jared_dominguez@dell.com, stable@vger.kernel.org, Lyude List-Id: dri-devel@lists.freedesktop.org R2FoLCB0aGUgbW9yZSBJIHRoaW5rIGFib3V0IHRoaXMgdGhlIG1vcmUgSSByZWFsaXplIHRoaXMg d2FzIG5ldmVyIHRoZSBjb3JyZWN0CmFwcHJvYWNoIHRvIGJlZ2luIHdpdGguIEkgd3JvdGUgdGhp cyBwYXRjaCBhIGxvbmcgdGltZSBhZ28gd2hlbiBJIHdhc24ndApuZWFybHkgYXMgZXhwZXJpZW5j ZWQsIHNvIHRoYXQncyBub3QgdGVycmlibHkgc3VycHJpc2luZy4KClNvOiB0aGUgdGhpbmcgaXMg dGhpcyBpc24ndCBhY3R1YWxseSBhIHByb2JsZW0gdGhhdCdzIHNwZWNpZmljIHRvIE1TVC4gUHJl dHR5Cm11Y2ggYWxsIG9mIHRoZSBkaWZmZXJlbnQgY29ubmVjdG9yIHR5cGVzIGhhdmUgdGhpcyBp c3N1ZSwgc2luY2UgYW55IEdQVSBpcwpnb2luZyB0byBtaXNzIGhvdHBsdWdzIGlmIHRoZSBlbnRp cmUgc3lzdGVtIGlzIGluIFMzLiBTbyBpdCBkb2Vzbid0IG1ha2UgbXVjaApzZW5zZSB0byBoYXZl IHRoaXMgYmUgaW4gTVNUIGhlbHBlcnM7IHdlIHNob3VsZCBqdXN0IHJlcHJvYmUgYWxsIG9mIHRo ZQpjb25uZWN0b3JzIG9uIHRoZSBzeXN0ZW0uCgpIb25lc3RseTogSSB0aGluayBpdCBtaWdodCBq dXN0IGJlIGEgYmV0dGVyIGlkZWEgdG8ganVzdCBzZW5kIGEgc3lzZnMgaG90cGx1Zwp3aGVuIHdl IHdha2UgdXAgZnJvbSBzdXNwZW5kL3Jlc3VtZSwgc28gdGhhdCB1c2Vyc3BhY2UganVzdCByZWNo ZWNrcyBhbGwgb2YKdGhlIGNvbm5lY3RvcnMgYW55d2F5LiBOb3V2ZWF1IGFscmVhZHkgZG9lcyB0 aGlzLCBqZnlpLgoKT24gV2VkLCAyMDE4LTEwLTI0IGF0IDE4OjA5IC0wNDAwLCBMeXVkZSBQYXVs IHdyb3RlOgo+IFRob3VnaHQgdGhpcyB3YXMgZ29pbmcgdG8gYmUgYW4gZWFzeSByZXZpZXcgdW50 aWwgSSByZWFsaXplZCB0aGF0IHRoZXJlJ3MKPiBtdWx0aXBsZSBwcm9ibGVtcyBpbiBub3V2ZWF1 IHRoaXMgd291bGQgY2F1c2UgaXNzdWVzIHdpdGgsIGV2ZW4gaWYgd2UgZGlkbid0Cj4gcGF5IGF0 dGVudGlvbiB0byB0aGUgLUVJTlZBTCB0aGF0IGdldHMgcmV0dXJuZWQuIFRoZSBzdXNwZW5kL3Jl c3VtZSBvcmRlciBpbgo+IG5vdXZlYXUgbmVlZHMgc29tZSBmaXhpbmcgdXAgdG8gcHJldmVudCB0 aGlzIHBhdGNoIGZyb20gY2F1c2luZyB0aW1lb3V0cywKPiBhbmQKPiB0aGVuIGFsc28gdGhlcmUn cyBhIGhpZGRlbiBzdXJwcmlzZQo+IAo+IFsgIDk3Mi4yOTQ0MzddID09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09Cj4gWyAgOTcyLjI5NTIyNV0gV0FSTklORzogcG9z c2libGUgcmVjdXJzaXZlIGxvY2tpbmcgZGV0ZWN0ZWQKPiBbICA5NzIuMjk2MDQyXSA0LjE5LjAt cmM4bXN0LXJlcHJvYmUrICMyIE5vdCB0YWludGVkCj4gWyAgOTcyLjI5Njg0Ml0gLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiBbICA5NzIuMjk3NjE0XSB6c2gv Njg0MCBpcyB0cnlpbmcgdG8gYWNxdWlyZSBsb2NrOgo+IFsgIDk3Mi4yOTg0NDFdIDAwMDAwMDAw NzJlNTIxZjcgKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KXsrLisufSwgYXQ6Cj4gZHJtX2RwX21z dF9lZGlkc19jaGFuZ2VkKzB4YzAvMHgxODAgW2RybV9rbXNfaGVscGVyXQo+IFsgIDk3Mi4yOTky OTldIAo+ICAgICAgICAgICAgICAgIGJ1dCB0YXNrIGlzIGFscmVhZHkgaG9sZGluZyBsb2NrOgo+ IFsgIDk3Mi4zMDA5OTFdIDAwMDAwMDAwNzJlNTIxZjcgKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4 KXsrLisufSwgYXQ6Cj4gc3RhdHVzX3N0b3JlKzB4MzQvMHgxODAgW2RybV0KPiBbICA5NzIuMzAx ODc1XSAKPiAgICAgICAgICAgICAgICBvdGhlciBpbmZvIHRoYXQgbWlnaHQgaGVscCB1cyBkZWJ1 ZyB0aGlzOgo+IFsgIDk3Mi4zMDM1NjNdICBQb3NzaWJsZSB1bnNhZmUgbG9ja2luZyBzY2VuYXJp bzoKPiAKPiBbICA5NzIuMzA1MzE1XSAgICAgICAgQ1BVMAo+IFsgIDk3Mi4zMDYxODJdICAgICAg ICAtLS0tCj4gWyAgOTcyLjMwNzA2MV0gICBsb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsK PiBbICA5NzIuMzA3OTQzXSAgIGxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOwo+IFsgIDk3 Mi4zMDg4MTldIAo+ICAgICAgICAgICAgICAgICAqKiogREVBRExPQ0sgKioqCj4gCj4gWyAgOTcy LjMxMTQ0Nl0gIE1heSBiZSBkdWUgdG8gbWlzc2luZyBsb2NrIG5lc3Rpbmcgbm90YXRpb24KPiAK PiBbICA5NzIuMzEzMjM0XSA2IGxvY2tzIGhlbGQgYnkgenNoLzY4NDA6Cj4gWyAgOTcyLjMxNDEz NV0gICMwOiAwMDAwMDAwMDkyYjViYTlkIChzYl93cml0ZXJzIzQpey4rLit9LCBhdDoKPiB2ZnNf d3JpdGUrMHgxM2UvMHgxYTAKPiBbICA5NzIuMzE1MDQ5XSAgIzE6IDAwMDAwMDAwZTYyOGU2ZTkg KCZvZi0+bXV0ZXgpeysuKy59LCBhdDoKPiBrZXJuZnNfZm9wX3dyaXRlKzB4YmQvMHgxYTAKPiBb ICA5NzIuMzE1OTgwXSAgIzI6IDAwMDAwMDAwMGZiNjVlNmMgKGtuLT5jb3VudCMyNDApey4rLit9 LCBhdDoKPiBrZXJuZnNfZm9wX3dyaXRlKzB4YzUvMHgxYTAKPiBbICA5NzIuMzE2OTI4XSAgIzM6 IDAwMDAwMDAwNzJlNTIxZjcgKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KXsrLisufSwgYXQ6Cj4g c3RhdHVzX3N0b3JlKzB4MzQvMHgxODAgW2RybV0KPiBbICA5NzIuMzE3ODkyXSAgIzQ6IDAwMDAw MDAwMzQ0MjI0YzIgKGNydGNfd3dfY2xhc3NfYWNxdWlyZSl7Ky4rLn0sIGF0Ogo+IGRybV9oZWxw ZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcysweDY2LzB4NmMwIFtkcm1fa21zX2hlbHBl cl0KPiBbICA5NzIuMzE4ODYzXSAgIzU6IDAwMDAwMDAwZDY1MzUyZTIgKGNydGNfd3dfY2xhc3Nf bXV0ZXgpeysuKy59LCBhdDoKPiBkcm1fbW9kZXNldF9sb2NrKzB4NDQvMHgxMTAgW2RybV0KPiBb ICA5NzIuMzE5ODYwXSAKPiAgICAgICAgICAgICAgICBzdGFjayBiYWNrdHJhY2U6Cj4gWyAgOTcy LjMyMTgwMF0gQ1BVOiA1IFBJRDogNjg0MCBDb21tOiB6c2ggS2R1bXA6IGxvYWRlZCBOb3QgdGFp bnRlZCA0LjE5LjAtCj4gcmM4bXN0LXJlcHJvYmUrICMyCj4gWyAgOTcyLjMyMjc3Ml0gSGFyZHdh cmUgbmFtZTogTEVOT1ZPIDIwRVFaMUo3VVMvMjBFUVoxSjdVUywgQklPUyBOMUVFVDgwVwo+ICgx LjUzICkgMDkvMTQvMjAxOAo+IFsgIDk3Mi4zMjM3OTJdIENhbGwgVHJhY2U6Cj4gWyAgOTcyLjMy NDgyMV0gIGR1bXBfc3RhY2srMHg4NS8weGMwCj4gWyAgOTcyLjMyNTgzMl0gIF9fbG9ja19hY3F1 aXJlLmNvbGQuNTkrMHgxNTgvMHgyMjcKPiBbICA5NzIuMzI2ODg3XSAgPyByZXRpbnRfa2VybmVs KzB4MTAvMHgxMAo+IFsgIDk3Mi4zMjc5MThdICBsb2NrX2FjcXVpcmUrMHg5ZS8weDE3MAo+IFsg IDk3Mi4zMjg5NDhdICA/IGRybV9kcF9tc3RfZWRpZHNfY2hhbmdlZCsweGMwLzB4MTgwIFtkcm1f a21zX2hlbHBlcl0KPiBbICA5NzIuMzI5OTg2XSAgPyBkcm1fZHBfbXN0X2VkaWRzX2NoYW5nZWQr MHhjMC8weDE4MCBbZHJtX2ttc19oZWxwZXJdCj4gWyAgOTcyLjMzMTA2Nl0gIF9fbXV0ZXhfbG9j aysweDY4LzB4OTAwCj4gWyAgOTcyLjMzMjA5NF0gID8gZHJtX2RwX21zdF9lZGlkc19jaGFuZ2Vk KzB4YzAvMHgxODAgW2RybV9rbXNfaGVscGVyXQo+IFsgIDk3Mi4zMzMxNDZdICA/IF9fbXV0ZXhf dW5sb2NrX3Nsb3dwYXRoKzB4NGIvMHgyYjAKPiBbICA5NzIuMzM0MjIxXSAgPyBkcm1fZHBfbXN0 X2VkaWRzX2NoYW5nZWQrMHhjMC8weDE4MCBbZHJtX2ttc19oZWxwZXJdCj4gWyAgOTcyLjMzNTI1 NV0gIGRybV9kcF9tc3RfZWRpZHNfY2hhbmdlZCsweGMwLzB4MTgwIFtkcm1fa21zX2hlbHBlcl0K PiBbICA5NzIuMzM2MzE4XSAgZHJtX2RwX21zdF90b3BvbG9neV9tZ3JfcmVzdW1lKzB4MTA0LzB4 MTkwIFtkcm1fa21zX2hlbHBlcl0KPiBbICA5NzIuMzM3Mzk3XSAgbnY1MF9kaXNwbGF5X2luaXQr MHg3My8weGQwIFtub3V2ZWF1XQo+IFsgIDk3Mi4zMzg0ODNdICBub3V2ZWF1X2Rpc3BsYXlfaW5p dCsweDhlLzB4ZTAgW25vdXZlYXVdCj4gWyAgOTcyLjMzOTU0N10gIG5vdXZlYXVfZGlzcGxheV9y ZXN1bWUrMHgzOS8weDI1MCBbbm91dmVhdV0KPiBbICA5NzIuMzQwNjM0XSAgPyBwY2lfcmVzdG9y ZV9zdGFuZGFyZF9jb25maWcrMHg0MC8weDQwCj4gWyAgOTcyLjM0MTc2Ml0gIG5vdXZlYXVfZG9f cmVzdW1lKzB4NzkvMHgxNTAgW25vdXZlYXVdCj4gWyAgOTcyLjM0Mjg1MF0gIG5vdXZlYXVfcG1v cHNfcnVudGltZV9yZXN1bWUrMHg4OC8weDE1MCBbbm91dmVhdV0KPiBbICA5NzIuMzQzOTE1XSAg cGNpX3BtX3J1bnRpbWVfcmVzdW1lKzB4NzgvMHhiMAo+IFsgIDk3Mi4zNDUwMDRdICBfX3JwbV9j YWxsYmFjaysweDc1LzB4MWIwCj4gWyAgOTcyLjM0NjA4NF0gID8gcGNpX3Jlc3RvcmVfc3RhbmRh cmRfY29uZmlnKzB4NDAvMHg0MAo+IFsgIDk3Mi4zNDcxNDhdICBycG1fY2FsbGJhY2srMHgxZi8w eDcwCj4gWyAgOTcyLjM0ODI1Nl0gID8gcGNpX3Jlc3RvcmVfc3RhbmRhcmRfY29uZmlnKzB4NDAv MHg0MAo+IFsgIDk3Mi4zNDkzNTFdICBycG1fcmVzdW1lKzB4NWQ0LzB4ODEwCj4gWyAgOTcyLjM1 MDQ0Nl0gID8gZHJtX21vZGVzZXRfbG9jaysweDQ0LzB4MTEwIFtkcm1dCj4gWyAgOTcyLjM1MTU3 M10gIF9fcG1fcnVudGltZV9yZXN1bWUrMHg0Ny8weDcwCj4gWyAgOTcyLjM1MjczN10gIG5vdXZl YXVfY29ubmVjdG9yX2RldGVjdCsweDM3My8weDQ3MCBbbm91dmVhdV0KPiBbICA5NzIuMzUzODQx XSAgPyBfY29uZF9yZXNjaGVkKzB4MTUvMHgzMAo+IFsgIDk3Mi4zNTQ5NDVdICA/IHd3X211dGV4 X2xvY2srMHgzMC8weDYwCj4gWyAgOTcyLjM1NjA0NF0gID8gZHJtX21vZGVzZXRfbG9jaysweDQ0 LzB4MTEwIFtkcm1dCj4gWyAgOTcyLjM1NzE0Nl0gIGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nv bm5lY3Rvcl9tb2RlcysweGQ5LzB4NmMwCj4gW2RybV9rbXNfaGVscGVyXQo+IFsgIDk3Mi4zNTgy NzRdICA/IHByaW50aysweDU4LzB4NmYKPiBbICA5NzIuMzU5NDAwXSAgc3RhdHVzX3N0b3JlKzB4 YjIvMHgxODAgW2RybV0KPiBbICA5NzIuMzYwNTE5XSAga2VybmZzX2ZvcF93cml0ZSsweGYwLzB4 MWEwCj4gWyAgOTcyLjM2MTcxMV0gIF9fdmZzX3dyaXRlKzB4MzYvMHgxODAKPiBbICA5NzIuMzYy ODQyXSAgPyByY3VfcmVhZF9sb2NrX3NjaGVkX2hlbGQrMHg1NS8weDYwCj4gWyAgOTcyLjM2Mzk3 NF0gID8gcmN1X3N5bmNfbG9ja2RlcF9hc3NlcnQrMHgyZS8weDYwCj4gWyAgOTcyLjM2NTEwM10g ID8gX19zYl9zdGFydF93cml0ZSsweDExNS8weDE3MAo+IFsgIDk3Mi4zNjYyNDFdICA/IHZmc193 cml0ZSsweDEzZS8weDFhMAo+IFsgIDk3Mi4zNjczNjVdICB2ZnNfd3JpdGUrMHhhNS8weDFhMAo+ IFsgIDk3Mi4zNjg0ODZdICBrc3lzX3dyaXRlKzB4NTIvMHhjMAo+IFsgIDk3Mi4zNjk1OTZdICBk b19zeXNjYWxsXzY0KzB4NjAvMHgxYTAKPiBbICA5NzIuMzcwNzgyXSAgZW50cnlfU1lTQ0FMTF82 NF9hZnRlcl9od2ZyYW1lKzB4NDkvMHhiZQo+IFsgIDk3Mi4zNzE4OTBdIFJJUDogMDAzMzoweDdm YzkzZTE2OWVmNAo+IFsgIDk3Mi4zNzMwMTJdIENvZGU6IDg5IDAyIDQ4IGM3IGMwIGZmIGZmIGZm IGZmIGMzIDY2IDJlIDBmIDFmIDg0IDAwIDAwIDAwCj4gMDAKPiAwMCA2NiA5MCA0OCA4ZCAwNSBm MSAzYSAyZCAwMCA4YiAwMCA4NSBjMCA3NSAxMyBiOCAwMSAwMCAwMCAwMCAwZiAwNSA8NDg+IDNk Cj4gMDAgZjAgZmYgZmYgNzcgNTQgYzMgMGYgMWYgMDAgNDEgNTQgNDkgODkgZDQgNTUgNDggODkg ZjUgNTMKPiBbICA5NzIuMzc0MjE0XSBSU1A6IDAwMmI6MDAwMDdmZmNkN2FkMTkxOCBFRkxBR1M6 IDAwMDAwMjQ2IE9SSUdfUkFYOgo+IDAwMDAwMDAwMDAwMDAwMDEKPiBbICA5NzIuMzc1NDIxXSBS QVg6IGZmZmZmZmZmZmZmZmZmZGEgUkJYOiAwMDAwMDAwMDAwMDAwMDA3IFJDWDoKPiAwMDAwN2Zj OTNlMTY5ZWY0Cj4gWyAgOTcyLjM3NjYyOF0gUkRYOiAwMDAwMDAwMDAwMDAwMDA3IFJTSTogMDAw MDU1YWVmZTVjMzBjMCBSREk6Cj4gMDAwMDAwMDAwMDAwMDAwMQo+IFsgIDk3Mi4zNzc4NzJdIFJC UDogMDAwMDU1YWVmZTVjMzBjMCBSMDg6IDAwMDA3ZmM5M2U0M2E4YzAgUjA5Ogo+IDAwMDA3ZmM5 M2Y2Y2RiODAKPiBbICA5NzIuMzc5MDgyXSBSMTA6IDAwMDAwMDAwMDAwMDAwMGEgUjExOiAwMDAw MDAwMDAwMDAwMjQ2IFIxMjoKPiAwMDAwN2ZjOTNlNDM5NzYwCj4gWyAgOTcyLjM4MDMxMV0gUjEz OiAwMDAwMDAwMDAwMDAwMDA3IFIxNDogMDAwMDdmYzkzZTQzNDc2MCBSMTU6Cj4gMDAwMDAwMDAw MDAwMDAwNwo+IAo+IEkgbXVzdCBub3QgaGF2ZSBub3RpY2VkIHRoYXQgYmFjayB3aGVuIEkgd3Jv dGUgdGhlc2UgcGF0Y2hlcyEgV2hvb3BzLgo+IAo+IFNpbmNlIHRoZXJlJ3MgZ29pbmcgdG8gYmUg cXVpdGUgYSBudW1iZXIgb2YgY2hhbmdlcyBJIG5lZWQgdG8gbWFrZSB0byB0aGlzCj4gSSdtCj4g anVzdCBnb2luZyB0byBtYWtlIHRoZSBjaGFuZ2VzIG15c2VsZiEgSSdsbCBtYWtlIHN1cmUgdG8g Q2MgeW91IHdpdGggdGhlCj4gcmVzcGluCj4gCj4gT24gVHVlLCAyMDE4LTEwLTIzIGF0IDE5OjE5 IC0wNzAwLCBKdXN0b24gTGkgd3JvdGU6Cj4gPiBGcm9tOiBMeXVkZSA8Y3BhdWxAcmVkaGF0LmNv bT4KPiA+IAo+ID4gQXMgb2JzZXJ2ZWQgd2l0aCB0aGUgbGF0ZXN0IFRoaW5rUGFkIGRvY2tzLCB3 ZSB1bmZvcnR1bmF0ZWx5IGNhbid0IHJlbHkKPiA+IG9uIGRvY2tzIGtlZXBpbmcgdXMgdXBkYXRl ZCB3aXRoIGhvdHBsdWcgZXZlbnRzIHRoYXQgaGFwcGVuZWQgd2hpbGUgd2UKPiA+IHdlcmUgc3Vz cGVuZGVkLiBPbiB0b3Agb2YgdGhhdCwgZXZlbiBpZiB0aGUgbnVtYmVyIG9mIGNvbm5lY3RvcnMg cmVtYWlucwo+ID4gdGhlIHNhbWUgYmV0d2VlbiBzdXNwZW5kIGFuZCByZXN1bWUgaXQncyBzdGls bCBub3Qgc2FmZSB0byBhc3N1bWUgdGhhdAo+ID4gdGhlcmUgd2VyZSBubyBob3RwbHVncywgc2lu Y2UgYSBkaWZmZXJlbnQgbW9uaXRvciBtaWdodCBoYXZlIGJlZW4KPiA+IHBsdWdnZWQgaW50byBh IHBvcnQgYW5vdGhlciBtb25pdG9yIHByZXZpb3VzbHkgb2NjdXBpZWQuIEFzIHN1Y2gsIHdlCj4g PiBuZWVkIHRvIGdvIHRocm91Z2ggYWxsIG9mIHRoZSBNU1QgcG9ydHMgYW5kIGNoZWNrIHdoZXRo ZXIgb3Igbm90IHRoZWlyCj4gPiBFRElEcyBoYXZlIGNoYW5nZWQuCj4gPiAKPiA+IEluIGFkZGl0 aW9uIHRvIHRoYXQsIHdlIGFsc28gbm93IHJldHVybiAtRUlOVkFMIGZyb20KPiA+IGRybV9kcF9t c3RfdG9wb2xvZ3lfbWdyX3Jlc3VtZSB0byBpbmRpY2F0ZSB0byBjYWxsZXJzIHRoYXQgdGhleSBu ZWVkIHRvCj4gPiByZXNldCB0aGUgTVNUIGNvbm5lY3Rpb24sIGFuZCB0aGF0IHRoZXkgY2FuJ3Qg cmVseSBvbiBhbnkgb3RoZXIgbWV0aG9kCj4gPiBvZiByZXByb2JpbmcuCj4gPiAKPiA+IENjOiBz dGFibGVAdmdlci5rZXJuZWwub3JnCj4gPiBTaWduZWQtb2ZmLWJ5OiBMeXVkZSA8Y3BhdWxAcmVk aGF0LmNvbT4KPiA+IFNpZ25lZC1vZmYtYnk6IEp1c3RvbiBMaSA8anVzdG9uLmxpQGludGVsLmNv bT4KPiA+IC0tLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fZHBfbXN0X3RvcG9sb2d5LmMgfCA5 NCArKysrKysrKysrKysrKysrKysrKysrKysrKy0KPiA+ICAxIGZpbGUgY2hhbmdlZCwgOTMgaW5z ZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQo+ID4gCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2RybV9kcF9tc3RfdG9wb2xvZ3kuYwo+ID4gYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2Rw X21zdF90b3BvbG9neS5jCj4gPiBpbmRleCA1ZmYxZDc5Yjg2YzQuLjg4YWJlYmU1MjAyMSAxMDA2 NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHBfbXN0X3RvcG9sb2d5LmMKPiA+ICsr KyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHBfbXN0X3RvcG9sb2d5LmMKPiA+IEBAIC0yOSw2ICsy OSw3IEBACj4gPiAgI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgo+ID4gICNpbmNsdWRlIDxkcm0vZHJt X2RwX21zdF9oZWxwZXIuaD4KPiA+ICAjaW5jbHVkZSA8ZHJtL2RybVAuaD4KPiA+ICsjaW5jbHVk ZSA8ZHJtL2RybV9lZGlkLmg+Cj4gPiAgCj4gPiAgI2luY2x1ZGUgPGRybS9kcm1fZml4ZWQuaD4K PiA+ICAjaW5jbHVkZSA8ZHJtL2RybV9hdG9taWMuaD4KPiA+IEBAIC0yMjAxLDYgKzIyMDIsNjQg QEAgdm9pZCBkcm1fZHBfbXN0X3RvcG9sb2d5X21ncl9zdXNwZW5kKHN0cnVjdAo+ID4gZHJtX2Rw X21zdF90b3BvbG9neV9tZ3IgKm1ncikKPiA+ICB9Cj4gPiAgRVhQT1JUX1NZTUJPTChkcm1fZHBf bXN0X3RvcG9sb2d5X21ncl9zdXNwZW5kKTsKPiA+ICAKPiA+ICtzdGF0aWMgYm9vbCBkcm1fZHBf bXN0X2VkaWRzX2NoYW5nZWQoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCj4g PiArCQkJCSAgICAgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCkKPiA+ICt7Cj4gPiArCXN0 cnVjdCBkcm1fZGV2aWNlICpkZXY7Cj4gPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0 b3I7Cj4gPiArCXN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKmRwb3J0Owo+ID4gKwlzdHJ1Y3QgZHJt X2RwX21zdF9icmFuY2ggKm1zdGI7Cj4gPiArCXN0cnVjdCBlZGlkICpjdXJyZW50X2VkaWQsICpj YWNoZWRfZWRpZDsKPiA+ICsJYm9vbCByZXQgPSBmYWxzZTsKPiA+ICsKPiA+ICsJcG9ydCA9IGRy bV9kcF9nZXRfdmFsaWRhdGVkX3BvcnRfcmVmKG1nciwgcG9ydCk7Cj4gPiArCWlmICghcG9ydCkK PiA+ICsJCXJldHVybiBmYWxzZTsKPiA+ICsKPiA+ICsJbXN0YiA9IGRybV9kcF9nZXRfdmFsaWRh dGVkX21zdGJfcmVmKG1nciwgcG9ydC0+bXN0Yik7Cj4gPiArCWlmIChtc3RiKSB7Cj4gPiArCQls aXN0X2Zvcl9lYWNoX2VudHJ5KGRwb3J0LCAmcG9ydC0+bXN0Yi0+cG9ydHMsIG5leHQpIHsKPiA+ ICsJCQlyZXQgPSBkcm1fZHBfbXN0X2VkaWRzX2NoYW5nZWQobWdyLCBkcG9ydCk7Cj4gPiArCQkJ aWYgKHJldCkKPiA+ICsJCQkJYnJlYWs7Cj4gPiArCQl9Cj4gPiArCj4gPiArCQlkcm1fZHBfcHV0 X21zdF9icmFuY2hfZGV2aWNlKG1zdGIpOwo+ID4gKwkJaWYgKHJldCkKPiA+ICsJCQlnb3RvIG91 dDsKPiA+ICsJfQo+ID4gKwo+ID4gKwljb25uZWN0b3IgPSBwb3J0LT5jb25uZWN0b3I7Cj4gPiAr CWlmICghY29ubmVjdG9yIHx8ICFwb3J0LT5hdXguZGRjLmFsZ28pCj4gPiArCQlnb3RvIG91dDsK PiA+ICsKPiA+ICsJZGV2ID0gY29ubmVjdG9yLT5kZXY7Cj4gPiArCW11dGV4X2xvY2soJmRldi0+ bW9kZV9jb25maWcubXV0ZXgpOwo+ID4gKwo+ID4gKwljdXJyZW50X2VkaWQgPSBkcm1fZ2V0X2Vk aWQoY29ubmVjdG9yLCAmcG9ydC0+YXV4LmRkYyk7Cj4gPiArCWlmIChjb25uZWN0b3ItPmVkaWRf YmxvYl9wdHIpCj4gPiArCQljYWNoZWRfZWRpZCA9ICh2b2lkICopY29ubmVjdG9yLT5lZGlkX2Js b2JfcHRyLT5kYXRhOwo+ID4gKwllbHNlCj4gPiArCQlyZXR1cm4gZmFsc2U7Cj4gPiArCj4gPiAr CWlmICgoY3VycmVudF9lZGlkICYmIGNhY2hlZF9lZGlkICYmIG1lbWNtcChjdXJyZW50X2VkaWQs IGNhY2hlZF9lZGlkLAo+ID4gKwkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgZWRpZCkpICE9IDApCj4g PiA+ID4gCj4gPiAKPiA+ICsJICAgICghY3VycmVudF9lZGlkICYmIGNhY2hlZF9lZGlkKSB8fCAo Y3VycmVudF9lZGlkICYmICFjYWNoZWRfZWRpZCkpCj4gPiB7Cj4gPiArCQlyZXQgPSB0cnVlOwo+ ID4gKwkJRFJNX0RFQlVHX0tNUygiRURJRCBvbiAlcyBjaGFuZ2VkLCByZXByb2JpbmcgY29ubmVj dG9yc1xuIiwKPiA+ICsJCQkgICAgICBjb25uZWN0b3ItPm5hbWUpOwo+ID4gKwl9Cj4gPiArCj4g PiArCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7Cj4gPiArCj4gPiArCWtm cmVlKGN1cnJlbnRfZWRpZCk7Cj4gPiArCj4gPiArb3V0Ogo+ID4gKwlkcm1fZHBfcHV0X3BvcnQo cG9ydCk7Cj4gPiArCj4gPiArCXJldHVybiByZXQ7Cj4gPiArfQo+ID4gKwo+ID4gIC8qKgo+ID4g ICAqIGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyX3Jlc3VtZSgpIC0gcmVzdW1lIHRoZSBNU1QgbWFu YWdlcgo+ID4gICAqIEBtZ3I6IG1hbmFnZXIgdG8gcmVzdW1lCj4gPiBAQCAtMjIxMCw5ICsyMjY5 LDE1IEBAIEVYUE9SVF9TWU1CT0woZHJtX2RwX21zdF90b3BvbG9neV9tZ3Jfc3VzcGVuZCk7Cj4g PiAgICoKPiA+ICAgKiBpZiB0aGUgZGV2aWNlIGZhaWxzIHRoaXMgcmV0dXJucyAtMSwgYW5kIHRo ZSBkcml2ZXIgc2hvdWxkIGRvCj4gPiAgICogYSBmdWxsIE1TVCByZXByb2JlLCBpbiBjYXNlIHdl IHdlcmUgdW5kb2NrZWQuCj4gPiArICoKPiA+ICsgKiBpZiB0aGUgZGV2aWNlIGNhbiBubyBsb25n ZXIgYmUgdHJ1c3RlZCwgdGhpcyByZXR1cm5zIC1FSU5WQUwKPiA+ICsgKiBhbmQgdGhlIGRyaXZl ciBzaG91bGQgdW5jb25kaXRpb25hbGx5IGRpc2Nvbm5lY3QgYW5kIHJlY29ubmVjdAo+ID4gKyAq IHRoZSBkb2NrLgo+ID4gICAqLwo+ID4gIGludCBkcm1fZHBfbXN0X3RvcG9sb2d5X21ncl9yZXN1 bWUoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpCj4gPiAgewo+ID4gKwlzdHJ1 Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGI7Cj4gPiArCXN0cnVjdCBkcm1fZHBfbXN0X3BvcnQg KnBvcnQ7Cj4gPiAgCWludCByZXQgPSAwOwo+ID4gIAo+ID4gIAltdXRleF9sb2NrKCZtZ3ItPmxv Y2spOwo+ID4gQEAgLTIyNDYsOCArMjMxMSwzNSBAQCBpbnQgZHJtX2RwX21zdF90b3BvbG9neV9t Z3JfcmVzdW1lKHN0cnVjdAo+ID4gZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1ncikKPiA+ICAJ CWRybV9kcF9jaGVja19tc3RiX2d1aWQobWdyLT5tc3RfcHJpbWFyeSwgZ3VpZCk7Cj4gPiAgCj4g PiAgCQlyZXQgPSAwOwo+ID4gLQl9IGVsc2UKPiA+ICsKPiA+ICsJCS8qCj4gPiArCQkgKiBTb21l IGh1YnMgYWxzbyBmb3JnZXQgdG8gbm90aWZ5IHVzIG9mIGhvdHBsdWdzIHRoYXQKPiA+IGhhcHBl bmVkCj4gPiArCQkgKiB3aGlsZSB3ZSB3ZXJlIGluIHN1c3BlbmQsIHNvIHdlIG5lZWQgdG8gdmVy aWZ5IHRoYXQgdGhlCj4gPiBlZGlkCj4gPiArCQkgKiBoYXNuJ3QgY2hhbmdlZCBmb3IgYW55IG9m IHRoZSBjb25uZWN0b3JzLiBJZiBpdCBoYXMgYmVlbiwKPiA+ICsJCSAqIHdlIHVuZm9ydHVuYXRl bHkgY2FuJ3QgcmVseSBvbiB0aGUgZG9jayB1cGRhdGluZyB1cyB3aXRoCj4gPiArCQkgKiBob3Rw bHVnIGV2ZW50cywgc28gaW5kaWNhdGUgd2UgbmVlZCBhIGZ1bGwgcmVjb25uZWN0Lgo+ID4gKwkJ ICovCj4gPiArCj4gPiArCQkvKiBNU1QncyBJMkMgaGVscGVycyBjYW4ndCBiZSB1c2VkIHdoaWxl IGhvbGRpbmcgdGhpcyBsb2NrICovCj4gPiArCQltdXRleF91bmxvY2soJm1nci0+bG9jayk7Cj4g PiArCj4gPiArCQltc3RiID0gZHJtX2RwX2dldF92YWxpZGF0ZWRfbXN0Yl9yZWYobWdyLCBtZ3It Pm1zdF9wcmltYXJ5KTsKPiA+ICsJCWlmIChtc3RiKSB7Cj4gPiArCQkJbGlzdF9mb3JfZWFjaF9l bnRyeShwb3J0LCAmbXN0Yi0+cG9ydHMsIG5leHQpIHsKPiA+ICsJCQkJaWYgKGRybV9kcF9tc3Rf ZWRpZHNfY2hhbmdlZChtZ3IsIHBvcnQpKSB7Cj4gPiArCQkJCQlyZXQgPSAtRUlOVkFMOwo+ID4g KwkJCQkJYnJlYWs7Cj4gPiArCQkJCX0KPiA+ICsJCQl9Cj4gPiArCj4gPiArCQkJZHJtX2RwX3B1 dF9tc3RfYnJhbmNoX2RldmljZShtc3RiKTsKPiA+ICsJCX0KPiA+ICsJfSBlbHNlIHsKPiA+ICAJ CXJldCA9IC0xOwo+ID4gKwkJbXV0ZXhfdW5sb2NrKCZtZ3ItPmxvY2spOwo+ID4gKwl9Cj4gPiAr Cj4gPiArCXJldHVybiByZXQ7Cj4gPiAgCj4gPiAgb3V0X3VubG9jazoKPiA+ICAJbXV0ZXhfdW5s b2NrKCZtZ3ItPmxvY2spOwotLSAKQ2hlZXJzLAoJTHl1ZGUgUGF1bAoKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApk cmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Au b3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==