From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 75DAE47175; Sat, 3 Jan 2026 18:53:13 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id AADF440267; Sat, 3 Jan 2026 18:53:12 +0100 (CET) Received: from dkmailrelay1.smartsharesystems.com (smartserver.smartsharesystems.com [77.243.40.215]) by mails.dpdk.org (Postfix) with ESMTP id 35E4640262 for ; Sat, 3 Jan 2026 18:53:11 +0100 (CET) Received: from smartserver.smartsharesystems.com (smartserver.smartsharesys.local [192.168.4.10]) by dkmailrelay1.smartsharesystems.com (Postfix) with ESMTP id 45D3B208CF; Sat, 3 Jan 2026 18:53:10 +0100 (CET) Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 Subject: RE: [PATCH v5] eal/x86: optimize memcpy of small sizes Date: Sat, 3 Jan 2026 18:53:08 +0100 Message-ID: <98CBD80474FA8B44BF855DF32C47DC35F6561B@smartserver.smartshare.dk> X-MimeOLE: Produced By Microsoft Exchange V6.5 In-Reply-To: <20251201155525.1538260-1-mb@smartsharesystems.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH v5] eal/x86: optimize memcpy of small sizes Thread-Index: Adxi2uy53ykX+C/DTau4jitEo9BWDQZ/oyuA References: <20251120114554.950287-1-mb@smartsharesystems.com> <20251201155525.1538260-1-mb@smartsharesystems.com> From: =?UTF-8?B?TW9ydGVuIEJyw7hydXA=?= To: , "Bruce Richardson" , "Konstantin Ananyev" , "Vipin Varghese" Cc: "Stephen Hemminger" X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org UElORyBmb3IgcmV2aWV3Lg0KDQpSZWdhcmRsZXNzIGlmIHlvdSAtIGZvciBnb29kIGFuZCB2YWxp ZCByZWFzb25zIC0gZ2VuZXJhbGx5IHByZWZlciBtZW1jcHkoKSBvdmVyIHJ0ZV9tZW1jcHkoKSwg cnRlX21lbWNweSgpIGlzIG5vdCBkZXByZWNhdGVkIG9yIGJlaW5nIHBoYXNlZCBvdXQsIHNvIGlt cHJvdmVtZW50cyBzaG91bGQgYmUgYWxsb3dlZC4NCg0KDQo+IEZyb206IE1vcnRlbiBCcsO4cnVw IFttYWlsdG86bWJAc21hcnRzaGFyZXN5c3RlbXMuY29tXQ0KPiBTZW50OiBNb25kYXksIDEgRGVj ZW1iZXIgMjAyNSAxNi41NQ0KPiANCj4gZWFsL3g4Njogb3B0aW1pemUgbWVtY3B5IG9mIHNtYWxs IHNpemVzDQo+IA0KPiBUaGUgaW1wbGVtZW50YXRpb24gZm9yIGNvcHlpbmcgdXAgdG8gNjQgYnl0 ZXMgZG9lcyBub3QgZGVwZW5kIG9uDQo+IGFkZHJlc3MNCj4gYWxpZ25tZW50IHdpdGggdGhlIHNp emUgb2YgdGhlIENQVSdzIHZlY3RvciByZWdpc3RlcnMsIHNvIHRoZSBjb2RlDQo+IGhhbmRsaW5n IHRoaXMgd2FzIG1vdmVkIGZyb20gdGhlIHZhcmlvdXMgaW1wbGVtZW50YXRpb25zIHRvIHRoZSBj b21tb24NCj4gZnVuY3Rpb24uDQo+IA0KPiBGdXJ0aGVybW9yZSwgdGhlIGZ1bmN0aW9uIGZvciBj b3B5aW5nIGxlc3MgdGhhbiAxNiBieXRlcyB3YXMgcmVwbGFjZWQNCj4gd2l0aA0KPiBhIHNtYXJ0 ZXIgaW1wbGVtZW50YXRpb24gdXNpbmcgZmV3ZXIgYnJhbmNoZXMgYW5kIHBvdGVudGlhbGx5IGZl d2VyDQo+IGxvYWQvc3RvcmUgb3BlcmF0aW9ucy4NCj4gVGhpcyBmdW5jdGlvbiB3YXMgYWxzbyBl eHRlbmRlZCB0byBoYW5kbGUgY29weWluZyBvZiB1cCB0byAxNiBieXRlcywNCj4gaW5zdGVhZCBv ZiB1cCB0byAxNSBieXRlcy4gVGhpcyBzbWFsbCBleHRlbnNpb24gcmVkdWNlcyB0aGUgY29kZSBw YXRoDQo+IGZvcg0KPiBjb3B5aW5nIHR3byBwb2ludGVycy4NCj4gDQo+IFRoZXNlIGNoYW5nZXMg cHJvdmlkZSB0d28gYmVuZWZpdHM6DQo+IDEuIFRoZSBtZW1vcnkgZm9vdHByaW50IG9mIHRoZSBj b3B5IGZ1bmN0aW9uIGlzIHJlZHVjZWQuDQo+IFByZXZpb3VzbHkgdGhlcmUgd2VyZSB0d28gaW5z dGFuY2VzIG9mIHRoZSBjb21waWxlZCBjb2RlIHRvIGNvcHkgdXAgdG8NCj4gNjQNCj4gYnl0ZXMs IG9uZSBpbiB0aGUgImFsaWduZWQiIGNvZGUgcGF0aCwgYW5kIG9uZSBpbiB0aGUgImdlbmVyaWMi IGNvZGUNCj4gcGF0aC4NCj4gTm93IHRoZXJlIGlzIG9ubHkgb25lIGluc3RhbmNlLCBpbiB0aGUg ImNvbW1vbiIgY29kZSBwYXRoLg0KPiAyLiBUaGUgcGVyZm9ybWFuY2UgZm9yIGNvcHlpbmcgdXAg dG8gNjQgYnl0ZXMgaXMgaW1wcm92ZWQuDQo+IFRoZSBtZW1jcHkgcGVyZm9ybWFuY2UgdGVzdCBz aG93cyBjYWNoZS10by1jYWNoZSBjb3B5aW5nIG9mIHVwIHRvIDMyDQo+IGJ5dGVzDQo+IG5vdyB0 eXBpY2FsbHkgb25seSB0YWtlcyAyIGN5Y2xlcyAoNCBjeWNsZXMgZm9yIDY0IGJ5dGVzKSB2ZXJz dXMNCj4gY2EuIDYuNSBjeWNsZXMgYmVmb3JlIHRoaXMgcGF0Y2guDQo+IA0KPiBBbmQgZmluYWxs eSwgdGhlIG1pc3NpbmcgaW1wbGVtZW50YXRpb24gb2YgcnRlX21vdjQ4KCkgd2FzIGFkZGVkLg0K PiANCj4gU2lnbmVkLW9mZi1ieTogTW9ydGVuIEJyw7hydXAgPG1iQHNtYXJ0c2hhcmVzeXN0ZW1z LmNvbT4NCj4gLS0tDQo+IHY1Og0KPiAqIFJldmVydGVkIHY0OiBSZXBsYWNlIFNTRTIgX21tX2xv YWR1X3NpMTI4KCkgd2l0aCBTU0UzDQo+IF9tbV9sZGRxdV9zaTEyOCgpLg0KPiAgIEl0IHdhcyBz bG93ZXIuDQo+ICogSW1wcm92ZWQgc29tZSBjb21tZW50cy4gKEtvbnN0YW50aW4gQW5hbnlldikN Cj4gKiBNb3ZlZCB0aGUgc2l6ZSByYW5nZSAxNy4uMzIgaW5zaWRlIHRoZSBzaXplIDw9IDY0IGJy YW5jaCwgc28gd2hlbg0KPiAgIGJ1aWxkaW5nIGZvciBTU0UsIHRoZSBnZW5lcmF0ZWQgY29kZSBj YW4gc3RhcnQgY29weWluZyB0aGUgZmlyc3QNCj4gICAxNiBieXRlcyBiZWZvcmUgY29tcGFyaW5n IGlmIHRoZSBzaXplIGlzIGdyZWF0ZXIgdGhhbiAzMiBvciBub3QuDQo+ICogSnVzdCByZXF1aXJl IFJURV9NRU1DUFlfQVZYIGZvciB1c2luZyBydGVfbW92MzIoKSBpbg0KPiBydGVfbW92MzNfdG9f NjQoKS4NCj4gdjQ6DQo+ICogUmVwbGFjZSBTU0UyIF9tbV9sb2FkdV9zaTEyOCgpIHdpdGggU1NF MyBfbW1fbGRkcXVfc2kxMjgoKS4NCj4gdjM6DQo+ICogRml4ZWQgdHlwbyBpbiBjb21tZW50Lg0K PiB2MjoNCj4gKiBVcGRhdGVkIHBhdGNoIHRpdGxlIHRvIHJlZmxlY3QgdGhhdCB0aGUgcGVyZm9y bWFuY2UgaXMgaW1wcm92ZWQuDQo+ICogVXNlIHRoZSBkZXNpZ24gcGF0dGVybiBvZiB0d28gb3Zl cmxhcHBpbmcgc3RvcmVzIGZvciBzbWFsbCBjb3BpZXMNCj4gdG9vLg0KPiAqIEV4cGFuZGVkIGZp cnN0IGJyYW5jaCBmcm9tIHNpemUgPCAxNiB0byBzaXplIDw9IDE2Lg0KPiAqIEhhbmRsZSBtb3Jl IGJ1aWxkIHRpbWUgY29uc3RhbnQgY29weSBzaXplcy4NCj4gLS0tDQo+ICBsaWIvZWFsL3g4Ni9p bmNsdWRlL3J0ZV9tZW1jcHkuaCB8IDM0NiArKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0t DQo+ICAxIGZpbGUgY2hhbmdlZCwgMTg2IGluc2VydGlvbnMoKyksIDE2MCBkZWxldGlvbnMoLSkN Cj4gDQo+IGRpZmYgLS1naXQgYS9saWIvZWFsL3g4Ni9pbmNsdWRlL3J0ZV9tZW1jcHkuaA0KPiBi L2xpYi9lYWwveDg2L2luY2x1ZGUvcnRlX21lbWNweS5oDQo+IGluZGV4IDQ2ZDM0YjgwODEuLjA0 ZDFhNDc0ZDEgMTAwNjQ0DQo+IC0tLSBhL2xpYi9lYWwveDg2L2luY2x1ZGUvcnRlX21lbWNweS5o DQo+ICsrKyBiL2xpYi9lYWwveDg2L2luY2x1ZGUvcnRlX21lbWNweS5oDQo+IEBAIC01NSw1MiAr NTUsNiBAQCBleHRlcm4gIkMiIHsNCj4gIHN0YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5lIHZvaWQg Kg0KPiAgcnRlX21lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pOw0K PiANCj4gLS8qKg0KPiAtICogQ29weSBieXRlcyBmcm9tIG9uZSBsb2NhdGlvbiB0byBhbm90aGVy LA0KPiAtICogbG9jYXRpb25zIHNob3VsZCBub3Qgb3ZlcmxhcC4NCj4gLSAqIFVzZSB3aXRoIG4g PD0gMTUuDQo+IC0gKi8NCj4gLXN0YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5lIHZvaWQgKg0KPiAt cnRlX21vdjE1X29yX2xlc3Modm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQ0K PiAtew0KPiAtCS8qKg0KPiAtCSAqIFVzZSB0aGUgZm9sbG93aW5nIHN0cnVjdHMgdG8gYXZvaWQg dmlvbGF0aW5nIEMgc3RhbmRhcmQNCj4gLQkgKiBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGFuZCB0 byBhdm9pZCBzdHJpY3QgYWxpYXNpbmcgYnVncw0KPiAtCSAqLw0KPiAtCXN0cnVjdCBfX3J0ZV9w YWNrZWRfYmVnaW4gcnRlX3VpbnQ2NF9hbGlhcyB7DQo+IC0JCXVpbnQ2NF90IHZhbDsNCj4gLQl9 IF9fcnRlX3BhY2tlZF9lbmQgX19ydGVfbWF5X2FsaWFzOw0KPiAtCXN0cnVjdCBfX3J0ZV9wYWNr ZWRfYmVnaW4gcnRlX3VpbnQzMl9hbGlhcyB7DQo+IC0JCXVpbnQzMl90IHZhbDsNCj4gLQl9IF9f cnRlX3BhY2tlZF9lbmQgX19ydGVfbWF5X2FsaWFzOw0KPiAtCXN0cnVjdCBfX3J0ZV9wYWNrZWRf YmVnaW4gcnRlX3VpbnQxNl9hbGlhcyB7DQo+IC0JCXVpbnQxNl90IHZhbDsNCj4gLQl9IF9fcnRl X3BhY2tlZF9lbmQgX19ydGVfbWF5X2FsaWFzOw0KPiAtDQo+IC0Jdm9pZCAqcmV0ID0gZHN0Ow0K PiAtCWlmIChuICYgOCkgew0KPiAtCQkoKHN0cnVjdCBydGVfdWludDY0X2FsaWFzICopZHN0KS0+ dmFsID0NCj4gLQkJCSgoY29uc3Qgc3RydWN0IHJ0ZV91aW50NjRfYWxpYXMgKilzcmMpLT52YWw7 DQo+IC0JCXNyYyA9IChjb25zdCB1aW50NjRfdCAqKXNyYyArIDE7DQo+IC0JCWRzdCA9ICh1aW50 NjRfdCAqKWRzdCArIDE7DQo+IC0JfQ0KPiAtCWlmIChuICYgNCkgew0KPiAtCQkoKHN0cnVjdCBy dGVfdWludDMyX2FsaWFzICopZHN0KS0+dmFsID0NCj4gLQkJCSgoY29uc3Qgc3RydWN0IHJ0ZV91 aW50MzJfYWxpYXMgKilzcmMpLT52YWw7DQo+IC0JCXNyYyA9IChjb25zdCB1aW50MzJfdCAqKXNy YyArIDE7DQo+IC0JCWRzdCA9ICh1aW50MzJfdCAqKWRzdCArIDE7DQo+IC0JfQ0KPiAtCWlmIChu ICYgMikgew0KPiAtCQkoKHN0cnVjdCBydGVfdWludDE2X2FsaWFzICopZHN0KS0+dmFsID0NCj4g LQkJCSgoY29uc3Qgc3RydWN0IHJ0ZV91aW50MTZfYWxpYXMgKilzcmMpLT52YWw7DQo+IC0JCXNy YyA9IChjb25zdCB1aW50MTZfdCAqKXNyYyArIDE7DQo+IC0JCWRzdCA9ICh1aW50MTZfdCAqKWRz dCArIDE7DQo+IC0JfQ0KPiAtCWlmIChuICYgMSkNCj4gLQkJKih1aW50OF90ICopZHN0ID0gKihj b25zdCB1aW50OF90ICopc3JjOw0KPiAtCXJldHVybiByZXQ7DQo+IC19DQo+IC0NCj4gIC8qKg0K PiAgICogQ29weSAxNiBieXRlcyBmcm9tIG9uZSBsb2NhdGlvbiB0byBhbm90aGVyLA0KPiAgICog bG9jYXRpb25zIHNob3VsZCBub3Qgb3ZlcmxhcC4NCj4gQEAgLTEzMiw2ICs4NiwyMyBAQCBydGVf bW92MzIodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMpDQo+ICAjZW5kaWYNCj4gIH0N Cj4gDQo+ICsvKioNCj4gKyAqIENvcHkgNDggYnl0ZXMgZnJvbSBvbmUgbG9jYXRpb24gdG8gYW5v dGhlciwNCj4gKyAqIGxvY2F0aW9ucyBzaG91bGQgbm90IG92ZXJsYXAuDQo+ICsgKi8NCj4gK3N0 YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5lIHZvaWQNCj4gK3J0ZV9tb3Y0OCh1aW50OF90ICpkc3Qs IGNvbnN0IHVpbnQ4X3QgKnNyYykNCj4gK3sNCj4gKyNpZiBkZWZpbmVkIFJURV9NRU1DUFlfQVZY DQo+ICsJcnRlX21vdjMyKCh1aW50OF90ICopZHN0LCAoY29uc3QgdWludDhfdCAqKXNyYyk7DQo+ ICsJcnRlX21vdjMyKCh1aW50OF90ICopZHN0IC0gMzIgKyA0OCwgKGNvbnN0IHVpbnQ4X3QgKilz cmMgLSAzMiArDQo+IDQ4KTsNCj4gKyNlbHNlIC8qIFNTRSBpbXBsZW1lbnRhdGlvbiAqLw0KPiAr CXJ0ZV9tb3YxNigodWludDhfdCAqKWRzdCArIDAgKiAxNiwgKGNvbnN0IHVpbnQ4X3QgKilzcmMg KyAwICoNCj4gMTYpOw0KPiArCXJ0ZV9tb3YxNigodWludDhfdCAqKWRzdCArIDEgKiAxNiwgKGNv bnN0IHVpbnQ4X3QgKilzcmMgKyAxICoNCj4gMTYpOw0KPiArCXJ0ZV9tb3YxNigodWludDhfdCAq KWRzdCArIDIgKiAxNiwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgKyAyICoNCj4gMTYpOw0KPiArI2Vu ZGlmDQo+ICt9DQo+ICsNCj4gIC8qKg0KPiAgICogQ29weSA2NCBieXRlcyBmcm9tIG9uZSBsb2Nh dGlvbiB0byBhbm90aGVyLA0KPiAgICogbG9jYXRpb25zIHNob3VsZCBub3Qgb3ZlcmxhcC4NCj4g QEAgLTE3Miw2ICsxNDMsMTM3IEBAIHJ0ZV9tb3YyNTYodWludDhfdCAqZHN0LCBjb25zdCB1aW50 OF90ICpzcmMpDQo+ICAJcnRlX21vdjEyOChkc3QgKyAxICogMTI4LCBzcmMgKyAxICogMTI4KTsN Cj4gIH0NCj4gDQo+ICsvKioNCj4gKyAqIENvcHkgYnl0ZXMgZnJvbSBvbmUgbG9jYXRpb24gdG8g YW5vdGhlciwNCj4gKyAqIGxvY2F0aW9ucyBzaG91bGQgbm90IG92ZXJsYXAuDQo+ICsgKiBVc2Ug d2l0aCBuIDw9IDE2Lg0KPiArICoNCj4gKyAqIE5vdGU6IENvcHlpbmcgdW5pbml0aWFsaXplZCBt ZW1vcnkgaXMgcGVyZmVjdGx5IGFjY2VwdGFibGUuDQo+ICsgKiBVc2luZyBlLmcuIG1lbWNweShk c3QsIHNyYywgOCkgaW5zdGVhZCBvZg0KPiArICogKih1bmFsaWduZWRfdWludDY0X3QqKSA9ICoo Y29uc3QgdW5hbGlnbmVkX3VpbnQ2NF90ICopc3JjDQo+ICsgKiBhdm9pZHMgY29tcGlsZXIgd2Fy bmluZ3MgYWJvdXQgc291cmNlIGRhdGEgbWF5IGJlIHVuaW5pdGlhbGl6ZWQNCj4gKyAqIFstV21h eWJlLXVuaW5pdGlhbGl6ZWRdLg0KPiArICovDQo+ICtzdGF0aWMgX19ydGVfYWx3YXlzX2lubGlu ZSB2b2lkICoNCj4gK3J0ZV9tb3YxNl9vcl9sZXNzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3Jj LCBzaXplX3QgbikNCj4gK3sNCj4gKwkvKiBGYXN0ZXIgd2F5IHdoZW4gc2l6ZSBpcyBrbm93biBh dCBidWlsZCB0aW1lLiAqLw0KPiArCWlmIChfX3J0ZV9jb25zdGFudChuKSkgew0KPiArCQlpZiAo biA9PSAyKQ0KPiArCQkJcmV0dXJuIG1lbWNweShkc3QsIHNyYywgMik7DQo+ICsJCWlmIChuID09 IDQpDQo+ICsJCQlyZXR1cm4gbWVtY3B5KGRzdCwgc3JjLCA0KTsNCj4gKwkJaWYgKG4gPT0gNikg LyogNCArIDIgKi8NCj4gKwkJCXJldHVybiBtZW1jcHkoZHN0LCBzcmMsIDYpOw0KPiArCQlpZiAo biA9PSA4KQ0KPiArCQkJcmV0dXJuIG1lbWNweShkc3QsIHNyYywgOCk7DQo+ICsJCWlmIChuID09 IDEwKSAvKiA4ICsgMiAqLw0KPiArCQkJcmV0dXJuIG1lbWNweShkc3QsIHNyYywgMTApOw0KPiAr CQlpZiAobiA9PSAxMikgLyogOCArIDQgKi8NCj4gKwkJCXJldHVybiBtZW1jcHkoZHN0LCBzcmMs IDEyKTsNCj4gKwkJaWYgKG4gPT0gMTYpIHsNCj4gKwkJCXJ0ZV9tb3YxNigodWludDhfdCAqKWRz dCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMpOw0KPiArCQkJcmV0dXJuIGRzdDsNCj4gKwkJfQ0KPiAr CX0NCj4gKw0KPiArCS8qDQo+ICsJICogTm90ZTogVXNpbmcgIm4gJiBYIiBnZW5lcmF0ZXMgMy1i eXRlICJ0ZXN0IiBpbnN0cnVjdGlvbnMsDQo+ICsJICogaW5zdGVhZCBvZiAibiA+PSBYIiwgd2hp Y2ggd291bGQgZ2VuZXJhdGUgNC1ieXRlICJjbXAiDQo+IGluc3RydWN0aW9ucy4NCj4gKwkgKi8N Cj4gKwlpZiAobiAmIDB4MTgpIHsgLyogbiA+PSA4LCBpbmNsdWRpbmcgbiA9PSAweDEwLCBoZW5j ZSBuICYgMHgxOC4NCj4gKi8NCj4gKwkJLyogQ29weSA4IH4gMTYgYnl0ZXMuICovDQo+ICsJCW1l bWNweShkc3QsIHNyYywgOCk7DQo+ICsJCW1lbWNweSgodWludDhfdCAqKWRzdCAtIDggKyBuLCAo Y29uc3QgdWludDhfdCAqKXNyYyAtIDggKw0KPiBuLCA4KTsNCj4gKwl9IGVsc2UgaWYgKG4gJiAw eDQpIHsNCj4gKwkJLyogQ29weSA0IH4gNyBieXRlcy4gKi8NCj4gKwkJbWVtY3B5KGRzdCwgc3Jj LCA0KTsNCj4gKwkJbWVtY3B5KCh1aW50OF90ICopZHN0IC0gNCArIG4sIChjb25zdCB1aW50OF90 ICopc3JjIC0gNCArDQo+IG4sIDQpOw0KPiArCX0gZWxzZSBpZiAobiAmIDB4Mikgew0KPiArCQkv KiBDb3B5IDIgfiAzIGJ5dGVzLiAqLw0KPiArCQltZW1jcHkoZHN0LCBzcmMsIDIpOw0KPiArCQlt ZW1jcHkoKHVpbnQ4X3QgKilkc3QgLSAyICsgbiwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgLSAyICsN Cj4gbiwgMik7DQo+ICsJfSBlbHNlIGlmIChuICYgMHgxKSB7DQo+ICsJCS8qIENvcHkgMSBieXRl LiAqLw0KPiArCQltZW1jcHkoZHN0LCBzcmMsIDEpOw0KPiArCX0NCj4gKwlyZXR1cm4gZHN0Ow0K PiArfQ0KPiArDQo+ICsvKioNCj4gKyAqIENvcHkgYnl0ZXMgZnJvbSBvbmUgbG9jYXRpb24gdG8g YW5vdGhlciwNCj4gKyAqIGxvY2F0aW9ucyBzaG91bGQgbm90IG92ZXJsYXAuDQo+ICsgKiBVc2Ug d2l0aCAxNyAob3IgMTYpIDwgbiA8PSAzMi4NCj4gKyAqLw0KPiArc3RhdGljIF9fcnRlX2Fsd2F5 c19pbmxpbmUgdm9pZCAqDQo+ICtydGVfbW92MTdfdG9fMzIodm9pZCAqZHN0LCBjb25zdCB2b2lk ICpzcmMsIHNpemVfdCBuKQ0KPiArew0KPiArCS8qIEZhc3RlciB3YXkgd2hlbiBzaXplIGlzIGtu b3duIGF0IGJ1aWxkIHRpbWUuICovDQo+ICsJaWYgKF9fcnRlX2NvbnN0YW50KG4pKSB7DQo+ICsJ CWlmIChuID09IDE2KSB7DQo+ICsJCQlydGVfbW92MTYoKHVpbnQ4X3QgKilkc3QsIChjb25zdCB1 aW50OF90ICopc3JjKTsNCj4gKwkJCXJldHVybiBkc3Q7DQo+ICsJCX0NCj4gKwkJaWYgKG4gPT0g MTgpIC8qIDE2ICsgMiAqLw0KPiArCQkJcmV0dXJuIG1lbWNweShkc3QsIHNyYywgMTgpOw0KPiAr CQlpZiAobiA9PSAyMCkgLyogMTYgKyA0ICovDQo+ICsJCQlyZXR1cm4gbWVtY3B5KGRzdCwgc3Jj LCAyMCk7DQo+ICsJCWlmIChuID09IDI0KSAvKiAxNiArIDggKi8NCj4gKwkJCXJldHVybiBtZW1j cHkoZHN0LCBzcmMsIDI0KTsNCj4gKwkJaWYgKG4gPT0gMzIpIHsNCj4gKwkJCXJ0ZV9tb3YzMigo dWludDhfdCAqKWRzdCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMpOw0KPiArCQkJcmV0dXJuIGRzdDsN Cj4gKwkJfQ0KPiArCX0NCj4gKw0KPiArCS8qIENvcHkgMTcgKG9yIDE2KSB+IDMyIGJ5dGVzLiAq Lw0KPiArCXJ0ZV9tb3YxNigodWludDhfdCAqKWRzdCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMpOw0K PiArCXJ0ZV9tb3YxNigodWludDhfdCAqKWRzdCAtIDE2ICsgbiwgKGNvbnN0IHVpbnQ4X3QgKilz cmMgLSAxNiArDQo+IG4pOw0KPiArCXJldHVybiBkc3Q7DQo+ICt9DQo+ICsNCj4gKy8qKg0KPiAr ICogQ29weSBieXRlcyBmcm9tIG9uZSBsb2NhdGlvbiB0byBhbm90aGVyLA0KPiArICogbG9jYXRp b25zIHNob3VsZCBub3Qgb3ZlcmxhcC4NCj4gKyAqIFVzZSB3aXRoIDMzIChvciAzMikgPCBuIDw9 IDY0Lg0KPiArICovDQo+ICtzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZSB2b2lkICoNCj4gK3J0 ZV9tb3YzM190b182NCh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pDQo+ICt7 DQo+ICsJLyogRmFzdGVyIHdheSB3aGVuIHNpemUgaXMga25vd24gYXQgYnVpbGQgdGltZS4gKi8N Cj4gKwlpZiAoX19ydGVfY29uc3RhbnQobikpIHsNCj4gKwkJaWYgKG4gPT0gMzIpIHsNCj4gKwkJ CXJ0ZV9tb3YzMigodWludDhfdCAqKWRzdCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMpOw0KPiArCQkJ cmV0dXJuIGRzdDsNCj4gKwkJfQ0KPiArCQlpZiAobiA9PSAzNikgLyogMzIgKyA0ICovDQo+ICsJ CQlyZXR1cm4gbWVtY3B5KGRzdCwgc3JjLCAzNik7DQo+ICsJCWlmIChuID09IDQwKSAvKiAzMiAr IDggKi8NCj4gKwkJCXJldHVybiBtZW1jcHkoZHN0LCBzcmMsIDQwKTsNCj4gKwkJaWYgKG4gPT0g NDgpIHsNCj4gKwkJCXJ0ZV9tb3Y0OCgodWludDhfdCAqKWRzdCwgKGNvbnN0IHVpbnQ4X3QgKilz cmMpOw0KPiArCQkJcmV0dXJuIGRzdDsNCj4gKwkJfQ0KPiArCQlpZiAobiA9PSA2NCkgew0KPiAr CQkJcnRlX21vdjY0KCh1aW50OF90ICopZHN0LCAoY29uc3QgdWludDhfdCAqKXNyYyk7DQo+ICsJ CQlyZXR1cm4gZHN0Ow0KPiArCQl9DQo+ICsJfQ0KPiArDQo+ICsJLyogQ29weSAzMyAob3IgMzIp IH4gNjQgYnl0ZXMuICovDQo+ICsjaWYgZGVmaW5lZCBSVEVfTUVNQ1BZX0FWWA0KPiArCXJ0ZV9t b3YzMigodWludDhfdCAqKWRzdCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMpOw0KPiArCXJ0ZV9tb3Yz MigodWludDhfdCAqKWRzdCAtIDMyICsgbiwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgLSAzMiArDQo+ IG4pOw0KPiArI2Vsc2UgLyogU1NFIGltcGxlbWVudGF0aW9uICovDQo+ICsJcnRlX21vdjE2KCh1 aW50OF90ICopZHN0ICsgMCAqIDE2LCAoY29uc3QgdWludDhfdCAqKXNyYyArIDAgKg0KPiAxNik7 DQo+ICsJcnRlX21vdjE2KCh1aW50OF90ICopZHN0ICsgMSAqIDE2LCAoY29uc3QgdWludDhfdCAq KXNyYyArIDEgKg0KPiAxNik7DQo+ICsJaWYgKG4gPiA0OCkNCj4gKwkJcnRlX21vdjE2KCh1aW50 OF90ICopZHN0ICsgMiAqIDE2LCAoY29uc3QgdWludDhfdCAqKXNyYyArIDINCj4gKiAxNik7DQo+ ICsJcnRlX21vdjE2KCh1aW50OF90ICopZHN0IC0gMTYgKyBuLCAoY29uc3QgdWludDhfdCAqKXNy YyAtIDE2ICsNCj4gbik7DQo+ICsjZW5kaWYNCj4gKwlyZXR1cm4gZHN0Ow0KPiArfQ0KPiArDQo+ ICAjaWYgZGVmaW5lZCBfX0FWWDUxMkZfXyAmJiBkZWZpbmVkIFJURV9NRU1DUFlfQVZYNTEyDQo+ IA0KPiAgLyoqDQo+IEBAIC0yMzIsNDUgKzMzNCwyMSBAQCBydGVfbW92NTEyYmxvY2tzKHVpbnQ4 X3QgKmRzdCwgY29uc3QgdWludDhfdA0KPiAqc3JjLCBzaXplX3QgbikNCj4gIAl9DQo+ICB9DQo+ IA0KPiArLyoqDQo+ICsgKiBDb3B5IGJ5dGVzIGZyb20gb25lIGxvY2F0aW9uIHRvIGFub3RoZXIs DQo+ICsgKiBsb2NhdGlvbnMgc2hvdWxkIG5vdCBvdmVybGFwLg0KPiArICogVXNlIHdpdGggbiA+ IDY0Lg0KPiArICovDQo+ICBzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZSB2b2lkICoNCj4gLXJ0 ZV9tZW1jcHlfZ2VuZXJpYyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pDQo+ ICtydGVfbWVtY3B5X2dlbmVyaWNfbW9yZV90aGFuXzY0KHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAq c3JjLCBzaXplX3QgbikNCj4gIHsNCj4gIAl2b2lkICpyZXQgPSBkc3Q7DQo+ICAJc2l6ZV90IGRz dG9mc3M7DQo+ICAJc2l6ZV90IGJpdHM7DQo+IA0KPiAtCS8qKg0KPiAtCSAqIENvcHkgbGVzcyB0 aGFuIDE2IGJ5dGVzDQo+IC0JICovDQo+IC0JaWYgKG4gPCAxNikgew0KPiAtCQlyZXR1cm4gcnRl X21vdjE1X29yX2xlc3MoZHN0LCBzcmMsIG4pOw0KPiAtCX0NCj4gLQ0KPiAgCS8qKg0KPiAgCSAq IEZhc3Qgd2F5IHdoZW4gY29weSBzaXplIGRvZXNuJ3QgZXhjZWVkIDUxMiBieXRlcw0KPiAgCSAq Lw0KPiAtCWlmIChfX3J0ZV9jb25zdGFudChuKSAmJiBuID09IDMyKSB7DQo+IC0JCXJ0ZV9tb3Yz MigodWludDhfdCAqKWRzdCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMpOw0KPiAtCQlyZXR1cm4gcmV0 Ow0KPiAtCX0NCj4gLQlpZiAobiA8PSAzMikgew0KPiAtCQlydGVfbW92MTYoKHVpbnQ4X3QgKilk c3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gLQkJaWYgKF9fcnRlX2NvbnN0YW50KG4pICYm IG4gPT0gMTYpDQo+IC0JCQlyZXR1cm4gcmV0OyAvKiBhdm9pZCAoaGFybWxlc3MpIGR1cGxpY2F0 ZSBjb3B5ICovDQo+IC0JCXJ0ZV9tb3YxNigodWludDhfdCAqKWRzdCAtIDE2ICsgbiwNCj4gLQkJ CQkgIChjb25zdCB1aW50OF90ICopc3JjIC0gMTYgKyBuKTsNCj4gLQkJcmV0dXJuIHJldDsNCj4g LQl9DQo+IC0JaWYgKF9fcnRlX2NvbnN0YW50KG4pICYmIG4gPT0gNjQpIHsNCj4gLQkJcnRlX21v djY0KCh1aW50OF90ICopZHN0LCAoY29uc3QgdWludDhfdCAqKXNyYyk7DQo+IC0JCXJldHVybiBy ZXQ7DQo+IC0JfQ0KPiAtCWlmIChuIDw9IDY0KSB7DQo+IC0JCXJ0ZV9tb3YzMigodWludDhfdCAq KWRzdCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMpOw0KPiAtCQlydGVfbW92MzIoKHVpbnQ4X3QgKilk c3QgLSAzMiArIG4sDQo+IC0JCQkJICAoY29uc3QgdWludDhfdCAqKXNyYyAtIDMyICsgbik7DQo+ IC0JCXJldHVybiByZXQ7DQo+IC0JfQ0KPiAgCWlmIChuIDw9IDUxMikgew0KPiAgCQlpZiAobiA+ PSAyNTYpIHsNCj4gIAkJCW4gLT0gMjU2Ow0KPiBAQCAtMzgxLDQxICs0NTksMjEgQEAgcnRlX21v djEyOGJsb2Nrcyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QNCj4gKnNyYywgc2l6ZV90IG4p DQo+ICAJfQ0KPiAgfQ0KPiANCj4gKy8qKg0KPiArICogQ29weSBieXRlcyBmcm9tIG9uZSBsb2Nh dGlvbiB0byBhbm90aGVyLA0KPiArICogbG9jYXRpb25zIHNob3VsZCBub3Qgb3ZlcmxhcC4NCj4g KyAqIFVzZSB3aXRoIG4gPiA2NC4NCj4gKyAqLw0KPiAgc3RhdGljIF9fcnRlX2Fsd2F5c19pbmxp bmUgdm9pZCAqDQo+IC1ydGVfbWVtY3B5X2dlbmVyaWModm9pZCAqZHN0LCBjb25zdCB2b2lkICpz cmMsIHNpemVfdCBuKQ0KPiArcnRlX21lbWNweV9nZW5lcmljX21vcmVfdGhhbl82NCh2b2lkICpk c3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pDQo+ICB7DQo+ICAJdm9pZCAqcmV0ID0gZHN0 Ow0KPiAgCXNpemVfdCBkc3RvZnNzOw0KPiAgCXNpemVfdCBiaXRzOw0KPiANCj4gLQkvKioNCj4g LQkgKiBDb3B5IGxlc3MgdGhhbiAxNiBieXRlcw0KPiAtCSAqLw0KPiAtCWlmIChuIDwgMTYpIHsN Cj4gLQkJcmV0dXJuIHJ0ZV9tb3YxNV9vcl9sZXNzKGRzdCwgc3JjLCBuKTsNCj4gLQl9DQo+IC0N Cj4gIAkvKioNCj4gIAkgKiBGYXN0IHdheSB3aGVuIGNvcHkgc2l6ZSBkb2Vzbid0IGV4Y2VlZCAy NTYgYnl0ZXMNCj4gIAkgKi8NCj4gLQlpZiAoX19ydGVfY29uc3RhbnQobikgJiYgbiA9PSAzMikg ew0KPiAtCQlydGVfbW92MzIoKHVpbnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsN Cj4gLQkJcmV0dXJuIHJldDsNCj4gLQl9DQo+IC0JaWYgKG4gPD0gMzIpIHsNCj4gLQkJcnRlX21v djE2KCh1aW50OF90ICopZHN0LCAoY29uc3QgdWludDhfdCAqKXNyYyk7DQo+IC0JCWlmIChfX3J0 ZV9jb25zdGFudChuKSAmJiBuID09IDE2KQ0KPiAtCQkJcmV0dXJuIHJldDsgLyogYXZvaWQgKGhh cm1sZXNzKSBkdXBsaWNhdGUgY29weSAqLw0KPiAtCQlydGVfbW92MTYoKHVpbnQ4X3QgKilkc3Qg LSAxNiArIG4sDQo+IC0JCQkJKGNvbnN0IHVpbnQ4X3QgKilzcmMgLSAxNiArIG4pOw0KPiAtCQly ZXR1cm4gcmV0Ow0KPiAtCX0NCj4gLQlpZiAobiA8PSA2NCkgew0KPiAtCQlydGVfbW92MzIoKHVp bnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gLQkJcnRlX21vdjMyKCh1aW50 OF90ICopZHN0IC0gMzIgKyBuLA0KPiAtCQkJCShjb25zdCB1aW50OF90ICopc3JjIC0gMzIgKyBu KTsNCj4gLQkJcmV0dXJuIHJldDsNCj4gLQl9DQo+ICAJaWYgKG4gPD0gMjU2KSB7DQo+ICAJCWlm IChuID49IDEyOCkgew0KPiAgCQkJbiAtPSAxMjg7DQo+IEBAIC01NzMsMzggKzYzMSwyMiBAQCBy dGVfbWVtY3B5X2dlbmVyaWModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsDQo+IHNpemVfdCBu KQ0KPiAgICAgIH0NCj4gXA0KPiAgfQ0KPiANCj4gKy8qKg0KPiArICogQ29weSBieXRlcyBmcm9t IG9uZSBsb2NhdGlvbiB0byBhbm90aGVyLA0KPiArICogbG9jYXRpb25zIHNob3VsZCBub3Qgb3Zl cmxhcC4NCj4gKyAqIFVzZSB3aXRoIG4gPiA2NC4NCj4gKyAqLw0KPiAgc3RhdGljIF9fcnRlX2Fs d2F5c19pbmxpbmUgdm9pZCAqDQo+IC1ydGVfbWVtY3B5X2dlbmVyaWModm9pZCAqZHN0LCBjb25z dCB2b2lkICpzcmMsIHNpemVfdCBuKQ0KPiArcnRlX21lbWNweV9nZW5lcmljX21vcmVfdGhhbl82 NCh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pDQo+ICB7DQo+ICAJX19tMTI4 aSB4bW0wLCB4bW0xLCB4bW0yLCB4bW0zLCB4bW00LCB4bW01LCB4bW02LCB4bW03LCB4bW04Ow0K PiAgCXZvaWQgKnJldCA9IGRzdDsNCj4gIAlzaXplX3QgZHN0b2ZzczsNCj4gIAlzaXplX3Qgc3Jj b2ZzOw0KPiANCj4gLQkvKioNCj4gLQkgKiBDb3B5IGxlc3MgdGhhbiAxNiBieXRlcw0KPiAtCSAq Lw0KPiAtCWlmIChuIDwgMTYpIHsNCj4gLQkJcmV0dXJuIHJ0ZV9tb3YxNV9vcl9sZXNzKGRzdCwg c3JjLCBuKTsNCj4gLQl9DQo+IC0NCj4gIAkvKioNCj4gIAkgKiBGYXN0IHdheSB3aGVuIGNvcHkg c2l6ZSBkb2Vzbid0IGV4Y2VlZCA1MTIgYnl0ZXMNCj4gIAkgKi8NCj4gLQlpZiAobiA8PSAzMikg ew0KPiAtCQlydGVfbW92MTYoKHVpbnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsN Cj4gLQkJaWYgKF9fcnRlX2NvbnN0YW50KG4pICYmIG4gPT0gMTYpDQo+IC0JCQlyZXR1cm4gcmV0 OyAvKiBhdm9pZCAoaGFybWxlc3MpIGR1cGxpY2F0ZSBjb3B5ICovDQo+IC0JCXJ0ZV9tb3YxNigo dWludDhfdCAqKWRzdCAtIDE2ICsgbiwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgLQ0KPiAxNiArIG4p Ow0KPiAtCQlyZXR1cm4gcmV0Ow0KPiAtCX0NCj4gLQlpZiAobiA8PSA2NCkgew0KPiAtCQlydGVf bW92MzIoKHVpbnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gLQkJaWYgKG4g PiA0OCkNCj4gLQkJCXJ0ZV9tb3YxNigodWludDhfdCAqKWRzdCArIDMyLCAoY29uc3QgdWludDhf dCAqKXNyYyArDQo+IDMyKTsNCj4gLQkJcnRlX21vdjE2KCh1aW50OF90ICopZHN0IC0gMTYgKyBu LCAoY29uc3QgdWludDhfdCAqKXNyYyAtDQo+IDE2ICsgbik7DQo+IC0JCXJldHVybiByZXQ7DQo+ IC0JfQ0KPiAgCWlmIChuIDw9IDEyOCkgew0KPiAgCQlnb3RvIENPUFlfQkxPQ0tfMTI4X0JBQ0sx NTsNCj4gIAl9DQo+IEBAIC02OTYsNDQgKzczOCwxNiBAQCBydGVfbWVtY3B5X2dlbmVyaWModm9p ZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsDQo+IHNpemVfdCBuKQ0KPiANCj4gICNlbmRpZiAvKiBf X0FWWDUxMkZfXyAqLw0KPiANCj4gKy8qKg0KPiArICogQ29weSBieXRlcyBmcm9tIG9uZSB2ZWN0 b3IgcmVnaXN0ZXIgc2l6ZSBhbGlnbmVkIGxvY2F0aW9uIHRvDQo+IGFub3RoZXIsDQo+ICsgKiBs b2NhdGlvbnMgc2hvdWxkIG5vdCBvdmVybGFwLg0KPiArICogVXNlIHdpdGggbiA+IDY0Lg0KPiAr ICovDQo+ICBzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZSB2b2lkICoNCj4gLXJ0ZV9tZW1jcHlf YWxpZ25lZCh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pDQo+ICtydGVfbWVt Y3B5X2FsaWduZWRfbW9yZV90aGFuXzY0KHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXpl X3QgbikNCj4gIHsNCj4gIAl2b2lkICpyZXQgPSBkc3Q7DQo+IA0KPiAtCS8qIENvcHkgc2l6ZSA8 IDE2IGJ5dGVzICovDQo+IC0JaWYgKG4gPCAxNikgew0KPiAtCQlyZXR1cm4gcnRlX21vdjE1X29y X2xlc3MoZHN0LCBzcmMsIG4pOw0KPiAtCX0NCj4gLQ0KPiAtCS8qIENvcHkgMTYgPD0gc2l6ZSA8 PSAzMiBieXRlcyAqLw0KPiAtCWlmIChfX3J0ZV9jb25zdGFudChuKSAmJiBuID09IDMyKSB7DQo+ IC0JCXJ0ZV9tb3YzMigodWludDhfdCAqKWRzdCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMpOw0KPiAt CQlyZXR1cm4gcmV0Ow0KPiAtCX0NCj4gLQlpZiAobiA8PSAzMikgew0KPiAtCQlydGVfbW92MTYo KHVpbnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gLQkJaWYgKF9fcnRlX2Nv bnN0YW50KG4pICYmIG4gPT0gMTYpDQo+IC0JCQlyZXR1cm4gcmV0OyAvKiBhdm9pZCAoaGFybWxl c3MpIGR1cGxpY2F0ZSBjb3B5ICovDQo+IC0JCXJ0ZV9tb3YxNigodWludDhfdCAqKWRzdCAtIDE2 ICsgbiwNCj4gLQkJCQkoY29uc3QgdWludDhfdCAqKXNyYyAtIDE2ICsgbik7DQo+IC0NCj4gLQkJ cmV0dXJuIHJldDsNCj4gLQl9DQo+IC0NCj4gLQkvKiBDb3B5IDMyIDwgc2l6ZSA8PSA2NCBieXRl cyAqLw0KPiAtCWlmIChfX3J0ZV9jb25zdGFudChuKSAmJiBuID09IDY0KSB7DQo+IC0JCXJ0ZV9t b3Y2NCgodWludDhfdCAqKWRzdCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMpOw0KPiAtCQlyZXR1cm4g cmV0Ow0KPiAtCX0NCj4gLQlpZiAobiA8PSA2NCkgew0KPiAtCQlydGVfbW92MzIoKHVpbnQ4X3Qg Kilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gLQkJcnRlX21vdjMyKCh1aW50OF90ICop ZHN0IC0gMzIgKyBuLA0KPiAtCQkJCShjb25zdCB1aW50OF90ICopc3JjIC0gMzIgKyBuKTsNCj4g LQ0KPiAtCQlyZXR1cm4gcmV0Ow0KPiAtCX0NCj4gLQ0KPiAgCS8qIENvcHkgNjQgYnl0ZXMgYmxv Y2tzICovDQo+ICAJZm9yICg7IG4gPiA2NDsgbiAtPSA2NCkgew0KPiAgCQlydGVfbW92NjQoKHVp bnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gQEAgLTc1MSwxMCArNzY1LDIy IEBAIHJ0ZV9tZW1jcHlfYWxpZ25lZCh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywNCj4gc2l6 ZV90IG4pDQo+ICBzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZSB2b2lkICoNCj4gIHJ0ZV9tZW1j cHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQ0KPiAgew0KPiArCS8qIENv bW1vbiBpbXBsZW1lbnRhdGlvbiBmb3Igc2l6ZSA8PSA2NCBieXRlcy4gKi8NCj4gKwlpZiAobiA8 PSAxNikNCj4gKwkJcmV0dXJuIHJ0ZV9tb3YxNl9vcl9sZXNzKGRzdCwgc3JjLCBuKTsNCj4gKwlp ZiAobiA8PSA2NCkgew0KPiArCQkvKiBDb3B5IDE3IH4gNjQgYnl0ZXMgdXNpbmcgdmVjdG9yIGlu c3RydWN0aW9ucy4gKi8NCj4gKwkJaWYgKG4gPD0gMzIpDQo+ICsJCQlyZXR1cm4gcnRlX21vdjE3 X3RvXzMyKGRzdCwgc3JjLCBuKTsNCj4gKwkJZWxzZQ0KPiArCQkJcmV0dXJuIHJ0ZV9tb3YzM190 b182NChkc3QsIHNyYywgbik7DQo+ICsJfQ0KPiArDQo+ICsJLyogSW1wbGVtZW50YXRpb24gZm9y IHNpemUgPiA2NCBieXRlcyBkZXBlbmRzIG9uIGFsaWdubWVudCB3aXRoDQo+IHZlY3RvciByZWdp c3RlciBzaXplLiAqLw0KPiAgCWlmICghKCgodWludHB0cl90KWRzdCB8ICh1aW50cHRyX3Qpc3Jj KSAmIEFMSUdOTUVOVF9NQVNLKSkNCj4gLQkJcmV0dXJuIHJ0ZV9tZW1jcHlfYWxpZ25lZChkc3Qs IHNyYywgbik7DQo+ICsJCXJldHVybiBydGVfbWVtY3B5X2FsaWduZWRfbW9yZV90aGFuXzY0KGRz dCwgc3JjLCBuKTsNCj4gIAllbHNlDQo+IC0JCXJldHVybiBydGVfbWVtY3B5X2dlbmVyaWMoZHN0 LCBzcmMsIG4pOw0KPiArCQlyZXR1cm4gcnRlX21lbWNweV9nZW5lcmljX21vcmVfdGhhbl82NChk c3QsIHNyYywgbik7DQo+ICB9DQo+IA0KPiAgI3VuZGVmIEFMSUdOTUVOVF9NQVNLDQo+IC0tDQo+ IDIuNDMuMA0KDQo=