From mboxrd@z Thu Jan 1 00:00:00 1970 From: Joonas Lahtinen Subject: Re: [PATCH v5 06/35] drm/i915: Start of GPU scheduler Date: Fri, 19 Feb 2016 15:03:01 +0200 Message-ID: <1455886981.7321.89.camel@linux.intel.com> References: <1455805644-6450-1-git-send-email-John.C.Harrison@Intel.com> <1455805644-6450-7-git-send-email-John.C.Harrison@Intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by gabe.freedesktop.org (Postfix) with ESMTP id D3D9F6EF2F for ; Fri, 19 Feb 2016 13:03:09 +0000 (UTC) In-Reply-To: <1455805644-6450-7-git-send-email-John.C.Harrison@Intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: John.C.Harrison@Intel.com, Intel-GFX@Lists.FreeDesktop.Org List-Id: intel-gfx@lists.freedesktop.org SGksCgpOb3cgdGhlIGNvZGUgaXMgaW4gcmV2aWV3YWJsZSBjaHVua3MsIGV4Y2VsbGVudCEKCkkn dmUgYWRkZWQgbXkgY29tbWVudHMgYmVsb3cuIEEgZmV3IHJlcGVhdHMgZnJvbSBsYXN0IHJvdW5k LCBidXQgbm93CndpdGggbW9yZSBxdWVzdGlvbnMgYWJvdXQgdGhlIGxvZ2ljIGl0c2VsZi4KCk9u IHRvLCAyMDE2LTAyLTE4IGF0IDE0OjI2ICswMDAwLCBKb2huLkMuSGFycmlzb25ASW50ZWwuY29t IHdyb3RlOgo+IEZyb206IEpvaG4gSGFycmlzb24gPEpvaG4uQy5IYXJyaXNvbkBJbnRlbC5jb20+ Cj4gCj4gSW5pdGlhbCBjcmVhdGlvbiBvZiBzY2hlZHVsZXIgc291cmNlIGZpbGVzLiBOb3RlIHRo YXQgdGhpcyBwYXRjaAo+IGltcGxlbWVudHMgbW9zdCBvZiB0aGUgc2NoZWR1bGVyIGZ1bmN0aW9u YWxpdHkgYnV0IGRvZXMgbm90IGhvb2sgaXQgaW4KPiB0byB0aGUgZHJpdmVyIHlldC4gSXQgYWxz byBsZWF2ZXMgdGhlIHNjaGVkdWxlciBjb2RlIGluICdwYXNzIHRocm91Z2gnCj4gbW9kZSBzbyB0 aGF0IGV2ZW4gd2hlbiBpdCBpcyBob29rZWQgaW4sIGl0IHdpbGwgbm90IGFjdHVhbGx5IGRvIHZl cnkKPiBtdWNoLiBUaGlzIGFsbG93cyB0aGUgaG9va3MgdG8gYmUgYWRkZWQgb25lIGF0IGEgdGlt ZSBpbiBiaXRlIHNpemUKPiBjaHVua3MgYW5kIG9ubHkgd2hlbiB0aGUgc2NoZWR1bGVyIGlzIGZp bmFsbHkgZW5hYmxlZCBhdCB0aGUgZW5kIGRvZXMKPiBhbnl0aGluZyBzdGFydCBoYXBwZW5pbmcu Cj4gCj4gVGhlIGdlbmVyYWwgdGhlb3J5IG9mIG9wZXJhdGlvbiBpcyB0aGF0IHdoZW4gYmF0Y2gg YnVmZmVycyBhcmUKPiBzdWJtaXR0ZWQgdG8gdGhlIGRyaXZlciwgdGhlIGV4ZWNidWZmZXIoKSBj b2RlIHBhY2thZ2VzIHVwIGFsbCB0aGUKPiBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBleGVjdXRl IHRoZSBiYXRjaCBidWZmZXIgYXQgYSBsYXRlciB0aW1lLiBUaGlzCj4gcGFja2FnZSBpcyBnaXZl biBvdmVyIHRvIHRoZSBzY2hlZHVsZXIgd2hpY2ggYWRkcyBpdCB0byBhbiBpbnRlcm5hbAo+IG5v ZGUgbGlzdC4gVGhlIHNjaGVkdWxlciBhbHNvIHNjYW5zIHRoZSBsaXN0IG9mIG9iamVjdHMgYXNz b2NpYXRlZAo+IHdpdGggdGhlIGJhdGNoIGJ1ZmZlciBhbmQgY29tcGFyZXMgdGhlbSBhZ2FpbnN0 IHRoZSBvYmplY3RzIGFscmVhZHkgaW4KPiB1c2UgYnkgb3RoZXIgYnVmZmVycyBpbiB0aGUgbm9k ZSBsaXN0LiBJZiBtYXRjaGVzIGFyZSBmb3VuZCB0aGVuIHRoZQo+IG5ldyBiYXRjaCBidWZmZXIg bm9kZSBpcyBtYXJrZWQgYXMgYmVpbmcgZGVwZW5kZW50IHVwb24gdGhlIG1hdGNoaW5nCj4gbm9k ZS4gVGhlIHNhbWUgaXMgZG9uZSBmb3IgdGhlIGNvbnRleHQgb2JqZWN0LiBUaGUgc2NoZWR1bGVy IGFsc28KPiBidW1wcyB1cCB0aGUgcHJpb3JpdHkgb2Ygc3VjaCBtYXRjaGluZyBub2RlcyBvbiB0 aGUgZ3JvdW5kcyB0aGF0IHRoZQo+IG1vcmUgZGVwZW5kZW5jaWVzIGEgZ2l2ZW4gYmF0Y2ggYnVm ZmVyIGhhcyB0aGUgbW9yZSBpbXBvcnRhbnQgaXQgaXMKPiBsaWtlbHkgdG8gYmUuCj4gCj4gVGhl IHNjaGVkdWxlciBhaW1zIHRvIGhhdmUgYSBnaXZlbiAodHVuZWFibGUpIG51bWJlciBvZiBiYXRj aCBidWZmZXJzCj4gaW4gZmxpZ2h0IG9uIHRoZSBoYXJkd2FyZSBhdCBhbnkgZ2l2ZW4gdGltZS4g SWYgZmV3ZXIgdGhhbiB0aGlzIGFyZQo+IGN1cnJlbnRseSBleGVjdXRpbmcgd2hlbiBhIG5ldyBu b2RlIGlzIHF1ZXVlZCwgdGhlbiB0aGUgbm9kZSBpcyBwYXNzZWQKPiBzdHJhaWdodCB0aHJvdWdo IHRvIHRoZSBzdWJtaXQgZnVuY3Rpb24uIE90aGVyd2lzZSBpdCBpcyBzaW1wbHkgYWRkZWQKPiB0 byB0aGUgcXVldWUgYW5kIHRoZSBkcml2ZXIgcmV0dXJucyBiYWNrIHRvIHVzZXIgbGFuZC4KPiAK PiBUaGUgc2NoZWR1bGVyIGlzIG5vdGlmaWVkIHdoZW4gZWFjaCBiYXRjaCBidWZmZXIgY29tcGxl dGVzIGFuZCB1cGRhdGVzCj4gaXRzIGludGVybmFsIHRyYWNraW5nIGFjY29yZGluZ2x5LiBBdCB0 aGUgZW5kIG9mIHRoZSBjb21wbGV0aW9uCj4gaW50ZXJydXB0IHByb2Nlc3NpbmcsIGlmIGFueSBz Y2hlZHVsZXIgdHJhY2tlZCBiYXRjaGVzIHdlcmUgcHJvY2Vzc2VkLAo+IHRoZSBzY2hlZHVsZXIn cyBkZWZlcnJlZCB3b3JrZXIgdGhyZWFkIGlzIHdva2VuIHVwLiBUaGlzIGNhbiBkbyBtb3JlCj4g aW52b2x2ZWQgcHJvY2Vzc2luZyBzdWNoIGFzIGFjdHVhbGx5IHJlbW92aW5nIGNvbXBsZXRlZCBu b2RlcyBmcm9tIHRoZQo+IHF1ZXVlIGFuZCBmcmVlaW5nIHVwIHRoZSByZXNvdXJjZXMgYXNzb2Np YXRlZCB3aXRoIHRoZW0gKGludGVybmFsCj4gbWVtb3J5IGFsbG9jYXRpb25zLCBEUk0gb2JqZWN0 IHJlZmVyZW5jZXMsIGNvbnRleHQgcmVmZXJlbmNlLCBldGMuKS4KPiBUaGUgd29yayBoYW5kbGVy IGFsc28gY2hlY2tzIHRoZSBpbiBmbGlnaHQgY291bnQgYW5kIGNhbGxzIHRoZQo+IHN1Ym1pc3Np b24gY29kZSBpZiBhIG5ldyBzbG90IGhhcyBhcHBlYXJlZC4KPiAKPiBXaGVuIHRoZSBzY2hlZHVs ZXIncyBzdWJtaXQgY29kZSBpcyBjYWxsZWQsIGl0IHNjYW5zIHRoZSBxdWV1ZWQgbm9kZQo+IGxp c3QgZm9yIHRoZSBoaWdoZXN0IHByaW9yaXR5IG5vZGUgdGhhdCBoYXMgbm8gdW5tZXQgZGVwZW5k ZW5jaWVzLgo+IE5vdGUgdGhhdCB0aGUgZGVwZW5kZW5jeSBjYWxjdWxhdGlvbiBpcyBjb21wbGV4 IGFzIGl0IG11c3QgdGFrZQo+IGludGVyLXJpbmcgZGVwZW5kZW5jaWVzIGFuZCBwb3RlbnRpYWwg cHJlZW1wdGlvbnMgaW50byBhY2NvdW50LiBOb3RlCj4gYWxzbyB0aGF0IGluIHRoZSBmdXR1cmUg dGhpcyB3aWxsIGJlIGV4dGVuZGVkIHRvIGluY2x1ZGUgZXh0ZXJuYWwKPiBkZXBlbmRlbmNpZXMg c3VjaCBhcyB0aGUgQW5kcm9pZCBOYXRpdmUgU3luYyBmaWxlIGRlc2NyaXB0b3JzIGFuZC9vcgo+ IHRoZSBsaW51eCBkbWEtYnVmZiBzeW5jaHJvbmlzYXRpb24gc2NoZW1lLgo+IAo+IElmIGEgc3Vp dGFibGUgbm9kZSBpcyBmb3VuZCB0aGVuIGl0IGlzIHNlbnQgdG8gZXhlY2J1ZmZfZmluYWwoKSBm b3IKPiBzdWJtaXNzaW9uIHRvIHRoZSBoYXJkd2FyZS4gVGhlIGluIGZsaWdodCBjb3VudCBpcyB0 aGVuIHJlLWNoZWNrZWQgYW5kCj4gYSBuZXcgbm9kZSBwb3BwZWQgZnJvbSB0aGUgbGlzdCBpZiBh cHByb3ByaWF0ZS4gQWxsIG5vZGVzIHRoYXQgYXJlIG5vdAo+IHN1Ym1pdHRlZCBoYXZlIHRoZWly IHByaW9yaXR5IGJ1bXBlZC4gVGhpcyBlbnN1cmVzIHRoYXQgbG93IHByaW9yaXR5Cj4gdGFza3Mg ZG8gbm90IGdldCBzdGFydmVkIG91dCBieSBidXN5IGhpZ2hlciBwcmlvcml0eSBvbmVzIC0gZXZl cnl0aGluZwo+IHdpbGwgZXZlbnR1YWxseSBnZXQgaXRzIHR1cm4gdG8gcnVuLgo+IAo+IE5vdGUg dGhhdCB0aGlzIHBhdGNoIGRvZXMgbm90IGltcGxlbWVudCBwcmUtZW1wdGl2ZSBzY2hlZHVsaW5n LiBPbmx5Cj4gYmFzaWMgc2NoZWR1bGluZyBieSByZS1vcmRlcmluZyBiYXRjaCBidWZmZXIgc3Vi bWlzc2lvbiBpcyBjdXJyZW50bHkKPiBpbXBsZW1lbnRlZC4gUHJlLWVtcHRpb24gb2YgYWN0aXZl bHkgZXhlY3V0aW5nIGJhdGNoIGJ1ZmZlcnMgY29tZXMgaW4KPiB0aGUgbmV4dCBwYXRjaCBzZXJp ZXMuCj4gCj4gdjI6IENoYW5nZWQgcHJpb3JpdHkgbGV2ZWxzIHRvICsvLTEwMjMgZHVlIHRvIGZl ZWRiYWNrIGZyb20gQ2hyaXMKPiBXaWxzb24uCj4gCj4gUmVtb3ZlZCByZWR1bmRhbnQgaW5kZXgg ZnJvbSBzY2hlZHVsZXIgbm9kZS4KPiAKPiBDaGFuZ2VkIHRpbWUgc3RhbXBzIHRvIHVzZSBqaWZm aWVzIGluc3RlYWQgb2YgcmF3IG1vbm90b25pYy4gVGhpcwo+IHByb3ZpZGVzIGxvd2VyIHJlc29s dXRpb24gYnV0IGltcHJvdmVkIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBpOTE1Cj4gY29kZS4K PiAKPiBNYWpvciByZS13cml0ZSBvZiBjb21wbGV0aW9uIHRyYWNraW5nIGNvZGUgZHVlIHRvIHN0 cnVjdCBmZW5jZQo+IGNvbnZlcnNpb24uIFRoZSBzY2hlZHVsZXIgbm8gbG9uZ2VyIGhhcyBpdCdz IG93biBwcml2YXRlIElSUSBoYW5kbGVyCj4gYnV0IGp1c3QgbGV0cyB0aGUgZXhpc3RpbmcgcmVx dWVzdCBjb2RlIGhhbmRsZSBjb21wbGV0aW9uIGV2ZW50cy4KPiBJbnN0ZWFkLCB0aGUgc2NoZWR1 bGVyIG5vdyBob29rcyBpbnRvIHRoZSByZXF1ZXN0IG5vdGlmeSBjb2RlIHRvIGJlCj4gdG9sZCB3 aGVuIGEgcmVxdWVzdCBoYXMgY29tcGxldGVkLgo+IAo+IFJlZHVjZWQgZHJpdmVyIG11dGV4IGxv Y2tpbmcgc2NvcGUuIFJlbW92YWwgb2Ygc2NoZWR1bGVyIG5vZGVzIG5vCj4gbG9uZ2VyIGdyYWJz IHRoZSBtdXRleCBsb2NrLgo+IAo+IHYzOiBSZWZhY3RvciBvZiBkZXBlbmRlbmN5IGdlbmVyYXRp b24gdG8gbWFrZSB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLgo+IEFsc28gYWRkZWQgaW4gcmVhZC1y ZWFkIG9wdGltaXNhdGlvbiBzdXBwb3J0IC0gaS5lLiwgZG9uJ3QgdHJlYXQgYQo+IHNoYXJlZCBy ZWFkLW9ubHkgYnVmZmVyIGFzIGJlaW5nIGEgZGVwZW5kZW5jeS4KPiAKPiBBbGxvd2VkIHRoZSBr aWxsaW5nIG9mIHF1ZXVlZCBub2RlcyByYXRoZXIgdGhhbiBvbmx5IGZseWluZyBvbmVzLgo+IAo+ IHY0OiBVcGRhdGVkIHRoZSBjb21taXQgbWVzc2FnZSB0byBiZXR0ZXIgcmVmbGVjdCB0aGUgY3Vy cmVudCBzdGF0ZSBvZgo+IHRoZSBjb2RlLiBEb3duZ3JhZGVkIHNvbWUgQlVHX09OcyB0byBXQVJO X09Ocy4gVXNlZCB0aGUgY29ycmVjdCBhcnJheQo+IG1lbW9yeSBhbGxvY2F0b3IgZnVuY3Rpb24g KGttYWxsb2NfYXJyYXkgaW5zdGVhZCBvZiBrbWFsbG9jKS4KPiBDb3JyZWN0ZWQgdGhlIGZvcm1h dCBvZiBzb21lIGNvbW1lbnRzLiBXcmFwcGVkIHNvbWUgbGluZXMgZGlmZmVyZW50bHkKPiB0byBr ZWVwIHRoZSBzdHlsZSBjaGVja2VyIGhhcHB5Lgo+IAo+IEZpeGVkIGEgV0FSTl9PTiB3aGVuIGtp bGxpbmcgbm9kZXMuIFRoZSBkZXBlbmRlbmN5IHJlbW92YWwgY29kZSBjaGVja3MKPiB0aGF0IG5v ZGVzIGJlaW5nIGRlc3Ryb3llZCBkbyBub3QgaGF2ZSBhbnkgb3VzdGFuZGluZyBkZXBlbmRlbmNp ZXMKPiAod2hpY2ggd291bGQgaW1wbHkgdGhleSBzaG91bGQgbm90IGhhdmUgYmVlbiBleGVjdXRl ZCB5ZXQpLiBJbiB0aGUKPiBjYXNlIG9mIG5vZGVzIGJlaW5nIGRlc3Ryb3llZCwgZS5nLiBkdWUg dG8gY29udGV4dCBiYW5uaW5nLCB0aGVuIHRoaXMKPiBtaWdodCB3ZWxsIGJlIHRoZSBjYXNlIC0g dGhleSBoYXZlIG5vdCBiZWVuIGV4ZWN1dGVkIGFuZCBkbyBpbmRlZWQKPiBoYXZlIG91dHN0YW5k aW5nIGRlcGVuZGVuY2llcy4KPiAKPiBSZS1pbnN0YXRlZCB0aGUgY29kZSB0byBkaXNibGUgaW50 ZXJydXB0cyB3aGVuIG5vdCBpbiB1c2UuIFRoZQo+IHVuZGVybHlpbmcgcHJvYmxlbSBjYXVzaW5n IGJyb2tlbiBJUlEgcmVmZXJlbmNlIGNvdW50cyBzZWVtcyB0byBoYXZlCj4gYmVlbiBmaXhlZCBu b3cuCj4gCj4gdjU6IFNodWZmbGVkIHZhcmlvdXMgZnVuY3Rpb25zIGFyb3VuZCB0byByZW1vdmUg Zm9yd2FyZCBkZWNsYXJhdGlvbnMKPiBhcyBhcHBhcmVudGx5IHRoZXNlIGFyZSBmcm93bmVkIHVw b24uIFJlbW92ZWQgbG90cyBvZiB3aGl0ZSBzcGFjZSBhcwo+IGFwcGFyZW50bHkgaGF2aW5nIGVh c3kgdG8gcmVhZCBjb2RlIGlzIGFsc28gZnJvd25lZCB1cG9uLiBTcGxpdCB0aGUKPiBkaXJlY3Qg c3VibWlzc2lvbiBzY2hlZHVsZXIgYnlwYXNzIGNvZGUgb3V0IGludG8gYSBzZXBhcmF0ZSBmdW5j dGlvbi4KPiBTcXVhc2hlZCBkb3duIHRoZSBpOTE1X3NjaGVkdWxlci5jIHNlY3Rpb25zIG9mIHZh cmlvdXMgcGF0Y2hlcyBpbnRvCj4gdGhpcyBwYXRjaC4gVGh1cyB0aGUgbGF0ZXIgcGF0Y2hlcyBz aW1wbHkgaG9vayBpbiBleGlzdGluZyBjb2RlIGludG8KPiB2YXJpb3VzIHBhcnRzIG9mIHRoZSBk cml2ZXIgcmF0aGVyIHRoYW4gYWRkaW5nIHRoZSBjb2RlIGFzIHdlbGwuIEFkZGVkCj4gZG9jdW1l bnRhdGlvbiB0byB2YXJpb3VzIGZ1bmN0aW9ucy4gUmUtd29ya2VkIHRoZSBzdWJtaXQgZnVuY3Rp b24gaW4KPiB0ZXJtcyBvZiBtdXRleCBsb2NraW5nLCBlcnJvciBoYW5kbGluZyBhbmQgZXhpdCBw YXRocy4gU3BsaXQgdGhlCj4gZGVsYXllZCB3b3JrIGhhbmRsZXIgZnVuY3Rpb24gaW4gaGFsZi4g TWFkZSB1c2Ugb2YgdGhlIGtlcm5lbCAnY2xhbXAnCj4gbWFjcm8uIFtKb29uYXMgTGFodGluZW5d Cj4gCj4gQWRkZWQgcnVudGltZSBQTSBjYWxscyBhcyB0aGVzZSBtdXN0IGJlIGRvbmUgYXQgdGhl IHRvcCBsZXZlbCBiZWZvcmUKPiBhY3F1aXJpbmcgdGhlIGRyaXZlciBtdXRleCBsb2NrLiBbQ2hy aXMgV2lsc29uXQo+IAo+IFJlbW92ZWQgc29tZSBvYnNvbGV0ZSBkZWJ1ZyBjb2RlIHRoYXQgaGFk IGJlZW4gZm9yZ290dGVuIGFib3V0Lgo+IAo+IE1vdmVkIG1vcmUgY2xlYW4gdXAgY29kZSBpbnRv IHRoZSAnaTkxNV9nZW1fc2NoZWR1bGVyX2NsZWFuX25vZGUoKScKPiBmdW5jdGlvbiByYXRoZXIg dGhhbiByZXBsaWNhdGluZyBpdCBpbiBtdXRsaXBsZSBwbGFjZXMuCj4gCj4gVXNlZCBsaWdodGVy IHdlaWdodCBzcGlubG9ja3MuCj4gCj4gRm9yOiBWSVotMTU4Nwo+IFNpZ25lZC1vZmYtYnk6IEpv aG4gSGFycmlzb24gPEpvaG4uQy5IYXJyaXNvbkBJbnRlbC5jb20+Cj4gQ2M6IEpvb25hcyBMYWh0 aW5lbiA8am9vbmFzLmxhaHRpbmVuQGxpbnV4LmludGVsLmNvbT4KPiAtLS0KPiDCoGRyaXZlcnMv Z3B1L2RybS9pOTE1L01ha2VmaWxlwqDCoMKgwqDCoMKgwqDCoMKgfMKgwqDCoDEgKwo+IMKgZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaMKgwqDCoMKgwqDCoMKgfMKgwqDCoDYgKwo+IMKg ZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uY8KgwqDCoMKgwqDCoMKgfMKgwqDCoDUgKwo+ IMKgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zY2hlZHVsZXIuYyB8IDg3NCArKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrCj4gwqBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3Nj aGVkdWxlci5oIHzCoMKgOTUgKysrKwo+IMKgNSBmaWxlcyBjaGFuZ2VkLCA5ODEgaW5zZXJ0aW9u cygrKQo+IMKgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc2No ZWR1bGVyLmMKPiDCoGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1 X3NjaGVkdWxlci5oCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2Vm aWxlIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKPiBpbmRleCAxNTM5OGM1Li43OWNi MzhiIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCj4gKysrIGIv ZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKPiBAQCAtMTAsNiArMTAsNyBAQCBjY2ZsYWdz LXkgOj0gLVdlcnJvcgo+IMKgaTkxNS15IDo9IGk5MTVfZHJ2Lm8gXAo+IMKgCcKgwqBpOTE1X2ly cS5vIFwKPiDCoAnCoMKgaTkxNV9wYXJhbXMubyBcCj4gKwnCoMKgaTkxNV9zY2hlZHVsZXIubyBc Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGk5MTVfc3VzcGVuZC5vIFwKPiDCoAnCoMKgaTkxNV9z eXNmcy5vIFwKPiDCoAnCoMKgaW50ZWxfY3NyLm8gXAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pOTE1X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAo+ IGluZGV4IGY0NDg3YjkuLjAzYWRkMWEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaTkxNV9kcnYuaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKPiBA QCAtMTcwMyw2ICsxNzAzLDggQEAgc3RydWN0IGk5MTVfZXhlY2J1ZmZlcl9wYXJhbXMgewo+IMKg CXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdMKgwqDCoMKgwqAqcmVxdWVzdDsKPiDCoH07Cj4g wqAKPiArc3RydWN0IGk5MTVfc2NoZWR1bGVyOwo+ICsKPiDCoC8qIHVzZWQgaW4gY29tcHV0aW5n IHRoZSBuZXcgd2F0ZXJtYXJrcyBzdGF0ZSAqLwo+IMKgc3RydWN0IGludGVsX3dtX2NvbmZpZyB7 Cj4gwqAJdW5zaWduZWQgaW50IG51bV9waXBlc19hY3RpdmU7Cj4gQEAgLTE5NjgsNiArMTk3MCw4 IEBAIHN0cnVjdCBkcm1faTkxNV9wcml2YXRlIHsKPiDCoAo+IMKgCXN0cnVjdCBpOTE1X3J1bnRp bWVfcG0gcG07Cj4gwqAKPiArCXN0cnVjdCBpOTE1X3NjaGVkdWxlciAqc2NoZWR1bGVyOwo+ICsK CkkgdGhpbmsgd2Ugc2hvdWxkIGhhdmUgaTkxNS5lbmFibGVfc2NoZWR1bGVyIHBhcmFtZXRlciAo anVzdCBsaWtlCmk5MTUuZW5hYmxlX2V4ZWNsaXN0cykgYW5kIG1ha2UgdGhpcyBhIGRhdGEgbWVt YmVyLCBub3QgcG9pbnRlci4KClRoZW4gd2UgY2FuIGdvIGZvcndhcmQgYW5kIGhhdmUgaTkxNS5l bmFibGVfc2NoZWR1bGVyX3ByZWVtcHQgYW5kIHNvIG9uCnRvIGNvbnRyb2wgdGhpbmdzIGF0IGJv b3QgdGltZS4KCj4gwqAJLyogQWJzdHJhY3QgdGhlIHN1Ym1pc3Npb24gbWVjaGFuaXNtIChsZWdh Y3kgcmluZ2J1ZmZlciBvciBleGVjbGlzdHMpIGF3YXkgKi8KPiDCoAlzdHJ1Y3Qgewo+IMKgCQlp bnQgKCpleGVjYnVmX3N1Ym1pdCkoc3RydWN0IGk5MTVfZXhlY2J1ZmZlcl9wYXJhbXMgKnBhcmFt cywKPiBAQCAtMjI5MCw2ICsyMjk0LDggQEAgc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0IHsK PiDCoAkvKiogcHJvY2VzcyBpZGVudGlmaWVyIHN1Ym1pdHRpbmcgdGhpcyByZXF1ZXN0ICovCj4g wqAJc3RydWN0IHBpZCAqcGlkOwo+IMKgCj4gKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVf ZW50cnkJKnNjaGVkdWxlcl9xZTsKPiArCgpGdW5ueSB3aGl0ZXNwYWNlLgoKPiDCoAkvKioKPiDC oAnCoCogVGhlIEVMU1Agb25seSBhY2NlcHRzIHR3byBlbGVtZW50cyBhdCBhIHRpbWUsIHNvIHdl IHF1ZXVlCj4gwqAJwqAqIGNvbnRleHQvdGFpbCBwYWlycyBvbiBhIGdpdmVuIHF1ZXVlIChyaW5n LT5leGVjbGlzdF9xdWV1ZSkgdW50aWwgdGhlCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2k5MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCj4gaW5k ZXggZGZlNDNlYS4uN2Q5YWEyNCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9p OTE1X2dlbS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwo+IEBAIC0z Miw2ICszMiw3IEBACj4gwqAjaW5jbHVkZSAiaTkxNV92Z3B1LmgiCj4gwqAjaW5jbHVkZSAiaTkx NV90cmFjZS5oIgo+IMKgI2luY2x1ZGUgImludGVsX2Rydi5oIgo+ICsjaW5jbHVkZSAiaTkxNV9z Y2hlZHVsZXIuaCIKPiDCoCNpbmNsdWRlIAo+IMKgI2luY2x1ZGUgCj4gwqAjaW5jbHVkZSAKPiBA QCAtNTMxNSw2ICs1MzE2LDEwIEBAIGludCBpOTE1X2dlbV9pbml0KHN0cnVjdCBkcm1fZGV2aWNl ICpkZXYpCj4gwqAJwqAqLwo+IMKgCWludGVsX3VuY29yZV9mb3JjZXdha2VfZ2V0KGRldl9wcml2 LCBGT1JDRVdBS0VfQUxMKTsKPiDCoAo+ICsJcmV0ID0gaTkxNV9zY2hlZHVsZXJfaW5pdChkZXYp Owo+ICsJaWYgKHJldCkKPiArCQlnb3RvIG91dF91bmxvY2s7Cj4gKwo+IMKgCXJldCA9IGk5MTVf Z2VtX2luaXRfdXNlcnB0cihkZXYpOwo+IMKgCWlmIChyZXQpCj4gwqAJCWdvdG8gb3V0X3VubG9j azsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zY2hlZHVsZXIuYyBi L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc2NoZWR1bGVyLmMKPiBuZXcgZmlsZSBtb2RlIDEw MDY0NAo+IGluZGV4IDAwMDAwMDAuLmZjMjNlZTcKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zY2hlZHVsZXIuYwo+IEBAIC0wLDAgKzEsODc0IEBACj4g Ky8qCj4gKyAqIENvcHlyaWdodCAoYykgMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbgo+ICsgKgo+ICsg KiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBl cnNvbiBvYnRhaW5pbmcgYQo+ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0 ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAo+ICsgKiB0byBkZWFsIGlu IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1p dGF0aW9uCj4gKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJs aXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAo+ICsgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2Yg dGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKPiArICogU29m dHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29u ZGl0aW9uczoKPiArICoKPiArICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMg cGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAo+ICsgKiBwYXJhZ3JhcGgpIHNo YWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2Yg dGhlCj4gKyAqIFNvZnR3YXJlLgo+ICsgKgo+ICsgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQg IkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+ICsgKiBJ TVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1F UkNIQU5UQUJJTElUWSwKPiArICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5E IE5PTklORlJJTkdFTUVOVC7CoMKgSU4gTk8gRVZFTlQgU0hBTEwKPiArICogVEhFIEFVVEhPUlMg T1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Ig T1RIRVIKPiArICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwg VE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKPiArICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5F Q1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUwo+ICsg KiBJTiBUSEUgU09GVFdBUkUuCj4gKyAqCj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgImk5MTVfZHJ2 LmgiCj4gKyNpbmNsdWRlICJpbnRlbF9kcnYuaCIKPiArI2luY2x1ZGUgImk5MTVfc2NoZWR1bGVy LmgiCj4gKwo+ICsvKioKPiArICogaTkxNV9zY2hlZHVsZXJfaXNfZW5hYmxlZCAtIFJldHVybnMg dHJ1ZSBpZiB0aGUgc2NoZWR1bGVyIGlzIGVuYWJsZWQuCj4gKyAqIEBkZXY6IERSTSBkZXZpY2UK PiArICovCj4gK2Jvb2wgaTkxNV9zY2hlZHVsZXJfaXNfZW5hYmxlZChzdHJ1Y3QgZHJtX2Rldmlj ZSAqZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYt PmRldl9wcml2YXRlOwo+ICsKPiArCXJldHVybiBkZXZfcHJpdi0+c2NoZWR1bGVyICE9IE5VTEw7 Cj4gK30KCmk5MTUuZW5hYmxlX3NjaGVkdWxlciB3b3VsZCBiZSB1c2VkIGluc3RlYWQuCgo+ICsK PiArLyoqCj4gKyAqIGk5MTVfc2NoZWR1bGVyX2luaXQgLSBJbml0aWFsaXNlIHRoZSBzY2hlZHVs ZXIuCj4gKyAqIEBkZXY6IERSTSBkZXZpY2UKPiArICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mg b3IgLUVOT01FTSBpZiBtZW1vcnkgYWxsb2NhdGlvbnMgZmFpbC4KPiArICovCj4gK2ludCBpOTE1 X3NjaGVkdWxlcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCj4gK3sKPiArCXN0cnVjdCBk cm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cj4gKwlzdHJ1Y3Qg aTkxNV9zY2hlZHVsZXIgKnNjaGVkdWxlciA9IGRldl9wcml2LT5zY2hlZHVsZXI7Cj4gKwlpbnQg cjsKPiArCgpUaGlzIHByb3RlY3Rpb24gLS0+Cgo+ICsJaWYgKHNjaGVkdWxlcikKPiArCQlyZXR1 cm4gMDsKPiArCj4gKwlzY2hlZHVsZXIgPSBremFsbG9jKHNpemVvZigqc2NoZWR1bGVyKSwgR0ZQ X0tFUk5FTCk7Cj4gKwlpZiAoIXNjaGVkdWxlcikKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCgpJ cyBub3QgbmVlZGVkIGlmIHdlIGhhdmUgZGF0YSBtZW1iZXIgYW5kIGk5MTUuZW5hYmxlX3NjaGVk dWxlci4KCj4gKwlzcGluX2xvY2tfaW5pdCgmc2NoZWR1bGVyLT5sb2NrKTsKPiArCj4gKwlmb3Ig KHIgPSAwOyByIDwgSTkxNV9OVU1fUklOR1M7IHIrKykKPiArCQlJTklUX0xJU1RfSEVBRCgmc2No ZWR1bGVyLT5ub2RlX3F1ZXVlW3JdKTsKPiArCj4gKwkvKiBEZWZhdWx0IHR1bmluZyB2YWx1ZXM6 ICovCj4gKwlzY2hlZHVsZXItPnByaW9yaXR5X2xldmVsX21pbsKgwqDCoMKgwqA9IC0xMDIzOwo+ ICsJc2NoZWR1bGVyLT5wcmlvcml0eV9sZXZlbF9tYXjCoMKgwqDCoMKgPSAxMDIzOwo+ICsJc2No ZWR1bGVyLT5wcmlvcml0eV9sZXZlbF9idW1wwqDCoMKgwqA9IDUwOwo+ICsJc2NoZWR1bGVyLT5w cmlvcml0eV9sZXZlbF9wcmVlbXB0ID0gOTAwOwo+ICsJc2NoZWR1bGVyLT5taW5fZmx5aW5nwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA9IDI7Cj4gKwo+ICsJZGV2X3ByaXYtPnNjaGVkdWxlciA9 IHNjaGVkdWxlcjsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArLyoKPiArICogQWRkIGEg cG9wcGVkIG5vZGUgYmFjayBpbiB0byB0aGUgcXVldWUuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRo ZSByaW5nIHdhcwo+ICsgKiBodW5nIHdoZW4gZXhlY2ZpbmFsKCkgd2FzIGNhbGxlZCBhbmQgdGh1 cyB0aGUgcmluZyBzdWJtaXNzaW9uIG5lZWRzIHRvIGJlCj4gKyAqIHJldHJpZWQgbGF0ZXIuCj4g KyAqLwo+ICtzdGF0aWMgdm9pZCBpOTE1X3NjaGVkdWxlcl9ub2RlX3JlcXVldWUoc3RydWN0IGk5 MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICpub2RlKQo+ICt7Cj4gKwlXQVJOX09OKCFub2RlKTsK ClJhdGhlciByZW1vdmUgdGhpcyBjb21wbGV0ZWx5IGFzIGl0IGlzIGFuIGludGVybmFsIGZ1bmN0 aW9uLCBvciB1c2UKQlVHX09OIGJlY2F1c2UgbmV4dCBsaW5lIHdpbGwgc3RyYWlnaHQgbGVhZCB0 byBPT1BTIGFmdGVyIHdhcm5pbmcuIEknbGwKcGFzcyBtZW50aW9uaW5nIHJlc3Qgb2YgdGhlIG9i dmlvdXMgV0FSTl9PTiB2cyBCVUdfT04ncy4KCj4gKwlXQVJOX09OKCFJOTE1X1NRU19JU19GTFlJ Tkcobm9kZSkpOwo+ICsKPiArCS8qIFNlcW5vIHdpbGwgYmUgcmVhc3NpZ25lZCBvbiByZWxhdW5j aCAqLwo+ICsJbm9kZS0+cGFyYW1zLnJlcXVlc3QtPnNlcW5vID0gMDsKPiArCW5vZGUtPnN0YXR1 cyA9IGk5MTVfc3FzX3F1ZXVlZDsKPiArfQo+ICsKPiArLyoKPiArICogR2l2ZSB1cCBvbiBhIG5v ZGUgY29tcGxldGVseS4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgaXQgaXMgY2F1c2luZyB0aGUKPiAr ICogcmluZyB0byBoYW5nIG9yIGlzIHVzaW5nIHNvbWUgcmVzb3VyY2UgdGhhdCBubyBsb25nZXIg ZXhpc3RzLgo+ICsgKi8KPiArc3RhdGljIHZvaWQgaTkxNV9zY2hlZHVsZXJfbm9kZV9raWxsKHN0 cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqbm9kZSkKPiArewo+ICsJV0FSTl9PTigh bm9kZSk7Cj4gKwlXQVJOX09OKEk5MTVfU1FTX0lTX0NPTVBMRVRFKG5vZGUpKTsKPiArCj4gKwlu b2RlLT5zdGF0dXMgPSBpOTE1X3Nxc19kZWFkOwo+ICt9Cj4gKwo+ICsvKiBNYXJrIGEgbm9kZSBh cyBpbiBmbGlnaHQgb24gdGhlIGhhcmR3YXJlLiAqLwoKQXMgZm9yIGRvY3VtZW50YXRpb24sIGZy b20gYmVsb3csIEkgb25seSBhc3N1bWUgc2NoZWR1bGVyIGxvY2sgbXVzdCBiZQpoZWxkIGFuZCBu b2RlJ3MgY2FuIGJlIG9ubHkgbWFuaXB1bGF0ZWQgd2hlbiBzY2hlZHVsZXIgbG9jayBpcyBoZWxk PwpJdCdzIGdvb2QgdG8gYWRkIGEgY29tbWVudCBkZXNjcmliaW5nIHRoZSBleHBlY3RlZCBsb2Nr aW5nLiBPciBtYXliZQphZGQgYXNzZXJ0X3NjaGVkdWxlcl9sb2NrX2hlbGQoKSBoZWxwZXIgYW5k IHNwcmlua2xlIGl0IGFyb3VuZCB0aGUKZnVuY3Rpb25zIHNpbWlsYXIgdG8gYXNzZXJ0X3JwbV93 YWtlbG9ja19oZWxkKCksIHdoaWNoIGlzIHNlbGYtCmRvY3VtZW50aW5nPwoKPiArc3RhdGljIGlu dCBpOTE1X3NjaGVkdWxlcl9ub2RlX2ZseShzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50 cnkgKm5vZGUpCj4gK3sKPiArCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IG5v ZGUtPnBhcmFtcy5kZXYtPmRldl9wcml2YXRlOwoKSWYgbm9kZSBpcyBOVUxMLCB0aGlzIHdvdWxk IGFscmVhZHkgT09QUywgSSBkbyBub3QgdGhpbmsgaXQncwp1bnJlYXNvbmFibGUgdG8gZXhwZWN0 IG5vZGUgbm90IHRvIGJlIE5VTEwuIFRoZSBiZWxvdyBXQVJOX09OIGNoZWNrIGlzCm5ldmVyIHJl YWNoZWQuCgo+ICsJc3RydWN0IGk5MTVfc2NoZWR1bGVyICpzY2hlZHVsZXIgPSBkZXZfcHJpdi0+ c2NoZWR1bGVyOwo+ICsJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZzsKPiArCj4gKwlXQVJO X09OKCFzY2hlZHVsZXIpOwo+ICsJV0FSTl9PTighbm9kZSk7Cj4gKwlXQVJOX09OKG5vZGUtPnN0 YXR1cyAhPSBpOTE1X3Nxc19wb3BwZWQpOwo+ICsKPiArCXJpbmcgPSBub2RlLT5wYXJhbXMucmlu ZzsKPiArCgpUaGlzIGFuZCBzaW1pbGFyIGFzc2lnbm1lbnRzIGNhbiBiZSBzcXVhc2hlZCB0byBk ZWNsYXJhdGlvbiBsaW5lLCBhcwp0aGlzIGlzIGJhc2ljYWxseSBhbiBhbGlhcy4KCj4gKwkvKgo+ ICsJwqAqIEFkZCB0aGUgbm9kZSAod2hpY2ggc2hvdWxkIGN1cnJlbnRseSBiZSBpbiBzdGF0ZSBw b3BwZWQpIHRvIHRoZQo+ICsJwqAqIGZyb250IG9mIHRoZSBxdWV1ZS4gVGhpcyBlbnN1cmUgdGhh dCBmbHlpbmcgbm9kZXMgYXJlIGFsd2F5cyBoZWxkCj4gKwnCoCogaW4gaGFyZHdhcmUgc3VibWlz c2lvbiBvcmRlci4KPiArCcKgKi8KPiArCWxpc3RfYWRkKCZub2RlLT5saW5rLCAmc2NoZWR1bGVy LT5ub2RlX3F1ZXVlW3JpbmctPmlkXSk7Cj4gKwo+ICsJbm9kZS0+c3RhdHVzID0gaTkxNV9zcXNf Zmx5aW5nOwo+ICsKPiArCWlmICghKHNjaGVkdWxlci0+ZmxhZ3NbcmluZy0+aWRdICYgaTkxNV9z Zl9pbnRlcnJ1cHRzX2VuYWJsZWQpKSB7Cj4gKwkJYm9vbCBzdWNjZXNzID0gdHJ1ZTsKPiArCj4g KwkJc3VjY2VzcyA9IHJpbmctPmlycV9nZXQocmluZyk7Cj4gKwkJaWYgKHN1Y2Nlc3MpCj4gKwkJ CXNjaGVkdWxlci0+ZmxhZ3NbcmluZy0+aWRdIHw9IGk5MTVfc2ZfaW50ZXJydXB0c19lbmFibGVk Owo+ICsJCWVsc2UKPiArCQkJcmV0dXJuIC1FSU5WQUw7CgpTaG91bGRuJ3QgdGhlIG5vZGUgYmUg Y2xlYW5lZCB1cCBmcm9tIG5vZGVfcXVldWUgaW4gY2FzZSBvZiBhbiBlcnJvcj8KCkFsc28sIEkg dGhpbmsgYWJvdmUgY291bGQgYmUgd3JpdHRlbiBtdWNoIG1vcmUgY29tcGFjdCBmb3JtIChiZWNh dXNlIGl0Cmxvb2tzIGxpa2Ugc29tZXRoaW5nIHdoZXJlIG1vcmUgbG9naWMgd2lsbCBiZSBhZGRl ZCBsYXRlcikuIEl0IG1ha2VzIGl0CmVhc2llciB0byB3cml0ZSBhbmQgdmlzdWFsaXplIHRoZSBl cnJvciBwYXRocyB3aGVuIHJlYWRpbmcgaWYgdGhlcmUgYXJlCm5vIG5lc3RlZCBpZidzLgoKSSB3 b24ndCBtZW50aW9uIGFib3V0IHRoZSBlcnJvciBwYXRocyBvZiBmdW5jdGlvbnMgYmVsb3csIEkg ZXhwZWN0IHRoZQpmb2xsb3dpbmcgZ3VpZGxpbmUgdG8gYmUgYWRoZXJlZDsKCglpZiAoc2NoZWR1 bGVyLT5mbGFnc1tyaW5nLT5pZF0gJiBJOTE1X1NGX0lOVF9FTkFCTEVEKQoJCWdvdG8gb3V0OwoK CWlmICghcmluZy0+aXJxX2dldChyaW5nKSkKCQlnb3RvIGVycl9pcnE7CgoJaWYgKCEuLi4pCgkJ Z290byBlcnJfZm9vOwoKCXNjaGVkdWxlci0+ZmxhZ3NbcmluZy0+aWRdIHw9IEk5MTVfU0ZfSU5U X0VOQUJMRUQ7Cm91dDoKCXJldHVybiAwOwplcnJfZm9vOgoJZm9vYmFyKCk7CmVycl9pcnE6Cgls aXN0X3JlbW92ZSgpCglyZXR1cm4gLUVJTlZBTDsKCj4gKwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4g K30KPiArCj4gK3N0YXRpYyB1aW50MzJfdCBpOTE1X3NjaGVkdWxlcl9jb3VudF9mbHlpbmcoc3Ry dWN0IGk5MTVfc2NoZWR1bGVyICpzY2hlZHVsZXIsCj4gKwkJCQkJwqDCoMKgwqBzdHJ1Y3QgaW50 ZWxfZW5naW5lX2NzICpyaW5nKQo+ICt7Cj4gKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVf ZW50cnkgKm5vZGU7Cj4gKwl1aW50MzJfdCBmbHlpbmcgPSAwOwo+ICsKPiArCWxpc3RfZm9yX2Vh Y2hfZW50cnkobm9kZSwgJnNjaGVkdWxlci0+bm9kZV9xdWV1ZVtyaW5nLT5pZF0sIGxpbmspCgor MSBmb3IgdGhlIGZvcl9lYWNoX3NjaGVkdWxlcl9ub2RlKC4uLikKCj4gKwkJaWYgKEk5MTVfU1FT X0lTX0ZMWUlORyhub2RlKSkKPiArCQkJZmx5aW5nKys7Cj4gKwo+ICsJcmV0dXJuIGZseWluZzsK PiArfQo+ICsKPiArc3RhdGljIHZvaWQgaTkxNV9zY2hlZHVsZXJfcHJpb3JpdHlfYnVtcF9jbGVh cihzdHJ1Y3QgaTkxNV9zY2hlZHVsZXIgKnNjaGVkdWxlcikKPiArewo+ICsJc3RydWN0IGk5MTVf c2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICpub2RlOwo+ICsJaW50IGk7Cj4gKwo+ICsJLyoKPiArCcKg KiBFbnN1cmUgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGRvbid0IGNhdXNlIHByb2JsZW1zIGFuZCB0 aGF0IGEgYnVtcAo+ICsJwqAqIGJ5IG9iamVjdCB1c2FnZSBvbmx5IGJ1bXBzIGVhY2ggdXNpbmcg YnVmZmVyIG9uY2U6Cj4gKwnCoCovCj4gKwlmb3IgKGkgPSAwOyBpIDwgSTkxNV9OVU1fUklOR1M7 IGkrKykgewo+ICsJCWxpc3RfZm9yX2VhY2hfZW50cnkobm9kZSwgJnNjaGVkdWxlci0+bm9kZV9x dWV1ZVtpXSwgbGluaykKPiArCQkJbm9kZS0+YnVtcGVkID0gZmFsc2U7Cj4gKwl9Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbnQgaTkxNV9zY2hlZHVsZXJfcHJpb3JpdHlfYnVtcChzdHJ1Y3QgaTkxNV9z Y2hlZHVsZXIgKnNjaGVkdWxlciwKPiArCQkJCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9l bnRyeSAqdGFyZ2V0LAoKSXMgdGhlcmUgc3BlY2lmaWMgcmVhc29uIHdoeSBzdHJ1Y3QgaTkxNV9z Y2hlZHVsZXJfcXVldWVfZW50cnkgYXJlIG5vdApyZWZlcnJlZCB0byBqdXN0IGFzICJub2RlIiBi dXQgInFlIiBhbmQgaGVyZSBzb21ldGhpbmcgZWxzZSwgZG8gIm5vZGUiCmFuZCAicWUiIGhhdmUg YSBzcGVjaWFsIHNlbWFudGljIG1lYW5pbmc/Cgo+ICsJCQkJdWludDMyX3QgYnVtcCkKPiArewo+ ICsJdWludDMyX3QgbmV3X3ByaW9yaXR5Owo+ICsJaW50IGksIGNvdW50Owo+ICsKPiArCWlmICh0 YXJnZXQtPnByaW9yaXR5ID49IHNjaGVkdWxlci0+cHJpb3JpdHlfbGV2ZWxfbWF4KQo+ICsJCXJl dHVybiAxOwoKU28gaWYgb25lIG5vZGUgcmVhY2hlcyBtYXhpbXVtIHByaW9yaXR5IHRoZSBkZXBl bmRlbmNpZXMgYXJlIGV4cGVjdGVkCnRvIGJlIG1heGVkIG91dCBhbHJlYWR5PwoKPiArCj4gKwlp ZiAodGFyZ2V0LT5idW1wZWQpCj4gKwkJcmV0dXJuIDA7Cj4gKwo+ICsJbmV3X3ByaW9yaXR5ID0g dGFyZ2V0LT5wcmlvcml0eSArIGJ1bXA7Cj4gKwlpZiAoKG5ld19wcmlvcml0eSA8PSB0YXJnZXQt PnByaW9yaXR5KSB8fAo+ICsJwqDCoMKgwqAobmV3X3ByaW9yaXR5ID4gc2NoZWR1bGVyLT5wcmlv cml0eV9sZXZlbF9tYXgpKQo+ICsJCXRhcmdldC0+cHJpb3JpdHkgPSBzY2hlZHVsZXItPnByaW9y aXR5X2xldmVsX21heDsKPiArCWVsc2UKPiArCQl0YXJnZXQtPnByaW9yaXR5ID0gbmV3X3ByaW9y aXR5Owo+ICsKPiArCWNvdW50ID0gMTsKPiArCXRhcmdldC0+YnVtcGVkID0gdHJ1ZTsKPiArCj4g Kwlmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0LT5udW1fZGVwczsgaSsrKSB7Cj4gKwkJaWYgKCF0YXJn ZXQtPmRlcF9saXN0W2ldKQo+ICsJCQljb250aW51ZTsKPiArCj4gKwkJaWYgKHRhcmdldC0+ZGVw X2xpc3RbaV0tPmJ1bXBlZCkKPiArCQkJY29udGludWU7Cj4gKwo+ICsJCWNvdW50ICs9IGk5MTVf c2NoZWR1bGVyX3ByaW9yaXR5X2J1bXAoc2NoZWR1bGVyLAo+ICsJCQkJCQnCoMKgwqDCoMKgwqB0 YXJnZXQtPmRlcF9saXN0W2ldLAo+ICsJCQkJCQnCoMKgwqDCoMKgwqBidW1wKTsKPiArCX0KPiAr Cj4gKwlyZXR1cm4gY291bnQ7Cj4gK30KPiArCj4gKy8qCj4gKyAqIE5vZGVzIGFyZSBjb25zaWRl cmVkIHZhbGlkIGRlcGVuZGVuY2llcyBpZiB0aGV5IGFyZSBxdWV1ZWQgb24gYW55IHJpbmcgb3IK PiArICogaWYgdGhleSBhcmUgaW4gZmxpZ2h0IG9uIGEgZGlmZmVyZW50IHJpbmcuIEluIGZsaWdo dCBvbiB0aGUgc2FtZSByaW5nIGlzIG5vCj4gKyAqIGxvbmdlciBpbnRlcmVzdGluZyBmb3Igbm9u LXByZW1wdGl2ZSBub2RlcyBhcyB0aGUgcmluZyBzZXJpYWxpc2VzIGV4ZWN1dGlvbi4KPiArICog Rm9yIHByZS1lbXB0aW5nIG5vZGVzLCBhbGwgaW4gZmxpZ2h0IGRlcGVuZGVuY2llcyBhcmUgdmFs aWQgYXMgdGhleSBtdXN0IG5vdAo+ICsgKiBiZSBqdW1wZWQgYnkgdGhlIGFjdCBvZiBwcmUtZW1w dGluZy4KPiArICoKPiArICogQW55dGhpbmcgdGhhdCBpcyBuZWl0aGVyIHF1ZXVlZCBub3IgZmx5 aW5nIGlzIHVuaW50ZXJlc3RpbmcuCj4gKyAqLwo+ICtzdGF0aWMgaW5saW5lIGJvb2wgaTkxNV9z Y2hlZHVsZXJfaXNfZGVwZW5kZW5jeV92YWxpZCgKPiArCQkJc3RydWN0IGk5MTVfc2NoZWR1bGVy X3F1ZXVlX2VudHJ5ICpub2RlLCB1aW50MzJfdCBpZHgpCj4gK3sKPiArCXN0cnVjdCBpOTE1X3Nj aGVkdWxlcl9xdWV1ZV9lbnRyeSAqZGVwOwo+ICsKPiArCWRlcCA9IG5vZGUtPmRlcF9saXN0W2lk eF07Cj4gKwlpZiAoIWRlcCkKPiArCQlyZXR1cm4gZmFsc2U7Cj4gKwo+ICsJaWYgKEk5MTVfU1FT X0lTX1FVRVVFRChkZXApKQo+ICsJCXJldHVybiB0cnVlOwo+ICsKPiArCWlmIChJOTE1X1NRU19J U19GTFlJTkcoZGVwKSkgewo+ICsJCWlmIChub2RlLT5wYXJhbXMucmluZyAhPSBkZXAtPnBhcmFt cy5yaW5nKQo+ICsJCQlyZXR1cm4gdHJ1ZTsKPiArCX0KPiArCj4gKwlyZXR1cm4gZmFsc2U7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgaTkxNV9zY2hlZHVsZXJfcG9wX2Zyb21fcXVldWVfbG9ja2Vk KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCj4gKwkJCQlzdHJ1Y3QgaTkxNV9zY2hlZHVs ZXJfcXVldWVfZW50cnkgKipwb3Bfbm9kZSkKPiArewo+ICsJc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKPiArCXN0cnVjdCBpOTE1X3Nj aGVkdWxlciAqc2NoZWR1bGVyID0gZGV2X3ByaXYtPnNjaGVkdWxlcjsKPiArCXN0cnVjdCBpOTE1 X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqYmVzdCA9IE5VTEw7Cj4gKwlzdHJ1Y3QgaTkxNV9zY2hl ZHVsZXJfcXVldWVfZW50cnkgKm5vZGU7Cj4gKwlpbnQgcmV0Owo+ICsJaW50IGk7Cj4gKwlib29s IGFueV9xdWV1ZWQgPSBmYWxzZTsKPiArCWJvb2wgaGFzX2xvY2FsLCBoYXNfcmVtb3RlLCBvbmx5 X3JlbW90ZSA9IGZhbHNlOwo+ICsKPiArCSpwb3Bfbm9kZSA9IE5VTEw7Cj4gKwlyZXQgPSAtRU5P REFUQTsKPiArCj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZzY2hlZHVsZXItPm5vZGVf cXVldWVbcmluZy0+aWRdLCBsaW5rKSB7Cj4gKwkJaWYgKCFJOTE1X1NRU19JU19RVUVVRUQobm9k ZSkpCj4gKwkJCWNvbnRpbnVlOwo+ICsJCWFueV9xdWV1ZWQgPSB0cnVlOwo+ICsKPiArCQloYXNf bG9jYWzCoMKgPSBmYWxzZTsKPiArCQloYXNfcmVtb3RlID0gZmFsc2U7Cj4gKwkJZm9yIChpID0g MDsgaSA8IG5vZGUtPm51bV9kZXBzOyBpKyspIHsKPiArCQkJaWYgKCFpOTE1X3NjaGVkdWxlcl9p c19kZXBlbmRlbmN5X3ZhbGlkKG5vZGUsIGkpKQo+ICsJCQkJY29udGludWU7Cj4gKwo+ICsJCQlp ZiAobm9kZS0+ZGVwX2xpc3RbaV0tPnBhcmFtcy5yaW5nID09IG5vZGUtPnBhcmFtcy5yaW5nKQo+ ICsJCQkJaGFzX2xvY2FsID0gdHJ1ZTsKPiArCQkJZWxzZQo+ICsJCQkJaGFzX3JlbW90ZSA9IHRy dWU7Cj4gKwkJfQo+ICsKPiArCQlpZiAoaGFzX3JlbW90ZSAmJiAhaGFzX2xvY2FsKQo+ICsJCQlv bmx5X3JlbW90ZSA9IHRydWU7Cj4gKwo+ICsJCWlmICghaGFzX2xvY2FsICYmICFoYXNfcmVtb3Rl KSB7Cj4gKwkJCWlmICghYmVzdCB8fAo+ICsJCQnCoMKgwqDCoChub2RlLT5wcmlvcml0eSA+IGJl c3QtPnByaW9yaXR5KSkKPiArCQkJCWJlc3QgPSBub2RlOwo+ICsJCX0KPiArCX0KPiArCj4gKwlp ZiAoYmVzdCkgewo+ICsJCWxpc3RfZGVsKCZiZXN0LT5saW5rKTsKPiArCj4gKwkJSU5JVF9MSVNU X0hFQUQoJmJlc3QtPmxpbmspOwo+ICsJCWJlc3QtPnN0YXR1c8KgwqA9IGk5MTVfc3FzX3BvcHBl ZDsKPiArCj4gKwkJcmV0ID0gMDsKPiArCX0gZWxzZSB7Cj4gKwkJLyogQ2FuIG9ubHkgZ2V0IGhl cmUgaWY6Cj4gKwkJwqAqIChhKSB0aGVyZSBhcmUgbm8gYnVmZmVycyBpbiB0aGUgcXVldWUKPiAr CQnCoCogKGIpIGFsbCBxdWV1ZWQgYnVmZmVycyBhcmUgZGVwZW5kZW50IG9uIG90aGVyIGJ1ZmZl cnMKPiArCQnCoCrCoMKgwqDCoMKgZS5nLiBvbiBhIGJ1ZmZlciB0aGF0IGlzIGluIGZsaWdodCBv biBhIGRpZmZlcmVudCByaW5nCj4gKwkJwqAqLwo+ICsJCWlmIChvbmx5X3JlbW90ZSkgewo+ICsJ CQkvKiBUaGUgb25seSBkZXBlbmRlbnQgYnVmZmVycyBhcmUgb24gYW5vdGhlciByaW5nLiAqLwo+ ICsJCQlyZXQgPSAtRUFHQUlOOwo+ICsJCX0gZWxzZSBpZiAoYW55X3F1ZXVlZCkgewo+ICsJCQkv KiBJdCBzZWVtcyB0aGF0IHNvbWV0aGluZyBoYXMgZ29uZSBob3JyaWJseSB3cm9uZyEgKi8KPiAr CQkJRFJNX0VSUk9SKCJCcm9rZW4gZGVwZW5kZW5jeSB0cmFja2luZyBvbiByaW5nICVkIVxuIiwK PiArCQkJCcKgwqAoaW50KSByaW5nLT5pZCk7CgpXb3VsZCB0aGlzIGNvbmRpdGlvbiBiZSB3b3J0 aHkgV0FSTl9PTkNFKCksIGJlY2F1c2UgaXQgd2lsbCBrZWVwCnJlcGVhdGluZyBhcyB0aGUgc2l0 dWF0aW9uIHdpbGwgcGVyc2lzdD8KCj4gKwkJfQo+ICsJfQo+ICsKPiArCSpwb3Bfbm9kZSA9IGJl c3Q7Cj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBOQjogVGhlIGRyaXZlciBt dXRleCBsb2NrIG11c3QgYmUgaGVsZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBJdCBp cwo+ICsgKiBvbmx5IHJlYWxseSByZXF1aXJlZCBkdXJpbmcgdGhlIGFjdHVhbCBiYWNrIGVuZCBz dWJtaXNzaW9uIGNhbGwuIEhvd2V2ZXIsCj4gKyAqIGF0dGVtcHRpbmcgdG8gYWNxdWlyZSBhIG11 dGV4IHdoaWxlIGhvbGRpbmcgYSBzcGluIGxvY2sgaXMgYSBCYWQgSWRlYS4KPiArICogQW5kIHJl bGVhc2luZyB0aGUgb25lIGJlZm9yZSBhY3F1aXJpbmcgdGhlIG90aGVyIGxlYWRzIHRvIG90aGVy IGNvZGUKPiArICogYmVpbmcgcnVuIGFuZCBpbnRlcmZlcmluZy4KPiArICovCj4gK3N0YXRpYyBp bnQgaTkxNV9zY2hlZHVsZXJfc3VibWl0KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCj4g K3sKPiArCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7Cj4gKwlzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwo+ICsJc3RydWN0IGk5 MTVfc2NoZWR1bGVyICpzY2hlZHVsZXIgPSBkZXZfcHJpdi0+c2NoZWR1bGVyOwo+ICsJc3RydWN0 IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICpub2RlOwo+ICsJaW50IHJldCwgY291bnQgPSAw LCBmbHlpbmc7Cj4gKwo+ICsJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZkZXYtPnN0cnVjdF9t dXRleCkpOwo+ICsKPiArCXNwaW5fbG9ja19pcnEoJnNjaGVkdWxlci0+bG9jayk7Cj4gKwo+ICsJ V0FSTl9PTihzY2hlZHVsZXItPmZsYWdzW3JpbmctPmlkXSAmIGk5MTVfc2Zfc3VibWl0dGluZyk7 Cj4gKwlzY2hlZHVsZXItPmZsYWdzW3JpbmctPmlkXSB8PSBpOTE1X3NmX3N1Ym1pdHRpbmc7Cj4g Kwo+ICsJLyogRmlyc3QgdGltZSBhcm91bmQsIGNvbXBsYWluIGlmIGFueXRoaW5nIHVuZXhwZWN0 ZWQgb2NjdXJzOiAqLwo+ICsJcmV0ID0gaTkxNV9zY2hlZHVsZXJfcG9wX2Zyb21fcXVldWVfbG9j a2VkKHJpbmcsICZub2RlKTsKPiArCWlmIChyZXQpCj4gKwkJZ290byBlcnJvcjsKPiArCj4gKwlk byB7Cj4gKwkJV0FSTl9PTighbm9kZSk7Cj4gKwkJV0FSTl9PTihub2RlLT5wYXJhbXMucmluZyAh PSByaW5nKTsKPiArCQlXQVJOX09OKG5vZGUtPnN0YXR1cyAhPSBpOTE1X3Nxc19wb3BwZWQpOwo+ ICsJCWNvdW50Kys7Cj4gKwo+ICsJCS8qCj4gKwkJwqAqIFRoZSBjYWxsIHRvIHBvcCBhYm92ZSB3 aWxsIGhhdmUgcmVtb3ZlZCB0aGUgbm9kZSBmcm9tIHRoZQo+ICsJCcKgKiBsaXN0LiBTbyBhZGQg aXQgYmFjayBpbiBhbmQgbWFyayBpdCBhcyBpbiBmbGlnaHQuCj4gKwkJwqAqLwo+ICsJCWk5MTVf c2NoZWR1bGVyX25vZGVfZmx5KG5vZGUpOwo+ICsKPiArCQlzcGluX3VubG9ja19pcnEoJnNjaGVk dWxlci0+bG9jayk7Cj4gKwkJcmV0ID0gZGV2X3ByaXYtPmd0LmV4ZWNidWZfZmluYWwoJm5vZGUt PnBhcmFtcyk7Cj4gKwkJc3Bpbl9sb2NrX2lycSgmc2NoZWR1bGVyLT5sb2NrKTsKPiArCj4gKwkJ LyoKPiArCQnCoCogSGFuZGxlIGZhaWxlZCBzdWJtaXNzaW9uIGJ1dCBmaXJzdCBjaGVjayB0aGF0 IHRoZQo+ICsJCcKgKiB3YXRjaGRvZy9yZXNldCBjb2RlIGhhcyBub3QgbnVrZWQgdGhlIG5vZGUg d2hpbGUgd2UKPiArCQnCoCogd2VyZW4ndCBsb29raW5nOgo+ICsJCcKgKi8KPiArCQlpZiAocmV0 ICYmIChub2RlLT5zdGF0dXMgIT0gaTkxNV9zcXNfZGVhZCkpIHsKPiArCQkJYm9vbCByZXF1ZXVl ID0gdHJ1ZTsKPiArCj4gKwkJCS8qCj4gKwkJCcKgKiBPaCBkZWFyISBFaXRoZXIgdGhlIG5vZGUg aXMgYnJva2VuIG9yIHRoZSByaW5nIGlzCj4gKwkJCcKgKiBidXN5LiBTbyBuZWVkIHRvIGtpbGwg dGhlIG5vZGUgb3IgcmVxdWV1ZSBpdCBhbmQgdHJ5Cj4gKwkJCcKgKiBhZ2FpbiBsYXRlciBhcyBh cHByb3ByaWF0ZS4KPiArCQkJwqAqLwo+ICsKPiArCQkJc3dpdGNoICgtcmV0KSB7Cj4gKwkJCWNh c2UgRU5PREVWOgo+ICsJCQljYXNlIEVOT0VOVDoKPiArCQkJCS8qIEZhdGFsIGVycm9ycy4gS2ls bCB0aGUgbm9kZS4gKi8KPiArCQkJCXJlcXVldWUgPSBmYWxzZTsKPiArCQkJCWk5MTVfc2NoZWR1 bGVyX25vZGVfa2lsbChub2RlKTsKPiArCQkJYnJlYWs7CgpUaGVzZSBicmVhayBpbmRlbnRzIHN0 aWxsLgoKPiArCj4gKwkJCWNhc2UgRUFHQUlOOgo+ICsJCQljYXNlIEVCVVNZOgo+ICsJCQljYXNl IEVJTzoKPiArCQkJY2FzZSBFTk9NRU06Cj4gKwkJCWNhc2UgRVJFU1RBUlRTWVM6Cj4gKwkJCWNh c2UgRUlOVFI6Cj4gKwkJCQkvKiBTdXBwb3NlZGx5IHJlY292ZXJhYmxlIGVycm9ycy4gKi8KPiAr CQkJYnJlYWs7Cj4gKwo+ICsJCQlkZWZhdWx0Ogo+ICsJCQkJLyoKPiArCQkJCcKgKiBBc3N1bWUg dGhlIGVycm9yIGlzIHJlY292ZXJhYmxlIGFuZCBob3BlCj4gKwkJCQnCoCogZm9yIHRoZSBiZXN0 Lgo+ICsJCQkJwqAqLwo+ICsJCQkJTUlTU0lOR19DQVNFKC1yZXQpOwo+ICsJCQlicmVhazsKPiAr CQkJfQo+ICsKPiArCQkJaWYgKHJlcXVldWUpIHsKPiArCQkJCWk5MTVfc2NoZWR1bGVyX25vZGVf cmVxdWV1ZShub2RlKTsKPiArCQkJCS8qCj4gKwkJCQnCoCogTm8gcG9pbnQgc3Bpbm5pbmcgaWYg dGhlIHJpbmcgaXMgY3VycmVudGx5Cj4gKwkJCQnCoCogdW5hdmFpbGFibGUgc28ganVzdCBnaXZl IHVwIGFuZCBjb21lIGJhY2sKPiArCQkJCcKgKiBsYXRlci4KPiArCQkJCcKgKi8KPiArCQkJCWJy ZWFrOwo+ICsJCQl9Cj4gKwkJfQo+ICsKPiArCQkvKiBLZWVwIGxhdW5jaGluZyB1bnRpbCB0aGUg c2t5IGlzIHN1ZmZpY2llbnRseSBmdWxsLiAqLwo+ICsJCWZseWluZyA9IGk5MTVfc2NoZWR1bGVy X2NvdW50X2ZseWluZyhzY2hlZHVsZXIsIHJpbmcpOwo+ICsJCWlmIChmbHlpbmcgPj0gc2NoZWR1 bGVyLT5taW5fZmx5aW5nKQo+ICsJCQlicmVhazsKPiArCj4gKwkJLyogR3JhYiBhbm90aGVyIG5v ZGUgYW5kIGdvIHJvdW5kIGFnYWluLi4uICovCj4gKwkJcmV0ID0gaTkxNV9zY2hlZHVsZXJfcG9w X2Zyb21fcXVldWVfbG9ja2VkKHJpbmcsICZub2RlKTsKPiArCX0gd2hpbGUgKHJldCA9PSAwKTsK PiArCj4gKwkvKiBEb24ndCBjb21wbGFpbiBhYm91dCBub3QgYmVpbmcgYWJsZSB0byBzdWJtaXQg ZXh0cmEgZW50cmllcyAqLwo+ICsJaWYgKHJldCA9PSAtRU5PREFUQSkKPiArCQlyZXQgPSAwOwo+ ICsKPiArCS8qCj4gKwnCoCogQnVtcCB0aGUgcHJpb3JpdHkgb2YgZXZlcnl0aGluZyB0aGF0IHdh cyBub3Qgc3VibWl0dGVkIHRvIHByZXZlbnQKPiArCcKgKiBzdGFydmF0aW9uIG9mIGxvdyBwcmlv cml0eSB0YXNrcyBieSBhIHNwYW1taW5nIGhpZ2ggcHJpb3JpdHkgdGFzay4KPiArCcKgKi8KClRo aXMsIHRoaXMgY2FsbHMgZm9yIGFuIEktRy1UIHRlc3QgdG8gbWFrZSBzdXJlIHdlJ3JlIGVmZmVj dGl2ZS4KCj4gKwlpOTE1X3NjaGVkdWxlcl9wcmlvcml0eV9idW1wX2NsZWFyKHNjaGVkdWxlcik7 Cj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZzY2hlZHVsZXItPm5vZGVfcXVldWVbcmlu Zy0+aWRdLCBsaW5rKSB7Cj4gKwkJaWYgKCFJOTE1X1NRU19JU19RVUVVRUQobm9kZSkpCj4gKwkJ CWNvbnRpbnVlOwo+ICsKPiArCQlpOTE1X3NjaGVkdWxlcl9wcmlvcml0eV9idW1wKHNjaGVkdWxl ciwgbm9kZSwKPiArCQkJCQnCoMKgwqDCoMKgc2NoZWR1bGVyLT5wcmlvcml0eV9sZXZlbF9idW1w KTsKPiArCX0KPiArCj4gKwkvKiBPbiBzdWNjZXNzLCByZXR1cm4gdGhlIG51bWJlciBvZiBidWZm ZXJzIHN1Ym1pdHRlZC4gKi8KPiArCWlmIChyZXQgPT0gMCkKPiArCQlyZXQgPSBjb3VudDsKPiAr Cj4gK2Vycm9yOgo+ICsJc2NoZWR1bGVyLT5mbGFnc1tyaW5nLT5pZF0gJj0gfmk5MTVfc2Zfc3Vi bWl0dGluZzsKPiArCXNwaW5fdW5sb2NrX2lycSgmc2NoZWR1bGVyLT5sb2NrKTsKPiArCXJldHVy biByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGk5MTVfZ2VuZXJhdGVfZGVwZW5kZW5jaWVz KHN0cnVjdCBpOTE1X3NjaGVkdWxlciAqc2NoZWR1bGVyLAo+ICsJCQkJwqDCoMKgwqDCoMKgwqBz dHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgKm5vZGUsCj4gKwkJCQnCoMKgwqDCoMKg wqDCoHVpbnQzMl90IHJpbmcpCj4gK3sKPiArCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9vYmpfZW50 cnkgKnRoaXMsICp0aGF0Owo+ICsJc3RydWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICp0 ZXN0Owo+ICsJaW50IGksIGo7Cj4gKwlib29sIGZvdW5kOwo+ICsKPiArCWxpc3RfZm9yX2VhY2hf ZW50cnkodGVzdCwgJnNjaGVkdWxlci0+bm9kZV9xdWV1ZVtyaW5nXSwgbGluaykgewo+ICsJCWlm IChJOTE1X1NRU19JU19DT01QTEVURSh0ZXN0KSkKPiArCQkJY29udGludWU7Cj4gKwo+ICsJCS8q Cj4gKwkJwqAqIEJhdGNoZXMgb24gdGhlIHNhbWUgcmluZyBmb3IgdGhlIHNhbWUKPiArCQnCoCog Y29udGV4dCBtdXN0IGJlIGtlcHQgaW4gb3JkZXIuCj4gKwkJwqAqLwo+ICsJCWZvdW5kID0gKG5v ZGUtPnBhcmFtcy5jdHggPT0gdGVzdC0+cGFyYW1zLmN0eCkgJiYKPiArCQkJKG5vZGUtPnBhcmFt cy5yaW5nID09IHRlc3QtPnBhcmFtcy5yaW5nKTsKPiArCj4gKwkJLyoKPiArCQnCoCogQmF0Y2hl cyB3b3JraW5nIG9uIHRoZSBzYW1lIG9iamVjdHMgbXVzdAo+ICsJCcKgKiBiZSBrZXB0IGluIG9y ZGVyLgo+ICsJCcKgKi8KPiArCQlmb3IgKGkgPSAwOyAoaSA8IG5vZGUtPm51bV9vYmpzKSAmJiAh Zm91bmQ7IGkrKykgewo+ICsJCQl0aGlzID0gbm9kZS0+c2F2ZWRfb2JqZWN0cyArIGk7Cgpub2Rl LT5vYmpzIGFuZCBub2RlLT5udW1fb2JqcyB3b3VsZCBiZSBhIGJldHRlciBuYW1pbmcgbWF0Y2gu IG51bV9vYmpzCmFuZCBzYXZlZF9vYmplY3RzIG1ha2VzIG1lIHRoaW5rIHdlIGhhdmUgYSBidWcg aGVyZSwgaW5kZXhpbmcgd3JvbmcKYXJyYXkuCgo+ICsKPiArCQkJZm9yIChqID0gMDsgaiA8IHRl c3QtPm51bV9vYmpzOyBqKyspIHsKPiArCQkJCXRoYXQgPSB0ZXN0LT5zYXZlZF9vYmplY3RzICsg ajsKPiArCj4gKwkJCQlpZiAodGhpcy0+b2JqICE9IHRoYXQtPm9iaikKPiArCQkJCQljb250aW51 ZTsKPiArCj4gKwkJCQkvKiBPbmx5IG5lZWQgdG8gd29ycnkgYWJvdXQgd3JpdGVzICovCj4gKwkJ CQlpZiAodGhpcy0+cmVhZF9vbmx5ICYmIHRoYXQtPnJlYWRfb25seSkKPiArCQkJCQljb250aW51 ZTsKPiArCj4gKwkJCQlmb3VuZCA9IHRydWU7Cj4gKwkJCQlicmVhazsKPiArCQkJfQo+ICsJCX0K PiArCj4gKwkJaWYgKGZvdW5kKSB7Cj4gKwkJCW5vZGUtPmRlcF9saXN0W25vZGUtPm51bV9kZXBz XSA9IHRlc3Q7Cj4gKwkJCW5vZGUtPm51bV9kZXBzKys7Cj4gKwkJfQo+ICsJfQo+ICt9Cj4gKwo+ ICtzdGF0aWMgaW50IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2V4ZWNidWZmZXJfYnlwYXNzKHN0cnVj dCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqcWUpCj4gK3sKPiArCXN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdiA9IHFlLT5wYXJhbXMuZGV2LT5kZXZfcHJpdmF0ZTsKPiArCXN0 cnVjdCBpOTE1X3NjaGVkdWxlciAqc2NoZWR1bGVyID0gZGV2X3ByaXYtPnNjaGVkdWxlcjsKPiAr CWludCByZXQ7Cj4gKwo+ICsJc2NoZWR1bGVyLT5mbGFnc1txZS0+cGFyYW1zLnJpbmctPmlkXSB8 PSBpOTE1X3NmX3N1Ym1pdHRpbmc7Cj4gKwlyZXQgPSBkZXZfcHJpdi0+Z3QuZXhlY2J1Zl9maW5h bCgmcWUtPnBhcmFtcyk7Cj4gKwlzY2hlZHVsZXItPmZsYWdzW3FlLT5wYXJhbXMucmluZy0+aWRd ICY9IH5pOTE1X3NmX3N1Ym1pdHRpbmc7Cj4gKwoKVGhlIGFib3ZlIGNvZGUgbWFrZXMgbWUgdGhp bmsgb2YgbG9ja2luZyBhZ2FpbiwgbWF5YmUgZG9jdW1lbnQgYXQgdG9wCm9mIHRoaXMgZnVuY3Rp b24uCgo+ICsJLyoKPiArCcKgKiBEb24ndCBkbyBhbnkgY2xlYW4gdXAgb24gZmFpbHVyZSBiZWNh dXNlIHRoZSBjYWxsZXIgd2lsbAo+ICsJwqAqIGRvIGl0IGFsbCBhbnl3YXkuCj4gKwnCoCovCj4g KwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJLyogTmVlZCB0byByZWxlYXNlIGFu eSByZXNvdXJjZXMgaGVsZCBieSB0aGUgbm9kZTogKi8KPiArCWk5MTVfc2NoZWR1bGVyX2NsZWFu X25vZGUocWUpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICsvKioKPiArICogaTkxNV9z Y2hlZHVsZXJfcXVldWVfZXhlY2J1ZmZlciAtIFN1Ym1pdCBhIGJhdGNoIGJ1ZmZlciByZXF1ZXN0 IHRvIHRoZQo+ICsgKiBzY2hlZHVsZXIuCj4gKyAqIEBxZTogVGhlIGJhdGNoIGJ1ZmZlciByZXF1 ZXN0IHRvIGJlIHF1ZXVlZC4KPiArICogVGhlIGV4cGVjdGF0aW9uIGlzIHRoZSBxZSBwYXNzZWQg aW4gaXMgYSBsb2NhbCBzdGFjayB2YXJpYWJsZS4gVGhpcwo+ICsgKiBmdW5jdGlvbiB3aWxsIGNv cHkgaXRzIGNvbnRlbnRzIGludG8gYSBmcmVzaGx5IGFsbG9jYXRlZCBsaXN0IG5vZGUuIFRoZQo+ ICsgKiBuZXcgbm9kZSB0YWtlcyBvd25lcnNoaXAgb2Ygc2FpZCBjb250ZW50cyBzbyB0aGUgb3Jp Z2luYWwgcWUgc2hvdWxkIHNpbXBseQo+ICsgKiBiZSBkaXNjYXJkZWQgYW5kIG5vdCBjbGVhbmVk IHVwIChpLmUuIGRvbid0IGZyZWUgbWVtb3J5IGl0IHBvaW50cyB0byBvcgo+ICsgKiBkZXJlZmVy ZW5jZSBvYmplY3RzIGl0IGhvbGRzKS4gVGhlIG5vZGUgaXMgYWRkZWQgdG8gdGhlIHNjaGVkdWxl cidzIHF1ZXVlCj4gKyAqIGFuZCB0aGUgYmF0Y2ggYnVmZmVyIHdpbGwgYmUgc3VibWl0dGVkIHRv IHRoZSBoYXJkd2FyZSBhdCBzb21lIGZ1dHVyZQo+ICsgKiBwb2ludCBpbiB0aW1lICh3aGljaCBt YXkgYmUgaW1tZWRpYXRlbHksIGJlZm9yZSByZXR1cm5pbmcgb3IgbWF5IGJlIHF1aXRlCj4gKyAq IGEgbG90IGxhdGVyKS4KPiArICovCj4gK2ludCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9leGVjYnVm ZmVyKHN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqcWUpCj4gK3sKPiArCXN0cnVj dCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHFlLT5wYXJhbXMuZGV2LT5kZXZfcHJpdmF0 ZTsKPiArCXN0cnVjdCBpOTE1X3NjaGVkdWxlciAqc2NoZWR1bGVyID0gZGV2X3ByaXYtPnNjaGVk dWxlcjsKPiArCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcgPSBxZS0+cGFyYW1zLnJpbmc7 Cj4gKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgKm5vZGU7Cj4gKwlzdHJ1Y3Qg aTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgKnRlc3Q7Cj4gKwlib29sIG5vdF9mbHlpbmc7Cj4g KwlpbnQgaSwgcjsKPiArCWludCBpbmNvbXBsZXRlID0gMDsKPiArCj4gKwlXQVJOX09OKCFzY2hl ZHVsZXIpOwo+ICsKPiArCWlmICgxLyohaTkxNS5lbmFibGVfc2NoZWR1bGVyKi8pCj4gKwkJcmV0 dXJuIGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2V4ZWNidWZmZXJfYnlwYXNzKHFlKTsKPiArCgpJJ20g dGhpbmtpbmcsIHNob3VsZCB3ZSBicmFuY2ggYWxyZWFkeSBiZWZvcmUgY2FsbGluZyBhIGZ1bmN0 aW9uIG5hbWVkCmk5MTVfc2NoZWR1bGVyX3F1ZXVlX2V4ZWNidWZmZXIgaWYgc2NoZWR1bGVyIGlz IGRpc2FibGVkPwoKPiArCW5vZGUgPSBrbWFsbG9jKHNpemVvZigqbm9kZSksIEdGUF9LRVJORUwp Owo+ICsJaWYgKCFub2RlKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsKPiArCSpub2RlID0gKnFl OwoKTm93IEkgcmVhZCB0aGUgYWRkZWQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGZ1bmN0aW9uLCBt YXliZSB3ZSBzaG91bGQgYXQKbGVhc3QgemVybyBvdXQgcWUgdG8gYXZvaWQgZnV0dXJlIHByb2Js ZW1zPwoKPiArCUlOSVRfTElTVF9IRUFEKCZub2RlLT5saW5rKTsKPiArCW5vZGUtPnN0YXR1cyA9 IGk5MTVfc3FzX3F1ZXVlZDsKPiArCW5vZGUtPnN0YW1wwqDCoD0gamlmZmllczsKPiArCWk5MTVf Z2VtX3JlcXVlc3RfcmVmZXJlbmNlKG5vZGUtPnBhcmFtcy5yZXF1ZXN0KTsKPiArCj4gKwlXQVJO X09OKG5vZGUtPnBhcmFtcy5yZXF1ZXN0LT5zY2hlZHVsZXJfcWUpOwo+ICsJbm9kZS0+cGFyYW1z LnJlcXVlc3QtPnNjaGVkdWxlcl9xZSA9IG5vZGU7Cj4gKwo+ICsJLyogTmVlZCB0byBkZXRlcm1p bmUgdGhlIG51bWJlciBvZiBpbmNvbXBsZXRlIGVudHJpZXMgaW4gdGhlIGxpc3QgYXMKPiArCcKg KiB0aGF0IHdpbGwgYmUgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgZGVwZW5kZW5jeSBsaXN0Lgo+ ICsJwqAqCj4gKwnCoCogTm90ZSB0aGF0IHRoZSBhbGxvY2F0aW9uIG11c3Qgbm90IGJlIG1hZGUg d2l0aCB0aGUgc3BpbmxvY2sgYWNxdWlyZWQKPiArCcKgKiBhcyBrbWFsbG9jIGNhbiBzbGVlcC4g SG93ZXZlciwgdGhlIHVubG9jay9yZWxvY2sgaXMgc2FmZSBiZWNhdXNlIG5vCj4gKwnCoCogbmV3 IGVudHJpZXMgY2FuIGJlIHF1ZXVlZCB1cCBkdXJpbmcgdGhlIHVubG9jayBhcyB0aGUgaTkxNSBk cml2ZXIKPiArCcKgKiBtdXRleCBpcyBzdGlsbCBoZWxkLiBFbnRyaWVzIGNvdWxkIGJlIHJlbW92 ZWQgZnJvbSB0aGUgbGlzdCBidXQgdGhhdAo+ICsJwqAqIGp1c3QgbWVhbnMgdGhlIGRlcF9saXN0 IHdpbGwgYmUgb3Zlci1hbGxvY2F0ZWQgd2hpY2ggaXMgZmluZS4KPiArCcKgKi8KPiArCXNwaW5f bG9ja19pcnEoJnNjaGVkdWxlci0+bG9jayk7CgotLT4KCj4gKwlmb3IgKHIgPSAwOyByIDwgSTkx NV9OVU1fUklOR1M7IHIrKykgewo+ICsJCWxpc3RfZm9yX2VhY2hfZW50cnkodGVzdCwgJnNjaGVk dWxlci0+bm9kZV9xdWV1ZVtyXSwgbGluaykgewo+ICsJCQlpZiAoSTkxNV9TUVNfSVNfQ09NUExF VEUodGVzdCkpCj4gKwkJCQljb250aW51ZTsKPiArCj4gKwkJCWluY29tcGxldGUrKzsKPiArCQl9 Cj4gKwl9Cj4gKwoKPC0tIFRoaXMgY291bnRpbmcgc3RydWN0dXJlLCBJIHN0aWxsIHRoaW5rIGl0 IHdvdWxkIGJlIGdvb2QgaWRlYSB0bwptYWtlIGl0IGEgc3RhdGljIGhlbHBlci4KCj4gKwkvKiBU ZW1wb3JhcmlseSB1bmxvY2sgdG8gYWxsb2NhdGUgbWVtb3J5OiAqLwo+ICsJc3Bpbl91bmxvY2tf aXJxKCZzY2hlZHVsZXItPmxvY2spOwo+ICsJaWYgKGluY29tcGxldGUpIHsKPiArCQlub2RlLT5k ZXBfbGlzdCA9IGttYWxsb2NfYXJyYXkoaW5jb21wbGV0ZSwKPiArCQkJCQnCoMKgwqDCoMKgwqDC oHNpemVvZigqbm9kZS0+ZGVwX2xpc3QpLAo+ICsJCQkJCcKgwqDCoMKgwqDCoMKgR0ZQX0tFUk5F TCk7Cj4gKwkJaWYgKCFub2RlLT5kZXBfbGlzdCkgewo+ICsJCQlrZnJlZShub2RlKTsKPiArCQkJ cmV0dXJuIC1FTk9NRU07Cj4gKwkJfQo+ICsJfSBlbHNlCj4gKwkJbm9kZS0+ZGVwX2xpc3QgPSBO VUxMOwo+ICsKPiArCXNwaW5fbG9ja19pcnEoJnNjaGVkdWxlci0+bG9jayk7Cj4gKwlub2RlLT5u dW1fZGVwcyA9IDA7Cj4gKwo+ICsJaWYgKG5vZGUtPmRlcF9saXN0KSB7Cj4gKwkJZm9yIChyID0g MDsgciA8IEk5MTVfTlVNX1JJTkdTOyByKyspCj4gKwkJCWk5MTVfZ2VuZXJhdGVfZGVwZW5kZW5j aWVzKHNjaGVkdWxlciwgbm9kZSwgcik7Cj4gKwo+ICsJCVdBUk5fT04obm9kZS0+bnVtX2RlcHMg PiBpbmNvbXBsZXRlKTsKPiArCX0KPiArCj4gKwlub2RlLT5wcmlvcml0eSA9IGNsYW1wKG5vZGUt PnByaW9yaXR5LAo+ICsJCQnCoMKgwqDCoMKgwqDCoHNjaGVkdWxlci0+cHJpb3JpdHlfbGV2ZWxf bWluLAo+ICsJCQnCoMKgwqDCoMKgwqDCoHNjaGVkdWxlci0+cHJpb3JpdHlfbGV2ZWxfbWF4KTsK PiArCj4gKwlpZiAoKG5vZGUtPnByaW9yaXR5ID4gMCkgJiYgbm9kZS0+bnVtX2RlcHMpIHsKPiAr CQlpOTE1X3NjaGVkdWxlcl9wcmlvcml0eV9idW1wX2NsZWFyKHNjaGVkdWxlcik7Cj4gKwo+ICsJ CWZvciAoaSA9IDA7IGkgPCBub2RlLT5udW1fZGVwczsgaSsrKQo+ICsJCQlpOTE1X3NjaGVkdWxl cl9wcmlvcml0eV9idW1wKHNjaGVkdWxlciwKPiArCQkJCQlub2RlLT5kZXBfbGlzdFtpXSwgbm9k ZS0+cHJpb3JpdHkpOwoKSWYgbm9kZSBpcyBwb3N0ZWQgd2l0aCBtYXhpbXVtIHByaW9yaXR5IHRv IGJlZ2luIHdpdGgsIHdvdWxkbid0IHRoZQpwcmlvcml0eSBwcm9wYWdhdGlvbiBzdG9wIGFmdGVy IGZpcnN0IGxldmVsIGRlcGVuZGVuY2llcyBkdWUgdG8gdGhlCmNoZWNrIGluIHRoZSBiZWdpbm5p bmcgb2YgcHJpb3JpdHlfYnVtcCBmdW5jdGlvbj8KCj4gKwo+ICsJbGlzdF9hZGRfdGFpbCgmbm9k ZS0+bGluaywgJnNjaGVkdWxlci0+bm9kZV9xdWV1ZVtyaW5nLT5pZF0pOwo+ICsKPiArCW5vdF9m bHlpbmcgPSBpOTE1X3NjaGVkdWxlcl9jb3VudF9mbHlpbmcoc2NoZWR1bGVyLCByaW5nKSA8Cj4g KwkJCQkJCcKgc2NoZWR1bGVyLT5taW5fZmx5aW5nOwo+ICsKPiArCXNwaW5fdW5sb2NrX2lycSgm c2NoZWR1bGVyLT5sb2NrKTsKPiArCj4gKwlpZiAobm90X2ZseWluZykKPiArCQlpOTE1X3NjaGVk dWxlcl9zdWJtaXQocmluZyk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gKy8qKgo+ICsg KiBpOTE1X3NjaGVkdWxlcl9ub3RpZnlfcmVxdWVzdCAtIE5vdGlmeSB0aGUgc2NoZWR1bGVyIHRo YXQgdGhlIGdpdmVuCj4gKyAqIHJlcXVlc3QgaGFzIGNvbXBsZXRlZCBvbiB0aGUgaGFyZHdhcmUu Cj4gKyAqIEByZXE6IFJlcXVlc3Qgc3RydWN0dXJlIHdoaWNoIGhhcyBjb21wbGV0ZWQKPiArICog QHByZWVtcHQ6IERpZCBpdCBjb21wbGV0ZSBwcmUtZW1wdGl2ZWx5Pwo+ICsgKiBBIHNlcXVlbmNl IG51bWJlciBoYXMgcG9wcGVkIG91dCBvZiB0aGUgaGFyZHdhcmUgYW5kIHRoZSByZXF1ZXN0IGhh bmRsaW5nCj4gKyAqIGNvZGUgaGFzIG1hcHBlZCBpdCBiYWNrIHRvIGEgcmVxdWVzdCBhbmQgd2ls bCBtYXJrIHRoYXQgcmVxdWVzdCBjb21wbGV0ZS4KPiArICogSXQgYWxzbyBjYWxscyB0aGlzIGZ1 bmN0aW9uIHRvIG5vdGlmeSB0aGUgc2NoZWR1bGVyIGFib3V0IHRoZSBjb21wbGV0aW9uCj4gKyAq IHNvIHRoZSBzY2hlZHVsZXIncyBub2RlIGNhbiBiZSB1cGRhdGVkIGFwcHJvcHJpYXRlbHkuCj4g KyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVxdWVzdCBpcyBzY2hlZHVsZXIgbWFuYWdlZCwgZmFs c2UgaWYgbm90LiBUaGUgcmV0dXJuCj4gKyAqIHZhbHVlIGlzIGNvbWJpbmVkIGZvciBhbGwgZnJl c2hseSBjb21wbGV0ZWQgcmVxdWVzdHMgYW5kIGlmIGFueSB3ZXJlIHRydWUKPiArICogdGhlbiBp OTE1X3NjaGVkdWxlcl93YWtldXAoKSBpcyBjYWxsZWQgc28gdGhlIHNjaGVkdWxlciBjYW4gZG8g ZnVydGhlcgo+ICsgKiBwcm9jZXNzaW5nIChzdWJtaXQgbW9yZSB3b3JrKSBhdCB0aGUgZW5kLgo+ ICsgKi8KPiArYm9vbCBpOTE1X3NjaGVkdWxlcl9ub3RpZnlfcmVxdWVzdChzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX3JlcXVlc3QgKnJlcSkKPiArewo+ICsJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRl dl9wcml2ID0gdG9faTkxNShyZXEtPnJpbmctPmRldik7Cj4gKwlzdHJ1Y3QgaTkxNV9zY2hlZHVs ZXIgKnNjaGVkdWxlciA9IGRldl9wcml2LT5zY2hlZHVsZXI7Cj4gKwlzdHJ1Y3QgaTkxNV9zY2hl ZHVsZXJfcXVldWVfZW50cnkgKm5vZGUgPSByZXEtPnNjaGVkdWxlcl9xZTsKPiArCXVuc2lnbmVk IGxvbmcgZmxhZ3M7Cj4gKwo+ICsJaWYgKCFub2RlKQo+ICsJCXJldHVybiBmYWxzZTsKPiArCj4g KwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NoZWR1bGVyLT5sb2NrLCBmbGFncyk7Cj4gKwo+ICsJV0FS Tl9PTighSTkxNV9TUVNfSVNfRkxZSU5HKG5vZGUpKTsKPiArCj4gKwkvKiBOb2RlIHdhcyBpbiBm bGlnaHQgc28gbWFyayBpdCBhcyBjb21wbGV0ZS4gKi8KPiArCWlmIChyZXEtPmNhbmNlbGxlZCkK PiArCQlub2RlLT5zdGF0dXMgPSBpOTE1X3Nxc19kZWFkOwo+ICsJZWxzZQo+ICsJCW5vZGUtPnN0 YXR1cyA9IGk5MTVfc3FzX2NvbXBsZXRlOwo+ICsKPiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JnNjaGVkdWxlci0+bG9jaywgZmxhZ3MpOwo+ICsKPiArCXJldHVybiB0cnVlOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgaW50IGk5MTVfc2NoZWR1bGVyX3JlbW92ZV9kZXBlbmRlbnQoc3RydWN0IGk5MTVf c2NoZWR1bGVyICpzY2hlZHVsZXIsCj4gKwkJCQlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVf ZW50cnkgKnJlbW92ZSkKPiArewo+ICsJc3RydWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5 ICpub2RlOwo+ICsJaW50IGksIHI7Cj4gKwlpbnQgY291bnQgPSAwOwo+ICsKPiArCS8qCj4gKwnC oCogRW5zdXJlIHRoYXQgYSBub2RlIGlzIG5vdCBiZWluZyByZW1vdmVkIHdoaWNoIGlzIHN0aWxs IGRlcGVuZGVudAo+ICsJwqAqIHVwb24gb3RoZXIgKG5vdCBjb21wbGV0ZWQpIHdvcmsuIElmIHRo YXQgaGFwcGVucywgaXQgaW1wbGllcwo+ICsJwqAqIHNvbWV0aGluZyBoYXMgZ29uZSB2ZXJ5IHdy b25nIHdpdGggdGhlIGRlcGVuZGVuY3kgdHJhY2tpbmchIE5vdGUKPiArCcKgKiB0aGF0IHRoZXJl IGlzIG5vIG5lZWQgdG8gd29ycnkgaWYgdGhpcyBub2RlIGhhcyBiZWVuIGV4cGxpY2l0bHkKPiAr CcKgKiBraWxsZWQgZm9yIHNvbWUgcmVhc29uIC0gaXQgbWlnaHQgYmUgYmVpbmcga2lsbGVkIGJl Zm9yZSBpdCBnb3QKPiArCcKgKiBzZW50IHRvIHRoZSBoYXJkd2FyZS4KPiArCcKgKi8KPiArCWlm IChyZW1vdmUtPnN0YXR1cyAhPSBpOTE1X3Nxc19kZWFkKSB7Cj4gKwkJZm9yIChpID0gMDsgaSA8 IHJlbW92ZS0+bnVtX2RlcHM7IGkrKykKPiArCQkJaWYgKChyZW1vdmUtPmRlcF9saXN0W2ldKSAm Jgo+ICsJCQnCoMKgwqDCoCghSTkxNV9TUVNfSVNfQ09NUExFVEUocmVtb3ZlLT5kZXBfbGlzdFtp XSkpKQo+ICsJCQkJY291bnQrKzsKPiArCQlXQVJOX09OKGNvdW50KTsKPiArCX0KPiArCj4gKwkv Kgo+ICsJwqAqIFJlbW92ZSB0aGlzIG5vZGUgZnJvbSB0aGUgZGVwZW5kZW5jeSBsaXN0cyBvZiBh bnkgb3RoZXIgbm9kZSB3aGljaAo+ICsJwqAqIG1pZ2h0IGJlIHdhaXRpbmcgb24gaXQuCj4gKwnC oCovCj4gKwlmb3IgKHIgPSAwOyByIDwgSTkxNV9OVU1fUklOR1M7IHIrKykgewo+ICsJCWxpc3Rf Zm9yX2VhY2hfZW50cnkobm9kZSwgJnNjaGVkdWxlci0+bm9kZV9xdWV1ZVtyXSwgbGluaykgewo+ ICsJCQlmb3IgKGkgPSAwOyBpIDwgbm9kZS0+bnVtX2RlcHM7IGkrKykgewo+ICsJCQkJaWYgKG5v ZGUtPmRlcF9saXN0W2ldICE9IHJlbW92ZSkKPiArCQkJCQljb250aW51ZTsKPiArCj4gKwkJCQlu b2RlLT5kZXBfbGlzdFtpXSA9IE5VTEw7Cj4gKwkJCX0KPiArCQl9Cj4gKwl9Cj4gKwo+ICsJcmV0 dXJuIDA7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBpOTE1X3NjaGVkdWxlcl93YWtldXAgLSB3YWtl IHRoZSBzY2hlZHVsZXIncyB3b3JrZXIgdGhyZWFkCj4gKyAqIEBkZXY6IERSTSBkZXZpY2UKPiAr ICogQ2FsbGVkIGF0IHRoZSBlbmQgb2Ygc2Vxbm8gaW50ZXJydXB0IHByb2Nlc3NpbmcgaWYgYW55 IHJlcXVlc3QgaGFzCj4gKyAqIGNvbXBsZXRlZCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgc2NoZWR1 bGVyIG5vZGUuCj4gKyAqLwo+ICt2b2lkIGk5MTVfc2NoZWR1bGVyX3dha2V1cChzdHJ1Y3QgZHJt X2RldmljZSAqZGV2KQo+ICt7Cj4gKwkvKiBYWFg6IE5lZWQgdG8gY2FsbCBpOTE1X3NjaGVkdWxl cl9yZW1vdmUoKSB2aWEgd29yayBoYW5kbGVyLiAqLwo+ICt9Cj4gKwo+ICsvKioKPiArICogaTkx NV9zY2hlZHVsZXJfY2xlYW5fbm9kZSAtIGZyZWUgdXAgYW55IGFsbG9jYXRpb25zL3JlZmVyZW5j ZXMKPiArICogYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBzY2hlZHVsZXIgcXVldWUgZW50cnku Cj4gKyAqIEBub2RlOiBRdWV1ZSBlbnRyeSBzdHJ1Y3R1cmUgd2hpY2ggaXMgY29tcGxldGUKPiAr ICogQWZ0ZXIgYSBnaXZlIGJhdGNoIGJ1ZmZlciBjb21wbGV0ZXMgb24gdGhlIGhhcmR3YXJlLCBh bGwgdGhlIGluZm9ybWF0aW9uCj4gKyAqIHJlcXVpcmVkIHRvIHJlc3VibWl0IGl0IGlzIG5vIGxv bmdlciByZXF1aXJlZC4gSG93ZXZlciwgdGhlIG5vZGUgZW50cnkKPiArICogaXRzZWxmIG1pZ2h0 IHN0aWxsIGJlIHJlcXVpcmVkIGZvciB0cmFja2luZyBwdXJwb3NlcyBmb3IgYSB3aGlsZSBsb25n ZXIuCj4gKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBu b2RlIGlzIGtub3duIHRvIGJlIGNvbXBsZXRlCj4gKyAqIHNvIHRoYXQgdGhlc2UgcmVzb3VyY2Vz IG1heSBiZSBmcmVlZCBldmVuIHRob3VnaCB0aGUgbm9kZSBpdHNlbGYgbWlnaHQKPiArICogaGFu ZyBhcm91bmQuCj4gKyAqLwo+ICt2b2lkIGk5MTVfc2NoZWR1bGVyX2NsZWFuX25vZGUoc3RydWN0 IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICpub2RlKQo+ICt7Cj4gKwlpZiAoIUk5MTVfU1FT X0lTX0NPTVBMRVRFKG5vZGUpKSB7Cj4gKwkJV0FSTighbm9kZS0+cGFyYW1zLnJlcXVlc3QtPmNh bmNlbGxlZCwKPiArCQnCoMKgwqDCoMKgIkNsZWFuaW5nIGFjdGl2ZSBub2RlOiAlZCFcbiIsIG5v ZGUtPnN0YXR1cyk7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWlmIChub2RlLT5wYXJhbXMu YmF0Y2hfb2JqKSB7Cj4gKwkJLyoKPiArCQnCoCogVGhlIGJhdGNoIGJ1ZmZlciBtdXN0IGJlIHVu cGlubmVkIGJlZm9yZSBpdCBpcyB1bnJlZmVyZW5jZWQKPiArCQnCoCogb3RoZXJ3aXNlIHRoZSB1 bnBpbiBmYWlscyB3aXRoIGEgbWlzc2luZyB2bWEhPwo+ICsJCcKgKi8KPiArCQlpZiAobm9kZS0+ cGFyYW1zLmRpc3BhdGNoX2ZsYWdzICYgSTkxNV9ESVNQQVRDSF9TRUNVUkUpCj4gKwkJCWk5MTVf Z2VtX2V4ZWNidWZmX3JlbGVhc2VfYmF0Y2hfb2JqKG5vZGUtPnBhcmFtcy5iYXRjaF9vYmopOwo+ ICsKClRoaXMgY29kZSBzZWVtcyBsaXR0bGUgYml0IG91dCBvZiBwbGFjZS4KCj4gKwkJbm9kZS0+ cGFyYW1zLmJhdGNoX29iaiA9IE5VTEw7Cj4gKwl9Cj4gKwo+ICsJLyogQW5kIGFueXRoaW5nIGVs c2Ugb3duZWQgYnkgdGhlIG5vZGU6ICovCj4gKwlpZiAobm9kZS0+cGFyYW1zLmNsaXByZWN0cykg ewo+ICsJCWtmcmVlKG5vZGUtPnBhcmFtcy5jbGlwcmVjdHMpOwo+ICsJCW5vZGUtPnBhcmFtcy5j bGlwcmVjdHMgPSBOVUxMOwo+ICsJfQo+ICt9Cj4gKwoKVGhlIGJlbG93IGZ1bmN0aW9uIGlzIHF1 aXRlIGhhY2t5LCBJIHVuZGVyc3Rvb2QgdGhpcyB3aWxsIGJlIG1pdGlnYXRlZApieSBwZXItY3R4 IHNlcXVlbmNlIG51bWJlcmluZyBpbiB0aGUgZnV0dXJlPwoKPiArc3RhdGljIGJvb2wgaTkxNV9z Y2hlZHVsZXJfcmVtb3ZlKHN0cnVjdCBpOTE1X3NjaGVkdWxlciAqc2NoZWR1bGVyLAo+ICsJCQkJ wqDCoHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCj4gKwkJCQnCoMKgc3RydWN0IGxpc3Rf aGVhZCAqcmVtb3ZlKQo+ICt7Cj4gKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkg Km5vZGUsICpub2RlX25leHQ7Cj4gKwlpbnQgZmx5aW5nID0gMCwgcXVldWVkID0gMDsKPiArCWJv b2wgZG9fc3VibWl0Owo+ICsJdWludDMyX3QgbWluX3NlcW5vOwo+ICsKPiArCXNwaW5fbG9ja19p cnEoJnNjaGVkdWxlci0+bG9jayk7Cj4gKwo+ICsJLyoKPiArCcKgKiBJbiB0aGUgY2FzZSB3aGVy ZSB0aGUgc3lzdGVtIGlzIGlkbGUsIHN0YXJ0aW5nICdtaW5fc2Vxbm8nIGZyb20gYSBiaWcKPiAr CcKgKiBudW1iZXIgd2lsbCBjYXVzZSBhbGwgbm9kZXMgdG8gYmUgcmVtb3ZlZCBhcyB0aGV5IGFy ZSBub3cgYmFjayB0bwo+ICsJwqAqIGJlaW5nIGluLW9yZGVyLiBIb3dldmVyLCB0aGlzIHdpbGwg YmUgYSBwcm9ibGVtIGlmIHRoZSBsYXN0IG9uZSB0bwo+ICsJwqAqIGNvbXBsZXRlIHdhcyBhY3R1 YWxseSBvdXQtb2Ytb3JkZXIgYXMgdGhlIHJpbmcgc2Vxbm8gdmFsdWUgd2lsbCBiZQo+ICsJwqAq IGxvd2VyIHRoYW4gb25lIG9yIG1vcmUgY29tcGxldGVkIGJ1ZmZlcnMuIFRodXMgY29kZSBsb29r aW5nIGZvciB0aGUKPiArCcKgKiBjb21wbGV0aW9uIG9mIHNhaWQgYnVmZmVycyB3aWxsIHdhaXQg Zm9yZXZlci4KPiArCcKgKiBJbnN0ZWFkLCB1c2UgdGhlIGhhcmR3YXJlIHNlcW5vIGFzIHRoZSBz dGFydGluZyBwb2ludC4gVGhpcyBtZWFucwo+ICsJwqAqIHRoYXQgc29tZSBidWZmZXJzIG1pZ2h0 IGJlIGtlcHQgYXJvdW5kIGV2ZW4gaW4gYSBjb21wbGV0ZWx5IGlkbGUKPiArCcKgKiBzeXN0ZW0g YnV0IGl0IHNob3VsZCBndWFyYW50ZWUgdGhhdCBuby1vbmUgZXZlciBnZXRzIGNvbmZ1c2VkIHdo ZW4KPiArCcKgKiB3YWl0aW5nIGZvciBidWZmZXIgY29tcGxldGlvbi4KPiArCcKgKi8KPiArCW1p bl9zZXFubyA9IHJpbmctPmdldF9zZXFubyhyaW5nLCB0cnVlKTsKPiArCj4gKwlsaXN0X2Zvcl9l YWNoX2VudHJ5KG5vZGUsICZzY2hlZHVsZXItPm5vZGVfcXVldWVbcmluZy0+aWRdLCBsaW5rKSB7 Cj4gKwkJaWYgKEk5MTVfU1FTX0lTX1FVRVVFRChub2RlKSkKPiArCQkJcXVldWVkKys7Cj4gKwkJ ZWxzZSBpZiAoSTkxNV9TUVNfSVNfRkxZSU5HKG5vZGUpKQo+ICsJCQlmbHlpbmcrKzsKPiArCQll bHNlIGlmIChJOTE1X1NRU19JU19DT01QTEVURShub2RlKSkKPiArCQkJY29udGludWU7Cj4gKwo+ ICsJCWlmIChub2RlLT5wYXJhbXMucmVxdWVzdC0+c2Vxbm8gPT0gMCkKPiArCQkJY29udGludWU7 Cj4gKwo+ICsJCWlmICghaTkxNV9zZXFub19wYXNzZWQobm9kZS0+cGFyYW1zLnJlcXVlc3QtPnNl cW5vLCBtaW5fc2Vxbm8pKQo+ICsJCQltaW5fc2Vxbm8gPSBub2RlLT5wYXJhbXMucmVxdWVzdC0+ c2Vxbm87Cj4gKwl9Cj4gKwo+ICsJSU5JVF9MSVNUX0hFQUQocmVtb3ZlKTsKPiArCWxpc3RfZm9y X2VhY2hfZW50cnlfc2FmZShub2RlLCBub2RlX25leHQsICZzY2hlZHVsZXItPm5vZGVfcXVldWVb cmluZy0+aWRdLCBsaW5rKSB7Cj4gKwkJLyoKPiArCQnCoCogT25seSByZW1vdmUgY29tcGxldGVk IG5vZGVzIHdoaWNoIGhhdmUgYSBsb3dlciBzZXFubyB0aGFuCj4gKwkJwqAqIGFsbCBwZW5kaW5n IG5vZGVzLiBXaGlsZSB0aGVyZSBpcyB0aGUgcG9zc2liaWxpdHkgb2YgdGhlCj4gKwkJwqAqIHJp bmcncyBzZXFubyBjb3VudGluZyBiYWNrd2FyZHMsIGFsbCBoaWdoZXIgYnVmZmVycyBtdXN0Cj4g KwkJwqAqIGJlIHJlbWVtYmVyZWQgc28gdGhhdCB0aGUgJ2k5MTVfc2Vxbm9fcGFzc2VkKCknIHRl c3QgY2FuCj4gKwkJwqAqIHJlcG9ydCB0aGF0IHRoZXkgaGF2ZSBpbiBmYWN0IHBhc3NlZC4KPiAr CQnCoCoKPiArCQnCoCogTkI6IFRoaXMgaXMgbm90IHRydWUgZm9yICdkZWFkJyBub2Rlcy4gVGhl IEdQVSByZXNldCBjYXVzZXMKPiArCQnCoCogdGhlIHNvZnR3YXJlIHNlcW5vIHRvIHJlc3RhcnQg ZnJvbSBpdHMgaW5pdGlhbCB2YWx1ZS4gVGh1cwo+ICsJCcKgKiB0aGUgZGVhZCBub2RlcyBtdXN0 IGJlIHJlbW92ZWQgZXZlbiB0aG91Z2ggdGhlaXIgc2Vxbm8gdmFsdWVzCj4gKwkJwqAqIGFyZSBw b3RlbnRpYWxseSB2YXN0bHkgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHJpbmcgc2Vxbm8uCj4g KwkJwqAqLwo+ICsJCWlmICghSTkxNV9TUVNfSVNfQ09NUExFVEUobm9kZSkpCj4gKwkJCWNvbnRp bnVlOwo+ICsKPiArCQlpZiAobm9kZS0+c3RhdHVzICE9IGk5MTVfc3FzX2RlYWQpIHsKPiArCQkJ aWYgKGk5MTVfc2Vxbm9fcGFzc2VkKG5vZGUtPnBhcmFtcy5yZXF1ZXN0LT5zZXFubywgbWluX3Nl cW5vKSAmJgo+ICsJCQnCoMKgwqDCoChub2RlLT5wYXJhbXMucmVxdWVzdC0+c2Vxbm8gIT0gbWlu X3NlcW5vKSkKPiArCQkJCWNvbnRpbnVlOwo+ICsJCX0KPiArCj4gKwkJbGlzdF9kZWwoJm5vZGUt PmxpbmspOwo+ICsJCWxpc3RfYWRkKCZub2RlLT5saW5rLCByZW1vdmUpOwo+ICsKPiArCQkvKiBT dHJpcCB0aGUgZGVwZW5kZW5jeSBpbmZvIHdoaWxlIHRoZSBtdXRleCBpcyBzdGlsbCBsb2NrZWQg Ki8KPiArCQlpOTE1X3NjaGVkdWxlcl9yZW1vdmVfZGVwZW5kZW50KHNjaGVkdWxlciwgbm9kZSk7 Cj4gKwo+ICsJCWNvbnRpbnVlOwo+ICsJfQo+ICsKPiArCS8qCj4gKwnCoCogUmVsZWFzZSB0aGUg aW50ZXJydXB0IHJlZmVyZW5jZSBjb3VudCBpZiB0aGVyZSBhcmUgbm8gbG9uZ2VyIGFueQo+ICsJ wqAqIG5vZGVzIHRvIHdvcnJ5IGFib3V0Lgo+ICsJwqAqLwo+ICsJaWYgKCFmbHlpbmcgJiYgIXF1 ZXVlZCAmJgo+ICsJwqDCoMKgwqAoc2NoZWR1bGVyLT5mbGFnc1tyaW5nLT5pZF0gJiBpOTE1X3Nm X2ludGVycnVwdHNfZW5hYmxlZCkpIHsKPiArCQlyaW5nLT5pcnFfcHV0KHJpbmcpOwo+ICsJCXNj aGVkdWxlci0+ZmxhZ3NbcmluZy0+aWRdICY9IH5pOTE1X3NmX2ludGVycnVwdHNfZW5hYmxlZDsK Ck1heWJlIGhhdmUgdGhpcyBwaWVjZSBvZiBjb2RlIGFzIGEgaGVscGVyPyBUbyBlbmFibGUgaW50 ZXJydXB0cyBhbmQKZGlzYWJsZSB0aGVtLCBtYXliZSBldmVuIGEgcmVmZXJlbmNlIGNvdW50PwoK PiArCX0KPiArCj4gKwkvKiBMYXVuY2ggbW9yZSBwYWNrZXRzIG5vdz8gKi8KPiArCWRvX3N1Ym1p dCA9IChxdWV1ZWQgPiAwKSAmJiAoZmx5aW5nIDwgc2NoZWR1bGVyLT5taW5fZmx5aW5nKTsKPiAr Cj4gKwlzcGluX3VubG9ja19pcnEoJnNjaGVkdWxlci0+bG9jayk7Cj4gKwo+ICsJcmV0dXJuIGRv X3N1Ym1pdDsKPiArfQo+ICsKPiArdm9pZCBpOTE1X3NjaGVkdWxlcl9wcm9jZXNzX3dvcmsoc3Ry dWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKPiArewo+ICsJc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKPiArCXN0cnVjdCBpOTE1X3Nj aGVkdWxlciAqc2NoZWR1bGVyID0gZGV2X3ByaXYtPnNjaGVkdWxlcjsKPiArCXN0cnVjdCBpOTE1 X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqbm9kZTsKPiArCWJvb2wgZG9fc3VibWl0Owo+ICsJc3Ry dWN0IGxpc3RfaGVhZCByZW1vdmU7Cj4gKwo+ICsJaWYgKGxpc3RfZW1wdHkoJnNjaGVkdWxlci0+ bm9kZV9xdWV1ZVtyaW5nLT5pZF0pKQo+ICsJCXJldHVybjsKPiArCj4gKwkvKiBSZW1vdmUgY29t cGxldGVkIG5vZGVzLiAqLwo+ICsJZG9fc3VibWl0ID0gaTkxNV9zY2hlZHVsZXJfcmVtb3ZlKHNj aGVkdWxlciwgcmluZywgJnJlbW92ZSk7Cj4gKwo+ICsJaWYgKCFkb19zdWJtaXQgJiYgbGlzdF9l bXB0eSgmcmVtb3ZlKSkKPiArCQlyZXR1cm47Cj4gKwo+ICsJLyogTmVlZCB0byBncmFiIHRoZSBw bSBsb2NrIG91dHNpZGUgb2YgdGhlIG11dGV4IGxvY2sgKi8KPiArCWlmIChkb19zdWJtaXQpCj4g KwkJaW50ZWxfcnVudGltZV9wbV9nZXQoZGV2X3ByaXYpOwo+ICsKPiArCW11dGV4X2xvY2soJnJp bmctPmRldi0+c3RydWN0X211dGV4KTsKPiArCj4gKwlpZiAoZG9fc3VibWl0KQo+ICsJCWk5MTVf c2NoZWR1bGVyX3N1Ym1pdChyaW5nKTsKPiArCj4gKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnJlbW92 ZSkpIHsKPiArCQlub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmcmVtb3ZlLCB0eXBlb2YoKm5vZGUp LCBsaW5rKTsKPiArCQlsaXN0X2RlbCgmbm9kZS0+bGluayk7Cj4gKwo+ICsJCS8qIEZyZWUgdXAg YWxsIHRoZSBEUk0gcmVmZXJlbmNlcyAqLwo+ICsJCWk5MTVfc2NoZWR1bGVyX2NsZWFuX25vZGUo bm9kZSk7Cj4gKwo+ICsJCS8qIEFuZCBhbnl0aGluZyBlbHNlIG93bmVkIGJ5IHRoZSBub2RlOiAq Lwo+ICsJCW5vZGUtPnBhcmFtcy5yZXF1ZXN0LT5zY2hlZHVsZXJfcWUgPSBOVUxMOwo+ICsJCWk5 MTVfZ2VtX3JlcXVlc3RfdW5yZWZlcmVuY2Uobm9kZS0+cGFyYW1zLnJlcXVlc3QpOwo+ICsJCWtm cmVlKG5vZGUtPmRlcF9saXN0KTsKPiArCQlrZnJlZShub2RlKTsKCk1heWJlIGhhdmUgYSBzZXBh cmF0ZSBoZWxwZXIgZm9yIGZyZWVpbmcgYSBub2RlLCB3b3VsZCBtYWtlIHRoaXMgbXVjaApjbGVh bmVyLgoKPiArCX0KPiArCj4gKwltdXRleF91bmxvY2soJnJpbmctPmRldi0+c3RydWN0X211dGV4 KTsKPiArCj4gKwlpZiAoZG9fc3VibWl0KQo+ICsJCWludGVsX3J1bnRpbWVfcG1fcHV0KGRldl9w cml2KTsKPiArfQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3NjaGVk dWxlci5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zY2hlZHVsZXIuaAo+IG5ldyBmaWxl IG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uNDE1ZmVjOAo+IC0tLSAvZGV2L251bGwKPiAr KysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3NjaGVkdWxlci5oCj4gQEAgLTAsMCArMSw5 NSBAQAo+ICsvKgo+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24KPiAr ICoKPiArICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRv IGFueSBwZXJzb24gb2J0YWluaW5nIGEKPiArICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBh c3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKPiArICogdG8g ZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhv dXQgbGltaXRhdGlvbgo+ICsgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJn ZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKPiArICogYW5kL29yIHNlbGwgY29w aWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4g KyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93 aW5nIGNvbmRpdGlvbnM6Cj4gKyAqCj4gKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFu ZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKPiArICogcGFyYWdy YXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRp b25zIG9mIHRoZQo+ICsgKiBTb2Z0d2FyZS4KPiArICoKPiArICogVEhFIFNPRlRXQVJFIElTIFBS T1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IK PiArICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElF UyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFIEFORCBOT05JTkZSSU5HRU1FTlQuwqDCoElOIE5PIEVWRU5UIFNIQUxMCj4gKyAqIFRIRSBB VVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1B R0VTIE9SIE9USEVSCj4gKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09O VFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCj4gKyAqIEZST00sIE9VVCBPRiBPUiBJ TiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElO R1MKPiArICogSU4gVEhFIFNPRlRXQVJFLgo+ICsgKgo+ICsgKi8KPiArCj4gKyNpZm5kZWYgX0k5 MTVfU0NIRURVTEVSX0hfCj4gKyNkZWZpbmUgX0k5MTVfU0NIRURVTEVSX0hfCj4gKwo+ICtlbnVt IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX3N0YXR1cyB7Cj4gKwkvKiBMaW1ibzogKi8KPiArCWk5MTVf c3FzX25vbmUgPSAwLAo+ICsJLyogTm90IHlldCBzdWJtaXR0ZWQgdG8gaGFyZHdhcmU6ICovCj4g KwlpOTE1X3Nxc19xdWV1ZWQsCj4gKwkvKiBQb3BwZWQgZnJvbSBxdWV1ZSwgcmVhZHkgdG8gZmx5 OiAqLwo+ICsJaTkxNV9zcXNfcG9wcGVkLAo+ICsJLyogU2VudCB0byBoYXJkd2FyZSBmb3IgcHJv Y2Vzc2luZzogKi8KPiArCWk5MTVfc3FzX2ZseWluZywKPiArCS8qIEZpbmlzaGVkIHByb2Nlc3Np bmcgb24gdGhlIGhhcmR3YXJlOiAqLwo+ICsJaTkxNV9zcXNfY29tcGxldGUsCj4gKwkvKiBLaWxs ZWQgYnkgd2F0Y2hkb2cgb3IgY2F0YXN0cm9waGljIHN1Ym1pc3Npb24gZmFpbHVyZTogKi8KPiAr CWk5MTVfc3FzX2RlYWQsCj4gKwkvKiBMaW1pdCB2YWx1ZSBmb3IgdXNlIHdpdGggYXJyYXlzL2xv b3BzICovCj4gKwlpOTE1X3Nxc19NQVgKPiArfTsKPiArCgpUbyB1cHBlcmNhc2UuCgo+ICsjZGVm aW5lIEk5MTVfU1FTX0lTX1FVRVVFRChub2RlKQkoKChub2RlKS0+c3RhdHVzID09IGk5MTVfc3Fz X3F1ZXVlZCkpCj4gKyNkZWZpbmUgSTkxNV9TUVNfSVNfRkxZSU5HKG5vZGUpCSgoKG5vZGUpLT5z dGF0dXMgPT0gaTkxNV9zcXNfZmx5aW5nKSkKPiArI2RlZmluZSBJOTE1X1NRU19JU19DT01QTEVU RShub2RlKQkoKChub2RlKS0+c3RhdHVzID09IGk5MTVfc3FzX2NvbXBsZXRlKSB8fCBcCj4gKwkJ CQkJwqAoKG5vZGUpLT5zdGF0dXMgPT0gaTkxNV9zcXNfZGVhZCkpCj4gKwo+ICtzdHJ1Y3QgaTkx NV9zY2hlZHVsZXJfb2JqX2VudHJ5IHsKPiArCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0wqDC oMKgwqDCoMKgwqDCoMKgwqAqb2JqOwo+ICsJYm9vbMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZWFkX29ubHk7Cj4gK307Cj4g Kwo+ICtzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgewo+ICsJc3RydWN0IGk5MTVf ZXhlY2J1ZmZlcl9wYXJhbXPCoMKgwqDCoMKgwqDCoHBhcmFtczsKPiArCS8qIC0xMDIzID0gbG93 ZXN0IHByaW9yaXR5LCAwID0gZGVmYXVsdCwgMTAyMyA9IGhpZ2hlc3QgKi8KPiArCWludDMyX3TC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg cHJpb3JpdHk7Cj4gKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfb2JqX2VudHJ5wqDCoMKgwqDCoCpz YXZlZF9vYmplY3RzOwo+ICsJaW50wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbnVtX29ianM7Cj4gKwlib29swqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJ1 bXBlZDsKPiArCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyecKgwqDCoCoqZGVwX2xp c3Q7Cj4gKwlpbnTCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBudW1fZGVwczsKPiArCWVudW0gaTkxNV9zY2hlZHVsZXJfcXVl dWVfc3RhdHVzwqDCoMKgwqBzdGF0dXM7Cj4gKwl1bnNpZ25lZCBsb25nwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0YW1wOwo+ICsJc3RydWN0IGxpc3RfaGVh ZMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsaW5rOwoKQWJvdmUgd2hp dGVzcGFjZSBpcyBzdGlsbCBpbmNvcnJlY3QgYW5kIEkgY291bGQgcmVhbGx5IHVzZSBjb21tZW50 cy4KCj4gK307Cj4gKwo+ICtzdHJ1Y3QgaTkxNV9zY2hlZHVsZXIgewo+ICsJc3RydWN0IGxpc3Rf aGVhZMKgwqDCoMKgbm9kZV9xdWV1ZVtJOTE1X05VTV9SSU5HU107Cj4gKwl1aW50MzJfdMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGZsYWdzW0k5MTVfTlVNX1JJTkdTXTsKPiArCXNwaW5sb2NrX3TC oMKgwqDCoMKgwqDCoMKgwqDCoGxvY2s7Cj4gKwo+ICsJLyogVHVuaW5nIHBhcmFtZXRlcnM6ICov Cj4gKwlpbnQzMl90wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwcmlvcml0eV9sZXZlbF9taW47 Cj4gKwlpbnQzMl90wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwcmlvcml0eV9sZXZlbF9tYXg7 Cj4gKwlpbnQzMl90wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwcmlvcml0eV9sZXZlbF9idW1w Owo+ICsJaW50MzJfdMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHJpb3JpdHlfbGV2ZWxfcHJl ZW1wdDsKPiArCXVpbnQzMl90wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbWluX2ZseWluZzsKPiAr fTsKPiArCj4gKy8qIEZsYWcgYml0cyBmb3IgaTkxNV9zY2hlZHVsZXI6OmZsYWdzICovCj4gK2Vu dW0gewo+ICsJaTkxNV9zZl9pbnRlcnJ1cHRzX2VuYWJsZWTCoMKgPSAoMSA8PCAwKSwKPiArCWk5 MTVfc2Zfc3VibWl0dGluZ8KgwqDCoMKgwqDCoMKgwqDCoMKgPSAoMSA8PCAxKSwKPiArfTsKClRo ZXNlIG11c3QgYmUgSTkxNV9VUFBFUkNBU0VfU09NRVRISU5HIGJ5IGNvbnZlbnRpb24uCgo+ICsK PiArYm9vbCBpOTE1X3NjaGVkdWxlcl9pc19lbmFibGVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYp Owo+ICtpbnQgaTkxNV9zY2hlZHVsZXJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKPiAr dm9pZCBpOTE1X3NjaGVkdWxlcl9jbGVhbl9ub2RlKHN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1 ZV9lbnRyeSAqbm9kZSk7Cj4gK2ludCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9leGVjYnVmZmVyKHN0 cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqcWUpOwo+ICtib29sIGk5MTVfc2NoZWR1 bGVyX25vdGlmeV9yZXF1ZXN0KHN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxKTsKPiAr dm9pZCBpOTE1X3NjaGVkdWxlcl93YWtldXAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cj4gKwo+ ICsjZW5kaWbCoMKgLyogX0k5MTVfU0NIRURVTEVSX0hfICovCi0tIApKb29uYXMgTGFodGluZW4K T3BlbiBTb3VyY2UgVGVjaG5vbG9neSBDZW50ZXIKSW50ZWwgQ29ycG9yYXRpb24KX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcg bGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRl c2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==