From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yi Sun Subject: Re: [PATCH 1/3] x86: refactor psr implementation in hypervisor. Date: Wed, 7 Sep 2016 15:12:11 +0800 Message-ID: <20160907071211.GC30513@yi.y.sun> References: <1472102537-7155-1-git-send-email-yi.y.sun@linux.intel.com> <57CE8EF0020000780010BEE5@prv-mh.provo.novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bhX5Z-0002pn-4d for xen-devel@lists.xenproject.org; Wed, 07 Sep 2016 07:16:05 +0000 Content-Disposition: inline In-Reply-To: <57CE8EF0020000780010BEE5@prv-mh.provo.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Jan Beulich Cc: wei.liu2@citrix.com, he.chen@linux.intel.com, andrew.cooper3@citrix.com, ian.jackson@eu.citrix.com, chao.p.peng@linux.intel.com, xen-devel@lists.xenproject.org List-Id: xen-devel@lists.xenproject.org SGksIEphbiwKClRoYW5rIHlvdSB2ZXJ5IG11Y2ggZm9yIHJldmlld2luZyBteSBwYXRjaGVzIGlu IGRldGFpbHMhIFBsZWFzZQpjaGVjayBteSBjb21tZW50cyBiZWxvdy4KCk9uIDE2LTA5LTA2IDAx OjQwOjAwLCBKYW4gQmV1bGljaCB3cm90ZToKPiA+Pj4gT24gMjUuMDguMTYgYXQgMDc6MjIsIDx5 aS55LnN1bkBsaW51eC5pbnRlbC5jb20+IHdyb3RlOgo+ID4gLS0tIGEveGVuL2FyY2gveDg2L3Bz ci5jCj4gPiArKysgYi94ZW4vYXJjaC94ODYvcHNyLmMKPiA+IEBAIC0yMywyMiArMjMsMTE2IEBA Cj4gPiAgI2RlZmluZSBQU1JfQ0FUICAgICAgICAoMTw8MSkKPiA+ICAjZGVmaW5lIFBTUl9DRFAg ICAgICAgICgxPDwyKQo+ID4gIAo+ID4gLXN0cnVjdCBwc3JfY2F0X2NibSB7Cj4gPiAtICAgIHVu aW9uIHsKPiA+IC0gICAgICAgIHVpbnQ2NF90IGNibTsKPiA+IC0gICAgICAgIHN0cnVjdCB7Cj4g PiAtICAgICAgICAgICAgdWludDY0X3QgY29kZTsKPiA+IC0gICAgICAgICAgICB1aW50NjRfdCBk YXRhOwo+ID4gLSAgICAgICAgfTsKPiA+IC0gICAgfTsKPiA+ICsvKgo+ID4gKyAqIFRvIGFkZCBh IG5ldyBQU1IgZmVhdHVyZSwgcGxlYXNlIGZvbGxvdyBiZWxvdyBzdGVwczoKPiA+ICsgKiAxLiBJ bXBsZW1lbnQgZmVhdHVyZSBzcGVjaWZpYyBjYWxsYmFjayBmdW5jdGlvbnMgbGlzdGVkIGluCj4g PiArICogICAgInN0cnVjdCBmZWF0X29wcyI7Cj4gPiArICogMi4gSW1wbGVtZW50IGEgZmVhdHVy ZSBzcGVjaWZpYyAic3RydWN0IGZlYXRfb3BzIiBvYmplY3QgYW5kIHJlZ2lzdGVyCj4gPiArICog ICAgZmVhdHVyZSBzcGVjaWZpYyBjYWxsYmFjayBmdW5jdGlvbnMgaW50byBpdDsKPiA+ICsgKiAz LiBEZWxjYXJlIGZlYXRfbGlzdCBvYmplY3QgZm9yIHRoZSBmZWF0dXJlIGFuZCBtYWxsb2MgbWVt b3J5IGZvciBpdAo+ID4gKyAqICAgIGluIGludGVybmFsX2NwdV9wcmVwYXJlKCkuIENvcnJlc3Bv bmRpbmdseSwgZnJlZSB0aGVtIGluCj4gPiArICogICAgZnJlZV9mZWF0dXJlKCk7Cj4gPiArICog NC4gQWRkIGZlYXR1cmUgaW5pdGlhbGl6YXRpb24gY29kZXMgaW4gaW50ZXJuYWxfY3B1X2luaXQo KS4KPiA+ICsgKi8KPiA+ICsKPiA+ICtzdHJ1Y3QgZmVhdF9saXN0Owo+ID4gK3N0cnVjdCBwc3Jf c29ja2V0X2FsbG9jX2luZm87Cj4gPiArCj4gPiArLyogRXZlcnkgZmVhdHVyZSBlbmFibGVkIHNo b3VsZCBpbXBsZW1lbnQgc3VjaCBvcHMgYW5kIGNhbGxiYWNrIGZ1bmN0aW9ucy4gKi8KPiA+ICtz dHJ1Y3QgZmVhdF9vcHMgewo+ID4gKyAgICAvKgo+ID4gKyAgICAgKiBpbml0X2ZlYXR1cmUgaXMg dXNlZCBpbiBjcHUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyB0byBkbyBmZWF0dXJlCj4gPiArICAg ICAqIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIHdvcmtzLgo+ID4gKyAgICAgKi8KPiA+ICsgICAg dm9pZCAoKmluaXRfZmVhdHVyZSkodW5zaWduZWQgaW50IGVheCwgdW5zaWduZWQgaW50IGVieCwK PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGVjeCwgdW5zaWduZWQg aW50IGVkeCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZlYXRfbGlzdCAq cEZlYXQsCj4gCj4gSGVyZSBhbmQgYmVsb3cgLSB3ZSBkb24ndCBub3JtYWxseSB1c2UgaWRlbnRp ZmllcnMgd2l0aCBjYXBpdGFsIGxldHRlcnMKPiBpbiB0aGUgbWlkZGxlLgo+IApUaGFua3MhIEkg d2lsbCBmaXggaXQuCgo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHNyX3Nv Y2tldF9hbGxvY19pbmZvICppbmZvKTsKPiA+ICsgICAgLyoKPiA+ICsgICAgICogZ2V0X29sZF9z ZXRfbmV3IGlzIHVzZWQgaW4gc2V0IHZhbHVlIHByb2Nlc3MgdG8gZ2V0IGFsbCBmZWF0dXJlcycK PiA+ICsgICAgICogQ09TIHJlZ2lzdGVycyB2YWx1ZXMgYWNjb3JkaW5nIHRvIG9yaWdpbmFsIGNv cyBpZCBvZiB0aGUgZG9tYWluLgo+ID4gKyAgICAgKiBUaGVuLCBhc3NlbWJsZSB0aGVtIGludG8g YW4gbWFzayBhcnJheSBhcyBmZWF0dXJlIGxpc3Qgb3JkZXIuCj4gCj4gVGhpcyBzZW50ZW5jZSBp biBwYXJ0aWN1bGFyIGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UgdG8gbWUuIFdoYXQKPiBmb2xsb3dz IGJlbG93IGFsc28gbG9va3MgbGlrZSBpdCBpcyBpbiBuZWVkIG9mIGltcHJvdmVtZW50Lgo+IApE byB5b3UgbWVhbiB0aGUgY29tbWVudHMgYXJlIG5vdCBhY2N1cmF0ZT8gSG93IGFib3V0IGJlbG93 IGRlc2NyaXB0aW9uPwoKZ2V0X29sZF9zZXRfbmV3IHdpbGwgdHJhdmVyc2UgYWxsIGZlYXR1cmVz IGluIGxpc3QuIEl0IGlzIHVzZWQgdG8gZG8gYmVsb3cgdHdvCnRoaW5nczoKMS4gZ2V0IG9sZF9j b3MgcmVnaXN0ZXIgdmFsdWUgb2YgYWxsIHN1cHBvcnRlZCBmZWF0dXJlcyBhbmQKMi4gc2V0IHRo ZSBuZXcgdmFsdWUgZm9yIGFwcG9pbnRlZCBmZWF0dXJlLgoKQWxsIHRoZSB2YWx1ZXMgYXJlIHNl dCBpbnRvIG1hc2sgYXJyYXkgYWNjb3JkaW5nIHRoZSB0cmF2ZXJzYWwgb3JkZXIsIG1lYW5pbmcK dGhlIHNhbWUgb3JkZXIgb2YgZmVhdHVyZSBsaXN0IG1lbWJlcnMuCgpGb3IgZXhhbXBsZSwgb2xk X2NvcyBvZiB0aGUgZG9tYWluIGlzIDEuIFVzZXIgd2FudHMgdG8gc2V0IEwzIENBVCBDQk0gdG8g MHgxZmYuClRoZSBvcmlnaW5hbCBDT1MgcmVnaXN0ZXJzIGxpa2UgYmVsb3cuCgogICAgICAgIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgfCBDT1MgMCB8IENPUyAxIHwgLi4uIHwKICAg ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpMMyBDQVQgIHwgMHg3ZmYgfCAweDNmZiB8IC4u LiB8CiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KTDIgQ0FUICB8IDB4ZmYgIHwgMHgz ZiAgfCAuLi4gfAogICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGVuLCBtYXNrIGFy cmF5IHNob3VsZCBiZToKbWFza1swXTogMHgxZmYKbWFza1sxXTogMHgzZgoKVGhlbiwgd2UgY2Fu IHVzZSB0aGlzIG1hc2sgYXJyYXkgdG8gZmluZCBpZiB0aGVyZSBpcyBtYXRjaGluZyBDT1MgdGhy b3VnaApjb21wYXJlX21hc2soKS4KCj4gPiArICAgICAqIFRoZW4sIHNldCB0aGUgbmV3IGZlYXR1 cmUgdmFsdWUgaW50byBmZWF0dXJlIGNvcnJlc3BvbmRpbmcgcG9zaXRpb24KPiA+ICsgICAgICog aW4gdGhlIGFycmF5LiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGFpciB3aXRoIGNvbXBhcmVf bWFzay4KPiA+ICsgICAgICovCj4gPiArICAgIGludCAoKmdldF9vbGRfc2V0X25ldykodWludDY0 X3QgKm1hc2ssCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZlYXRfbGlz dCAqcEZlYXQsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9s ZF9jb3MsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBtYXNrX3R5cGUgdHlw ZSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBtKTsKPiA+ICsgICAg LyoKPiA+ICsgICAgICogY29tcGFyZV9tYXNrIGlzIHVzZWQgdG8gaW4gc2V0IHZhbHVlIHByb2Nl c3MgdG8gY29tcGFyZSBpZiB0aGUKPiA+ICsgICAgICogaW5wdXQgbWFzayBhcnJheSBjYW4gbWF0 Y2ggYWxsIHRoZSBmZWF0dXJlcycgQ09TIHJlZ2lzdGVycyB2YWx1ZXMKPiA+ICsgICAgICogYWNj b3JkaW5nIHRvIGlucHV0IGNvcyBpZC4KPiA+ICsgICAgICovCj4gPiArICAgIGludCAoKmNvbXBh cmVfbWFzaykodWludDY0X3QgKm1hc2ssIHN0cnVjdCBmZWF0X2xpc3QgKnBGZWF0LAo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb3MsIGJvb2xfdCAqZm91bmQpOwo+ IAo+IEZvciBhICJjb21wYXJlIiBmdW5jdGlvbiBJJ2QgZXhwZWN0IGEgd29yZCBvbiB0aGUgbWVh bmluZyBvZiB0aGUKPiByZXR1cm4gdmFsdWUsIGFuZCBJJ2QgZXhwZWN0IG1vc3QgaWYgbm90IGFs bCBwb2ludGVyIHBhcmFtZXRlcnMgdG8KPiBiZSBwb2ludGVycyB0byBjb25zdC4KPgpUaGFua3Mh IEkgd2lsbCBleHBsYWluIHRoZSByZXR1cm4gdmFsdWUuCiAKPiBBbHNvIHBsYWluIGJvb2wgcGxl YXNlLgo+IApUaGFua3MhIEkgd2lsbCBmaXggaXQuCgo+ID4gKyAgICAvKgo+ID4gKyAgICAgKiBn ZXRfY29zX21heF9hc190eXBlIGlzIHVzZWQgdG8gZ2V0IHRoZSBjb3NfbWF4IHZhbHVlIG9mIHRo ZSBmZWF0dXJlCj4gPiArICAgICAqIGFjY29yZGluZyB0byBpbnB1dCBtYXNrX3R5cGUuCj4gPiAr ICAgICAqLwo+ID4gKyAgICB1bnNpZ25lZCBpbnQgKCpnZXRfY29zX21heF9hc190eXBlKShzdHJ1 Y3QgZmVhdF9saXN0ICpwRmVhdCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZW51bSBtYXNrX3R5cGUgdHlwZSk7Cj4gCj4gRFlNIG1lYW4gImdldF9jb3NfbWF4 X2Zyb21fdHlwZSgpIj8KPiAKWWVzLCBjb3JyZWN0LiBJIHdpbGwgcmV2aXNlIHRoZSBmdW5jdGlv biBuYW1lLgoKPiA+ICsgICAgLyoKPiA+ICsgICAgICogZXhjZWVkX3JhbmdlIGlzIHVzZWQgdG8g Y2hlY2sgaWYgdGhlIGlucHV0IGNvcyBpZCBleGNlZWRzIHRoZQo+ID4gKyAgICAgKiBmZWF0dXJl J3MgY29zX21heCBhbmQgaWYgdGhlIGlucHV0IG1hc2sgdmFsdWUgaXMgbm90IHRoZSBkZWZhdWx0 IG9uZS4KPiA+ICsgICAgICogRXZlbiBpZiB0aGUgYXNzb2NpYXRlZCBjb3MgZXhjZWVkcyB0aGUg Y29zX21heCwgSFcgY2FuIHdvcmsgYXMgZGVmYXVsdAo+ID4gKyAgICAgKiB2YWx1ZS4gVGhhdCBp cyB0aGUgcmVhc29uIHdlIG5lZWQgY2hlY2sgaXMgbWFzayB2YWx1ZSBpcyBkZWZhdWx0IG9uZS4K PiA+ICsgICAgICogSWYgYm90aCBjcml0ZXJpYSBhcmUgZnVsZmlsbGVkLCB0aGF0IG1lYW5zIHRo ZSBpbnB1dCBleGNlZWRzIHRoZQo+ID4gKyAgICAgKiByYW5nZS4KPiA+ICsgICAgICovCj4gPiAr ICAgIHVuc2lnbmVkIGludCAoKmV4Y2VlZF9yYW5nZSkodWludDY0X3QgKm1hc2ssIHN0cnVjdCBm ZWF0X2xpc3QgKnBGZWF0LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVu c2lnbmVkIGludCBjb3MpOwo+IAo+IEFjY29yZGluZyB0byB0aGUgY29tbWVudCB0aGlzIGlzIGtp bmQgb2YgYSBwcmVkaWNhdGUsIHdoaWNoIHNlZW1zCj4gdW5saWtlbHkgdG8gcmV0dXJuIGFuIHVu c2lnbmVkIHZhbHVlLiBJbiBmYWN0IHdpdGhvdXQgYSB3b3JkIG9uIHRoZQo+IHJldHVybiB2YWx1 ZSBJJ2QgZXhwZWN0IHN1Y2ggdG8gcmV0dXJuIGJvb2wuIEFuZCBJJ2QgYWxzbyBleHBlY3QgdGhl Cj4gbmFtZSB0byByZWZsZWN0IHRoZSBwdXJwb3NlLCBpLmUuICJleGNlZWRzX25hbWUoKSIuIFBs dXMganVzdCBsaWtlCj4gZm9yIGNvbXBhcmUgYWJvdmUgSSB3b25kZXIgd2hldGhlciBjb21lIG9y IGFsbCBvZiB0aGUgcGFyYW1ldGVycwo+IHNob3VsZCBiZSBwb2ludGVycyB0byBjb25zdCAocGxl YXNlIGdvIG92ZXIgdGhlIGVudGlyZSBwYXRjaCBhbmQgZG8KPiBjb25zdGlmaWNhdGlvbiB3aGVy ZXZlciBwb3NzaWJsZS9zZW5zaWJsZSkuCj4gClllcywgeW91IGFyZSByaWdodC4gSSB3aWxsIGNo YW5nZSB0aGUgZnVuY3Rpb24gdHlwZSB0byBib29sIGFuZCBhZGQgY29uc3QKZm9yIG5vdCBjaGFu Z2VkIGlucHV0IHBvaW50ZXJzLgoKVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNoZWNrIGlmIHRo ZSBpbnB1dCBjb3MgaWQgZXhjZWVkcyB0aGUgY29zX21heC4gSWYgeWVzCmFuZCB0aGUgc2V0IHZh bHVlIGlzIG5vdCBkZWZhdWx0IHZhbHVlLCB3ZSBzaG91bGQgcmV0dXJuIGVycm9yLiBTbywgSSB0 aGluawp0byBjaGFuZ2UgdGhlIGZ1bmN0aW9uIG5hbWUgdG8gZXhjZWVkX2Nvc19tYXgoKS4gSG93 IGRvIHlvdSB0aGluaz8KCj4gPiArICAgIC8qCj4gPiArICAgICAqIHdyaXRlX21zciBpcyB1c2Vk IHRvIHdyaXRlIGZlYXR1cmUgc3BlY2lmaWMgTVNSIHJlZ2lzdGVycy4KPiA+ICsgICAgICovCj4g Cj4gVGhpcyBpcyBhIHNpbmdsZSBsaW5lIGNvbW1lbnQuCj4gClllcywgd2lsbCBjaGFuZ2UgdGhl IGZvcm1hdC4gVGhhbmtzIQoKPiA+ICsgICAgaW50ICgqd3JpdGVfbXNyKSh1bnNpZ25lZCBpbnQg Y29zLCB1aW50NjRfdCAqbWFzaywKPiA+ICsgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmVh dF9saXN0ICpwRmVhdCk7Cj4gCj4gU3VjaCB3cml0ZSBvcGVyYXRpb25zIGRvbid0IG5vcm1hbGx5 IGFsdGVyIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuLgo+IElmIHRoYXQncyBkaWZmZXJlbnQgaGVy ZSwgdGhhdCdzIHBlcmhhcHMgd29ydGggYSB3b3JkIGluIHRoZSBjb21tZW50Lgo+IElmIGl0IGlz bid0LCB0aGVuIEkgZG9uJ3Qgc2VlIHdoeSB0aGUgYWRkcmVzcyBvZiB0aGUgdmFsdWUgZ2V0cyBw YXNzZWQKPiBpbnN0ZWFkIG9mIHRoZSB2YWx1ZSBpdHNlbGYuCj4gCj4gT2gsIGhhdmluZyBnb25l IGZ1cnRoZXIgaW4gdGhlIHBhdGNoIEkgc2VlIHRoaXMgaXMgdG8gdXBkYXRlIG11bHRpcGxlCj4g TVNScy4gSSBndWVzcyB0aGlzIHdvdWxkIGJlc3QgYmUgcmVmbGVjdGVkIGJ5IG1ha2luZyB0aGUg cGFyYW1ldGVyCj4gY29uc3QgdWludDY0X3QgbWFza3NbXSAoYWxiZWl0IGl0J3MgYWxzbyBub3Qg Y2xlYXIgdG8gbWUgd2h5IHRoaXMKPiBuZWNlc3NhcmlseSBoYXZlIHRvIGJlIG1hc2tzIGtpbmQg aXRlbXMsIGFuZCBub3QganVzdCBhcmJpdHJhcnkKPiB2YWx1ZXMgLSBwcm9wZXIgY2hvaWNlIG9m IHZhcmlhYmxlIGFuZCBwYXJhbWV0ZXIgbmFtZXMgaGVscHMgdGhlCj4gdW5kZXJzdGFuZGluZyku Cj4gClRoYW5rcyBmb3IgeW91ciBzdWdnZXN0aW9uISBXaWxsIGNoYW5nZSBpdCB0byB1aW50NjRf dCB2YWxbXS4KCj4gPiArI2RlZmluZSBNQVhfRkVBVF9JTkZPX1NJWkUgOAo+ID4gKyNkZWZpbmUg TUFYX0NPU19SRUdfTlVNICAxMjgKPiAKPiBBcmUgdGhlc2UgbnVtYmVycyBhcmJpdHJhcnksIG9y IGJhc2VkIG9uIHNvbWV0aGluZz8KPiAKTUFYX0ZFQVRfSU5GT19TSVpFIGlzIGdvdCBmcm9tIHRo ZSBzaXplb2Yoc3RydWN0IHBzcl9jYXRfbHZsX2luZm8pIGFuZApjb25zaWRlciB0aGUgZXh0ZW5z aW9uIGZvciBmdXR1cmUgZmVhdHVyZS4KCk1BWF9DT1NfUkVHX05VTSBpcyBnb3QgZnJvbSBzcGVj IHRoYXQgdGhlIG1heCBDT1MgcmVnaXN0ZXJzIG51bWJlciBpcyAxMjgKZm9yIGFsbCBQU1IgZmVh dHVyZXMgc28gZmFyLgoKPiA+ICtzdHJ1Y3QgcHNyX3NvY2tldF9hbGxvY19pbmZvIHsKPiAKPiBJ J3ZlIHlldCB0byBzZWUgd2hldGhlciB0aGUgImFsbG9jIiBpbiB0aGUgbmFtZSByZWFsbHkgbWFr ZXMgc2Vuc2UuCj4KVGhhbmtzISBXaWxsIGNoYW5nZSBpdC4KIAo+ID4gQEAgLTU4LDggKzE1MCw0 MjcgQEAgc3RhdGljIHVuc2lnbmVkIGludCBfX3JlYWRfbW9zdGx5IG9wdF9jb3NfbWF4ID0gMjU1 Owo+ID4gIHN0YXRpYyB1aW50NjRfdCBybWlkX21hc2s7Cj4gPiAgc3RhdGljIERFRklORV9QRVJf Q1BVKHN0cnVjdCBwc3JfYXNzb2MsIHBzcl9hc3NvYyk7Cj4gPiAgCj4gPiAtc3RhdGljIHN0cnVj dCBwc3JfY2F0X2NibSAqdGVtcF9jb3NfdG9fY2JtOwo+ID4gK3N0YXRpYyBzdHJ1Y3QgcHNyX3Jl ZiAqdGVtcF9jb3NfcmVmOwo+ID4gKy8qIEV2ZXJ5IGZlYXR1cmUgaGFzIGl0cyBvd24gb2JqZWN0 LiAqLwo+ID4gK3N0cnVjdCBmZWF0X2xpc3QgKnBMM0NBVDsKPiAKPiBzdGF0aWMuIEFuZCBhIGJl dHRlciBuYW1lIHBsZWFzZSwgbW9yZSBpbiBsaW5lIHdpdGggdGhlIG90aGVyIHZhcmlhYmxlCj4g b3Igc2ltaWxhciBwdXJwb3NlLgo+IApUaGFua3MhIFdpbGwgbW9kaWZ5IGl0LgoKPiA+ICsvKiBD b21tb24gZnVuY3Rpb25zIGZvciBzdXBwb3J0aW5nIGZlYXR1cmUgY2FsbGJhY2sgZnVuY3Rpb25z LiAqLwo+ID4gK3N0YXRpYyB2b2lkIGFkZF9mZWF0dXJlKHN0cnVjdCBmZWF0X2xpc3QgKnBIZWFk LCBzdHJ1Y3QgZmVhdF9saXN0ICpwVG1wKQo+ID4gK3sKPiA+ICsgICAgaWYgKCBOVUxMID09IHBI ZWFkIHx8IE5VTEwgPT0gcFRtcCApCj4gPiArICAgICAgICByZXR1cm47Cj4gPiArCj4gPiArICAg IHdoaWxlICggcEhlYWQtPnBOZXh0ICkKPiA+ICsgICAgICAgIHBIZWFkID0gcEhlYWQtPnBOZXh0 Owo+ID4gKwo+ID4gKyAgICBwSGVhZC0+cE5leHQgPSBwVG1wOwo+ID4gK30KPiAKPiBEbyB5b3Ug cmVhbGx5IG5lZWQgY3VzdG9tIGxpc3QgbWFuYWdlbWVudCBoZXJlPwo+IApJdCBzZWVtcyB4ZW4g bGlzdCBpbnRlcmZhY2VzIHJlcXVpcmUgdGhlIGlucHV0IGxpc3QgYmUgYSBkb3VibGUgbGlua2Vk IGxpc3QgYnV0Cm15IGxpc3QgaXMgYSBzaW5nbGUgbGlua2VkIGxpc3QuIEZ1cnRoZXJtb3JlLCBJ IG9ubHkgbmVlZCBzaW1wbGUgYWRkIHRvIHRhaWwKZnVuY3Rpb24gYW5kIGZyZWUgZnVuY3Rpb24u IFNvIEkgY3JlYXRlIGN1c3RvbSBsaXN0IG1hbmFnZW1lbnQgZnVuY3Rpb25zLgoKPiA+ICtzdGF0 aWMgdm9pZCBmcmVlX2ZlYXR1cmUoc3RydWN0IHBzcl9zb2NrZXRfYWxsb2NfaW5mbyAqaW5mbykK PiA+ICt7Cj4gPiArICAgIHN0cnVjdCBmZWF0X2xpc3QgKnBUbXA7Cj4gPiArICAgIHN0cnVjdCBm ZWF0X2xpc3QgKnBQcmV2Owo+ID4gKwo+ID4gKyAgICBpZiAoIE5VTEwgPT0gaW5mbyApCj4gPiAr ICAgICAgICByZXR1cm47Cj4gPiArCj4gPiArICAgIGlmICggTlVMTCA9PSBpbmZvLT5wRmVhdCAp Cj4gPiArICAgICAgICByZXR1cm47Cj4gPiArCj4gPiArICAgIHBUbXAgPSBpbmZvLT5wRmVhdC0+ cE5leHQ7Cj4gPiArICAgIHdoaWxlICggcFRtcCApCj4gPiArICAgIHsKPiA+ICsgICAgICAgIHBQ cmV2ID0gcFRtcDsKPiA+ICsgICAgICAgIHBUbXAgPSBwVG1wLT5wTmV4dDsKPiA+ICsgICAgICAg IGNsZWFyX2JpdChwUHJldi0+ZmVhdHVyZSwgJihpbmZvLT5mZWF0dXJlcykpOwo+ID4gKyAgICAg ICAgeGZyZWUocFByZXYpOwo+ID4gKyAgICAgICAgcFByZXYgPSBOVUxMOwo+ID4gKyAgICB9Cj4g PiArfQo+IAo+IFdoeSBkb2VzIGluZm8tPnBGZWF0IG5vdCBnZXQgZnJlZWQgaGVyZT8KPiAKVGhl IGluZm8tPnBGZWF0IGlzIGEgcmVkdW5kYW50IGxpc3QgaGVhZCB0byBmYWNpbGl0YXRlIGxpc3Qg b3BlcmF0aW9ucy4KSXQgaXMgb25seSBmcmVlZCB3aGVuIHNvY2tldCBpbmZvIGlzIGZyZWVkLgoK V2l0aCB0aGlzIGxpc3QgaGVhZCwgdGhlIGFkdmFudGFnZSBpcyB0aGF0IHdlIGNhbiBpbnNlcnQv ZGVsZXRlIHRoZSBmaXJzdAplbGVtZW50IHNhbWUgYXMgb3RoZXJzIHdpdGhvdXQgc3BlY2lhbCBv cGVyYXRpb25zLgoKPiA+ICtzdGF0aWMgdm9pZCBsM19jYXRfaW5pdF9mZWF0dXJlKHVuc2lnbmVk IGludCBlYXgsIHVuc2lnbmVkIGludCBlYngsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB1bnNpZ25lZCBpbnQgZWN4LCB1bnNpZ25lZCBpbnQgZWR4LAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZlYXRfbGlzdCAqcEZlYXQsCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHNyX3NvY2tldF9hbGxvY19pbmZv ICppbmZvKQo+ID4gK3sKPiA+ICsgICAgc3RydWN0IHBzcl9jYXRfbHZsX2luZm8gbDNfY2F0Owo+ ID4gKyAgICB1bnNpZ25lZCBpbnQgc29ja2V0Owo+ID4gKyAgICB1aW50NjRfdCB2YWw7Cj4gPiAr Cj4gPiArICAgIGlmICggTUFYX0ZFQVRfSU5GT19TSVpFIDwgc2l6ZW9mKHN0cnVjdCBwc3JfY2F0 X2x2bF9pbmZvKSApCj4gPiArICAgICAgICByZXR1cm47Cj4gCj4gRFlNIEJVSUxEX0JVR19PTigp PyBBbHNvIHRoZSBNQVhfRkVBVF9JTkZPX1NJWkUgZGltZW5zaW9uZWQKPiBhcnJheSBpcyBvbmUg d2l0aCB1bnNpZ25lZCBpbnQgYXMgdGhlIGJhc2UgdHlwZSwgd2hpY2ggZG9lc24ndCBnZXQKPiBy ZWZsZWN0ZWQgaGVyZS4KPiAKSSB3aWxsIHVzZSBCVUlMRF9CVUdfT04oKSBmb3IgdGhlIGVycm9y IGNhc2UuCgpBcyBteSBleHBsYW5hdGlvbiBmb3IgTUFYX0ZFQVRfSU5GT19TSVpFIGFib3ZlLCBp dCByZWZsZWN0cyBhIHNpemUgbW9yZQp0aGFuIHN0cnVjdCBwc3JfY2F0X2x2bF9pbmZvLiBTbywg aWYgTUFYX0ZFQVRfSU5GT19TSVpFIGlzIGJpZ2dlciB0aGFuIHRoZQpzaXplb2Yoc3RydWN0IHBz cl9jYXRfbHZsX2luZm8pLCB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgb24gZmVhdF9pbmZvW10K c2hvdWxkIGJlIGdvb2QuCgo+ID4gKyAgICAvKiBObyB2YWxpZCB2YWx1ZSBzbyBkbyBub3QgZW5h YmxlIGZlYXR1cmUuICovCj4gPiArICAgIGlmICggMCA9PSBlYXggfHwgMCA9PSBlZHggKQo+ID4g KyAgICAgICAgcmV0dXJuOwo+ID4gKwo+ID4gKyAgICBsM19jYXQuY2JtX2xlbiA9IChlYXggJiAw eDFmKSArIDE7Cj4gPiArICAgIGwzX2NhdC5jb3NfbWF4ID0gbWluKG9wdF9jb3NfbWF4LCBlZHgg JiAweGZmZmYpOwo+ID4gIAo+ID4gKyAgICAvKiBjb3M9MCBpcyByZXNlcnZlZCBhcyBkZWZhdWx0 IGNibShhbGwgb25lcykuICovCj4gPiArICAgIHBGZWF0LT5jb3NfcmVnX3ZhbFswXSA9ICgxdWxs IDw8IGwzX2NhdC5jYm1fbGVuKSAtIDE7Cj4gPiArCj4gPiArICAgIHBGZWF0LT5mZWF0dXJlID0g UFNSX1NPQ0tFVF9MM19DQVQ7Cj4gPiArICAgIHNldF9iaXQoUFNSX1NPQ0tFVF9MM19DQVQsICYo aW5mby0+ZmVhdHVyZXMpKTsKPiAKPiBEb2VzIHRoaXMgbmVlZCB0byBiZSBzZXRfYml0KCksIG9y IHdvdWxkIF9fc2V0X2JpdCgpIHN1ZmZpY2U/IEFsc28KPiB0aGVyZSBhcmUgbWFueSBjYXNlcyBv ZiB0aGlzIHN0cmFuZ2UgJigpIGNvbnN0cnVjdCAtIHRoZQo+IHBhcmVudGhlc2VzIGFyZSBwb2lu dGxlc3MgdGhlcmUuCj4gClRoaXMgaXMgaW5oZXJpdGVkIGZyb20gb3JpZ2luYWwgY29kZXMuIEFm dGVyIGNoZWNraW5nIGNvZGVzLCBJIHRoaW5rIHRoaXMgY2FuCmJlIHJlcGxhY2VkIGJ5IG5vbi1h dG9taWMgb3BlcmF0aW9uIF9fc2V0X2JpdCgpLiBUaGFua3MhCgpXaWxsIHJlbW92ZSB1bm5lY2Vz c2FyeSBwYXJlbnRoZXNlcy4KCj4gPiArICAgIGlmICggKGVjeCAmIFBTUl9DQVRfQ0RQX0NBUEFC SUxJVFkpICYmIChvcHRfcHNyICYgUFNSX0NEUCkgJiYKPiA+ICsgICAgICAgICAhdGVzdF9iaXQo UFNSX1NPQ0tFVF9MM19DRFAsICYoaW5mby0+ZmVhdHVyZXMpKSApCj4gPiArICAgIHsKPiA+ICsg ICAgICAgIC8qIERhdGEgKi8KPiA+ICsgICAgICAgIHBGZWF0LT5jb3NfcmVnX3ZhbFswXSA9ICgx dWxsIDw8IGwzX2NhdC5jYm1fbGVuKSAtIDE7Cj4gPiArICAgICAgICAvKiBDb2RlICovCj4gPiAr ICAgICAgICBwRmVhdC0+Y29zX3JlZ192YWxbMV0gPSAoMXVsbCA8PCBsM19jYXQuY2JtX2xlbikg LSAxOwo+ID4gKwo+ID4gKyAgICAgICAgLyogV2Ugb25seSB3cml0ZSBtYXNrMSBzaW5jZSBtYXNr MCBpcyBhbHdheXMgYWxsIG9uZXMgYnkgZGVmYXVsdC4gKi8KPiA+ICsgICAgICAgIHdybXNybChN U1JfSUEzMl9QU1JfTDNfTUFTSygxKSwKPiA+ICsgICAgICAgICAgICAgICAoMXVsbCA8PCBsM19j YXQuY2JtX2xlbikgLSAxKTsKPiA+ICsgICAgICAgIHJkbXNybChNU1JfSUEzMl9QU1JfTDNfUU9T X0NGRywgdmFsKTsKPiA+ICsgICAgICAgIHdybXNybChNU1JfSUEzMl9QU1JfTDNfUU9TX0NGRywg dmFsIHwgKDEgPDwgUFNSX0wzX1FPU19DRFBfRU5BQkxFX0JJVCkpOwo+ID4gKwo+ID4gKyAgICAg ICAgLyogQ3V0IGhhbGYgb2YgY29zX21heCB3aGVuIENEUCBpcyBlbmFibGVkLiAqLwo+ID4gKyAg ICAgICAgbDNfY2F0LmNvc19tYXggPj49IDE7Cj4gPiArCj4gPiArICAgICAgICBwRmVhdC0+ZmVh dHVyZSA9IFBTUl9TT0NLRVRfTDNfQ0RQOwo+ID4gKyAgICAgICAgc2V0X2JpdChQU1JfU09DS0VU X0wzX0NEUCwgJihpbmZvLT5mZWF0dXJlcykpOwo+ID4gKyAgICAgICAgY2xlYXJfYml0KFBTUl9T T0NLRVRfTDNfQ0FULCAmKGluZm8tPmZlYXR1cmVzKSk7Cj4gCj4gQSBmZXcgbGluZXMgdXAgeW91 IHNldCB0aGlzIGJpdCwgYW5kIG5vdyB5b3UgY2xlYXIgaXQgYWdhaW4uIFBsZWFzZQo+IGluc3Rl YWQgc2V0IGl0IGluIGFuIGVsc2UgYnJhbmNoIGJlbG93Lgo+IApPaywgdGhhbmtzIGZvciB0aGUg c3VnZ2VzdGlvbiEKCj4gPiArICAgIH0KPiA+ICsKPiA+ICsgICAgbWVtY3B5KHBGZWF0LT5mZWF0 X2luZm8sICZsM19jYXQsIHNpemVvZihzdHJ1Y3QgcHNyX2NhdF9sdmxfaW5mbykpOwo+IAo+IEFm b3JlbWVudGlvbmVkIEJVSUxEX0JVR19PTigpIHdvdWxkIHByb2JhYmx5IGJldHMgYmUgcGxhY2Vk Cj4gcmlnaHQgYWhlYWQgb2YgdGhpcyBtZW1jcHkoKS4KPiAKQ2FuIHdlIGNhbGwgQlVJTERfQlVH X09OKCkgYXQgdGhlIHRvcCBvZiB0aGUgZnVuY3Rpb24gdG8gYXZvaWQgZXhlY3V0aW5nIGFib3Zl CnByb2Nlc3MgaWYgdGhlIHNpemUgaXMgbm90IHJpZ2h0PwoKPiA+ICtzdGF0aWMgaW50IGwzX2Nh dF9jb21wYXJlX21hc2sodWludDY0X3QgKm1hc2ssIHN0cnVjdCBmZWF0X2xpc3QgKnBGZWF0LAo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY29zLCBib29s X3QgKmZvdW5kKQo+ID4gK3sKPiA+ICsgICAgc3RydWN0IHBzcl9jYXRfbHZsX2luZm8gY2F0X2lu Zm87Cj4gPiArICAgIHVpbnQ2NF90IGwzX2RlZl9jYm07Cj4gPiArCj4gPiArICAgIG1lbWNweSgm Y2F0X2luZm8sIHBGZWF0LT5mZWF0X2luZm8sIHNpemVvZihzdHJ1Y3QgcHNyX2NhdF9sdmxfaW5m bykpOwo+IAo+IEFscmVhZHkgaGVyZSBJIHRoaW5rIHRoaXMgbWVtY3B5KClpbmcgZ2V0cyB1bndp ZWxkeS4gQ2FuJ3QgeW91Cj4gc2ltcGx5IG1ha2UgdGhlIHN0cnVjdHVyZSBmaWVsZCBhIHVuaW9u IG9mIGFsbCB0eXBlcyBvZiBpbnRlcmVzdD8KPiAKU29ycnkgdGhhdCBJIGFtIG5vdCB2ZXJ5IGNs ZWFyIGFib3V0IHlvdXIgbWVhbmluZyB0byBtYWtlIGEgdW5pb24uIERvIHlvdSBtZWFuCm1ha2Ug ZmVhdF9pbmZvIGEgdW5pb24/IElmIHNvLCBpdCB3aWxsIGxvc2UgdGhlIHVuaXZlcnNhbGl0eSB0 byBjb3ZlciBhbGwKZmVhdHVyZXMuIEZ1dHVyZSBmZWF0dXJlIG1heSBoYXZlIGRpZmZlcmVudCBp bmZvLgoKSSB0aGluayBJIGNhbiByZXBsYWNlIHRoZSBtZW1jcHkoKSB0byBkaXJlY3RseSBhc3Np Z24gdmFsdWUgdG8gY2F0X2luZm8uCgo+ID4gKyAgICBsM19kZWZfY2JtID0gKDF1bGwgPDwgY2F0 X2luZm8uY2JtX2xlbikgLSAxOwo+ID4gKwo+ID4gKyAgICAvKiBDRFAgKi8KPiA+ICsgICAgaWYg KCBwRmVhdC0+ZmVhdHVyZSA9PSBQU1JfU09DS0VUX0wzX0NEUCApCj4gPiArICAgIHsKPiA+ICsg ICAgICAgIGlmICggY29zID4gY2F0X2luZm8uY29zX21heCApCj4gPiArICAgICAgICB7Cj4gPiAr ICAgICAgICAgICAgaWYgKCBtYXNrWzBdICE9IGwzX2RlZl9jYm0gfHwKPiA+ICsgICAgICAgICAg ICAgICAgIG1hc2tbMV0gIT0gbDNfZGVmX2NibSApCj4gPiArICAgICAgICAgICAgewo+ID4gKyAg ICAgICAgICAgICAgICAqZm91bmQgPSAwOwo+IAo+IGZhbHNlIGFuZCB0cnVlIGZvciBsaXRlcmFs IGJvb2xlYW4gdmFsdWVzIHBsZWFzZS4KPiAKVGhhbmtzISBXaWxsIGRvIGl0LgoKPiA+ICsgICAg ICAgICAgICAgICAgcHJpbnRrKFhFTkxPR19FUlIgIkNEUCBleGNlZWQgY29zIG1heC5cbiIpOwo+ IAo+IEkgaGF2ZW4ndCBmaWd1cmVkIHlldCBhdCB3aGF0IHRpbWVzIHRoaXMgZnVuY3Rpb24gd2ls bCBnZXQgY2FsbGVkLCBidXQKPiBJIHN1c3BlY3QgaXQncyBpbmFwcHJvcHJpYXRlIGZvciBpdCB0 byBsb2cgbWVzc2FnZXMuCj4KT2ssIHdpbGwgcmVtb3ZlIHRoZSBsb2cuIFRoYW5rcyEgCgo+ID4g KyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0VOVDsKPiA+ICsgICAgICAgICAgICB9Cj4gPiAr ICAgICAgICAgICAgKmZvdW5kID0gMTsKPiA+ICsgICAgICAgICAgICByZXR1cm4gMjsKPiAKPiBX aG8gb3Igd2hhdCBpcyAyPwo+IApDRFAgb2NjdXBpZXMgMiBtZW1iZXJzIGluIG1hc2tbXSBhcnJh eS4gU28sIGl0IHJldHVybnMgMiB0byBtYWtlIGNvZGVzIG91dHNpZGUKdGhlIGZ1bmN0aW9uIHRv IHNraXAgdG8gbmV4dCBmZWF0dXJlJ3MgbWFzayB2YWx1ZS4KCj4gPiArICAgICAgICB9Cj4gPiAr Cj4gPiArICAgICAgICBpZiAoIG1hc2tbMF0gPT0gcEZlYXQtPmNvc19yZWdfdmFsW2NvcyAqIDJd ICYmCj4gPiArICAgICAgICAgICAgIG1hc2tbMV0gPT0gcEZlYXQtPmNvc19yZWdfdmFsW2NvcyAq IDIgKyAxXSkKPiA+ICsgICAgICAgICAgICAqZm91bmQgPSAxOwo+ID4gKyAgICAgICAgZWxzZQo+ ID4gKyAgICAgICAgICAgICpmb3VuZCA9IDA7Cj4gPiArCj4gPiArICAgICAgICByZXR1cm4gMjsK PiA+ICsgICAgfQo+ID4gKwo+ID4gKyAgICAvKiBDQVQgKi8KPiA+ICsgICAgaWYgKCBjb3MgPiBj YXRfaW5mby5jb3NfbWF4ICkKPiA+ICsgICAgewo+ID4gKyAgICAgICAgaWYgKCBtYXNrWzBdICE9 IGwzX2RlZl9jYm0gKQo+ID4gKyAgICAgICAgewo+ID4gKyAgICAgICAgICAgICpmb3VuZCA9IDA7 Cj4gPiArICAgICAgICAgICAgcHJpbnRrKFhFTkxPR19FUlIgIkNBVCBleGNlZWQgY29zIG1heC5c biIpOwo+ID4gKyAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOwo+ID4gKyAgICAgICAgfQo+ID4g KyAgICAgICAgKmZvdW5kID0gMTsKPiA+ICsgICAgICAgIHJldHVybiAxOwo+ID4gKyAgICB9Cj4g PiArCj4gPiArICAgIGlmICggbWFza1swXSA9PSBwRmVhdC0+Y29zX3JlZ192YWxbY29zXSApCj4g PiArICAgICAgICAqZm91bmQgPSAxOwo+ID4gKyAgICBlbHNlCj4gPiArICAgICAgICAqZm91bmQg PSAwOwo+IAo+IFBsZWFzZSB1c2UgYSBzaW1wbGUgYXNzaWdubWVudCBpbiBjYXNlcyBsaWtlIHRo aXMsIGluc3RlYWQgb2YgaWYvZWxzZS4KPiAKRG8geW91IG1lYW4gY29kZXMgbGlrZSBiZWxvdz8K Cipmb3VuZCA9IDA7CmlmICggbWFza1swXSA9PSBwRmVhdC0+Y29zX3JlZ192YWxbY29zXSApCiAg ICAqZm91bmQgPSAxOwoKPiA+ICtzdGF0aWMgdW5zaWduZWQgaW50IGwzX2NhdF9leGNlZWRfcmFu Z2UodWludDY0X3QgKm1hc2ssIHN0cnVjdCBmZWF0X2xpc3QgKnBGZWF0LAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY29zKQo+ID4gK3sK PiA+ICsgICAgc3RydWN0IHBzcl9jYXRfbHZsX2luZm8gY2F0X2luZm87Cj4gPiArICAgIHVpbnQ2 NF90IGwzX2RlZl9jYm07Cj4gPiArCj4gPiArICAgIG1lbWNweSgmY2F0X2luZm8sIHBGZWF0LT5m ZWF0X2luZm8sIHNpemVvZihzdHJ1Y3QgcHNyX2NhdF9sdmxfaW5mbykpOwo+ID4gKyAgICBsM19k ZWZfY2JtID0gKDF1bGwgPDwgY2F0X2luZm8uY2JtX2xlbikgLSAxOwo+ID4gKwo+ID4gKyAgICAv KiBDRFAgKi8KPiA+ICsgICAgaWYgKCBwRmVhdC0+ZmVhdHVyZSA9PSBQU1JfU09DS0VUX0wzX0NE UCApCj4gPiArICAgIHsKPiA+ICsgICAgICAgIGlmICggY29zID4gY2F0X2luZm8uY29zX21heCAp Cj4gPiArICAgICAgICAgICAgaWYgKCBtYXNrWzBdICE9IGwzX2RlZl9jYm0gfHwKPiA+ICsgICAg ICAgICAgICAgICAgIG1hc2tbMV0gIT0gbDNfZGVmX2NibSApCj4gCj4gUGxlYXNlIGNvbWJpbmUg c3VjaCBpZigpcy4KPiAKU3VyZS4gVGhhbmtzIQoKPiA+ICsgICAgICAgICAgICAgICAgLyoKPiA+ ICsgICAgICAgICAgICAgICAgICogRXhjZWVkIGNvc19tYXggYW5kIHZhbHVlIHRvIHNldCBpcyBu b3QgZGVmYXVsdCwKPiA+ICsgICAgICAgICAgICAgICAgICogcmV0dXJuIGVycm9yLgo+ID4gKyAg ICAgICAgICAgICAgICAgKi8KPiA+ICsgICAgICAgICAgICAgICAgcmV0dXJuIDA7Cj4gPiArCj4g PiArICAgICAgICByZXR1cm4gMjsKPiAKPiBTYW1lIHF1ZXN0aW9uIGFzIGFib3ZlIC0gd2hvIG9y IHdoYXQgaXMgMj8KPiAKUGxlYXNlIGNoZWNrIGFib3ZlIGNvbW1lbnQuCgo+ID4gK3N0YXRpYyBp bnQgbDNfY2F0X2dldF9vbGRfc2V0X25ldyh1aW50NjRfdCAqbWFzaywKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZlYXRfbGlzdCAqcEZlYXQsCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvbGRfY29zLAo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIG1hc2tfdHlwZSB0eXBlLAo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBtKQo+ID4gK3sK PiA+ICsgICAgc3RydWN0IHBzcl9jYXRfbHZsX2luZm8gY2F0X2luZm87Cj4gPiArCj4gPiArICAg IG1lbWNweSgmY2F0X2luZm8sIHBGZWF0LT5mZWF0X2luZm8sIHNpemVvZihzdHJ1Y3QgcHNyX2Nh dF9sdmxfaW5mbykpOwo+ID4gKwo+ID4gKyAgICBpZiAoIHR5cGUgPT0gUFNSX01BU0tfVFlQRV9M M19EQVRBIHx8Cj4gPiArICAgICAgICAgdHlwZSA9PSBQU1JfTUFTS19UWVBFX0wzX0NPREUgfHwK PiA+ICsgICAgICAgICB0eXBlID09IFBTUl9NQVNLX1RZUEVfTDNfQ0JNICkKPiA+ICsgICAgewo+ ID4gKyAgICAgICAgaWYgKCAhcHNyX2NoZWNrX2NibShjYXRfaW5mby5jYm1fbGVuLCBtKSApCj4g PiArICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gPiArICAgIH0KPiA+ICsKPiA+ICsgICAg aWYgKCAoIHR5cGUgPT0gUFNSX01BU0tfVFlQRV9MM19EQVRBIHx8Cj4gPiArICAgICAgICAgdHlw ZSA9PSBQU1JfTUFTS19UWVBFX0wzX0NPREUgKSAmJgo+ID4gKyAgICAgICAgIHBGZWF0LT5mZWF0 dXJlICE9IFBTUl9TT0NLRVRfTDNfQ0RQICkKPiA+ICsgICAgICAgIHJldHVybiAtRU5YSU87Cj4g Cj4gUGxlYXNlIGVpdGhlciBjb21iaW5lIHRoZSB0d28gaWYoKXMgaW50byBhIHNpbmdsZSBzd2l0 Y2goKSAod2l0aAo+IGFwcHJvcHJpYXRlIGZhbGwgdGhyb3VnaCBiZWhhdmlvcikgb3IsIHBlcmhh cHMgYmV0dGVyLCBtb3ZlCj4gdGhpcyBzZWNvbmQgaWYoKSAtIHN1aXRhYmx5IHNocnVuayAtIHBh c3QgdGhlIGZvbGxvd2luZyBvbmUuIFRoaXMgaXMKPiB0byBhdm9pZCByZWR1bmRhbnQgY29kZSwg d2hpY2ggbWFrZXMgdGhpbmdzIG1vcmUgZGlmZmljdWx0IHRvCj4gZm9sbG93Lgo+IApUaGFua3Mh IFdpbGwgbWFrZSBtb2RpZmljYXRpb24uCgo+ID4gKyAgICAvKiBDRFAgKi8KPiA+ICsgICAgaWYg KCBwRmVhdC0+ZmVhdHVyZSA9PSBQU1JfU09DS0VUX0wzX0NEUCApCj4gPiArICAgIHsKPiA+ICsg ICAgICAgIGlmICggb2xkX2NvcyA+IGNhdF9pbmZvLmNvc19tYXggKQo+ID4gKyAgICAgICAgewo+ ID4gKyAgICAgICAgICAgIC8qIERhdGEgKi8KPiA+ICsgICAgICAgICAgICBtYXNrWzBdID0gcEZl YXQtPmNvc19yZWdfdmFsWzBdOwo+ID4gKyAgICAgICAgICAgIC8qIENvZGUgKi8KPiA+ICsgICAg ICAgICAgICBtYXNrWzFdID0gcEZlYXQtPmNvc19yZWdfdmFsWzFdOwo+ID4gKyAgICAgICAgfQo+ ID4gKyAgICAgICAgZWxzZQo+ID4gKyAgICAgICAgewo+ID4gKyAgICAgICAgICAgIC8qIERhdGEg Ki8KPiA+ICsgICAgICAgICAgICBtYXNrWzBdID0gcEZlYXQtPmNvc19yZWdfdmFsW29sZF9jb3Mg KiAyXTsKPiA+ICsgICAgICAgICAgICAvKiBDb2RlICovCj4gPiArICAgICAgICAgICAgbWFza1sx XSA9IHBGZWF0LT5jb3NfcmVnX3ZhbFtvbGRfY29zICogMiArIDFdOwo+ID4gKyAgICAgICAgfQo+ ID4gKwo+ID4gKyAgICAgICAgLyogU2V0IG5ldyBtYXNrICovCj4gPiArICAgICAgICBpZiAoIHR5 cGUgPT0gUFNSX01BU0tfVFlQRV9MM19EQVRBICkKPiA+ICsgICAgICAgICAgICBtYXNrWzBdID0g bTsKPiA+ICsgICAgICAgIGlmICggdHlwZSA9PSBQU1JfTUFTS19UWVBFX0wzX0NPREUgKQo+ID4g KyAgICAgICAgICAgIG1hc2tbMV0gPSBtOwo+ID4gKwo+ID4gKyAgICAgICAgcmV0dXJuIDI7Cj4g PiArICAgIH0KPiA+ICsKPiA+ICsgICAgLyogQ0FUICovCj4gPiArICAgIGlmICggb2xkX2NvcyA+ IGNhdF9pbmZvLmNvc19tYXggKQo+ID4gKyAgICAgICAgbWFza1swXSA9ICBwRmVhdC0+Y29zX3Jl Z192YWxbMF07Cj4gPiArICAgIGVsc2UKPiA+ICsgICAgICAgIG1hc2tbMF0gPSAgcEZlYXQtPmNv c19yZWdfdmFsW29sZF9jb3NdOwo+IAo+IEFjcm9zcyB0aGUgZW50aXJlIGZ1bmN0aW9uIC0gd291 bGRuJ3QgaXQgYmUgZWFzaWVyIHRvIHJhbmdlIGNoZWNrCj4gb2xkX2NvcyBvbmNlIHVwIGZyb250 LCBmb3JjaW5nIGl0IHRvIHplcm8gaWYgdGhlIGNoZWNrIGZhaWxzPyBUaGF0Cj4gd291bGQgcmVk dWNlIGNvZGUgc2l6ZSB0byBhIGJldHRlciByZWFkYWJsZSBhbW91bnQuIChBbmQganVzdCB0bwo+ IGF2b2lkIGFueSBtaXN1bmRlcnN0YW5kaW5nIC0gY29tbWVudHMgbGlrZSB0aGlzIGFsc28gbWF5 IGFwcGx5Cj4gdG8gb3RoZXIgZnVuY3Rpb25zOyBJJ20gbm90IGdvaW5nIHRvIHJlcGVhdCB0aGVt IHRoZXJlLikKPiAKR29vZCBpZGVhISBUaGFua3MgZm9yIHRoZSBzdWdnZXN0aW9uLiBJIHdpbGwg Y2hlY2sgb3RoZXIgZnVuY3Rpb25zIGxpa2UgdGhpcy4KCj4gQWxzbyBub3RlIHRoYXQgdGhlcmUg YXJlIHVuZHVlIGRvdWJsZSBibGFua3MgaW4gaGVyZS4KPiAKRG8geW91IG1lYW4gdHdvIHNwYWNl cz8gSSBjYW5ub3Qgc2VlIGl0IGluIG15IG9yaWdpbmFsIHBhdGNoIGFuZCBjb2Rlcy4KCj4gPiAr ICAgIGlmICggdHlwZSA9PSBQU1JfTUFTS19UWVBFX0wzX0NCTSApCj4gPiArICAgICAgICBtYXNr WzBdID0gbTsKPiAKPiBUaGlzIG92ZXJ3cml0aW5nIGJlaGF2aW9yIGFsc28gbG9va3MgcXVpdGUg c3RyYW5nZSB0byBtZS4gV2hhdCdzCj4gdGhlIHB1cnBvc2U/IEFuZCBpZiB0aGlzIHJlYWxseSBp cyBtZWFudCB0byBiZSB0aGF0IHdheSwgd2h5IGlzCj4gdGhpcyBub3QgKGxlYXZpbmcgYXNpZGUg dGhlIG90aGVyIHN1Z2dlc3RlZCBhZGp1c3RtZW50KQo+IAo+ICAgICBpZiAoIHR5cGUgPT0gUFNS X01BU0tfVFlQRV9MM19DQk0gKQo+ICAgICAgICAgbWFza1swXSA9IG07Cj4gICAgIGVsc2UgaWYg KCBvbGRfY29zID4gY2F0X2luZm8uY29zX21heCApCj4gICAgICAgICBtYXNrWzBdID0gcEZlYXQt PmNvc19yZWdfdmFsWzBdOwo+ICAgICBlbHNlCj4gICAgICAgICBtYXNrWzBdID0gcEZlYXQtPmNv c19yZWdfdmFsW29sZF9jb3NdOwo+IAo+ID8KPiAKZ2V0X29sZF9zZXRfbmV3KCkgaXMgdXNlZCB0 byBkbyBiZWxvdyB0d28gdGhpbmdzOgoxLiBnZXQgb2xkX2NvcyByZWdpc3RlciB2YWx1ZSBvZiBh bGwgc3VwcG9ydGVkIGZlYXR1cmVzIGFuZAoyLiBzZXQgdGhlIG5ldyB2YWx1ZSBmb3IgYXBwb2lu dGVkIGZlYXR1cmUuCgpTbywgaWYgdGhlIGFwcG9pbnRlZCBmZWF0dXJlIGlzIEwzIENBVCwgd2Ug c2hvdWxkIHNldCBpbnB1dCB2YWxsdWUgZm9yIGl0IGhlcmUuCgo+ID4gK3N0YXRpYyBpbnQgbDNf Y2F0X2dldF9mZWF0X2luZm8oc3RydWN0IGZlYXRfbGlzdCAqcEZlYXQsIGVudW0gbWFza190eXBl IHR5cGUsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZGF0 MCwgdWludDMyX3QgKmRhdDEsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1 aW50MzJfdCAqZGF0MikKPiA+ICt7Cj4gPiArICAgIHN0cnVjdCBwc3JfY2F0X2x2bF9pbmZvIGNh dF9pbmZvOwo+ID4gKwo+ID4gKyAgICBpZiAoIHR5cGUgIT0gUFNSX01BU0tfVFlQRV9MM19EQVRB ICYmCj4gPiArICAgICAgICAgdHlwZSAhPSBQU1JfTUFTS19UWVBFX0wzX0NPREUgJiYKPiA+ICsg ICAgICAgICB0eXBlICE9IFBTUl9NQVNLX1RZUEVfTDNfQ0JNICkKPiA+ICsgICAgICAgIHJldHVy biAwOwo+ID4gKwo+ID4gKyAgICBtZW1jcHkoJmNhdF9pbmZvLCBwRmVhdC0+ZmVhdF9pbmZvLCBz aXplb2Yoc3RydWN0IHBzcl9jYXRfbHZsX2luZm8pKTsKPiA+ICsKPiA+ICsgICAgKmRhdDAgPSBj YXRfaW5mby5jYm1fbGVuOwo+ID4gKyAgICAqZGF0MSA9IGNhdF9pbmZvLmNvc19tYXg7Cj4gPiAr Cj4gPiArICAgIGlmICggcEZlYXQtPmZlYXR1cmUgPT0gUFNSX1NPQ0tFVF9MM19DRFAgKQo+ID4g KyAgICAgICAgKmRhdDIgfD0gWEVOX1NZU0NUTF9QU1JfQ0FUX0wzX0NEUDsKPiA+ICsgICAgZWxz ZQo+ID4gKyAgICAgICAgKmRhdDIgPSAwOwo+ID4gKwo+ID4gKyAgICByZXR1cm4gMTsKPiA+ICt9 Cj4gCj4gVGhlIGxhdGVzdCBoZXJlIGl0IGJlY29tZXMgY2xlYXIgdGhhdCB5b3Ugd2FudCB0byB1 c2Ugc3dpdGNoKCkKPiBtdWNoIG1vcmUgd2lkZWx5Lgo+IApPaywgd2lsbCBjb25zaWRlciBpdCBj YXJlZnVsbHkuCgo+ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCBwc3JfYXNzb2NfaW5pdCh2b2lkKQo+ ID4gIHsKPiA+ICAgICAgc3RydWN0IHBzcl9hc3NvYyAqcHNyYSA9ICZ0aGlzX2NwdShwc3JfYXNz b2MpOwo+ID4gKyAgICBzdHJ1Y3QgcHNyX3NvY2tldF9hbGxvY19pbmZvICppbmZvOwo+ID4gKyAg ICB1bnNpZ25lZCBpbnQgY29zX21heDsKPiA+ICsgICAgdW5zaWduZWQgaW50IHNvY2tldDsKPiA+ ICAKPiA+IC0gICAgaWYgKCBjYXRfc29ja2V0X2luZm8gKQo+ID4gKyAgICBpZiAoIHNvY2tldF9h bGxvY19pbmZvICkKPiA+ICAgICAgewo+ID4gLSAgICAgICAgdW5zaWduZWQgaW50IHNvY2tldCA9 IGNwdV90b19zb2NrZXQoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKPiA+ICsgICAgICAgIHNvY2tldCA9 IGNwdV90b19zb2NrZXQoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKPiAKPiBXaGF0J3MgdGhlIHBvaW50 IG9mIG1vdmluZyB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24/IFF1aXRlIHRoZQo+IG90aGVyIHdh eSBhcm91bmQsIHRoZSBuZXcgdmFyaWFibGUgeW91IGFkZCBjb3VsZCAtIGFmYWljdCAtIGFsbAo+ IGxpdmUgaW4gdGhpcyBtb3JlIG5hcnJvdyBzY29wZS4gQW5kIGluZm8gY291bGQgcHJlc3VtYWJs eSBiZWNvbWUKPiBhIHBvaW50ZXIgdG8gY29uc3QuCj4gCkkgcmVtZW1iZXIgaXQgcmVwb3J0cyB3 YXJuaW5nIG9yIGVycm9yIHdoZW4gY29tcGlsaW5nIG9sZCBjb2Rlcy4KCj4gPiAtaW50IHBzcl9n ZXRfY2F0X2wzX2luZm8odW5zaWduZWQgaW50IHNvY2tldCwgdWludDMyX3QgKmNibV9sZW4sCj4g PiAtICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvc19tYXgsIHVpbnQzMl90ICpm bGFncykKPiA+ICtpbnQgcHNyX2dldF9pbmZvKHVuc2lnbmVkIGludCBzb2NrZXQsIGVudW0gbWFz a190eXBlIHR5cGUsCj4gPiArICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZGF0MCwgdWludDMy X3QgKmRhdDEsCj4gPiArICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZGF0MikKPiA+ICB7Cj4g PiAtICAgIHN0cnVjdCBwc3JfY2F0X3NvY2tldF9pbmZvICppbmZvID0gZ2V0X2NhdF9zb2NrZXRf aW5mbyhzb2NrZXQpOwo+ID4gKyAgICBzdHJ1Y3QgcHNyX3NvY2tldF9hbGxvY19pbmZvICppbmZv ID0gZ2V0X3NvY2tldF9hbGxvY19pbmZvKHNvY2tldCk7Cj4gPiArICAgIHN0cnVjdCBmZWF0X2xp c3QgKnBUbXA7Cj4gPiAgCj4gPiAgICAgIGlmICggSVNfRVJSKGluZm8pICkKPiA+ICAgICAgICAg IHJldHVybiBQVFJfRVJSKGluZm8pOwo+ID4gIAo+ID4gLSAgICAqY2JtX2xlbiA9IGluZm8tPmNi bV9sZW47Cj4gPiAtICAgICpjb3NfbWF4ID0gaW5mby0+Y29zX21heDsKPiA+ICsgICAgaWYgKCBO VUxMID09IGluZm8tPnBGZWF0IHx8IE5VTEwgPT0gaW5mby0+cEZlYXQtPnBOZXh0KQo+ID4gKyAg ICAgICByZXR1cm4gLUVOT0RFVjsKPiA+ICAKPiA+IC0gICAgKmZsYWdzID0gMDsKPiA+IC0gICAg aWYgKCBjZHBfaXNfZW5hYmxlZChzb2NrZXQpICkKPiA+IC0gICAgICAgICpmbGFncyB8PSBYRU5f U1lTQ1RMX1BTUl9DQVRfTDNfQ0RQOwo+ID4gKyAgICBwVG1wID0gaW5mby0+cEZlYXQtPnBOZXh0 Owo+ID4gKyAgICB3aGlsZSAoIHBUbXAgKQo+ID4gKyAgICB7Cj4gPiArICAgICAgICBpZiAoIHBU bXAtPm9wcy5nZXRfZmVhdF9pbmZvKHBUbXAsIHR5cGUsIGRhdDAsIGRhdDEsIGRhdDIpICkKPiAK PiBDb25zaWRlcmluZyB0aGF0IHRoaXMgaXMgb25lIG9mIHRoZSBnZW5lcmljIG9wczogV2hhdCBn dWFyYW50ZWVzCj4gdGhhdCAzIGVsZW1lbnRzIHdpbGwgc3VmZmljZSBnb2luZyBmb3J3YXJkPyBJ LmUuIHdoeSBpcyB0aGlzIG5vdCBhbgo+IGFycmF5Pwo+IApHb29kIHBvaW50LiBJIGNvbnNpZGVy IHRoaXMgdG9vLiBQZXIgYWxsIGZlYXR1cmVzIHdlIGtub3csIHRocmVlIHBhcmFtZXRlcnMKYXJl IHN1ZmZpY2llbnQuIFRvIHNpbXBsaWZ5IGNvZGVzLCBJIHdyaXRlIHRoZSBmdW5jdGlvbiBsaWtl IHRoaXMuIEkgdGhpbmsKd2UgY2FuIG1ha2UgY2hhbmdlIGlmIGZ1dHVyZSBmZWF0dXJlIGhhcyBt b3JlIHJlcXVpcmVtZW50cy4KCklmIHlvdSBsaWtlIHRvIGdldCB0aGluZ3MgZG9uZSBvbmUgdGlt ZSwgSSB3aWxsIG1ha2UgY2hhbmdlLgoKPiA+IC1pbnQgcHNyX2dldF9sM19jYm0oc3RydWN0IGRv bWFpbiAqZCwgdW5zaWduZWQgaW50IHNvY2tldCwKPiA+IC0gICAgICAgICAgICAgICAgICAgdWlu dDY0X3QgKmNibSwgZW51bSBjYm1fdHlwZSB0eXBlKQo+ID4gK3N0YXRpYyBpbnQgZ2V0X29sZF9z ZXRfbmV3KHVpbnQ2NF90ICptYXNrLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0 cnVjdCBwc3Jfc29ja2V0X2FsbG9jX2luZm8gKmluZm8sCj4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgdW5zaWduZWQgaW50IG9sZF9jb3MsCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgZW51bSBtYXNrX3R5cGUgdHlwZSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICB1aW50NjRfdCBtKQo+ID4gIHsKPiA+IC0gICAgc3RydWN0IHBzcl9jYXRfc29ja2V0X2luZm8g KmluZm8gPSBnZXRfY2F0X3NvY2tldF9pbmZvKHNvY2tldCk7Cj4gPiAtICAgIGJvb2xfdCBjZHBf ZW5hYmxlZCA9IGNkcF9pc19lbmFibGVkKHNvY2tldCk7Cj4gPiAtCj4gPiAtICAgIGlmICggSVNf RVJSKGluZm8pICkKPiA+IC0gICAgICAgIHJldHVybiBQVFJfRVJSKGluZm8pOwo+ID4gKyAgICBz dHJ1Y3QgZmVhdF9saXN0ICpwVG1wOwo+ID4gKyAgICBpbnQgcmV0Owo+ID4gIAo+ID4gLSAgICBz d2l0Y2ggKCB0eXBlICkKPiA+IC0gICAgewo+ID4gLSAgICBjYXNlIFBTUl9DQk1fVFlQRV9MMzoK PiA+IC0gICAgICAgIGlmICggY2RwX2VuYWJsZWQgKQo+ID4gLSAgICAgICAgICAgIHJldHVybiAt RVhERVY7Cj4gPiAtICAgICAgICAqY2JtID0gaW5mby0+Y29zX3RvX2NibVtkLT5hcmNoLnBzcl9j b3NfaWRzW3NvY2tldF1dLmNibTsKPiA+IC0gICAgICAgIGJyZWFrOwo+ID4gKyAgICBpZiAoICFt YXNrICkKPiA+ICsgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4gIAo+ID4gLSAgICBjYXNlIFBT Ul9DQk1fVFlQRV9MM19DT0RFOgo+ID4gLSAgICAgICAgaWYgKCAhY2RwX2VuYWJsZWQgKQo+ID4g LSAgICAgICAgICAgICpjYm0gPSBpbmZvLT5jb3NfdG9fY2JtW2QtPmFyY2gucHNyX2Nvc19pZHNb c29ja2V0XV0uY2JtOwo+ID4gLSAgICAgICAgZWxzZQo+ID4gLSAgICAgICAgICAgICpjYm0gPSBp bmZvLT5jb3NfdG9fY2JtW2QtPmFyY2gucHNyX2Nvc19pZHNbc29ja2V0XV0uY29kZTsKPiA+IC0g ICAgICAgIGJyZWFrOwo+ID4gKyAgICBpZiAoICFpbmZvIHx8ICFpbmZvLT5wRmVhdCApCj4gPiAr ICAgICAgICByZXR1cm4gLUVOT0RFVjsKPiAKPiBFYXJsaWVyIG9uIHlvdSB1c2VkIChzbGlnaHRs eSBvZGRseSBhcnJhbmdlZCkgY2hlY2tzIGFnYWluc3QgTlVMTC4KPiBQbGVhc2UgYmUgY29uc2lz dGVudCAoYW5kIEknZCBwcmVmZXIgaWYgeW91IHVzZWQgISBhY3Jvc3MgdGhlIGJvYXJkKS4KPiAK R290IGl0LCB0aGFua3MhCgo+ID4gLSAgICBjYXNlIFBTUl9DQk1fVFlQRV9MM19EQVRBOgo+ID4g LSAgICAgICAgaWYgKCAhY2RwX2VuYWJsZWQgKQo+ID4gLSAgICAgICAgICAgICpjYm0gPSBpbmZv LT5jb3NfdG9fY2JtW2QtPmFyY2gucHNyX2Nvc19pZHNbc29ja2V0XV0uY2JtOwo+ID4gLSAgICAg ICAgZWxzZQo+ID4gLSAgICAgICAgICAgICpjYm0gPSBpbmZvLT5jb3NfdG9fY2JtW2QtPmFyY2gu cHNyX2Nvc19pZHNbc29ja2V0XV0uZGF0YTsKPiA+IC0gICAgICAgIGJyZWFrOwo+ID4gKyAgICBw VG1wID0gaW5mby0+cEZlYXQtPnBOZXh0Owo+ID4gKyAgICB3aGlsZSAoIHBUbXAgKQo+ID4gKyAg ICB7Cj4gPiArICAgICAgICAvKiBtYXNrIGdldHRpbmcgYW5kIHNldHRpbmcgb3JkZXIgaXMgc2Ft ZSBhcyBmZWF0dXJlIGxpc3QgKi8KPiA+ICsgICAgICAgIHJldCA9IHBUbXAtPm9wcy5nZXRfb2xk X3NldF9uZXcobWFzaywgcFRtcCwgb2xkX2NvcywgdHlwZSwgbSk7Cj4gPiArICAgICAgICBpZiAo IHJldCA8IDAgKQo+ID4gKyAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiAgCj4gPiAtICAgIGRl ZmF1bHQ6Cj4gPiAtICAgICAgICBBU1NFUlRfVU5SRUFDSEFCTEUoKTsKPiA+ICsgICAgICAgIG1h c2sgKz0gcmV0Owo+IAo+IFdpdGggdGhpcyAtIHdoYXQgZW5zdXJlcyB0aGUgYXJyYXkgaXNuJ3Qg Z29pbmcgdG8gYmUgb3ZlcnJ1bj8KPiAKSXQgc2VlbXMgeW91IG1pc3NlZCBvbmUgbGluZSBiZWxv dy4gVGhlIHdoaWxlKCkgbG9vcCB0cmF2ZXJzZSBhbGwgZmVhdHVyZXMgaW4KbGlzdC4gSXQgd2ls bCBleGl0IHdoZW4gdGhlIGxhc3QgbWVtYmVyIGhhcyBiZWVuIGFjY2Vzc2VkLgoKKyAgICAgICAg cFRtcCA9IHBUbXAtPnBOZXh0OwoKPiBBbmQgSSdtIGFsc28gaGF2aW5nIHNvbWUgZGlmZmljdWx0 eSBzZWVpbmcgaG93IGFuIGFycmF5IG9mIG91dHB1dHMKPiBtYXRjaGVzIHVwIHdpdGggZXhhY3Rs eSBvbmUgaW5wdXQgKG0pLiBDYW4geW91IGV4cGxhaW4gdGhpcyBwbGVhc2U/Cj4gClRoaXMgd2hp bGUgbG9vcCB3aWxsIHRyYXZlcnNlIGFsbCBmZWF0dXJlcyBpbiBsaXN0LiBJdCB3aWxsIGdldCBh bGwgZmVhdHVyZXMKb2xkX2NvcyB2YWx1ZSBiYWNrLiBJZiB0aGUgZmVhdHVyZSBpcyB0aGUgb25l IHRvIHNldCBuZXcgdmFsdWUsIHRoZSBpbnB1dApuZXcgdmFsdWUgKG0pIHdpbGwgcmVwbGFjZSB0 aGUgb2xkX2NvcyB2YWx1ZS4gQWxsIHRoZSB2YWx1ZSBhcmUgc2V0IGludG8gbWFzawphcnJheSBh Y2NvcmRpbmcgdGhlIHRyYXZlcnNhbCBvcmRlciwgbWVhbmluZyB0aGUgc2FtZSBvcmRlciBvZiBm ZWF0dXJlIGxpc3QKbWVtYmVycywgbGlrZSBMMyBDQVQgYXMgdGhlIGZpcnN0IGFuZCBMMiBDQVQg YXMgdGhlIHNlY29uZC4KCkZvciBleGFtcGxlLCBvbGRfY29zIG9mIHRoZSBkb21haW4gaXMgMS4g VXNlciB3YW50cyB0byBzZXQgTDMgQ0FUIENCTSB0byAweDFmZi4KVGhlIG9yaWdpbmFsIENPUyBy ZWdpc3RlcnMgbGlrZSBiZWxvdy4KCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAg ICAgICB8IENPUyAwIHwgQ09TIDEgfCAuLi4gfAogICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCkwzIENBVCAgfCAweDdmZiB8IDB4M2ZmIHwgLi4uIHwKICAgICAgICAtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQpMMiBDQVQgIHwgMHhmZiAgfCAweDNmICB8IC4uLiB8CiAgICAgICAgLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KClRoZW4sIG1hc2sgYXJyYXkgc2hvdWxkIGJlOgptYXNrWzBdOiAw eDFmZgptYXNrWzFdOiAweDNmCgpUaGVuLCB3ZSBjYW4gdXNlIHRoaXMgbWFzayBhcnJheSB0byBm aW5kIGlmIHRoZXJlIGlzIG1hdGNoaW5nIENPUyB0aHJvdWdoCmNvbXBhcmVfbWFzaygpLgoKPiA+ IC1zdGF0aWMgYm9vbF90IHBzcl9jaGVja19jYm0odW5zaWduZWQgaW50IGNibV9sZW4sIHVpbnQ2 NF90IGNibSkKPiA+ICtpbnQgcHNyX2dldF92YWwoc3RydWN0IGRvbWFpbiAqZCwgdW5zaWduZWQg aW50IHNvY2tldCwKPiA+ICsgICAgICAgICAgICAgICAgdWludDY0X3QgKnZhbCwgZW51bSBtYXNr X3R5cGUgdHlwZSkKPiA+ICB7Cj4gPiAtICAgIHVuc2lnbmVkIGludCBmaXJzdF9iaXQsIHplcm9f Yml0Owo+ID4gLQo+ID4gLSAgICAvKiBTZXQgYml0cyBzaG91bGQgb25seSBpbiB0aGUgcmFuZ2Ug b2YgWzAsIGNibV9sZW4pLiAqLwo+ID4gLSAgICBpZiAoIGNibSAmICh+MHVsbCA8PCBjYm1fbGVu KSApCj4gPiAtICAgICAgICByZXR1cm4gMDsKPiA+ICsgICAgc3RydWN0IHBzcl9zb2NrZXRfYWxs b2NfaW5mbyAqaW5mbyA9IGdldF9zb2NrZXRfYWxsb2NfaW5mbyhzb2NrZXQpOwo+ID4gKyAgICB1 bnNpZ25lZCBpbnQgY29zID0gZC0+YXJjaC5wc3JfY29zX2lkc1tzb2NrZXRdOwo+ID4gKyAgICBz dHJ1Y3QgZmVhdF9saXN0ICpwVG1wOwo+ID4gKyAgICBpbnQgcmV0Owo+ID4gIAo+ID4gLSAgICAv KiBBdCBsZWFzdCBvbmUgYml0IG5lZWQgdG8gYmUgc2V0LiAqLwo+ID4gLSAgICBpZiAoIGNibSA9 PSAwICkKPiA+IC0gICAgICAgIHJldHVybiAwOwo+ID4gKyAgICBpZiAoIElTX0VSUihpbmZvKSAp Cj4gPiArICAgICAgICByZXR1cm4gUFRSX0VSUihpbmZvKTsKPiA+ICAKPiA+IC0gICAgZmlyc3Rf Yml0ID0gZmluZF9maXJzdF9iaXQoJmNibSwgY2JtX2xlbik7Cj4gPiAtICAgIHplcm9fYml0ID0g ZmluZF9uZXh0X3plcm9fYml0KCZjYm0sIGNibV9sZW4sIGZpcnN0X2JpdCk7Cj4gPiArICAgIGlm ICggTlVMTCA9PSBpbmZvLT5wRmVhdCB8fCBOVUxMID09IGluZm8tPnBGZWF0LT5wTmV4dCApCj4g PiArICAgICAgICByZXR1cm4gLUVOT0RFVjsKPiA+ICAKPiA+IC0gICAgLyogU2V0IGJpdHMgc2hv dWxkIGJlIGNvbnRpZ3VvdXMuICovCj4gPiAtICAgIGlmICggemVyb19iaXQgPCBjYm1fbGVuICYm Cj4gPiAtICAgICAgICAgZmluZF9uZXh0X2JpdCgmY2JtLCBjYm1fbGVuLCB6ZXJvX2JpdCkgPCBj Ym1fbGVuICkKPiA+IC0gICAgICAgIHJldHVybiAwOwo+ID4gKyAgICBwVG1wID0gaW5mby0+cEZl YXQtPnBOZXh0Owo+ID4gKyAgICB3aGlsZSAoIHBUbXAgKQo+ID4gKyAgICB7Cj4gPiArICAgICAg ICByZXQgPSBwVG1wLT5vcHMuZ2V0X3ZhbChwVG1wLCBjb3MsIHR5cGUsIHZhbCk7Cj4gPiArICAg ICAgICBpZiAoIHJldCA8IDAgKQo+ID4gKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+IAo+ IFdoeSBkb24ndCB5b3UgcmV0dXJuICJyZXQiIGhlcmU/Cj4gClRoaXMgaXMgYW4gdW5uZWNlc3Nh cnkgY2hlY2suIFdpbGwgcmVtb3ZlIGl0LgoKPiA+ICsgICAgICAgIGVsc2UgaWYgKCByZXQgPiAw ICkKPiAKPiBQb2ludGxlc3MgImVsc2UiLgpXaWxsIHJlbW92ZSBpdC4KCj4gCj4gPiAtc3RhdGlj IHZvaWQgZG9fd3JpdGVfbDNfY2JtKHZvaWQgKmRhdGEpCj4gPiArc3RhdGljIHZvaWQgZG9fd3Jp dGVfcHNyX3JlZih2b2lkICpkYXRhKQo+IAo+IFdoYXQgZG9lcyAiX3JlZiIgc3RhbmQgZm9yPwo+ IApTb3JyeSwgYSBtaXN0YWtlLgoKPiA+IC1zdGF0aWMgaW50IGZpbmRfY29zKHN0cnVjdCBwc3Jf Y2F0X2NibSAqbWFwLCB1bnNpZ25lZCBpbnQgY29zX21heCwKPiA+IC0gICAgICAgICAgICAgICAg ICAgIHVpbnQ2NF90IGNibV9jb2RlLCB1aW50NjRfdCBjYm1fZGF0YSwgYm9vbF90IGNkcF9lbmFi bGVkKQo+ID4gK3N0YXRpYyBpbnQgZmluZF9jb3ModWludDY0X3QgKm1hc2ssIGVudW0gbWFza190 eXBlIHR5cGUsCj4gPiArICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHNyX3NvY2tldF9hbGxv Y19pbmZvICppbmZvKQo+ID4gIHsKPiA+ICAgICAgdW5zaWduZWQgaW50IGNvczsKPiA+ICsgICAg c3RydWN0IHBzcl9yZWYgKm1hcCA9IGluZm8tPmNvc19yZWY7Cj4gPiArICAgIHN0cnVjdCBmZWF0 X2xpc3QgKnBUbXA7Cj4gPiArICAgIHVpbnQ2NF90ICpwTWFzayA9IG1hc2s7Cj4gPiArICAgIGlu dCByZXQ7Cj4gPiArICAgIGJvb2xfdCBmb3VuZCA9IDA7Cj4gPiArICAgIHVuc2lnbmVkIGludCBj b3NfbWF4ID0gMDsKPiA+ICsKPiA+ICsgICAgLyogY29zX21heCBpcyB0aGUgbWF4IENPUyBvZiB0 aGUgZmVhdHVyZSB0byBiZSBzZXQuICovCj4gPiArICAgIHBUbXAgPSBpbmZvLT5wRmVhdC0+cE5l eHQ7Cj4gPiArICAgIHdoaWxlICggcFRtcCApCj4gPiArICAgIHsKPiA+ICsgICAgICAgIGNvc19t YXggPSBwVG1wLT5vcHMuZ2V0X2Nvc19tYXhfYXNfdHlwZShwVG1wLCB0eXBlKTsKPiA+ICsgICAg ICAgIGlmICggY29zX21heCA+IDAgKQo+ID4gKyAgICAgICAgICAgIGJyZWFrOwo+ID4gKwo+ID4g KyAgICAgICAgcFRtcCA9IHBUbXAtPnBOZXh0Owo+ID4gKyAgICB9Cj4gPiAgCj4gPiArICAgIHBU bXAgPSBpbmZvLT5wRmVhdC0+cE5leHQ7Cj4gPiAgICAgIGZvciAoIGNvcyA9IDA7IGNvcyA8PSBj b3NfbWF4OyBjb3MrKyApCj4gPiAgICAgIHsKPiA+IC0gICAgICAgIGlmICggKG1hcFtjb3NdLnJl ZiB8fCBjb3MgPT0gMCkgJiYKPiA+IC0gICAgICAgICAgICAgKCghY2RwX2VuYWJsZWQgJiYgbWFw W2Nvc10uY2JtID09IGNibV9jb2RlKSB8fAo+ID4gLSAgICAgICAgICAgICAgKGNkcF9lbmFibGVk ICYmIG1hcFtjb3NdLmNvZGUgPT0gY2JtX2NvZGUgJiYKPiA+IC0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBtYXBbY29zXS5kYXRhID09IGNibV9kYXRhKSkgKQo+ID4gKyAgICAgICAgaWYg KCAwICE9IGNvcyAmJiAwID09IG1hcFtjb3NdLnJlZiApCj4gPiArICAgICAgICAgICAgY29udGlu dWU7Cj4gPiArCj4gPiArICAgICAgICB3aGlsZSAoIHBUbXAgKQo+ID4gKyAgICAgICAgewo+ID4g KyAgICAgICAgICAgIC8qCj4gPiArICAgICAgICAgICAgICogQ29tcGFyZSBtYXNrIGFjY29yZGlu ZyB0byBmZWF0dXJlIGxpc3Qgb3JkZXIuCj4gPiArICAgICAgICAgICAgICogV2UgbXVzdCBmb2xs b3cgdGhpcyBvcmRlciBiZWNhdXNlIG1hc2sgaXMgYXNzZW1ibGVkCj4gPiArICAgICAgICAgICAg ICogYXMgdGhpcyBvcmRlciBpbiBnZXRfb2xkX3NldF9uZXcoKS4KPiA+ICsgICAgICAgICAgICAg Ki8KPiA+ICsgICAgICAgICAgICByZXQgPSBwVG1wLT5vcHMuY29tcGFyZV9tYXNrKHBNYXNrLCBw VG1wLCBjb3MsICZmb3VuZCk7Cj4gPiArICAgICAgICAgICAgaWYgKCByZXQgPCAwICkKPiA+ICsg ICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICsKPiA+ICsgICAgICAgICAgICAvKiBJZiBm YWlsIHRvIG1hdGNoLCBnbyB0byBuZXh0IGNvcyB0byBjb21wYXJlLiAqLwo+ID4gKyAgICAgICAg ICAgIGlmICggIWZvdW5kICkKPiA+ICsgICAgICAgICAgICAgICAgYnJlYWs7Cj4gPiArCj4gPiAr ICAgICAgICAgICAgcE1hc2sgKz0gcmV0Owo+ID4gKyAgICAgICAgICAgIHBUbXAgPSBwVG1wLT5w TmV4dDsKPiA+ICsgICAgICAgIH0KPiA+ICsKPiA+ICsgICAgICAgIC8qIEV2ZXJ5IGZlYXR1cmUg Y2FuIG1hdGNoLCB0aGlzIGNvcyBpcyB3aGF0IHdlIGZpbmQuICovCj4gPiArICAgICAgICBpZiAo IGZvdW5kICkKPiA+ICAgICAgICAgICAgICByZXR1cm4gY29zOwo+ID4gKwo+ID4gKyAgICAgICAg LyogTm90IGZvdW5kLCBuZWVkIGZpbmQgYWdhaW4gZnJvbSBiZWdpbm5pbmcuICovCj4gPiArICAg ICAgICBwVG1wID0gaW5mby0+cEZlYXQtPnBOZXh0Owo+ID4gKyAgICAgICAgcE1hc2sgPSBtYXNr Owo+IAo+IFBsZWFzZSBkbyBvbmNlIChhdCB0aGUgYXBwcm9wcmlhdGUgcGxhY2UgaW5zaWRlIHRo ZSBvdXRlciBsb29wKSB3aGF0Cj4geW91IGhhdmUgZG9uZSBwcmlvciB0byB0aGUgbG9vcCBhbmQg cmVwZWF0IGhlcmUuIEFzIGFscmVhZHkgYWxsdWRlZAo+IHRvIC0gbGltaXRpbmcgdGhlIHNjb3Bl IG9mIHZhcmlhYmxlcyBhbHNvIGhlbHBzIGVuc3VyaW5nIHRoYXQgdGhpbmdzCj4gd29yayBhcyBp bnRlbmRlZC4KPiAKR29vZCBzdWdnZXN0aW9uLCB0aGFua3MhCgo+ID4gICAgICB9Cj4gPiAgCj4g PiArICAgIHByaW50ayhYRU5MT0dfSU5GTyAiJXM6IGNhbm5vdCBmaW5kIGNvcy5cbiIsIF9fZnVu Y19fKTsKPiAKPiBBZ2FpbiBhIHF1ZXN0aW9uYWJsZSBsb2cgbWVzc2FnZSB3aXRoIGEgcXVlc3Rp b25hYmxlIHVzZSBvZiBfX2Z1bmNfXy4KPiBJbiBhbnkgY2FzZSBsb2cgbWVzc2FnZXMgc2hvdWxk IG5vcm1hbGx5IG5vdCBoYXZlIGEgZnVsbCBzdG9wIGF0IHRoZWlyCj4gZW5kLgo+IApXaWxsIHJl bW92ZSB0aGlzIGxvZy4KCj4gPiAtc3RhdGljIGludCBwaWNrX2F2YWlsX2NvcyhzdHJ1Y3QgcHNy X2NhdF9jYm0gKm1hcCwgdW5zaWduZWQgaW50IGNvc19tYXgsCj4gPiAtICAgICAgICAgICAgICAg ICAgICAgICAgICB1bnNpZ25lZCBpbnQgb2xkX2NvcykKPiA+ICtzdGF0aWMgaW50IGNoZWNrX2V4 Y2VlZF9yYW5nZSh1aW50NjRfdCAqbWFzaywgc3RydWN0IGZlYXRfbGlzdCAqcFRtcCwKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY29zKQo+ID4gIHsKPiA+ ICsgICAgdW5zaWduZWQgaW50IHJldCA9IDA7Cj4gCj4gUG9pbnRsZXNzIGluaXRpYWxpemVyLgo+ IApXaWxsIHJlbW92ZSBpdC4KCj4gPiArc3RhdGljIGludCBhbGxvY19uZXdfY29zKHN0cnVjdCBw c3Jfc29ja2V0X2FsbG9jX2luZm8gKmluZm8sCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg IHVpbnQ2NF90ICptYXNrLCB1bnNpZ25lZCBpbnQgb2xkX2NvcywKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgZW51bSBtYXNrX3R5cGUgdHlwZSkKPiA+ICt7Cj4gPiArICAgIHVuc2lnbmVk IGludCBjb3NfbWF4ID0gMDsKPiA+ICsgICAgc3RydWN0IGZlYXRfbGlzdCAqcFRtcDsKPiA+ICAg ICAgdW5zaWduZWQgaW50IGNvczsKPiA+ICsgICAgc3RydWN0IHBzcl9yZWYgKm1hcCA9IGluZm8t PmNvc19yZWY7Cj4gPiArCj4gPiArICAgIC8qCj4gPiArICAgICAqIGNvc19tYXggaXMgdGhlIG1h eCBDT1Mgb2YgdGhlIGZlYXR1cmUgdG8gYmUgc2V0Lgo+ID4gKyAgICAgKi8KPiA+ICsgICAgcFRt cCA9IGluZm8tPnBGZWF0LT5wTmV4dDsKPiA+ICsgICAgd2hpbGUgKCBwVG1wICkKPiA+ICsgICAg ewo+ID4gKyAgICAgICAgY29zX21heCA9IHBUbXAtPm9wcy5nZXRfY29zX21heF9hc190eXBlKHBU bXAsIHR5cGUpOwo+ID4gKyAgICAgICAgaWYgKCBjb3NfbWF4ID4gMCApCj4gPiArICAgICAgICAg ICAgYnJlYWs7Cj4gPiArCj4gPiArICAgICAgICBwVG1wID0gcFRtcC0+cE5leHQ7Cj4gPiArICAg IH0KPiA+ICsKPiA+ICsgICAgaWYgKCAhY29zX21heCApCj4gPiArICAgICAgICByZXR1cm4gLUVO T0VOVDsKPiA+ICAKPiA+ICAgICAgLyogSWYgb2xkIGNvcyBpcyByZWZlcnJlZCBvbmx5IGJ5IHRo ZSBkb21haW4sIHRoZW4gdXNlIGl0LiAqLwo+ID4gICAgICBpZiAoIG1hcFtvbGRfY29zXS5yZWYg PT0gMSAmJiBvbGRfY29zICE9IDAgKQo+ID4gKyAgICB7Cj4gPiArICAgICAgICBwVG1wID0gaW5m by0+cEZlYXQtPnBOZXh0Owo+ID4gKyAgICAgICAgaWYgKCBjaGVja19leGNlZWRfcmFuZ2UobWFz aywgcFRtcCwgb2xkX2NvcykgKQo+ID4gKyAgICAgICAgICAgIGdvdG8gZmluZF9uZXc7Cj4gPiAr Cj4gPiAgICAgICAgICByZXR1cm4gb2xkX2NvczsKPiA+ICsgICAgfQo+ID4gIAo+ID4gK2ZpbmRf bmV3Ogo+IAo+IExhYmVscyBpbmRlbnRlZCBieSBhdCBsZWFzdCBvbmUgYmxhbmsgcGxlYXNlLiBJ biB0aGlzIGNhc2UsIHRob3VnaCwKPiBpdCBsb29rcyBsaWtlIHlvdSBjb3VsZCBlYXNpbHkgZG8g d2l0aG91dCBhbnkgbGFiZWwgYW5kIGdvdG8uCj4gCk9rLCBJIHdpbGwgY29uc2lkZXIgbm90IHRv IHVzZSBnb3RvIGFuZCBsYWJlbCBoZXJlLiBBdCBsZWFzdCwgd2lsbCBhZGQgb25lCmJsYW5rLiBU aGFua3MhCgo+ID4gLWludCBwc3Jfc2V0X2wzX2NibShzdHJ1Y3QgZG9tYWluICpkLCB1bnNpZ25l ZCBpbnQgc29ja2V0LAo+ID4gLSAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjYm0sIGVudW0g Y2JtX3R5cGUgdHlwZSkKPiA+ICtpbnQgcHNyX3NldF92YWwoc3RydWN0IGRvbWFpbiAqZCwgdW5z aWduZWQgaW50IHNvY2tldCwKPiA+ICsgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsLCBlbnVt IG1hc2tfdHlwZSB0eXBlKQo+ID4gIHsKPiA+IC0gICAgdW5zaWduZWQgaW50IG9sZF9jb3MsIGNv c19tYXg7Cj4gPiArICAgIHVuc2lnbmVkIGludCBvbGRfY29zOwo+ID4gICAgICBpbnQgY29zLCBy ZXQ7Cj4gPiAtICAgIHVpbnQ2NF90IGNibV9kYXRhLCBjYm1fY29kZTsKPiA+IC0gICAgYm9vbF90 IGNkcF9lbmFibGVkID0gY2RwX2lzX2VuYWJsZWQoc29ja2V0KTsKPiA+IC0gICAgc3RydWN0IHBz cl9jYXRfY2JtICptYXA7Cj4gPiAtICAgIHN0cnVjdCBwc3JfY2F0X3NvY2tldF9pbmZvICppbmZv ID0gZ2V0X2NhdF9zb2NrZXRfaW5mbyhzb2NrZXQpOwo+ID4gKyAgICBzdHJ1Y3QgcHNyX3JlZiAq bWFwOwo+ID4gKyAgICB1aW50NjRfdCAqbWFzazsKPiA+ICsgICAgc3RydWN0IHBzcl9zb2NrZXRf YWxsb2NfaW5mbyAqaW5mbyA9IGdldF9zb2NrZXRfYWxsb2NfaW5mbyhzb2NrZXQpOwo+ID4gIAo+ ID4gICAgICBpZiAoIElTX0VSUihpbmZvKSApCj4gPiAgICAgICAgICByZXR1cm4gUFRSX0VSUihp bmZvKTsKPiA+ICAKPiA+IC0gICAgaWYgKCAhcHNyX2NoZWNrX2NibShpbmZvLT5jYm1fbGVuLCBj Ym0pICkKPiA+IC0gICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4gLQo+ID4gLSAgICBpZiAoICFj ZHBfZW5hYmxlZCAmJiAodHlwZSA9PSBQU1JfQ0JNX1RZUEVfTDNfQ09ERSB8fAo+ID4gLSAgICAg ICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBQU1JfQ0JNX1RZUEVfTDNfREFUQSkgKQo+ID4g LSAgICAgICAgcmV0dXJuIC1FTlhJTzsKPiA+IC0KPiA+IC0gICAgY29zX21heCA9IGluZm8tPmNv c19tYXg7Cj4gPiArICAgIG1hcCA9IGluZm8tPmNvc19yZWY7Cj4gPiAgICAgIG9sZF9jb3MgPSBk LT5hcmNoLnBzcl9jb3NfaWRzW3NvY2tldF07Cj4gPiAtICAgIG1hcCA9IGluZm8tPmNvc190b19j Ym07Cj4gPiAtCj4gPiAtICAgIHN3aXRjaCAoIHR5cGUgKQo+ID4gLSAgICB7Cj4gPiAtICAgIGNh c2UgUFNSX0NCTV9UWVBFX0wzOgo+ID4gLSAgICAgICAgY2JtX2NvZGUgPSBjYm07Cj4gPiAtICAg ICAgICBjYm1fZGF0YSA9IGNibTsKPiA+IC0gICAgICAgIGJyZWFrOwo+ID4gLQo+ID4gLSAgICBj YXNlIFBTUl9DQk1fVFlQRV9MM19DT0RFOgo+ID4gLSAgICAgICAgY2JtX2NvZGUgPSBjYm07Cj4g PiAtICAgICAgICBjYm1fZGF0YSA9IG1hcFtvbGRfY29zXS5kYXRhOwo+ID4gLSAgICAgICAgYnJl YWs7Cj4gPiAtCj4gPiAtICAgIGNhc2UgUFNSX0NCTV9UWVBFX0wzX0RBVEE6Cj4gPiAtICAgICAg ICBjYm1fY29kZSA9IG1hcFtvbGRfY29zXS5jb2RlOwo+ID4gLSAgICAgICAgY2JtX2RhdGEgPSBj Ym07Cj4gPiAtICAgICAgICBicmVhazsKPiA+ICAKPiA+IC0gICAgZGVmYXVsdDoKPiA+IC0gICAg ICAgIEFTU0VSVF9VTlJFQUNIQUJMRSgpOwo+ID4gLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4g PiAtICAgIH0KPiA+ICsgICAgLyogQ29uc2lkZXJpbmcgQ0RQIGxpa2luZyBmZWF0dXJlcyAqLwo+ IAo+IERZTSAibGlrZSI/IEFuZCB3aGF0IGRvIHlvdSB3YW50IHRvIHNheSB3aXRoIHRoaXMgY29t bWVudD8KPiAKWWVzLCAibGlrZSIgc2hvdWxkIGJlLiBDRFAgbmVlZHMgb2NjdXB5IHR3byBtZW1i ZXJzIGluIG1hc2sgYXJyYXkuIFNvLCBJCm1ha2UgbnJfZmVhdCBtdWx0aXBseSAyIGFzIHRoZSBh cnJheSBzaXplLgoKPiA+ICsgICAgbWFzayA9IHh6YWxsb2NfYXJyYXkodWludDY0X3QsIGluZm8t Pm5yX2ZlYXQgKiAyKTsKPiAKPiBQZXJoYXBzIGl0J3MgcmVsYXRlZCB0byB0aGUgZG91Ymxpbmcg b2YgbnJfZmVhdCBoZXJlPyBJZiBzbyAtIHdoYXQKPiBwcmVjbHVkZXMgYW5vdGhlciBmdXR1cmUg ZmVhdHVyZSB0byByZXF1aXJlIDMgb3IgNCBzbG90cyBwZXIgZWxlbWVudD8KPiBJIHRoaW5rIHRo aXMgbmVlZHMgYWJzdHJhY3Rpbmcgb3V0LCBub3cgdGhhdCB5b3UgY3JlYXRlIGFuIGFic3RyYWN0 Cj4gZnJhbWV3b3JrLgo+IApHb29kIHBvaW50LiBJIHdpbGwgY29uc2lkZXIgaXQuCgo+ID4gKyAg ICBpZiAoIChyZXQgPSBnZXRfb2xkX3NldF9uZXcobWFzaywgaW5mbywgb2xkX2NvcywgdHlwZSwg dmFsKSkgIT0gMCApCj4gCj4gV2hhdCBpZiB0aGUgeHphbGxvY19hcnJheSgpIHJldHVybmVkIE5V TEw/Cj4gClNvcnJ5LCBtaXNzZWQgdGhlIGNoZWNrLgoKPiA+ICsgICAgICAgIHJldHVybiByZXQ7 Cj4gPiAgCj4gPiAtICAgIHNwaW5fbG9jaygmaW5mby0+Y2JtX2xvY2spOwo+ID4gLSAgICBjb3Mg PSBmaW5kX2NvcyhtYXAsIGNvc19tYXgsIGNibV9jb2RlLCBjYm1fZGF0YSwgY2RwX2VuYWJsZWQp Owo+ID4gKyAgICBzcGluX2xvY2soJmluZm8tPm1hc2tfbG9jayk7Cj4gPiArICAgIGNvcyA9IGZp bmRfY29zKG1hc2ssIHR5cGUsIGluZm8pOwo+ID4gICAgICBpZiAoIGNvcyA+PSAwICkKPiA+ICAg ICAgewo+ID4gICAgICAgICAgaWYgKCBjb3MgPT0gb2xkX2NvcyApCj4gPiAgICAgICAgICB7Cj4g PiAtICAgICAgICAgICAgc3Bpbl91bmxvY2soJmluZm8tPmNibV9sb2NrKTsKPiA+ICsgICAgICAg ICAgICBzcGluX3VubG9jaygmaW5mby0+bWFza19sb2NrKTsKPiA+ICsgICAgICAgICAgICB4ZnJl ZShtYXNrKTsKPiA+ICAgICAgICAgICAgICByZXR1cm4gMDsKPiA+ICAgICAgICAgIH0KPiA+ICAg ICAgfQo+ID4gICAgICBlbHNlCj4gPiAgICAgIHsKPiA+IC0gICAgICAgIGNvcyA9IHBpY2tfYXZh aWxfY29zKG1hcCwgY29zX21heCwgb2xkX2Nvcyk7Cj4gPiArICAgICAgICBjb3MgPSBhbGxvY19u ZXdfY29zKGluZm8sIG1hc2ssIG9sZF9jb3MsIHR5cGUpOwo+ID4gICAgICAgICAgaWYgKCBjb3Mg PCAwICkKPiA+ICAgICAgICAgIHsKPiA+IC0gICAgICAgICAgICBzcGluX3VubG9jaygmaW5mby0+ Y2JtX2xvY2spOwo+ID4gKyAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZpbmZvLT5tYXNrX2xvY2sp Owo+ID4gKyAgICAgICAgICAgIHhmcmVlKG1hc2spOwo+ID4gICAgICAgICAgICAgIHJldHVybiBj b3M7Cj4gPiAgICAgICAgICB9Cj4gPiAgCj4gPiAtICAgICAgICAvKiBXZSB0cnkgdG8gYXZvaWQg d3JpdGluZyBNU1IuICovCj4gPiAtICAgICAgICBpZiAoIChjZHBfZW5hYmxlZCAmJgo+ID4gLSAg ICAgICAgICAgICAobWFwW2Nvc10uY29kZSAhPSBjYm1fY29kZSB8fCBtYXBbY29zXS5kYXRhICE9 IGNibV9kYXRhKSkgfHwKPiA+IC0gICAgICAgICAgICAgKCFjZHBfZW5hYmxlZCAmJiBtYXBbY29z XS5jYm0gIT0gY2JtX2NvZGUpICkKPiA+ICsgICAgICAgIC8qIFdyaXRlIGFsbCBmZWF0dXJlcyBt YXNrIE1TUnMgY29ycmVzcG9uZGluZyB0byB0aGUgQ09TICovCj4gPiArICAgICAgICByZXQgPSB3 cml0ZV9wc3JfcmVmKHNvY2tldCwgY29zLCBtYXNrKTsKPiA+ICsgICAgICAgIGlmICggcmV0ICkK PiA+ICAgICAgICAgIHsKPiA+IC0gICAgICAgICAgICByZXQgPSB3cml0ZV9sM19jYm0oc29ja2V0 LCBjb3MsIGNibV9jb2RlLCBjYm1fZGF0YSwgY2RwX2VuYWJsZWQpOwo+ID4gLSAgICAgICAgICAg IGlmICggcmV0ICkKPiA+IC0gICAgICAgICAgICB7Cj4gPiAtICAgICAgICAgICAgICAgIHNwaW5f dW5sb2NrKCZpbmZvLT5jYm1fbG9jayk7Cj4gPiAtICAgICAgICAgICAgICAgIHJldHVybiByZXQ7 Cj4gPiAtICAgICAgICAgICAgfQo+ID4gLSAgICAgICAgICAgIG1hcFtjb3NdLmNvZGUgPSBjYm1f Y29kZTsKPiA+IC0gICAgICAgICAgICBtYXBbY29zXS5kYXRhID0gY2JtX2RhdGE7Cj4gPiArICAg ICAgICAgICAgc3Bpbl91bmxvY2soJmluZm8tPm1hc2tfbG9jayk7Cj4gPiArICAgICAgICAgICAg eGZyZWUobWFzayk7Cj4gPiArICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICAgICAgICAgIH0K PiA+ICAgICAgfQo+ID4gIAo+ID4gICAgICBtYXBbY29zXS5yZWYrKzsKPiA+ICAgICAgbWFwW29s ZF9jb3NdLnJlZi0tOwo+ID4gLSAgICBzcGluX3VubG9jaygmaW5mby0+Y2JtX2xvY2spOwo+ID4g Kwo+ID4gKyAgICBzcGluX3VubG9jaygmaW5mby0+bWFza19sb2NrKTsKPiA+ICAKPiA+ICAgICAg ZC0+YXJjaC5wc3JfY29zX2lkc1tzb2NrZXRdID0gY29zOwo+ID4gKyAgICB4ZnJlZShtYXNrKTsK PiA+ICsgICAgbWFzayA9IE5VTEw7Cj4gPiAgCj4gPiAgICAgIHJldHVybiAwOwo+IAo+IEkgZG9u J3QgdGhpbmsgc2V0dGluZyBtYXNrIHRvIE5VTEwgcmlnaHQgYWhlYWQgb2YgYSByZXR1cm4gc3Rh dGVtZW50Cj4gaXMgdmVyeSBoZWxwZnVsLgo+IApZZXMsIHRoaXMgc2VudGVuY2UgY2FuIGJlIHJl bW92ZWQuCgo+ID4gLXN0YXRpYyB2b2lkIGNhdF9jcHVfaW5pdCh2b2lkKQo+ID4gK3N0YXRpYyB2 b2lkIGludGVybmFsX2NwdV9pbml0KHZvaWQpCj4gCj4gSXMgImludGVybmFsXyIgcmVhbGx5IGEg dXNlZnVsIHByZWZpeCBoZXJlPwo+IApJIHdhbnRlZCB0byBleHByZXNzIHRoaXMgaXMgYW4gaW50 ZXJuYWwgZnVuY3Rpb24gaW4gcHNyLmMgdG8gc2VwYXJhdGUgaXQgZnJvbQpwc3JfY3B1X2luaXQo KS4KCj4gPiAgewo+ID4gICAgICB1bnNpZ25lZCBpbnQgZWF4LCBlYngsIGVjeCwgZWR4Owo+ID4g LSAgICBzdHJ1Y3QgcHNyX2NhdF9zb2NrZXRfaW5mbyAqaW5mbzsKPiA+ICsgICAgc3RydWN0IHBz cl9zb2NrZXRfYWxsb2NfaW5mbyAqaW5mbzsKPiA+ICAgICAgdW5zaWduZWQgaW50IHNvY2tldDsK PiA+ICAgICAgdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKPiA+IC0gICAg dWludDY0X3QgdmFsOwo+ID4gICAgICBjb25zdCBzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVf ZGF0YSArIGNwdTsKPiA+ICsgICAgc3RydWN0IGZlYXRfbGlzdCAqcFRtcDsKPiA+ICAKPiA+ICAg ICAgaWYgKCAhY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9QUUUpIHx8IGMtPmNwdWlkX2xldmVsIDwg UFNSX0NQVUlEX0xFVkVMX0NBVCApCj4gPiAgICAgICAgICByZXR1cm47Cj4gPiAgCj4gPiAgICAg IHNvY2tldCA9IGNwdV90b19zb2NrZXQoY3B1KTsKPiA+IC0gICAgaWYgKCB0ZXN0X2JpdChzb2Nr ZXQsIGNhdF9zb2NrZXRfZW5hYmxlKSApCj4gPiArICAgIGluZm8gPSBzb2NrZXRfYWxsb2NfaW5m byArIHNvY2tldDsKPiA+ICsgICAgaWYgKCBpbmZvLT5mZWF0dXJlcyApCj4gPiAgICAgICAgICBy ZXR1cm47Cj4gPiAgCj4gPiAgICAgIGNwdWlkX2NvdW50KFBTUl9DUFVJRF9MRVZFTF9DQVQsIDAs ICZlYXgsICZlYngsICZlY3gsICZlZHgpOwo+ID4gICAgICBpZiAoIGVieCAmIFBTUl9SRVNPVVJD RV9UWVBFX0wzICkKPiA+ICAgICAgewo+ID4gLSAgICAgICAgY3B1aWRfY291bnQoUFNSX0NQVUlE X0xFVkVMX0NBVCwgMSwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7Cj4gPiAtICAgICAgICBpbmZv ID0gY2F0X3NvY2tldF9pbmZvICsgc29ja2V0Owo+ID4gLSAgICAgICAgaW5mby0+Y2JtX2xlbiA9 IChlYXggJiAweDFmKSArIDE7Cj4gPiAtICAgICAgICBpbmZvLT5jb3NfbWF4ID0gbWluKG9wdF9j b3NfbWF4LCBlZHggJiAweGZmZmYpOwo+ID4gLQo+ID4gLSAgICAgICAgaW5mby0+Y29zX3RvX2Ni bSA9IHRlbXBfY29zX3RvX2NibTsKPiA+IC0gICAgICAgIHRlbXBfY29zX3RvX2NibSA9IE5VTEw7 Cj4gPiAtICAgICAgICAvKiBjb3M9MCBpcyByZXNlcnZlZCBhcyBkZWZhdWx0IGNibShhbGwgb25l cykuICovCj4gPiAtICAgICAgICBpbmZvLT5jb3NfdG9fY2JtWzBdLmNibSA9ICgxdWxsIDw8IGlu Zm8tPmNibV9sZW4pIC0gMTsKPiA+ICsgICAgICAgIHBUbXAgPSBwTDNDQVQ7Cj4gPiArICAgICAg ICBpZiAoICFwVG1wICkKPiA+ICsgICAgICAgICAgICByZXR1cm47Cj4gCj4gWW91IGNoZWNrIHRo ZSBhbGxvY2F0aW9uIHJlc3VsdCBpbiBpbnRlcm5hbF9jcHVfcHJlcGFyZSgpIC0gY2FuIHlvdQo+ IHJlYWxseSBnZXQgaGVyZSB3aXRoIHRoaXMgYmVpbmcgTlVMTD8gSWYgeW91IGNhbid0LCBkcm9w IHRoZSBpZigpIChvcgo+IG1ha2UgaXQgYW4gQVNTRVJUKCkpLgo+IApPaywgdGhhbmtzIQoKPiA+ ICsgICAgICAgIHBMM0NBVCA9IE5VTEw7Cj4gPiAgCj4gPiAtICAgICAgICBzcGluX2xvY2tfaW5p dCgmaW5mby0+Y2JtX2xvY2spOwo+ID4gLQo+ID4gLSAgICAgICAgc2V0X2JpdChzb2NrZXQsIGNh dF9zb2NrZXRfZW5hYmxlKTsKPiA+IC0KPiA+IC0gICAgICAgIGlmICggKGVjeCAmIFBTUl9DQVRf Q0RQX0NBUEFCSUxJVFkpICYmIChvcHRfcHNyICYgUFNSX0NEUCkgJiYKPiA+IC0gICAgICAgICAg ICAgY2RwX3NvY2tldF9lbmFibGUgJiYgIXRlc3RfYml0KHNvY2tldCwgY2RwX3NvY2tldF9lbmFi bGUpICkKPiA+IC0gICAgICAgIHsKPiA+IC0gICAgICAgICAgICBpbmZvLT5jb3NfdG9fY2JtWzBd LmNvZGUgPSAoMXVsbCA8PCBpbmZvLT5jYm1fbGVuKSAtIDE7Cj4gPiAtICAgICAgICAgICAgaW5m by0+Y29zX3RvX2NibVswXS5kYXRhID0gKDF1bGwgPDwgaW5mby0+Y2JtX2xlbikgLSAxOwo+ID4g LQo+ID4gLSAgICAgICAgICAgIC8qIFdlIG9ubHkgd3JpdGUgbWFzazEgc2luY2UgbWFzazAgaXMg YWx3YXlzIGFsbCBvbmVzIGJ5IGRlZmF1bHQuICovCj4gPiAtICAgICAgICAgICAgd3Jtc3JsKE1T Ul9JQTMyX1BTUl9MM19NQVNLKDEpLCAoMXVsbCA8PCBpbmZvLT5jYm1fbGVuKSAtIDEpOwo+ID4g LQo+ID4gLSAgICAgICAgICAgIHJkbXNybChNU1JfSUEzMl9QU1JfTDNfUU9TX0NGRywgdmFsKTsK PiA+IC0gICAgICAgICAgICB3cm1zcmwoTVNSX0lBMzJfUFNSX0wzX1FPU19DRkcsIHZhbCB8ICgx IDw8IFBTUl9MM19RT1NfQ0RQX0VOQUJMRV9CSVQpKTsKPiA+IC0KPiA+IC0gICAgICAgICAgICAv KiBDdXQgaGFsZiBvZiBjb3NfbWF4IHdoZW4gQ0RQIGlzIGVuYWJsZWQuICovCj4gPiAtICAgICAg ICAgICAgaW5mby0+Y29zX21heCA+Pj0gMTsKPiA+IC0KPiA+IC0gICAgICAgICAgICBzZXRfYml0 KHNvY2tldCwgY2RwX3NvY2tldF9lbmFibGUpOwo+ID4gLSAgICAgICAgfQo+ID4gLSAgICAgICAg cHJpbnRrKFhFTkxPR19JTkZPICJDQVQ6IGVuYWJsZWQgb24gc29ja2V0ICV1LCBjb3NfbWF4OiV1 LCBjYm1fbGVuOiV1LCBDRFA6JXNcbiIsCj4gPiAtICAgICAgICAgICAgICAgc29ja2V0LCBpbmZv LT5jb3NfbWF4LCBpbmZvLT5jYm1fbGVuLAo+ID4gLSAgICAgICAgICAgICAgIGNkcF9pc19lbmFi bGVkKHNvY2tldCkgPyAib24iIDogIm9mZiIpOwo+ID4gKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0 aGlzIGZlYXR1cmUgYWNjb3JkaW5nIHRvIENQVUlELiAqLwo+ID4gKyAgICAgICAgY3B1aWRfY291 bnQoUFNSX0NQVUlEX0xFVkVMX0NBVCwgMSwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7Cj4gPiAr ICAgICAgICBwVG1wLT5vcHMgPSBsM19jYXRfb3BzOwo+ID4gKyAgICAgICAgcFRtcC0+b3BzLmlu aXRfZmVhdHVyZShlYXgsIGVieCwgZWN4LCBlZHgsIHBUbXAsIGluZm8pOwo+IAo+IFRoaXMgZnVu Y3Rpb24gY2FuIHJldHVybiB3aXRob3V0IGhhdmluZyBjb25zdW1lZCBwVG1wLCB3aGljaCBtZWFu cwo+IHlvdSdkIGxlYWsgdGhlIG1lbW9yeSBpbiB0aGF0IGNhc2UuCj4gClllcywgcmlnaHQsIHRo aXMgaXMgYnkgZGVzaWduLiBwTDNDQVQvcEwyQ0FUIGFyZSBhbGxvY2F0ZWQgaW4KaW50ZXJuYWxf Y3B1X3ByZXBhcmUoKS4gSWYgdGhpcyBDUFUgZG9lcyBub3Qgc3VwcG9ydCBMMiBDQVQgZm9yIGV4 YW1wbGUsIHRoZQpwTDJDQVQgd2lsbCBub3QgYmUgYWRkZWQgaW50byBmZWF0dXJlIGxpc3QuIEJ1 dCB3aGVuIENQVSBvbiBvdGhlciBzb2NrZXQgdXAsCmludGVybmFsX2NwdV9wcmVwYXJlKCkgd2ls bCBiZSBjYWxsZWQgYWdhaW4gYW5kIHRoZSBwTDJDQVQgd2lsbCBub3QgYmUKYWxsb2NhdGVkIGFn YWluIChjaGVjayBpZiBpdCBpcyBOVUxMKS4gV2UgY2FuIHVzZSB0aGUgYnVmZmVyIGhhcyBiZWVu IGFsbG9jYXRlZC4KVGhhdCBtZWFucyB3ZSBtYWludGFpbiBvbmUgcmVkdW5kYW50IGJ1ZmZlciB0 byBzaW1wbGlmeSB0aGUgY29kZXMuCgo+ID4gLXN0YXRpYyB2b2lkIF9faW5pdCBwc3JfY2F0X2Zy ZWUodm9pZCkKPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQgcHNyX2ZyZWUodm9pZCkKPiA+ICB7Cj4g PiAtICAgIHhmcmVlKGNhdF9zb2NrZXRfZW5hYmxlKTsKPiA+IC0gICAgY2F0X3NvY2tldF9lbmFi bGUgPSBOVUxMOwo+ID4gLSAgICB4ZnJlZShjYXRfc29ja2V0X2luZm8pOwo+ID4gLSAgICBjYXRf c29ja2V0X2luZm8gPSBOVUxMOwo+ID4gKyAgICBpbnQgaTsKPiAKPiB1bnNpZ25lZCBpbnQKPiAK V2lsbCBjaGFuZ2UgaXQuIFRoYW5rcyEKCj4gPiAtc3RhdGljIHZvaWQgX19pbml0IGluaXRfcHNy X2NhdCh2b2lkKQo+ID4gK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X3Bzcih2b2lkKQo+ID4gIHsK PiA+ICsgICAgaW50IGk7Cj4gCj4gQWdhaW4uCj4gCldpbGwgY2hhbmdlIGl0LiBUaGFua3MhCgo+ ID4gKwo+ID4gICAgICBpZiAoIG9wdF9jb3NfbWF4IDwgMSApCj4gPiAgICAgIHsKPiA+ICAgICAg ICAgIHByaW50ayhYRU5MT0dfSU5GTyAiQ0FUOiBkaXNhYmxlZCwgY29zX21heCBpcyB0b28gc21h bGxcbiIpOwo+ID4gICAgICAgICAgcmV0dXJuOwo+ID4gICAgICB9Cj4gPiAgCj4gPiAtICAgIGNh dF9zb2NrZXRfZW5hYmxlID0geHphbGxvY19hcnJheSh1bnNpZ25lZCBsb25nLCBCSVRTX1RPX0xP TkdTKG5yX3NvY2tldHMpKTsKPiA+IC0gICAgY2F0X3NvY2tldF9pbmZvID0geHphbGxvY19hcnJh eShzdHJ1Y3QgcHNyX2NhdF9zb2NrZXRfaW5mbywgbnJfc29ja2V0cyk7Cj4gPiAtICAgIGNkcF9z b2NrZXRfZW5hYmxlID0geHphbGxvY19hcnJheSh1bnNpZ25lZCBsb25nLCBCSVRTX1RPX0xPTkdT KG5yX3NvY2tldHMpKTsKPiA+ICsgICAgc29ja2V0X2FsbG9jX2luZm8gPSB4emFsbG9jX2FycmF5 KHN0cnVjdCBwc3Jfc29ja2V0X2FsbG9jX2luZm8sIG5yX3NvY2tldHMpOwo+ID4gKwo+ID4gKyAg ICBpZiAoICFzb2NrZXRfYWxsb2NfaW5mbyApCj4gPiArICAgIHsKPiA+ICsgICAgICAgIHByaW50 ayhYRU5MT0dfSU5GTyAiRmFpbCB0byBhbGxvYyBzb2NrZXRfYWxsb2NfaW5mbyFcbiIpOwo+ID4g KyAgICAgICAgcmV0dXJuOwo+ID4gKyAgICB9Cj4gPiAgCj4gPiAtICAgIGlmICggIWNhdF9zb2Nr ZXRfZW5hYmxlIHx8ICFjYXRfc29ja2V0X2luZm8gKQo+ID4gLSAgICAgICAgcHNyX2NhdF9mcmVl KCk7Cj4gPiArICAgIGZvciAoIGkgPSAwOyBpIDwgbnJfc29ja2V0czsgaSsrICkKPiA+ICsgICAg ewo+ID4gKyAgICAgICAgc29ja2V0X2FsbG9jX2luZm9baV0ucEZlYXQgPSAgeHphbGxvYyhzdHJ1 Y3QgZmVhdF9saXN0KTsKPiAKPiBXaGF0J3MgdGhlIHBvaW50IG9mIHRoaXMgZHVtbXkgbGlzdCBl bGVtZW50Pwo+IApUaGUgcEZlYXQgaXMgYSByZWR1bmRhbnQgbGlzdCBoZWFkIHRvIGZhY2lsaXRh dGUgbGlzdCBvcGVyYXRpb25zLgpXaXRoIHRoaXMgbGlzdCBoZWFkLCB0aGUgYWR2YW50YWdlIGlz IHRoYXQgd2UgY2FuIGluc2VydC9kZWxldGUgdGhlIGZpcnN0CmVsZW1lbnQgc2FtZSBhcyBvdGhl cnMgd2l0aG91dCBzcGVjaWFsIG9wZXJhdGlvbnMuCgo+ID4gKyAgICAgICAgaWYgKCBOVUxMID09 IHNvY2tldF9hbGxvY19pbmZvW2ldLnBGZWF0ICkKPiA+ICsgICAgICAgIHsKPiA+ICsgICAgICAg ICAgICBwcmludGsoWEVOTE9HX0lORk8gIkZhaWwgdG8gYWxsb2MgcEZlYXQhXG4iKTsKPiAKPiBI b3cgd291bGQgdGhlIHJlYWRlciBvZiB0aGUgbG9nIGVhc2lseSBhc3NvY2lhdGUgc3VjaCBhIG1l c3NhZ2UKPiB3aXRoIHNvbWV0aGluZyBoYXZpbmcgZ29uZSB3cm9uZyBpbiBQU1IgaW5pdGlhbGl6 YXRpb24/Cj4gClllcywgc2VlbXMgbm90IG5lY2Vzc2FyeS4gV2lsbCByZW1vdmUgaXQuCgo+ID4g KyAgICAgICAgICAgIHJldHVybjsKPiA+ICsgICAgICAgIH0KPiA+ICsgICAgICAgIHNvY2tldF9h bGxvY19pbmZvW2ldLnBGZWF0LT5wTmV4dCA9IE5VTEw7Cj4gCj4gVGhpcyBpcyByZWR1bmRhbnQg d2l0aCB0aGUgdXNlIG9mIHh6YWxsb2MoKS4KPiAKV2lsbCByZW1vdmUgaXQsIHRoYW5rcyEKCj4g PiAgc3RhdGljIHZvaWQgcHNyX2NwdV9pbml0KHZvaWQpCj4gPiAgewo+ID4gLSAgICBpZiAoIGNh dF9zb2NrZXRfaW5mbyApCj4gPiAtICAgICAgICBjYXRfY3B1X2luaXQoKTsKPiA+ICsgICAgdW5z aWduZWQgaW50IHNvY2tldDsKPiA+ICsgICAgc3RydWN0IHBzcl9zb2NrZXRfYWxsb2NfaW5mbyAq aW5mbzsKPiA+ICsKPiA+ICsgICAgaWYgKCBzb2NrZXRfYWxsb2NfaW5mbyApCj4gPiArICAgIHsK PiA+ICsgICAgICAgIHNvY2tldCA9IGNwdV90b19zb2NrZXQoc21wX3Byb2Nlc3Nvcl9pZCgpKTsK PiA+ICsgICAgICAgIGluZm8gPSBzb2NrZXRfYWxsb2NfaW5mbyArIHNvY2tldDsKPiA+ICsgICAg ICAgIGluZm8tPmNvc19yZWYgPSB0ZW1wX2Nvc19yZWY7Cj4gPiArICAgICAgICB0ZW1wX2Nvc19y ZWYgPSBOVUxMOwo+ID4gKyAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmluZm8tPm1hc2tfbG9jayk7 Cj4gPiArCj4gPiArICAgICAgICBpbnRlcm5hbF9jcHVfaW5pdCgpOwo+IAo+IFdoeSBpcyBldmVy eXRoaW5nIGFoZWFkIG9mIHRoaXMgY2FsbCBub3QgcGFydCBvZiB0aGF0IGZ1bmN0aW9uPwo+IApU aGUgb3JpZ2luYWwgcHVycG9zZSBpcyB0byBtYWtlIGludGVybmFsX2NwdV9pbml0KCkgYmUgc2lt cGxlci4gQWZ0ZXIKY29uc2lkZXJpbmcgaXQgYWdhaW4sIG1vdmUgdGhlc2UgY29kZXMgaW50byB0 aGUgZnVuY3Rpb24gbWF5IGJlIGJldHRlci4KVGhhbmtzIQoKPiA+IC0tLSBhL3hlbi9pbmNsdWRl L2FzbS14ODYvcHNyLmgKPiA+ICsrKyBiL3hlbi9pbmNsdWRlL2FzbS14ODYvcHNyLmgKPiA+IEBA IC00NiwxMCArNDYsMTAgQEAgc3RydWN0IHBzcl9jbXQgewo+ID4gICAgICBzdHJ1Y3QgcHNyX2Nt dF9sMyBsMzsKPiA+ICB9Owo+ID4gIAo+ID4gLWVudW0gY2JtX3R5cGUgewo+ID4gLSAgICBQU1Jf Q0JNX1RZUEVfTDMsCj4gPiAtICAgIFBTUl9DQk1fVFlQRV9MM19DT0RFLAo+ID4gLSAgICBQU1Jf Q0JNX1RZUEVfTDNfREFUQSwKPiA+ICtlbnVtIG1hc2tfdHlwZSB7Cj4gPiArICAgIFBTUl9NQVNL X1RZUEVfTDNfQ0JNLAo+ID4gKyAgICBQU1JfTUFTS19UWVBFX0wzX0NPREUsCj4gPiArICAgIFBT Ul9NQVNLX1RZUEVfTDNfREFUQSwKPiA+ICB9Owo+IAo+IFRoZSBlbnVtIHRhZyBpcyBub3cgdG9v IGdlbmVyaWMgYSBuYW1lIC0gcGxlYXNlIG1ha2UgdGhpcwo+IHBzcl9tYXNrX3R5cGUgb3Igc29t ZXRoaW5nIHNpbWlsYXIuCj4gCk9rLCB0aGFua3MhCgo+IEphbgoKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4t ZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVsCg==