Received: by 2002:ab2:6c55:0:b0:1fd:c486:4f03 with SMTP id v21csp301306lqp; Wed, 12 Jun 2024 01:52:42 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVoJZf5a6EobLNHMKIwgXq4YoIuSDhZIpoiqwhoBDrvk3cW7eyrjV/MtwT6oOqfmYGUd/ahTmlJ/hCf9IVSwaQogyKDw4cgJ7nlqNXOGA== X-Google-Smtp-Source: AGHT+IHh1XGh9CPH7Vp1ywPN3W5JtP6wQ55nteMrfMzD2HY6v8ryHLDjlV1WF6qh03JTompsGcpR X-Received: by 2002:a92:d4ce:0:b0:375:d1d1:206f with SMTP id e9e14a558f8ab-375d1d12402mr2453635ab.17.1718182362581; Wed, 12 Jun 2024 01:52:42 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1718182362; cv=pass; d=google.com; s=arc-20160816; b=qUzVhFGoPHPyLRy9utc4ZiQAgsOHvZz4nz0ZzBmpylbExiMgRIFXBi91LRNAC3y3qh L6ritouuybdCBX6QNGqEG1AjkmF+Pe2GhvyW/Xu3bgdD5OX/oohsZYv52ixUrSW1k6kB TUyXPz+wwdimjJPCfc0RydfbiU6xyIFJJCqVaKc9Fj0u5FNr441s7sJbT+btmcvh22ze N4jF/53LKfZ3FLqpRT+R/UkY5paI/2m5PHqOJDtaza3khWLqPtRMYEjwG+PqOAVlq375 KSCzkq0pX5Ncaadkwdwa4YpjjTbuiIHvRA/bgQBVaCUqoiOsYe3tF5GcSpPP3+2vDDsi KV+A== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=mime-version:list-unsubscribe:list-subscribe:list-id:precedence :user-agent:content-transfer-encoding:references:in-reply-to:date:cc :to:from:subject:message-id:dkim-signature; bh=O/dPl3DOOVIgCS/TbYezdyFqpDWqxJxEVc/6kR/nqzI=; fh=U1nQc7y0pE6Ff6lvH62Wj7uWi4hdEZzBxlWM1Es+hck=; b=GDKaKTSmXeF5nNLOs2L+HeFlcs5i5G1mSppmDCiYuPz3rU4b4025czEF35/jqhpoVj 9wEt2fDOYC6cF8S+amrnqcvnuQ8y646abGGrm6e96KGI++lE39druL6CdEdGhuFjkSSj korzCeu5vJQfeLSs+WQ7X7C8XoVqtiINptWM2eqzEL/HqEYWGwlw2vRrwuQeuU3nxQBQ X7X6lDqHWKvzk8JsgPLwaj0ejEomGH83XquJo5LY+h7gRL8xKLHrsPyYzvzH5SwaULUB HnI82USxZmQh6b1KovYBMdbV/SGPg/iyV8HB1OpBiwRYc8fLYixtZ4dKdgB4jas9jpkQ uL3Q==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=NHfgZ94l; arc=pass (i=1 spf=pass spfdomain=redhat.com dkim=pass dkdomain=redhat.com dmarc=pass fromdomain=redhat.com); spf=pass (google.com: domain of linux-kernel+bounces-211209-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-211209-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id 41be03b00d2f7-6e372d21c09si8712132a12.135.2024.06.12.01.52.42 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Jun 2024 01:52:42 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-211209-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=NHfgZ94l; arc=pass (i=1 spf=pass spfdomain=redhat.com dkim=pass dkdomain=redhat.com dmarc=pass fromdomain=redhat.com); spf=pass (google.com: domain of linux-kernel+bounces-211209-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-211209-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 1DC4628480D for ; Wed, 12 Jun 2024 08:52:05 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D2A7E16D4D7; Wed, 12 Jun 2024 08:52:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="NHfgZ94l" Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2F15516D32C for ; Wed, 12 Jun 2024 08:51:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718182318; cv=none; b=cXyU7CMnn02kRCWnwVsyFcShvWRMBPcjV+DUNHvDxaJTRgyn9TQSaRpeQDsYY5DDNJB3mOqVkEki7mnh+Bx3aqoaHLQ4XYhvNB2dhCIELmpe6W2f6oYOpPz5aEWUyDakjp+rEQX86PfApSdGE5a2DDDO/pwVwIWVd/Ahsv/AYx8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718182318; c=relaxed/simple; bh=O/dPl3DOOVIgCS/TbYezdyFqpDWqxJxEVc/6kR/nqzI=; h=Message-ID:Subject:From:To:Cc:Date:In-Reply-To:References: Content-Type:MIME-Version; b=pHOa9AHDLnyMpqEjqvWQQIlFgDuWNrtFgJQf1tVPovjweV7Q8KrLb8l14V7tLrdiiZvyX9Ys11Xlmt8SE18eqPnjr5gm2ILKJNa1+l8zIEvu+L606GleYGK/pNAiqMhB1UTAY70KE5dexqIylPht8kS/lWyQEEyxCs/Cqhwv3rk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=NHfgZ94l; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1718182314; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=O/dPl3DOOVIgCS/TbYezdyFqpDWqxJxEVc/6kR/nqzI=; b=NHfgZ94lxDrGbneaKEiW+tLbiD+sVJg9zf7HTnbOo0dvhMefW8G8j6yuc9JIH8IZukFeIs YEutosg9SRT/veHPfE4WavwjvLQkJQYncsgoTM9IDO7PF3+8+zbiupyCWmTPwhej77HrVc 0cD7YBBCbRvzYE+j/7k9adF57UJVoOw= Received: from mail-lf1-f70.google.com (mail-lf1-f70.google.com [209.85.167.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-209-LxStUiMwMvmIVd4nQmI6XA-1; Wed, 12 Jun 2024 04:51:45 -0400 X-MC-Unique: LxStUiMwMvmIVd4nQmI6XA-1 Received: by mail-lf1-f70.google.com with SMTP id 2adb3069b0e04-52c976efb3bso59823e87.1 for ; Wed, 12 Jun 2024 01:51:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718182303; x=1718787103; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=O/dPl3DOOVIgCS/TbYezdyFqpDWqxJxEVc/6kR/nqzI=; b=szZF3Q1dlUiG/bAfHAruLtQyNRN2Knvnba61/tBegR2mLdaCJl+fOQqRL1LUco/nG6 jRB3zJhLAtVISUsohuOPpJKh7uS8/o797pzqt3bWuXpYyJtxK0CzSrkYDK6aeq55RKic zU52WhGlDlK4Dk4KarXqv3d2ufyRJZTHuOFSprcWebXMXOe/IFq3wCZcdJHliKfrElml AQfl28QhfFmMFy6bRXDWi3k9exhkTlpwLtCu1j83y1ojAS48b7mkGqQuzbAJsilWsTbN 7PcVcQ7xyIvznSBlN0MVgjzvdEKWPez+7OSLoyEqwl7Hth/CByNCLuJkhBdc2EmQIqzE LGSg== X-Forwarded-Encrypted: i=1; AJvYcCV69QS6U2B7FDMdScTLjlCx3h16UrSihLa3uJUQbo+DnOi+lFIr/fhHm5meLqv8ptQewszJfoQQjxY2s2lziaLoHDXSZWC/tBnbrxmf X-Gm-Message-State: AOJu0YxfE7xCBkuB/XGwazSzk3vAb3XvWXLpqsxoHcTOkMUAk/mS4gix BCGJs27bZ7T1yhEqb6spOw7gvHzjH3QnDynrbQq6AE9sdo/HgedVy5L/KlWutmrvt8w5U7nlY69 9ckMnc3OYoAN6LWYXjD+Z918Zp+nln+441MoS6nKYO2IXcjqeK257tmTdNMu9Tg== X-Received: by 2002:a2e:a796:0:b0:2eb:d5f1:d8b2 with SMTP id 38308e7fff4ca-2ebfc9928b8mr7958381fa.3.1718182302963; Wed, 12 Jun 2024 01:51:42 -0700 (PDT) X-Received: by 2002:a2e:a796:0:b0:2eb:d5f1:d8b2 with SMTP id 38308e7fff4ca-2ebfc9928b8mr7957971fa.3.1718182302274; Wed, 12 Jun 2024 01:51:42 -0700 (PDT) Received: from pstanner-thinkpadt14sgen1.remote.csb (nat-pool-muc-t.redhat.com. [149.14.88.26]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-42286eef9c1sm17352385e9.7.2024.06.12.01.51.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Jun 2024 01:51:41 -0700 (PDT) Message-ID: Subject: Re: [PATCH v8 03/13] PCI: Reimplement plural devres functions From: Philipp Stanner To: Bjorn Helgaas Cc: Hans de Goede , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Bjorn Helgaas , Sam Ravnborg , dakr@redhat.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org Date: Wed, 12 Jun 2024 10:51:40 +0200 In-Reply-To: <20240611214458.GA999263@bhelgaas> References: <20240611214458.GA999263@bhelgaas> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.48.4 (3.48.4-1.fc38) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 T24gVHVlLCAyMDI0LTA2LTExIGF0IDE2OjQ0IC0wNTAwLCBCam9ybiBIZWxnYWFzIHdyb3RlOgo+ IEknbSB0cnlpbmcgdG8gbWVyZ2UgdGhlc2UgaW50byBwY2kvbmV4dCwgYnV0IEknbSBoYXZpbmcg YSBoYXJkIHRpbWUKPiB3cml0aW5nIHRoZSBtZXJnZSBjb21taXQgbG9nLsKgIEkgd2FudCBhIG9u ZS1zZW50ZW5jZSBkZXNjcmlwdGlvbiBvZgo+IGVhY2ggcGF0Y2ggdGhhdCB0ZWxscyBtZSB3aGF0 IHRoZSBiZW5lZml0IG9mIHRoZSBwYXRjaCBpcy7CoCBVc3VhbGx5Cj4gdGhlIHN1YmplY3QgbGlu ZSBpcyBhIGdvb2Qgc3RhcnQuCj4gCj4gIlJlaW1wbGVtZW50IHBsdXJhbCBkZXZyZXMgZnVuY3Rp b25zIiBpcyBraW5kIG9mIHZhZ3VlIGFuZCBkb2Vzbid0Cj4gcXVpdGUgbW90aXZhdGUgdGhpcyBw YXRjaCwgYW5kIEknbSBoYXZpbmcgYSBoYXJkIHRpbWUgZXh0cmFjdGluZyB0aGUKPiByZWxldmFu dCBkZXRhaWxzIGZyb20gdGhlIGNvbW1pdCBsb2cgYmVsb3cuCgpJIHdvdWxkIHNheSB0aGF0IHRo ZSBzdW1tYXJ5IHdvdWxkIGJlIHNvbWV0aGluZyBhbG9uZyB0aGUgbGluZXM6CiJTZXQgZ3JvdW5k IGxheWVyIGZvciBkZXZyZXMgc2ltcGxpZmljYXRpb24gYW5kIGV4dGVuc2lvbiIKCmJlY2F1c2Ug dGhpcyBwYXRjaCBzaW1wbGlmaWVzIHRoZSBleGlzdGluZyBmdW5jdGlvbnMgYW5kIGFkZHMKaW5m cmFzdHJ1Y3R1cmUgdGhhdCBjYW4gbGF0ZXIgYmUgdXNlZCB0byBkZXByZWNhdGUgdGhlIGJsb2F0 ZWQgZXhpc3RpbmcKZnVuY3Rpb25zLCByZW1vdmUgdGhlIGh5YnJpZCBtZWNoYW5pc20gYW5kIGFk ZCBwY2ltX2lvbWFwX3JhbmdlKCkuCgo+IAo+IE9uIE1vbiwgSnVuIDEwLCAyMDI0IGF0IDExOjMx OjI1QU0gKzAyMDAsIFBoaWxpcHAgU3Rhbm5lciB3cm90ZToKPiA+IFdoZW4gdGhlIG9yaWdpbmFs IFBDSSBkZXZyZXMgQVBJIHdhcyBpbXBsZW1lbnRlZCwgcHJpb3JpdHkgd2FzCj4gPiBnaXZlbiB0 byB0aGUKPiA+IGNyZWF0aW9uIG9mIGEgc2V0IG9mICJwbHVyYWwgZnVuY3Rpb25zIiBzdWNoIGFz Cj4gPiBwY2ltX3JlcXVlc3RfcmVnaW9ucygpLgo+ID4gVGhlc2UgZnVuY3Rpb25zIGhhdmUgYml0 IG1hc2tzIGFzIHBhcmFtZXRlcnMgdG8gc3BlY2lmeSB3aGljaCBCQVJzCj4gPiBzaGFsbAo+ID4g Z2V0IG1hcHBlZC4gTW9zdCB1c2VycywgaG93ZXZlciwgb25seSB1c2UgdGhvc2UgdG8gbWFwIDEt MyBCQVJzLgo+ID4gCj4gPiBBIGNvbXBsZXRlIHNldCBvZiAic2luZ3VsYXIgZnVuY3Rpb25zIiBk b2VzIG5vdCBleGlzdC4KPiA+IAo+ID4gQXMgZnVuY3Rpb25zIG1hcHBpbmcgLyByZXF1ZXN0aW5n IG11bHRpcGxlIEJBUnMgYXQgb25jZSBoYXZlCj4gPiAoYWxtb3N0KSBubwo+ID4gbWVjaGFuaXNt IGluIEMgdG8gcmV0dXJuIHRoZSByZXNvdXJjZXMgdG8gdGhlIGNhbGxlciBvZiB0aGUgcGx1cmFs Cj4gPiBmdW5jdGlvbiwgdGhlIFBDSSBkZXZyZXMgQVBJIHV0aWxpemVzIHRoZSBpb21hcC10YWJs ZSBhZG1pbmlzdHJhdGVkCj4gPiBieSB0aGUKPiA+IGZ1bmN0aW9uIHBjaW1faW9tYXBfdGFibGUo KS4KPiA+IAo+ID4gVGhlIGVudGlyZSBQQ0kgZGV2cmVzIEFQSSB3YXMgc3Ryb25nbHkgdGllZCB0 byB0aGF0IHRhYmxlIHdoaWNoCj4gPiBvbmx5IGFsbG93cwo+ID4gZm9yIG1hcHBpbmcgd2hvbGUs IGNvbXBsZXRlIEJBUnMsIGFzIHRoZSBCQVIncyBpbmRleCBpcyB1c2VkIGFzCj4gPiB0YWJsZQo+ ID4gaW5kZXguIENvbnNlcXVlbnRseSwgaXQncyBub3QgcG9zc2libGUgdG8sIGUuZy4sIGhhdmUg YQo+ID4gcGNpbV9pb21hcF9yYW5nZSgpCj4gPiBmdW5jdGlvbiB3aXRoIHRoYXQgbWVjaGFuaXNt Lgo+IAo+IEknbSBnZXR0aW5nIHRoZSBoaW50IHRoYXQgcGFydCBvZiB0aGUgcG9pbnQgb2YgdGhp cyBwYXRjaCBpcyB0byBhZGQKPiBpbmZyYXN0cnVjdHVyZSBzbyB3ZSBjYW4gcmVxdWVzdCBhbmQg bWFwIGVpdGhlciBhbiBlbnRpcmUgQkFSIG9yIGp1c3QKPiBwYXJ0IG9mIGEgQkFSPwoKWWVzLCB0 aGF0IGFuZCBpbiB0aGUgbG9uZyB0ZXJtIHRoZSBzaW1wbGlmaWNhdGlvbiBvZiB0aGUgUENJIGRl dnJlcyBBUEkKaXMgdGhlIGdvYWwuCgo+IAo+ID4gQW4gYWRkaXRpb25hbCBwcm9ibGVtIGlzIHRo YXQgdGhlIFBDSSBkZXZyZXMgQVBJIGhhcyBiZWVuCj4gPiBpbXBsZW1lbnRlZCBpbiBhCj4gPiBz b3J0IG9mICJoeWJyaWQtbW9kZSI6IFNvbWUgdW5tYW5hZ2VkIGZ1bmN0aW9ucyBoYXZlIG1hbmFn ZWQKPiA+IGNvdW50ZXJwYXJ0cwo+ID4gKGUuZy46IHBjaV9pb21hcCgpIDwtPiBwY2ltX2lvbWFw KCkpLCBtYWtpbmcgdGhlaXIgbWFuYWdlZCBuYXR1cmUKPiA+IG9idmlvdXMKPiA+IHRvIHRoZSBw cm9ncmFtbWVyLiBIb3dldmVyLCB0aGUgcmVnaW9uLXJlcXVlc3QgZnVuY3Rpb25zIGluIHBjaS5j LAo+ID4gcHJlZml4ZWQKPiA+IHdpdGggcGNpXywgYmVoYXZlIGVpdGhlciBtYW5hZ2VkIG9yIHVu bWFuYWdlZCwgZGVwZW5kaW5nIG9uIHdoZXRoZXIKPiA+IHBjaV9lbmFibGVfZGV2aWNlKCkgb3Ig cGNpbV9lbmFibGVfZGV2aWNlKCkgaGFzIGJlZW4gY2FsbGVkIGluCj4gPiBhZHZhbmNlLgo+ID4g Cj4gPiBUaGlzIGh5YnJpZCBBUEkgaXMgY29uZnVzaW5nIGFuZCBzaG91bGQgYmUgbW9yZSBjbGVh bmx5IHNlcGFyYXRlZAo+ID4gYnkKPiA+IHByb3ZpZGluZyBhbHdheXMtbWFuYWdlZCBmdW5jdGlv bnMgcHJlZml4ZWQgd2l0aCBwY2ltXy4KPiAKPiBJJ20gbm90IHN1cmUgdGhlc2UgdHdvIHBhcmFn cmFwaHMgYXBwbHkgdG8gdGhpcyBwYXRjaC7CoCBJZiB0aGV5IGRvLAo+IGJlCj4gc3BlY2lmaWMg YWJvdXQgd2hpY2ggZnVuY3Rpb25zIGFyZSBhZmZlY3RlZCBhbmQgaG93IHRoaXMgcGF0Y2ggZml4 ZXMKPiB0aGVtLgoKVGhhdCdzIGEgcmVsaWN0IGZyb20gdGhlIGRheXMgd2hlbiB0aGlzIHNlcmll cyBjb25zaXN0ZWQgb2YgZmV3ZXIKY29tbWl0cy4gQmFjayB0aGVuIHRoaXMgY29tbWl0J3MgYW5j ZXN0b3Igc2VydmVkIHByZXBhcmluZyB0aGUgZW50aXJlCnNlcmllczsgdGhlcmVmb3JlLCBpdCBj b250YWluZWQgYSBsb3Qgb2YgbW90aXZhdGlvbmFsIGluZm9ybWF0aW9uLgoKSSBjYW4ganVzdCBj dXQgdGhhdCBvdXQuIEkgZ3Vlc3MgYSBsaW5rIHRvIHRoZSBtYWlsIHRocmVhZCBhbmQgaXRzCmNv dmVyIGxldHRlciBpbiB0aGUgY29tbWl0IG1lc3NhZ2Ugd291bGQgZXhwbGFpbiB0aGUgd2lkZXIg bW90aXZhdGlvbgpiZWhpbmQgYWxsIG9mIHRoaXMuCgo+IAo+ID4gVGh1cywgdGhlIGV4aXN0aW5n IFBDSSBkZXZyZXMgQVBJIGlzIG5vdCBkZXNpcmFibGUgYmVjYXVzZToKPiA+IAo+ID4gwqAgYSkg VGhlIHZhc3QgbWFqb3JpdHkgb2YgdGhlIHVzZXJzIG9mIHRoZSBwbHVyYWwgZnVuY3Rpb25zIG9u bHkKPiA+IGV2ZXIgc2V0cwo+ID4gwqDCoMKgwqAgYSBzaW5nbGUgYml0IGluIHRoZSBiaXQgbWFz aywgY29uc2VxdWVudGx5IG1ha2luZyB0aGVtCj4gPiBzaW5ndWxhcgo+ID4gwqDCoMKgwqAgZnVu Y3Rpb25zIGFueXdheXMuCj4gPiAKPiA+IMKgIGIpIFRoZXJlIGlzIG5vIG1lY2hhbmlzbSB0byBy ZXF1ZXN0IC8gaW9tYXAgb25seSBwYXJ0IG9mIGEgQkFSLgo+IAo+ID4gwqAgYykgVGhlIGlvbWFw LXRhYmxlIG1lY2hhbmlzbSBpcyBvdmVyLWVuZ2luZWVyZWQgYW5kIGNvbXBsaWNhdGVkLgo+ID4g RXZlbgo+ID4gwqDCoMKgwqAgd29yc2UsIHNvbWUgdXNlcnMgaW5kZXggb3ZlciB0aGUgdGFibGUg YWRtaW5pc3RyYXRpb24gZnVuY3Rpb24KPiA+IMKgwqDCoMKgIGRpcmVjdGx5LCBlLmcuOgo+ID4g Cj4gPiDCoMKgwqDCoMKgwqAgdm9pZCBfX2lvbWVtICptYXBwaW5nID0gcGNpbV9pb21hcF90YWJs ZShwZGV2KVtteV9pbmRleF07Cj4gPiAKPiA+IMKgwqDCoMKgIFRoaXMgY2FuIG5vdCBwZXJmb3Jt IGJvdW5kcyBjaGVja3M7IGFuIGludmFsaWQgaW5kZXggd29uJ3QKPiA+IGNhdXNlCj4gPiDCoMKg wqDCoCByZXR1cm4gb2YgLUVJTlZBTCBvciBldmVuIE5VTEwsIHJlc3VsdGluZyBpbiB1bmRlZmlu ZWQKPiA+IGJlaGF2aW9yLgo+IAo+IFRydWUsIGJ1dCAqdGhpcyogcGF0Y2ggZG9lc24ndCByZW1v dmUgb3IgZGVwcmVjYXRlCj4gcGNpbV9pb21hcF90YWJsZSgpLAo+IHNvIG5lZWRzIHRvIGJlIGlu IHRoZSBwYXRjaCB0aGF0IGRvZXMgdGhhdCwgbm90IGhlcmUuCj4gCj4gCj4gQUNLLCBJIHdpbGwg cmVtb3ZlIGl0Lgo+IAo+IAo+ID4gwqAgZCkgcmVnaW9uLXJlcXVlc3QgZnVuY3Rpb25zIGJlaW5n IHNvbWV0aW1lcyBtYW5hZ2VkIGFuZCBzb21ldGltZXMKPiA+IG5vdAo+ID4gwqDCoMKgwqAgaXMg YnVnLXByb3Zva2luZy4KPiAKPiBJJ20gbm90IHN1cmUgYWxsIHRoZSBkZWZpY2llbmNpZXMgb2Yg dGhlIHBhc3QgYXJlIG5lY2Vzc2FyeS7CoCBJJ20KPiBtb3JlCj4gaW50ZXJlc3RlZCBpbiBzcGVj aWZpY3MgYWJvdXQgd2hhdCdzIGJlaW5nIGFkZGVkIG9yIGZpeGVkLgoKQUNLCgo+IAo+ID4gSW1w bGVtZW50IGEgc2V0IG9mIGludGVybmFsIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBkb24ndCBoYXZl IHRoZQo+ID4gcHJvYmxlbSBvZgo+ID4gYSBoeWJyaWQgbmF0dXJlIHRoYXQgdGhlaXIgY291bnRl ciBwYXJ0cyBpbiBwY2kuYyBoYXZlLiBXcml0ZSB0aG9zZQo+ID4gaGVscGVycwo+ID4gaW4gYSBn ZW5lcmljIG1hbm5lciBzbyB0aGF0IHRoZXkgY2FuIGVhc2lseSBiZSBleHRlbmRlZCB0bywgZS5n LiwKPiA+IHJhbmdlZAo+ID4gbWFwcGluZ3MgYW5kIHJlcXVlc3RzLgo+ID4gCj4gPiBJbXBsZW1l bnQgYSBzZXQgb2Ygc2luZ3VsYXIgZnVuY3Rpb25zIAo+IAo+IFdoYXQgaXMgdGhpcyBzZXQgb2Yg ZnVuY3Rpb25zP8KgIE15IGd1ZXNzIGlzIGJlbG93Lgo+IAo+ID4gdGhhdCB1c2UgZGV2cmVzIGFz IGl0J3MgaW50ZW5kZWQgYW5kCj4gPiB1c2UgdGhvc2Ugc2luZ3VsYXIgZnVuY3Rpb25zIHRvIHJl aW1wbGVtZW50IHRoZSBwbHVyYWwgZnVuY3Rpb25zLgo+IAo+IFdoYXQgZG9lcyAiYXMgaXQncyBp bnRlbmRlZCIgbWVhbj/CoCBUb28gbmVidWxvdXMgdG8gZml0IGhlcmUuCgpXZWxsLCB0aGUgaWRl YSBiZWhpbmQgZGV2cmVzIGlzIHRoYXQgeW91IGFsbG9jYXRlIGEgZGV2aWNlIHJlc291cmNlCl9m b3IgZWFjaF8gb2JqZWN0IHlvdSB3YW50IHRvIGJlIGZyZWVkIC8gZGVpbml0aWFsaXplZCBhdXRv bWF0aWNhbGx5LgpPbmUgZGV2cmVzIG9iamVjdCBwZXIgZHJpdmVyIC8gc3Vic3lzdGVtIG9iamVj dCwgb25lIGRldnJlcyBjYWxsYmFjawpwZXIgY2xlYW51cCBqb2IgZm9yIHRoZSBkcml2ZXIgLyBz dWJzeXN0ZW0uCgpXaGF0IFBDSSBkZXZyZXMgZGlkIGluc3RlYWQgd2FzIHRvIHVzZSBqdXN0IE9O RSBkZXZyZXMgb2JqZWN0IF9mb3IKZXZlcnl0aGluZ18gYW5kIHRoZW4gaXQgaGFkIHRvIGltcGxl bWVudCBhbGwgc29ydHMgb2YgY2hlY2tzIHRvIGNoZWNrCndoaWNoIHN1Yi1yZXNvdXJjZSB0aGlz IG1hc3RlciByZXNvdXJjZSBpcyBhY3R1YWxseSBhYm91dDoKCihmcm9tIGRldnJlcy5jKQpzdGF0 aWMgdm9pZCBwY2ltX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZ2VuZGV2LCB2b2lkICpyZXMpCnsK CXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGdlbmRldik7CglzdHJ1Y3QgcGNpX2Rl dnJlcyAqdGhpcyA9IHJlczsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRf UkVTT1VSQ0U7IGkrKykKCQlpZiAodGhpcy0+cmVnaW9uX21hc2sgJiAoMSA8PCBpKSkKCQkJcGNp X3JlbGVhc2VfcmVnaW9uKGRldiwgaSk7CgoJaWYgKHRoaXMtPm13aSkKCQlwY2lfY2xlYXJfbXdp KGRldik7CgoJaWYgKHRoaXMtPnJlc3RvcmVfaW50eCkKCQlwY2lfaW50eChkZXYsIHRoaXMtPm9y aWdfaW50eCk7CgoJaWYgKHRoaXMtPmVuYWJsZWQgJiYgIXRoaXMtPnBpbm5lZCkKCQlwY2lfZGlz YWJsZV9kZXZpY2UoZGV2KTsKfQoKClNvIG9uZSBjb3VsZCBkYXJlIHRvIHNheSB0aGF0IGRldnJl cyB3YXMgcGFydGlhbGx5IHJlLWltcGxlbWVudGVkIG9uCnRvcCBvZiBkZXZyZXMuCgpUaGUgZm9y LWxvb3AgYW5kIHRoZSBpZi1jb25kaXRpb25zIGNvbnN0aXR1dGUgdGhhdCAicmUtaW1wbGVtZW50 YXRpb24iLgpObyBvbmUgaGFzIGFueSBjbHVlIHdoeSBpdCBoYXMgYmVlbiBkb25lIHRoYXQgd2F5 LCBiZWNhdXNlIGl0IHByb3ZpZGVzCjAgdXBzaWRlcyBhbmQgd291bGQgaGF2ZSBiZWVuIGZhciBl YXNpZXIgdG8gaW1wbGVtZW50IGJ5IGp1c3QgbGV0dGluZwpkZXZyZXMgZG8gaXRzIGpvYi4KCldv dWxkIHlvdSBsaWtlIHRvIHNlZSB0aGUgYWJvdmUgZGV0YWlscyBpbiB0aGUgY29tbWl0IG1lc3Nh Z2U/Cgo+IAo+IElJVUMsIHRoaXMgcGF0Y2ggYWRkcyBzdHJ1Y3QgcGNpbV9hZGRyX2RldnJlcywg d2hpY2ggY29udGFpbnM6Cj4gCj4gwqAgLSBhIEJBUiBudW1iZXIKPiDCoCAtIGFuIG9mZnNldCBp bnRvIHRoZSBCQVIKPiDCoCAtIGEgbGVuZ3RoCj4gwqAgLSB0aGUgdHlwZSBvZiBvcGVyYXRpb24g KHJlcXVlc3QsIG1hcCwgb3IgYm90aCkKPiDCoCAtIHRoZSBpb3JlbWFwcGVkIGFkZHJlc3MgKGlm IGFwcGxpY2FibGUpCgpZdXAuIHBjaW1fYWRkcl9kZXZyZXMgY291cGxlcyByZWdpb24gcmVxdWVz dHMgYW5kIGlvLW1hcHBpbmdzLCBzaW5jZQp0aG9zZSBhcmUgdmVyeSBmcmVxdWVudGx5IGNyZWF0 ZWQgdG9nZXRoZXIKCj4gCj4gYW5kIGl0IGxvb2tzIGxpa2Ugd2UncmUgYWRkaW5nIHRoZXNlICh3 aGljaCBhcmUgY3VycmVudGx5IG9ubHkgZm9yCj4gdXNlCj4gaW5zaWRlIGRyaXZlcnMvcGNpLyk6 Cj4gCj4gwqAgcGNpbV9pb21hcF9yZWdpb24oKcKgwqDCoMKgwqDCoMKgwqDCoMKgICMgcmVxdWVz dCAmIG1hcCBlbnRpcmUgQkFSCj4gwqAgcGNpbV9pb3VubWFwX3JlZ2lvbigpwqDCoMKgwqDCoMKg wqDCoCAjIHVubWFwICYgcmVsZWFzZSBlbnRpcmUgQkFSCj4gwqAgcGNpbV9yZXF1ZXN0X3JlZ2lv bigpwqDCoMKgwqDCoMKgwqDCoCAjIHJlcXVlc3QgZW50aXJlIEJBUgo+IMKgIHBjaW1fcmVsZWFz ZV9yZWdpb24oKcKgwqDCoMKgwqDCoMKgwqAgIyByZWxlYXNlIGVudGlyZSBCQVIKPiDCoCBwY2lt X3JlbGVhc2VfYWxsX3JlZ2lvbnMoKcKgwqDCoCAjIHJlbGVhc2UgYWxsIGVudGlyZSBCQVJzCj4g wqAgcGNpbV9yZXF1ZXN0X2FsbF9yZWdpb25zKCnCoMKgwqAgIyByZXF1ZXN0IGFsbCBlbnRpcmUg QkFScwo+IAo+IGFuZCByZWltcGxlbWVudHMgdGhlc2UgaW50ZXJmYWNlcyAod2hpY2ggYXJlIG1v c3RseSBleHBvcnRlZCB0bwo+IGRyaXZlcnMpIHNvIHRoZXkgYnVpbGQgb24gdG9wIG9mIHN0cnVj dCBwY2ltX2FkZHJfZGV2cmVzIGFuZCB1c2Ugc29tZQo+IG9mIHRoZSBpbnRlcm5hbCBmdW5jdGlv bnMgYWRkZWQgYWJvdmU6Cj4gCj4gwqAgcGNpbV9pb21hcF9yZWxlYXNlKCnCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgICMgaW50ZXJuYWwgb25seQo+IAo+IMKgIHBjaW1faW9tYXAo KcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICMgbWFw IHBhcnRpYWwgQkFSCj4gwqAgcGNpbV9pb3VubWFwKCkKPiDCoCBwY2ltX2lvbWFwX3JlZ2lvbnMo KcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIyByZXF1ZXN0ICYgbWFwIHNwZWNp ZmllZAo+IEJBUnMKPiDCoCBwY2ltX2lvbWFwX3JlZ2lvbnNfcmVxdWVzdF9hbGwoKcKgwqDCoMKg wqAgIyByZXF1ZXN0IGFsbCBCQVJzLCBtYXAKPiBzcGVjaWZpZWQgQkFScwo+IMKgIHBjaW1faW91 bm1hcF9yZWdpb25zKCnCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIyB1bm1hcCAmIHJl bGVhc2Ugc3BlY2lmaWVkCj4gQkFScwo+IAo+IFRoaXMgaXMgdGhlIGtpbmQgb2Ygc3BlY2lmaWMg ZGV0YWlsIEknbSBsb29raW5nIGZvci4KCkNvcnJlY3QgOikKCgpTbyBsZXQgbWUgcmV3b3JrIHRo aXMgY29tbWl0IG1lc3NhZ2Ugc28gaXQgb25seSBzdGF0ZXMgdGhlIGJhc2ljCm1vdGl2YXRpb24g KHNpbXBsaWZpY2F0aW9uLCBncm91bmRsYXllciBsYXRlciBleHRlbnNpb24gb2YgUENJIGRldnJl cykKYW5kIHRoZW4gbGlzdHMgcHJlY2lzZWx5IHdoYXQgaXMgYmVpbmcgZG9uZS4KCkkgY2FuIHBy b3ZpZGUgdGhhdCBpbiB2OSB0b2dldGhlciB3aXRoIHRoZSBmb3Jnb3R0ZW4gImVuYWJsZWQiIGJp dCBpbgp0aGUgb3RoZXIgcGF0Y2guCgoKQ2hlZXJzLApQLgoKCj4gCj4gPiBMaW5rOgo+ID4gaHR0 cHM6Ly9sb3JlLmtlcm5lbC5vcmcvci8yMDI0MDYwNTA4MTYwNS4xODc2OS01LXBzdGFubmVyQHJl ZGhhdC5jb20KPiA+IFNpZ25lZC1vZmYtYnk6IFBoaWxpcHAgU3Rhbm5lciA8cHN0YW5uZXJAcmVk aGF0LmNvbT4KPiA+IFNpZ25lZC1vZmYtYnk6IEJqb3JuIEhlbGdhYXMgPGJoZWxnYWFzQGdvb2ds ZS5jb20+Cj4gPiAtLS0KPiA+IMKgZHJpdmVycy9wY2kvZGV2cmVzLmMgfCA2MDggKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKystCj4gPiAtLS0tCj4gPiDCoGRyaXZlcnMvcGNp L3BjaS5jwqDCoMKgIHzCoCAyMiArKwo+ID4gwqBkcml2ZXJzL3BjaS9wY2kuaMKgwqDCoCB8wqDC oCA1ICsKPiA+IMKgMyBmaWxlcyBjaGFuZ2VkLCA1NjggaW5zZXJ0aW9ucygrKSwgNjcgZGVsZXRp b25zKC0pCj4gPiAKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9kZXZyZXMuYyBiL2RyaXZl cnMvcGNpL2RldnJlcy5jCj4gPiBpbmRleCA4NDVkNmZhYjBjZTcuLjgyZjcxZjVlMTY0YSAxMDA2 NDQKPiA+IC0tLSBhL2RyaXZlcnMvcGNpL2RldnJlcy5jCj4gPiArKysgYi9kcml2ZXJzL3BjaS9k ZXZyZXMuYwo+ID4gQEAgLTQsMTQgKzQsMjQzIEBACj4gPiDCoCNpbmNsdWRlICJwY2kuaCIKPiA+ IMKgCj4gPiDCoC8qCj4gPiAtICogUENJIGlvbWFwIGRldnJlcwo+ID4gKyAqIE9uIHRoZSBzdGF0 ZSBvZiBQQ0kncyBkZXZyZXMgaW1wbGVtZW50YXRpb246Cj4gPiArICoKPiA+ICsgKiBUaGUgb2xk ZXIgZGV2cmVzIEFQSSBmb3IgUENJIGhhcyB0d28gc2lnbmlmaWNhbnQgcHJvYmxlbXM6Cj4gPiAr ICoKPiA+ICsgKiAxLiBJdCBpcyB2ZXJ5IHN0cm9uZ2x5IHRpZWQgdG8gdGhlIHN0YXRpY2FsbHkg YWxsb2NhdGVkIG1hcHBpbmcKPiA+IHRhYmxlIGluCj4gPiArICrCoMKgwqAgc3RydWN0IHBjaW1f aW9tYXBfZGV2cmVzIGJlbG93LiBUaGlzIGlzIG1vc3RseSBzb2x2ZWQgaW4gdGhlCj4gPiBzZW5z ZSBvZiB0aGUKPiA+ICsgKsKgwqDCoCBwY2ltXyBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIHByb3Zp ZGluZyB0aGluZ3MgbGlrZSByYW5nZWQKPiA+IG1hcHBpbmcgYnkKPiA+ICsgKsKgwqDCoCBieXBh c3NpbmcgdGhpcyB0YWJsZSwgd2hlcmFzIHRoZSBmdW5jdGlvbnMgdGhhdCB3ZXJlIHByZXNlbnQK PiA+IGluIHRoZSBvbGQKPiA+ICsgKsKgwqDCoCBBUEkgc3RpbGwgZW50ZXIgdGhlIG1hcHBpbmcg YWRkcmVzc2VzIGludG8gdGhlIHRhYmxlIGZvcgo+ID4gdXNlcnMgb2YgdGhlIG9sZAo+ID4gKyAq wqDCoMKgIEFQSS4KPiA+ICsgKgo+ID4gKyAqIDIuIFRoZSByZWdpb24tcmVxdWVzdC1mdW5jdGlv bnMgaW4gcGNpLmMgZG8gYmVjb21lIG1hbmFnZWQgSUYKPiA+IHRoZSBkZXZpY2UgaGFzCj4gPiAr ICrCoMKgwqAgYmVlbiBlbmFibGVkIHdpdGggcGNpbV9lbmFibGVfZGV2aWNlKCkgaW5zdGVhZCBv Zgo+ID4gcGNpX2VuYWJsZV9kZXZpY2UoKS4KPiA+ICsgKsKgwqDCoCBUaGlzIHJlc3VsdGVkIGlu IHRoZSBBUEkgYmVjb21pbmcgaW5jb25zaXN0ZW50OiBTb21lCj4gPiBmdW5jdGlvbnMgaGF2ZSBh bgo+ID4gKyAqwqDCoMKgIG9idmlvdXNseSBtYW5hZ2VkIGNvdW50ZXItcGFydCAoZS5nLiwgcGNp X2lvbWFwKCkgPC0+Cj4gPiBwY2ltX2lvbWFwKCkpLAo+ID4gKyAqwqDCoMKgIHdoZXJlYXMgc29t ZSBkb24ndCBhbmQgYXJlIG5ldmVyIG1hbmFnZWQsIHdoaWxlIG90aGVycyBkb24ndAo+ID4gYW5k IGFyZQo+ID4gKyAqwqDCoMKgIF9zb21ldGltZXNfIG1hbmFnZWQgKGUuZy4gcGNpX3JlcXVlc3Rf cmVnaW9uKCkpLgo+ID4gKyAqCj4gPiArICrCoMKgwqAgQ29uc2VxdWVudGx5LCBpbiB0aGUgbmV3 IEFQSSwgcmVnaW9uIHJlcXVlc3RzIHBlcmZvcm1lZCBieQo+ID4gdGhlIHBjaW1fCj4gPiArICrC oMKgwqAgZnVuY3Rpb25zIGFyZSBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgdXAgdGhyb3VnaCB0aGUg ZGV2cmVzCj4gPiBjYWxsYmFjawo+ID4gKyAqwqDCoMKgIHBjaW1fYWRkcl9yZXNvdXJjZV9yZWxl YXNlKCksIHdoaWxlIHJlcXVlc3RzIHBlcmZvcm1lZCBieQo+ID4gKyAqwqDCoMKgIHBjaW1fZW5h YmxlX2RldmljZSgpICsgcGNpXypyZWdpb24qKCkgYXJlIGF1dG9tYXRpY2FsbHkKPiA+IGNsZWFu ZWQgdXAKPiA+ICsgKsKgwqDCoCB0aHJvdWdoIHRoZSBmb3ItbG9vcCBpbiBwY2ltX3JlbGVhc2Uo KS4KPiA+ICsgKgo+ID4gKyAqIFRPRE8gMToKPiA+ICsgKiBSZW1vdmUgdGhlIGxlZ2FjeSB0YWJs ZSBlbnRpcmVseSBvbmNlIGFsbCBjYWxscyB0bwo+ID4gcGNpbV9pb21hcF90YWJsZSgpIGluCj4g PiArICogdGhlIGtlcm5lbCBoYXZlIGJlZW4gcmVtb3ZlZC4KPiA+ICsgKgo+ID4gKyAqIFRPRE8g MjoKPiA+ICsgKiBQb3J0IGV2ZXJ5b25lIGNhbGxpbmcgcGNpbV9lbmFibGVfZGV2aWNlKCkgKyBw Y2lfKnJlZ2lvbiooKSB0bwo+ID4gdXNpbmcgdGhlCj4gPiArICogcGNpbV8gZnVuY3Rpb25zLiBU aGVuLCByZW1vdmUgYWxsIGRldnJlcyBmdW5jdGlvbmFsaXR5IGZyb20KPiA+IHBjaV8qcmVnaW9u KigpCj4gPiArICogZnVuY3Rpb25zIGFuZCByZW1vdmUgdGhlIGFzc29jaWF0ZWQgY2xlYW51cHMg ZGVzY3JpYmVkIGFib3ZlIGluCj4gPiBwb2ludCAjMi4KPiA+IMKgICovCj4gPiAtI2RlZmluZSBQ Q0lNX0lPTUFQX01BWMKgUENJX1NURF9OVU1fQkFSUwo+ID4gwqAKPiA+ICsvKgo+ID4gKyAqIExl Z2FjeSBzdHJ1Y3Qgc3RvcmluZyBhZGRyZXNzZXMgdG8gd2hvbGUgbWFwcGVkIEJBUnMuCj4gPiAr ICovCj4gPiDCoHN0cnVjdCBwY2ltX2lvbWFwX2RldnJlcyB7Cj4gPiAtwqDCoMKgwqDCoMKgwqB2 b2lkIF9faW9tZW0gKnRhYmxlW1BDSU1fSU9NQVBfTUFYXTsKPiA+ICvCoMKgwqDCoMKgwqDCoHZv aWQgX19pb21lbSAqdGFibGVbUENJX1NURF9OVU1fQkFSU107Cj4gPiArfTsKPiA+ICsKPiA+ICtl bnVtIHBjaW1fYWRkcl9kZXZyZXNfdHlwZSB7Cj4gPiArwqDCoMKgwqDCoMKgwqAvKiBEZWZhdWx0 IGluaXRpYWxpemVyLiAqLwo+ID4gK8KgwqDCoMKgwqDCoMKgUENJTV9BRERSX0RFVlJFU19UWVBF X0lOVkFMSUQsCj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqAvKiBBIHJlcXVlc3RlZCByZWdpb24g c3Bhbm5pbmcgYW4gZW50aXJlIEJBUi4gKi8KPiA+ICvCoMKgwqDCoMKgwqDCoFBDSU1fQUREUl9E RVZSRVNfVFlQRV9SRUdJT04sCj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqAvKgo+ID4gK8KgwqDC oMKgwqDCoMKgICogQSByZXF1ZXN0ZWQgcmVnaW9uIHNwYW5uaW5nIGFuIGVudGlyZSBCQVIsIGFu ZCBhIG1hcHBpbmcKPiA+IGZvcgo+ID4gK8KgwqDCoMKgwqDCoMKgICogdGhlIGVudGlyZSBCQVIu Cj4gPiArwqDCoMKgwqDCoMKgwqAgKi8KPiA+ICvCoMKgwqDCoMKgwqDCoFBDSU1fQUREUl9ERVZS RVNfVFlQRV9SRUdJT05fTUFQUElORywKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoC8qCj4gPiAr wqDCoMKgwqDCoMKgwqAgKiBBIG1hcHBpbmcgd2l0aGluIGEgQkFSLCBlaXRoZXIgc3Bhbm5pbmcg dGhlIHdob2xlIEJBUiBvcgo+ID4ganVzdCBhCj4gPiArwqDCoMKgwqDCoMKgwqAgKiByYW5nZS7C oCBXaXRob3V0IGEgcmVxdWVzdGVkIHJlZ2lvbi4KPiA+ICvCoMKgwqDCoMKgwqDCoCAqLwo+ID4g K8KgwqDCoMKgwqDCoMKgUENJTV9BRERSX0RFVlJFU19UWVBFX01BUFBJTkcsCj4gPiDCoH07Cj4g PiDCoAo+ID4gKy8qCj4gPiArICogVGhpcyBzdHJ1Y3QgZW52ZWxvcHMgSU8gb3IgTUVNIGFkZHJl c3NlcywgaS5lLiwgbWFwcGluZ3MgYW5kCj4gPiByZWdpb24KPiA+ICsgKiByZXF1ZXN0cywgYmVj YXVzZSB0aG9zZSBhcmUgdmVyeSBmcmVxdWVudGx5IHJlcXVlc3RlZCBhbmQKPiA+IHJlbGVhc2Vk Cj4gPiArICogdG9nZXRoZXIuCj4gPiArICovCj4gPiArc3RydWN0IHBjaW1fYWRkcl9kZXZyZXMg ewo+ID4gK8KgwqDCoMKgwqDCoMKgZW51bSBwY2ltX2FkZHJfZGV2cmVzX3R5cGUgdHlwZTsKPiA+ ICvCoMKgwqDCoMKgwqDCoHZvaWQgX19pb21lbSAqYmFzZWFkZHI7Cj4gPiArwqDCoMKgwqDCoMKg wqB1bnNpZ25lZCBsb25nIG9mZnNldDsKPiA+ICvCoMKgwqDCoMKgwqDCoHVuc2lnbmVkIGxvbmcg bGVuOwo+ID4gK8KgwqDCoMKgwqDCoMKgc2hvcnQgYmFyOwo+ID4gK307Cj4gPiArCj4gPiArc3Rh dGljIGlubGluZSB2b2lkIHBjaW1fYWRkcl9kZXZyZXNfY2xlYXIoc3RydWN0IHBjaW1fYWRkcl9k ZXZyZXMKPiA+ICpyZXMpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgbWVtc2V0KHJlcywgMCwg c2l6ZW9mKCpyZXMpKTsKPiA+ICvCoMKgwqDCoMKgwqDCoHJlcy0+YmFyID0gLTE7Cj4gPiArfQo+ ID4gKwo+ID4gKy8qCj4gPiArICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMsIF9fcGNpbV8qX3Jl Z2lvbiosIGV4aXN0IGFzCj4gPiBjb3VudGVycGFydHMgdG8gdGhlCj4gPiArICogdmVyc2lvbnMg ZnJvbSBwY2kuYyAtIHdoaWNoLCB1bmZvcnR1bmF0ZWx5LCBjYW4gYmUgaW4gImh5YnJpZAo+ID4g bW9kZSIsIGkuZS4sCj4gPiArICogc29tZXRpbWVzIG1hbmFnZWQsIHNvbWV0aW1lcyBub3QuCj4g PiArICoKPiA+ICsgKiBUbyBzZXBhcmF0ZSB0aGUgQVBJcyBjbGVhbmx5LCB3ZSBkZWZpbmUgb3Vy IG93biwgc2ltcGxpZmllZAo+ID4gdmVyc2lvbnMgaGVyZS4KPiA+ICsgKi8KPiA+ICsKPiA+ICsv KioKPiA+ICsgKiBfX3BjaW1fcmVxdWVzdF9yZWdpb25fcmFuZ2UgLSBSZXF1ZXN0IGEgcmFuZ2Vk IHJlZ2lvbgo+ID4gKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHRoZSByZWdpb24gYmVsb25ncyB0bwo+ ID4gKyAqIEBiYXI6IEJBUiB0aGUgcmFuZ2UgaXMgd2l0aGluCj4gPiArICogQG9mZnNldDogb2Zm c2V0IGZyb20gdGhlIEJBUidzIHN0YXJ0IGFkZHJlc3MKPiA+ICsgKiBAbWF4bGVuOiBsZW5ndGgg aW4gYnl0ZXMsIGJlZ2lubmluZyBhdCBAb2Zmc2V0Cj4gPiArICogQG5hbWU6IG5hbWUgYXNzb2Np YXRlZCB3aXRoIHRoZSByZXF1ZXN0Cj4gPiArICogQHJlcV9mbGFnczogZmxhZ3MgZm9yIHRoZSBy ZXF1ZXN0LCBlLmcuLCBmb3Iga2VybmVsLWV4Y2x1c2l2ZQo+ID4gcmVxdWVzdHMKPiA+ICsgKgo+ ID4gKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZh aWx1cmUuCj4gPiArICoKPiA+ICsgKiBSZXF1ZXN0IGEgcmFuZ2Ugd2l0aGluIGEgZGV2aWNlJ3Mg UENJIEJBUi7CoCBTYW5pdHkgY2hlY2sgdGhlCj4gPiBpbnB1dC4KPiA+ICsgKi8KPiA+ICtzdGF0 aWMgaW50IF9fcGNpbV9yZXF1ZXN0X3JlZ2lvbl9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwg aW50Cj4gPiBiYXIsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdW5zaWduZWQg bG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4bGVuLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGNvbnN0IGNoYXIgKm5hbWUsIGludCByZXFfZmxhZ3MpCj4gPiArewo+ID4g K8KgwqDCoMKgwqDCoMKgcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0 KHBkZXYsIGJhcik7Cj4gPiArwqDCoMKgwqDCoMKgwqByZXNvdXJjZV9zaXplX3QgbGVuID0gcGNp X3Jlc291cmNlX2xlbihwZGV2LCBiYXIpOwo+ID4gK8KgwqDCoMKgwqDCoMKgdW5zaWduZWQgbG9u ZyBkZXZfZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgYmFyKTsKPiA+ICsKPiA+ICvC oMKgwqDCoMKgwqDCoGlmIChzdGFydCA9PSAwIHx8IGxlbiA9PSAwKSAvKiBVbnVzZWQgQkFSLiAq Lwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK8KgwqDC oMKgwqDCoMKgaWYgKGxlbiA8PSBvZmZzZXQpCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgcmV0dXJuwqAgLUVJTlZBTDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHN0YXJ0ICs9 IG9mZnNldDsKPiA+ICvCoMKgwqDCoMKgwqDCoGxlbiAtPSBvZmZzZXQ7Cj4gPiArCj4gPiArwqDC oMKgwqDCoMKgwqBpZiAobGVuID4gbWF4bGVuICYmIG1heGxlbiAhPSAwKQo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGxlbiA9IG1heGxlbjsKPiA+ICsKPiA+ICvCoMKgwqDCoMKg wqDCoGlmIChkZXZfZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaWYgKCFyZXF1ZXN0X3JlZ2lvbihzdGFydCwgbGVuLCBuYW1lKSkKPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1F QlVTWTsKPiA+ICvCoMKgwqDCoMKgwqDCoH0gZWxzZSBpZiAoZGV2X2ZsYWdzICYgSU9SRVNPVVJD RV9NRU0pIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoIV9fcmVxdWVz dF9tZW1fcmVnaW9uKHN0YXJ0LCBsZW4sIG5hbWUsCj4gPiByZXFfZmxhZ3MpKQo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLUVCVVNZOwo+ ID4gK8KgwqDCoMKgwqDCoMKgfSBlbHNlIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAvKiBUaGF0J3Mgbm90IGEgZGV2aWNlIHdlIGNhbiByZXF1ZXN0IGFueXRoaW5nIG9uLgo+ ID4gKi8KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLUVOT0RFVjsK PiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBfX3BjaW1fcmVsZWFzZV9yZWdpb25fcmFuZ2Uo c3RydWN0IHBjaV9kZXYgKnBkZXYsIGludAo+ID4gYmFyLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG1heGxlbikK PiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqByZXNvdXJjZV9zaXplX3Qgc3RhcnQgPSBwY2lfcmVz b3VyY2Vfc3RhcnQocGRldiwgYmFyKTsKPiA+ICvCoMKgwqDCoMKgwqDCoHJlc291cmNlX3NpemVf dCBsZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGJhcik7Cj4gPiArwqDCoMKgwqDCoMKgwqB1 bnNpZ25lZCBsb25nIGZsYWdzID0gcGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGJhcik7Cj4gPiAr Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAobGVuIDw9IG9mZnNldCB8fCBzdGFydCA9PSAwKQo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybjsKPiA+ICsKPiA+ICvCoMKgwqDC oMKgwqDCoGlmIChsZW4gPT0gMCB8fCBtYXhsZW4gPT0gMCkgLyogVGhpcyBhbiB1bnVzZWQgQkFS LiBEbwo+ID4gbm90aGluZy4gKi8KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBy ZXR1cm47Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBzdGFydCArPSBvZmZzZXQ7Cj4gPiArwqDC oMKgwqDCoMKgwqBsZW4gLT0gb2Zmc2V0Owo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKGxl biA+IG1heGxlbikKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsZW4gPSBtYXhs ZW47Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJlbGVhc2VfcmVnaW9uKHN0YXJ0LCBs ZW4pOwo+ID4gK8KgwqDCoMKgwqDCoMKgZWxzZSBpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZWxlYXNlX21lbV9yZWdpb24oc3Rh cnQsIGxlbik7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgX19wY2ltX3JlcXVlc3RfcmVn aW9uKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFyLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncykKPiA+ICt7Cj4gPiArwqDC oMKgwqDCoMKgwqB1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7Cj4gPiArwqDCoMKgwqDCoMKgwqB1 bnNpZ25lZCBsb25nIGxlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgYmFyKTsKPiA+ICsKPiA+ ICvCoMKgwqDCoMKgwqDCoHJldHVybiBfX3BjaW1fcmVxdWVzdF9yZWdpb25fcmFuZ2UocGRldiwg YmFyLCBvZmZzZXQsIGxlbiwKPiA+IG5hbWUsIGZsYWdzKTsKPiA+ICt9Cj4gPiArCj4gPiArc3Rh dGljIHZvaWQgX19wY2ltX3JlbGVhc2VfcmVnaW9uKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQg YmFyKQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqDCoHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsK PiA+ICvCoMKgwqDCoMKgwqDCoHVuc2lnbmVkIGxvbmcgbGVuID0gcGNpX3Jlc291cmNlX2xlbihw ZGV2LCBiYXIpOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgX19wY2ltX3JlbGVhc2VfcmVnaW9u X3JhbmdlKHBkZXYsIGJhciwgb2Zmc2V0LCBsZW4pOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMg dm9pZCBwY2ltX2FkZHJfcmVzb3VyY2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQK PiA+ICpyZXNvdXJjZV9yYXcpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IHBjaV9k ZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7Cj4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgcGNp bV9hZGRyX2RldnJlcyAqcmVzID0gcmVzb3VyY2VfcmF3Owo+ID4gKwo+ID4gK8KgwqDCoMKgwqDC oMKgc3dpdGNoIChyZXMtPnR5cGUpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoGNhc2UgUENJTV9BRERS X0RFVlJFU19UWVBFX1JFR0lPTjoKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBf X3BjaW1fcmVsZWFzZV9yZWdpb24ocGRldiwgcmVzLT5iYXIpOwo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+ID4gK8KgwqDCoMKgwqDCoMKgY2FzZSBQQ0lNX0FERFJf REVWUkVTX1RZUEVfUkVHSU9OX01BUFBJTkc6Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgcGNpX2lvdW5tYXAocGRldiwgcmVzLT5iYXNlYWRkcik7Cj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgX19wY2ltX3JlbGVhc2VfcmVnaW9uKHBkZXYsIHJlcy0+YmFyKTsK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBicmVhazsKPiA+ICvCoMKgwqDCoMKg wqDCoGNhc2UgUENJTV9BRERSX0RFVlJFU19UWVBFX01BUFBJTkc6Cj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgcGNpX2lvdW5tYXAocGRldiwgcmVzLT5iYXNlYWRkcik7Cj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYnJlYWs7Cj4gPiArwqDCoMKgwqDCoMKgwqBk ZWZhdWx0Ogo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+ID4gK8Kg wqDCoMKgwqDCoMKgfQo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IHBjaW1fYWRkcl9k ZXZyZXMgKnBjaW1fYWRkcl9kZXZyZXNfYWxsb2Moc3RydWN0Cj4gPiBwY2lfZGV2ICpwZGV2KQo+ ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBwY2ltX2FkZHJfZGV2cmVzICpyZXM7Cj4g PiArCj4gPiArwqDCoMKgwqDCoMKgwqByZXMgPSBkZXZyZXNfYWxsb2Nfbm9kZShwY2ltX2FkZHJf cmVzb3VyY2VfcmVsZWFzZSwKPiA+IHNpemVvZigqcmVzKSwKPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgR0ZQX0tFUk5FTCwgZGV2X3RvX25vZGUoJnBk ZXYtPmRldikpOwo+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKHJlcykKPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBwY2ltX2FkZHJfZGV2cmVzX2NsZWFyKHJlcyk7Cj4gPiArwqDCoMKg wqDCoMKgwqByZXR1cm4gcmVzOwo+ID4gK30KPiA+ICsKPiA+ICsvKiBKdXN0IGZvciBjb25zaXN0 ZW5jeSBhbmQgcmVhZGFiaWxpdHkuICovCj4gPiArc3RhdGljIGlubGluZSB2b2lkIHBjaW1fYWRk cl9kZXZyZXNfZnJlZShzdHJ1Y3QgcGNpbV9hZGRyX2RldnJlcwo+ID4gKnJlcykKPiA+ICt7Cj4g PiArwqDCoMKgwqDCoMKgwqBkZXZyZXNfZnJlZShyZXMpOwo+ID4gK30KPiA+ICsKPiA+ICsvKgo+ ID4gKyAqIFVzZWQgYnkgZGV2cmVzIHRvIGlkZW50aWZ5IGEgcGNpbV9hZGRyX2RldnJlcy4KPiA+ ICsgKi8KPiA+ICtzdGF0aWMgaW50IHBjaW1fYWRkcl9yZXNvdXJjZXNfbWF0Y2goc3RydWN0IGRl dmljZSAqZGV2LCB2b2lkCj4gPiAqYV9yYXcsIHZvaWQgKmJfcmF3KQo+ID4gK3sKPiA+ICvCoMKg wqDCoMKgwqDCoHN0cnVjdCBwY2ltX2FkZHJfZGV2cmVzICphLCAqYjsKPiA+ICsKPiA+ICvCoMKg wqDCoMKgwqDCoGEgPSBhX3JhdzsKPiA+ICvCoMKgwqDCoMKgwqDCoGIgPSBiX3JhdzsKPiA+ICsK PiA+ICvCoMKgwqDCoMKgwqDCoGlmIChhLT50eXBlICE9IGItPnR5cGUpCj4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBz d2l0Y2ggKGEtPnR5cGUpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoGNhc2UgUENJTV9BRERSX0RFVlJF U19UWVBFX1JFR0lPTjoKPiA+ICvCoMKgwqDCoMKgwqDCoGNhc2UgUENJTV9BRERSX0RFVlJFU19U WVBFX1JFR0lPTl9NQVBQSU5HOgo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJl dHVybiBhLT5iYXIgPT0gYi0+YmFyOwo+ID4gK8KgwqDCoMKgwqDCoMKgY2FzZSBQQ0lNX0FERFJf REVWUkVTX1RZUEVfTUFQUElORzoKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBy ZXR1cm4gYS0+YmFzZWFkZHIgPT0gYi0+YmFzZWFkZHI7Cj4gPiArwqDCoMKgwqDCoMKgwqBkZWZh dWx0Ogo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK8Kg wqDCoMKgwqDCoMKgfQo+ID4gK30KPiA+IMKgCj4gPiDCoHN0YXRpYyB2b2lkIGRldm1fcGNpX3Vu bWFwX2lvc3BhY2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwdHIpCj4gPiDCoHsKPiA+IEBA IC05Miw4ICszMjEsOCBAQCBFWFBPUlRfU1lNQk9MKGRldm1fcGNpX3JlbWFwX2NmZ3NwYWNlKTsK PiA+IMKgICoKPiA+IMKgICogQWxsIG9wZXJhdGlvbnMgYXJlIG1hbmFnZWQgYW5kIHdpbGwgYmUg dW5kb25lIG9uIGRyaXZlciBkZXRhY2guCj4gPiDCoCAqCj4gPiAtICogUmV0dXJucyBhIHBvaW50 ZXIgdG8gdGhlIHJlbWFwcGVkIG1lbW9yeSBvciBhbiBFUlJfUFRSKCkKPiA+IGVuY29kZWQgZXJy b3IgY29kZQo+ID4gLSAqIG9uIGZhaWx1cmUuIFVzYWdlIGV4YW1wbGU6Ogo+ID4gKyAqIFJldHVy bnMgYSBwb2ludGVyIHRvIHRoZSByZW1hcHBlZCBtZW1vcnkgb3IgYW4gSU9NRU1fRVJSX1BUUigp Cj4gPiBlbmNvZGVkIGVycm9yCj4gPiArICogY29kZSBvbiBmYWlsdXJlLiBVc2FnZSBleGFtcGxl OjoKPiA+IMKgICoKPiA+IMKgICrCoMKgwqDCoMKgcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNl KHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKPiA+IMKgICrCoMKgwqDCoMKgYmFzZSA9IGRldm1f cGNpX3JlbWFwX2NmZ19yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwo+ID4gQEAgLTE3Miw2ICs0 MDEsMTcgQEAgc3RhdGljIHZvaWQgcGNpbV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UKPiA+ICpnZW5k ZXYsIHZvaWQgKnJlcykKPiA+IMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgcGNpX2RldnJlcyAqdGhp cyA9IHJlczsKPiA+IMKgwqDCoMKgwqDCoMKgwqBpbnQgaTsKPiA+IMKgCj4gPiArwqDCoMKgwqDC oMKgwqAvKgo+ID4gK8KgwqDCoMKgwqDCoMKgICogVGhpcyBpcyBsZWdhY3kgY29kZS4KPiA+ICvC oMKgwqDCoMKgwqDCoCAqCj4gPiArwqDCoMKgwqDCoMKgwqAgKiBBbGwgcmVnaW9ucyByZXF1ZXN0 ZWQgYnkgYSBwY2ltXyBmdW5jdGlvbiBkbyBnZXQKPiA+IHJlbGVhc2VkIHRocm91Z2gKPiA+ICvC oMKgwqDCoMKgwqDCoCAqIHBjaW1fYWRkcl9yZXNvdXJjZV9yZWxlYXNlKCkuIFRoYW5rcyB0byB0 aGUgaHlicmlkCj4gPiBuYXR1cmUgb2YgdGhlIHBjaV8KPiA+ICvCoMKgwqDCoMKgwqDCoCAqIHJl Z2lvbi1yZXF1ZXN0IGZ1bmN0aW9ucywgdGhpcyBmb3ItbG9vcCBoYXMgdG8gcmVsZWFzZQo+ID4g dGhlIHJlZ2lvbnMKPiA+ICvCoMKgwqDCoMKgwqDCoCAqIGlmIHRoZXkgaGF2ZSBiZWVuIHJlcXVl c3RlZCBieSBzdWNoIGEgZnVuY3Rpb24uCj4gPiArwqDCoMKgwqDCoMKgwqAgKgo+ID4gK8KgwqDC oMKgwqDCoMKgICogVE9ETzogUmVtb3ZlIHRoaXMgb25jZSBhbGwgdXNlcnMgb2YgcGNpbV9lbmFi bGVfZGV2aWNlKCkKPiA+IFBMVVMKPiA+ICvCoMKgwqDCoMKgwqDCoCAqIHBjaS1yZWdpb24tcmVx dWVzdC1mdW5jdGlvbnMgaGF2ZSBiZWVuIHBvcnRlZCB0byBwY2ltXwo+ID4gZnVuY3Rpb25zLgo+ ID4gK8KgwqDCoMKgwqDCoMKgICovCj4gPiDCoMKgwqDCoMKgwqDCoMKgZm9yIChpID0gMDsgaSA8 IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKQo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiAobWFza19jb250YWluc19iYXIodGhpcy0+cmVnaW9uX21hc2ssIGkpKQo+ID4g wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcGNpX3JlbGVh c2VfcmVnaW9uKGRldiwgaSk7Cj4gPiBAQCAtMjU4LDE5ICs0OTgsMjEgQEAgRVhQT1JUX1NZTUJP TChwY2ltX3Bpbl9kZXZpY2UpOwo+ID4gwqAKPiA+IMKgc3RhdGljIHZvaWQgcGNpbV9pb21hcF9y ZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmdlbmRldiwgdm9pZCAqcmVzKQo+ID4gwqB7Cj4gPiAtwqDC oMKgwqDCoMKgwqBzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2RldihnZW5kZXYpOwo+ID4g LcKgwqDCoMKgwqDCoMKgc3RydWN0IHBjaW1faW9tYXBfZGV2cmVzICp0aGlzID0gcmVzOwo+ID4g LcKgwqDCoMKgwqDCoMKgaW50IGk7Cj4gPiAtCj4gPiAtwqDCoMKgwqDCoMKgwqBmb3IgKGkgPSAw OyBpIDwgUENJTV9JT01BUF9NQVg7IGkrKykKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBpZiAodGhpcy0+dGFibGVbaV0pCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHBjaV9pb3VubWFwKGRldiwgdGhpcy0+dGFibGVbaV0pOwo+ID4g K8KgwqDCoMKgwqDCoMKgLyoKPiA+ICvCoMKgwqDCoMKgwqDCoCAqIERvIG5vdGhpbmcuIFRoaXMg aXMgbGVnYWN5IGNvZGUuCj4gPiArwqDCoMKgwqDCoMKgwqAgKgo+ID4gK8KgwqDCoMKgwqDCoMKg ICogQ2xlYW51cCBvZiB0aGUgbWFwcGluZ3MgaXMgbm93IGRvbmUgZGlyZWN0bHkgdGhyb3VnaCB0 aGUKPiA+IGNhbGxiYWNrcwo+ID4gK8KgwqDCoMKgwqDCoMKgICogcmVnaXN0ZXJlZCB3aGVuIGNy ZWF0aW5nIHRoZW0uCj4gPiArwqDCoMKgwqDCoMKgwqAgKi8KPiA+IMKgfQo+ID4gwqAKPiA+IMKg LyoqCj4gPiDCoCAqIHBjaW1faW9tYXBfdGFibGUgLSBhY2Nlc3MgaW9tYXAgYWxsb2NhdGlvbiB0 YWJsZQo+ID4gwqAgKiBAcGRldjogUENJIGRldmljZSB0byBhY2Nlc3MgaW9tYXAgdGFibGUgZm9y Cj4gPiDCoCAqCj4gPiArICogUmV0dXJuczoKPiA+ICsgKiBDb25zdCBwb2ludGVyIHRvIGFycmF5 IG9mIF9faW9tZW0gcG9pbnRlcnMgb24gc3VjY2VzcyBOVUxMIG9uCj4gPiBmYWlsdXJlLgo+ID4g KyAqCj4gPiDCoCAqIEFjY2VzcyBpb21hcCBhbGxvY2F0aW9uIHRhYmxlIGZvciBAZGV2LsKgIElm IGlvbWFwIHRhYmxlIGRvZXNuJ3QKPiA+IMKgICogZXhpc3QgYW5kIEBwZGV2IGlzIG1hbmFnZWQs IGl0IHdpbGwgYmUgYWxsb2NhdGVkLsKgIEFsbCBpb21hcHMKPiA+IMKgICogcmVjb3JkZWQgaW4g dGhlIGlvbWFwIHRhYmxlIGFyZSBhdXRvbWF0aWNhbGx5IHVubWFwcGVkIG9uCj4gPiBkcml2ZXIK PiA+IEBAIC0zNDMsMzAgKzU4NSw2NyBAQCBzdGF0aWMgdm9pZAo+ID4gcGNpbV9yZW1vdmVfbWFw cGluZ19mcm9tX2xlZ2FjeV90YWJsZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKPiA+IMKgwqDCoMKg wqDCoMKgwqB9Cj4gPiDCoH0KPiA+IMKgCj4gPiArLyoKPiA+ICsgKiBUaGUgc2FtZSBhcyBwY2lt X3JlbW92ZV9tYXBwaW5nX2Zyb21fbGVnYWN5X3RhYmxlKCksIGJ1dAo+ID4gaWRlbnRpZmllcyB0 aGUKPiA+ICsgKiBtYXBwaW5nIGJ5IGl0cyBCQVIgaW5kZXguCj4gPiArICovCj4gPiArc3RhdGlj IHZvaWQgcGNpbV9yZW1vdmVfYmFyX2Zyb21fbGVnYWN5X3RhYmxlKHN0cnVjdCBwY2lfZGV2Cj4g PiAqcGRldiwgc2hvcnQgYmFyKQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqDCoHZvaWQgX19pb21l bSAqKmxlZ2FjeV9pb21hcF90YWJsZTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChiYXIg Pj0gUENJX1NURF9OVU1fQkFSUykKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBy ZXR1cm47Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBsZWdhY3lfaW9tYXBfdGFibGUgPSAodm9p ZCBfX2lvbWVtCj4gPiAqKilwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOwo+ID4gK8KgwqDCoMKgwqDC oMKgaWYgKCFsZWdhY3lfaW9tYXBfdGFibGUpCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgcmV0dXJuOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgbGVnYWN5X2lvbWFwX3RhYmxl W2Jhcl0gPSBOVUxMOwo+ID4gK30KPiA+ICsKPiA+IMKgLyoqCj4gPiDCoCAqIHBjaW1faW9tYXAg LSBNYW5hZ2VkIHBjaW1faW9tYXAoKQo+ID4gwqAgKiBAcGRldjogUENJIGRldmljZSB0byBpb21h cCBmb3IKPiA+IMKgICogQGJhcjogQkFSIHRvIGlvbWFwCj4gPiDCoCAqIEBtYXhsZW46IE1heGlt dW0gbGVuZ3RoIG9mIGlvbWFwCj4gPiDCoCAqCj4gPiAtICogTWFuYWdlZCBwY2lfaW9tYXAoKS7C oCBNYXAgaXMgYXV0b21hdGljYWxseSB1bm1hcHBlZCBvbiBkcml2ZXIKPiA+IC0gKiBkZXRhY2gu Cj4gPiArICogUmV0dXJuczogX19pb21lbSBwb2ludGVyIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFp bHVyZS4KPiA+ICsgKgo+ID4gKyAqIE1hbmFnZWQgcGNpX2lvbWFwKCkuIE1hcCBpcyBhdXRvbWF0 aWNhbGx5IHVubWFwcGVkIG9uIGRyaXZlcgo+ID4gZGV0YWNoLiBJZgo+ID4gKyAqIGRlc2lyZWQs IHVubWFwIG1hbnVhbGx5IG9ubHkgd2l0aCBwY2ltX2lvdW5tYXAoKS4KPiA+ICsgKgo+ID4gKyAq IFRoaXMgU0hPVUxEIG9ubHkgYmUgdXNlZCBvbmNlIHBlciBCQVIuCj4gPiArICoKPiA+ICsgKiBO T1RFOgo+ID4gKyAqIENvbnRyYXJ5IHRvIHRoZSBvdGhlciBwY2ltXyogZnVuY3Rpb25zLCB0aGlz IGZ1bmN0aW9uIGRvZXMgbm90Cj4gPiByZXR1cm4gYW4KPiA+ICsgKiBJT01FTV9FUlJfUFRSKCkg b24gZmFpbHVyZSwgYnV0IGEgc2ltcGxlIE5VTEwuIFRoaXMgaXMgZG9uZSBmb3IKPiA+IGJhY2t3 YXJkcwo+ID4gKyAqIGNvbXBhdGliaWxpdHkuCj4gPiDCoCAqLwo+ID4gwqB2b2lkIF9faW9tZW0g KnBjaW1faW9tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIsIHVuc2lnbmVkCj4gPiBs b25nIG1heGxlbikKPiA+IMKgewo+ID4gwqDCoMKgwqDCoMKgwqDCoHZvaWQgX19pb21lbSAqbWFw cGluZzsKPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBwY2ltX2FkZHJfZGV2cmVzICpyZXM7Cj4g PiArCj4gPiArwqDCoMKgwqDCoMKgwqByZXMgPSBwY2ltX2FkZHJfZGV2cmVzX2FsbG9jKHBkZXYp Owo+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKCFyZXMpCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgcmV0dXJuIE5VTEw7Cj4gPiArwqDCoMKgwqDCoMKgwqByZXMtPnR5cGUgPSBQQ0lN X0FERFJfREVWUkVTX1RZUEVfTUFQUElORzsKPiA+IMKgCj4gPiDCoMKgwqDCoMKgwqDCoMKgbWFw cGluZyA9IHBjaV9pb21hcChwZGV2LCBiYXIsIG1heGxlbik7Cj4gPiDCoMKgwqDCoMKgwqDCoMKg aWYgKCFtYXBwaW5nKQo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBO VUxMOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGdvdG8gZXJyX2lvbWFwOwo+ ID4gK8KgwqDCoMKgwqDCoMKgcmVzLT5iYXNlYWRkciA9IG1hcHBpbmc7Cj4gPiDCoAo+ID4gwqDC oMKgwqDCoMKgwqDCoGlmIChwY2ltX2FkZF9tYXBwaW5nX3RvX2xlZ2FjeV90YWJsZShwZGV2LCBt YXBwaW5nLCBiYXIpICE9Cj4gPiAwKQo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBnb3RvIGVycl90YWJsZTsKPiA+IMKgCj4gPiArwqDCoMKgwqDCoMKgwqBkZXZyZXNfYWRkKCZw ZGV2LT5kZXYsIHJlcyk7Cj4gPiDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIG1hcHBpbmc7Cj4gPiDC oAo+ID4gwqBlcnJfdGFibGU6Cj4gPiDCoMKgwqDCoMKgwqDCoMKgcGNpX2lvdW5tYXAocGRldiwg bWFwcGluZyk7Cj4gPiArZXJyX2lvbWFwOgo+ID4gK8KgwqDCoMKgwqDCoMKgcGNpbV9hZGRyX2Rl dnJlc19mcmVlKHJlcyk7Cj4gPiDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIE5VTEw7Cj4gPiDCoH0K PiA+IMKgRVhQT1JUX1NZTUJPTChwY2ltX2lvbWFwKTsKPiA+IEBAIC0zNzYsOTEgKzY1NSwyOTEg QEAgRVhQT1JUX1NZTUJPTChwY2ltX2lvbWFwKTsKPiA+IMKgICogQHBkZXY6IFBDSSBkZXZpY2Ug dG8gaW91bm1hcCBmb3IKPiA+IMKgICogQGFkZHI6IEFkZHJlc3MgdG8gdW5tYXAKPiA+IMKgICoK PiA+IC0gKiBNYW5hZ2VkIHBjaV9pb3VubWFwKCkuwqAgQGFkZHIgbXVzdCBoYXZlIGJlZW4gbWFw cGVkIHVzaW5nCj4gPiBwY2ltX2lvbWFwKCkuCj4gPiArICogTWFuYWdlZCBwY2lfaW91bm1hcCgp LiBAYWRkciBtdXN0IGhhdmUgYmVlbiBtYXBwZWQgdXNpbmcgYQo+ID4gcGNpbV8qIG1hcHBpbmcK PiA+ICsgKiBmdW5jdGlvbi4KPiA+IMKgICovCj4gPiDCoHZvaWQgcGNpbV9pb3VubWFwKHN0cnVj dCBwY2lfZGV2ICpwZGV2LCB2b2lkIF9faW9tZW0gKmFkZHIpCj4gPiDCoHsKPiA+IC3CoMKgwqDC oMKgwqDCoHBjaV9pb3VubWFwKHBkZXYsIGFkZHIpOwo+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0 IHBjaW1fYWRkcl9kZXZyZXMgcmVzX3NlYXJjaGVkOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKg cGNpbV9hZGRyX2RldnJlc19jbGVhcigmcmVzX3NlYXJjaGVkKTsKPiA+ICvCoMKgwqDCoMKgwqDC oHJlc19zZWFyY2hlZC50eXBlID0gUENJTV9BRERSX0RFVlJFU19UWVBFX01BUFBJTkc7Cj4gPiAr wqDCoMKgwqDCoMKgwqByZXNfc2VhcmNoZWQuYmFzZWFkZHIgPSBhZGRyOwo+ID4gKwo+ID4gK8Kg wqDCoMKgwqDCoMKgaWYgKGRldnJlc19yZWxlYXNlKCZwZGV2LT5kZXYsIHBjaW1fYWRkcl9yZXNv dXJjZV9yZWxlYXNlLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBwY2ltX2FkZHJfcmVzb3VyY2VzX21hdGNoLCAmcmVzX3NlYXJjaGVkKQo+ID4gIT0g MCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIERvZXNuJ3QgZXhpc3Qu IFVzZXIgcGFzc2VkIG5vbnNlbnNlLiAqLwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHJldHVybjsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+IMKgCj4gPiDCoMKgwqDCoMKgwqDC oMKgcGNpbV9yZW1vdmVfbWFwcGluZ19mcm9tX2xlZ2FjeV90YWJsZShwZGV2LCBhZGRyKTsKPiA+ IMKgfQo+ID4gwqBFWFBPUlRfU1lNQk9MKHBjaW1faW91bm1hcCk7Cj4gPiDCoAo+ID4gKy8qKgo+ ID4gKyAqIHBjaW1faW9tYXBfcmVnaW9uIC0gUmVxdWVzdCBhbmQgaW9tYXAgYSBQQ0kgQkFSCj4g PiArICogQHBkZXY6IFBDSSBkZXZpY2UgdG8gbWFwIElPIHJlc291cmNlcyBmb3IKPiA+ICsgKiBA YmFyOiBJbmRleCBvZiBhIEJBUiB0byBtYXAKPiA+ICsgKiBAbmFtZTogTmFtZSBhc3NvY2lhdGVk IHdpdGggdGhlIHJlcXVlc3QKPiA+ICsgKgo+ID4gKyAqIFJldHVybnM6IF9faW9tZW0gcG9pbnRl ciBvbiBzdWNjZXNzLCBhbiBJT01FTV9FUlJfUFRSIG9uCj4gPiBmYWlsdXJlLgo+ID4gKyAqCj4g PiArICogTWFwcGluZyBhbmQgcmVnaW9uIHdpbGwgZ2V0IGF1dG9tYXRpY2FsbHkgcmVsZWFzZWQg b24gZHJpdmVyCj4gPiBkZXRhY2guIElmCj4gPiArICogZGVzaXJlZCwgcmVsZWFzZSBtYW51YWxs eSBvbmx5IHdpdGggcGNpbV9pb3VubWFwX3JlZ2lvbigpLgo+ID4gKyAqLwo+ID4gK3N0YXRpYyB2 b2lkIF9faW9tZW0gKnBjaW1faW9tYXBfcmVnaW9uKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQK PiA+IGJhciwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb25zdCBjaGFyICpuYW1lKQo+ID4gK3sK PiA+ICvCoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgcGNp bV9hZGRyX2RldnJlcyAqcmVzOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmVzID0gcGNpbV9h ZGRyX2RldnJlc19hbGxvYyhwZGV2KTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmICghcmVzKQo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBJT01FTV9FUlJfUFRSKC1FTk9N RU0pOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmVzLT50eXBlID0gUENJTV9BRERSX0RFVlJF U19UWVBFX1JFR0lPTl9NQVBQSU5HOwo+ID4gK8KgwqDCoMKgwqDCoMKgcmVzLT5iYXIgPSBiYXI7 Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqByZXQgPSBfX3BjaW1fcmVxdWVzdF9yZWdpb24ocGRl diwgYmFyLCBuYW1lLCAwKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMCkKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBnb3RvIGVycl9yZWdpb247Cj4gPiArCj4gPiAr wqDCoMKgwqDCoMKgwqByZXMtPmJhc2VhZGRyID0gcGNpX2lvbWFwKHBkZXYsIGJhciwgMCk7Cj4g PiArwqDCoMKgwqDCoMKgwqBpZiAoIXJlcy0+YmFzZWFkZHIpIHsKPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqByZXQgPSAtRUlOVkFMOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGdvdG8gZXJyX2lvbWFwOwo+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gKwo+ID4g K8KgwqDCoMKgwqDCoMKgZGV2cmVzX2FkZCgmcGRldi0+ZGV2LCByZXMpOwo+ID4gK8KgwqDCoMKg wqDCoMKgcmV0dXJuIHJlcy0+YmFzZWFkZHI7Cj4gPiArCj4gPiArZXJyX2lvbWFwOgo+ID4gK8Kg wqDCoMKgwqDCoMKgX19wY2ltX3JlbGVhc2VfcmVnaW9uKHBkZXYsIGJhcik7Cj4gPiArZXJyX3Jl Z2lvbjoKPiA+ICvCoMKgwqDCoMKgwqDCoHBjaW1fYWRkcl9kZXZyZXNfZnJlZShyZXMpOwo+ID4g Kwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIElPTUVNX0VSUl9QVFIocmV0KTsKPiA+ICt9Cj4g PiArCj4gPiArLyoqCj4gPiArICogcGNpbV9pb3VubWFwX3JlZ2lvbiAtIFVubWFwIGFuZCByZWxl YXNlIGEgUENJIEJBUgo+ID4gKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHRvIG9wZXJhdGUgb24KPiA+ ICsgKiBAYmFyOiBJbmRleCBvZiBCQVIgdG8gdW5tYXAgYW5kIHJlbGVhc2UKPiA+ICsgKgo+ID4g KyAqIFVubWFwIGEgQkFSIGFuZCByZWxlYXNlIGl0cyByZWdpb24gbWFudWFsbHkuIE9ubHkgcGFz cyBCQVJzCj4gPiB0aGF0IHdlcmUKPiA+ICsgKiBwcmV2aW91c2x5IG1hcHBlZCBieSBwY2ltX2lv bWFwX3JlZ2lvbigpLgo+ID4gKyAqLwo+ID4gK3N0YXRpYyB2b2lkIHBjaW1faW91bm1hcF9yZWdp b24oc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDC oMKgc3RydWN0IHBjaW1fYWRkcl9kZXZyZXMgcmVzX3NlYXJjaGVkOwo+ID4gKwo+ID4gK8KgwqDC oMKgwqDCoMKgcGNpbV9hZGRyX2RldnJlc19jbGVhcigmcmVzX3NlYXJjaGVkKTsKPiA+ICvCoMKg wqDCoMKgwqDCoHJlc19zZWFyY2hlZC50eXBlID0gUENJTV9BRERSX0RFVlJFU19UWVBFX1JFR0lP Tl9NQVBQSU5HOwo+ID4gK8KgwqDCoMKgwqDCoMKgcmVzX3NlYXJjaGVkLmJhciA9IGJhcjsKPiA+ ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGRldnJlc19yZWxlYXNlKCZwZGV2LT5kZXYsIHBjaW1fYWRk cl9yZXNvdXJjZV9yZWxlYXNlLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBwY2ltX2FkZHJfcmVzb3VyY2VzX21hdGNoLCAmcmVzX3NlYXJjaGVkKTsK PiA+ICt9Cj4gPiArCj4gPiDCoC8qKgo+ID4gwqAgKiBwY2ltX2lvbWFwX3JlZ2lvbnMgLSBSZXF1 ZXN0IGFuZCBpb21hcCBQQ0kgQkFScwo+ID4gwqAgKiBAcGRldjogUENJIGRldmljZSB0byBtYXAg SU8gcmVzb3VyY2VzIGZvcgo+ID4gwqAgKiBAbWFzazogTWFzayBvZiBCQVJzIHRvIHJlcXVlc3Qg YW5kIGlvbWFwCj4gPiAtICogQG5hbWU6IE5hbWUgdXNlZCB3aGVuIHJlcXVlc3RpbmcgcmVnaW9u cwo+ID4gKyAqIEBuYW1lOiBOYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdHMKPiA+ICsg Kgo+ID4gKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBm YWlsdXJlLgo+ID4gwqAgKgo+ID4gwqAgKiBSZXF1ZXN0IGFuZCBpb21hcCByZWdpb25zIHNwZWNp ZmllZCBieSBAbWFzay4KPiA+IMKgICovCj4gPiDCoGludCBwY2ltX2lvbWFwX3JlZ2lvbnMoc3Ry dWN0IHBjaV9kZXYgKnBkZXYsIGludCBtYXNrLCBjb25zdCBjaGFyCj4gPiAqbmFtZSkKPiA+IMKg ewo+ID4gLcKgwqDCoMKgwqDCoMKgdm9pZCBfX2lvbWVtICogY29uc3QgKmlvbWFwOwo+ID4gLcKg wqDCoMKgwqDCoMKgaW50IGksIHJjOwo+ID4gK8KgwqDCoMKgwqDCoMKgaW50IHJldDsKPiA+ICvC oMKgwqDCoMKgwqDCoHNob3J0IGJhcjsKPiA+ICvCoMKgwqDCoMKgwqDCoHZvaWQgX19pb21lbSAq bWFwcGluZzsKPiA+IMKgCj4gPiAtwqDCoMKgwqDCoMKgwqBpb21hcCA9IHBjaW1faW9tYXBfdGFi bGUocGRldik7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAoIWlvbWFwKQo+ID4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRU5PTUVNOwo+ID4gK8KgwqDCoMKgwqDCoMKgZm9y IChiYXIgPSAwOyBiYXIgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGJhcisrKSB7Cj4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKCFtYXNrX2NvbnRhaW5zX2JhcihtYXNrLCBi YXIpKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBj b250aW51ZTsKPiA+IMKgCj4gPiAtwqDCoMKgwqDCoMKgwqBmb3IgKGkgPSAwOyBpIDwgREVWSUNF X0NPVU5UX1JFU09VUkNFOyBpKyspIHsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqB1bnNpZ25lZCBsb25nIGxlbjsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBt YXBwaW5nID0gcGNpbV9pb21hcF9yZWdpb24ocGRldiwgYmFyLCBuYW1lKTsKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoSVNfRVJSKG1hcHBpbmcpKSB7Cj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IFBUUl9FUlIobWFw cGluZyk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGdvdG8gZXJyOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoH0KPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBwY2ltX2FkZF9tYXBwaW5nX3RvX2xlZ2Fj eV90YWJsZShwZGV2LAo+ID4gbWFwcGluZywgYmFyKTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBpZiAocmV0ICE9IDApCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGdvdG8gZXJyOwo+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gwqAK PiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoIW1hc2tfY29udGFpbnNfYmFy KG1hc2ssIGkpKQo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBjb250aW51ZTsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gwqAKPiA+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByYyA9IC1FSU5WQUw7Cj4gPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBpKTsKPiA+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoIWxlbikKPiA+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZ290byBlcnJfaW52YWw7Cj4gPiAr ZXJyOgo+ID4gK8KgwqDCoMKgwqDCoMKgd2hpbGUgKC0tYmFyID49IDApIHsKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwY2ltX2lvdW5tYXBfcmVnaW9uKHBkZXYsIGJhcik7Cj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcGNpbV9yZW1vdmVfYmFyX2Zyb21fbGVn YWN5X3RhYmxlKHBkZXYsIGJhcik7Cj4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiDCoAo+ID4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJjID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYs IGksIG5hbWUpOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChyYykKPiA+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZ290byBlcnJf aW52YWw7Cj4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gcmV0Owo+ID4gK30KPiA+ICtFWFBPUlRf U1lNQk9MKHBjaW1faW9tYXBfcmVnaW9ucyk7Cj4gPiDCoAo+ID4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJjID0gLUVOT01FTTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBpZiAoIXBjaW1faW9tYXAocGRldiwgaSwgMCkpCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGdvdG8gZXJyX3JlZ2lvbjsKPiA+ICtzdGF0aWMg aW50IF9wY2ltX3JlcXVlc3RfcmVnaW9uKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFyLAo+ ID4gY29uc3QgY2hhciAqbmFtZSwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBp bnQgcmVxdWVzdF9mbGFncykKPiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqBpbnQgcmV0Owo+ID4g K8KgwqDCoMKgwqDCoMKgc3RydWN0IHBjaW1fYWRkcl9kZXZyZXMgKnJlczsKPiA+ICsKPiA+ICvC oMKgwqDCoMKgwqDCoHJlcyA9IHBjaW1fYWRkcl9kZXZyZXNfYWxsb2MocGRldik7Cj4gPiArwqDC oMKgwqDCoMKgwqBpZiAoIXJlcykKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBy ZXR1cm4gLUVOT01FTTsKPiA+ICvCoMKgwqDCoMKgwqDCoHJlcy0+dHlwZSA9IFBDSU1fQUREUl9E RVZSRVNfVFlQRV9SRUdJT047Cj4gPiArwqDCoMKgwqDCoMKgwqByZXMtPmJhciA9IGJhcjsKPiA+ ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldCA9IF9fcGNpbV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCBi YXIsIG5hbWUsCj4gPiByZXF1ZXN0X2ZsYWdzKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQg IT0gMCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBjaW1fYWRkcl9kZXZy ZXNfZnJlZShyZXMpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBy ZXQ7Cj4gPiDCoMKgwqDCoMKgwqDCoMKgfQo+ID4gwqAKPiA+ICvCoMKgwqDCoMKgwqDCoGRldnJl c19hZGQoJnBkZXYtPmRldiwgcmVzKTsKPiA+IMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMDsKPiA+ ICt9Cj4gPiDCoAo+ID4gLSBlcnJfcmVnaW9uOgo+ID4gLcKgwqDCoMKgwqDCoMKgcGNpX3JlbGVh c2VfcmVnaW9uKHBkZXYsIGkpOwo+ID4gLSBlcnJfaW52YWw6Cj4gPiAtwqDCoMKgwqDCoMKgwqB3 aGlsZSAoLS1pID49IDApIHsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAo IW1hc2tfY29udGFpbnNfYmFyKG1hc2ssIGkpKQo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjb250aW51ZTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBwY2ltX2lvdW5tYXAocGRldiwgaW9tYXBbaV0pOwo+ID4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCBpKTsKPiA+ICsvKioK PiA+ICsgKiBwY2ltX3JlcXVlc3RfcmVnaW9uIC0gUmVxdWVzdCBhIFBDSSBCQVIKPiA+ICsgKiBA cGRldjogUENJIGRldmljZSB0byByZXF1ZXN0aW9uIHJlZ2lvbiBmb3IKPiA+ICsgKiBAYmFyOiBJ bmRleCBvZiBCQVIgdG8gcmVxdWVzdAo+ID4gKyAqIEBuYW1lOiBOYW1lIGFzc29jaWF0ZWQgd2l0 aCB0aGUgcmVxdWVzdAo+ID4gKyAqCj4gPiArICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCBhIG5l Z2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KPiA+ICsgKgo+ID4gKyAqIFJlcXVlc3QgcmVn aW9uIHNwZWNpZmllZCBieSBAYmFyLgo+ID4gKyAqCj4gPiArICogVGhlIHJlZ2lvbiB3aWxsIGF1 dG9tYXRpY2FsbHkgYmUgcmVsZWFzZWQgb24gZHJpdmVyIGRldGFjaC4gSWYKPiA+IGRlc2lyZWQs Cj4gPiArICogcmVsZWFzZSBtYW51YWxseSBvbmx5IHdpdGggcGNpbV9yZWxlYXNlX3JlZ2lvbigp Lgo+ID4gKyAqLwo+ID4gK3N0YXRpYyBpbnQgcGNpbV9yZXF1ZXN0X3JlZ2lvbihzdHJ1Y3QgcGNp X2RldiAqcGRldiwgaW50IGJhciwKPiA+IGNvbnN0IGNoYXIgKm5hbWUpCj4gPiArewo+ID4gK8Kg wqDCoMKgwqDCoMKgcmV0dXJuIF9wY2ltX3JlcXVlc3RfcmVnaW9uKHBkZXYsIGJhciwgbmFtZSwg MCk7Cj4gPiArfQo+ID4gKwo+ID4gKy8qKgo+ID4gKyAqIHBjaW1fcmVsZWFzZV9yZWdpb24gLSBS ZWxlYXNlIGEgUENJIEJBUgo+ID4gKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHRvIG9wZXJhdGUgb24K PiA+ICsgKiBAYmFyOiBJbmRleCBvZiBCQVIgdG8gcmVsZWFzZQo+ID4gKyAqCj4gPiArICogUmVs ZWFzZSBhIHJlZ2lvbiBtYW51YWxseSB0aGF0IHdhcyBwcmV2aW91c2x5IHJlcXVlc3RlZCBieQo+ ID4gKyAqIHBjaW1fcmVxdWVzdF9yZWdpb24oKS4KPiA+ICsgKi8KPiA+ICtzdGF0aWMgdm9pZCBw Y2ltX3JlbGVhc2VfcmVnaW9uKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFyKQo+ID4gK3sK PiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBwY2ltX2FkZHJfZGV2cmVzIHJlc19zZWFyY2hlZDsK PiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHBjaW1fYWRkcl9kZXZyZXNfY2xlYXIoJnJlc19zZWFy Y2hlZCk7Cj4gPiArwqDCoMKgwqDCoMKgwqByZXNfc2VhcmNoZWQudHlwZSA9IFBDSU1fQUREUl9E RVZSRVNfVFlQRV9SRUdJT047Cj4gPiArwqDCoMKgwqDCoMKgwqByZXNfc2VhcmNoZWQuYmFyID0g YmFyOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgZGV2cmVzX3JlbGVhc2UoJnBkZXYtPmRldiwg cGNpbV9hZGRyX3Jlc291cmNlX3JlbGVhc2UsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBjaW1fYWRkcl9yZXNvdXJjZXNfbWF0Y2gsICZyZXNfc2Vh cmNoZWQpOwo+ID4gK30KPiA+ICsKPiA+ICsKPiA+ICsvKioKPiA+ICsgKiBwY2ltX3JlbGVhc2Vf YWxsX3JlZ2lvbnMgLSBSZWxlYXNlIGFsbCByZWdpb25zIG9mIGEgUENJLWRldmljZQo+ID4gKyAq IEBwZGV2OiB0aGUgUENJIGRldmljZQo+ID4gKyAqCj4gPiArICogUmVsZWFzZSBhbGwgcmVnaW9u cyBwcmV2aW91c2x5IHJlcXVlc3RlZCB0aHJvdWdoCj4gPiBwY2ltX3JlcXVlc3RfcmVnaW9uKCkK PiA+ICsgKiBvciBwY2ltX3JlcXVlc3RfYWxsX3JlZ2lvbnMoKS4KPiA+ICsgKgo+ID4gKyAqIENh biBiZSBjYWxsZWQgZnJvbSBhbnkgY29udGV4dCwgaS5lLiwgbm90IG5lY2Vzc2FyaWx5IGFzIGEK PiA+IGNvdW50ZXJwYXJ0IHRvCj4gPiArICogcGNpbV9yZXF1ZXN0X2FsbF9yZWdpb25zKCkuCj4g PiArICovCj4gPiArc3RhdGljIHZvaWQgcGNpbV9yZWxlYXNlX2FsbF9yZWdpb25zKHN0cnVjdCBw Y2lfZGV2ICpwZGV2KQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqDCoHNob3J0IGJhcjsKPiA+ICsK PiA+ICvCoMKgwqDCoMKgwqDCoGZvciAoYmFyID0gMDsgYmFyIDwgUENJX1NURF9OVU1fQkFSUzsg YmFyKyspCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcGNpbV9yZWxlYXNlX3Jl Z2lvbihwZGV2LCBiYXIpOwo+ID4gK30KPiA+ICsKPiA+ICsvKioKPiA+ICsgKiBwY2ltX3JlcXVl c3RfYWxsX3JlZ2lvbnMgLSBSZXF1ZXN0IGFsbCByZWdpb25zCj4gPiArICogQHBkZXY6IFBDSSBk ZXZpY2UgdG8gbWFwIElPIHJlc291cmNlcyBmb3IKPiA+ICsgKiBAbmFtZTogbmFtZSBhc3NvY2lh dGVkIHdpdGggdGhlIHJlcXVlc3QKPiA+ICsgKgo+ID4gKyAqIFJldHVybnM6IDAgb24gc3VjY2Vz cywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgo+ID4gKyAqCj4gPiArICogUmVxdWVz dGVkIHJlZ2lvbnMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHJlbGVhc2VkIGF0IGRyaXZlcgo+ID4g ZGV0YWNoLiBJZgo+ID4gKyAqIGRlc2lyZWQsIHJlbGVhc2UgaW5kaXZpZHVhbCByZWdpb25zIHdp dGggcGNpbV9yZWxlYXNlX3JlZ2lvbigpCj4gPiBvciBhbGwgb2YKPiA+ICsgKiB0aGVtIGF0IG9u Y2Ugd2l0aCBwY2ltX3JlbGVhc2VfYWxsX3JlZ2lvbnMoKS4KPiA+ICsgKi8KPiA+ICtzdGF0aWMg aW50IHBjaW1fcmVxdWVzdF9hbGxfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3QK PiA+IGNoYXIgKm5hbWUpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgaW50IHJldDsKPiA+ICvC oMKgwqDCoMKgwqDCoHNob3J0IGJhcjsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGZvciAoYmFy ID0gMDsgYmFyIDwgUENJX1NURF9OVU1fQkFSUzsgYmFyKyspIHsKPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqByZXQgPSBwY2ltX3JlcXVlc3RfcmVnaW9uKHBkZXYsIGJhciwgbmFt ZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHJldCAhPSAwKQo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBnb3RvIGVycjsK PiA+IMKgwqDCoMKgwqDCoMKgwqB9Cj4gPiDCoAo+ID4gLcKgwqDCoMKgwqDCoMKgcmV0dXJuIHJj Owo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4gPiArCj4gPiArZXJyOgo+ID4gK8KgwqDC oMKgwqDCoMKgcGNpbV9yZWxlYXNlX2FsbF9yZWdpb25zKHBkZXYpOwo+ID4gKwo+ID4gK8KgwqDC oMKgwqDCoMKgcmV0dXJuIHJldDsKPiA+IMKgfQo+ID4gLUVYUE9SVF9TWU1CT0wocGNpbV9pb21h cF9yZWdpb25zKTsKPiA+IMKgCj4gPiDCoC8qKgo+ID4gwqAgKiBwY2ltX2lvbWFwX3JlZ2lvbnNf cmVxdWVzdF9hbGwgLSBSZXF1ZXN0IGFsbCBCQVJzIGFuZCBpb21hcAo+ID4gc3BlY2lmaWVkIG9u ZXMKPiA+IMKgICogQHBkZXY6IFBDSSBkZXZpY2UgdG8gbWFwIElPIHJlc291cmNlcyBmb3IKPiA+ IMKgICogQG1hc2s6IE1hc2sgb2YgQkFScyB0byBpb21hcAo+ID4gLSAqIEBuYW1lOiBOYW1lIHVz ZWQgd2hlbiByZXF1ZXN0aW5nIHJlZ2lvbnMKPiA+ICsgKiBAbmFtZTogTmFtZSBhc3NvY2lhdGVk IHdpdGggdGhlIHJlcXVlc3RzCj4gPiArICoKPiA+ICsgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3Ms IG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KPiA+IMKgICoKPiA+IMKgICogUmVxdWVz dCBhbGwgUENJIEJBUnMgYW5kIGlvbWFwIHJlZ2lvbnMgc3BlY2lmaWVkIGJ5IEBtYXNrLgo+ID4g KyAqCj4gPiArICogVG8gcmVsZWFzZSB0aGVzZSByZXNvdXJjZXMgbWFudWFsbHksIGNhbGwgcGNp bV9yZWxlYXNlX3JlZ2lvbigpCj4gPiBmb3IgdGhlCj4gPiArICogcmVnaW9ucyBhbmQgcGNpbV9p b3VubWFwKCkgZm9yIHRoZSBtYXBwaW5ncy4KPiA+IMKgICovCj4gPiDCoGludCBwY2ltX2lvbWFw X3JlZ2lvbnNfcmVxdWVzdF9hbGwoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBtYXNrLAo+ID4g wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgY29uc3QgY2hhciAqbmFtZSkKPiA+IMKgewo+ID4gLcKgwqDCoMKgwqDCoMKg aW50IHJlcXVlc3RfbWFzayA9ICgoMSA8PCA2KSAtIDEpICYgfm1hc2s7Cj4gPiAtwqDCoMKgwqDC oMKgwqBpbnQgcmM7Cj4gPiArwqDCoMKgwqDCoMKgwqBzaG9ydCBiYXI7Cj4gPiArwqDCoMKgwqDC oMKgwqBpbnQgcmV0Owo+ID4gK8KgwqDCoMKgwqDCoMKgdm9pZCBfX2lvbWVtICoqbGVnYWN5X2lv bWFwX3RhYmxlOwo+ID4gwqAKPiA+IC3CoMKgwqDCoMKgwqDCoHJjID0gcGNpX3JlcXVlc3Rfc2Vs ZWN0ZWRfcmVnaW9ucyhwZGV2LCByZXF1ZXN0X21hc2ssCj4gPiBuYW1lKTsKPiA+IC3CoMKgwqDC oMKgwqDCoGlmIChyYykKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4g cmM7Cj4gPiArwqDCoMKgwqDCoMKgwqByZXQgPSBwY2ltX3JlcXVlc3RfYWxsX3JlZ2lvbnMocGRl diwgbmFtZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDApCj4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIHJldDsKPiA+IMKgCj4gPiAtwqDCoMKgwqDCoMKg wqByYyA9IHBjaW1faW9tYXBfcmVnaW9ucyhwZGV2LCBtYXNrLCBuYW1lKTsKPiA+IC3CoMKgwqDC oMKgwqDCoGlmIChyYykKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwY2lfcmVs ZWFzZV9zZWxlY3RlZF9yZWdpb25zKHBkZXYsIHJlcXVlc3RfbWFzayk7Cj4gPiAtwqDCoMKgwqDC oMKgwqByZXR1cm4gcmM7Cj4gPiArwqDCoMKgwqDCoMKgwqBmb3IgKGJhciA9IDA7IGJhciA8IFBD SV9TVERfTlVNX0JBUlM7IGJhcisrKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaWYgKCFtYXNrX2NvbnRhaW5zX2JhcihtYXNrLCBiYXIpKQo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjb250aW51ZTsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoIXBjaW1faW9tYXAocGRldiwgYmFyLCAwKSkKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZ290byBlcnI7Cj4g PiArwqDCoMKgwqDCoMKgwqB9Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gMDsKPiA+ ICsKPiA+ICtlcnI6Cj4gPiArwqDCoMKgwqDCoMKgwqAvKgo+ID4gK8KgwqDCoMKgwqDCoMKgICog SWYgYmFyIGlzIGxhcmdlciB0aGFuIDAsIHRoZW4gcGNpbV9pb21hcCgpIGFib3ZlIGhhcwo+ID4g bW9zdCBsaWtlbHkKPiA+ICvCoMKgwqDCoMKgwqDCoCAqIGZhaWxlZCBiZWNhdXNlIG9mIC1FSU5W QUwuIElmIGl0IGlzIGVxdWFsIDAsIG1vc3QgbGlrZWx5Cj4gPiB0aGUgdGFibGUKPiA+ICvCoMKg wqDCoMKgwqDCoCAqIGNvdWxkbid0IGJlIGNyZWF0ZWQsIGluZGljYXRpbmcgLUVOT01FTS4KPiA+ ICvCoMKgwqDCoMKgwqDCoCAqLwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gYmFyID4gMCA/IC1F SU5WQUwgOiAtRU5PTUVNOwo+ID4gK8KgwqDCoMKgwqDCoMKgbGVnYWN5X2lvbWFwX3RhYmxlID0g KHZvaWQgX19pb21lbQo+ID4gKiopcGNpbV9pb21hcF90YWJsZShwZGV2KTsKPiA+ICsKPiA+ICvC oMKgwqDCoMKgwqDCoHdoaWxlICgtLWJhciA+PSAwKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHBjaW1faW91bm1hcChwZGV2LCBsZWdhY3lfaW9tYXBfdGFibGVbYmFyXSk7Cj4g PiArCj4gPiArwqDCoMKgwqDCoMKgwqBwY2ltX3JlbGVhc2VfYWxsX3JlZ2lvbnMocGRldik7Cj4g PiArCj4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gcmV0Owo+ID4gwqB9Cj4gPiDCoEVYUE9SVF9T WU1CT0wocGNpbV9pb21hcF9yZWdpb25zX3JlcXVlc3RfYWxsKTsKPiA+IMKgCj4gPiBAQCAtNDcz LDE5ICs5NTIsMTQgQEAKPiA+IEVYUE9SVF9TWU1CT0wocGNpbV9pb21hcF9yZWdpb25zX3JlcXVl c3RfYWxsKTsKPiA+IMKgICovCj4gPiDCoHZvaWQgcGNpbV9pb3VubWFwX3JlZ2lvbnMoc3RydWN0 IHBjaV9kZXYgKnBkZXYsIGludCBtYXNrKQo+ID4gwqB7Cj4gPiAtwqDCoMKgwqDCoMKgwqB2b2lk IF9faW9tZW0gKiBjb25zdCAqaW9tYXA7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpbnQgaTsKPiA+ICvC oMKgwqDCoMKgwqDCoHNob3J0IGJhcjsKPiA+IMKgCj4gPiAtwqDCoMKgwqDCoMKgwqBpb21hcCA9 IHBjaW1faW9tYXBfdGFibGUocGRldik7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAoIWlvbWFwKQo+ ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybjsKPiA+IC0KPiA+IC3CoMKg wqDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBQQ0lNX0lPTUFQX01BWDsgaSsrKSB7Cj4gPiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKCFtYXNrX2NvbnRhaW5zX2JhcihtYXNrLCBp KSkKPiA+ICvCoMKgwqDCoMKgwqDCoGZvciAoYmFyID0gMDsgYmFyIDwgUENJX1NURF9OVU1fQkFS UzsgYmFyKyspIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoIW1hc2tf Y29udGFpbnNfYmFyKG1hc2ssIGJhcikpCj4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBjb250aW51ZTsKPiA+IMKgCj4gPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgcGNpbV9pb3VubWFwKHBkZXYsIGlvbWFwW2ldKTsKPiA+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgaSk7Cj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcGNpbV9pb3VubWFwX3JlZ2lvbihwZGV2LCBi YXIpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBjaW1fcmVtb3ZlX2Jhcl9m cm9tX2xlZ2FjeV90YWJsZShwZGV2LCBiYXIpOwo+ID4gwqDCoMKgwqDCoMKgwqDCoH0KPiA+IMKg fQo+ID4gwqBFWFBPUlRfU1lNQk9MKHBjaW1faW91bm1hcF9yZWdpb25zKTsKPiA+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCj4gPiBpbmRleCA1OWUw OTQ5ZmIwNzkuLmQ5NDQ0NWY1Zjg4MiAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvcGNpL3BjaS5j Cj4gPiArKysgYi9kcml2ZXJzL3BjaS9wY2kuYwo+ID4gQEAgLTM4ODMsNiArMzg4MywxNyBAQCB2 b2lkIHBjaV9yZWxlYXNlX3JlZ2lvbihzdHJ1Y3QgcGNpX2Rldgo+ID4gKnBkZXYsIGludCBiYXIp Cj4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJlbGVhc2VfbWVtX3JlZ2lvbihw Y2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgYmFyKSwKPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwY2lfcmVzb3VyY2VfbGVu KHBkZXYsIGJhcikpOwo+ID4gwqAKPiA+ICvCoMKgwqDCoMKgwqDCoC8qCj4gPiArwqDCoMKgwqDC oMKgwqAgKiBUaGlzIGRldnJlcyB1dGlsaXR5IG1ha2VzIHRoaXMgZnVuY3Rpb24gc29tZXRpbWVz Cj4gPiBtYW5hZ2VkCj4gPiArwqDCoMKgwqDCoMKgwqAgKiAod2hlbiBwY2ltX2VuYWJsZV9kZXZp Y2UoKSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlKS4KPiA+ICvCoMKgwqDCoMKgwqDCoCAqCj4gPiAr wqDCoMKgwqDCoMKgwqAgKiBUaGlzIGlzIGJhZCBiZWNhdXNlIGl0IGNvbmZsaWN0cyB3aXRoIHRo ZSBwY2ltXwo+ID4gZnVuY3Rpb25zIGJlaW5nCj4gPiArwqDCoMKgwqDCoMKgwqAgKiBleGNsdXNp dmVseSByZXNwb25zaWJsZSBmb3IgbWFuYWdlZCBQQ0kuIEl0cyAic29tZXRpbWVzCj4gPiB5ZXMs Cj4gPiArwqDCoMKgwqDCoMKgwqAgKiBzb21ldGltZXMgbm8iIG5hdHVyZSBjYW4gY2F1c2UgYnVn cy4KPiA+ICvCoMKgwqDCoMKgwqDCoCAqCj4gPiArwqDCoMKgwqDCoMKgwqAgKiBUT0RPOiBSZW1v dmUgdGhpcyBvbmNlIGFsbCB1c2VycyB0aGF0IHVzZQo+ID4gcGNpbV9lbmFibGVfZGV2aWNlKCkg UExVUwo+ID4gK8KgwqDCoMKgwqDCoMKgICogYSByZWdpb24gcmVxdWVzdCBmdW5jdGlvbiBoYXZl IGJlZW4gcG9ydGVkIHRvIHVzaW5nCj4gPiBwY2ltXyBmdW5jdGlvbnMuCj4gPiArwqDCoMKgwqDC oMKgwqAgKi8KPiA+IMKgwqDCoMKgwqDCoMKgwqBkciA9IGZpbmRfcGNpX2RyKHBkZXYpOwo+ID4g wqDCoMKgwqDCoMKgwqDCoGlmIChkcikKPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgZHItPnJlZ2lvbl9tYXNrICY9IH4oMSA8PCBiYXIpOwo+ID4gQEAgLTM5MjcsNiArMzkzOCwx NyBAQCBzdGF0aWMgaW50IF9fcGNpX3JlcXVlc3RfcmVnaW9uKHN0cnVjdAo+ID4gcGNpX2RldiAq cGRldiwgaW50IGJhciwKPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGdvdG8gZXJyX291dDsKPiA+IMKgwqDCoMKgwqDCoMKgwqB9Cj4gPiDCoAo+ID4g K8KgwqDCoMKgwqDCoMKgLyoKPiA+ICvCoMKgwqDCoMKgwqDCoCAqIFRoaXMgZGV2cmVzIHV0aWxp dHkgbWFrZXMgdGhpcyBmdW5jdGlvbiBzb21ldGltZXMKPiA+IG1hbmFnZWQKPiA+ICvCoMKgwqDC oMKgwqDCoCAqICh3aGVuIHBjaW1fZW5hYmxlX2RldmljZSgpIGhhcyBiZWVuIGNhbGxlZCBiZWZv cmUpLgo+ID4gK8KgwqDCoMKgwqDCoMKgICoKPiA+ICvCoMKgwqDCoMKgwqDCoCAqIFRoaXMgaXMg YmFkIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGggdGhlIHBjaW1fCj4gPiBmdW5jdGlvbnMgYmVp bmcKPiA+ICvCoMKgwqDCoMKgwqDCoCAqIGV4Y2x1c2l2ZWx5IHJlc3BvbnNpYmxlIGZvciBtYW5h Z2VkIHBjaS4gSXRzICJzb21ldGltZXMKPiA+IHllcywKPiA+ICvCoMKgwqDCoMKgwqDCoCAqIHNv bWV0aW1lcyBubyIgbmF0dXJlIGNhbiBjYXVzZSBidWdzLgo+ID4gK8KgwqDCoMKgwqDCoMKgICoK PiA+ICvCoMKgwqDCoMKgwqDCoCAqIFRPRE86IFJlbW92ZSB0aGlzIG9uY2UgYWxsIHVzZXJzIHRo YXQgdXNlCj4gPiBwY2ltX2VuYWJsZV9kZXZpY2UoKSBQTFVTCj4gPiArwqDCoMKgwqDCoMKgwqAg KiBhIHJlZ2lvbiByZXF1ZXN0IGZ1bmN0aW9uIGhhdmUgYmVlbiBwb3J0ZWQgdG8gdXNpbmcKPiA+ IHBjaW1fIGZ1bmN0aW9ucy4KPiA+ICvCoMKgwqDCoMKgwqDCoCAqLwo+ID4gwqDCoMKgwqDCoMKg wqDCoGRyID0gZmluZF9wY2lfZHIocGRldik7Cj4gPiDCoMKgwqDCoMKgwqDCoMKgaWYgKGRyKQo+ ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkci0+cmVnaW9uX21hc2sgfD0gMSA8 PCBiYXI7Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmggYi9kcml2ZXJzL3BjaS9w Y2kuaAo+ID4gaW5kZXggZmQ0NDU2NWM0NzU2Li5jMDk0ODdmNTU1MGMgMTAwNjQ0Cj4gPiAtLS0g YS9kcml2ZXJzL3BjaS9wY2kuaAo+ID4gKysrIGIvZHJpdmVycy9wY2kvcGNpLmgKPiA+IEBAIC04 MjYsNiArODI2LDExIEBAIHN0cnVjdCBwY2lfZGV2cmVzIHsKPiA+IMKgwqDCoMKgwqDCoMKgwqB1 bnNpZ25lZCBpbnQgb3JpZ19pbnR4OjE7Cj4gPiDCoMKgwqDCoMKgwqDCoMKgdW5zaWduZWQgaW50 IHJlc3RvcmVfaW50eDoxOwo+ID4gwqDCoMKgwqDCoMKgwqDCoHVuc2lnbmVkIGludCBtd2k6MTsK PiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoC8qCj4gPiArwqDCoMKgwqDCoMKgwqAgKiBUT0RPOiBy ZW1vdmUgdGhlIHJlZ2lvbl9tYXNrIG9uY2UgZXZlcnlvbmUgY2FsbGluZwo+ID4gK8KgwqDCoMKg wqDCoMKgICogcGNpbV9lbmFibGVfZGV2aWNlKCkgKyBwY2lfKnJlZ2lvbiooKSBpcyBwb3J0ZWQg dG8gcGNpbV8KPiA+IGZ1bmN0aW9ucy4KPiA+ICvCoMKgwqDCoMKgwqDCoCAqLwo+ID4gwqDCoMKg wqDCoMKgwqDCoHUzMiByZWdpb25fbWFzazsKPiA+IMKgfTsKPiA+IMKgCj4gPiAtLSAKPiA+IDIu NDUuMAo+ID4gCj4gCgo=