From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-eopbgr150058.outbound.protection.outlook.com [40.107.15.58]) by dpdk.org (Postfix) with ESMTP id 9EBD12E81 for ; Wed, 23 Jan 2019 11:16:13 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector1-arm-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=AVpFAVf2DhCCZ/KxS1I3ZVtwWOPySPRjsiRBGXGAQtc=; b=gzzc6bxaqZtBveTVKNTOZD7LwdZb4RKwxU2nWkFVwAQ3GyzKvZy12wva3EWvYVhbXuYUvYigaXCjLtfDgktwM0tLKAJ2I1KYU4qQiMZ/lDiczgI0hOU5hSlqct/27LaErmCCJVzt+i8yDUmFNLn83ZZWFxoq+jYroK3OqUaWIYk= Received: from HE1PR0801MB2076.eurprd08.prod.outlook.com (10.168.95.140) by HE1PR0801MB1737.eurprd08.prod.outlook.com (10.168.149.149) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1537.31; Wed, 23 Jan 2019 10:16:11 +0000 Received: from HE1PR0801MB2076.eurprd08.prod.outlook.com ([fe80::f5e3:70fc:e834:3c42]) by HE1PR0801MB2076.eurprd08.prod.outlook.com ([fe80::f5e3:70fc:e834:3c42%3]) with mapi id 15.20.1537.031; Wed, 23 Jan 2019 10:16:11 +0000 From: Ola Liljedahl To: "gage.eads@intel.com" , "dev@dpdk.org" CC: "olivier.matz@6wind.com" , "stephen@networkplumber.org" , nd , "bruce.richardson@intel.com" , "arybchenko@solarflare.com" , "konstantin.ananyev@intel.com" Thread-Topic: [dpdk-dev] [PATCH v3 2/5] ring: add a non-blocking implementation Thread-Index: AQHUr0H3NsJBTf2hT0+nXGXAmKraP6W7ZOeAgABKckCAAPt7gA== Date: Wed, 23 Jan 2019 10:16:10 +0000 Message-ID: <1548238575.31150.73.camel@arm.com> References: <20190115235227.14013-1-gage.eads@intel.com> <20190118152326.22686-1-gage.eads@intel.com> <20190118152326.22686-3-gage.eads@intel.com> <1548168583.31150.32.camel@arm.com> <9184057F7FC11744A2107296B6B8EB1E541CA46E@FMSMSX108.amr.corp.intel.com> In-Reply-To: <9184057F7FC11744A2107296B6B8EB1E541CA46E@FMSMSX108.amr.corp.intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-mailer: Evolution 3.18.5.2-0ubuntu3.2 authentication-results: spf=none (sender IP is ) smtp.mailfrom=Ola.Liljedahl@arm.com; x-originating-ip: [217.140.106.53] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; HE1PR0801MB1737; 6:mOV0Nyu2Krsv86UbhZFZvebk/pdcZrhfq3nbilMzHzkSiVZiltMY7P4JBHKSRvBzUAYXToHeoA3lWZNGCEvu0eeWoLmJLdLADeEddGMkSPjk+hm2hi8zh5UNT9Nbaw4+SkaeObFZWtBOAEvJPKnrxvbimNLQdFtPdX5xwrI1QNMTX0LyaKBu5L8VgXHD3yJbalbZ0ZGYr/eKUCfHOskmSGm58kE91D4SnsuBkQiP64DapYoOpQTuN/tD1FPnU9quvmCt1JJKhKAqEi1nWJqewi4kwz5VjF0xER4Sk7ubojp+8BSkoM6iGw7nG13WTj+a80ajxGURjUuzysJNBkOALti35oTAGYCcGHFwV5txlyx/VBF9aN526R82xVhiOJfNEB0+TN093F0pS2GRR2/Wo3Mwq5nDcSg3z4DjklEOSpkVSSDf1LTXhW/EbpMt/TCXi3/js7hQZt9X8P+Q220iYQ==; 5:xYFV/F447BNs5SrnDUpYWBV8HEC6ZGMdtPdgUeoYXitqB5WDJgPtS+S1bozCtbog7LDEiFxwo8Ak+/KRTEGie8h21xrQch4f2EMfj2AwQr4dMMWumu+M2c4MDuRuH9Vzr/0t/V+9aLMa6bq1IPcZhNvotyTqjpePnnYSc7Jn32t2i4lk4+ePkcNUNuV1scpNJTXV1r6LoxAQguV7ccB77g==; 7:f8GoCRIDRPggQcukkijpdDelAVxW2LsYwMAgwiCDLWlkhrcWxEo4rnvBgZAC0gK7PHsP8cJzOomkYkqLX2MgabycyL6wtWlj/Fn3vapfV2YkDuenhhOZioghqy8I1HKgkQ1KSDsQa3xwk4qVHSehLA== x-ms-exchange-antispam-srfa-diagnostics: SOS; x-ms-office365-filtering-correlation-id: 99602208-d8f6-42c0-6e44-08d6811bcc3d x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(5600110)(711020)(4605077)(4618075)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020); SRVR:HE1PR0801MB1737; x-ms-traffictypediagnostic: HE1PR0801MB1737: nodisclaimer: True x-microsoft-antispam-prvs: x-forefront-prvs: 0926B0E013 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(39860400002)(136003)(366004)(396003)(346002)(376002)(189003)(124014002)(199004)(76176011)(6506007)(26005)(30864003)(3846002)(102836004)(6116002)(316002)(6486002)(6436002)(186003)(105586002)(2501003)(256004)(66066001)(14444005)(71190400001)(446003)(11346002)(71200400001)(36756003)(106356001)(476003)(2616005)(2906002)(68736007)(478600001)(72206003)(99286004)(6512007)(93886005)(103116003)(25786009)(8676002)(14454004)(97736004)(8936002)(229853002)(54906003)(81166006)(81156014)(110136005)(86362001)(50226002)(53936002)(7736002)(4326008)(305945005)(6246003)(486006)(99106002); DIR:OUT; SFP:1101; SCL:1; SRVR:HE1PR0801MB1737; H:HE1PR0801MB2076.eurprd08.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: wVIiS2LBZ95/y8lX5WEsdYEyk8Jm2z6a6EmgdotRrS3I/N+IvG6gGg63x2qXZ5OEu0XyTRqi7qj8u/tvoRnm3lyr+y7pf9d9hILNYMlwFtXBjYm4wgAF7I6ZesYOgk9LizmlXWezwpEZmfuLcKMdhSpSO88XZYT9ZbciaWvHF7T0py8BJQY91YXjz/bXfXXzJudyV0n0OISIqKr6uZ+pHX05zLhfl8BwVtfTmdJE4JyAM1gI45x3oDRFXAxZ42iETobZ65B95S8XvR+uNrF+q2N2LVKDvGCN5z6R+EQ62Ji+BphdewpIyFjAFrwOwEnkaWoZKGeEB5TVzVrcfW0JUvdM+FRve6moD6yRIKi+YDqz6RRbcRQ97rAEtHh8AvoVZmXxnYo35UXT+A94IW8y4hGBM7JWXnYNBslMn9dvcq4= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-Network-Message-Id: 99602208-d8f6-42c0-6e44-08d6811bcc3d X-MS-Exchange-CrossTenant-originalarrivaltime: 23 Jan 2019 10:16:10.8540 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1737 Subject: Re: [dpdk-dev] [PATCH v3 2/5] ring: add a non-blocking implementation X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 23 Jan 2019 10:16:13 -0000 T24gVHVlLCAyMDE5LTAxLTIyIGF0IDIxOjMxICswMDAwLCBFYWRzLCBHYWdlIHdyb3RlOg0KPiBI aSBPbGEsDQo+IA0KPiA8c25pcD4NCj4gDQo+ID4gDQo+ID4gPiANCj4gPiA+IEBAIC0zMzEsNiAr NDMzLDMxOSBAQCB2b2lkIHJ0ZV9yaW5nX2R1bXAoRklMRSAqZiwgY29uc3Qgc3RydWN0DQo+ID4g PiBydGVfcmluZyAqcik7DQo+ID4gPiDCoCNlbmRpZg0KPiA+ID4gwqAjaW5jbHVkZSAicnRlX3Jp bmdfZ2VuZXJpY182NC5oIg0KPiA+ID4gDQo+ID4gPiArLyogQGludGVybmFsIDEyOC1iaXQgc3Ry dWN0dXJlIHVzZWQgYnkgdGhlIG5vbi1ibG9ja2luZyByaW5nICovDQo+ID4gPiArc3RydWN0IG5i X3JpbmdfZW50cnkgew0KPiA+ID4gKwl2b2lkICpwdHI7IC8qKjwgRGF0YSBwb2ludGVyICovDQo+ ID4gPiArCXVpbnQ2NF90IGNudDsgLyoqPCBNb2RpZmljYXRpb24gY291bnRlciAqLw0KPiA+IFdo eSBub3QgbWFrZSAnY250JyB1aW50cHRyX3Q/IFRoaXMgd2F5IDMyLWJpdCBhcmNoaXRlY3R1cmVz IHdpbGwgYWxzbyBiZQ0KPiA+IHN1cHBvcnRlZC4gSSB0aGluayB0aGVyZSBhcmUgc29tZSBjbGFp bXMgdGhhdCBEUERLIHN0aWxsIHN1cHBvcnRzIGUuZy4NCj4gPiBBUk12N2ENCj4gPiBhbmQgcG9z c2libHkgYWxzbyAzMi1iaXQgeDg2Pw0KPiBJIGNob3NlIGEgNjQtYml0IG1vZGlmaWNhdGlvbiBj b3VudGVyIGJlY2F1c2UgKHByYWN0aWNhbGx5IHNwZWFraW5nKSB0aGUgQUJBDQo+IHByb2JsZW0g d2lsbCBub3Qgb2NjdXIgd2l0aCBzdWNoIGEgbGFyZ2UgY291bnRlciAtLSBkZWZpbml0ZWx5IG5v dCB3aXRoaW4gbXkNCj4gbGlmZXRpbWUuIFNlZSB0aGUgIkRpc2N1c3Npb24iIHNlY3Rpb24gb2Yg dGhlIGNvbW1pdCBtZXNzYWdlIGZvciBtb3JlDQo+IGluZm9ybWF0aW9uLg0KPiANCj4gV2l0aCBh IDMyLWJpdCBjb3VudGVyLCB0aGVyZSBpcyBhIHZlcnkgKHZlcnkpIGxvdyBsaWtlbGlob29kIG9m IGl0LCBidXQgaXQgaXMNCj4gcG9zc2libGUuIFBlcnNvbmFsbHksIEkgZG9uJ3QgZmVlbCBjb21m b3J0YWJsZSBwcm92aWRpbmcgc3VjaCBjb2RlLCBiZWNhdXNlIGEpDQo+IEkgZG91YnQgYWxsIHVz ZXJzIHdvdWxkIHVuZGVyc3RhbmQgdGhlIGltcGxlbWVudGF0aW9uIHdlbGwgZW5vdWdoIHRvIGRv IHRoZQ0KPiByaXNrL3Jld2FyZCBhbmFseXNpcywgYW5kIGIpIHN1Y2ggYSBidWcgd291bGQgYmUg bmVhciBpbXBvc3NpYmxlIHRvIHJlcHJvZHVjZQ0KPiBhbmQgcm9vdC1jYXVzZSBpZiBpdCBkaWQg b2NjdXIuDQpXaXRoIGEgNjQtYml0IGNvdW50ZXIgKGFuZCAzMi1iaXQgcG9pbnRlciksIDMyLWJp dCBhcmNoaXRlY3R1cmVzIChlLmcuIEFSTXY3YQ0KYW5kIHByb2JhYmx5IHg4NiBhcyB3ZWxsKSB3 b24ndCBiZSBhYmxlIHRvIHN1cHBvcnQgdGhpcyBhcyB0aGV5IGF0IGJlc3Qgc3VwcG9ydA0KNjQt Yml0IENBUyAoQVJNdjdhIGhhcyBMRFJFWEQvU1RSRVhEKS4gU28geW91IGFyZSBlc3NlbnRpYWxs eSBwdXR0aW5nIGEgNjQtYml0DQooYW5kIDEyOC1iaXQgQ0FTKSByZXF1aXJlbWVudCBvbiB0aGUg aW1wbGVtZW50YXRpb24uDQoNCj4gDQo+ID4gDQo+ID4gDQo+ID4gPiANCj4gPiA+ICt9Ow0KPiA+ ID4gKw0KPiA+ID4gKy8qIFRoZSBub24tYmxvY2tpbmcgcmluZyBhbGdvcml0aG0gaXMgYmFzZWQg b24gdGhlIG9yaWdpbmFsIHJ0ZSByaW5nDQo+ID4gPiArKGRlcml2ZWQNCj4gPiA+ICsgKiBmcm9t IEZyZWVCU0QncyBidWZyaW5nLmgpIGFuZCBpbnNwaXJlZCBieSBNaWNoYWVsIGFuZCBTY290dCdz DQo+ID4gPiArbm9uLWJsb2NraW5nDQo+ID4gPiArICogY29uY3VycmVudCBxdWV1ZS4NCj4gPiA+ ICsgKi8NCj4gPiA+ICsNCj4gPiA+ICsvKioNCj4gPiA+ICsgKiBAaW50ZXJuYWwNCj4gPiA+ICsg KsKgwqDCoEVucXVldWUgc2V2ZXJhbCBvYmplY3RzIG9uIHRoZSBub24tYmxvY2tpbmcgcmluZw0K PiA+ID4gKyhzaW5nbGUtcHJvZHVjZXIgb25seSkNCj4gPiA+ICsgKg0KPiA+ID4gKyAqIEBwYXJh bSByDQo+ID4gPiArICrCoMKgwqBBIHBvaW50ZXIgdG8gdGhlIHJpbmcgc3RydWN0dXJlLg0KPiA+ ID4gKyAqIEBwYXJhbSBvYmpfdGFibGUNCj4gPiA+ICsgKsKgwqDCoEEgcG9pbnRlciB0byBhIHRh YmxlIG9mIHZvaWQgKiBwb2ludGVycyAob2JqZWN0cykuDQo+ID4gPiArICogQHBhcmFtIG4NCj4g PiA+ICsgKsKgwqDCoFRoZSBudW1iZXIgb2Ygb2JqZWN0cyB0byBhZGQgaW4gdGhlIHJpbmcgZnJv bSB0aGUgb2JqX3RhYmxlLg0KPiA+ID4gKyAqIEBwYXJhbSBiZWhhdmlvcg0KPiA+ID4gKyAqwqDC oMKgUlRFX1JJTkdfUVVFVUVfRklYRUQ6wqDCoMKgwqBFbnF1ZXVlIGEgZml4ZWQgbnVtYmVyIG9m IGl0ZW1zIHRvIHRoZQ0KPiA+ID4gK3JpbmcNCj4gPiA+ICsgKsKgwqDCoFJURV9SSU5HX1FVRVVF X1ZBUklBQkxFOiBFbnF1ZXVlIGFzIG1hbnkgaXRlbXMgYXMgcG9zc2libGUgdG8NCj4gPiA+ICt0 aGUgcmluZw0KPiA+ID4gKyAqIEBwYXJhbSBmcmVlX3NwYWNlDQo+ID4gPiArICrCoMKgwqByZXR1 cm5zIHRoZSBhbW91bnQgb2Ygc3BhY2UgYWZ0ZXIgdGhlIGVucXVldWUgb3BlcmF0aW9uIGhhcw0K PiA+ID4gK2ZpbmlzaGVkDQo+ID4gPiArICogQHJldHVybg0KPiA+ID4gKyAqwqDCoMKgQWN0dWFs IG51bWJlciBvZiBvYmplY3RzIGVucXVldWVkLg0KPiA+ID4gKyAqwqDCoMKgSWYgYmVoYXZpb3Ig PT0gUlRFX1JJTkdfUVVFVUVfRklYRUQsIHRoaXMgd2lsbCBiZSAwIG9yIG4gb25seS4NCj4gPiA+ ICsgKi8NCj4gPiA+ICtzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQNCj4g PiA+ICtfX3J0ZV9yaW5nX2RvX25iX2VucXVldWVfc3Aoc3RydWN0IHJ0ZV9yaW5nICpyLCB2b2lk ICogY29uc3QgKm9ial90YWJsZSwNCj4gPiA+ICsJCQnCoMKgwqDCoHVuc2lnbmVkIGludCBuLA0K PiA+ID4gKwkJCcKgwqDCoMKgZW51bSBydGVfcmluZ19xdWV1ZV9iZWhhdmlvciBiZWhhdmlvciwN Cj4gPiA+ICsJCQnCoMKgwqDCoHVuc2lnbmVkIGludCAqZnJlZV9zcGFjZSkNCj4gPiA+ICt7DQo+ ID4gPiArCXVpbnQzMl90IGZyZWVfZW50cmllczsNCj4gPiA+ICsJc2l6ZV90IGhlYWQsIG5leHQ7 DQo+ID4gPiArDQo+ID4gPiArCW4gPSBfX3J0ZV9yaW5nX21vdmVfcHJvZF9oZWFkXzY0KHIsIDEs IG4sIGJlaGF2aW9yLA0KPiA+ID4gKwkJCQkJwqAmaGVhZCwgJm5leHQsICZmcmVlX2VudHJpZXMp Ow0KPiA+ID4gKwlpZiAobiA9PSAwKQ0KPiA+ID4gKwkJZ290byBlbmQ7DQo+ID4gPiArDQo+ID4g PiArCUVOUVVFVUVfUFRSU19OQihyLCAmclsxXSwgaGVhZCwgb2JqX3RhYmxlLCBuKTsNCj4gPiA+ ICsNCj4gPiA+ICsJci0+cHJvZF82NC50YWlsICs9IG47DQo+ID4gRG9uJ3Qgd2UgbmVlZCByZWxl YXNlIG9yZGVyIHdoZW4gKG9yIHNtcF93bWIgYmV0d2Vlbikgd3JpdGluZyBvZiB0aGUgcmluZw0K PiA+IHBvaW50ZXJzIGFuZCB0aGUgdXBkYXRlIG9mIHRhaWw/IEJ5IHVwZGF0aW5nIHRoZSB0YWls IHBvaW50ZXIsIHdlIGFyZQ0KPiA+IHN5bmNocm9uaXNpbmcgd2l0aCBhIGNvbnN1bWVyLg0KPiA+ IA0KPiA+IEkgcHJlZmVyIHVzaW5nIF9fYXRvbWljIG9wZXJhdGlvbnMgZXZlbiBmb3IgbG9hZCBh bmQgc3RvcmUuIFlvdSBjYW4gc2VlDQo+ID4gd2hpY2gNCj4gPiBwYXJ0cyBvZiB0aGUgY29kZSB0 aGF0IHN5bmNocm9uaXNlIHdpdGggZWFjaCBvdGhlciwgZS5nLiBzdG9yZS1yZWxlYXNlIHRvDQo+ ID4gc29tZQ0KPiA+IGxvY2F0aW9uIHN5bmNocm9uaXNlcyB3aXRoIGxvYWQtYWNxdWlyZSBmcm9t IHRoZSBzYW1lIGxvY2F0aW9uLiBJZiB5b3UgZG9uJ3QNCj4gPiBrbm93IGhvdyBkaWZmZXJlbnQg dGhyZWFkcyBzeW5jaHJvbmlzZSB3aXRoIGVhY2ggb3RoZXIsIHlvdSBhcmUgdmVyeSBsaWtlbHkN Cj4gPiB0bw0KPiA+IG1ha2UgbWlzdGFrZXMuDQo+ID4gDQo+IFlvdSBjYW4gdGVsbCB0aGlzIGNv ZGUgd2FzIHdyaXR0ZW4gd2hlbiBJIHRob3VnaHQgeDg2LTY0IHdhcyB0aGUgb25seSB2aWFibGUN Cj4gdGFyZ2V0IDopLiBZZXMsIHlvdSBhcmUgY29ycmVjdC4NCj4gDQo+IFdpdGggcmVnYXJkcyB0 byB1c2luZyBfX2F0b21pYyBpbnRyaW5zaWNzLCBJJ20gcGxhbm5pbmcgb24gdGFraW5nIGEgc2lt aWxhcg0KPiBhcHByb2FjaCB0byB0aGUgZnVuY3Rpb25zIGR1cGxpY2F0ZWQgaW4gcnRlX3Jpbmdf Z2VuZXJpYy5oIGFuZA0KPiBydGVfcmluZ19jMTFfbWVtLmg6IG9uZSB2ZXJzaW9uIHRoYXQgdXNl cyBydGVfYXRvbWljIGZ1bmN0aW9ucyAoYW5kIHRodXMNCj4gc3RyaWN0ZXIgbWVtb3J5IG9yZGVy aW5nKSBhbmQgb25lIHRoYXQgdXNlcyBfX2F0b21pYyBpbnRyaW5zaWNzIChhbmQgdGh1cyBjYW4N Cj4gYmVuZWZpdCBmcm9tIG1vcmUgcmVsYXhlZCBtZW1vcnkgb3JkZXJpbmcpLg0KV2hhdCdzIHRo ZSBhZHZhbnRhZ2Ugb2YgaGF2aW5nIHR3byBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zPyBXaGF0 IGlzIHRoZQ0KZGlzYWR2YW50YWdlPw0KDQpUaGUgZXhpc3RpbmcgcmluZyBidWZmZXIgY29kZSBv cmlnaW5hbGx5IGhhZCBvbmx5IHRoZSAibGVnYWN5IiBpbXBsZW1lbnRhdGlvbg0Kd2hpY2ggd2Fz IGtlcHQgd2hlbiB0aGUgX19hdG9taWMgaW1wbGVtZW50YXRpb24gd2FzIGFkZGVkLiBUaGUgcmVh c29uIGNsYWltZWQNCndhcyB0aGF0IHNvbWUgb2xkZXIgY29tcGlsZXJzIGZvciB4ODYgZG8gbm90 IHN1cHBvcnQgR0NDIF9fYXRvbWljIGJ1aWx0aW5zLiBCdXQNCkkgdGhvdWdodCB0aGVyZSB3YXMg Y29uc2Vuc3VzIHRoYXQgbmV3IGZ1bmN0aW9uYWxpdHkgY291bGQgaGF2ZSBvbmx5IF9fYXRvbWlj DQppbXBsZW1lbnRhdGlvbnMuDQoNCkRvZXMgdGhlIG5vbi1ibG9ja2luZyByaW5nIGJ1ZmZlciBp bXBsZW1lbnRhdGlvbiBoYXZlIHRvIHN1cHBvcnQgdGhlc2Ugb2xkZXINCmNvbXBpbGVycz8gV2ls bCB0aGUgYXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSB0aGVzZSBvbGRlciBjb21waWxlciBiZSB1 cGRhdGVkIHRvDQp1dGlsaXNlIHRoZSBub24tYmxvY2tpbmcgcmluZyBidWZmZXI/DQoNCj4gDQo+ ID4gDQo+ID4gPiANCj4gPiA+ICsNCj4gPiA+ICtlbmQ6DQo+ID4gPiArCWlmIChmcmVlX3NwYWNl ICE9IE5VTEwpDQo+ID4gPiArCQkqZnJlZV9zcGFjZSA9IGZyZWVfZW50cmllcyAtIG47DQo+ID4g PiArCXJldHVybiBuOw0KPiA+ID4gK30NCj4gPiA+ICsNCj4gPiA+ICsvKioNCj4gPiA+ICsgKiBA aW50ZXJuYWwNCj4gPiA+ICsgKsKgwqDCoEVucXVldWUgc2V2ZXJhbCBvYmplY3RzIG9uIHRoZSBu b24tYmxvY2tpbmcgcmluZyAobXVsdGktcHJvZHVjZXINCj4gPiA+ICtzYWZlKQ0KPiA+ID4gKyAq DQo+ID4gPiArICogQHBhcmFtIHINCj4gPiA+ICsgKsKgwqDCoEEgcG9pbnRlciB0byB0aGUgcmlu ZyBzdHJ1Y3R1cmUuDQo+ID4gPiArICogQHBhcmFtIG9ial90YWJsZQ0KPiA+ID4gKyAqwqDCoMKg QSBwb2ludGVyIHRvIGEgdGFibGUgb2Ygdm9pZCAqIHBvaW50ZXJzIChvYmplY3RzKS4NCj4gPiA+ ICsgKiBAcGFyYW0gbg0KPiA+ID4gKyAqwqDCoMKgVGhlIG51bWJlciBvZiBvYmplY3RzIHRvIGFk ZCBpbiB0aGUgcmluZyBmcm9tIHRoZSBvYmpfdGFibGUuDQo+ID4gPiArICogQHBhcmFtIGJlaGF2 aW9yDQo+ID4gPiArICrCoMKgwqBSVEVfUklOR19RVUVVRV9GSVhFRDrCoMKgwqDCoEVucXVldWUg YSBmaXhlZCBudW1iZXIgb2YgaXRlbXMgdG8gdGhlDQo+ID4gPiArcmluZw0KPiA+ID4gKyAqwqDC oMKgUlRFX1JJTkdfUVVFVUVfVkFSSUFCTEU6IEVucXVldWUgYXMgbWFueSBpdGVtcyBhcyBwb3Nz aWJsZSB0bw0KPiA+ID4gK3RoZSByaW5nDQo+ID4gPiArICogQHBhcmFtIGZyZWVfc3BhY2UNCj4g PiA+ICsgKsKgwqDCoHJldHVybnMgdGhlIGFtb3VudCBvZiBzcGFjZSBhZnRlciB0aGUgZW5xdWV1 ZSBvcGVyYXRpb24gaGFzDQo+ID4gPiArZmluaXNoZWQNCj4gPiA+ICsgKiBAcmV0dXJuDQo+ID4g PiArICrCoMKgwqBBY3R1YWwgbnVtYmVyIG9mIG9iamVjdHMgZW5xdWV1ZWQuDQo+ID4gPiArICrC oMKgwqBJZiBiZWhhdmlvciA9PSBSVEVfUklOR19RVUVVRV9GSVhFRCwgdGhpcyB3aWxsIGJlIDAg b3IgbiBvbmx5Lg0KPiA+ID4gKyAqLw0KPiA+ID4gK3N0YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5l IHVuc2lnbmVkIGludA0KPiA+ID4gK19fcnRlX3JpbmdfZG9fbmJfZW5xdWV1ZV9tcChzdHJ1Y3Qg cnRlX3JpbmcgKnIsIHZvaWQgKiBjb25zdCAqb2JqX3RhYmxlLA0KPiA+ID4gKwkJCcKgwqDCoMKg dW5zaWduZWQgaW50IG4sDQo+ID4gPiArCQkJwqDCoMKgwqBlbnVtIHJ0ZV9yaW5nX3F1ZXVlX2Jl aGF2aW9yIGJlaGF2aW9yLA0KPiA+ID4gKwkJCcKgwqDCoMKgdW5zaWduZWQgaW50ICpmcmVlX3Nw YWNlKQ0KPiA+ID4gK3sNCj4gPiA+ICsjaWYgIWRlZmluZWQoUlRFX0FSQ0hfWDg2XzY0KSB8fCAh ZGVmaW5lZChBTExPV19FWFBFUklNRU5UQUxfQVBJKQ0KPiA+ID4gKwlSVEVfU0VUX1VTRUQocik7 DQo+ID4gPiArCVJURV9TRVRfVVNFRChvYmpfdGFibGUpOw0KPiA+ID4gKwlSVEVfU0VUX1VTRUQo bik7DQo+ID4gPiArCVJURV9TRVRfVVNFRChiZWhhdmlvcik7DQo+ID4gPiArCVJURV9TRVRfVVNF RChmcmVlX3NwYWNlKTsNCj4gPiA+ICsjaWZuZGVmIEFMTE9XX0VYUEVSSU1FTlRBTF9BUEkNCj4g PiA+ICsJcHJpbnRmKCJbJXMoKV0gUklOR19GX05CIHJlcXVpcmVzIGFuIGV4cGVyaW1lbnRhbCBB UEkuIg0KPiA+ID4gKwnCoMKgwqDCoMKgwqDCoCIgUmVjb21waWxlIHdpdGggQUxMT1dfRVhQRVJJ TUVOVEFMX0FQSSB0byB1c2UgaXQuXG4iDQo+ID4gPiArCcKgwqDCoMKgwqDCoMKgLCBfX2Z1bmNf Xyk7DQo+ID4gPiArI2VuZGlmDQo+ID4gPiArCXJldHVybiAwOw0KPiA+ID4gKyNlbmRpZg0KPiA+ ID4gKyNpZiBkZWZpbmVkKFJURV9BUkNIX1g4Nl82NCkgJiYgZGVmaW5lZChBTExPV19FWFBFUklN RU5UQUxfQVBJKQ0KPiA+ID4gKwlzaXplX3QgaGVhZCwgbmV4dCwgdGFpbDsNCj4gPiA+ICsJdWlu dDMyX3QgZnJlZV9lbnRyaWVzOw0KPiA+ID4gKwl1bnNpZ25lZCBpbnQgaTsNCj4gPiA+ICsNCj4g PiA+ICsJbiA9IF9fcnRlX3JpbmdfbW92ZV9wcm9kX2hlYWRfNjQociwgMCwgbiwgYmVoYXZpb3Is DQo+ID4gPiArCQkJCQnCoCZoZWFkLCAmbmV4dCwgJmZyZWVfZW50cmllcyk7DQo+ID4gPiArCWlm IChuID09IDApDQo+ID4gPiArCQlnb3RvIGVuZDsNCj4gPiA+ICsNCj4gPiA+ICsJZm9yIChpID0g MDsgaSA8IG47IC8qIGkgaW5jcmVtZW50ZWQgaWYgZW5xdWV1ZSBzdWNjZWVkcyAqLykgew0KPiA+ ID4gKwkJc3RydWN0IG5iX3JpbmdfZW50cnkgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7DQo+ID4gPiAr CQlzdHJ1Y3QgbmJfcmluZ19lbnRyeSAqcmluZ19wdHI7DQo+ID4gPiArDQo+ID4gPiArCQkvKiBF bnF1ZXVlIHRvIHRoZSB0YWlsIGVudHJ5LiBJZiBhbm90aGVyIHRocmVhZCB3aW5zIHRoZQ0KPiA+ ID4gcmFjZSwNCj4gPiA+ICsJCcKgKiByZXRyeSB3aXRoIHRoZSBuZXcgdGFpbC4NCj4gPiA+ICsJ CcKgKi8NCj4gPiA+ICsJCXRhaWwgPSByLT5wcm9kXzY0LnRhaWw7DQo+ID4gPiArDQo+ID4gPiAr CQlyaW5nX3B0ciA9ICYoKHN0cnVjdCBuYl9yaW5nX2VudHJ5ICopJnJbMV0pW3RhaWwgJiByLQ0K PiA+ID4gPm1hc2tdOw0KPiA+IFRoaXMgaXMgYW4gdWdseSBleHByZXNzaW9uIGFuZCBjYXN0LiBB bHNvIEkgdGhpbmsgaXQgaXMgdW5uZWNlc3NhcnkuIFdoYXQncw0KPiA+IHByZXZlbnRpbmcgdGhp cyBmcm9tIGJlaW5nIHdyaXR0ZW4gd2l0aG91dCBhIGNhc3Q/IFBlcmhhcHMgdGhlIHJpbmcgYXJy YXkNCj4gPiBuZWVkcw0KPiA+IHRvIGJlIGEgdW5pb24gb2YgInZvaWQgKiIgYW5kIHN0cnVjdCBu Yl9yaW5nX2VudHJ5Pw0KPiBUaGUgY2FzdCBpcyBuZWNlc3NhcnkgZm9yIHRoZSBjb3JyZWN0IHBv aW50ZXIgYXJpdGhtZXRpYyAobGV0ICJ1aW50cHRyX3QgYmFzZQ0KPiA9PSAmclsxXSIpOg0KWWVz IEkga25vdyB0aGUgQyBsYW5ndWFnZS4NCg0KPiAtIFdpdGggY2FzdDogcmluZ19wdHIgPSBiYXNl ICsgc2l6ZW9mKHN0cnVjdCBuYl9yaW5nX2VudHJ5KSAqICh0YWlsICYgci0NCj4gPm1hc2spOw0K PiAtIFcvbyBjYXN0OiByaW5nX3B0ciA9IGJhc2UgKyBzaXplb2Yoc3RydWN0IHJ0ZV9yaW5nKSAq ICh0YWlsICYgci0+bWFzayk7DQo+IA0KPiBGV0lXLCB0aGlzIGlzIGVzc2VudGlhbGx5IHRoZSBz YW1lIGFzIGlzIGRvbmUgd2l0aCB0aGUgc2Vjb25kIGFyZ3VtZW50ICgmclsxXSkNCj4gdG8gRU5R VUVVRV9QVFJTIGFuZCBERVFVRVVFX1BUUlMsIGJ1dCB0aGVyZSBpdCdzIHNwbGl0IGFjcm9zcyBt dWx0aXBsZSBsaW5lcw0KPiBvZiBjb2RlLiBUaGUgZXF1aXZhbGVudCBoZXJlIHdvdWxkIGJlOg0K PiDCoA0KPiBzdHJ1Y3QgbmJfcmluZ19lbnRyeSAqcmluZ19iYXNlID0gKHN0cnVjdCBuYl9yaW5n X2VudHJ5KikmclsxXTsNCj4gcmluZ19wdHIgPSByaW5nX2Jhc2VbdGFpbCAmIHItPm1hc2tdOw0K PiANCj4gV2hpY2ggaXMgbW9yZSBsZWdpYmxlLCBJIHRoaW5rLg0KVGhlIFJURSByaW5nIGJ1ZmZl ciBjb2RlIGlzIG5vdCB2ZXJ5IGxlZ2libGUgdG8gc3RhcnQgd2l0aC4NCg0KPiANCj4gVGhlcmUg aXMgbm8gcmluZyBhcnJheSBzdHJ1Y3R1cmUgaW4gd2hpY2ggdG8gYWRkIGEgdW5pb247IHRoZSBy aW5nIGFycmF5IGlzIGENCj4gY29udGlndW91cyBjaHVuayBvZiBtZW1vcnkgdGhhdCBpbW1lZGlh dGVseSBmb2xsb3dzIGFmdGVyIHRoZSBlbmQgb2YgYSBzdHJ1Y3QNCj4gcnRlX3JpbmcuIFdlIGlu dGVycHJldCB0aGUgbWVtb3J5IHRoZXJlIGFjY29yZGluZyB0byB0aGUgcmluZyBlbnRyeSBkYXRh IHR5cGUNCj4gKHZvaWQgKiBmb3IgcmVndWxhciByaW5ncyBhbmQgc3RydWN0IG5iX3JpbmdfZW50 cnkgZm9yIG5vbi1ibG9ja2luZyByaW5ncykuDQpNeSB3b3JyeSBpcyB0aGF0IHdlIGFyZSBhYnVz aW5nIHRoZSBDIGxhbmd1YWdlIGFuZCBjcmVhdGluZyBhIG1vbnN0ZXIgb2YgZnJhZ2lsZQ0KQyBj b2RlIHRoYXQgd2lsbCBiZSBtb3JlIGFuZCBtb3JlIGRpZmZpY3VsdCB0byB1bmRlcnN0YW5kIGFu ZCB0byBtYWludGFpbi4gQXQNCnNvbWUgcG9pbnQgeW91IGhhdmUgdG8gdGhpbmsgdGhlIHF1ZXN0 aW9uICJBcmUgd2UgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nPyIuDQoNCj4gDQo+ID4gDQo+ID4gDQo+ ID4gPiANCj4gPiA+ICsNCj4gPiA+ICsJCW9sZF92YWx1ZSA9ICpyaW5nX3B0cjsNCj4gPiA+ICsN Cj4gPiA+ICsJCS8qIElmIHRoZSB0YWlsIGVudHJ5J3MgbW9kaWZpY2F0aW9uIGNvdW50ZXIgZG9l c24ndCBtYXRjaA0KPiA+ID4gdGhlDQo+ID4gPiArCQnCoCogcHJvZHVjZXIgdGFpbCBpbmRleCwg aXQncyBhbHJlYWR5IGJlZW4gdXBkYXRlZC4NCj4gPiA+ICsJCcKgKi8NCj4gPiA+ICsJCWlmIChv bGRfdmFsdWUuY250ICE9IHRhaWwpDQo+ID4gPiArCQkJY29udGludWU7DQo+ID4gQ29udGludWUg cmVzdGFydHMgdGhlIGxvb3AgYXQgdGhlIGNvbmRpdGlvbiB0ZXN0IGluIHRoZSBmb3Igc3RhdGVt ZW50LCAnaScNCj4gPiBhbmQgJ24nDQo+ID4gYXJlIHVuY2hhbmdlZC4gVGhlbiB3ZSByZS1yZWFk ICdwcm9kXzY0LnRhaWwnIGFuZCAncmluZ1t0YWlsICYgbWFza10nLiBJZg0KPiA+IHNvbWUNCj4g PiBvdGhlciB0aHJlYWQgbmV2ZXIgdXBkYXRlcyAncHJvZF82NC50YWlsJywgdGhlIHRlc3QgaGVy ZSAocmluZ1t0YWlsXS5jbnQgIT0NCj4gPiB0YWlsKSB3aWxsDQo+ID4gc3RpbGwgYmUgdHJ1ZSBh bmQgd2Ugd2lsbCBzcGluIGZvcmV2ZXIuDQo+ID4gDQo+ID4gV2FpdGluZyBmb3Igb3RoZXIgdGhy ZWFkcyA8PT4gYmxvY2tpbmcgYmVoYXZpb3VyIHNvIHRoaXMgaXMgbm90IGEgbm9uLQ0KPiA+IGJs b2NraW5nDQo+ID4gZGVzaWduLg0KPiA+IA0KPiBZb3UncmUgYWJzb2x1dGVseSByaWdodC4gVGhl IGlmLXN0YXRlbWVudCB3YXMgYWRkZWQgYXMgb3B0aW1pemF0aW9uIHRvIGF2b2lkDQo+IDEyOC1i aXQgY21wc2V0IG9wZXJhdGlvbnMgdGhhdCBhcmUga25vd24gdG8gZmFpbCwgYnV0IGluIHRoaXMg Zm9ybSBpdCB2aW9sYXRlcw0KPiB0aGUgbm9uLWJsb2NraW5nIGRlc2lnbi4NCj4gDQo+IEkgc2Vl IHR3byBzb2x1dGlvbnM6IDEpIGRyb3AgdGhlIGlmLXN0YXRlbWVudCBhbHRvZ2V0aGVyLCBvciAy KSBhdHRlbXB0IHRvDQo+IHVwZGF0ZSBwcm9kXzY0LnRhaWwgYmVmb3JlIGNvbnRpbnVpbmcuIEJv dGggcmVxdWlyZSBldmVyeSB0aHJlYWQgdG8gYXR0ZW1wdCB0bw0KPiB1cGRhdGUgcHJvZF82NC50 YWlsIG9uIGV2ZXJ5IGl0ZXJhdGlvbiwgYnV0ICMyIHdpbGwgcmVzdWx0IGluIGZld2VyIGZhaWxl ZA0KPiAxMjgtYml0IGNtcHNldHMuDQo+IA0KPiA+IA0KPiA+ID4gDQo+ID4gPiArDQo+ID4gPiAr CQkvKiBQcmVwYXJlIHRoZSBuZXcgZW50cnkuIFRoZSBjbnQgZmllbGQgbWl0aWdhdGVzIHRoZSBB QkENCj4gPiA+ICsJCcKgKiBwcm9ibGVtIG9uIHRoZSByaW5nIHdyaXRlLg0KPiA+ID4gKwkJwqAq Lw0KPiA+ID4gKwkJbmV3X3ZhbHVlLnB0ciA9IG9ial90YWJsZVtpXTsNCj4gPiA+ICsJCW5ld192 YWx1ZS5jbnQgPSB0YWlsICsgci0+c2l6ZTsNCj4gPiA+ICsNCj4gPiA+ICsJCWlmIChydGVfYXRv bWljMTI4X2NtcHNldCgodm9sYXRpbGUgcnRlX2ludDEyOF90DQo+ID4gPiAqKXJpbmdfcHRyLA0K PiA+ID4gKwkJCQkJwqAocnRlX2ludDEyOF90ICopJm9sZF92YWx1ZSwNCj4gPiA+ICsJCQkJCcKg KHJ0ZV9pbnQxMjhfdCAqKSZuZXdfdmFsdWUpKQ0KPiA+ID4gKwkJCWkrKzsNCj4gPiA+ICsNCj4g PiA+ICsJCS8qIEV2ZXJ5IHRocmVhZCBhdHRlbXB0cyB0aGUgY21wc2V0LCBzbyB0aGV5IGRvbid0 IGhhdmUNCj4gPiA+IHRvDQo+ID4gPiB3YWl0DQo+ID4gPiArCQnCoCogZm9yIHRoZSB0aHJlYWQg dGhhdCBzdWNjZXNzZnVsbHkgZW5xdWV1ZWQgdG8gdGhlIHJpbmcuDQo+ID4gPiArCQnCoCogVXNp bmcgYSA2NC1iaXQgdGFpbCBtaXRpZ2F0ZXMgdGhlIEFCQSBwcm9ibGVtIGhlcmUuDQo+ID4gPiAr CQnCoCoNCj4gPiA+ICsJCcKgKiBCdWlsdC1pbiB1c2VkIHRvIGhhbmRsZSB2YXJpYWJsZS1zaXpl ZCB0YWlsIGluZGV4Lg0KPiA+ID4gKwkJwqAqLw0KPiA+IEJ1dCBwcm9kXzY0LnRhaWwgaXMgNjQg Yml0cyBzbyBub3QgcmVhbGx5IHZhcmlhYmxlIHNpemU/DQo+ID4gDQo+IChTZWUgbmV4dCBjb21t ZW50KQ0KPiANCj4gPiANCj4gPiA+IA0KPiA+ID4gKwkJX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRf c3dhcCgmci0+cHJvZF82NC50YWlsLCB0YWlsLCB0YWlsDQo+ID4gPiArDQo+ID4gPiAxKTsNCj4g PiBXaGF0IG1lbW9yeSBvcmRlciBpcyByZXF1aXJlZCBoZXJlPyBXaHkgbm90IHVzZQ0KPiA+IF9f YXRvbWljX2NvbXBhcmVfZXhjaGFuZ2UoKSB3aXRoIGV4cGxpY2l0IG1lbW9yeSBvcmRlciBwYXJh bWV0ZXJzPw0KPiA+IA0KPiBUaGlzIGlzIGFuIGFydGlmYWN0IGZyb20gYW4gb2xkZXIgcGF0Y2hz ZXQgdGhhdCB1c2VkIHVpbnRwdHJfdCwgYW5kIGJlZm9yZSBJDQo+IGxlYXJuZWQgdGhhdCBvdGhl ciBwbGF0Zm9ybXMgY291bGQgc3VwcG9ydCB0aGlzIG5vbi1ibG9ja2luZyBhbGdvcml0aG0gKGhl bmNlDQo+IHRoZSBfX3N5bmMgdHlwZSBpbnRyaW5zaWMgd2FzIHN1ZmZpY2llbnQpLg0KPiANCj4g QXQgYW55IHJhdGUsIGFzIGRlc2NyaWJlZCBlYXJsaWVyIGluIHRoaXMgcmVzcG9uc2UsIEkgcGxh biBvbiB3cml0aW5nIHRoZXNlDQo+IGZ1bmN0aW9ucyB1c2luZyB0aGUgX19hdG9taWMgYnVpbHRp bnMgaW4gdGhlIG5leHQgcGF0Y2hzZXQuDQpHcmVhdC4NCg0KPiANCj4gPiANCj4gPiA+IA0KPiA+ ID4gKwl9DQo+ID4gPiArDQo+ID4gPiArZW5kOg0KPiA+ID4gKwlpZiAoZnJlZV9zcGFjZSAhPSBO VUxMKQ0KPiA+ID4gKwkJKmZyZWVfc3BhY2UgPSBmcmVlX2VudHJpZXMgLSBuOw0KPiA+ID4gKwly ZXR1cm4gbjsNCj4gPiA+ICsjZW5kaWYNCj4gPiA+ICt9DQo+ID4gPiArDQo+ID4gPiArLyoqDQo+ ID4gPiArICogQGludGVybmFsIEVucXVldWUgc2V2ZXJhbCBvYmplY3RzIG9uIHRoZSBub24tYmxv Y2tpbmcgcmluZw0KPiA+ID4gKyAqDQo+ID4gPiArICogQHBhcmFtIHINCj4gPiA+ICsgKsKgwqDC oEEgcG9pbnRlciB0byB0aGUgcmluZyBzdHJ1Y3R1cmUuDQo+ID4gPiArICogQHBhcmFtIG9ial90 YWJsZQ0KPiA+ID4gKyAqwqDCoMKgQSBwb2ludGVyIHRvIGEgdGFibGUgb2Ygdm9pZCAqIHBvaW50 ZXJzIChvYmplY3RzKS4NCj4gPiA+ICsgKiBAcGFyYW0gbg0KPiA+ID4gKyAqwqDCoMKgVGhlIG51 bWJlciBvZiBvYmplY3RzIHRvIGFkZCBpbiB0aGUgcmluZyBmcm9tIHRoZSBvYmpfdGFibGUuDQo+ ID4gPiArICogQHBhcmFtIGJlaGF2aW9yDQo+ID4gPiArICrCoMKgwqBSVEVfUklOR19RVUVVRV9G SVhFRDrCoMKgwqDCoEVucXVldWUgYSBmaXhlZCBudW1iZXIgb2YgaXRlbXMgdG8gdGhlDQo+ID4g PiArcmluZw0KPiA+ID4gKyAqwqDCoMKgUlRFX1JJTkdfUVVFVUVfVkFSSUFCTEU6IEVucXVldWUg YXMgbWFueSBpdGVtcyBhcyBwb3NzaWJsZSB0bw0KPiA+ID4gK3RoZSByaW5nDQo+ID4gPiArICog QHBhcmFtIGlzX3NwDQo+ID4gPiArICrCoMKgwqBJbmRpY2F0ZXMgd2hldGhlciB0byB1c2Ugc2lu Z2xlIHByb2R1Y2VyIG9yIG11bHRpLXByb2R1Y2VyIGhlYWQNCj4gPiA+ICt1cGRhdGUNCj4gPiA+ ICsgKiBAcGFyYW0gZnJlZV9zcGFjZQ0KPiA+ID4gKyAqwqDCoMKgcmV0dXJucyB0aGUgYW1vdW50 IG9mIHNwYWNlIGFmdGVyIHRoZSBlbnF1ZXVlIG9wZXJhdGlvbiBoYXMNCj4gPiA+ICtmaW5pc2hl ZA0KPiA+ID4gKyAqIEByZXR1cm4NCj4gPiA+ICsgKsKgwqDCoEFjdHVhbCBudW1iZXIgb2Ygb2Jq ZWN0cyBlbnF1ZXVlZC4NCj4gPiA+ICsgKsKgwqDCoElmIGJlaGF2aW9yID09IFJURV9SSU5HX1FV RVVFX0ZJWEVELCB0aGlzIHdpbGwgYmUgMCBvciBuIG9ubHkuDQo+ID4gPiArICovDQo+ID4gPiAr c3RhdGljIF9fcnRlX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50DQo+ID4gPiArX19ydGVfcmlu Z19kb19uYl9lbnF1ZXVlKHN0cnVjdCBydGVfcmluZyAqciwgdm9pZCAqIGNvbnN0ICpvYmpfdGFi bGUsDQo+ID4gPiArCQkJwqB1bnNpZ25lZCBpbnQgbiwgZW51bSBydGVfcmluZ19xdWV1ZV9iZWhh dmlvcg0KPiA+ID4gYmVoYXZpb3IsDQo+ID4gPiArCQkJwqB1bnNpZ25lZCBpbnQgaXNfc3AsIHVu c2lnbmVkIGludCAqZnJlZV9zcGFjZSkgew0KPiA+ID4gKwlpZiAoaXNfc3ApDQo+ID4gPiArCQly ZXR1cm4gX19ydGVfcmluZ19kb19uYl9lbnF1ZXVlX3NwKHIsIG9ial90YWJsZSwgbiwNCj4gPiA+ ICsJCQkJCQnCoMKgwqBiZWhhdmlvciwgZnJlZV9zcGFjZSk7DQo+ID4gPiArCWVsc2UNCj4gPiA+ ICsJCXJldHVybiBfX3J0ZV9yaW5nX2RvX25iX2VucXVldWVfbXAociwgb2JqX3RhYmxlLCBuLA0K PiA+ID4gKwkJCQkJCcKgwqDCoGJlaGF2aW9yLCBmcmVlX3NwYWNlKTsNCj4gPiA+ICt9DQo+ID4g PiArDQo+ID4gPiArLyoqDQo+ID4gPiArICogQGludGVybmFsDQo+ID4gPiArICrCoMKgwqBEZXF1 ZXVlIHNldmVyYWwgb2JqZWN0cyBmcm9tIHRoZSBub24tYmxvY2tpbmcgcmluZw0KPiA+ID4gKyhz aW5nbGUtY29uc3VtZXINCj4gPiA+IG9ubHkpDQo+ID4gPiArICoNCj4gPiA+ICsgKiBAcGFyYW0g cg0KPiA+ID4gKyAqwqDCoMKgQSBwb2ludGVyIHRvIHRoZSByaW5nIHN0cnVjdHVyZS4NCj4gPiA+ ICsgKiBAcGFyYW0gb2JqX3RhYmxlDQo+ID4gPiArICrCoMKgwqBBIHBvaW50ZXIgdG8gYSB0YWJs ZSBvZiB2b2lkICogcG9pbnRlcnMgKG9iamVjdHMpLg0KPiA+ID4gKyAqIEBwYXJhbSBuDQo+ID4g PiArICrCoMKgwqBUaGUgbnVtYmVyIG9mIG9iamVjdHMgdG8gcHVsbCBmcm9tIHRoZSByaW5nLg0K PiA+ID4gKyAqIEBwYXJhbSBiZWhhdmlvcg0KPiA+ID4gKyAqwqDCoMKgUlRFX1JJTkdfUVVFVUVf RklYRUQ6wqDCoMKgwqBEZXF1ZXVlIGEgZml4ZWQgbnVtYmVyIG9mIGl0ZW1zIGZyb20NCj4gPiA+ ICsgdGhlIHJpbmcNCj4gPiA+ICsgKsKgwqDCoFJURV9SSU5HX1FVRVVFX1ZBUklBQkxFOiBEZXF1 ZXVlIGFzIG1hbnkgaXRlbXMgYXMgcG9zc2libGUgZnJvbQ0KPiA+ID4gKyB0aGUgcmluZw0KPiA+ ID4gKyAqIEBwYXJhbSBhdmFpbGFibGUNCj4gPiA+ICsgKsKgwqDCoHJldHVybnMgdGhlIG51bWJl ciBvZiByZW1haW5pbmcgcmluZyBlbnRyaWVzIGFmdGVyIHRoZSBkZXF1ZXVlDQo+ID4gPiArIGhh cw0KPiA+ID4gZmluaXNoZWQNCj4gPiA+ICsgKiBAcmV0dXJuDQo+ID4gPiArICrCoMKgwqAtIEFj dHVhbCBudW1iZXIgb2Ygb2JqZWN0cyBkZXF1ZXVlZC4NCj4gPiA+ICsgKsKgwqDCoMKgwqBJZiBi ZWhhdmlvciA9PSBSVEVfUklOR19RVUVVRV9GSVhFRCwgdGhpcyB3aWxsIGJlIDAgb3IgbiBvbmx5 Lg0KPiA+ID4gKyAqLw0KPiA+ID4gK3N0YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5lIHVuc2lnbmVk IGludA0KPiA+ID4gK19fcnRlX3JpbmdfZG9fbmJfZGVxdWV1ZV9zYyhzdHJ1Y3QgcnRlX3Jpbmcg KnIsIHZvaWQgKipvYmpfdGFibGUsDQo+ID4gPiArCQkJwqDCoMKgwqB1bnNpZ25lZCBpbnQgbiwN Cj4gPiA+ICsJCQnCoMKgwqDCoGVudW0gcnRlX3JpbmdfcXVldWVfYmVoYXZpb3IgYmVoYXZpb3Is DQo+ID4gPiArCQkJwqDCoMKgwqB1bnNpZ25lZCBpbnQgKmF2YWlsYWJsZSkNCj4gPiA+ICt7DQo+ ID4gPiArCXNpemVfdCBoZWFkLCBuZXh0Ow0KPiA+ID4gKwl1aW50MzJfdCBlbnRyaWVzOw0KPiA+ ID4gKw0KPiA+ID4gKwluID0gX19ydGVfcmluZ19tb3ZlX2NvbnNfaGVhZF82NChyLCAxLCBuLCBi ZWhhdmlvciwNCj4gPiA+ICsJCQkJCcKgJmhlYWQsICZuZXh0LCAmZW50cmllcyk7DQo+ID4gPiAr CWlmIChuID09IDApDQo+ID4gPiArCQlnb3RvIGVuZDsNCj4gPiA+ICsNCj4gPiA+ICsJREVRVUVV RV9QVFJTX05CKHIsICZyWzFdLCBoZWFkLCBvYmpfdGFibGUsIG4pOw0KPiA+ID4gKw0KPiA+ID4g KwlyLT5jb25zXzY0LnRhaWwgKz0gbjsNCj4gPiBNZW1vcnkgb3JkZXJpbmc/IENvbnN1bWVyIHN5 bmNocm9uaXNlcyB3aXRoIHByb2R1Y2VyLg0KPiA+IA0KPiBBZ3JlZWQsIHRoYXQgaXMgbWlzc2lu ZyBoZXJlLiBXaWxsIGZpeC4NCj4gDQo+IFRoYW5rcywNCj4gR2FnZQ0KPiANCj4gPiANCj4gPiAt LQ0KPiA+IE9sYSBMaWxqZWRhaGwsIE5ldHdvcmtpbmcgU3lzdGVtIEFyY2hpdGVjdCwgQXJtIFBo b25lICs0NjcwNjg2NjM3MywgU2t5cGUNCj4gPiBvbGEubGlsamVkYWhsDQotLSANCk9sYSBMaWxq ZWRhaGwsIE5ldHdvcmtpbmcgU3lzdGVtIEFyY2hpdGVjdCwgQXJtDQpQaG9uZSArNDY3MDY4NjYz NzMsIFNreXBlIG9sYS5saWxqZWRhaGwNCg0K