From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ola Liljedahl Subject: Re: [RFC] lfring: lock-free ring buffer Date: Fri, 1 Feb 2019 18:19:58 +0000 Message-ID: <1549045210.20325.15.camel@arm.com> References: <1548678513-14348-1-git-send-email-ola.liljedahl@arm.com> <9184057F7FC11744A2107296B6B8EB1E541CC413@FMSMSX108.amr.corp.intel.com> <1548714375.11472.76.camel@arm.com> <9184057F7FC11744A2107296B6B8EB1E541CD01D@FMSMSX108.amr.corp.intel.com> <1548848178.2915.40.camel@arm.com> <9184057F7FC11744A2107296B6B8EB1E541CDFAB@FMSMSX108.amr.corp.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Cc: nd To: Honnappa Nagarahalli , "bruce.richardson@intel.com" , "gage.eads@intel.com" , "dev@dpdk.org" Return-path: Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-eopbgr80042.outbound.protection.outlook.com [40.107.8.42]) by dpdk.org (Postfix) with ESMTP id 748171B4EC for ; Fri, 1 Feb 2019 19:20:01 +0100 (CET) In-Reply-To: <9184057F7FC11744A2107296B6B8EB1E541CDFAB@FMSMSX108.amr.corp.intel.com> Content-Language: en-US Content-ID: <93AA1805DC6E7140970C35749B462053@eurprd08.prod.outlook.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" T24gRnJpLCAyMDE5LTAyLTAxIGF0IDE1OjQwICswMDAwLCBFYWRzLCBHYWdlIHdyb3RlOg0KPiAN Cj4gPiANCj4gPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiA+IEZyb206IE9sYSBMaWxq ZWRhaGwgW21haWx0bzpPbGEuTGlsamVkYWhsQGFybS5jb21dDQo+ID4gU2VudDogV2VkbmVzZGF5 LCBKYW51YXJ5IDMwLCAyMDE5IDU6MzYgQU0NCj4gPiBUbzogSG9ubmFwcGEgTmFnYXJhaGFsbGkg PEhvbm5hcHBhLk5hZ2FyYWhhbGxpQGFybS5jb20+OyBSaWNoYXJkc29uLA0KPiA+IEJydWNlIDxi cnVjZS5yaWNoYXJkc29uQGludGVsLmNvbT47IEVhZHMsIEdhZ2UgPGdhZ2UuZWFkc0BpbnRlbC5j b20+Ow0KPiA+IGRldkBkcGRrLm9yZw0KPiA+IENjOiBuZCA8bmRAYXJtLmNvbT4NCj4gPiBTdWJq ZWN0OiBSZTogW1JGQ10gbGZyaW5nOiBsb2NrLWZyZWUgcmluZyBidWZmZXINCj4gPiANCj4gPiBP biBXZWQsIDIwMTktMDEtMzAgYXQgMDU6MTcgKzAwMDAsIEVhZHMsIEdhZ2Ugd3JvdGU6DQo+ID4g PFNOSVA+DQo+ID4gPiANCj4gPiA+IA0KPiA+ID4gPiANCj4gPiA+ID4gPiANCj4gPiA+ID4gPiAy LiBPbiB0aGUgcGx1cyBzaWRlLCB0aGUgZW5xdWV1ZSBmdW5jdGlvbiBkZXNpZ24gdGhhdCBhbGxv d3MgaXQgdG8NCj4gPiA+ID4gPiB1c2UNCj4gPiA+ID4gPiAxLzIgdGhlIGF0b21pY3Mgb2YgbWlu ZSBhcHBlYXJzIHRvIGJlIGluZGVwZW5kZW50IG9mIHJlc2VydmluZw0KPiA+ID4gPiA+IHJpbmcg c2xvdHMsIGFuZCBzaG91bGQgdHJhbnNmZXIgb3ZlciBmYWlybHkgY2xlYW5seS4gSSdtIGEgbGl0 dGxlDQo+ID4gPiA+ID4gY29uY2VybmVkIGFib3V0IHRoZSBwZXJmb3JtYW5jZSB2YXJpYWJpbGl0 eSBpdCBpbnRyb2R1Y2VzIChpLmUuIGlmDQo+ID4gPiA+ID4gdGhlIHRocmVhZCBnZXRzIGludG8g ImNhdGNoIHVwIiBtb2RlKSwNCj4gPiA+ID4gSWYgYSB0aHJlYWQgaGFzIHRvIGNhdGNoIHVwLCBp dCBtZWFucyBpdCBpcyB1c2luZyBhIHN0YWxlDQo+ID4gPiA+IChoZWFkL3RhaWwpIGluZGV4ICht b3JlIHRoYW4gb25lIHJpbmcgbGFwIGJlaGFpbmQpLiBCZXR0ZXIgdG8gdHJ5IHRvDQo+ID4gPiA+ IGxvYWQgYSBmcmVzaCB2YWx1ZSAoaWYgb25lIGlzDQo+ID4gPiA+IGF2YWlsYWJsZSkgdGhhbiB0 byBpdGVyYXRlIG92ZXIgdGhlIHJpbmcgdW50aWwgaXQgaGFzIGNhdWdodCB1cC4gU28NCj4gPiA+ ID4gSSB0aGluayB0aGlzIGlzIHRoZSBiZXR0ZXIvZmFzdGVyIGRlc2lnbi4NCj4gPiA+ID4gDQo+ ID4gPiA+IENhdGNoIHVwIG1vZGUgaXMgbm90IHRyaWdnZXJlZCBieSBmaW5kaW5nIGFuIG9jY3Vw aWVkIHNsb3QgZm9yIHRoZQ0KPiA+ID4gPiBjdXJyZW50IGxhcCAodGhhdCB3YXMganVzdCB3cml0 dGVuIGJ5IHNvbWUgb3RoZXIgdGhyZWFkKS4gT3IgYXQNCj4gPiA+ID4gbGVhc3QgdGhpcyBpcyB0 aGUgaWRlYS4NCj4gPiA+ID4gSWYgd2UNCj4gPiA+ID4gZmluZCBhIGZyZXNobHkgd3JpdHRlbiBz bG90LCB3ZSBqdXN0IG1vdmUgdG8gdGhlIG5leHQgc2xvdC4NCj4gPiA+ID4gDQo+ID4gPiA+ID4g DQo+ID4gPiA+ID4gDQo+ID4gPiA+ID4gcGFydGljdWxhcmx5IGZvciBsYXJnZXIgcmluZ3MsIHNp bmNlIHJlYWwtdGltZSBzb2Z0d2FyZSB2YWx1ZXMNCj4gPiA+ID4gPiBwcmVkaWN0YWJpbGl0eS4N Cj4gPiA+ID4gPiBXaGF0IGlmIHRoZSByZWxvYWQgY3JpdGVyaWEgd2FzIGluc3RlYWQgc29tZXRo aW5nIGxpa2U6DQo+ID4gPiA+ID4gDQo+ID4gPiA+ID4gI2RlZmluZSBFTlFfUkVUUllfTElNSVQg MzIgLy9hcmJpdHJhcnkNCj4gPiA+ID4gPiANCj4gPiA+ID4gPiBpZiAob2xkLmUuaWR4ICE9IHRh aWwgLSBzaXplKSB7DQo+ID4gPiA+ID4gwqDCoMKgwqBpZiAoKytmYWlsX2NudCA8IEVOUV9SRVRS WV9MSU1JVCkgew0KPiA+ID4gPiA+IMKgwqDCoMKgwqDCoMKgwqB0YWlsKys7DQo+ID4gPiA+ID4g wqDCoMKgwqB9IGVsc2Ugew0KPiA+ID4gPiA+IMKgwqDCoMKgwqDCoMKgwqBmYWlsX2NudCA9IDA7 DQo+ID4gPiA+ID4gwqDCoMKgwqDCoMKgwqDCoHRhaWwgPSBydGVfbGZyaW5nX3JlbG9hZCguLi4p Ow0KPiA+ID4gPiA+IMKgwqDCoMKgfQ0KPiA+ID4gPiA+IMKgwqDCoMKgZ290byByZXN0YXJ0Ow0K PiA+ID4gPiA+IH0NCj4gPiA+ID4gPiBmYWlsX2NudCA9IDA7DQo+ID4gPiA+IFRoZXJlIGFyZSB0 aHJlZSBjYXNlcyAoc2xvdCBpbmRleCBtdXN0IGJlIGJldHdlZW4gcS0+dGFpbCBhbmQNCj4gPiA+ ID4gcS0+aGVhZCArIHEtDQo+ID4gPiA+ID4gDQo+ID4gPiA+ID4gDQo+ID4gPiA+ID4gc2l6ZSk6 DQo+ID4gPiA+IHNsb3QuaWR4ID09IHRhaWwgLSBzaXplOiBzbG90IGlzIGZyZWUsIHRyeSB0byB3 cml0ZSBpdCBzbG90LmlkeCA9PSB0YWlsOg0KPiA+ID4gPiBzbG90IGhhcyBqdXN0IGJlZW4NCj4g PiA+ID4gd3JpdHRlbiAoYnkgb3RoZXIgdGhyZWFkKSwgc2tpcCB0byBuZXh0IHNsb3QgKHRhaWwr Kykgbm9uZSBvZiB0aGUgYWJvdmU6DQo+ID4gPiA+IHRocmVhZCBpcw0KPiA+ID4gPiBiZWhpbmQg KGF0IGxlYXN0IG9uZSBsYXApLCByZS1sb2FkIHRhaWwgZnJvbSBxLQ0KPiA+ID4gPiA+IA0KPiA+ ID4gPiA+IA0KPiA+ID4gPiA+IHRhaWwNCj4gPiA+ID4gSSB0aGluayB1c2luZyB0aGUgcmV0cnkg Y291bnQgYWN0dWFsbHkgZGVsYXlzIGNhdGNoaW5nIHVwIHRvIGEgZnJlc2gNCj4gPiA+ID4gcG9z aXRpb24uDQo+ID4gPiA+IA0KPiA+ID4gTWlzY29tbXVuaWNhdGlvbiBoZXJlIC0tIGJ5ICJjYXRj aCB1cCIsIEkgbWVhbnQgdGhlIGNhc2Ugd2hlcmUgdGhlDQo+ID4gPiB0aHJlYWQgaXMgYmVoaW5k IGJ1dCBieSBsZXNzIHRoYW4gb25lIGxhcCAodGhlIHNlY29uZCBjYXNlIHlvdQ0KPiA+ID4gZGVz Y3JpYmUpLiBJbiB0aGUgd29yc3QgY2FzZSwgdGhlIHRocmVhZCB3b3VsZCBoYXZlIHRvIHJlYWQg Ti0xIChOID0NCj4gPiA+IHJpbmcgc2l6ZSkgZW50cmllcyBiZWZvcmUgcmVhY2hpbmcgdGhlIG5l eHQgYXZhaWxhYmxlIGVudHJ5LCBhbmQgTiBjb3VsZA0KPiA+ID4gZWFzaWx5DQo+ID4gYmUgaW4g dGhlIHRob3VzYW5kcy4NCj4gPiA+IA0KPiA+ID4gVGhhdCdzIHRoZSBwZXJmb3JtYW5jZSB2YXJp YWJpbGl0eSBJIHdhcyByZWZlcnJpbmcgdG8sIGFuZCB3aHkgSQ0KPiA+ID4gc3VnZ2VzdGVkIGNh cHBpbmcgdGhlIGZhaWxlZCBzbG90IHJlYWRzIGF0IDMyLiBNYWludGFpbmluZyBhIGxvY2FsDQo+ ID4gPiBmYWlsX2NudCB2YXJpYWJsZSBpcyBhIHNtYWxsIHByaWNlIHRvIHBheSAocmVsYXRpdmUg dG8gYSBDQVMpIHRvDQo+ID4gPiBwcmV2ZW50IGEgcmluZyBlbnF1ZXVlIGxhdGVuY3kgc3Bpa2Uu DQo+ID4gT0ssIEkgbWlzdW5kZXJzdG9vZC4gV2UgY2FuIHJlbG9hZCB0aGUgcHJpdmF0ZSB0YWls IGZyb20gdGhlIHNoYXJlZCByaW5nDQo+ID4gYnVmZmVyDQo+ID4gdGFpbCBlYXJsaWVyLiBZb3Ug Y291bGQgYWN0dWFsbHkgZG8gdGhpcyBvbiBldmVyeSBmYWlsZWQgQ0FTIGJ1dCBJIHRoaW5rDQo+ ID4gdGhhdCB3b3VsZA0KPiA+IGJlIG92ZXJraWxsLiBZb3VyIGRlc2lnbiB3aXRoIGEgcmV0cnkg bGltaXQgaXMgYmV0dGVyLCB3ZSBuZWVkIHRvIGZpbmQgb3V0DQo+ID4gd2hhdCBpcyBhDQo+ID4g c3VpdGFibGUgdmFsdWUgZm9yIHRoZSByZXRyeSBsaW1pdC4NCj4gPiANCj4gVG9vIGxhdGUgZm9y IGxmcmluZyB2MiB1bmZvcnR1bmF0ZWx5LCBidXQgdGhpcyBpZGVhIHdpbGwgYWN0dWFsbHkgYnJl YWsgbG9jay0NCj4gZnJlZWRvbS4gRm9yIGV4YW1wbGUsIHNheSB0aGUgdGFpbCBpbmRleCBpcyAz MyBzbG90cyBiZWhpbmQgdGhlIG5leHQgYXZhaWxhYmxlDQo+IHNsb3QuIEFuIGVucXVldWVpbmcg dGhyZWFkIHdvdWxkIGdldCBzdHVjayByZXRyeWluZyBzbG90cyBmcm9tIHRhaWwgaW5kZXggLT4N Cj4gdGFpbCBpbmRleCArIDMyIHVudGlsIGFub3RoZXIgdGhyZWFkIHVwZGF0ZXMgdGhlIHRhaWwg aW5kZXguwqANCkkgZG9uJ3QgdGhpbmsgdGhpcyBpcyB0cnVlLg0KDQpJZiB3ZSBoaXQgdGhlIHJl dHJ5IGxpbWl0LCB3ZSBkbzogdGFpbCA9IF9ydGVfbGZyaW5nX3JlbG9hZCgmci0+dGFpbCwgdGFp bCk7DQp3aGVyZSB3ZSBvYnRhaW4gYSBmcmVzaCBjb3B5IG9mIHRoZSBzaGFyZWQgcmluZy0+dGFp bCB2YWx1ZSBidXQgb25seSB1c2UgdGhpcyBpZg0KaXQgaXMgImxhcmdlciIgKHVzaW5nIHNlcmlh bCBudW1iZXIgYXJpdGhtZXRpYykgdGhhbiBvdXIgcHJpdmF0ZSB0YWlsIHZhcmlhYmxlLg0KSWYg cmluZy0+dGFpbCBoYXNuJ3QgYmVlbiB1cGRhdGVkIHlldCwgd2UgY29udGludWUgdG8gdXNlIG91 ciBwcml2YXRlIHRhaWwgYnV0DQppbmNyZW1lbnQgaXQgdG8gdGhlIG5leHQgc2xvdC4gV2UgbmV2 ZXIgZ28gYmFja3dhcmRzLg0KDQpzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZSB1aW50NjRfdA0K X3J0ZV9sZnJpbmdfcmVsb2FkKGNvbnN0IHVpbnQ2NF90ICpsb2MsIHVpbnQ2NF90IGlkeCkNCnsN CsKgwqDCoMKgwqDCoMKgwqB1aW50NjRfdCBmcmVzaCA9IF9fYXRvbWljX2xvYWRfbihsb2MsIF9f QVRPTUlDX1JFTEFYRUQpOw0KwqDCoMKgwqDCoMKgwqDCoGlmIChfcnRlX2xmcmluZ19iZWZvcmUo aWR4LCBmcmVzaCkpIHsNCsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLyogZnJlc2gg aXMgYWZ0ZXIgaWR4LCB1c2UgdGhpcyBpbnN0ZWFkICovDQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlkeCA9IGZyZXNoOw0KwqDCoMKgwqDCoMKgwqDCoH0gZWxzZSB7DQrCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIENvbnRpbnVlIHdpdGggbmV4dCBzbG90ICovDQrC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlkeCsrOw0KwqDCoMKgwqDCoMKgwqDCoH0N CsKgwqDCoMKgwqDCoMKgwqByZXR1cm4gaWR4Ow0KfQ0KPiANCj4gPiANCj4gPiA+IA0KPiA+ID4g DQo+ID4gPiBCdXQgeW91J3JlIHJpZ2h0IHRoYXQgd2Ugc2hvdWxkIHN0aWxsIGNhdGNoIHRoZSAx KyBsYXAgYmVoaW5kIGNhc2UsIHNvDQo+ID4gPiB0aGUgcmVsb2FkIGNyaXRlcmlhIGNvdWxkIGJl Og0KPiA+ID4gDQo+ID4gPiAjZGVmaW5lIEVOUV9SRVRSWV9MSU1JVCAzMiAvL2FyYml0cmFyeQ0K PiA+ID4gDQo+ID4gPiBpZiAob2xkLmUuaWR4ICE9IHRhaWwgLSBzaXplKSB7DQo+ID4gPiDCoMKg wqDCoGlmICgrK2ZhaWxfY250IDwgRU5RX1JFVFJZX0xJTUlUICYmIG9sZC5lLmlkeCA9PSB0YWls KSB7DQo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgdGFpbCsrOw0KPiA+ID4gwqDCoMKgwqB9IGVsc2Ug ew0KPiA+ID4gwqDCoMKgwqDCoMKgwqDCoGZhaWxfY250ID0gMDsNCj4gPiA+IMKgwqDCoMKgwqDC oMKgwqB0YWlsID0gcnRlX2xmcmluZ19yZWxvYWQoLi4uKTsNCj4gPiA+IMKgwqDCoMKgfQ0KPiA+ ID4gwqDCoMKgwqBnb3RvIHJlc3RhcnQ7DQo+ID4gPiB9DQo+ID4gPiBmYWlsX2NudCA9IDA7DQo+ ID4gQWdyZWUuDQo+ID4gDQo+ID4gPiANCj4gPiA+IA0KPiA+ID4gPiANCj4gPiA+ID4gDQo+ID4g PiA+ID4gDQo+ID4gPiA+ID4gDQo+ID4gPiA+ID4gDQo+ID4gPiA+ID4gMy4gVXNpbmcgYSB6ZXJv LWxlbmd0aCBhcnJheSB0byBtYXJrIHRoZSBzdGFydCBvZiB0aGUgcmluZyBpcyBhDQo+ID4gPiA+ ID4gbmljZSBhcHByb2FjaA0KPiA+ID4gPiA+IC0tIEknbGwgaW5jb3Jwb3JhdGUgdGhhdCBpbnRv IHRoZSBwYXRjaHNldC4NCj4gPiA+ID4gPiANCj4gPiA+ID4gPiBBdCBhbiBhbGdvcml0aG0gbGV2 ZWwsIEkgZG9uJ3Qgc2VlIGFueSBvdGhlciBkaWZmZXJlbmNlcy4NCj4gPiA+ID4gPiBJbXBsZW1l bnRhdGlvbi13aXNlLCB3ZSdsbCBuZWVkIHRvIG5haWwgdGhlIG1lbW9yeSBvcmRlcmluZyBmbGFn cw0KPiA+ID4gPiA+IHRvIGJlc3Qgc3VwcG9ydCB3ZWFrIGNvbnNpc3RlbmN5IG1hY2hpbmVzLCBh cyB5b3UgcG9pbnRlZCBvdXQNCj4gPiA+ID4gPiBlbHNld2hlcmUuDQo+ID4gPiA+IFRoZXJlIGlz IG5vIHByZS1hY3F1aXNpdGlvbiBvZiBzbG90cyBpbiBlbnF1ZXVlIGFuZCBkZXF1ZXVlLiBUaGF0 DQo+ID4gPiA+IHNlcGFyYXRlIHN0ZXAgbWFrZXMgbG9jay1mcmVlZG9tIGltcG9zc2libGUgKEkg dGhpbmspLg0KPiA+ID4gPiANCj4gPiA+IENhbiB5b3UgZWxhYm9yYXRlPw0KPiA+IEkgdGhpbmsg bG9jay1mcmVlZG9tIGlzIGltcG9zc2libGUgd2l0aCB0aGUgaW5pdGlhbCBhY3F1aXNpdGlvbiBv ZiBlbGVtZW50cy4NCj4gPiBUaGlzIGFjcXVpc2l0aW9uIGNyZWF0ZXMgYSBzaWRlIGVmZmVjdCB0 aGF0IGNhbm5vdCBiZSB1bmRvbmUgb3IgaGVscGVkIGJ5DQo+ID4gb3RoZXINCj4gPiB0aHJlYWRz Lg0KPiA+IA0KPiA+IFlvdSBjYW4gc3RpbGwgaW1wbGVtZW50IGEgIm5vbi1ibG9ja2luZyIgcmlu ZyBidWZmZXIgKGxpa2UgeW91ciBvcmlnaW5hbA0KPiA+IGRlc2lnbikNCj4gPiB3aGljaCBoaWRl cyBhbnkgZGVsYXkgaW4gdGhyZWFkcyB0aGF0IGFjY2VzcyB0aGUgcmluZyBidWZmZXIgYnV0IGlz bid0DQo+ID4gcHJvcGVybHkNCj4gPiBsb2NrLWZyZWUgKHdoaWNoIGNvdWxkIGJlIGNvbnNpZGVy ZWQgdW5uZWNlc3NhcnkgaW4gYSBEUERLIGVudmlyb25tZW50LA0KPiA+IHRocmVhZHMgbWF5IGdl dCBkZWxheWVkIGJ1dCBzaG91bGRuJ3QgZGllIG9yIGJsb2NrIGZvcmV2ZXIpLg0KPiA+IA0KPiBJ IHRoaW5rIEkgc2VlIHdoYXQgeW91J3JlIHNheWluZy4gRm9yIGV4YW1wbGUgSWYgYSBkZXF1ZXVl aW5nIHRocmVhZCByZXNlcnZlcw0KPiBOIGVsZW1lbnRzIGFuZCB0aGVuIGlzIHByZWVtcHRlZCwg aXQncyBlZmZlY3RpdmVseSByZWR1Y2VkIHRoZSBudW1iZXIgb2YNCj4gYXZhaWxhYmxlIGVsZW1l bnRzIGJ5IE4gZHVyaW5nIHRoYXQgcGVyaW9kLg0KPiANCj4gUHJhY3RpY2FsbHkgc3BlYWtpbmcs IEkgZG9uJ3QgdGhpbmsgdGhpcyBpcyBhIHByb2JsZW0uIE5vdCBqdXN0IGJlY2F1c2UNCj4gdGhy ZWFkcyBzaG91bGRuJ3QgZGllIG9yIGJsb2NrIGZvcmV2ZXIsIGJ1dCBpZiBhIHRocmVhZCBjYW4g YmUgcHJlZW1wdGVkIGFmdGVyDQo+IHJlc2VydmluZyBOIHJpbmcgc2xvdHMgKGJ1dCBiZWZvcmUg ZW5xdWV1ZWluZyB0byBvciBkZXF1ZXVlaW5nIGZyb20gdGhlbSksIHRoZQ0KPiBuZXQgZWZmZWN0 IGlzIHRob3NlIE4gYnVmZmVycyBhcmUgdGFrZW4gb3V0IG9mIHRoZSBzeXN0ZW0uIFRoaXMgaXNu J3QgcmVhbGx5DQo+IGRpZmZlcmVudCB0aGFuIGlmIGl0IHRoYXQgdGhyZWFkIHdhcyBwcmVlbXB0 ZWQgKm91dHNpZGUqIG9mIHRoZSByaW5nIGZ1bmN0aW9ucw0KPiB3aGlsZSBob2xkaW5nIE4gYnVm ZmVycyAtLSB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGJlIGRlc2lnbmVkIHRvIGJlIHJlc2lsaWVu dA0KPiB0byB0aGF0Lg0KWWVzLCBwcmFjdGljYWxseSBzcGVha2luZywgdGhpcyBiZWhhdmlvdXIg aXMgdW5saWtlbHkgdG8gcG9zZSBhIHByb2JsZW0gZm9yIERQREsNCmFwcGxpY2F0aW9ucy4gQnV0 IHRoZSB1cGRhdGUgb2YgYW5vdGhlciBwaWVjZSBvZiBtZXRhZGF0YSB3aWxsIGRlY3JlYXNlDQpz Y2FsYWJpbGl0eSAodW5sZXNzIGVhY2ggb2YgcHJvZC9jb25zIGhlYWQvdGFpbCBpcyBpbiBhIHNl cGFyYXRlIGNhY2hlIGxpbmUgYnV0DQp0aGF0J3MgYSBsb3Qgb2YgbW9zdGx5IGVtcHR5IGNhY2hl IGxpbmVzKS4NCg0KSWYgd2Ugb25seSBuZWVkIHRoZSBub24tYmxvY2tpbmcgYmVoYXZpb3IgaW4g RFBESyAodG8gaGFuZGxlIHZhcmlhYmxlIGxhdGVuY3kNCmFuZCB1bmV4cGVjdGVkIGRlbGF5cyBm cm9tIHRocmVhZHMgdGhhdCBhY2Nlc3MgdGhlIHJpbmcgYnVmZmVyIG9yIGFueSBkYXRhDQpzdHJ1 Y3R1cmUgdGhhdCB1c2VzIHRoZSByaW5nIGJ1ZmZlciksIHRoZXJlIGFyZSBvdGhlciB3YXlzIHRv IGFjaGlldmUgdGhhdCB0aGF0DQp3aWxsIGJlIG1vcmUgZWZmaWNpZW50IHRoYW4gYSBsb2NrLWZy ZWUgcmluZyBsaWtlIHRoaXMgb3IgeW91ciBuYmxrIHJpbmcgd2hpY2gNCm5lZWQgdG8gcGVyZm9y bSBhIENBUyBwZXIgZWxlbWVudCBhbmQgdGhlbiBzb21lIGV4dHJhIENBUyBvcGVyYXRpb25zLg0K DQo+IA0KPiA+IA0KPiA+ID4gDQo+ID4gPiDCoEkgZG9uJ3QgY3VycmVudGx5IHNlZSBhbnkgb3Ro ZXIgd2F5IHRvIHN1cHBvcnQgcnRlX3JpbmcgYnVsaw0KPiA+ID4gc2VtYW50aWNzLCB3aGljaCBp cyBuZWNlc3NhcnkgZm9yIGNyZWF0aW5nIGEgbm9uLWJsb2NraW5nIG1lbXBvb2wNCj4gPiA+IGhh bmRsZXIsIHNvIHdlIHNob3VsZCBjbGVhciB1cCBhbnkgZG91YnQuDQo+ID4gT0ssIEkgd2Fzbid0 IGF3YXJlIG9mIHRoaXMgc3RyaWN0IGRlcGVuZGVuY3kgb24gYnVsayBlbnF1ZXVlIGFuZCBkZXF1 ZXVlLg0KPiA+IEJ1bGsNCj4gPiBkZXF1ZXVlIChtZW1wb29sIGFsbG9jYXRlcyBidWZmZXJzIGZy b20gdGhlIHJpbmcpIHNob3VsZCBiZSBlYXN5IHRvIHN1cHBvcnQNCj4gPiB0aG91Z2guIEJ1bGsg ZW5xdWV1ZSAobWVtcG9vbCBmcmVlcyBidWZmZXJzIHRvIHRoZSByaW5nKSB3aWxsIHdvcmsgYXMg bG9uZw0KPiA+IGFzDQo+ID4gdGhlIHJpbmcgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIGZy ZWUgYnVmZmVycyBzbyBpdCBjYW4gbmV2ZXIgYmVjb21lDQo+ID4gZnVsbCAobmVlZA0KPiA+IHRv IHJlbG9hZCBoZWFkL3RhaWwgcG9pbnRlcnMgYXQgdGhlIGFwcHJvcHJpYXRlIHBsYWNlcyB0byBh dm9pZCBzcHVyaW91cw0KPiA+IGZ1bGwvZW1wdHkgc3RhdHVzKS4gSSBhc3N1bWUgdGhpcyBpcyB0 aGUgY2FzZSwgaW5pdGlhbGx5IGFsbCBmcmVlIGJ1ZmZlcnMNCj4gPiB3aWxsIGJlIHN0b3JlZA0K PiA+IGluIHRoZSByaW5nPw0KPiA+IA0KPiA+ID4gDQo+ID4gPiANCj4gPiA+IEluIHRoZSBOQiBy aW5nIHBhdGNoc2V0IGVhY2ggdGhyZWFkIHJlc2VydmVzIGEgbnVtYmVyIG9mIHNsb3RzIGJlZm9y ZQ0KPiA+ID4gcGVyZm9ybWluZyB0aGUgZW5xL2RlcSwgYnV0IGRvZXNuJ3QgcmVzZXJ2ZSAqc3Bl Y2lmaWMqIHNsb3RzICh1bmxpa2UNCj4gPiA+IHJ0ZV9yaW5nKS4gVGhpcyByZXNlcnZhdGlvbiBp cyBhdG9taWMsIHNvIHRoYXQgd2UgbmV2ZXIgb3Zlci1zdWJzY3JpYmUNCj4gPiA+IHZhbGlkIHJp bmcgZW50cmllcyAoZm9yIGRlcXVldWUpIG9yIHVudXNlZCByaW5nIGVudHJpZXMgKGZvciBlbnF1 ZXVlKS4NCj4gPiA+IFRoaXMgZ3VhcmFudGVlcyB0aGF0IHRoZSBlbnEvZGVxIG9wZXJhdGlvbiB3 aWxsIGV2ZW50dWFsbHkgY29tcGxldGUsDQo+ID4gPiByZWdhcmRsZXNzIG9mIHRoZSBiZWhhdmlv ciBvZiBvdGhlciB0aHJlYWRzLiBUaGlzIGlzIHdoeSB0aGUgZW5xdWV1ZQ0KPiA+ID4gbG9vcCBk b2Vzbid0IGNoZWNrIGlmIHNwYWNlIGlzIGF2YWlsYWJsZSBhbmQgdGhlIGRlcXVldWUgbG9vcCBk b2Vzbid0DQo+ID4gPiBjaGVjayBpZiBhbnkgbW9yZSB2YWxpZCBlbnRyaWVzIHJlbWFpbi4NCj4g PiBJIGluaXRpYWxseSB0aG91Z2h0IHRoZXNlIGFjcXVpc2l0aW9ucyB3ZXJlIGp1c3QgZm9yIGNv bXBhdGliaWxpdHkgd2l0aA0KPiA+IHJ0ZV9yaW5nDQo+ID4gKHVwZGF0ZSB0aGUgc2FtZSBtZXRh ZGF0YSBzbyB0aGF0IHRoZSB1c2VyIGNhbiBtaXggTVAvTUMgYW5kIFNQL1NDIGNhbGxzKQ0KPiA+ IGJ1dA0KPiA+IHJlYWxpc2UgdGhleSBhcmUgdGhlcmUgZm9yIHRoZSBidWxrIGVucXVldWUvZGVx dWV1ZS4gQnV0IGRvaW5nIHRoaXMNCj4gPiBhY3F1aXNpdGlvbg0KPiA+IG1lYW5zIGVhY2ggZW5x dWV1ZSBvciBkZXF1ZXVlIHdpbGwgdXBkYXRlIHR3byBtZXRhZGF0YSB2YXJpYWJsZXMgc28gY3Jl YXRlcw0KPiA+IG1vcmUgY29udGVudGlvbiBhbmQgbGVzcyBzY2FsYWJpbGl0eS4gSSB0aGluayBp dCB3b3VsZCBiZSBnb29kIGlmIHdlIGNvdWxkDQo+ID4gcHJvdmlkZQ0KPiA+IHRoZSBidWxrIGJl aGF2aW91ciAqd2l0aG91dCogdGhpcyBpbml0aWFsIGFjcXVpc2l0aW9uIGFuZCBvbmx5IHVwZGF0 ZSBvbmUNCj4gPiBtZXRhZGF0YSBsb2NhdGlvbiBwZXIgZW5xdWV1ZS9kZXF1ZXVlIG9wZXJhdGlv bi4NCj4gPiANCj4gQWdyZWVkLiBJIHNlZSBsZnJpbmcgdjIgaGFzIGF2b2lkZWQgdGhpcyBvbiB0 aGUgZGVxdWV1ZSBzaWRlLCBidXQgSSB0aGluayBpdCdzDQo+IHVuYXZvaWRhYmxlIG9uIHRoZSBl bnF1ZXVlIHNpZGUgLS0gc2luY2Ugd2UgY2FuJ3Qgd3JpdGUgcmluZyBlbnRyaWVzIGFuZCBDQVMN Cj4gdGhlIHRhaWwgcG9pbnRlciBpbiBvbmUgYmlnIGF0b21pYyBvcGVyYXRpb24uIEFGQUlDVCwg c2xvdCByZXNlcnZhdGlvbnMgYXJlDQo+IHVuYXZvaWRhYmxlIHRoZXJlIHRvIGFjaGlldmUgYnVs ayBzZW1hbnRpY3MuDQpGb3IgZW5xdWV1ZSwgeWVzIHVubGVzcyB5b3UgdHJ1c3QgdGhlIHJpbmcg dG8gYmUgbGFyZ2UgZW5vdWdoIHRvIGJlIGFibGUgdG8gaG9sZA0KYWxsIGVsZW1lbnRzIHRoYXQg bWlnaHQgYmUgZW5xdWV1ZWQuIElzbid0IHRoaXMgdGhlIGNhc2UgZm9yIGEgbWVtcG9vbD8gQWxs DQpidWZmZXJzIHdpbGwgb3JpZ2luYWxseSBiZSBvbiB0aGUgcmluZz8NCg0KPiANCj4gPiANCj4g PiA+IA0KPiA+ID4gDQo+ID4gPiBUaGlzIHNvcnQgb2YgcmVzZXJ2YXRpb24gc2hvdWxkIGJlIGNv bXBhdGlibGUgd2l0aCBsZnJpbmcsIGJ1dA0KPiA+ID4gcmVxdWlyZXMgY2hhbmdlcyAoZS5nLiB0 d28gc2V0cyBvZiBoZWFkL3RhaWwgcG9pbnRlcnMpLg0KPiA+ID4gDQo+ID4gPFNOSVA+DQo+ID4g PiANCj4gPiA+IA0KPiA+IC0tDQo+ID4gT2xhIExpbGplZGFobCwgTmV0d29ya2luZyBTeXN0ZW0g QXJjaGl0ZWN0LCBBcm0gUGhvbmUgKzQ2NzA2ODY2MzczLCBTa3lwZQ0KPiA+IG9sYS5saWxqZWRh aGwNCi0tIA0KT2xhIExpbGplZGFobCwgTmV0d29ya2luZyBTeXN0ZW0gQXJjaGl0ZWN0LCBBcm0N ClBob25lICs0NjcwNjg2NjM3MywgU2t5cGUgb2xhLmxpbGplZGFobA0KDQo=