From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM03-BY2-obe.outbound.protection.outlook.com (mail-by2nam03on0051.outbound.protection.outlook.com [104.47.42.51]) by dpdk.org (Postfix) with ESMTP id 531D320F for ; Mon, 15 May 2017 07:22:58 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=xCF+wyTwyMonu4FApZye/TOrK5o4+OdzFYmFzDLIJIY=; b=AO23vFU0KRyE7bXhH3TufRnC8ikIZyL085USrZaybdHEqsC+hQVYptfMccZngoFBtx4bvWzKUmSYLUQrA+A8l1iGZ4n3VCHBOQlgT2k0Fznr6UIEvAkmehQYrcrObxoTa5Kr6y3cZaUk9ZCfA50wxTj57yHc2tiMqeBui41dh9c= Received: from BY2PR07MB2421.namprd07.prod.outlook.com (10.166.115.13) by BY1PR0701MB1724.namprd07.prod.outlook.com (10.162.111.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1084.16; Mon, 15 May 2017 05:22:56 +0000 Received: from BY2PR07MB2421.namprd07.prod.outlook.com ([10.166.115.13]) by BY2PR07MB2421.namprd07.prod.outlook.com ([10.166.115.13]) with mapi id 15.01.1084.027; Mon, 15 May 2017 05:22:54 +0000 From: "Sekhar, Ashwin" To: "tomasz.kantecki@intel.com" , "Jacob, Jerin" , "jianbo.liu@linaro.org" , "dev@dpdk.org" Thread-Topic: [PATCH v4 6/8] examples/l3fwd: add neon support for l3fwd Thread-Index: AQHSzSxIpgsId969M0CmtDXbW9bAsqH03EGA Date: Mon, 15 May 2017 05:22:54 +0000 Message-ID: <1494825773.3197.1.camel@caviumnetworks.com> References: <1493709255-8887-1-git-send-email-jianbo.liu@linaro.org> <1494819296-23049-1-git-send-email-jianbo.liu@linaro.org> <1494819296-23049-7-git-send-email-jianbo.liu@linaro.org> In-Reply-To: <1494819296-23049-7-git-send-email-jianbo.liu@linaro.org> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=cavium.com; x-originating-ip: [183.82.21.193] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; BY1PR0701MB1724; 7:sYuGgH7S9plMf0U4QsZaZmPKosSyTI6AlaWx1mAYAkXleD+q3iNJL7AgWd7C1W8m9VG2FhZ+zpGE+Dl6tFZeOqsmrLA27N0mGXT9cR8mXsvXvUcpSMCqdxHk6Ipk7ADDv3Ri0KblwEOQZ3tjMsFHdYmRyT/yFRz9nELNOYI0l2rRZEnO5XyMx/yfPekn3LzDEiwPyEdmBhYBHRCNR1j+6I3wA8xZBRPYLYtaneVyVfbP1Jf0ziT8W/9hbaGdesqva4bRjQwW/L5u9ufUWmvEeJBYHpNaacVL9Djgc7GyvlzDeunSSBUlB/cFbzXbQ6u1huvFnmo53qIe+d60r2qFiQ== x-forefront-antispam-report: SFV:SKI; SCL:-1SFV:NSPM; SFS:(10009020)(6009001)(39840400002)(39410400002)(39850400002)(39400400002)(39450400003)(24454002)(377424004)(229853002)(3660700001)(50986999)(2501003)(8676002)(76176999)(54356999)(3280700002)(81166006)(5660300001)(53936002)(25786009)(6246003)(2950100002)(8936002)(2900100001)(33646002)(122556002)(66066001)(6506006)(103116003)(36756003)(77096006)(6486002)(3846002)(2906002)(575784001)(6116002)(102836003)(86362001)(6436002)(2201001)(9686003)(6512007)(53946003)(72206003)(189998001)(305945005)(478600001)(7736002)(38730400002)(579004)(473944003); DIR:OUT; SFP:1101; SCL:1; SRVR:BY1PR0701MB1724; H:BY2PR07MB2421.namprd07.prod.outlook.com; FPR:; SPF:None; MLV:sfv; LANG:en; x-ms-office365-filtering-correlation-id: 5cb94bf6-b902-44cb-b51d-08d49b5270bb x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254075)(201703131423075)(201703031133081)(201702281549075); SRVR:BY1PR0701MB1724; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(5005006)(8121501046)(10201501046)(93006095)(93001095)(3002001)(6041248)(20161123560025)(20161123555025)(20161123564025)(20161123562025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(6072148); SRVR:BY1PR0701MB1724; BCL:0; PCL:0; RULEID:; SRVR:BY1PR0701MB1724; x-forefront-prvs: 0308EE423E spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="utf-8" Content-ID: <27D4A00F4225DD4FB5EBC4C0DE7C6283@namprd07.prod.outlook.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-originalarrivaltime: 15 May 2017 05:22:54.4764 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR0701MB1724 Subject: Re: [dpdk-dev] [PATCH v4 6/8] examples/l3fwd: add neon support for l3fwd 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: Mon, 15 May 2017 05:23:00 -0000 T24gTW9uLCAyMDE3LTA1LTE1IGF0IDExOjM0ICswODAwLCBKaWFuYm8gTGl1IHdyb3RlOg0KPiBV c2UgQVJNIE5FT04gaW50cmluc2ljcyB0byBhY2NlbGVyYXRlIGwzIGZvd2FyZGluZy4NCj4gDQo+ IFNpZ25lZC1vZmYtYnk6IEppYW5ibyBMaXUgPGppYW5iby5saXVAbGluYXJvLm9yZz4NCkFja2Vk LWJ5OiBBc2h3aW4gU2VraGFyIFQgSyA8YXNod2luLnNla2hhckBjYXZpdW1uZXR3b3Jrcy5jb20+ DQo+IC0tLQ0KPiDCoGV4YW1wbGVzL2wzZndkL2wzZndkX2VtLmPCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqB8wqDCoMKgNCArLQ0KPiDCoGV4YW1wbGVzL2wzZndkL2wzZndkX2VtX2hsbS5owqDCoMKg wqDCoMKgwqDCoHzCoMKgMTcgKystDQo+IMKgZXhhbXBsZXMvbDNmd2QvbDNmd2RfZW1faGxtX25l b24uaMKgwqDCoHzCoMKgNzQgKysrKysrKysrKw0KPiDCoGV4YW1wbGVzL2wzZndkL2wzZndkX2Vt X3NlcXVlbnRpYWwuaCB8wqDCoDE4ICsrLQ0KPiDCoGV4YW1wbGVzL2wzZndkL2wzZndkX2xwbS5j wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHzCoMKgwqA0ICstDQo+IMKgZXhhbXBsZXMvbDNmd2QvbDNm d2RfbHBtX25lb24uaMKgwqDCoMKgwqDCoHwgMTkzDQo+ICsrKysrKysrKysrKysrKysrKysrKysr KysrDQo+IMKgZXhhbXBsZXMvbDNmd2QvbDNmd2RfbmVvbi5owqDCoMKgwqDCoMKgwqDCoMKgwqB8 IDI1OQ0KPiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKw0KPiDCoDcgZmlsZXMg Y2hhbmdlZCwgNTYzIGluc2VydGlvbnMoKyksIDYgZGVsZXRpb25zKC0pDQo+IMKgY3JlYXRlIG1v ZGUgMTAwNjQ0IGV4YW1wbGVzL2wzZndkL2wzZndkX2VtX2hsbV9uZW9uLmgNCj4gwqBjcmVhdGUg bW9kZSAxMDA2NDQgZXhhbXBsZXMvbDNmd2QvbDNmd2RfbHBtX25lb24uaA0KPiDCoGNyZWF0ZSBt b2RlIDEwMDY0NCBleGFtcGxlcy9sM2Z3ZC9sM2Z3ZF9uZW9uLmgNCj4gDQo+IGRpZmYgLS1naXQg YS9leGFtcGxlcy9sM2Z3ZC9sM2Z3ZF9lbS5jIGIvZXhhbXBsZXMvbDNmd2QvbDNmd2RfZW0uYw0K PiBpbmRleCBiYTg0NGIyLi5kYTk2Y2ZkIDEwMDY0NA0KPiAtLS0gYS9leGFtcGxlcy9sM2Z3ZC9s M2Z3ZF9lbS5jDQo+ICsrKyBiL2V4YW1wbGVzL2wzZndkL2wzZndkX2VtLmMNCj4gQEAgLTMyOCw3 ICszMjgsNyBAQCBzdHJ1Y3QgaXB2Nl9sM2Z3ZF9lbV9yb3V0ZSB7DQo+IMKgCXJldHVybiAodWlu dDhfdCkoKHJldCA8IDApID8gcG9ydGlkIDoNCj4gaXB2Nl9sM2Z3ZF9vdXRfaWZbcmV0XSk7DQo+ IMKgfQ0KPiDCoA0KPiAtI2lmIGRlZmluZWQoX19TU0U0XzFfXykNCj4gKyNpZiBkZWZpbmVkKF9f U1NFNF8xX18pIHx8IGRlZmluZWQoUlRFX01BQ0hJTkVfQ1BVRkxBR19ORU9OKQ0KPiDCoCNpZiBk ZWZpbmVkKE5PX0hBU0hfTVVMVElfTE9PS1VQKQ0KPiDCoCNpbmNsdWRlICJsM2Z3ZF9lbV9zZXF1 ZW50aWFsLmgiDQo+IMKgI2Vsc2UNCj4gQEAgLTcwOSw3ICs3MDksNyBAQCBzdHJ1Y3QgaXB2Nl9s M2Z3ZF9lbV9yb3V0ZSB7DQo+IMKgCQkJaWYgKG5iX3J4ID09IDApDQo+IMKgCQkJCWNvbnRpbnVl Ow0KPiDCoA0KPiAtI2lmIGRlZmluZWQoX19TU0U0XzFfXykNCj4gKyNpZiBkZWZpbmVkKF9fU1NF NF8xX18pIHx8IGRlZmluZWQoUlRFX01BQ0hJTkVfQ1BVRkxBR19ORU9OKQ0KPiDCoAkJCWwzZndk X2VtX3NlbmRfcGFja2V0cyhuYl9yeCwgcGt0c19idXJzdCwNCj4gwqAJCQkJCQkJcG9ydGlkLA0K PiBxY29uZik7DQo+IMKgI2Vsc2UNCj4gZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2wzZndkL2wzZndk X2VtX2hsbS5oDQo+IGIvZXhhbXBsZXMvbDNmd2QvbDNmd2RfZW1faGxtLmgNCj4gaW5kZXggNjM2 ZGVhNC4uYjkxNjNlMyAxMDA2NDQNCj4gLS0tIGEvZXhhbXBsZXMvbDNmd2QvbDNmd2RfZW1faGxt LmgNCj4gKysrIGIvZXhhbXBsZXMvbDNmd2QvbDNmd2RfZW1faGxtLmgNCj4gQEAgLTM1LDggKzM1 LDEzIEBADQo+IMKgI2lmbmRlZiBfX0wzRldEX0VNX0hMTV9IX18NCj4gwqAjZGVmaW5lIF9fTDNG V0RfRU1fSExNX0hfXw0KPiDCoA0KPiArI2lmIGRlZmluZWQoX19TU0U0XzFfXykNCj4gwqAjaW5j bHVkZSAibDNmd2Rfc3NlLmgiDQo+IMKgI2luY2x1ZGUgImwzZndkX2VtX2hsbV9zc2UuaCINCj4g KyNlbGlmIGRlZmluZWQoUlRFX01BQ0hJTkVfQ1BVRkxBR19ORU9OKQ0KPiArI2luY2x1ZGUgImwz ZndkX25lb24uaCINCj4gKyNpbmNsdWRlICJsM2Z3ZF9lbV9obG1fbmVvbi5oIg0KPiArI2VuZGlm DQo+IMKgDQo+IMKgc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkg dm9pZA0KPiDCoGVtX2dldF9kc3RfcG9ydF9pcHY0eDgoc3RydWN0IGxjb3JlX2NvbmYgKnFjb25m LCBzdHJ1Y3QgcnRlX21idWYNCj4gKm1bOF0sDQo+IEBAIC0yMzgsNyArMjQzLDcgQEAgc3RhdGlj IGlubGluZSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkNCj4gdWludDE2X3QNCj4gwqBs M2Z3ZF9lbV9zZW5kX3BhY2tldHMoaW50IG5iX3J4LCBzdHJ1Y3QgcnRlX21idWYgKipwa3RzX2J1 cnN0LA0KPiDCoAkJdWludDhfdCBwb3J0aWQsIHN0cnVjdCBsY29yZV9jb25mICpxY29uZikNCj4g wqB7DQo+IC0JaW50MzJfdCBqOw0KPiArCWludDMyX3QgaSwgaiwgcG9zOw0KPiDCoAl1aW50MTZf dCBkc3RfcG9ydFtNQVhfUEtUX0JVUlNUXTsNCj4gwqANCj4gwqAJLyoNCj4gQEAgLTI0Nyw2ICsy NTIsMTEgQEAgc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkNCj4g dWludDE2X3QNCj4gwqAJwqAqLw0KPiDCoAlpbnQzMl90IG4gPSBSVEVfQUxJR05fRkxPT1IobmJf cngsIDgpOw0KPiDCoA0KPiArCWZvciAoaiA9IDA7IGogPCA4ICYmIGogPCBuYl9yeDsgaisrKSB7 DQo+ICsJCXJ0ZV9wcmVmZXRjaDAocnRlX3BrdG1idWZfbXRvZChwa3RzX2J1cnN0W2pdLA0KPiAr CQkJCQnCoMKgwqDCoMKgwqDCoHN0cnVjdCBldGhlcl9oZHIgKikgKw0KPiAxKTsNCj4gKwl9DQo+ ICsNCj4gwqAJZm9yIChqID0gMDsgaiA8IG47IGogKz0gOCkgew0KPiDCoA0KPiDCoAkJdWludDMy X3QgcGt0X3R5cGUgPQ0KPiBAQCAtMjYzLDYgKzI3MywxMSBAQCBzdGF0aWMgaW5saW5lIF9fYXR0 cmlidXRlX18oKGFsd2F5c19pbmxpbmUpKQ0KPiB1aW50MTZfdA0KPiDCoAkJdWludDMyX3QgdGNw X29yX3VkcCA9IHBrdF90eXBlICYNCj4gwqAJCQkoUlRFX1BUWVBFX0w0X1RDUCB8IFJURV9QVFlQ RV9MNF9VRFApOw0KPiDCoA0KPiArCQlmb3IgKGkgPSAwLCBwb3MgPSBqICsgODsgaSA8IDggJiYg cG9zIDwgbmJfcng7IGkrKywNCj4gcG9zKyspIHsNCj4gKwkJCXJ0ZV9wcmVmZXRjaDAocnRlX3Br dG1idWZfbXRvZChwa3RzX2J1cnN0W3BvDQo+IHNdLA0KPiArCQkJCQkJwqDCoMKgwqDCoMKgwqBz dHJ1Y3QNCj4gZXRoZXJfaGRyICopICsgMSk7DQo+ICsJCX0NCj4gKw0KPiDCoAkJaWYgKHRjcF9v cl91ZHAgJiYgKGwzX3R5cGUgPT0gUlRFX1BUWVBFX0wzX0lQVjQpKSB7DQo+IMKgDQo+IMKgCQkJ ZW1fZ2V0X2RzdF9wb3J0X2lwdjR4OChxY29uZiwNCj4gJnBrdHNfYnVyc3Rbal0sIHBvcnRpZCwN Cj4gZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2wzZndkL2wzZndkX2VtX2hsbV9uZW9uLmgNCj4gYi9l eGFtcGxlcy9sM2Z3ZC9sM2Z3ZF9lbV9obG1fbmVvbi5oDQo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0 DQo+IGluZGV4IDAwMDAwMDAuLmRhZTFhY2YNCj4gLS0tIC9kZXYvbnVsbA0KPiArKysgYi9leGFt cGxlcy9sM2Z3ZC9sM2Z3ZF9lbV9obG1fbmVvbi5oDQo+IEBAIC0wLDAgKzEsNzQgQEANCj4gKy8q LQ0KPiArICrCoMKgwqBCU0QgTElDRU5TRQ0KPiArICoNCj4gKyAqwqDCoMKgQ29weXJpZ2h0KGMp IDIwMTYgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQo+ICsgKsKgwqDC oENvcHlyaWdodChjKSAyMDE3LCBMaW5hcm8gTGltaXRlZA0KPiArICrCoMKgwqBBbGwgcmlnaHRz IHJlc2VydmVkLg0KPiArICoNCj4gKyAqwqDCoMKgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcg0KPiB3aXRob3V0DQo+ICsgKsKgwqDCoG1v ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcNCj4g Y29uZGl0aW9ucw0KPiArICrCoMKgwqBhcmUgbWV0Og0KPiArICoNCj4gKyAqwqDCoMKgwqDCoCog UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQ0KPiBj b3B5cmlnaHQNCj4gKyAqwqDCoMKgwqDCoMKgwqBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp b25zIGFuZCB0aGUgZm9sbG93aW5nDQo+IGRpc2NsYWltZXIuDQo+ICsgKsKgwqDCoMKgwqAqIFJl ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCj4g Y29weXJpZ2h0DQo+ICsgKsKgwqDCoMKgwqDCoMKgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0 aW9ucyBhbmQgdGhlIGZvbGxvd2luZw0KPiBkaXNjbGFpbWVyIGluDQo+ICsgKsKgwqDCoMKgwqDC oMKgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo IHRoZQ0KPiArICrCoMKgwqDCoMKgwqDCoGRpc3RyaWJ1dGlvbi4NCj4gKyAqwqDCoMKgwqDCoCog TmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0 cw0KPiArICrCoMKgwqDCoMKgwqDCoGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl IG9yIHByb21vdGUgcHJvZHVjdHMNCj4gZGVyaXZlZA0KPiArICrCoMKgwqDCoMKgwqDCoGZyb20g dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4NCj4gcGVybWlzc2lv bi4NCj4gKyAqDQo+ICsgKsKgwqDCoFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP UFlSSUdIVCBIT0xERVJTIEFORA0KPiBDT05UUklCVVRPUlMNCj4gKyAqwqDCoMKgIkFTIElTIiBB TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVA0KPiBO T1QNCj4gKyAqwqDCoMKgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD SEFOVEFCSUxJVFkgQU5EDQo+IEZJVE5FU1MgRk9SDQo+ICsgKsKgwqDCoEEgUEFSVElDVUxBUiBQ VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCj4gQ09QWVJJR0hU DQo+ICsgKsKgwqDCoE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF Q1QsIElORElSRUNULA0KPiBJTkNJREVOVEFMLA0KPiArICrCoMKgwqBTUEVDSUFMLCBFWEVNUExB UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQNCj4gTk9UDQo+ICsg KsKgwqDCoExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS VklDRVM7IExPU1MNCj4gT0YgVVNFLA0KPiArICrCoMKgwqBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORA0KPiBPTiBBTlkNCj4gKyAq wqDCoMKgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ QUJJTElUWSwgT1INCj4gVE9SVA0KPiArICrCoMKgwqAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GDQo+IFRIRSBVU0UNCj4gKyAqwqDC oMKgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP RiBTVUNIDQo+IERBTUFHRS4NCj4gKyAqLw0KPiArDQo+ICsjaWZuZGVmIF9fTDNGV0RfRU1fSExN X05FT05fSF9fDQo+ICsjZGVmaW5lIF9fTDNGV0RfRU1fSExNX05FT05fSF9fDQo+ICsNCj4gKyNp bmNsdWRlIDxhcm1fbmVvbi5oPg0KPiArDQo+ICtzdGF0aWMgaW5saW5lIHZvaWQNCj4gK2dldF9p cHY0XzV0dXBsZShzdHJ1Y3QgcnRlX21idWYgKm0wLCBpbnQzMng0X3QgbWFzazAsDQo+ICsJCXVu aW9uIGlwdjRfNXR1cGxlX2hvc3QgKmtleSkNCj4gK3sNCj4gKwlpbnQzMng0X3QgdG1wZGF0YTAg PSB2bGQxcV9zMzIocnRlX3BrdG1idWZfbXRvZF9vZmZzZXQobTAsDQo+IGludDMyX3QgKiwNCj4g KwkJCQlzaXplb2Yoc3RydWN0IGV0aGVyX2hkcikgKw0KPiArCQkJCW9mZnNldG9mKHN0cnVjdCBp cHY0X2hkciwNCj4gdGltZV90b19saXZlKSkpOw0KPiArDQo+ICsJa2V5LT54bW0gPSB2YW5kcV9z MzIodG1wZGF0YTAsIG1hc2swKTsNCj4gK30NCj4gKw0KPiArc3RhdGljIGlubGluZSB2b2lkDQo+ ICtnZXRfaXB2Nl81dHVwbGUoc3RydWN0IHJ0ZV9tYnVmICptMCwgaW50MzJ4NF90IG1hc2swLA0K PiArCQlpbnQzMng0X3QgbWFzazEsIHVuaW9uIGlwdjZfNXR1cGxlX2hvc3QgKmtleSkNCj4gK3sN Cj4gKwlpbnQzMng0X3QgdG1wZGF0YTAgPSB2bGQxcV9zMzIoDQo+ICsJCQlydGVfcGt0bWJ1Zl9t dG9kX29mZnNldChtMCwgaW50ICosDQo+ICsJCQkJc2l6ZW9mKHN0cnVjdCBldGhlcl9oZHIpICsN Cj4gKwkJCQlvZmZzZXRvZihzdHJ1Y3QgaXB2Nl9oZHIsDQo+IHBheWxvYWRfbGVuKSkpOw0KPiAr DQo+ICsJaW50MzJ4NF90IHRtcGRhdGExID0gdmxkMXFfczMyKA0KPiArCQkJcnRlX3BrdG1idWZf bXRvZF9vZmZzZXQobTAsIGludCAqLA0KPiArCQkJCXNpemVvZihzdHJ1Y3QgZXRoZXJfaGRyKSAr DQo+ICsJCQkJb2Zmc2V0b2Yoc3RydWN0IGlwdjZfaGRyLA0KPiBwYXlsb2FkX2xlbikgKyA4KSk7 DQo+ICsNCj4gKwlpbnQzMng0X3QgdG1wZGF0YTIgPSB2bGQxcV9zMzIoDQo+ICsJCQlydGVfcGt0 bWJ1Zl9tdG9kX29mZnNldChtMCwgaW50ICosDQo+ICsJCQkJc2l6ZW9mKHN0cnVjdCBldGhlcl9o ZHIpICsNCj4gKwkJCQlvZmZzZXRvZihzdHJ1Y3QgaXB2Nl9oZHIsDQo+IHBheWxvYWRfbGVuKSAr IDE2KSk7DQo+ICsNCj4gKwlrZXktPnhtbVswXSA9IHZhbmRxX3MzMih0bXBkYXRhMCwgbWFzazAp Ow0KPiArCWtleS0+eG1tWzFdID0gdG1wZGF0YTE7DQo+ICsJa2V5LT54bW1bMl0gPSB2YW5kcV9z MzIodG1wZGF0YTIsIG1hc2sxKTsNCj4gK30NCj4gKyNlbmRpZiAvKiBfX0wzRldEX0VNX0hMTV9O RU9OX0hfXyAqLw0KPiBkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbDNmd2QvbDNmd2RfZW1fc2VxdWVu dGlhbC5oDQo+IGIvZXhhbXBsZXMvbDNmd2QvbDNmd2RfZW1fc2VxdWVudGlhbC5oDQo+IGluZGV4 IGMwYTk3MjUuLjJiM2VjMTYgMTAwNjQ0DQo+IC0tLSBhL2V4YW1wbGVzL2wzZndkL2wzZndkX2Vt X3NlcXVlbnRpYWwuaA0KPiArKysgYi9leGFtcGxlcy9sM2Z3ZC9sM2Z3ZF9lbV9zZXF1ZW50aWFs LmgNCj4gQEAgLTQzLDcgKzQzLDExIEBADQo+IMKgICogY29tcGlsYXRpb24gdGltZS4NCj4gwqAg Ki8NCj4gwqANCj4gKyNpZiBkZWZpbmVkKF9fU1NFNF8xX18pDQo+IMKgI2luY2x1ZGUgImwzZndk X3NzZS5oIg0KPiArI2VsaWYgZGVmaW5lZChSVEVfTUFDSElORV9DUFVGTEFHX05FT04pDQo+ICsj aW5jbHVkZSAibDNmd2RfbmVvbi5oIg0KPiArI2VuZGlmDQo+IMKgDQo+IMKgc3RhdGljIGlubGlu ZSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkgdWludDE2X3QNCj4gwqBlbV9nZXRfZHN0 X3BvcnQoY29uc3Qgc3RydWN0IGxjb3JlX2NvbmYgKnFjb25mLCBzdHJ1Y3QgcnRlX21idWYNCj4g KnBrdCwNCj4gQEAgLTEwMSwxMSArMTA1LDIxIEBAIHN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVf XygoYWx3YXlzX2lubGluZSkpDQo+IHVpbnQxNl90DQo+IMKgbDNmd2RfZW1fc2VuZF9wYWNrZXRz KGludCBuYl9yeCwgc3RydWN0IHJ0ZV9tYnVmICoqcGt0c19idXJzdCwNCj4gwqAJCQl1aW50OF90 IHBvcnRpZCwgc3RydWN0IGxjb3JlX2NvbmYgKnFjb25mKQ0KPiDCoHsNCj4gLQlpbnQzMl90IGo7 DQo+ICsJaW50MzJfdCBpLCBqOw0KPiDCoAl1aW50MTZfdCBkc3RfcG9ydFtNQVhfUEtUX0JVUlNU XTsNCj4gwqANCj4gLQlmb3IgKGogPSAwOyBqIDwgbmJfcng7IGorKykNCj4gKwlpZiAobmJfcngg PiAwKSB7DQo+ICsJCXJ0ZV9wcmVmZXRjaDAocnRlX3BrdG1idWZfbXRvZChwa3RzX2J1cnN0WzBd LA0KPiArCQkJCQnCoMKgwqDCoMKgwqDCoHN0cnVjdCBldGhlcl9oZHIgKikgKw0KPiAxKTsNCj4g Kwl9DQo+ICsNCj4gKwlmb3IgKGkgPSAxLCBqID0gMDsgaiA8IG5iX3J4OyBpKyssIGorKykgew0K PiArCQlpZiAoaSA8IG5iX3J4KSB7DQo+ICsJCQlydGVfcHJlZmV0Y2gwKHJ0ZV9wa3RtYnVmX210 b2QocGt0c19idXJzdFtpXQ0KPiAsDQo+ICsJCQkJCQnCoMKgwqDCoMKgwqDCoHN0cnVjdA0KPiBl dGhlcl9oZHIgKikgKyAxKTsNCj4gKwkJfQ0KPiDCoAkJZHN0X3BvcnRbal0gPSBlbV9nZXRfZHN0 X3BvcnQocWNvbmYsIHBrdHNfYnVyc3Rbal0sDQo+IHBvcnRpZCk7DQo+ICsJfQ0KPiDCoA0KPiDC oAlzZW5kX3BhY2tldHNfbXVsdGkocWNvbmYsIHBrdHNfYnVyc3QsIGRzdF9wb3J0LCBuYl9yeCk7 DQo+IMKgfQ0KPiBkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbDNmd2QvbDNmd2RfbHBtLmMgYi9leGFt cGxlcy9sM2Z3ZC9sM2Z3ZF9scG0uYw0KPiBpbmRleCBmYzU1NGZjLi5kZGVmMjUwIDEwMDY0NA0K PiAtLS0gYS9leGFtcGxlcy9sM2Z3ZC9sM2Z3ZF9scG0uYw0KPiArKysgYi9leGFtcGxlcy9sM2Z3 ZC9sM2Z3ZF9scG0uYw0KPiBAQCAtMTg5LDYgKzE4OSw4IEBAIHN0YXRpYyBpbmxpbmUgX19hdHRy aWJ1dGVfXygoYWx3YXlzX2lubGluZSkpDQo+IHVpbnQxNl90DQo+IMKgDQo+IMKgI2lmIGRlZmlu ZWQoX19TU0U0XzFfXykNCj4gwqAjaW5jbHVkZSAibDNmd2RfbHBtX3NzZS5oIg0KPiArI2VsaWYg ZGVmaW5lZChSVEVfTUFDSElORV9DUFVGTEFHX05FT04pDQo+ICsjaW5jbHVkZSAibDNmd2RfbHBt X25lb24uaCINCj4gwqAjZWxzZQ0KPiDCoCNpbmNsdWRlICJsM2Z3ZF9scG0uaCINCj4gwqAjZW5k aWYNCj4gQEAgLTI2MSw3ICsyNjMsNyBAQCBzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGFs d2F5c19pbmxpbmUpKQ0KPiB1aW50MTZfdA0KPiDCoAkJCWlmIChuYl9yeCA9PSAwKQ0KPiDCoAkJ CQljb250aW51ZTsNCj4gwqANCj4gLSNpZiBkZWZpbmVkKF9fU1NFNF8xX18pDQo+ICsjaWYgZGVm aW5lZChfX1NTRTRfMV9fKSB8fCBkZWZpbmVkKFJURV9NQUNISU5FX0NQVUZMQUdfTkVPTikNCj4g wqAJCQlsM2Z3ZF9scG1fc2VuZF9wYWNrZXRzKG5iX3J4LCBwa3RzX2J1cnN0LA0KPiDCoAkJCQkJ CXBvcnRpZCwgcWNvbmYpOw0KPiDCoCNlbHNlDQo+IGRpZmYgLS1naXQgYS9leGFtcGxlcy9sM2Z3 ZC9sM2Z3ZF9scG1fbmVvbi5oDQo+IGIvZXhhbXBsZXMvbDNmd2QvbDNmd2RfbHBtX25lb24uaA0K PiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiBpbmRleCAwMDAwMDAwLi5iYWVkYmZlDQo+IC0tLSAv ZGV2L251bGwNCj4gKysrIGIvZXhhbXBsZXMvbDNmd2QvbDNmd2RfbHBtX25lb24uaA0KPiBAQCAt MCwwICsxLDE5MyBAQA0KPiArLyotDQo+ICsgKsKgwqDCoEJTRCBMSUNFTlNFDQo+ICsgKg0KPiAr ICrCoMKgwqBDb3B5cmlnaHQoYykgMjAxMC0yMDE2IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmln aHRzIHJlc2VydmVkLg0KPiArICrCoMKgwqBDb3B5cmlnaHQoYykgMjAxNywgTGluYXJvIExpbWl0 ZWQNCj4gKyAqwqDCoMKgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCj4gKyAqDQo+ICsgKsKgwqDCoFJl ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IN Cj4gd2l0aG91dA0KPiArICrCoMKgwqBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk ZWQgdGhhdCB0aGUgZm9sbG93aW5nDQo+IGNvbmRpdGlvbnMNCj4gKyAqwqDCoMKgYXJlIG1ldDoN Cj4gKyAqDQo+ICsgKsKgwqDCoMKgwqAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt dXN0IHJldGFpbiB0aGUgYWJvdmUNCj4gY29weXJpZ2h0DQo+ICsgKsKgwqDCoMKgwqDCoMKgbm90 aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZw0KPiBkaXNjbGFp bWVyLg0KPiArICrCoMKgwqDCoMKgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz dCByZXByb2R1Y2UgdGhlIGFib3ZlDQo+IGNvcHlyaWdodA0KPiArICrCoMKgwqDCoMKgwqDCoG5v dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcNCj4gZGlzY2xh aW1lciBpbg0KPiArICrCoMKgwqDCoMKgwqDCoHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCj4gKyAqwqDCoMKgwqDCoMKgwqBkaXN0cmli dXRpb24uDQo+ICsgKsKgwqDCoMKgwqAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9y YXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCj4gKyAqwqDCoMKgwqDCoMKgwqBjb250cmlidXRv cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzDQo+IGRlcml2ZWQN Cj4gKyAqwqDCoMKgwqDCoMKgwqBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw cmlvciB3cml0dGVuDQo+IHBlcm1pc3Npb24uDQo+ICsgKg0KPiArICrCoMKgwqBUSElTIFNPRlRX QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQNCj4gQ09OVFJJQlVU T1JTDQo+ICsgKsKgwqDCoCJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO VElFUywgSU5DTFVESU5HLCBCVVQNCj4gTk9UDQo+ICsgKsKgwqDCoExJTUlURUQgVE8sIFRIRSBJ TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORA0KPiBGSVRORVNTIEZPUg0K PiArICrCoMKgwqBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF TlQgU0hBTEwgVEhFDQo+IENPUFlSSUdIVA0KPiArICrCoMKgwqBPV05FUiBPUiBDT05UUklCVVRP UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwNCj4gSU5DSURFTlRBTCwNCj4g KyAqwqDCoMKgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO Q0xVRElORywgQlVUDQo+IE5PVA0KPiArICrCoMKgwqBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTDQo+IE9GIFVTRSwNCj4gKyAqwqDC oMKgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB VVNFRCBBTkQNCj4gT04gQU5ZDQo+ICsgKsKgwqDCoFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SDQo+IFRPUlQNCj4gKyAqwqDCoMKg KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V VCBPRg0KPiBUSEUgVVNFDQo+ICsgKsKgwqDCoE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSA0KPiBEQU1BR0UuDQo+ICsgKi8NCj4gKw0K PiArI2lmbmRlZiBfX0wzRldEX0xQTV9ORU9OX0hfXw0KPiArI2RlZmluZSBfX0wzRldEX0xQTV9O RU9OX0hfXw0KPiArDQo+ICsjaW5jbHVkZSA8YXJtX25lb24uaD4NCj4gKw0KPiArI2luY2x1ZGUg ImwzZndkX25lb24uaCINCj4gKw0KPiArLyoNCj4gKyAqIFJlYWQgcGFja2V0X3R5cGUgYW5kIGRl c3RpbmF0aW9uIElQVjQgYWRkcmVzc2VzIGZyb20gNCBtYnVmcy4NCj4gKyAqLw0KPiArc3RhdGlj IGlubGluZSB2b2lkDQo+ICtwcm9jZXNzeDRfc3RlcDEoc3RydWN0IHJ0ZV9tYnVmICpwa3RbRldE U1RFUF0sDQo+ICsJCWludDMyeDRfdCAqZGlwLA0KPiArCQl1aW50MzJfdCAqaXB2NF9mbGFnKQ0K PiArew0KPiArCXN0cnVjdCBpcHY0X2hkciAqaXB2NF9oZHI7DQo+ICsJc3RydWN0IGV0aGVyX2hk ciAqZXRoX2hkcjsNCj4gKwlpbnQzMl90IGRzdFtGV0RTVEVQXTsNCj4gKw0KPiArCWV0aF9oZHIg PSBydGVfcGt0bWJ1Zl9tdG9kKHBrdFswXSwgc3RydWN0IGV0aGVyX2hkciAqKTsNCj4gKwlpcHY0 X2hkciA9IChzdHJ1Y3QgaXB2NF9oZHIgKikoZXRoX2hkciArIDEpOw0KPiArCWRzdFswXSA9IGlw djRfaGRyLT5kc3RfYWRkcjsNCj4gKwlpcHY0X2ZsYWdbMF0gPSBwa3RbMF0tPnBhY2tldF90eXBl ICYgUlRFX1BUWVBFX0wzX0lQVjQ7DQo+ICsNCj4gKwlldGhfaGRyID0gcnRlX3BrdG1idWZfbXRv ZChwa3RbMV0sIHN0cnVjdCBldGhlcl9oZHIgKik7DQo+ICsJaXB2NF9oZHIgPSAoc3RydWN0IGlw djRfaGRyICopKGV0aF9oZHIgKyAxKTsNCj4gKwlkc3RbMV0gPSBpcHY0X2hkci0+ZHN0X2FkZHI7 DQo+ICsJaXB2NF9mbGFnWzBdICY9IHBrdFsxXS0+cGFja2V0X3R5cGU7DQo+ICsNCj4gKwlldGhf aGRyID0gcnRlX3BrdG1idWZfbXRvZChwa3RbMl0sIHN0cnVjdCBldGhlcl9oZHIgKik7DQo+ICsJ aXB2NF9oZHIgPSAoc3RydWN0IGlwdjRfaGRyICopKGV0aF9oZHIgKyAxKTsNCj4gKwlkc3RbMl0g PSBpcHY0X2hkci0+ZHN0X2FkZHI7DQo+ICsJaXB2NF9mbGFnWzBdICY9IHBrdFsyXS0+cGFja2V0 X3R5cGU7DQo+ICsNCj4gKwlldGhfaGRyID0gcnRlX3BrdG1idWZfbXRvZChwa3RbM10sIHN0cnVj dCBldGhlcl9oZHIgKik7DQo+ICsJaXB2NF9oZHIgPSAoc3RydWN0IGlwdjRfaGRyICopKGV0aF9o ZHIgKyAxKTsNCj4gKwlkc3RbM10gPSBpcHY0X2hkci0+ZHN0X2FkZHI7DQo+ICsJaXB2NF9mbGFn WzBdICY9IHBrdFszXS0+cGFja2V0X3R5cGU7DQo+ICsNCj4gKwlkaXBbMF0gPSB2bGQxcV9zMzIo ZHN0KTsNCj4gK30NCj4gKw0KPiArLyoNCj4gKyAqIExvb2t1cCBpbnRvIExQTSBmb3IgZGVzdGlu YXRpb24gcG9ydC4NCj4gKyAqIElmIGxvb2t1cCBmYWlscywgdXNlIGluY29taW5nIHBvcnQgKHBv cnRpZCkgYXMgZGVzdGluYXRpb24gcG9ydC4NCj4gKyAqLw0KPiArc3RhdGljIGlubGluZSB2b2lk DQo+ICtwcm9jZXNzeDRfc3RlcDIoY29uc3Qgc3RydWN0IGxjb3JlX2NvbmYgKnFjb25mLA0KPiAr CQlpbnQzMng0X3QgZGlwLA0KPiArCQl1aW50MzJfdCBpcHY0X2ZsYWcsDQo+ICsJCXVpbnQ4X3Qg cG9ydGlkLA0KPiArCQlzdHJ1Y3QgcnRlX21idWYgKnBrdFtGV0RTVEVQXSwNCj4gKwkJdWludDE2 X3QgZHBydFtGV0RTVEVQXSkNCj4gK3sNCj4gKwlydGVfeG1tX3QgZHN0Ow0KPiArDQo+ICsJZGlw ID0NCj4gdnJlaW50ZXJwcmV0cV9zMzJfdTgodnJldjMycV91OCh2cmVpbnRlcnByZXRxX3U4X3Mz MihkaXApKSk7DQo+ICsNCj4gKwkvKiBpZiBhbGwgNCBwYWNrZXRzIGFyZSBJUFY0LiAqLw0KPiAr CWlmIChsaWtlbHkoaXB2NF9mbGFnKSkgew0KPiArCQlydGVfbHBtX2xvb2t1cHg0KHFjb25mLT5p cHY0X2xvb2t1cF9zdHJ1Y3QsIGRpcCwNCj4gZHN0LnUzMiwNCj4gKwkJCXBvcnRpZCk7DQo+ICsJ CS8qIGdldCByaWQgb2YgdW51c2VkIHVwcGVyIDE2IGJpdCBmb3IgZWFjaCBkcG9ydC4gKi8NCj4g KwkJdnN0MV9zMTYoKGludDE2X3QgKilkcHJ0LCB2cW1vdm5fczMyKGRzdC54KSk7DQo+ICsJfSBl bHNlIHsNCj4gKwkJZHN0LnggPSBkaXA7DQo+ICsJCWRwcnRbMF0gPSBscG1fZ2V0X2RzdF9wb3J0 X3dpdGhfaXB2NChxY29uZiwgcGt0WzBdLA0KPiArCQkJCQkJwqDCoMKgwqDCoGRzdC51MzJbMF0s DQo+IHBvcnRpZCk7DQo+ICsJCWRwcnRbMV0gPSBscG1fZ2V0X2RzdF9wb3J0X3dpdGhfaXB2NChx Y29uZiwgcGt0WzFdLA0KPiArCQkJCQkJwqDCoMKgwqDCoGRzdC51MzJbMV0sDQo+IHBvcnRpZCk7 DQo+ICsJCWRwcnRbMl0gPSBscG1fZ2V0X2RzdF9wb3J0X3dpdGhfaXB2NChxY29uZiwgcGt0WzJd LA0KPiArCQkJCQkJwqDCoMKgwqDCoGRzdC51MzJbMl0sDQo+IHBvcnRpZCk7DQo+ICsJCWRwcnRb M10gPSBscG1fZ2V0X2RzdF9wb3J0X3dpdGhfaXB2NChxY29uZiwgcGt0WzNdLA0KPiArCQkJCQkJ wqDCoMKgwqDCoGRzdC51MzJbM10sDQo+IHBvcnRpZCk7DQo+ICsJfQ0KPiArfQ0KPiArDQo+ICsv Kg0KPiArICogQnVmZmVyIG9wdGltaXplZCBoYW5kbGluZyBvZiBwYWNrZXRzLCBpbnZva2VkDQo+ ICsgKiBmcm9tIG1haW5fbG9vcC4NCj4gKyAqLw0KPiArc3RhdGljIGlubGluZSB2b2lkDQo+ICts M2Z3ZF9scG1fc2VuZF9wYWNrZXRzKGludCBuYl9yeCwgc3RydWN0IHJ0ZV9tYnVmICoqcGt0c19i dXJzdCwNCj4gKwkJCXVpbnQ4X3QgcG9ydGlkLCBzdHJ1Y3QgbGNvcmVfY29uZiAqcWNvbmYpDQo+ ICt7DQo+ICsJaW50MzJfdCBpID0gMCwgaiA9IDA7DQo+ICsJdWludDE2X3QgZHN0X3BvcnRbTUFY X1BLVF9CVVJTVF07DQo+ICsJaW50MzJ4NF90IGRpcDsNCj4gKwl1aW50MzJfdCBpcHY0X2ZsYWc7 DQo+ICsJY29uc3QgaW50MzJfdCBrID0gUlRFX0FMSUdOX0ZMT09SKG5iX3J4LCBGV0RTVEVQKTsN Cj4gKwljb25zdCBpbnQzMl90IG0gPSBuYl9yeCAlIEZXRFNURVA7DQo+ICsNCj4gKwlpZiAoaykg ew0KPiArCQlmb3IgKGkgPSAwOyBpIDwgRldEU1RFUDsgaSsrKSB7DQo+ICsJCQlydGVfcHJlZmV0 Y2gwKHJ0ZV9wa3RtYnVmX210b2QocGt0c19idXJzdFtpXQ0KPiAsDQo+ICsJCQkJCQlzdHJ1Y3Qg ZXRoZXJfaGRyICopDQo+ICsgMSk7DQo+ICsJCX0NCj4gKw0KPiArCQlmb3IgKGogPSAwOyBqICE9 IGsgLSBGV0RTVEVQOyBqICs9IEZXRFNURVApIHsNCj4gKwkJCWZvciAoaSA9IDA7IGkgPCBGV0RT VEVQOyBpKyspIHsNCj4gKwkJCQlydGVfcHJlZmV0Y2gwKHJ0ZV9wa3RtYnVmX210b2QoDQo+ICsJ CQkJCQlwa3RzX2J1cnN0W2ogKyBpICsNCj4gRldEU1RFUF0sDQo+ICsJCQkJCQlzdHJ1Y3QgZXRo ZXJfaGRyICopDQo+ICsgMSk7DQo+ICsJCQl9DQo+ICsNCj4gKwkJCXByb2Nlc3N4NF9zdGVwMSgm cGt0c19idXJzdFtqXSwgJmRpcCwNCj4gJmlwdjRfZmxhZyk7DQo+ICsJCQlwcm9jZXNzeDRfc3Rl cDIocWNvbmYsIGRpcCwgaXB2NF9mbGFnLA0KPiBwb3J0aWQsDQo+ICsJCQkJCSZwa3RzX2J1cnN0 W2pdLA0KPiAmZHN0X3BvcnRbal0pOw0KPiArCQl9DQo+ICsNCj4gKwkJcHJvY2Vzc3g0X3N0ZXAx KCZwa3RzX2J1cnN0W2pdLCAmZGlwLCAmaXB2NF9mbGFnKTsNCj4gKwkJcHJvY2Vzc3g0X3N0ZXAy KHFjb25mLCBkaXAsIGlwdjRfZmxhZywgcG9ydGlkLA0KPiAmcGt0c19idXJzdFtqXSwNCj4gKwkJ CQkmZHN0X3BvcnRbal0pOw0KPiArDQo+ICsJCWogKz0gRldEU1RFUDsNCj4gKwl9DQo+ICsNCj4g KwlpZiAobSkgew0KPiArCQkvKiBQcmVmZXRjaCBsYXN0IHVwIHRvIDMgcGFja2V0cyBvbmUgYnkg b25lICovDQo+ICsJCXN3aXRjaCAobSkgew0KPiArCQljYXNlIDM6DQo+ICsJCQlydGVfcHJlZmV0 Y2gwKHJ0ZV9wa3RtYnVmX210b2QocGt0c19idXJzdFtqXQ0KPiAsDQo+ICsJCQkJCQlzdHJ1Y3Qg ZXRoZXJfaGRyICopDQo+ICsgMSk7DQo+ICsJCQlqKys7DQo+ICsJCQkvKiBmYWxsdGhyb3VnaCAq Lw0KPiArCQljYXNlIDI6DQo+ICsJCQlydGVfcHJlZmV0Y2gwKHJ0ZV9wa3RtYnVmX210b2QocGt0 c19idXJzdFtqXQ0KPiAsDQo+ICsJCQkJCQlzdHJ1Y3QgZXRoZXJfaGRyICopDQo+ICsgMSk7DQo+ ICsJCQlqKys7DQo+ICsJCQkvKiBmYWxsdGhyb3VnaCAqLw0KPiArCQljYXNlIDE6DQo+ICsJCQly dGVfcHJlZmV0Y2gwKHJ0ZV9wa3RtYnVmX210b2QocGt0c19idXJzdFtqXQ0KPiAsDQo+ICsJCQkJ CQlzdHJ1Y3QgZXRoZXJfaGRyICopDQo+ICsgMSk7DQo+ICsJCQlqKys7DQo+ICsJCX0NCj4gKw0K PiArCQlqIC09IG07DQo+ICsJCS8qIENsYXNzaWZ5IGxhc3QgdXAgdG8gMyBwYWNrZXRzIG9uZSBi eSBvbmUgKi8NCj4gKwkJc3dpdGNoIChtKSB7DQo+ICsJCWNhc2UgMzoNCj4gKwkJCWRzdF9wb3J0 W2pdID0gbHBtX2dldF9kc3RfcG9ydChxY29uZiwNCj4gcGt0c19idXJzdFtqXSwNCj4gKwkJCQkJ CcKgwqDCoMKgwqDCoMKgcG9ydGlkKTsNCj4gKwkJCWorKzsNCj4gKwkJCS8qIGZhbGx0aHJvdWdo ICovDQo+ICsJCWNhc2UgMjoNCj4gKwkJCWRzdF9wb3J0W2pdID0gbHBtX2dldF9kc3RfcG9ydChx Y29uZiwNCj4gcGt0c19idXJzdFtqXSwNCj4gKwkJCQkJCcKgwqDCoMKgwqDCoMKgcG9ydGlkKTsN Cj4gKwkJCWorKzsNCj4gKwkJCS8qIGZhbGx0aHJvdWdoICovDQo+ICsJCWNhc2UgMToNCj4gKwkJ CWRzdF9wb3J0W2pdID0gbHBtX2dldF9kc3RfcG9ydChxY29uZiwNCj4gcGt0c19idXJzdFtqXSwN Cj4gKwkJCQkJCcKgwqDCoMKgwqDCoMKgcG9ydGlkKTsNCj4gKwkJfQ0KPiArCX0NCj4gKw0KPiAr CXNlbmRfcGFja2V0c19tdWx0aShxY29uZiwgcGt0c19idXJzdCwgZHN0X3BvcnQsIG5iX3J4KTsN Cj4gK30NCj4gKw0KPiArI2VuZGlmIC8qIF9fTDNGV0RfTFBNX05FT05fSF9fICovDQo+IGRpZmYg LS1naXQgYS9leGFtcGxlcy9sM2Z3ZC9sM2Z3ZF9uZW9uLmgNCj4gYi9leGFtcGxlcy9sM2Z3ZC9s M2Z3ZF9uZW9uLmgNCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gaW5kZXggMDAwMDAwMC4uZmUz NTFkYg0KPiAtLS0gL2Rldi9udWxsDQo+ICsrKyBiL2V4YW1wbGVzL2wzZndkL2wzZndkX25lb24u aA0KPiBAQCAtMCwwICsxLDI1OSBAQA0KPiArLyotDQo+ICsgKsKgwqDCoEJTRCBMSUNFTlNFDQo+ ICsgKg0KPiArICrCoMKgwqBDb3B5cmlnaHQoYykgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxs IHJpZ2h0cyByZXNlcnZlZC4NCj4gKyAqwqDCoMKgQ29weXJpZ2h0KGMpIDIwMTcsIExpbmFybyBM aW1pdGVkDQo+ICsgKsKgwqDCoEFsbCByaWdodHMgcmVzZXJ2ZWQuDQo+ICsgKg0KPiArICrCoMKg wqBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo IG9yDQo+IHdpdGhvdXQNCj4gKyAqwqDCoMKgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZw0KPiBjb25kaXRpb25zDQo+ICsgKsKgwqDCoGFyZSBt ZXQ6DQo+ICsgKg0KPiArICrCoMKgwqDCoMKgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlDQo+IGNvcHlyaWdodA0KPiArICrCoMKgwqDCoMKgwqDC oG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcNCj4gZGlz Y2xhaW1lci4NCj4gKyAqwqDCoMKgwqDCoCogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KPiBjb3B5cmlnaHQNCj4gKyAqwqDCoMKgwqDCoMKg wqBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nDQo+IGRp c2NsYWltZXIgaW4NCj4gKyAqwqDCoMKgwqDCoMKgwqB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQo+ICsgKsKgwqDCoMKgwqDCoMKgZGlz dHJpYnV0aW9uLg0KPiArICrCoMKgwqDCoMKgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENv cnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzDQo+ICsgKsKgwqDCoMKgwqDCoMKgY29udHJp YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cw0KPiBkZXJp dmVkDQo+ICsgKsKgwqDCoMKgwqDCoMKgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lm aWMgcHJpb3Igd3JpdHRlbg0KPiBwZXJtaXNzaW9uLg0KPiArICoNCj4gKyAqwqDCoMKgVEhJUyBT T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EDQo+IENPTlRS SUJVVE9SUw0KPiArICrCoMKgwqAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB UlJBTlRJRVMsIElOQ0xVRElORywgQlVUDQo+IE5PVA0KPiArICrCoMKgwqBMSU1JVEVEIFRPLCBU SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQNCj4gRklUTkVTUyBG T1INCj4gKyAqwqDCoMKgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P IEVWRU5UIFNIQUxMIFRIRQ0KPiBDT1BZUklHSFQNCj4gKyAqwqDCoMKgT1dORVIgT1IgQ09OVFJJ QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsDQo+IElOQ0lERU5UQUws DQo+ICsgKsKgwqDCoFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT IChJTkNMVURJTkcsIEJVVA0KPiBOT1QNCj4gKyAqwqDCoMKgTElNSVRFRCBUTywgUFJPQ1VSRU1F TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUw0KPiBPRiBVU0UsDQo+ICsg KsKgwqDCoERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF UiBDQVVTRUQgQU5EDQo+IE9OIEFOWQ0KPiArICrCoMKgwqBUSEVPUlkgT0YgTElBQklMSVRZLCBX SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUg0KPiBUT1JUDQo+ICsgKsKg wqDCoChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB WSBPVVQgT0YNCj4gVEhFIFVTRQ0KPiArICrCoMKgwqBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gNCj4gREFNQUdFLg0KPiArICovDQo+ ICsNCj4gKw0KPiArI2lmbmRlZiBfTDNGV0RfTkVPTl9IXw0KPiArI2RlZmluZSBfTDNGV0RfTkVP Tl9IXw0KPiArDQo+ICsjaW5jbHVkZSAibDNmd2QuaCINCj4gKyNpbmNsdWRlICJsM2Z3ZF9jb21t b24uaCINCj4gKw0KPiArLyoNCj4gKyAqIFVwZGF0ZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIE1B QyBhZGRyZXNzZXMgaW4gdGhlIGV0aGVybmV0DQo+IGhlYWRlci4NCj4gKyAqIFBlcmZvcm0gUkZD MTgxMiBjaGVja3MgYW5kIHVwZGF0ZXMgZm9yIElQVjQgcGFja2V0cy4NCj4gKyAqLw0KPiArc3Rh dGljIGlubGluZSB2b2lkDQo+ICtwcm9jZXNzeDRfc3RlcDMoc3RydWN0IHJ0ZV9tYnVmICpwa3Rb RldEU1RFUF0sIHVpbnQxNl90DQo+IGRzdF9wb3J0W0ZXRFNURVBdKQ0KPiArew0KPiArCXVpbnQz Mng0X3QgdGVbRldEU1RFUF07DQo+ICsJdWludDMyeDRfdCB2ZVtGV0RTVEVQXTsNCj4gKwl1aW50 MzJfdCAqcFtGV0RTVEVQXTsNCj4gKw0KPiArCXBbMF0gPSBydGVfcGt0bWJ1Zl9tdG9kKHBrdFsw XSwgdWludDMyX3QgKik7DQo+ICsJcFsxXSA9IHJ0ZV9wa3RtYnVmX210b2QocGt0WzFdLCB1aW50 MzJfdCAqKTsNCj4gKwlwWzJdID0gcnRlX3BrdG1idWZfbXRvZChwa3RbMl0sIHVpbnQzMl90ICop Ow0KPiArCXBbM10gPSBydGVfcGt0bWJ1Zl9tdG9kKHBrdFszXSwgdWludDMyX3QgKik7DQo+ICsN Cj4gKwl2ZVswXSA9IHZyZWludGVycHJldHFfdTMyX3MzMih2YWxfZXRoW2RzdF9wb3J0WzBdXSk7 DQo+ICsJdGVbMF0gPSB2bGQxcV91MzIocFswXSk7DQo+ICsNCj4gKwl2ZVsxXSA9IHZyZWludGVy cHJldHFfdTMyX3MzMih2YWxfZXRoW2RzdF9wb3J0WzFdXSk7DQo+ICsJdGVbMV0gPSB2bGQxcV91 MzIocFsxXSk7DQo+ICsNCj4gKwl2ZVsyXSA9IHZyZWludGVycHJldHFfdTMyX3MzMih2YWxfZXRo W2RzdF9wb3J0WzJdXSk7DQo+ICsJdGVbMl0gPSB2bGQxcV91MzIocFsyXSk7DQo+ICsNCj4gKwl2 ZVszXSA9IHZyZWludGVycHJldHFfdTMyX3MzMih2YWxfZXRoW2RzdF9wb3J0WzNdXSk7DQo+ICsJ dGVbM10gPSB2bGQxcV91MzIocFszXSk7DQo+ICsNCj4gKwkvKiBVcGRhdGUgbGFzdCA0IGJ5dGVz ICovDQo+ICsJdmVbMF0gPSB2c2V0cV9sYW5lX3UzMih2Z2V0cV9sYW5lX3UzMih0ZVswXSwgMyks IHZlWzBdLCAzKTsNCj4gKwl2ZVsxXSA9IHZzZXRxX2xhbmVfdTMyKHZnZXRxX2xhbmVfdTMyKHRl WzFdLCAzKSwgdmVbMV0sIDMpOw0KPiArCXZlWzJdID0gdnNldHFfbGFuZV91MzIodmdldHFfbGFu ZV91MzIodGVbMl0sIDMpLCB2ZVsyXSwgMyk7DQo+ICsJdmVbM10gPSB2c2V0cV9sYW5lX3UzMih2 Z2V0cV9sYW5lX3UzMih0ZVszXSwgMyksIHZlWzNdLCAzKTsNCj4gKw0KPiArCXZzdDFxX3UzMihw WzBdLCB2ZVswXSk7DQo+ICsJdnN0MXFfdTMyKHBbMV0sIHZlWzFdKTsNCj4gKwl2c3QxcV91MzIo cFsyXSwgdmVbMl0pOw0KPiArCXZzdDFxX3UzMihwWzNdLCB2ZVszXSk7DQo+ICsNCj4gKwlyZmMx ODEyX3Byb2Nlc3MoKHN0cnVjdCBpcHY0X2hkciAqKSgoc3RydWN0IGV0aGVyX2hkciAqKXBbMF0N Cj4gKyAxKSwNCj4gKwkJJmRzdF9wb3J0WzBdLCBwa3RbMF0tPnBhY2tldF90eXBlKTsNCj4gKwly ZmMxODEyX3Byb2Nlc3MoKHN0cnVjdCBpcHY0X2hkciAqKSgoc3RydWN0IGV0aGVyX2hkciAqKXBb MV0NCj4gKyAxKSwNCj4gKwkJJmRzdF9wb3J0WzFdLCBwa3RbMV0tPnBhY2tldF90eXBlKTsNCj4g KwlyZmMxODEyX3Byb2Nlc3MoKHN0cnVjdCBpcHY0X2hkciAqKSgoc3RydWN0IGV0aGVyX2hkciAq KXBbMl0NCj4gKyAxKSwNCj4gKwkJJmRzdF9wb3J0WzJdLCBwa3RbMl0tPnBhY2tldF90eXBlKTsN Cj4gKwlyZmMxODEyX3Byb2Nlc3MoKHN0cnVjdCBpcHY0X2hkciAqKSgoc3RydWN0IGV0aGVyX2hk ciAqKXBbM10NCj4gKyAxKSwNCj4gKwkJJmRzdF9wb3J0WzNdLCBwa3RbM10tPnBhY2tldF90eXBl KTsNCj4gK30NCj4gKw0KPiArLyoNCj4gKyAqIEdyb3VwIGNvbnNlY3V0aXZlIHBhY2tldHMgd2l0 aCB0aGUgc2FtZSBkZXN0aW5hdGlvbiBwb3J0IGluDQo+IGJ1cnN0cyBvZiA0Lg0KPiArICogU3Vw cG9zZSB3ZSBoYXZlIGFycmF5IG9mIGRlc3Rpb25hdGlvbiBwb3J0czoNCj4gKyAqIGRzdF9wb3J0 W10gPSB7YSwgYiwgYywgZCwsIGUsIC4uLiB9DQo+ICsgKiBkcDEgc2hvdWxkIGNvbnRhaW46IDxh LCBiLCBjLCBkPiwgZHAyOiA8YiwgYywgZCwgZT4uDQo+ICsgKiBXZSBkb2luZyA0IGNvbXBhcmlz aW9ucyBhdCBvbmNlIGFuZCB0aGUgcmVzdWx0IGlzIDQgYml0IG1hc2suDQo+ICsgKiBUaGlzIG1h c2sgaXMgdXNlZCBhcyBhbiBpbmRleCBpbnRvIHByZWJ1aWxkIGFycmF5IG9mIHBudW0gdmFsdWVz Lg0KPiArICovDQo+ICtzdGF0aWMgaW5saW5lIHVpbnQxNl90ICoNCj4gK3BvcnRfZ3JvdXB4NCh1 aW50MTZfdCBwbltGV0RTVEVQICsgMV0sIHVpbnQxNl90ICpscCwgdWludDE2eDhfdCBkcDEsDQo+ ICsJwqDCoMKgwqDCoHVpbnQxNng4X3QgZHAyKQ0KPiArew0KPiArCXVuaW9uIHsNCj4gKwkJdWlu dDE2X3QgdTE2W0ZXRFNURVAgKyAxXTsNCj4gKwkJdWludDY0X3QgdTY0Ow0KPiArCX0gKnBudW0g PSAodm9pZCAqKXBuOw0KPiArDQo+ICsJaW50MzJfdCB2Ow0KPiArCXVpbnQxNng4X3QgbWFzayA9 IHsxLCAyLCA0LCA4LCAwLCAwLCAwLCAwfTsNCj4gKw0KPiArCWRwMSA9IHZjZXFxX3UxNihkcDEs IGRwMik7DQo+ICsJZHAxID0gdmFuZHFfdTE2KGRwMSwgbWFzayk7DQo+ICsJdiA9IHZhZGR2cV91 MTYoZHAxKTsNCj4gKw0KPiArCS8qIHVwZGF0ZSBsYXN0IHBvcnQgY291bnRlci4gKi8NCj4gKwls cFswXSArPSBncHRibFt2XS5scHY7DQo+ICsNCj4gKwkvKiBpZiBkZXN0IHBvcnQgdmFsdWUgaGFz IGNoYW5nZWQuICovDQo+ICsJaWYgKHYgIT0gR1JQTVNLKSB7DQo+ICsJCXBudW0tPnU2NCA9IGdw dGJsW3ZdLnBudW07DQo+ICsJCXBudW0tPnUxNltGV0RTVEVQXSA9IDE7DQo+ICsJCWxwID0gcG51 bS0+dTE2ICsgZ3B0Ymxbdl0uaWR4Ow0KPiArCX0NCj4gKw0KPiArCXJldHVybiBscDsNCj4gK30N Cj4gKw0KPiArLyoqDQo+ICsgKiBQcm9jZXNzIG9uZSBwYWNrZXQ6DQo+ICsgKiBVcGRhdGUgc291 cmNlIGFuZCBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzc2VzIGluIHRoZSBldGhlcm5ldA0KPiBoZWFk ZXIuDQo+ICsgKiBQZXJmb3JtIFJGQzE4MTIgY2hlY2tzIGFuZCB1cGRhdGVzIGZvciBJUFY0IHBh Y2tldHMuDQo+ICsgKi8NCj4gK3N0YXRpYyBpbmxpbmUgdm9pZA0KPiArcHJvY2Vzc19wYWNrZXQo c3RydWN0IHJ0ZV9tYnVmICpwa3QsIHVpbnQxNl90ICpkc3RfcG9ydCkNCj4gK3sNCj4gKwlzdHJ1 Y3QgZXRoZXJfaGRyICpldGhfaGRyOw0KPiArCXVpbnQzMng0X3QgdGUsIHZlOw0KPiArDQo+ICsJ ZXRoX2hkciA9IHJ0ZV9wa3RtYnVmX210b2QocGt0LCBzdHJ1Y3QgZXRoZXJfaGRyICopOw0KPiAr DQo+ICsJdGUgPSB2bGQxcV91MzIoKHVpbnQzMl90ICopZXRoX2hkcik7DQo+ICsJdmUgPSB2cmVp bnRlcnByZXRxX3UzMl9zMzIodmFsX2V0aFtkc3RfcG9ydFswXV0pOw0KPiArDQo+ICsNCj4gKwly ZmMxODEyX3Byb2Nlc3MoKHN0cnVjdCBpcHY0X2hkciAqKShldGhfaGRyICsgMSksIGRzdF9wb3J0 LA0KPiArCQkJcGt0LT5wYWNrZXRfdHlwZSk7DQo+ICsNCj4gKwl2ZSA9IHZjb3B5cV9sYW5lcV91 MzIodmUsIDMsIHRlLCAzKTsNCj4gKwl2c3QxcV91MzIoKHVpbnQzMl90ICopZXRoX2hkciwgdmUp Ow0KPiArfQ0KPiArDQo+ICsvKioNCj4gKyAqIFNlbmQgcGFja2V0cyBidXJzdCBmcm9tIHBrdHNf YnVyc3QgdG8gdGhlIHBvcnRzIGluIGRzdF9wb3J0IGFycmF5DQo+ICsgKi8NCj4gK3N0YXRpYyBp bmxpbmUgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpIHZvaWQNCj4gK3NlbmRfcGFja2V0 c19tdWx0aShzdHJ1Y3QgbGNvcmVfY29uZiAqcWNvbmYsIHN0cnVjdCBydGVfbWJ1Zg0KPiAqKnBr dHNfYnVyc3QsDQo+ICsJCXVpbnQxNl90IGRzdF9wb3J0W01BWF9QS1RfQlVSU1RdLCBpbnQgbmJf cngpDQo+ICt7DQo+ICsJaW50MzJfdCBrOw0KPiArCWludCBqID0gMDsNCj4gKwl1aW50MTZfdCBk bHA7DQo+ICsJdWludDE2X3QgKmxwOw0KPiArCXVpbnQxNl90IHBudW1bTUFYX1BLVF9CVVJTVCAr IDFdOw0KPiArDQo+ICsJLyoNCj4gKwnCoCogRmluaXNoIHBhY2tldCBwcm9jZXNzaW5nIGFuZCBn cm91cCBjb25zZWN1dGl2ZQ0KPiArCcKgKiBwYWNrZXRzIHdpdGggdGhlIHNhbWUgZGVzdGluYXRp b24gcG9ydC4NCj4gKwnCoCovDQo+ICsJayA9IFJURV9BTElHTl9GTE9PUihuYl9yeCwgRldEU1RF UCk7DQo+ICsJaWYgKGsgIT0gMCkgew0KPiArCQl1aW50MTZ4OF90IGRwMSwgZHAyOw0KPiArDQo+ ICsJCWxwID0gcG51bTsNCj4gKwkJbHBbMF0gPSAxOw0KPiArDQo+ICsJCXByb2Nlc3N4NF9zdGVw Myhwa3RzX2J1cnN0LCBkc3RfcG9ydCk7DQo+ICsNCj4gKwkJLyogZHAxOiA8ZFswXSwgZFsxXSwg ZFsyXSwgZFszXSwgLi4uID4gKi8NCj4gKwkJZHAxID0gdmxkMXFfdTE2KGRzdF9wb3J0KTsNCj4g Kw0KPiArCQlmb3IgKGogPSBGV0RTVEVQOyBqICE9IGs7IGogKz0gRldEU1RFUCkgew0KPiArCQkJ cHJvY2Vzc3g0X3N0ZXAzKCZwa3RzX2J1cnN0W2pdLA0KPiAmZHN0X3BvcnRbal0pOw0KPiArDQo+ ICsJCQkvKg0KPiArCQkJwqAqIGRwMjoNCj4gKwkJCcKgKiA8ZFtqLTNdLCBkW2otMl0sIGRbai0x XSwgZFtqXSwgLi4uID4NCj4gKwkJCcKgKi8NCj4gKwkJCWRwMiA9IHZsZDFxX3UxNigmZHN0X3Bv cnRbaiAtIEZXRFNURVAgKyAxXSk7DQo+ICsJCQlscMKgwqA9IHBvcnRfZ3JvdXB4NCgmcG51bVtq IC0gRldEU1RFUF0sIGxwLA0KPiBkcDEsIGRwMik7DQo+ICsNCj4gKwkJCS8qDQo+ICsJCQnCoCog ZHAxOg0KPiArCQkJwqAqIDxkW2pdLCBkW2orMV0sIGRbaisyXSwgZFtqKzNdLCAuLi4gPg0KPiAr CQkJwqAqLw0KPiArCQkJZHAxID0gdmV4dHFfdTE2KGRwMSwgZHAxLCBGV0RTVEVQIC0gMSk7DQo+ ICsJCX0NCj4gKw0KPiArCQkvKg0KPiArCQnCoCogZHAyOiA8ZFtqLTNdLCBkW2otMl0sIGRbai0x XSwgZFtqLTFdLCAuLi4gPg0KPiArCQnCoCovDQo+ICsJCWRwMiA9IHZleHRxX3UxNihkcDEsIGRw MSwgMSk7DQo+ICsJCWRwMiA9IHZzZXRxX2xhbmVfdTE2KHZnZXRxX2xhbmVfdTE2KGRwMiwgMiks IGRwMiwNCj4gMyk7DQo+ICsJCWxwwqDCoD0gcG9ydF9ncm91cHg0KCZwbnVtW2ogLSBGV0RTVEVQ XSwgbHAsIGRwMSwNCj4gZHAyKTsNCj4gKw0KPiArCQkvKg0KPiArCQnCoCogcmVtb3ZlIHZhbHVl cyBhZGRlZCBieSB0aGUgbGFzdCByZXBlYXRlZA0KPiArCQnCoCogZHN0IHBvcnQuDQo+ICsJCcKg Ki8NCj4gKwkJbHBbMF0tLTsNCj4gKwkJZGxwID0gZHN0X3BvcnRbaiAtIDFdOw0KPiArCX0gZWxz ZSB7DQo+ICsJCS8qIHNldCBkbHAgYW5kIGxwIHRvIHRoZSBuZXZlciB1c2VkIHZhbHVlcy4gKi8N Cj4gKwkJZGxwID0gQkFEX1BPUlQgLSAxOw0KPiArCQlscCA9IHBudW0gKyBNQVhfUEtUX0JVUlNU Ow0KPiArCX0NCj4gKw0KPiArCS8qIFByb2Nlc3MgdXAgdG8gbGFzdCAzIHBhY2tldHMgb25lIGJ5 IG9uZS4gKi8NCj4gKwlzd2l0Y2ggKG5iX3J4ICUgRldEU1RFUCkgew0KPiArCWNhc2UgMzoNCj4g KwkJcHJvY2Vzc19wYWNrZXQocGt0c19idXJzdFtqXSwgZHN0X3BvcnQgKyBqKTsNCj4gKwkJR1JP VVBfUE9SVF9TVEVQKGRscCwgZHN0X3BvcnQsIGxwLCBwbnVtLCBqKTsNCj4gKwkJaisrOw0KPiAr CQkvKiBmYWxsdGhyb3VnaCAqLw0KPiArCWNhc2UgMjoNCj4gKwkJcHJvY2Vzc19wYWNrZXQocGt0 c19idXJzdFtqXSwgZHN0X3BvcnQgKyBqKTsNCj4gKwkJR1JPVVBfUE9SVF9TVEVQKGRscCwgZHN0 X3BvcnQsIGxwLCBwbnVtLCBqKTsNCj4gKwkJaisrOw0KPiArCQkvKiBmYWxsdGhyb3VnaCAqLw0K PiArCWNhc2UgMToNCj4gKwkJcHJvY2Vzc19wYWNrZXQocGt0c19idXJzdFtqXSwgZHN0X3BvcnQg KyBqKTsNCj4gKwkJR1JPVVBfUE9SVF9TVEVQKGRscCwgZHN0X3BvcnQsIGxwLCBwbnVtLCBqKTsN Cj4gKwkJaisrOw0KPiArCX0NCj4gKw0KPiArCS8qDQo+ICsJwqAqIFNlbmQgcGFja2V0cyBvdXQs IHRocm91Z2ggZGVzdGluYXRpb24gcG9ydC4NCj4gKwnCoCogQ29uc2VjdXRpdmUgcGFja2V0cyB3 aXRoIHRoZSBzYW1lIGRlc3RpbmF0aW9uIHBvcnQNCj4gKwnCoCogYXJlIGFscmVhZHkgZ3JvdXBl ZCB0b2dldGhlci4NCj4gKwnCoCogSWYgZGVzdGluYXRpb24gcG9ydCBmb3IgdGhlIHBhY2tldCBl cXVhbHMgQkFEX1BPUlQsDQo+ICsJwqAqIHRoZW4gZnJlZSB0aGUgcGFja2V0IHdpdGhvdXQgc2Vu ZGluZyBpdCBvdXQuDQo+ICsJwqAqLw0KPiArCWZvciAoaiA9IDA7IGogPCBuYl9yeDsgaiArPSBr KSB7DQo+ICsNCj4gKwkJaW50MzJfdCBtOw0KPiArCQl1aW50MTZfdCBwbjsNCj4gKw0KPiArCQlw biA9IGRzdF9wb3J0W2pdOw0KPiArCQlrID0gcG51bVtqXTsNCj4gKw0KPiArCQlpZiAobGlrZWx5 KHBuICE9IEJBRF9QT1JUKSkNCj4gKwkJCXNlbmRfcGFja2V0c3g0KHFjb25mLCBwbiwgcGt0c19i dXJzdCArIGosDQo+IGspOw0KPiArCQllbHNlDQo+ICsJCQlmb3IgKG0gPSBqOyBtICE9IGogKyBr OyBtKyspDQo+ICsJCQkJcnRlX3BrdG1idWZfZnJlZShwa3RzX2J1cnN0W21dKTsNCj4gKw0KPiAr CX0NCj4gK30NCj4gKw0KPiArI2VuZGlmIC8qIF9MM0ZXRF9ORU9OX0hfICov