From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED,URIBL_SBL,URIBL_SBL_A autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 04021C31E50 for ; Sat, 15 Jun 2019 21:00:19 +0000 (UTC) Received: from dpdk.org (dpdk.org [92.243.14.124]) by mail.kernel.org (Postfix) with ESMTP id 4801921851 for ; Sat, 15 Jun 2019 21:00:18 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=armh.onmicrosoft.com header.i=@armh.onmicrosoft.com header.b="Ji3Smal3" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4801921851 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=dev-bounces@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2520A1C258; Sat, 15 Jun 2019 23:00:17 +0200 (CEST) Received: from EUR02-VE1-obe.outbound.protection.outlook.com (mail-eopbgr20055.outbound.protection.outlook.com [40.107.2.55]) by dpdk.org (Postfix) with ESMTP id 768F01C224 for ; Sat, 15 Jun 2019 23:00:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=tOSxGw6zHjXG8oMbiRL0WZ7q46jKA1dLv5n+NdZW5Vg=; b=Ji3Smal3Cwtsy4xh5xykKsrvbpllHzQBn6jYhAkUGz40MHuvJrHKCyK7TopBALw1JC7H+1rjM9OGF9fkVKKCVzAian71E+09RSNGdx7BjfL+HEnPsAJGOfNJUtdLfIAOh79hLfwH1Wcgh6E4N478/2qSP3iKmM++wSoU8xWpZB8= Received: from HE1PR0801MB2076.eurprd08.prod.outlook.com (10.168.93.12) by HE1PR0801MB1834.eurprd08.prod.outlook.com (10.168.143.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1987.13; Sat, 15 Jun 2019 21:00:12 +0000 Received: from HE1PR0801MB2076.eurprd08.prod.outlook.com ([fe80::4118:802f:d814:b1fe]) by HE1PR0801MB2076.eurprd08.prod.outlook.com ([fe80::4118:802f:d814:b1fe%2]) with mapi id 15.20.1987.014; Sat, 15 Jun 2019 21:00:12 +0000 From: Ola Liljedahl To: Honnappa Nagarahalli , "bruce.richardson@intel.com" , "gage.eads@intel.com" , "dev@dpdk.org" CC: nd Thread-Topic: [RFC,v2] lfring: lock-free ring buffer Thread-Index: AQHUuLnsVjNyP3ffWk++amgxuRaei6aOD9BwgA/5YIA= Date: Sat, 15 Jun 2019 21:00:12 +0000 Message-ID: References: <1548866179-20766-1-git-send-email-ola.liljedahl@arm.com> <9184057F7FC11744A2107296B6B8EB1E68CD76ED@FMSMSX108.amr.corp.intel.com> In-Reply-To: <9184057F7FC11744A2107296B6B8EB1E68CD76ED@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.28.5-0ubuntu0.18.04.1 authentication-results: spf=none (sender IP is ) smtp.mailfrom=Ola.Liljedahl@arm.com; x-originating-ip: [158.174.8.16] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 0137e521-0a4b-4f54-0f93-08d6f1d4757b x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600148)(711020)(4605104)(1401327)(4618075)(2017052603328)(7193020); SRVR:HE1PR0801MB1834; x-ms-traffictypediagnostic: HE1PR0801MB1834: x-ms-exchange-purlcount: 1 nodisclaimer: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:6790; x-forefront-prvs: 0069246B74 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(39850400004)(396003)(136003)(366004)(346002)(376002)(199004)(189003)(51914003)(68736007)(86362001)(316002)(446003)(476003)(2616005)(229853002)(76176011)(99286004)(26005)(25786009)(6506007)(66066001)(50226002)(53946003)(2501003)(8936002)(81156014)(110136005)(4326008)(71200400001)(8676002)(71190400001)(81166006)(6246003)(11346002)(5660300002)(186003)(2201001)(30864003)(966005)(66556008)(66446008)(66476007)(66946007)(486006)(53936002)(72206003)(76116006)(6116002)(3846002)(14454004)(7736002)(14444005)(305945005)(478600001)(2906002)(118296001)(256004)(6486002)(6512007)(6306002)(102836004)(73956011)(36756003)(6436002)(64756008)(99106002)(142933001); DIR:OUT; SFP:1101; SCL:1; SRVR:HE1PR0801MB1834; H:HE1PR0801MB2076.eurprd08.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX: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: 6Rmd9MxVbk6hlIp92Gw6BZ7K7VoQRtEafKPAAA/EJm+jVYey3YTg0vkTMGxrxwSfU9ElGnocGleRKRt934l6xIyeAvGZAut1OeLbBmraXf8wWwy1LbGbdYOd8r5+ar+BZxNucR0byoFcCwlA7tikgfPIqg7hLu21bDqRP69FFyiwNJtHn5o0u3ClxVaK/HzGueywluyhep+a7E7Cf27ECIKlCbgUiF4AlxrDizqu4g3ZoCaXEk7OPgU6h60pHI3ADVvpGX5JCSh/qOuaCwGJq89qz/Tp44CNFWHTVwkOolKvxWmsTtrxYRCXhROclo5aZmsdst9ciKxrV5BOJeiAtQyN6pkIqCg5DxQWIk49H5Evn713Rq+9iJlD6tbFr+a6mV6CbZ9+Kb0qf2hbPMeYYjCYAZ4B3doQBpCpZ5NXEFY= Content-Type: text/plain; charset="utf-8" Content-ID: <9FAF8E8D01018E48875C982A1DC49F6A@eurprd08.prod.outlook.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0137e521-0a4b-4f54-0f93-08d6f1d4757b X-MS-Exchange-CrossTenant-originalarrivaltime: 15 Jun 2019 21:00:12.4502 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: Ola.Liljedahl@arm.com X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1834 Subject: Re: [dpdk-dev] [RFC,v2] lfring: lock-free ring buffer 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" T24gV2VkLCAyMDE5LTA2LTA1IGF0IDE4OjIxICswMDAwLCBFYWRzLCBHYWdlIHdyb3RlOg0KPiBI aSBPbGEsDQo+IA0KPiBJcyBpdCBwb3NzaWJsZSB0byBhZGQgYnVyc3QgZW5xdWV1ZSBhbmQgZGVx dWV1ZSBmdW5jdGlvbnMgYXMgd2VsbCwgc28gd2UgY2FuDQo+IHBsdWcgdGhpcyBpbnRvIGEgbWVt cG9vbCBoYW5kbGVyPw0KUHJvcGVyIGJ1cnN0IGVucXVldWUgaXMgZGlmZmljdWx0IG9yIGF0IGxl YXN0IG5vdCB2ZXJ5IGVmZmljaWVudC4NCg0KPiAgQmVzaWRlcyB0aGUgbWVtcG9vbCBoYW5kbGVy LCBJIHRoaW5rIHRoZSBhbGwtb3Itbm90aGluZyBzZW1hbnRpY3Mgd291bGQgYmUNCj4gdXNlZnVs IGZvciBhcHBsaWNhdGlvbnMuIEJlc2lkZXMgdGhhdCwgdGhpcyBSRkMgbG9va3MgZ29vZCBhdCBh IGhpZ2ggbGV2ZWwuDQo+IA0KPiBGb3IgYSBjb21wbGV0ZSBzdWJtaXNzaW9uLCBhIGZldyBtb3Jl IGNoYW5nZXMgYXJlIG5lZWRlZDoNCj4gLSBCdWlsZHM6IE5lZWQgdG8gYWRkICdsZnJpbmcnIHRv IGxpYi9tZXNvbi5idWlsZCBhbmQgbWsvcnRlLmFwcC5taw0KPiAtIERvY3VtZW50YXRpb246IG5l ZWQgdG8gdXBkYXRlIHJlbGVhc2Ugbm90ZXMsIGFkZCBhIG5ldyBzZWN0aW9uIGluIHRoZQ0KPiBw cm9ncmFtbWVyJ3MgZ3VpZGUsIGFuZCB1cGRhdGUgdGhlIGRveHlnZW4gY29uZmlndXJhdGlvbiBm aWxlcw0KPiAtIFRlc3RzOiBUaGlzIHBhdGNoc2V0IHNob3VsZCBhZGQgYSBzZXQgb2YgbGZyaW5n IHRlc3RzIGFzIHdlbGwNCj4gDQo+IENvZGUgY29tbWVudHMgZm9sbG93Lg0KVGhhbmtzIGZvciB0 aGUgcmV2aWV3IGNvbW1lbnRzLCBJIG9ubHkgaGFkIHRpbWUgdG8gbG9vayBhdCBhIGZldyBvZiB0 aGVtLiBJIHdpbGwNCnJldHVybiB3aXRoIG1vcmUgY29tcGxldGUgYW5zd2VycyBhbmQgYSBuZXcg dmVyc2lvbiBvZiB0aGUgcGF0Y2guDQoNCi0tIE9sYQ0KDQo+IA0KPiA8c25pcD4NCj4gIA0KPiAN Cj4gZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZSBiL2xpYi9NYWtlZmlsZSBpbmRleCBkNjIzOWQy Li5jZDQ2MzM5IDEwMDY0NA0KPiAtLS0gYS9saWIvTWFrZWZpbGUNCj4gKysrIGIvbGliL01ha2Vm aWxlDQo+IEBAIC0xMiw2ICsxMiw4IEBAIERJUlMtJChDT05GSUdfUlRFX0xJQlJURV9QQ0kpICs9 IGxpYnJ0ZV9wY2kNCj4gREVQRElSUy1saWJydGVfcGNpIDo9IGxpYnJ0ZV9lYWwNCj4gIERJUlMt JChDT05GSUdfUlRFX0xJQlJURV9SSU5HKSArPSBsaWJydGVfcmluZyAgREVQRElSUy1saWJydGVf cmluZyA6PQ0KPiBsaWJydGVfZWFsDQo+ICtESVJTLSQoQ09ORklHX1JURV9MSUJSVEVfUklORykg Kz0gbGlicnRlX2xmcmluZyBERVBESVJTLWxpYnJ0ZV9sZnJpbmcNCj4gKzo9IGxpYnJ0ZV9lYWwN Cj4gDQo+IExJQlJURV9SSU5HIC0+IExJQlJURV9MRlJJTkcNCj4gDQo+IA0KPiAgRElSUy0kKENP TkZJR19SVEVfTElCUlRFX01FTVBPT0wpICs9IGxpYnJ0ZV9tZW1wb29sICBERVBESVJTLQ0KPiBs aWJydGVfbWVtcG9vbCA6PSBsaWJydGVfZWFsIGxpYnJ0ZV9yaW5nDQo+ICBESVJTLSQoQ09ORklH X1JURV9MSUJSVEVfTUJVRikgKz0gbGlicnRlX21idWYgZGlmZiAtLWdpdA0KPiBhL2xpYi9saWJy dGVfbGZyaW5nL01ha2VmaWxlIGIvbGliL2xpYnJ0ZV9sZnJpbmcvTWFrZWZpbGUgbmV3IGZpbGUg bW9kZSAxMDA2NDQNCj4gaW5kZXggMDAwMDAwMC4uYzA0ZDJlOQ0KPiAtLS0gL2Rldi9udWxsDQo+ ICsrKyBiL2xpYi9saWJydGVfbGZyaW5nL01ha2VmaWxlDQo+IEBAIC0wLDAgKzEsMjIgQEANCj4g KyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAjIENvcHlyaWdodChjKSAy MDEwLTIwMTQgSW50ZWwNCj4gK0NvcnBvcmF0aW9uDQo+IA0KPiBOZWVkIHRvIGNvcnJlY3QgdGhl IGNvcHlyaWdodA0KPiANCj4gDQo+ICsNCj4gK2luY2x1ZGUgJChSVEVfU0RLKS9tay9ydGUudmFy cy5taw0KPiArDQo+ICsjIGxpYnJhcnkgbmFtZQ0KPiArTElCID0gbGlicnRlX2xmcmluZy5hDQo+ ICsNCj4gK0NGTEFHUyArPSAkKFdFUlJPUl9GTEFHUykgLUkkKFNSQ0RJUikgLU8zIExETElCUyAr PSAtbHJ0ZV9lYWwNCj4gKw0KPiArRVhQT1JUX01BUCA6PSBydGVfbGZyaW5nX3ZlcnNpb24ubWFw DQo+ICsNCj4gK0xJQkFCSVZFUiA6PSAxDQo+ICsNCj4gKyMgYWxsIHNvdXJjZSBhcmUgc3RvcmVk IGluIFNSQ1MteQ0KPiArU1JDUy0kKENPTkZJR19SVEVfTElCUlRFX1JJTkcpIDo9IHJ0ZV9sZnJp bmcuYw0KPiANCj4gTElCUlRFX1JJTkcgLT4gTElCUlRFX0xGUklORw0KPiANCj4gDQo+ICsNCj4g KyMgaW5zdGFsbCBpbmNsdWRlcw0KPiArU1lNTElOSy0kKENPTkZJR19SVEVfTElCUlRFX1JJTkcp LWluY2x1ZGUgOj0gcnRlX2xmcmluZy5oIGxvY2tmcmVlMTYuaA0KPiANCj4gTElCUlRFX1JJTkcg LT4gTElCUlRFX0xGUklORw0KPiANCj4gDQo+ICsNCj4gK2luY2x1ZGUgJChSVEVfU0RLKS9tay9y dGUubGliLm1rDQo+IGRpZmYgLS1naXQgYS9saWIvbGlicnRlX2xmcmluZy9sb2NrZnJlZTE2Lmgg Yi9saWIvbGlicnRlX2xmcmluZy9sb2NrZnJlZTE2LmgNCj4gbmV3DQo+IGZpbGUgbW9kZSAxMDA2 NDQgaW5kZXggMDAwMDAwMC4uMTk5YWRkOQ0KPiAtLS0gL2Rldi9udWxsDQo+ICsrKyBiL2xpYi9s aWJydGVfbGZyaW5nL2xvY2tmcmVlMTYuaA0KPiANCj4gVGhpcyBuZWVkcyB0byBiZSByZWZhY3Rv cmVkIHRvIHVzZSB0aGUgcnRlX2F0b21pYzEyOF9jbXBfZXhjaGFuZ2UgaW50ZXJmYWNlLg0KPiAN Cj4gPHNuaXA+DQo+IA0KPiANCj4gZGlmZiAtLWdpdCBhL2xpYi9saWJydGVfbGZyaW5nL21lc29u LmJ1aWxkIGIvbGliL2xpYnJ0ZV9sZnJpbmcvbWVzb24uYnVpbGQgbmV3DQo+IGZpbGUgbW9kZSAx MDA2NDQgaW5kZXggMDAwMDAwMC4uYzhiOTBjYg0KPiAtLS0gL2Rldi9udWxsDQo+ICsrKyBiL2xp Yi9saWJydGVfbGZyaW5nL21lc29uLmJ1aWxkDQo+IEBAIC0wLDAgKzEsNiBAQA0KPiArIyBTUERY LUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICMgQ29weXJpZ2h0KGMpIDIwMTcgSW50 ZWwNCj4gK0NvcnBvcmF0aW9uDQo+ICsNCj4gDQo+IENvcnJlY3QgY29weXJpZ2h0DQo+IA0KPiAN Cj4gK3ZlcnNpb24gPSAxDQo+ICtzb3VyY2VzID0gZmlsZXMoJ3J0ZV9sZnJpbmcuYycpDQo+ICto ZWFkZXJzID0gZmlsZXMoJ3J0ZV9sZnJpbmcuaCcsJ2xvY2tmcmVlMTYuaCcpDQo+IGRpZmYgLS1n aXQgYS9saWIvbGlicnRlX2xmcmluZy9ydGVfbGZyaW5nLmMgYi9saWIvbGlicnRlX2xmcmluZy9y dGVfbGZyaW5nLmMNCj4gbmV3IGZpbGUNCj4gbW9kZSAxMDA2NDQgaW5kZXggMDAwMDAwMC4uZTEz MGY3MQ0KPiAtLS0gL2Rldi9udWxsDQo+ICsrKyBiL2xpYi9saWJydGVfbGZyaW5nL3J0ZV9sZnJp bmcuYw0KPiBAQCAtMCwwICsxLDI2NCBAQA0KPiArLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6 IEJTRC0zLUNsYXVzZQ0KPiArICoNCj4gKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDE1IEludGVs IENvcnBvcmF0aW9uDQo+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTkgQXJtIEx0ZA0KPiArICogQWxs IHJpZ2h0cyByZXNlcnZlZC4NCj4gKyAqLw0KPiArDQo+ICsjaW5jbHVkZSA8c3RkaW8uaD4NCj4g KyNpbmNsdWRlIDxzdGRhcmcuaD4NCj4gKyNpbmNsdWRlIDxzdHJpbmcuaD4NCj4gKyNpbmNsdWRl IDxzdGRpbnQuaD4NCj4gKyNpbmNsdWRlIDxpbnR0eXBlcy5oPg0KPiArI2luY2x1ZGUgPGVycm5v Lmg+DQo+ICsjaW5jbHVkZSA8c3lzL3F1ZXVlLmg+DQo+ICsNCj4gKyNpbmNsdWRlIDxydGVfY29t bW9uLmg+DQo+ICsjaW5jbHVkZSA8cnRlX2xvZy5oPg0KPiArI2luY2x1ZGUgPHJ0ZV9tZW1vcnku aD4NCj4gKyNpbmNsdWRlIDxydGVfbWVtem9uZS5oPg0KPiArI2luY2x1ZGUgPHJ0ZV9tYWxsb2Mu aD4NCj4gKyNpbmNsdWRlIDxydGVfbGF1bmNoLmg+DQo+ICsjaW5jbHVkZSA8cnRlX2VhbC5oPg0K PiArI2luY2x1ZGUgPHJ0ZV9lYWxfbWVtY29uZmlnLmg+DQo+ICsjaW5jbHVkZSA8cnRlX2F0b21p Yy5oPg0KPiArI2luY2x1ZGUgPHJ0ZV9wZXJfbGNvcmUuaD4NCj4gKyNpbmNsdWRlIDxydGVfbGNv cmUuaD4NCj4gKyNpbmNsdWRlIDxydGVfYnJhbmNoX3ByZWRpY3Rpb24uaD4NCj4gKyNpbmNsdWRl IDxydGVfZXJybm8uaD4NCj4gKyNpbmNsdWRlIDxydGVfc3RyaW5nX2Zucy5oPg0KPiArI2luY2x1 ZGUgPHJ0ZV9zcGlubG9jay5oPg0KPiArDQo+IA0KPiBZb3UgY2FuIHJlZHVjZSB0aGUgc3lzdGVt IGFuZCBEUERLIGluY2x1ZGVzIGRvd24gdG86DQo+IA0KPiAjaW5jbHVkZSA8aW50dHlwZXMuaD4N Cj4gI2luY2x1ZGUgPHN0cmluZy5oPg0KPiAJCQ0KPiAjaW5jbHVkZSA8cnRlX2F0b21pYy5oPg0K PiAjaW5jbHVkZSA8cnRlX2VhbC5oPg0KPiAjaW5jbHVkZSA8cnRlX2VhbF9tZW1jb25maWcuaD4N Cj4gI2luY2x1ZGUgPHJ0ZV9lcnJuby5oPg0KPiAjaW5jbHVkZSA8cnRlX21hbGxvYy5oPg0KPiAj aW5jbHVkZSA8cnRlX21lbXpvbmUuaD4NCj4gI2luY2x1ZGUgPHJ0ZV9yd2xvY2suaD4NCj4gI2lu Y2x1ZGUgPHJ0ZV90YWlscS5oPg0KPiANCj4gDQo+ICsjaW5jbHVkZSAicnRlX2xmcmluZy5oIg0K PiArDQo+ICtUQUlMUV9IRUFEKHJ0ZV9sZnJpbmdfbGlzdCwgcnRlX3RhaWxxX2VudHJ5KTsNCj4g Kw0KPiArc3RhdGljIHN0cnVjdCBydGVfdGFpbHFfZWxlbSBydGVfbGZyaW5nX3RhaWxxID0gew0K PiArCS5uYW1lID0gUlRFX1RBSUxRX0xGUklOR19OQU1FLA0KPiArfTsNCj4gK0VBTF9SRUdJU1RF Ul9UQUlMUShydGVfbGZyaW5nX3RhaWxxKQ0KPiArDQo+ICsvKiB0cnVlIGlmIHggaXMgYSBwb3dl ciBvZiAyICovDQo+ICsjZGVmaW5lIFBPV0VST0YyKHgpICgoKCh4KS0xKSAmICh4KSkgPT0gMCkN Cj4gDQo+IERQREsgcHJvdmlkZXMgdGhpcyBmdW5jdGlvbmFsaXR5IHdpdGggUlRFX0lTX1BPV0VS X09GXzIoKSwgaW4gcnRlX2NvbW1vbi5oDQo+IA0KPiANCj4gKw0KPiArLyogcmV0dXJuIHRoZSBz aXplIG9mIG1lbW9yeSBvY2N1cGllZCBieSBhIHJpbmcgKi8gc3NpemVfdA0KPiArcnRlX2xmcmlu Z19nZXRfbWVtc2l6ZSh1bnNpZ25lZCBpbnQgY291bnQpIHsNCj4gKwlzc2l6ZV90IHN6Ow0KPiAr DQo+ICsJLyogY291bnQgbXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8NCj4gKwlpZiAoKCFQT1dFUk9G Mihjb3VudCkpIHx8IChjb3VudCA+IDB4ODAwMDAwMDBVKSkgew0KPiArCQlSVEVfTE9HKEVSUiwg UklORywNCj4gDQo+IFRoaXMgbGlicmFyeSBuZWVkcyB0byByZXBsYWNlIHRoZSBSSU5HIGxvZ2dp bmcgd2l0aCBpdHMgb3duIExGUklORyBsb2dnaW5nLg0KPiANCj4gPHNuaXA+DQo+IA0KPiANCj4g Ky8qIGNyZWF0ZSB0aGUgcmluZyAqLw0KPiANCj4gVGhlIGNvbW1lbnRzIGJlZm9yZSBmdW5jdGlv biBkZWZpbml0aW9ucyAoZS5nLiAiY3JlYXRlIHRoZSByaW5nIiwgImZyZWUgdGhlDQo+IHJpbmci KSBwcm9iYWJseSBhcmVuJ3QgbmVjZXNzYXJ5LCB0aGUgbmFtZXMgYXJlIHNlbGYtZXhwbGFuYXRv cnkuDQo+IA0KPiANCj4gK3N0cnVjdCBydGVfbGZyaW5nICoNCj4gK3J0ZV9sZnJpbmdfY3JlYXRl KGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBjb3VudCwgaW50IHNvY2tldF9pZCwNCj4g KwkJICB1bnNpZ25lZCBpbnQgZmxhZ3MpDQo+ICt7DQo+ICsJY2hhciBtel9uYW1lW1JURV9NRU1a T05FX05BTUVTSVpFXTsNCj4gKwlzdHJ1Y3QgcnRlX2xmcmluZyAqcjsNCj4gKwlzdHJ1Y3QgcnRl X3RhaWxxX2VudHJ5ICp0ZTsNCj4gKwljb25zdCBzdHJ1Y3QgcnRlX21lbXpvbmUgKm16Ow0KPiAr CXNzaXplX3QgcmluZ19zaXplOw0KPiArCWludCBtel9mbGFncyA9IDA7DQo+ICsJc3RydWN0IHJ0 ZV9sZnJpbmdfbGlzdCAqcmluZ19saXN0ID0gTlVMTDsNCj4gKwljb25zdCB1bnNpZ25lZCBpbnQg cmVxdWVzdGVkX2NvdW50ID0gY291bnQ7DQo+ICsJaW50IHJldDsNCj4gKw0KPiArCXJpbmdfbGlz dCA9IFJURV9UQUlMUV9DQVNUKHJ0ZV9sZnJpbmdfdGFpbHEuaGVhZCwgcnRlX2xmcmluZ19saXN0 KTsNCj4gKw0KPiArCWNvdW50ID0gcnRlX2FsaWduMzJwb3cyKGNvdW50KTsNCj4gKw0KPiArCXJp bmdfc2l6ZSA9IHJ0ZV9sZnJpbmdfZ2V0X21lbXNpemUoY291bnQpOw0KPiArCWlmIChyaW5nX3Np emUgPCAwKSB7DQo+ICsJCXJ0ZV9lcnJubyA9IHJpbmdfc2l6ZTsNCj4gKwkJcmV0dXJuIE5VTEw7 DQo+ICsJfQ0KPiArDQo+ICsJcmV0ID0gc25wcmludGYobXpfbmFtZSwgc2l6ZW9mKG16X25hbWUp LCAiJXMlcyIsDQo+ICsJCVJURV9MRlJJTkdfTVpfUFJFRklYLCBuYW1lKTsNCj4gKwlpZiAocmV0 IDwgMCB8fCByZXQgPj0gKGludClzaXplb2YobXpfbmFtZSkpIHsNCj4gKwkJcnRlX2Vycm5vID0g RU5BTUVUT09MT05HOw0KPiArCQlyZXR1cm4gTlVMTDsNCj4gKwl9DQo+ICsNCj4gKwl0ZSA9IHJ0 ZV96bWFsbG9jKCJMRlJJTkdfVEFJTFFfRU5UUlkiLCBzaXplb2YoKnRlKSwgMCk7DQo+ICsJaWYg KHRlID09IE5VTEwpIHsNCj4gKwkJUlRFX0xPRyhFUlIsIFJJTkcsICJDYW5ub3QgcmVzZXJ2ZSBt ZW1vcnkgZm9yIHRhaWxxXG4iKTsNCj4gKwkJcnRlX2Vycm5vID0gRU5PTUVNOw0KPiArCQlyZXR1 cm4gTlVMTDsNCj4gKwl9DQo+ICsNCj4gKwlydGVfcndsb2NrX3dyaXRlX2xvY2soUlRFX0VBTF9U QUlMUV9SV0xPQ0spOw0KPiArDQo+ICsJLyogcmVzZXJ2ZSBhIG1lbW9yeSB6b25lIGZvciB0aGlz IHJpbmcuIElmIHdlIGNhbid0IGdldCBydGVfY29uZmlnIG9yDQo+ICsJICogd2UgYXJlIHNlY29u ZGFyeSBwcm9jZXNzLCB0aGUgbWVtem9uZV9yZXNlcnZlIGZ1bmN0aW9uIHdpbGwgc2V0DQo+ICsJ ICogcnRlX2Vycm5vIGZvciB1cyBhcHByb3ByaWF0ZWx5IC0gaGVuY2Ugbm8gY2hlY2sgaW4gdGhp cyB0aGlzDQo+ICsJICogZnVuY3Rpb24NCj4gKwkgKi8NCj4gDQo+IFRoZSAib3Igd2UgYXJlIHNl Y29uZGFyeSBwcm9jZXNzIiBjb21tZW50IGlzIG91dC1vZi1kYXRlOyB0aGUgbWVtem9uZSByZXNl cnZlDQo+IGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkIGJ5IGEgc2Vjb25kYXJ5IHByb2Nlc3MuIChG b3IgdGhhdCBtYXR0ZXIsIHRoZQ0KPiBkb2N1bWVudGF0aW9uIGluIHJ0ZV9tZW16b25lLmggaXMg b3V0LW9mLWRhdGUgYXMgd2VsbC4pIFRoaXMgcmVzdHJpY3Rpb24gd2FzDQo+IHJlbW92ZWQgaW4g Y29tbWl0IDkxNmU0ZjRmNGU0NS4NCj4gDQo+IDxzbmlwPg0KPiANCj4gDQo+ICsvKiBmcmVlIHRo ZSByaW5nICovDQo+ICt2b2lkDQo+ICtydGVfbGZyaW5nX2ZyZWUoc3RydWN0IHJ0ZV9sZnJpbmcg KnIpDQo+ICt7DQo+ICsJc3RydWN0IHJ0ZV9sZnJpbmdfbGlzdCAqcmluZ19saXN0ID0gTlVMTDsN Cj4gKwlzdHJ1Y3QgcnRlX3RhaWxxX2VudHJ5ICp0ZTsNCj4gKw0KPiArCWlmIChyID09IE5VTEwp DQo+ICsJCXJldHVybjsNCj4gKw0KPiArCS8qDQo+ICsJICogUmluZyB3YXMgbm90IGNyZWF0ZWQg d2l0aCBydGVfbGZyaW5nX2NyZWF0ZSwNCj4gKwkgKiB0aGVyZWZvcmUsIHRoZXJlIGlzIG5vIG1l bXpvbmUgdG8gZnJlZS4NCj4gKwkgKi8NCj4gKwlpZiAoci0+bWVtem9uZSA9PSBOVUxMKSB7DQo+ ICsJCVJURV9MT0coRVJSLCBSSU5HLCAiQ2Fubm90IGZyZWUgcmluZyAobm90IGNyZWF0ZWQgd2l0 aA0KPiBydGVfbGZyaW5nX2NyZWF0ZSgpIik7DQo+ICsJCXJldHVybjsNCj4gKwl9DQo+ICsNCj4g KwlpZiAocnRlX21lbXpvbmVfZnJlZShyLT5tZW16b25lKSAhPSAwKSB7DQo+ICsJCVJURV9MT0co RVJSLCBSSU5HLCAiQ2Fubm90IGZyZWUgbWVtb3J5XG4iKTsNCj4gKwkJcmV0dXJuOw0KPiArCX0N Cj4gDQo+IEJldHRlciB0byBmcmVlIHRoZSByaW5nJ3MgbWVtem9uZSBhZnRlciB0YWtpbmcgaXQg b2ZmIHRoZSBsaXN0LCBpbiB0aGUNCj4gdW5saWtlbHkgZXZlbnQgYW5vdGhlciB0aHJlYWQgbG9v a3MgaXQgdXAgYXQgdGhlIHNhbWUgdGltZSBhbmQgYXR0ZW1wdHMgdG8gdXNlDQo+IGl0Lg0KPiAN Cj4gDQo+ICsNCj4gKwlyaW5nX2xpc3QgPSBSVEVfVEFJTFFfQ0FTVChydGVfbGZyaW5nX3RhaWxx LmhlYWQsIHJ0ZV9sZnJpbmdfbGlzdCk7DQo+ICsJcnRlX3J3bG9ja193cml0ZV9sb2NrKFJURV9F QUxfVEFJTFFfUldMT0NLKTsNCj4gKw0KPiArCS8qIGZpbmQgb3V0IHRhaWxxIGVudHJ5ICovDQo+ ICsJVEFJTFFfRk9SRUFDSCh0ZSwgcmluZ19saXN0LCBuZXh0KSB7DQo+ICsJCWlmICh0ZS0+ZGF0 YSA9PSAodm9pZCAqKSByKQ0KPiArCQkJYnJlYWs7DQo+ICsJfQ0KPiArDQo+ICsJaWYgKHRlID09 IE5VTEwpIHsNCj4gKwkJcnRlX3J3bG9ja193cml0ZV91bmxvY2soUlRFX0VBTF9UQUlMUV9SV0xP Q0spOw0KPiArCQlyZXR1cm47DQo+ICsJfQ0KPiArDQo+ICsJVEFJTFFfUkVNT1ZFKHJpbmdfbGlz dCwgdGUsIG5leHQpOw0KPiArDQo+ICsJcnRlX3J3bG9ja193cml0ZV91bmxvY2soUlRFX0VBTF9U QUlMUV9SV0xPQ0spOw0KPiArDQo+ICsJcnRlX2ZyZWUodGUpOw0KPiArfQ0KPiANCj4gPHNuaXA+ DQo+IA0KPiANCj4gKy8qIHNlYXJjaCBhIHJpbmcgZnJvbSBpdHMgbmFtZSAqLw0KPiArc3RydWN0 IHJ0ZV9sZnJpbmcgKg0KPiArcnRlX2xmcmluZ19sb29rdXAoY29uc3QgY2hhciAqbmFtZSkNCj4g K3sNCj4gKwlzdHJ1Y3QgcnRlX3RhaWxxX2VudHJ5ICp0ZTsNCj4gKwlzdHJ1Y3QgcnRlX2xmcmlu ZyAqciA9IE5VTEw7DQo+ICsJc3RydWN0IHJ0ZV9sZnJpbmdfbGlzdCAqcmluZ19saXN0Ow0KPiAr DQo+ICsJcmluZ19saXN0ID0gUlRFX1RBSUxRX0NBU1QocnRlX2xmcmluZ190YWlscS5oZWFkLCBy dGVfbGZyaW5nX2xpc3QpOw0KPiArDQo+ICsJcnRlX3J3bG9ja19yZWFkX2xvY2soUlRFX0VBTF9U QUlMUV9SV0xPQ0spOw0KPiArDQo+ICsJVEFJTFFfRk9SRUFDSCh0ZSwgcmluZ19saXN0LCBuZXh0 KSB7DQo+ICsJCXIgPSAoc3RydWN0IHJ0ZV9sZnJpbmcgKikgdGUtPmRhdGE7DQo+ICsJCWlmIChz dHJuY21wKG5hbWUsIHItPm5hbWUsIFJURV9MRlJJTkdfTkFNRVNJWkUpID09IDApDQo+IA0KPiBN aXNzaW5nIGEgTlVMTCBwb2ludGVyIGNoZWNrIGJlZm9yZSBkZXJlZmVyZW5jaW5nICduYW1lJw0K V2h5IHNob3VsZG4ndCB0aGUgcHJvZ3JhbSBjcmFzaCBpZiBzb21lb25lIHBhc3NlcyBhIE5VTEwg cG9pbnRlciBwYXJhbWV0ZXI/DQpDYWxsZXJzIHdpbGwgYmUgaW50ZXJuYWwsIGV4dGVybmFsIHVz ZXJzIHNob3VsZCBiZSBhYmxlIHRvIGNvbnRyb2wgd2hldGhlciBOVUxMDQppcyBwYXNzZWQgaW5z dGVhZCBvZiBhIHZhbGlkIHBvaW50ZXIuDQpBIGNyYXNoIGFuZCBhIGNvcmUgZHVtcCBpcyB0aGUg YmVzdCB3YXkgdG8gZGV0ZWN0IGFuZCBkZWJ1ZyBlcnJvcnMuDQoNCj4gDQo+IA0KPiArCQkJYnJl YWs7DQo+ICsJfQ0KPiArDQo+ICsJcnRlX3J3bG9ja19yZWFkX3VubG9jayhSVEVfRUFMX1RBSUxR X1JXTE9DSyk7DQo+ICsNCj4gKwlpZiAodGUgPT0gTlVMTCkgew0KPiArCQlydGVfZXJybm8gPSBF Tk9FTlQ7DQo+ICsJCXJldHVybiBOVUxMOw0KPiArCX0NCj4gKw0KPiArCXJldHVybiByOw0KPiAr fQ0KPiBkaWZmIC0tZ2l0IGEvbGliL2xpYnJ0ZV9sZnJpbmcvcnRlX2xmcmluZy5oIGIvbGliL2xp YnJ0ZV9sZnJpbmcvcnRlX2xmcmluZy5oDQo+IG5ldyBmaWxlDQo+IG1vZGUgMTAwNjQ0IGluZGV4 IDAwMDAwMDAuLjIyZDNlMWMNCj4gLS0tIC9kZXYvbnVsbA0KPiArKysgYi9saWIvbGlicnRlX2xm cmluZy9ydGVfbGZyaW5nLmgNCj4gQEAgLTAsMCArMSw2MjEgQEANCj4gKy8qIFNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UNCj4gKyAqDQo+ICsgKiBDb3B5cmlnaHQgKGMpIDIw MTAtMjAxNyBJbnRlbCBDb3Jwb3JhdGlvbg0KPiArICogQ29weXJpZ2h0IChjKSAyMDE5IEFybSBM dGQNCj4gKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQo+ICsgKi8NCj4gKw0KPiArI2lmbmRlZiBf UlRFX0xGUklOR19IXw0KPiArI2RlZmluZSBfUlRFX0xGUklOR19IXw0KPiArDQo+ICsvKioNCj4g KyAqIEBmaWxlDQo+ICsgKiBSVEUgTGZyaW5nDQo+ICsgKg0KPiArICogVGhlIExmcmluZyBNYW5h Z2VyIGlzIGEgZml4ZWQtc2l6ZSBxdWV1ZSwgaW1wbGVtZW50ZWQgYXMgYSB0YWJsZSBvZg0KPiAr ICogKHBvaW50ZXJzICsgY291bnRlcnMpLg0KPiArICoNCj4gKyAqIC0gRklGTyAoRmlyc3QgSW4g Rmlyc3QgT3V0KQ0KPiArICogLSBNYXhpbXVtIHNpemUgaXMgZml4ZWQ7IHRoZSBwb2ludGVycyBh cmUgc3RvcmVkIGluIGEgdGFibGUuDQo+ICsgKiAtIExvY2stZnJlZSBpbXBsZW1lbnRhdGlvbi4N Cj4gKyAqIC0gTXVsdGktIG9yIHNpbmdsZS1jb25zdW1lciBkZXF1ZXVlLg0KPiArICogLSBNdWx0 aS0gb3Igc2luZ2xlLXByb2R1Y2VyIGVucXVldWUuDQo+ICsgKg0KPiArICovDQo+ICsNCj4gKyNp ZmRlZiBfX2NwbHVzcGx1cw0KPiArZXh0ZXJuICJDIiB7DQo+ICsjZW5kaWYNCj4gKw0KPiArI2lu Y2x1ZGUgPHN0ZGlvLmg+DQo+ICsjaW5jbHVkZSA8c3RkaW50Lmg+DQo+ICsjaW5jbHVkZSA8c3lz L3F1ZXVlLmg+DQo+ICsjaW5jbHVkZSA8ZXJybm8uaD4NCj4gKyNpbmNsdWRlIDxydGVfY29tbW9u Lmg+DQo+ICsjaW5jbHVkZSA8cnRlX2NvbmZpZy5oPg0KPiArI2luY2x1ZGUgPHJ0ZV9tZW1vcnku aD4NCj4gKyNpbmNsdWRlIDxydGVfbGNvcmUuaD4NCj4gKyNpbmNsdWRlIDxydGVfYXRvbWljLmg+ DQo+ICsjaW5jbHVkZSA8cnRlX2JyYW5jaF9wcmVkaWN0aW9uLmg+DQo+ICsjaW5jbHVkZSA8cnRl X21lbXpvbmUuaD4NCj4gKyNpbmNsdWRlIDxydGVfcGF1c2UuaD4NCj4gKw0KPiANCj4gWW91IHNo b3VsZCBiZSBhYmxlIHRvIGNsZWFuIHVwIHRoZSBpbmNsdWRlcyBoZXJlIHRvbywgZS5nLiBydGVf cGF1c2UuaCBkb2Vzbid0DQo+IGFwcGVhciB0byBiZSB1c2VkLg0KPiANCj4gDQo+ICsjaW5jbHVk ZSAibG9ja2ZyZWUxNi5oIg0KPiArDQo+ICsjZGVmaW5lIFJURV9UQUlMUV9MRlJJTkdfTkFNRSAi UlRFX0xGUklORyINCj4gKw0KPiArI2RlZmluZSBSVEVfTEZSSU5HX01aX1BSRUZJWCAiUkdfIg0K PiArLyoqPCBUaGUgbWF4aW11bSBsZW5ndGggb2YgYW4gbGZyaW5nIG5hbWUuICovICNkZWZpbmUN Cj4gDQo+IENoYW5nZSAiLyoqPCIgdG8gIi8qKiIsIG90aGVyd2lzZSBkb3h5Z2VuIGFwcGxpZXMg dGhlIGNvbW1lbnQgdG8NCj4gUlRFX0xGUklOR19NWl9QUkVGSVgNCj4gDQo+IA0KPiArUlRFX0xG UklOR19OQU1FU0laRSAoUlRFX01FTVpPTkVfTkFNRVNJWkUgLSBcDQo+ICsJCQkgICBzaXplb2Yo UlRFX0xGUklOR19NWl9QUkVGSVgpICsgMSkNCj4gKw0KPiArc3RydWN0IHJ0ZV9tZW16b25lOyAv KiBmb3J3YXJkIGRlY2xhcmF0aW9uLCBzbyBhcyBub3QgdG8gcmVxdWlyZQ0KPiArbWVtem9uZS5o ICovDQo+IA0KPiBUaGlzIGZvcndhcmQgZGVjbGFyYXRpb24gaXMgbm8gbG9uZ2VyIG5lY2Vzc2Fy eQ0KPiANCj4gPHNuaXA+DQo+IA0KPiANCj4gKy8qKg0KPiArICogQ2FsY3VsYXRlIHRoZSBtZW1v cnkgc2l6ZSBuZWVkZWQgZm9yIGEgbGZyaW5nDQo+ICsgKg0KPiArICogVGhpcyBmdW5jdGlvbiBy ZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIGZvciBhIGxmcmluZywgZ2l2ZW4NCj4g KyAqIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gaXQuIFRoaXMgdmFsdWUgaXMgdGhlIHN1bSBv ZiB0aGUgc2l6ZSBvZg0KPiArICogdGhlIHN0cnVjdHVyZSBydGVfbGZyaW5nIGFuZCB0aGUgc2l6 ZSBvZiB0aGUgbWVtb3J5IG5lZWRlZCBieSB0aGUNCj4gKyAqIG9iamVjdHMgcG9pbnRlcnMuIFRo ZSB2YWx1ZSBpcyBhbGlnbmVkIHRvIGEgY2FjaGUgbGluZSBzaXplLg0KPiArICoNCj4gKyAqIEBw YXJhbSBjb3VudA0KPiArICogICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsZnJpbmcg KG11c3QgYmUgYSBwb3dlciBvZiAyKS4NCj4gKyAqIEByZXR1cm4NCj4gKyAqICAgLSBUaGUgbWVt b3J5IHNpemUgbmVlZGVkIGZvciB0aGUgbGZyaW5nIG9uIHN1Y2Nlc3MuDQo+ICsgKiAgIC0gLUVJ TlZBTCBpZiBjb3VudCBpcyBub3QgYSBwb3dlciBvZiAyLg0KPiANCj4gTWlzc2luZyBlcnJvciBj YXNlOiAtRUlOVkFMIGlmIHNpemUgZXhjZWVkcyBzaXplIGxpbWl0DQo+IA0KPiANCj4gKyAqLw0K PiArc3NpemVfdCBydGVfbGZyaW5nX2dldF9tZW1zaXplKHVuc2lnbmVkIGludCBjb3VudCk7DQo+ ICsNCj4gKy8qKg0KPiArICogSW5pdGlhbGl6ZSBhIGxmcmluZyBzdHJ1Y3R1cmUuDQo+ICsgKg0K PiArICogSW5pdGlhbGl6ZSBhIGxmcmluZyBzdHJ1Y3R1cmUgaW4gbWVtb3J5IHBvaW50ZWQgYnkg InIiLiBUaGUgc2l6ZSBvZg0KPiArdGhlDQo+ICsgKiBtZW1vcnkgYXJlYSBtdXN0IGJlIGxhcmdl IGVub3VnaCB0byBzdG9yZSB0aGUgbGZyaW5nIHN0cnVjdHVyZSBhbmQNCj4gK3RoZQ0KPiArICog b2JqZWN0IHRhYmxlLiBJdCBpcyBhZHZpc2VkIHRvIHVzZSBydGVfbGZyaW5nX2dldF9tZW1zaXpl KCkgdG8gZ2V0DQo+ICt0aGUNCj4gKyAqIGFwcHJvcHJpYXRlIHNpemUuDQo+ICsgKg0KPiArICog VGhlIGxmcmluZyBzaXplIGlzIHNldCB0byAqY291bnQqLCB3aGljaCBtdXN0IGJlIGEgcG93ZXIg b2YgdHdvLg0KPiArV2F0ZXINCj4gKyAqIG1hcmtpbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4g VGhlIHJlYWwgdXNhYmxlIGxmcmluZyBzaXplIGlzDQo+ICsgKiAqY291bnQtMSogaW5zdGVhZCBv ZiAqY291bnQqIHRvIGRpZmZlcmVudGlhdGUgYSBmcmVlIGxmcmluZyBmcm9tIGFuDQo+ICsgKiBl bXB0eSBsZnJpbmcuDQo+IA0KPiAiZnJlZSBsZnJpbmciIC0+IHNob3VsZCBzYXkgImZ1bGwgbGZy aW5nIj8gU2FtZSBhcHBsaWVzIHRvDQo+IHJ0ZV9sZnJpbmdfY3JlYXRlKCkuDQo+IA0KPiANCj4g KyAqDQo+ICsgKiBUaGUgbGZyaW5nIGlzIG5vdCBhZGRlZCBpbiBSVEVfVEFJTFFfTEZSSU5HIGds b2JhbCBsaXN0LiBJbmRlZWQsIHRoZQ0KPiArICogbWVtb3J5IGdpdmVuIGJ5IHRoZSBjYWxsZXIg bWF5IG5vdCBiZSBzaGFyZWFibGUgYW1vbmcgZHBkaw0KPiArICogcHJvY2Vzc2VzLg0KPiANCj4g SGVyZSBhbmQgaW4gcnRlX2xmcmluZ19jcmVhdGUoKSwgdGhlIGRvY3VtZW50YXRpb24gbWVudGlv bnMgd2hldGhlciBvciBub3QgdGhlDQo+IGxmcmluZyBpcyBhZGRlZCB0byB0aGUgUlRFX1RBSUxR X0xGUklORyBsaXN0LiBJIGRvbid0IHRoaW5rIHRoaXMgbWFrZXMgc2Vuc2UNCj4gaW4gdGhlIGRv Y3VtZW50YXRpb24sIGFzIGl0IHBlcnRhaW5zIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBhbmQgbm90 IHRoZQ0KPiBpbnRlcmZhY2UuDQo+IA0KPiANCj4gKyAqDQo+ICsgKiBAcGFyYW0gcg0KPiArICog ICBUaGUgcG9pbnRlciB0byB0aGUgbGZyaW5nIHN0cnVjdHVyZSBmb2xsb3dlZCBieSB0aGUgb2Jq ZWN0cyB0YWJsZS4NCj4gKyAqIEBwYXJhbSBuYW1lDQo+ICsgKiAgIFRoZSBuYW1lIG9mIHRoZSBs ZnJpbmcuDQo+ICsgKiBAcGFyYW0gY291bnQNCj4gKyAqICAgVGhlIG51bWJlciBvZiBlbGVtZW50 cyBpbiB0aGUgbGZyaW5nIChtdXN0IGJlIGEgcG93ZXIgb2YgMikuDQo+ICsgKiBAcGFyYW0gZmxh Z3MNCj4gKyAqIEByZXR1cm4NCj4gKyAqICAgMCBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZh bHVlIG9uIGVycm9yLg0KPiArICovDQo+ICtpbnQgcnRlX2xmcmluZ19pbml0KHN0cnVjdCBydGVf bGZyaW5nICpyLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQNCj4gY291bnQsDQo+ICsJ CSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpOw0KPiArDQo+ICsvKioNCj4gKyAqIENyZWF0ZSBhIG5l dyBsZnJpbmcgbmFtZWQgKm5hbWUqIGluIG1lbW9yeS4NCj4gKyAqDQo+ICsgKiBUaGlzIGZ1bmN0 aW9uIHVzZXMgYGBtZW16b25lX3Jlc2VydmUoKWBgIHRvIGFsbG9jYXRlIG1lbW9yeS4gVGhlbiBp dA0KPiArICogY2FsbHMgcnRlX2xmcmluZ19pbml0KCkgdG8gaW5pdGlhbGl6ZSBhbiBlbXB0eSBs ZnJpbmcuDQo+ICsgKg0KPiArICogVGhlIG5ldyBsZnJpbmcgc2l6ZSBpcyBzZXQgdG8gKmNvdW50 Kiwgd2hpY2ggbXVzdCBiZSBhIHBvd2VyIG9mDQo+ICsgKiB0d28uIFdhdGVyIG1hcmtpbmcgaXMg ZGlzYWJsZWQgYnkgZGVmYXVsdC4gVGhlIHJlYWwgdXNhYmxlIGxmcmluZw0KPiArc2l6ZQ0KPiAr ICogaXMgKmNvdW50LTEqIGluc3RlYWQgb2YgKmNvdW50KiB0byBkaWZmZXJlbnRpYXRlIGEgZnJl ZSBsZnJpbmcgZnJvbQ0KPiArYW4NCj4gKyAqIGVtcHR5IGxmcmluZy4NCj4gKyAqDQo+ICsgKiBU aGUgbGZyaW5nIGlzIGFkZGVkIGluIFJURV9UQUlMUV9MRlJJTkcgbGlzdC4NCj4gKyAqDQo+ICsg KiBAcGFyYW0gbmFtZQ0KPiArICogICBUaGUgbmFtZSBvZiB0aGUgbGZyaW5nLg0KPiArICogQHBh cmFtIGNvdW50DQo+ICsgKiAgIFRoZSBzaXplIG9mIHRoZSBsZnJpbmcgKG11c3QgYmUgYSBwb3dl ciBvZiAyKS4NCj4gKyAqIEBwYXJhbSBzb2NrZXRfaWQNCj4gKyAqICAgVGhlICpzb2NrZXRfaWQq IGFyZ3VtZW50IGlzIHRoZSBzb2NrZXQgaWRlbnRpZmllciBpbiBjYXNlIG9mDQo+ICsgKiAgIE5V TUEuIFRoZSB2YWx1ZSBjYW4gYmUgKlNPQ0tFVF9JRF9BTlkqIGlmIHRoZXJlIGlzIG5vIE5VTUEN Cj4gKyAqICAgY29uc3RyYWludCBmb3IgdGhlIHJlc2VydmVkIHpvbmUuDQo+ICsgKiBAcGFyYW0g ZmxhZ3MNCj4gKyAqICAgQW4gT1Igb2YgdGhlIGZvbGxvd2luZzoNCj4gKyAqICAgIC0gTEZSSU5H X0ZfU1BfRU5ROiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgZGVmYXVsdCBiZWhhdmlvciB3aGVu DQo+ICsgKiAgICAgIHVzaW5nIGBgcnRlX2xmcmluZ19lbnF1ZXVlKClgYCBvciBgYHJ0ZV9sZnJp bmdfZW5xdWV1ZV9idWxrKClgYA0KPiArICogICAgICBpcyAic2luZ2xlLXByb2R1Y2VyIi4gT3Ro ZXJ3aXNlLCBpdCBpcyAibXVsdGktcHJvZHVjZXJzIi4NCj4gKyAqICAgIC0gTEZSSU5HX0ZfU0Nf REVROiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgZGVmYXVsdCBiZWhhdmlvciB3aGVuDQo+ICsg KiAgICAgIHVzaW5nIGBgcnRlX2xmcmluZ19kZXF1ZXVlKClgYCBvciBgYHJ0ZV9sZnJpbmdfZGVx dWV1ZV9idWxrKClgYA0KPiArICogICAgICBpcyAic2luZ2xlLWNvbnN1bWVyIi4gT3RoZXJ3aXNl LCBpdCBpcyAibXVsdGktY29uc3VtZXJzIi4NCj4gKyAqIEByZXR1cm4NCj4gKyAqICAgT24gc3Vj Y2VzcywgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBhbGxvY2F0ZWQgbGZyaW5nLiBOVUxMIG9uIGVy cm9yIHdpdGgNCj4gKyAqICAgIHJ0ZV9lcnJubyBzZXQgYXBwcm9wcmlhdGVseS4gUG9zc2libGUg ZXJybm8gdmFsdWVzIGluY2x1ZGU6DQo+ICsgKiAgICAtIEVfUlRFX05PX0NPTkZJRyAtIGZ1bmN0 aW9uIGNvdWxkIG5vdCBnZXQgcG9pbnRlciB0byBydGVfY29uZmlnDQo+IHN0cnVjdHVyZQ0KPiAr ICogICAgLSBFX1JURV9TRUNPTkRBUlkgLSBmdW5jdGlvbiB3YXMgY2FsbGVkIGZyb20gYSBzZWNv bmRhcnkgcHJvY2Vzcw0KPiBpbnN0YW5jZQ0KPiANCj4gRV9SVEVfU0VDT05EQVJZIGFuZCBFX1JU RV9OT19DT05GSUcgYXJlIG5vdCBwb3NzaWJsZSBlcnJvciBjYXNlcw0KPiANCj4gPHNuaXA+DQo+ IA0KPiANCj4gKyNkZWZpbmUgRU5RX1JFVFJZX0xJTUlUIDMyDQo+IA0KPiBQZXIgdGhlIGNvZGlu ZyBndWlkZWxpbmVzICgNCj4gaHR0cHM6Ly9kb2MuZHBkay5vcmcvZ3VpZGVzL2NvbnRyaWJ1dGlu Zy9jb2Rpbmdfc3R5bGUuaHRtbCNtYWNyb3MpLCBtYWNyb3MNCj4gc2hvdWxkIGJlIHByZWZpeGVk IHdpdGggUlRFXy4NCj4gDQo+IDxzbmlwPg0KPiANCj4gDQo+ICsvKioNCj4gKyAqIFJldHVybiB0 aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdoaWNoIGNhbiBiZSBzdG9yZWQgaW4gdGhlIGxmcmluZy4N Cj4gKyAqDQo+ICsgKiBAcGFyYW0gcg0KPiArICogICBBIHBvaW50ZXIgdG8gdGhlIGxmcmluZyBz dHJ1Y3R1cmUuDQo+ICsgKiBAcmV0dXJuDQo+ICsgKiAgIFRoZSB1c2FibGUgc2l6ZSBvZiB0aGUg bGZyaW5nLg0KPiArICovDQo+ICtzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludA0KPiArcnRlX2xm cmluZ19nZXRfY2FwYWNpdHkoY29uc3Qgc3RydWN0IHJ0ZV9sZnJpbmcgKnIpIHsNCj4gKwlyZXR1 cm4gci0+c2l6ZTsNCj4gDQo+IEkgYmVsaWV2ZSB0aGlzIHNob3VsZCByZXR1cm4gci0+bWFzaywg dG8gYWNjb3VudCBmb3IgdGhlIG9uZSB1bnVzYWJsZSByaW5nDQo+IGVudHJ5Lg0KDQpJIHRoaW5r IHRoaXMgaXMgYSBtaXN0YWtlLCBhbGwgcmluZyBlbnRyaWVzIHNob3VsZCBiZSB1c2FibGUuDQo+ IA0KPiA8c25pcD4NCj4gDQo+IA0KPiBkaWZmIC0tZ2l0IGEvbGliL2xpYnJ0ZV9sZnJpbmcvcnRl X2xmcmluZ192ZXJzaW9uLm1hcA0KPiBiL2xpYi9saWJydGVfbGZyaW5nL3J0ZV9sZnJpbmdfdmVy c2lvbi5tYXANCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gaW5kZXggMDAwMDAwMC4uZDkzNWVm ZA0KPiAtLS0gL2Rldi9udWxsDQo+ICsrKyBiL2xpYi9saWJydGVfbGZyaW5nL3J0ZV9sZnJpbmdf dmVyc2lvbi5tYXANCj4gQEAgLTAsMCArMSwxOSBAQA0KPiArRFBES18yLjAgew0KPiArCWdsb2Jh bDoNCj4gKw0KPiArCXJ0ZV9yaW5nX2NyZWF0ZTsNCj4gKwlydGVfcmluZ19kdW1wOw0KPiArCXJ0 ZV9yaW5nX2dldF9tZW1zaXplOw0KPiArCXJ0ZV9yaW5nX2luaXQ7DQo+ICsJcnRlX3JpbmdfbGlz dF9kdW1wOw0KPiArCXJ0ZV9yaW5nX2xvb2t1cDsNCj4gDQo+IE5lZWQgdG8gZml4IGZ1bmN0aW9u IG5hbWVzIGFuZCBEUERLIHZlcnNpb24gbnVtYmVyDQo+IA0KPiBUaGFua3MsDQo+IEdhZ2UNCj4g DQo+IA0KLS0gDQpPbGEgTGlsamVkYWhsLCBTeXN0ZW0gQXJjaGl0ZWN0LCBBcm0NCg0K