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=-12.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED 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 35889C04AA7 for ; Wed, 15 May 2019 03:37:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E82302086A for ; Wed, 15 May 2019 03:37:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726319AbfEODhb (ORCPT ); Tue, 14 May 2019 23:37:31 -0400 Received: from cnbjsegrel01.sonyericsson.com ([219.141.167.163]:7642 "EHLO CNBJSEGREL01.sonyericsson.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726254AbfEODhb (ORCPT ); Tue, 14 May 2019 23:37:31 -0400 X-Greylist: delayed 604 seconds by postgrey-1.27 at vger.kernel.org; Tue, 14 May 2019 23:37:28 EDT From: "Mao, Chenxi" To: Gao Xiang CC: "akpm@linux-foundation.org" , "linux-kernel@vger.kernel.org" , "Feng, Roy" , "Xu, Yuanli 2" , "Alm, Robert 2" , "Takahashi, Masaya A (Sony Mobile)" , Miao Xie , "yann.collet.73@gmail.com" Subject: RE: [PATCH 1/1] LZ4: Port LZ4 1.9.x FAST_DEC_LOOP and enable it on x86 and ARM64 Thread-Topic: [PATCH 1/1] LZ4: Port LZ4 1.9.x FAST_DEC_LOOP and enable it on x86 and ARM64 Thread-Index: AQHVCrdMGGGVb9cEY0GNbg2foUMmJKZq7jIAgACVPEA= Date: Wed, 15 May 2019 03:27:19 +0000 Message-ID: <0c1d0d7d24ae48f68ae6acc95c0c4869@CNBJMBX12.corpusers.net> References: <20190515004336.66555-1-chenxi.mao@sony.com> <649ba9ed-223e-1e82-1513-f3c16e4c8f9a@huawei.com> In-Reply-To: <649ba9ed-223e-1e82-1513-f3c16e4c8f9a@huawei.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [10.154.228.2] Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org SGkgWGlhbmc6DQoNClRoYW5rcyBmb3IgeW91ciByZXBseSwgSSB3aWxsIGhhdmUgYSBzdHJlc3Mg dGVzdCBvbiBteSBkZXZpY2UgbGF0ZXIuDQpJIGRpZG4ndCBoYXZlIGNoYW5jZSB0byB0ZXN0IExa NCB3aXRoIGNsYW5nIGJ1aWxkIGJlY2F1c2Ugb2YgZGV2aWNlIGxpbWl0YXRpb24uIEkgdGhpbmsg SSBjb3VsZCBkbyBpdCBsYXRlci4NCkkgZ3Vlc3MgdGhlIGNsYW5nIHBlcmZvcm1hbmNlIGRvd25n cmFkZSBpcyBjYXVzZWQgYnkgc29tZSBjb21waWxlciBvcHRpbWl6YXRpb24gb3B0aW9ucy4NCkkg d2lsbCBkb3VibGUgY2hlY2sgaXQgbGF0ZXIgaWYgSSBnb3QgdGhlIGRldmljZSB3aGljaCBjYW4g YnVpbGQga2VybmVsIHdpdGggY2xhbmcuDQoNCkJUVywgdGhlIEZBU1RfREVDX0xPT1AgbGV2ZXJh Z2UgTFo0X3dpbGRDb3B5OCBpbnN0ZWFkIG9mIExaNF93aWxkQ29weSwgDQpob3dldmVyIGJhc2Vk IG9uIG15IHRlc3QsIG9yaWdpbmFsIExaNF93aWxkQ29weSBoYXMgdGhlIGJldHRlciBwZXJmb3Jt YW5jZS4gDQpPcmlnaW5hbCBMWjRfd2lsZENvcHkgQVBJIHN0aWxsIGludm9rZWQgYnkgRkFTVF9E RUNfTE9PUCBhcGlzLg0KVGhhdCBtaWdodCBiZSBhIHByb2JsZW0gZm9yIFg4NiBkZXZpY2VzIGZv ciBjdXJyZW50IHBhdGNoLiANCg0KQ2hlbnhpDQoNCi0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0t DQpGcm9tOiBHYW8gWGlhbmcgW21haWx0bzpnYW94aWFuZzI1QGh1YXdlaS5jb21dIA0KU2VudDog V2VkbmVzZGF5LCBNYXkgMTUsIDIwMTkgMTA6MjEgQU0NClRvOiBNYW8sIENoZW54aSA8Q2hlbnhp Lk1hb0Bzb255LmNvbT4NCkNjOiBha3BtQGxpbnV4LWZvdW5kYXRpb24ub3JnOyBsaW51eC1rZXJu ZWxAdmdlci5rZXJuZWwub3JnOyBGZW5nLCBSb3kgPFJveS5GZW5nQHNvbnkuY29tPjsgWHUsIFl1 YW5saSAyIDxZdWFubGkuWHVAc29ueS5jb20+OyBBbG0sIFJvYmVydCAyIDxSb2JlcnQuQWxtQHNv bnkuY29tPjsgVGFrYWhhc2hpLCBNYXNheWEgQSAoU29ueSBNb2JpbGUpIDxNYXNheWEuQS5UYWth aGFzaGlAc29ueS5jb20+OyBNaWFvIFhpZSA8bWlhb3hpZUBodWF3ZWkuY29tPg0KU3ViamVjdDog UmU6IFtQQVRDSCAxLzFdIExaNDogUG9ydCBMWjQgMS45LnggRkFTVF9ERUNfTE9PUCBhbmQgZW5h YmxlIGl0IG9uIHg4NiBhbmQgQVJNNjQNCg0KSGkgQ2hlbnhpLA0KDQpPbiAyMDE5LzUvMTUgODo0 MywgQ2hlbnhpIE1hbyB3cm90ZToNCj4gRkFTVF9ERUNfTE9PUCB3YXMgaW50cm9kdWNlZCBmcm9t IExaNCAxLjkuDQo+IFRoaXMgY2hhbmdlIHdvdWxkIGJlIGludHJvZHVjZSAxMCUgb24gZGVjb21w cmVzcyBvcGVyYXRpb24gYWNjb3JkaW5nIA0KPiB0byBMWjQgYmVuY2htYXJrIHJlc3VsdCBvbiBY ODYgZGV2aWNlcy4NCj4gTWVhbndoaWxlLCBMWjQgd2l0aCBGQVNUX0RFQ19MT09QIGNvdWxkIGdl dCBpbXByb3ZlbWVudHMsIGhvd2V2ZXIgDQo+IGNsYW5nIGNvbXBpbGVyIGhhcyBkb3duZ3JhZGUg aWYgRkFTVF9ERUNfTE9PUCBlbmFibGVkLg0KDQpJIG5vdGljZWQgdGhpcyBvcHRpbWl6YXRpb24g YW5kIGx6NC0xLjkuMCBbMV0gd2FzIGp1c3QgcmVsZWFzZWQgbW9udGggYWdvIHdpdGggdGhpcyBi aWcgY2hhbmdlIHRoZXJlZm9yZSBJJ20gYSBsaXR0bGUgYWZyYWlkIG9mIGl0cyBjdXJyZW50IHN0 YWJpbGl0eSAoZXNwZWNpYWxseSBzb21lIHJhcmUgdXNlZCBkZWNvbXByZXNzaW9uIGFwaXMuLi4p DQoNCkNvdWxkIHlvdSBDYyBtb3JlIHBlb3BsZSAoZS5nLiBsejQgb3JpZ2luYWwgYXV0aG9yIFlh bm4gQ29sbGV0KSBpbiBvcmRlciB0byBnZXQgc29tZSBtb3JlIGlkZWFzIGFib3V0IHRoaXMgaWYg cG9zc2libGU/DQoNCkFueXdheSwgSSBsaWtlIHRoaXMgb3B0aW1pemF0aW9uIGFzIHdlbGwgc2lu Y2UgRkFTVF9ERUNfTE9PUCBpbXByb3ZlcyBkZWNvbXByZXNzaW9uIHNwZWVkIGEgbG90IDopDQoN ClsxXSBodHRwczovL2dpdGh1Yi5jb20vbHo0L2x6NC9yZWxlYXNlcy90YWcvdjEuOS4wDQoNClRo YW5rcywNCkdhbyBYaWFuZw0KDQo+IA0KPiBTbyBGQVNUX0RFQ19MT09QIG9ubHkgZW5hYmxlZCBv biBYODYvWDg2LTY0IG9yIEFSTTY0IHdpdGggR0NDIGJ1aWxkLg0KPiANCj4gSGVyZSBpcyB0aGUg dGVzdCByZXN1bHQgb24gQVJNNjQoY29ydGV4LUE1MykNCj4gDQo+IEJlbmNobWFyayB2aWEgWlJB TToNCj4gDQo+IFRlc3QgY2FzZToNCj4gZmlvIC0tYnM9MzJrIC0tcmFuZHJlcGVhdD0xIC0tcmFu ZHNlZWQ9MTAwIC0tcmVmaWxsX2J1ZmZlcnMgXA0KPiAtLWJ1ZmZlcl9jb21wcmVzc19wZXJjZW50 YWdlPTc1IFwNCj4gLS1zY3JhbWJsZV9idWZmZXJzPTEgLS1kaXJlY3Q9MSAtLWxvb3BzPTEwMCAt LW51bWpvYnM9OCBcDQo+IC0tZmlsZW5hbWU9L2Rldi9ibG9jay96cmFtMCAtLW5hbWU9c2VxLXdy aXRlIC0tcnc9d3JpdGUgLS1zdG9uZXdhbGwgXCANCj4gLS1uYW1lPXNlcS1yZWFkIC0tcnc9cmVh ZCAtLXN0b25ld2FsbCAtLW5hbWU9c2VxLXJlYWR3cml0ZSBcIC0tcnc9cncgDQo+IC0tc3RvbmV3 YWxsIC0tbmFtZT1yYW5kLXJlYWR3cml0ZSAtLXJ3PXJhbmRydyAtLXN0b25ld2FsbA0KPiANCj4g UGF0Y2hlZDoNCj4gICAgUkVBRDogYnc9NzA3N01pQi9zICg3NDIxTUIvcykNCj4gVmFuaWxsYToN Cj4gICAgUkVBRDogYnc9NTEzNE1pQi9zICg1Mzg0TUIvcykNCj4gDQo+IFJlZmVyZW5jZToNCj4g MS4gaHR0cHM6Ly9naXRodWIuY29tL2x6NC9sejQvcHVsbC82NDUNCj4gMi4gaHR0cHM6Ly9naXRo dWIuY29tL2x6NC9sejQvcHVsbC83MDcNCj4gDQo+IFNpZ25lZC1vZmYtYnk6IGNoZW54aS5tYW8g PGNoZW54aS5tYW9Ac29ueS5jb20+DQo+IC0tLQ0KPiAgbGliL2x6NC9sejRfZGVjb21wcmVzcy5j IHwgNDI1IA0KPiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0NCj4gIDEg ZmlsZSBjaGFuZ2VkLCAzNjEgaW5zZXJ0aW9ucygrKSwgNjQgZGVsZXRpb25zKC0pDQo+IA0KPiBk aWZmIC0tZ2l0IGEvbGliL2x6NC9sejRfZGVjb21wcmVzcy5jIGIvbGliL2x6NC9sejRfZGVjb21w cmVzcy5jIGluZGV4IA0KPiAwYzlkM2FkMTdlMGYuLmE0Yzg3ZTMyYjNjMCAxMDA2NDQNCj4gLS0t IGEvbGliL2x6NC9sejRfZGVjb21wcmVzcy5jDQo+ICsrKyBiL2xpYi9sejQvbHo0X2RlY29tcHJl c3MuYw0KPiBAQCAtNTAsNiArNTAsMTMxIEBADQo+ICAjZGVmaW5lIGFzc2VydChjb25kaXRpb24p ICgodm9pZCkwKQ0KPiAgI2VuZGlmDQo+ICANCj4gKyNpZm5kZWYgTFo0X0ZBU1RfREVDX0xPT1AN Cj4gKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pICNkZWZpbmUg DQo+ICtMWjRfRkFTVF9ERUNfTE9PUCAxICNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pICYmICFk ZWZpbmVkKF9fY2xhbmdfXykNCj4gKyAgICAgLyogT24gYWFyY2g2NCwgd2UgZGlzYWJsZSB0aGlz IG9wdGltaXphdGlvbiBmb3IgY2xhbmcgYmVjYXVzZSBvbiBjZXJ0YWluDQo+ICsgICAgICAqIG1v YmlsZSBjaGlwc2V0cyBhbmQgY2xhbmcsIGl0IHJlZHVjZXMgcGVyZm9ybWFuY2UuIEZvciBtb3Jl IGluZm9ybWF0aW9uDQo+ICsgICAgICAqIHJlZmVyIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9sejQv bHo0L3B1bGwvNzA3LiAqLyAjZGVmaW5lIA0KPiArTFo0X0ZBU1RfREVDX0xPT1AgMSAjZWxzZSAj ZGVmaW5lIExaNF9GQVNUX0RFQ19MT09QIDAgI2VuZGlmICNlbmRpZg0KPiArDQo+ICtzdGF0aWMg Y29uc3QgdW5zaWduZWQgaW5jMzJ0YWJsZVs4XSA9IHsgMCwgMSwgMiwgMSwgMCwgNCwgNCwgNCB9 OyANCj4gK3N0YXRpYyBjb25zdCBpbnQgZGVjNjR0YWJsZVs4XSA9IHsgMCwgMCwgMCwgLTEsIC00 LCAxLCAyLCAzIH07DQo+ICsNCj4gKyNpZiBMWjRfRkFTVF9ERUNfTE9PUA0KPiArI2RlZmluZSBG QVNUTE9PUF9TQUZFX0RJU1RBTkNFIDY0DQo+ICtGT1JDRV9JTkxJTkUgdm9pZA0KPiArTFo0X21l bWNweV91c2luZ19vZmZzZXRfYmFzZShCWVRFICogZHN0UHRyLCBjb25zdCBCWVRFICogc3JjUHRy LCBCWVRFICogZHN0RW5kLA0KPiArCQkJICAgICBjb25zdCBzaXplX3Qgb2Zmc2V0KQ0KPiArew0K PiArCWlmIChvZmZzZXQgPCA4KSB7DQo+ICsJCWRzdFB0clswXSA9IHNyY1B0clswXTsNCj4gKw0K PiArCQlkc3RQdHJbMV0gPSBzcmNQdHJbMV07DQo+ICsJCWRzdFB0clsyXSA9IHNyY1B0clsyXTsN Cj4gKwkJZHN0UHRyWzNdID0gc3JjUHRyWzNdOw0KPiArCQlzcmNQdHIgKz0gaW5jMzJ0YWJsZVtv ZmZzZXRdOw0KPiArCQltZW1jcHkoZHN0UHRyICsgNCwgc3JjUHRyLCA0KTsNCj4gKwkJc3JjUHRy IC09IGRlYzY0dGFibGVbb2Zmc2V0XTsNCj4gKwkJZHN0UHRyICs9IDg7DQo+ICsJfSBlbHNlIHsN Cj4gKwkJbWVtY3B5KGRzdFB0ciwgc3JjUHRyLCA4KTsNCj4gKwkJZHN0UHRyICs9IDg7DQo+ICsJ CXNyY1B0ciArPSA4Ow0KPiArCX0NCj4gKw0KPiArCUxaNF93aWxkQ29weShkc3RQdHIsIHNyY1B0 ciwgZHN0RW5kKTsgfQ0KPiArDQo+ICsvKiBjdXN0b21pemVkIHZhcmlhbnQgb2YgbWVtY3B5LCB3 aGljaCBjYW4gb3ZlcndyaXRlIHVwIHRvIDMyIGJ5dGVzIA0KPiArYmV5b25kIGRzdEVuZA0KPiAr ICogdGhpcyB2ZXJzaW9uIGNvcGllcyB0d28gdGltZXMgMTYgYnl0ZXMgKGluc3RlYWQgb2Ygb25l IHRpbWUgMzIgDQo+ICtieXRlcykNCj4gKyAqIGJlY2F1c2UgaXQgbXVzdCBiZSBjb21wYXRpYmxl IHdpdGggb2Zmc2V0cyA+PSAxNi4gKi8gRk9SQ0VfSU5MSU5FIA0KPiArdm9pZCBMWjRfd2lsZENv cHkzMih2b2lkICpkc3RQdHIsIGNvbnN0IHZvaWQgKnNyY1B0ciwgdm9pZCAqZHN0RW5kKSB7DQo+ ICsJQllURSAqZCA9IChCWVRFICopIGRzdFB0cjsNCj4gKwljb25zdCBCWVRFICpzID0gKGNvbnN0 IEJZVEUgKilzcmNQdHI7DQo+ICsJQllURSAqY29uc3QgZSA9IChCWVRFICopIGRzdEVuZDsNCj4g Kw0KPiArCWRvIHsNCj4gKwkJbWVtY3B5KGQsIHMsIDE2KTsNCj4gKwkJbWVtY3B5KGQgKyAxNiwg cyArIDE2LCAxNik7DQo+ICsJCWQgKz0gMzI7DQo+ICsJCXMgKz0gMzI7DQo+ICsJfSB3aGlsZSAo ZCA8IGUpOw0KPiArfQ0KPiArDQo+ICtGT1JDRV9JTkxJTkUgdm9pZA0KPiArTFo0X21lbWNweV91 c2luZ19vZmZzZXQoQllURSAqZHN0UHRyLCBjb25zdCBCWVRFICpzcmNQdHIsIEJZVEUgKmRzdEVu ZCwNCj4gKwkJCWNvbnN0IHNpemVfdCBvZmZzZXQpDQo+ICt7DQo+ICsJQllURSB2WzhdOw0KPiAr CXN3aXRjaCAob2Zmc2V0KSB7DQo+ICsNCj4gKwljYXNlIDE6DQo+ICsJCW1lbXNldCh2LCAqc3Jj UHRyLCA4KTsNCj4gKwkJZ290byBjb3B5X2xvb3A7DQo+ICsJY2FzZSAyOg0KPiArCQltZW1jcHko diwgc3JjUHRyLCAyKTsNCj4gKwkJbWVtY3B5KCZ2WzJdLCBzcmNQdHIsIDIpOw0KPiArCQltZW1j cHkoJnZbNF0sICZ2WzBdLCA0KTsNCj4gKwkJZ290byBjb3B5X2xvb3A7DQo+ICsJY2FzZSA0Og0K PiArCQltZW1jcHkodiwgc3JjUHRyLCA0KTsNCj4gKwkJbWVtY3B5KCZ2WzRdLCBzcmNQdHIsIDQp Ow0KPiArCQlnb3RvIGNvcHlfbG9vcDsNCj4gKwlkZWZhdWx0Og0KPiArCQlMWjRfbWVtY3B5X3Vz aW5nX29mZnNldF9iYXNlKGRzdFB0ciwgc3JjUHRyLCBkc3RFbmQsIG9mZnNldCk7DQo+ICsJCXJl dHVybjsNCj4gKwl9DQo+ICsNCj4gKyAgICAgIGNvcHlfbG9vcDoNCj4gKwltZW1jcHkoZHN0UHRy LCB2LCA4KTsNCj4gKwlkc3RQdHIgKz0gODsNCj4gKwl3aGlsZSAoZHN0UHRyIDwgZHN0RW5kKSB7 DQo+ICsJCW1lbWNweShkc3RQdHIsIHYsIDgpOw0KPiArCQlkc3RQdHIgKz0gODsNCj4gKwl9DQo+ ICt9DQo+ICsNCj4gKy8qIFJlYWQgdGhlIHZhcmlhYmxlLWxlbmd0aCBsaXRlcmFsIG9yIG1hdGNo IGxlbmd0aC4NCj4gKyAqDQo+ICsgKiBpcCAtIHBvaW50ZXIgdG8gdXNlIGFzIGlucHV0Lg0KPiAr ICogbGVuY2hlY2sgLSBlbmQgaXAuICBSZXR1cm4gYW4gZXJyb3IgaWYgaXAgYWR2YW5jZXMgPj0g bGVuY2hlY2suDQo+ICsgKiBsb29wX2NoZWNrIC0gY2hlY2sgaXAgPj0gbGVuY2hlY2sgaW4gYm9k eSBvZiBsb29wLiAgUmV0dXJucyBsb29wX2Vycm9yIGlmIHNvLg0KPiArICogaW5pdGlhbF9jaGVj ayAtIGNoZWNrIGlwID49IGxlbmNoZWNrIGJlZm9yZSBzdGFydCBvZiBsb29wLiAgUmV0dXJucyBp bml0aWFsX2Vycm9yIGlmIHNvLg0KPiArICogZXJyb3IgKG91dHB1dCkgLSBlcnJvciBjb2RlLiAg U2hvdWxkIGJlIHNldCB0byAwIGJlZm9yZSBjYWxsLg0KPiArICovDQo+ICt0eXBlZGVmIGVudW0g eyBsb29wX2Vycm9yID0gLTIsIGluaXRpYWxfZXJyb3IgPSAtMSwgb2sgPSAwfSANCj4gK3Zhcmlh YmxlX2xlbmd0aF9lcnJvcjsgRk9SQ0VfSU5MSU5FIHVuc2lnbmVkIHJlYWRfdmFyaWFibGVfbGVu Z3RoKGNvbnN0IEJZVEUgKippcCwNCj4gKwkJCQkJICAgY29uc3QgQllURSAqbGVuY2hlY2ssDQo+ ICsJCQkJCSAgIGludCBsb29wX2NoZWNrLCBpbnQgaW5pdGlhbF9jaGVjaywNCj4gKwkJCQkJICAg dmFyaWFibGVfbGVuZ3RoX2Vycm9yICplcnJvcikgew0KPiArCXVuc2lnbmVkIGxlbmd0aCA9IDA7 DQo+ICsJdW5zaWduZWQgczsNCj4gKwlpZiAoaW5pdGlhbF9jaGVjayAmJiB1bmxpa2VseSgoKmlw KSA+PSBsZW5jaGVjaykpIHsJLyogb3ZlcmZsb3cgZGV0ZWN0aW9uICovDQo+ICsJCSplcnJvciA9 IGluaXRpYWxfZXJyb3I7DQo+ICsJCXJldHVybiBsZW5ndGg7DQo+ICsJfQ0KPiArCWRvIHsNCj4g KwkJcyA9ICoqaXA7DQo+ICsJCSgqaXApKys7DQo+ICsJCWxlbmd0aCArPSBzOw0KPiArCQlpZiAo bG9vcF9jaGVjayAmJiB1bmxpa2VseSgoKmlwKSA+PSBsZW5jaGVjaykpIHsJLyogb3ZlcmZsb3cg ZGV0ZWN0aW9uICovDQo+ICsJCQkqZXJyb3IgPSBsb29wX2Vycm9yOw0KPiArCQkJcmV0dXJuIGxl bmd0aDsNCj4gKwkJfQ0KPiArCX0gd2hpbGUgKHMgPT0gMjU1KTsNCj4gKw0KPiArCXJldHVybiBs ZW5ndGg7DQo+ICt9DQo+ICsjZW5kaWYNCj4gKw0KPiAgLyoNCj4gICAqIExaNF9kZWNvbXByZXNz X2dlbmVyaWMoKSA6DQo+ICAgKiBUaGlzIGdlbmVyaWMgZGVjb21wcmVzc2lvbiBmdW5jdGlvbiBj b3ZlcnMgYWxsIHVzZSBjYXNlcy4NCj4gQEAgLTgwLDI1ICsyMDUsMjggQEAgc3RhdGljIEZPUkNF X0lOTElORSBpbnQgTFo0X2RlY29tcHJlc3NfZ2VuZXJpYygNCj4gIAkgY29uc3Qgc2l6ZV90IGRp Y3RTaXplDQo+ICAJICkNCj4gIHsNCj4gLQljb25zdCBCWVRFICppcCA9IChjb25zdCBCWVRFICop IHNyYzsNCj4gLQljb25zdCBCWVRFICogY29uc3QgaWVuZCA9IGlwICsgc3JjU2l6ZTsNCj4gKwlj b25zdCBCWVRFICppcCA9IChjb25zdCBCWVRFICopc3JjOw0KPiArCWNvbnN0IEJZVEUgKmNvbnN0 IGllbmQgPSBpcCArIHNyY1NpemU7DQo+ICANCj4gIAlCWVRFICpvcCA9IChCWVRFICopIGRzdDsN Cj4gLQlCWVRFICogY29uc3Qgb2VuZCA9IG9wICsgb3V0cHV0U2l6ZTsNCj4gKwlCWVRFICpjb25z dCBvZW5kID0gb3AgKyBvdXRwdXRTaXplOw0KPiAgCUJZVEUgKmNweTsNCj4gIA0KPiAtCWNvbnN0 IEJZVEUgKiBjb25zdCBkaWN0RW5kID0gKGNvbnN0IEJZVEUgKilkaWN0U3RhcnQgKyBkaWN0U2l6 ZTsNCj4gLQlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGluYzMydGFibGVbOF0gPSB7MCwgMSwg MiwgMSwgMCwgNCwgNCwgNH07DQo+IC0Jc3RhdGljIGNvbnN0IGludCBkZWM2NHRhYmxlWzhdID0g ezAsIDAsIDAsIC0xLCAtNCwgMSwgMiwgM307DQo+ICsJY29uc3QgQllURSAqY29uc3QgZGljdEVu ZCA9IChjb25zdCBCWVRFICopZGljdFN0YXJ0ICsgZGljdFNpemU7DQo+ICANCj4gIAljb25zdCBp bnQgc2FmZURlY29kZSA9IChlbmRPbklucHV0ID09IGVuZE9uSW5wdXRTaXplKTsNCj4gIAljb25z dCBpbnQgY2hlY2tPZmZzZXQgPSAoKHNhZmVEZWNvZGUpICYmIChkaWN0U2l6ZSA8IChpbnQpKDY0 ICogDQo+IEtCKSkpOw0KPiAgDQo+ICAJLyogU2V0IHVwIHRoZSAiZW5kIiBwb2ludGVycyBmb3Ig dGhlIHNob3J0Y3V0LiAqLw0KPiAgCWNvbnN0IEJZVEUgKmNvbnN0IHNob3J0aWVuZCA9IGllbmQg LQ0KPiAtCQkoZW5kT25JbnB1dCA/IDE0IDogOCkgLyptYXhMTCovIC0gMiAvKm9mZnNldCovOw0K PiArCSAgICAoZW5kT25JbnB1dCA/IDE0IDogOCkgLyptYXhMTCovIC0gMiAvKm9mZnNldCovOw0K PiAgCWNvbnN0IEJZVEUgKmNvbnN0IHNob3J0b2VuZCA9IG9lbmQgLQ0KPiAtCQkoZW5kT25JbnB1 dCA/IDE0IDogOCkgLyptYXhMTCovIC0gMTggLyptYXhNTCovOw0KPiArCSAgICAoZW5kT25JbnB1 dCA/IDE0IDogOCkgLyptYXhMTCovIC0gMTggLyptYXhNTCovOw0KPiArDQo+ICsJY29uc3QgQllU RSAqbWF0Y2g7DQo+ICsJc2l6ZV90IG9mZnNldDsNCj4gKwl1bnNpZ25lZCBpbnQgdG9rZW47DQo+ ICsJc2l6ZV90IGxlbmd0aDsNCj4gIA0KPiAgCURFQlVHTE9HKDUsICIlcyAoc3JjU2l6ZTolaSwg ZHN0U2l6ZTolaSkiLCBfX2Z1bmNfXywNCj4gIAkJIHNyY1NpemUsIG91dHB1dFNpemUpOw0KPiBA QCAtMTE3LDE1ICsyNDUsMTk0IEBAIHN0YXRpYyBGT1JDRV9JTkxJTkUgaW50IExaNF9kZWNvbXBy ZXNzX2dlbmVyaWMoDQo+ICAJaWYgKChlbmRPbklucHV0KSAmJiB1bmxpa2VseShzcmNTaXplID09 IDApKQ0KPiAgCQlyZXR1cm4gLTE7DQo+ICANCj4gLQkvKiBNYWluIExvb3AgOiBkZWNvZGUgc2Vx dWVuY2VzICovDQo+ICsjaWYgTFo0X0ZBU1RfREVDX0xPT1ANCj4gKwlpZiAoKG9lbmQgLSBvcCkg PCBGQVNUTE9PUF9TQUZFX0RJU1RBTkNFKSB7DQo+ICsJCURFQlVHTE9HKDYsICJza2lwIGZhc3Qg ZGVjb2RlIGxvb3AiKTsNCj4gKwkJZ290byBzYWZlX2RlY29kZTsNCj4gKwl9DQo+ICsNCj4gKwkv KiBGYXN0IGxvb3AgOiBkZWNvZGUgc2VxdWVuY2VzIGFzIGxvbmcgYXMgb3V0cHV0IDwgDQo+ICtp ZW5kLUZBU1RMT09QX1NBRkVfRElTVEFOQ0UgKi8NCj4gIAl3aGlsZSAoMSkgew0KPiAtCQlzaXpl X3QgbGVuZ3RoOw0KPiAtCQljb25zdCBCWVRFICptYXRjaDsNCj4gLQkJc2l6ZV90IG9mZnNldDsN Cj4gKwkJLyogTWFpbiBmYXN0bG9vcCBhc3NlcnRpb246IFdlIGNhbiBhbHdheXMgd2lsZGNvcHkg RkFTVExPT1BfU0FGRV9ESVNUQU5DRSAqLw0KPiArCQlhc3NlcnQob2VuZCAtIG9wID49IEZBU1RM T09QX1NBRkVfRElTVEFOQ0UpOw0KPiArCQlpZiAoZW5kT25JbnB1dCkgew0KPiArCQkJYXNzZXJ0 KGlwIDwgaWVuZCk7DQo+ICsJCX0NCj4gKwkJdG9rZW4gPSAqaXArKzsNCj4gKwkJbGVuZ3RoID0g dG9rZW4gPj4gTUxfQklUUzsJLyogbGl0ZXJhbCBsZW5ndGggKi8NCj4gKw0KPiArCQlhc3NlcnQo IWVuZE9uSW5wdXQgfHwgaXAgPD0gaWVuZCk7CS8qIGlwIDwgaWVuZCBiZWZvcmUgdGhlIGluY3Jl bWVudCAqLw0KPiArDQo+ICsJCS8qIGRlY29kZSBsaXRlcmFsIGxlbmd0aCAqLw0KPiArCQlpZiAo bGVuZ3RoID09IFJVTl9NQVNLKSB7DQo+ICsJCQl2YXJpYWJsZV9sZW5ndGhfZXJyb3IgZXJyb3Ig PSBvazsNCj4gKwkJCWxlbmd0aCArPQ0KPiArCQkJICAgIHJlYWRfdmFyaWFibGVfbGVuZ3RoKCZp cCwgaWVuZCAtIFJVTl9NQVNLLA0KPiArCQkJCQkJIGVuZE9uSW5wdXQsIGVuZE9uSW5wdXQsDQo+ ICsJCQkJCQkgJmVycm9yKTsNCj4gKwkJCWlmIChlcnJvciA9PSBpbml0aWFsX2Vycm9yKSB7DQo+ ICsJCQkJZ290byBfb3V0cHV0X2Vycm9yOw0KPiArCQkJfQ0KPiArCQkJaWYgKChzYWZlRGVjb2Rl KQ0KPiArCQkJICAgICYmIHVubGlrZWx5KCh1cHRydmFsKSAob3ApICsgbGVuZ3RoIDwNCj4gKwkJ CQkJKHVwdHJ2YWwpIChvcCkpKSB7DQo+ICsJCQkJZ290byBfb3V0cHV0X2Vycm9yOw0KPiArCQkJ fQkvKiBvdmVyZmxvdyBkZXRlY3Rpb24gKi8NCj4gKwkJCWlmICgoc2FmZURlY29kZSkNCj4gKwkJ CSAgICAmJiB1bmxpa2VseSgodXB0cnZhbCkgKGlwKSArIGxlbmd0aCA8DQo+ICsJCQkJCSh1cHRy dmFsKSAoaXApKSkgew0KPiArCQkJCWdvdG8gX291dHB1dF9lcnJvcjsNCj4gKwkJCX0NCj4gKw0K PiArCQkJLyogb3ZlcmZsb3cgZGV0ZWN0aW9uICovDQo+ICsJCQkvKiBjb3B5IGxpdGVyYWxzICov DQo+ICsJCQljcHkgPSBvcCArIGxlbmd0aDsNCj4gKwkJCUxaNF9TVEFUSUNfQVNTRVJUKE1GTElN SVQgPj0gV0lMRENPUFlMRU5HVEgpOw0KPiArCQkJaWYgKGVuZE9uSW5wdXQpIHsJLyogTFo0X2Rl Y29tcHJlc3Nfc2FmZSgpICovDQo+ICsJCQkJaWYgKChjcHkgPiBvZW5kIC0gMzIpDQo+ICsJCQkJ ICAgIHx8IChpcCArIGxlbmd0aCA+IGllbmQgLSAzMikpIHsNCj4gKwkJCQkJZ290byBzYWZlX2xp dGVyYWxfY29weTsNCj4gKwkJCQl9DQo+ICsJCQkJTFo0X3dpbGRDb3B5MzIob3AsIGlwLCBjcHkp Ow0KPiArCQkJfSBlbHNlIHsJLyogTFo0X2RlY29tcHJlc3NfZmFzdCgpICovDQo+ICsJCQkJaWYg KGNweSA+IG9lbmQgLSA4KSB7DQo+ICsJCQkJCWdvdG8gc2FmZV9saXRlcmFsX2NvcHk7DQo+ICsJ CQkJfQ0KPiArCQkJCUxaNF93aWxkQ29weShvcCwgaXAsIGNweSk7DQo+ICsJCQkJLyogTFo0X2Rl Y29tcHJlc3NfZmFzdCgpIGNhbm5vdCBjb3B5IG1vcmUgdGhhbiA4IGJ5dGVzIGF0IGEgdGltZSAq Lw0KPiArCQkJCS8qIGl0IGRvZXNuJ3Qga25vdyBpbnB1dCBsZW5ndGgsIGFuZCBvbmx5IHJlbGll cyBvbiBlbmQtb2YtYmxvY2sgKi8NCj4gKwkJCQkvKiBwcm9wZXJ0aWVzICovDQo+ICsJCQl9DQo+ ICsJCQlpcCArPSBsZW5ndGg7DQo+ICsJCQlvcCA9IGNweTsNCj4gKwkJfSBlbHNlIHsNCj4gKwkJ CWNweSA9IG9wICsgbGVuZ3RoOw0KPiArCQkJaWYgKGVuZE9uSW5wdXQpIHsJLyogTFo0X2RlY29t cHJlc3Nfc2FmZSgpICovDQo+ICsJCQkJREVCVUdMT0coNywNCj4gKwkJCQkJICJjb3B5ICV1IGJ5 dGVzIGluIGEgMTYtYnl0ZXMgc3RyaXBlIiwNCj4gKwkJCQkJICh1bnNpZ25lZClsZW5ndGgpOw0K PiArCQkJCS8qIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgb2VuZCAqLw0KPiArCQkJCS8qIHNpbmNl IHdlIGNoZWNrIGl0IG9uY2UgZm9yIGVhY2ggbG9vcCBiZWxvdyAqLw0KPiArCQkJCWlmIChpcCA+ IGllbmQgLSAoMTYgKyAxKSkgewkvKm1heCBsaXQgKyBvZmZzZXQgKyBuZXh0VG9rZW4gKi8NCj4g KwkJCQkJZ290byBzYWZlX2xpdGVyYWxfY29weTsNCj4gKwkJCQl9DQo+ICsJCQkJLyogTGl0ZXJh bHMgY2FuIG9ubHkgYmUgMTQsIGJ1dCBob3BlIGNvbXBpbGVycyBvcHRpbWl6ZSAqLw0KPiArCQkJ CS8qaWYgd2UgY29weSBieSBhIHJlZ2lzdGVyIHNpemUgKi8NCj4gKwkJCQltZW1jcHkob3AsIGlw LCAxNik7DQo+ICsJCQl9IGVsc2Ugew0KPiArCQkJCS8qIExaNF9kZWNvbXByZXNzX2Zhc3QoKSBj YW5ub3QgY29weSBtb3JlIHRoYW4gOCBieXRlcyBhdCBhIHRpbWUgKi8NCj4gKwkJCQkvKiBpdCBk b2Vzbid0IGtub3cgaW5wdXQgbGVuZ3RoLCBhbmQgcmVsaWVzIG9uIGVuZC1vZi1ibG9jayAqLw0K PiArCQkJCS8qIHByb3BlcnRpZXMgKi8NCj4gKwkJCQltZW1jcHkob3AsIGlwLCA4KTsNCj4gKwkJ CQlpZiAobGVuZ3RoID4gOCkgew0KPiArCQkJCQltZW1jcHkob3AgKyA4LCBpcCArIDgsIDgpOw0K PiArCQkJCX0NCj4gKwkJCX0NCj4gKwkJCWlwICs9IGxlbmd0aDsNCj4gKwkJCW9wID0gY3B5Ow0K PiArCQl9DQo+ICsNCj4gKwkJLyogZ2V0IG9mZnNldCAqLw0KPiArCQlvZmZzZXQgPSBMWjRfcmVh ZExFMTYoaXApOw0KPiArCQlpcCArPSAyOwkvKiBlbmQtb2YtYmxvY2sgY29uZGl0aW9uIHZpb2xh dGVkICovDQo+ICsJCW1hdGNoID0gb3AgLSBvZmZzZXQ7DQo+ICsNCj4gKwkJLyogZ2V0IG1hdGNo bGVuZ3RoICovDQo+ICsJCWxlbmd0aCA9IHRva2VuICYgTUxfTUFTSzsNCj4gIA0KPiAtCQkvKiBn ZXQgbGl0ZXJhbCBsZW5ndGggKi8NCj4gLQkJdW5zaWduZWQgaW50IGNvbnN0IHRva2VuID0gKmlw Kys7DQo+IC0JCWxlbmd0aCA9IHRva2VuPj5NTF9CSVRTOw0KPiArCQlpZiAoKGNoZWNrT2Zmc2V0 KSAmJiAodW5saWtlbHkobWF0Y2ggKyBkaWN0U2l6ZSA8IGxvd1ByZWZpeCkpKSB7DQo+ICsJCQln b3RvIF9vdXRwdXRfZXJyb3I7DQo+ICsJCX0NCj4gKwkJLyogRXJyb3IgOiBvZmZzZXQgb3V0c2lk ZSBidWZmZXJzICovDQo+ICsJCWlmIChsZW5ndGggPT0gTUxfTUFTSykgew0KPiArCQkJdmFyaWFi bGVfbGVuZ3RoX2Vycm9yIGVycm9yID0gb2s7DQo+ICsJCQlsZW5ndGggKz0NCj4gKwkJCSAgICBy ZWFkX3ZhcmlhYmxlX2xlbmd0aCgmaXAsIGllbmQgLSBMQVNUTElURVJBTFMgKyAxLA0KPiArCQkJ CQkJIGVuZE9uSW5wdXQsIDAsICZlcnJvcik7DQo+ICsJCQlpZiAoZXJyb3IgIT0gb2spIHsNCj4g KwkJCQlnb3RvIF9vdXRwdXRfZXJyb3I7DQo+ICsJCQl9DQo+ICsJCQlpZiAoKHNhZmVEZWNvZGUp DQo+ICsJCQkgICAgJiYgdW5saWtlbHkoKHVwdHJ2YWwpIChvcCkgKyBsZW5ndGggPCAodXB0cnZh bCkgb3ApKSB7DQo+ICsJCQkJZ290byBfb3V0cHV0X2Vycm9yOw0KPiArCQkJfQkvKiBvdmVyZmxv dyBkZXRlY3Rpb24gKi8NCj4gKwkJCWxlbmd0aCArPSBNSU5NQVRDSDsNCj4gKwkJCWlmIChvcCAr IGxlbmd0aCA+PSBvZW5kIC0gRkFTVExPT1BfU0FGRV9ESVNUQU5DRSkgew0KPiArCQkJCWdvdG8g c2FmZV9tYXRjaF9jb3B5Ow0KPiArCQkJfQ0KPiArCQl9IGVsc2Ugew0KPiArCQkJbGVuZ3RoICs9 IE1JTk1BVENIOw0KPiArCQkJaWYgKG9wICsgbGVuZ3RoID49IG9lbmQgLSBGQVNUTE9PUF9TQUZF X0RJU1RBTkNFKSB7DQo+ICsJCQkJZ290byBzYWZlX21hdGNoX2NvcHk7DQo+ICsJCQl9DQo+ICsN Cj4gKwkJCS8qIEZhc3RwYXRoIGNoZWNrOiBBdm9pZHMgYSBicmFuY2ggaW4gTFo0X3dpbGRDb3B5 MzIgaWYgdHJ1ZSAqLw0KPiArCQkJaWYgKCEoZGljdCA9PSB1c2luZ0V4dERpY3QpIHx8IChtYXRj aCA+PSBsb3dQcmVmaXgpKSB7DQo+ICsJCQkJaWYgKG9mZnNldCA+PSA4KSB7DQo+ICsJCQkJCW1l bWNweShvcCwgbWF0Y2gsIDgpOw0KPiArCQkJCQltZW1jcHkob3AgKyA4LCBtYXRjaCArIDgsIDgp Ow0KPiArCQkJCQltZW1jcHkob3AgKyAxNiwgbWF0Y2ggKyAxNiwgMik7DQo+ICsJCQkJCW9wICs9 IGxlbmd0aDsNCj4gKwkJCQkJY29udGludWU7DQo+ICsJCQkJfQ0KPiArCQkJfQ0KPiArCQl9DQo+ ICsNCj4gKwkJLyogbWF0Y2ggc3RhcnRpbmcgd2l0aGluIGV4dGVybmFsIGRpY3Rpb25hcnkgKi8N Cj4gKwkJaWYgKChkaWN0ID09IHVzaW5nRXh0RGljdCkgJiYgKG1hdGNoIDwgbG93UHJlZml4KSkg ew0KPiArCQkJaWYgKHVubGlrZWx5KG9wICsgbGVuZ3RoID4gb2VuZCAtIExBU1RMSVRFUkFMUykp IHsNCj4gKwkJCQlpZiAocGFydGlhbERlY29kaW5nKSB7DQo+ICsJCQkJCS8qIHJlYWNoIGVuZCBv ZiBidWZmZXIgKi8NCj4gKwkJCQkJbGVuZ3RoID0NCj4gKwkJCQkJICAgIG1pbihsZW5ndGgsIChz aXplX3QpIChvZW5kIC0gb3ApKTsNCj4gKwkJCQl9IGVsc2Ugew0KPiArCQkJCQkvKiBlbmQtb2Yt YmxvY2sgY29uZGl0aW9uIHZpb2xhdGVkICovDQo+ICsJCQkJCWdvdG8gX291dHB1dF9lcnJvcjsN Cj4gKwkJCQl9DQo+ICsJCQl9DQo+ICsNCj4gKwkJCWlmIChsZW5ndGggPD0gKHNpemVfdCkgKGxv d1ByZWZpeCAtIG1hdGNoKSkgew0KPiArCQkJCS8qIG1hdGNoIGZpdHMgZW50aXJlbHkgd2l0aGlu IGV4dGVybmFsIGRpY3Rpb25hcnkgOiBqdXN0IGNvcHkgKi8NCj4gKwkJCQltZW1tb3ZlKG9wLCBk aWN0RW5kIC0gKGxvd1ByZWZpeCAtIG1hdGNoKSwgbGVuZ3RoKTsNCj4gKwkJCQlvcCArPSBsZW5n dGg7DQo+ICsJCQl9IGVsc2Ugew0KPiArCQkJCS8qIG1hdGNoIHN0cmV0Y2hlcyBpbnRvIGJvdGgg ZXh0ZXJuYWwgZGljdCBhbmQgY3VycmVudCBibG9jayAqLw0KPiArCQkJCXNpemVfdCBjb25zdCBj b3B5U2l6ZSA9DQo+ICsJCQkJICAgIChzaXplX3QpIChsb3dQcmVmaXggLSBtYXRjaCk7DQo+ICsJ CQkJc2l6ZV90IGNvbnN0IHJlc3RTaXplID0gbGVuZ3RoIC0gY29weVNpemU7DQo+ICsJCQkJbWVt Y3B5KG9wLCBkaWN0RW5kIC0gY29weVNpemUsIGNvcHlTaXplKTsNCj4gKwkJCQlvcCArPSBjb3B5 U2l6ZTsNCj4gKwkJCQlpZiAocmVzdFNpemUgPiAoc2l6ZV90KSAob3AgLSBsb3dQcmVmaXgpKSB7 CS8qIG92ZXJsYXAgY29weSAqLw0KPiArCQkJCQlCWVRFICpjb25zdCBlbmRPZk1hdGNoID0gb3Ag KyByZXN0U2l6ZTsNCj4gKwkJCQkJY29uc3QgQllURSAqY29weUZyb20gPSBsb3dQcmVmaXg7DQo+ ICsJCQkJCXdoaWxlIChvcCA8IGVuZE9mTWF0Y2gpIHsNCj4gKwkJCQkJCSpvcCsrID0gKmNvcHlG cm9tKys7DQo+ICsJCQkJCX0NCj4gKwkJCQl9IGVsc2Ugew0KPiArCQkJCQltZW1jcHkob3AsIGxv d1ByZWZpeCwgcmVzdFNpemUpOw0KPiArCQkJCQlvcCArPSByZXN0U2l6ZTsNCj4gKwkJCQl9DQo+ ICsJCQl9DQo+ICsJCQljb250aW51ZTsNCj4gKwkJfQ0KPiArDQo+ICsJCS8qIGNvcHkgbWF0Y2gg d2l0aGluIGJsb2NrICovDQo+ICsJCWNweSA9IG9wICsgbGVuZ3RoOw0KPiArDQo+ICsJCWFzc2Vy dCgob3AgPD0gb2VuZCkgJiYgKG9lbmQgLSBvcCA+PSAzMikpOw0KPiArCQlpZiAodW5saWtlbHko b2Zmc2V0IDwgMTYpKSB7DQo+ICsJCQlMWjRfbWVtY3B5X3VzaW5nX29mZnNldChvcCwgbWF0Y2gs IGNweSwgb2Zmc2V0KTsNCj4gKwkJfSBlbHNlIHsNCj4gKwkJCUxaNF93aWxkQ29weTMyKG9wLCBt YXRjaCwgY3B5KTsNCj4gKwkJfQ0KPiArDQo+ICsJCW9wID0gY3B5OwkvKiB3aWxkY29weSBjb3Jy ZWN0aW9uICovDQo+ICsJfQ0KPiArICAgICAgc2FmZV9kZWNvZGU6DQo+ICsjZW5kaWYNCj4gKwkv KiBNYWluIExvb3AgOiBkZWNvZGUgc2VxdWVuY2VzICovDQo+ICsJd2hpbGUgKDEpIHsNCj4gKwkJ bGVuZ3RoID0gdG9rZW4gPj4gTUxfQklUUzsNCj4gIA0KPiAgCQkvKiBpcCA8IGllbmQgYmVmb3Jl IHRoZSBpbmNyZW1lbnQgKi8NCj4gIAkJYXNzZXJ0KCFlbmRPbklucHV0IHx8IGlwIDw9IGllbmQp Ow0KPiBAQCAtMTQzLDI2ICs0NTAsMjcgQEAgc3RhdGljIEZPUkNFX0lOTElORSBpbnQgTFo0X2Rl Y29tcHJlc3NfZ2VuZXJpYygNCj4gIAkJICogY29tYmluZWQgY2hlY2sgZm9yIGJvdGggc3RhZ2Vz KS4NCj4gIAkJICovDQo+ICAJCWlmICgoZW5kT25JbnB1dCA/IGxlbmd0aCAhPSBSVU5fTUFTSyA6 IGxlbmd0aCA8PSA4KQ0KPiAtCQkgICAvKg0KPiAtCQkgICAgKiBzdHJpY3RseSAibGVzcyB0aGFu IiBvbiBpbnB1dCwgdG8gcmUtZW50ZXINCj4gLQkJICAgICogdGhlIGxvb3Agd2l0aCBhdCBsZWFz dCBvbmUgYnl0ZQ0KPiAtCQkgICAgKi8NCj4gLQkJICAgJiYgbGlrZWx5KChlbmRPbklucHV0ID8g aXAgPCBzaG9ydGllbmQgOiAxKSAmDQo+IC0JCQkgICAgIChvcCA8PSBzaG9ydG9lbmQpKSkgew0K PiArCQkgICAgLyoNCj4gKwkJICAgICAqIHN0cmljdGx5ICJsZXNzIHRoYW4iIG9uIGlucHV0LCB0 byByZS1lbnRlcg0KPiArCQkgICAgICogdGhlIGxvb3Agd2l0aCBhdCBsZWFzdCBvbmUgYnl0ZQ0K PiArCQkgICAgICovDQo+ICsJCSAgICAmJiBsaWtlbHkoKGVuZE9uSW5wdXQgPyBpcCA8IHNob3J0 aWVuZCA6IDEpICYNCj4gKwkJCSAgICAgIChvcCA8PSBzaG9ydG9lbmQpKSkgew0KPiAgCQkJLyog Q29weSB0aGUgbGl0ZXJhbHMgKi8NCj4gIAkJCW1lbWNweShvcCwgaXAsIGVuZE9uSW5wdXQgPyAx NiA6IDgpOw0KPiAtCQkJb3AgKz0gbGVuZ3RoOyBpcCArPSBsZW5ndGg7DQo+ICsJCQlvcCArPSBs ZW5ndGg7DQo+ICsJCQlpcCArPSBsZW5ndGg7DQo+ICANCj4gIAkJCS8qDQo+ICAJCQkgKiBUaGUg c2Vjb25kIHN0YWdlOg0KPiAgCQkJICogcHJlcGFyZSBmb3IgbWF0Y2ggY29weWluZywgZGVjb2Rl IGZ1bGwgaW5mby4NCj4gIAkJCSAqIElmIGl0IGRvZXNuJ3Qgd29yayBvdXQsIHRoZSBpbmZvIHdv bid0IGJlIHdhc3RlZC4NCj4gIAkJCSAqLw0KPiAtCQkJbGVuZ3RoID0gdG9rZW4gJiBNTF9NQVNL OyAvKiBtYXRjaCBsZW5ndGggKi8NCj4gKwkJCWxlbmd0aCA9IHRva2VuICYgTUxfTUFTSzsJLyog bWF0Y2ggbGVuZ3RoICovDQo+ICAJCQlvZmZzZXQgPSBMWjRfcmVhZExFMTYoaXApOw0KPiAgCQkJ aXAgKz0gMjsNCj4gIAkJCW1hdGNoID0gb3AgLSBvZmZzZXQ7DQo+IC0JCQlhc3NlcnQobWF0Y2gg PD0gb3ApOyAvKiBjaGVjayBvdmVyZmxvdyAqLw0KPiArCQkJYXNzZXJ0KG1hdGNoIDw9IG9wKTsJ LyogY2hlY2sgb3ZlcmZsb3cgKi8NCj4gIA0KPiAgCQkJLyogRG8gbm90IGRlYWwgd2l0aCBvdmVy bGFwcGluZyBtYXRjaGVzLiAqLw0KPiAgCQkJaWYgKChsZW5ndGggIT0gTUxfTUFTSykgJiYNCj4g QEAgLTE4NywyOCArNDk1LDI0IEBAIHN0YXRpYyBGT1JDRV9JTkxJTkUgaW50IExaNF9kZWNvbXBy ZXNzX2dlbmVyaWMoDQo+ICANCj4gIAkJLyogZGVjb2RlIGxpdGVyYWwgbGVuZ3RoICovDQo+ICAJ CWlmIChsZW5ndGggPT0gUlVOX01BU0spIHsNCj4gLQkJCXVuc2lnbmVkIGludCBzOw0KPiAgDQo+ IC0JCQlpZiAodW5saWtlbHkoZW5kT25JbnB1dCA/IGlwID49IGllbmQgLSBSVU5fTUFTSyA6IDAp KSB7DQo+IC0JCQkJLyogb3ZlcmZsb3cgZGV0ZWN0aW9uICovDQo+ICsJCQl2YXJpYWJsZV9sZW5n dGhfZXJyb3IgZXJyb3IgPSBvazsNCj4gKwkJCWxlbmd0aCArPQ0KPiArCQkJICAgIHJlYWRfdmFy aWFibGVfbGVuZ3RoKCZpcCwgaWVuZCAtIFJVTl9NQVNLLA0KPiArCQkJCQkJIGVuZE9uSW5wdXQs IGVuZE9uSW5wdXQsDQo+ICsJCQkJCQkgJmVycm9yKTsNCj4gKwkJCWlmIChlcnJvciA9PSBpbml0 aWFsX2Vycm9yKQ0KPiAgCQkJCWdvdG8gX291dHB1dF9lcnJvcjsNCj4gLQkJCX0NCj4gLQkJCWRv IHsNCj4gLQkJCQlzID0gKmlwKys7DQo+IC0JCQkJbGVuZ3RoICs9IHM7DQo+IC0JCQl9IHdoaWxl IChsaWtlbHkoZW5kT25JbnB1dA0KPiAtCQkJCT8gaXAgPCBpZW5kIC0gUlVOX01BU0sNCj4gLQkJ CQk6IDEpICYgKHMgPT0gMjU1KSk7DQo+ICANCj4gIAkJCWlmICgoc2FmZURlY29kZSkNCj4gLQkJ CSAgICAmJiB1bmxpa2VseSgodXB0cnZhbCkob3ApICsNCj4gLQkJCQkJbGVuZ3RoIDwgKHVwdHJ2 YWwpKG9wKSkpIHsNCj4gKwkJCSAgICAmJiB1bmxpa2VseSgodXB0cnZhbCkgKG9wKSArDQo+ICsJ CQkJCWxlbmd0aCA8ICh1cHRydmFsKSAob3ApKSkgew0KPiAgCQkJCS8qIG92ZXJmbG93IGRldGVj dGlvbiAqLw0KPiAgCQkJCWdvdG8gX291dHB1dF9lcnJvcjsNCj4gIAkJCX0NCj4gIAkJCWlmICgo c2FmZURlY29kZSkNCj4gLQkJCSAgICAmJiB1bmxpa2VseSgodXB0cnZhbCkoaXApICsNCj4gLQkJ CQkJbGVuZ3RoIDwgKHVwdHJ2YWwpKGlwKSkpIHsNCj4gKwkJCSAgICAmJiB1bmxpa2VseSgodXB0 cnZhbCkgKGlwKSArDQo+ICsJCQkJCWxlbmd0aCA8ICh1cHRydmFsKSAoaXApKSkgew0KPiAgCQkJ CS8qIG92ZXJmbG93IGRldGVjdGlvbiAqLw0KPiAgCQkJCWdvdG8gX291dHB1dF9lcnJvcjsNCj4g IAkJCX0NCj4gQEAgLTIxNiwxMSArNTIwLDE1IEBAIHN0YXRpYyBGT1JDRV9JTkxJTkUgaW50IExa NF9kZWNvbXByZXNzX2dlbmVyaWMoDQo+ICANCj4gIAkJLyogY29weSBsaXRlcmFscyAqLw0KPiAg CQljcHkgPSBvcCArIGxlbmd0aDsNCj4gKyNpZiBMWjRfRkFTVF9ERUNfTE9PUA0KPiArCSAgICAg IHNhZmVfbGl0ZXJhbF9jb3B5Og0KPiArI2VuZGlmDQo+ICAJCUxaNF9TVEFUSUNfQVNTRVJUKE1G TElNSVQgPj0gV0lMRENPUFlMRU5HVEgpOw0KPiAgDQo+ICAJCWlmICgoKGVuZE9uSW5wdXQpICYm ICgoY3B5ID4gb2VuZCAtIE1GTElNSVQpDQo+IC0JCQl8fCAoaXAgKyBsZW5ndGggPiBpZW5kIC0g KDIgKyAxICsgTEFTVExJVEVSQUxTKSkpKQ0KPiAtCQkJfHwgKCghZW5kT25JbnB1dCkgJiYgKGNw eSA+IG9lbmQgLSBXSUxEQ09QWUxFTkdUSCkpKSB7DQo+ICsJCQkJICAgICAgfHwgKGlwICsgbGVu Z3RoID4NCj4gKwkJCQkJICBpZW5kIC0gKDIgKyAxICsgTEFTVExJVEVSQUxTKSkpKQ0KPiArCQkg ICAgfHwgKCghZW5kT25JbnB1dCkgJiYgKGNweSA+IG9lbmQgLSBXSUxEQ09QWUxFTkdUSCkpKSB7 DQo+ICAJCQlpZiAocGFydGlhbERlY29kaW5nKSB7DQo+ICAJCQkJaWYgKGNweSA+IG9lbmQpIHsN Cj4gIAkJCQkJLyoNCj4gQEAgLTIzMSw3ICs1MzksNyBAQCBzdGF0aWMgRk9SQ0VfSU5MSU5FIGlu dCBMWjRfZGVjb21wcmVzc19nZW5lcmljKA0KPiAgCQkJCQlsZW5ndGggPSBvZW5kIC0gb3A7DQo+ ICAJCQkJfQ0KPiAgCQkJCWlmICgoZW5kT25JbnB1dCkNCj4gLQkJCQkJJiYgKGlwICsgbGVuZ3Ro ID4gaWVuZCkpIHsNCj4gKwkJCQkgICAgJiYgKGlwICsgbGVuZ3RoID4gaWVuZCkpIHsNCj4gIAkJ CQkJLyoNCj4gIAkJCQkJICogRXJyb3IgOg0KPiAgCQkJCQkgKiByZWFkIGF0dGVtcHQgYmV5b25k DQo+IEBAIC0yNDEsNyArNTQ5LDcgQEAgc3RhdGljIEZPUkNFX0lOTElORSBpbnQgTFo0X2RlY29t cHJlc3NfZ2VuZXJpYygNCj4gIAkJCQl9DQo+ICAJCQl9IGVsc2Ugew0KPiAgCQkJCWlmICgoIWVu ZE9uSW5wdXQpDQo+IC0JCQkJCSYmIChjcHkgIT0gb2VuZCkpIHsNCj4gKwkJCQkgICAgJiYgKGNw eSAhPSBvZW5kKSkgew0KPiAgCQkJCQkvKg0KPiAgCQkJCQkgKiBFcnJvciA6DQo+ICAJCQkJCSAq IGJsb2NrIGRlY29kaW5nIG11c3QNCj4gQEAgLTI1MCw3ICs1NTgsNyBAQCBzdGF0aWMgRk9SQ0Vf SU5MSU5FIGludCBMWjRfZGVjb21wcmVzc19nZW5lcmljKA0KPiAgCQkJCQlnb3RvIF9vdXRwdXRf ZXJyb3I7DQo+ICAJCQkJfQ0KPiAgCQkJCWlmICgoZW5kT25JbnB1dCkNCj4gLQkJCQkJJiYgKChp cCArIGxlbmd0aCAhPSBpZW5kKQ0KPiArCQkJCSAgICAmJiAoKGlwICsgbGVuZ3RoICE9IGllbmQp DQo+ICAJCQkJCXx8IChjcHkgPiBvZW5kKSkpIHsNCj4gIAkJCQkJLyoNCj4gIAkJCQkJICogRXJy b3IgOg0KPiBAQCAtMjg4LDI5ICs1OTYsMTQgQEAgc3RhdGljIEZPUkNFX0lOTElORSBpbnQgTFo0 X2RlY29tcHJlc3NfZ2VuZXJpYygNCj4gIAkJCWdvdG8gX291dHB1dF9lcnJvcjsNCj4gIAkJfQ0K PiAgDQo+IC0JCS8qIGNvc3RzIH4xJTsgc2lsZW5jZSBhbiBtc2FuIHdhcm5pbmcgd2hlbiBvZmZz ZXQgPT0gMCAqLw0KPiAtCQkvKg0KPiAtCQkgKiBub3RlIDogd2hlbiBwYXJ0aWFsRGVjb2Rpbmcs IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0DQo+IC0JCSAqIGF0IGxlYXN0IDQgYnl0ZXMgcmVt YWluIGF2YWlsYWJsZSBpbiBvdXRwdXQgYnVmZmVyDQo+IC0JCSAqLw0KPiAtCQlpZiAoIXBhcnRp YWxEZWNvZGluZykgew0KPiAtCQkJYXNzZXJ0KG9lbmQgPiBvcCk7DQo+IC0JCQlhc3NlcnQob2Vu ZCAtIG9wID49IDQpOw0KPiAtDQo+IC0JCQlMWjRfd3JpdGUzMihvcCwgKFUzMilvZmZzZXQpOw0K PiAtCQl9DQo+IC0NCj4gIAkJaWYgKGxlbmd0aCA9PSBNTF9NQVNLKSB7DQo+IC0JCQl1bnNpZ25l ZCBpbnQgczsNCj4gLQ0KPiAtCQkJZG8gew0KPiAtCQkJCXMgPSAqaXArKzsNCj4gLQ0KPiAtCQkJ CWlmICgoZW5kT25JbnB1dCkgJiYgKGlwID4gaWVuZCAtIExBU1RMSVRFUkFMUykpDQo+IC0JCQkJ CWdvdG8gX291dHB1dF9lcnJvcjsNCj4gIA0KPiAtCQkJCWxlbmd0aCArPSBzOw0KPiAtCQkJfSB3 aGlsZSAocyA9PSAyNTUpOw0KPiArCQkJdmFyaWFibGVfbGVuZ3RoX2Vycm9yIGVycm9yID0gb2s7 DQo+ICsJCQlsZW5ndGggKz0NCj4gKwkJCSAgICByZWFkX3ZhcmlhYmxlX2xlbmd0aCgmaXAsIGll bmQgLSBMQVNUTElURVJBTFMgKyAxLA0KPiArCQkJCQkJIGVuZE9uSW5wdXQsIDAsICZlcnJvcik7 DQo+ICsJCQlpZiAoZXJyb3IgIT0gb2spDQo+ICsJCQkJZ290byBfb3V0cHV0X2Vycm9yOw0KPiAg DQo+ICAJCQlpZiAoKHNhZmVEZWNvZGUpDQo+ICAJCQkJJiYgdW5saWtlbHkoDQo+IEBAIC0zMjIs NiArNjE1LDEwIEBAIHN0YXRpYyBGT1JDRV9JTkxJTkUgaW50IExaNF9kZWNvbXByZXNzX2dlbmVy aWMoDQo+ICANCj4gIAkJbGVuZ3RoICs9IE1JTk1BVENIOw0KPiAgDQo+ICsjaWYgTFo0X0ZBU1Rf REVDX0xPT1ANCj4gK3NhZmVfbWF0Y2hfY29weToNCj4gKyNlbmRpZg0KPiArDQo+ICAJCS8qIG1h dGNoIHN0YXJ0aW5nIHdpdGhpbiBleHRlcm5hbCBkaWN0aW9uYXJ5ICovDQo+ICAJCWlmICgoZGlj dCA9PSB1c2luZ0V4dERpY3QpICYmIChtYXRjaCA8IGxvd1ByZWZpeCkpIHsNCj4gIAkJCWlmICh1 bmxpa2VseShvcCArIGxlbmd0aCA+IG9lbmQgLSBMQVNUTElURVJBTFMpKSB7DQo+IA0K