Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 985DFC636D7 for ; Thu, 2 Feb 2023 21:13:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232509AbjBBVNV (ORCPT ); Thu, 2 Feb 2023 16:13:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60726 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229881AbjBBVNQ (ORCPT ); Thu, 2 Feb 2023 16:13:16 -0500 Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CB3F1303F2; Thu, 2 Feb 2023 13:13:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1675372368; bh=nefQ5eXpS+lueIM5lgy9AccW170MkQxcHQU5Sb1jvt8=; h=X-UI-Sender-Class:Subject:From:To:Cc:References:Date:In-Reply-To; b=EmjNBQ8ugOWJS4DIcorSominlX5YhEOghT3F3E/pYnaPxl/J/3wZTpjSgDiFShKzx 0AAZ+sAGKNUj2guXUB8DfZcK4I2BA7fDaj3PFBuMNdwUn57FKmYybFVCkCErt8ilKy wJNH9hp1grXXguUc9racapjqWEBEH2x1+RAMJiwH1HogD66DSGdNQdmRolOMZTfaNo Ay+hW9724ghyjgCKP8d0TbcMd5qc1fJ3iofPh/DADM0siEZPM+vO2KpwDsNydzi5Gu GjCtQGVTwUYJvSXDTS82/xdxAvTLjyxRsz1tc+D4z4Nvr6lxK8AT0nLWJ0MFhlmoIo sGkGNj45o7CbQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from [141.30.226.129] ([141.30.226.129]) by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MbAgq-1omRKK1D9k-00bZCR; Thu, 02 Feb 2023 22:12:48 +0100 Subject: Re: [PATCH 5/5] platform/x86: dell-ddv: Add hwmon support From: Armin Wolf To: Guenter Roeck Cc: hdegoede@redhat.com, markgross@kernel.org, jdelvare@suse.com, platform-driver-x86@vger.kernel.org, linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org References: <20230126194021.381092-1-W_Armin@gmx.de> <20230126194021.381092-6-W_Armin@gmx.de> <20230127130815.GA3911997@roeck-us.net> Message-ID: <91099107-73bf-8340-96a2-9a7ff1bfd4ad@gmx.de> Date: Thu, 2 Feb 2023 22:12:47 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: base64 Content-Language: en-US X-Provags-ID: V03:K1:Bc0JlrtscvZAzB58V/pl2OH9ewA/iRi5YdqLbUpv3h8IiB4u3HF ap9idtIxwz9Z36ShuJbiFoi8UqdsLXqcybxBA47+EIHQeaQkdhz/NZ96FOZeOfKfFv09NTT eed7/KY9yOgMR1wzbgK8HhV82bUBaNoxv49y9RDhH76Z9MHvD8j4VujDb4tNrEPjBvfgEf5 R6nJnzeblVNiniqaPrwrA== UI-OutboundReport: notjunk:1;M01:P0:uP2yZmsYbAM=;HXW1XKPYsnwFCJ5IuF7WETEA5tu abmR/7BQYc94Ff956vmKdoMYjd7VYTxR0/QXS2+oTeoh2wpaquWbg2HOsQ+ob7U61H6Lk/+Yl QZwEj6dSbs2aIDVw8MRAZVjtd1/etyxg/7tiyu1uwwPqL7pp7P6fPyHO0zruH+LtNQS71a2L8 W1kRNcth60JnneYy684CcU2ewjGQRMoSnn0usXsQ7Id72l1r4qtxYjEiIYYE6zdVjt2USOIvW sL8YXddHMvBD+kxYNbkcQTluc+ynH2FPyRs+7hx9KnkOi5alUh5XVeAKPLrqKcaZYgRLsKOYd n+foK4gUGlVNzwSnzCAvsUVNDwKfoE5PdPnR5R/htx68dp5RR5hP78qxOby5xlfCqSth6ZDE/ Boj4vcnmi9ylF8sOn1CS1wt0fkKWx6l13EP3SFpU0IivqHNZdkESIbCYLR2dA+Wn5vfloenH+ C23U51QbMFCAv+I47mBd4r54v4HMXfNWJuixAnzI2afBahhdFHT8aZEu3y37BhDbUKzQVtzKf E8Am5+rf7Mv19cXHhw93xF7Dj0R/9jQMU8t0YakPoTMIw9kw+Bx2+2SqKAP2x1UsbzqF1KC2j r/NJTUAkeESf+B0mfpjUbC4gVKB5f5jP4d0UJ77CeGr5FKAHpMtenvZHYfcYHiJfwm6JUquT5 WVj/+Cow820sysoN8vmV7Yv6GB/rC6N+41E1xIvaucLKg6MR3DiYeyAPZJAm8gvJ7kpWKrXxy Jd0lzrxcyD7pFSf8jP0fbRDUe0kI0E/uCpwbx1MRfKd15Boo/wZvaTSxBrMXkw6SdgxUbMxIo xnwhXoLMqWx3ECxhTVzIIOFnBzxctS/tIP2Fw9DX4JJGjnCPQFK7eIJUVvm8cMWdCJX/jQlos XbN0SgkP8QRS1HT9Y2fmGTY0r+5UMcP9aslQUYb/aBVWGZE4SKPE87Ljfumr0GnEP6BhPRgyO Hf4KqGCQJM7HIaD64wxc9O7KL6c= Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org QW0gMjcuMDEuMjMgdW0gMTc6MDkgc2NocmllYiBBcm1pbiBXb2xmOg0KDQo+IEFtIDI3LjAxLjIz IHVtIDE0OjA4IHNjaHJpZWIgR3VlbnRlciBSb2VjazoNCj4NCj4+IE9uIFRodSwgSmFuIDI2LCAy MDIzIGF0IDA4OjQwOjIxUE0gKzAxMDAsIEFybWluIFdvbGYgd3JvdGU6DQo+Pj4gVGhhbmtzIHRv IGJ1Z3JlcG9ydCAyMTY2NTUgb24gYnVnemlsbGEgdHJpZ2dlcmVkIGJ5IHRoZQ0KPj4+IGRlbGwt c21tLWh3bW9uIGRyaXZlciwgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZW5zb3IgYnVmZmVycw0KPj4+ IGNvdWxkIGJlIGFsbW9zdCBjb21wbGV0ZWx5IGRlY29kZWQuDQo+Pj4gQWRkIGFuIGh3bW9uIGlu dGVyZmFjZSBmb3IgZXhwb3NpbmcgdGhlIGZhbiBhbmQgdGhlcm1hbA0KPj4+IHNlbnNvciB2YWx1 ZXMuIFRoZSBkZWJ1Z2ZzIGludGVyZmFjZSByZW1haW5zIGluIHBsYWNlIHRvDQo+Pj4gYWlkIGlu IHJldmVyc2UtZW5naW5lZXJpbmcgb2YgdW5rbm93biBzZW5zb3IgdHlwZXMNCj4+PiBhbmQgdGhl IHRoZXJtYWwgYnVmZmVyLg0KPj4+DQo+Pj4gVGVzdGVkLWJ5OiBBbnRvbsOtbiBTa2FsYSA8c2th bGEuYW50b25pbkBnbWFpbC5jb20+DQo+Pj4gVGVzdGVkLWJ5OiBHdXN0YXZvIFdhbGJvbiA8Z3Vz dGF2b3dhbGJvbkBnbWFpbC5jb20+DQo+Pj4gU2lnbmVkLW9mZi1ieTogQXJtaW4gV29sZiA8V19B cm1pbkBnbXguZGU+DQo+Pj4gLS0tDQo+Pj4gwqAgZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC9L Y29uZmlnwqDCoMKgwqDCoMKgwqAgfMKgwqAgMSArDQo+Pj4gwqAgZHJpdmVycy9wbGF0Zm9ybS94 ODYvZGVsbC9kZWxsLXdtaS1kZHYuYyB8IDQzNSANCj4+PiArKysrKysrKysrKysrKysrKysrKysr LQ0KPj4+IMKgIDIgZmlsZXMgY2hhbmdlZCwgNDM1IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24o LSkNCj4+Pg0KPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9kZWxsL0tjb25m aWcgDQo+Pj4gYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9kZWxsL0tjb25maWcNCj4+PiBpbmRleCBk MzE5ZGU4ZjIxMzIuLjIxYTc0YjYzZDliMSAxMDA2NDQNCj4+PiAtLS0gYS9kcml2ZXJzL3BsYXRm b3JtL3g4Ni9kZWxsL0tjb25maWcNCj4+PiArKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9kZWxs L0tjb25maWcNCj4+PiBAQCAtMTk0LDYgKzE5NCw3IEBAIGNvbmZpZyBERUxMX1dNSV9ERFYNCj4+ PiDCoMKgwqDCoMKgIGRlZmF1bHQgbQ0KPj4+IMKgwqDCoMKgwqAgZGVwZW5kcyBvbiBBQ1BJX0JB VFRFUlkNCj4+PiDCoMKgwqDCoMKgIGRlcGVuZHMgb24gQUNQSV9XTUkNCj4+PiArwqDCoMKgIGRl cGVuZHMgb24gSFdNT04NCj4+IE5vdCBzdXJlIGlmIGFkZGluZyBzdWNoIGEgZGVwZW5kZW5jeSBp cyBhIGdvb2QgaWRlYS4NCj4+IFVwIHRvIHRoZSBtYWludGFpbmVyIHRvIGRlY2lkZS4gUGVyc29u YWxseSBJIHdvdWxkIHByZWZlcg0KPj4gc29tZXRoaW5nIGxpa2UNCj4+IMKgwqDCoMKgZGVwZW5k cyBvbiBIV01PTiB8fCBIV01PTj1uDQo+PiBhbmQgc29tZSBjb25kaXRpb25hbHMgaW4gdGhlIGNv ZGUsIGFzIGl0IGlzIGRvbmUgd2l0aCBvdGhlciBkcml2ZXJzDQo+PiBvdXRzaWRlIHRoZSBod21v biBkaXJlY3RvcnkuDQo+Pg0KPiBHb29kIHBvaW50LCBpIHdpbGwgaW5jbHVkZSB0aGlzIGluIHRo ZSBuZXh0IHBhdGNoIHJldmlzaW9uLg0KPg0KPj4+IMKgwqDCoMKgwqAgaGVscA0KPj4+IMKgwqDC oMKgwqDCoMKgIFRoaXMgb3B0aW9uIGFkZHMgc3VwcG9ydCBmb3IgV01JLWJhc2VkIHNlbnNvcnMg bGlrZQ0KPj4+IMKgwqDCoMKgwqDCoMKgIGJhdHRlcnkgdGVtcGVyYXR1cmUgc2Vuc29ycyBmb3Vu ZCBvbiBzb21lIERlbGwgbm90ZWJvb2tzLg0KPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRm b3JtL3g4Ni9kZWxsL2RlbGwtd21pLWRkdi5jIA0KPj4+IGIvZHJpdmVycy9wbGF0Zm9ybS94ODYv ZGVsbC9kZWxsLXdtaS1kZHYuYw0KPj4+IGluZGV4IDk2OTViZjQ5M2VhNi4uNWIzMGJiODUxOTll IDEwMDY0NA0KPj4+IC0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2RlbGwvZGVsbC13bWktZGR2 LmMNCj4+PiArKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9kZWxsL2RlbGwtd21pLWRkdi5jDQo+ Pj4gQEAgLTEzLDYgKzEzLDcgQEANCj4+PiDCoCAjaW5jbHVkZSA8bGludXgvZGV2X3ByaW50ay5o Pg0KPj4+IMKgICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPg0KPj4+IMKgICNpbmNsdWRlIDxsaW51 eC9rZXJuZWwuaD4NCj4+PiArI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+DQo+Pj4gwqAgI2luY2x1 ZGUgPGxpbnV4L2tzdHJ0b3guaD4NCj4+PiDCoCAjaW5jbHVkZSA8bGludXgvbWF0aC5oPg0KPj4+ IMKgICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4NCj4+PiBAQCAtMjEsMTAgKzIyLDEzIEBADQo+ Pj4gwqAgI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPg0KPj4+IMKgICNpbmNsdWRlIDxsaW51eC9z ZXFfZmlsZS5oPg0KPj4+IMKgICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPg0KPj4+ICsjaW5jbHVk ZSA8bGludXgvdHlwZXMuaD4NCj4+PiDCoCAjaW5jbHVkZSA8bGludXgvd21pLmg+DQo+Pj4NCj4+ PiDCoCAjaW5jbHVkZSA8YWNwaS9iYXR0ZXJ5Lmg+DQo+Pj4NCj4+PiArI2luY2x1ZGUgPGFzbS91 bmFsaWduZWQuaD4NCj4+PiArDQo+Pj4gwqAgI2RlZmluZSBEUklWRVJfTkFNRcKgwqDCoCAiZGVs bC13bWktZGR2Ig0KPj4+DQo+Pj4gwqAgI2RlZmluZSBERUxMX0REVl9TVVBQT1JURURfVkVSU0lP Tl9NSU7CoMKgwqAgMg0KPj4+IEBAIC02Myw2ICs2NywyOSBAQCBlbnVtIGRlbGxfZGR2X21ldGhv ZCB7DQo+Pj4gwqDCoMKgwqDCoCBERUxMX0REVl9USEVSTUFMX1NFTlNPUl9JTkZPUk1BVElPTsKg wqDCoCA9IDB4MjIsDQo+Pj4gwqAgfTsNCj4+Pg0KPj4+ICtzdHJ1Y3QgZmFuX3NlbnNvcl9lbnRy eSB7DQo+Pj4gK8KgwqDCoCB1OCB0eXBlOw0KPj4+ICvCoMKgwqAgX19sZTE2IHJwbTsNCj4+PiAr fSBfX3BhY2tlZDsNCj4+PiArDQo+Pj4gK3N0cnVjdCB0aGVybWFsX3NlbnNvcl9lbnRyeSB7DQo+ Pj4gK8KgwqDCoCB1OCB0eXBlOw0KPj4+ICvCoMKgwqAgczggbm93Ow0KPj4+ICvCoMKgwqAgczgg bWluOw0KPj4+ICvCoMKgwqAgczggbWF4Ow0KPj4+ICvCoMKgwqAgdTggdW5rbm93bjsNCj4+PiAr fSBfX3BhY2tlZDsNCj4+PiArDQo+Pj4gK3N0cnVjdCBjb21iaW5lZF9jaGFubmVsX2luZm8gew0K Pj4+ICvCoMKgwqAgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyBpbmZvOw0KPj4+ICvCoMKgwqAg dTMyIGNvbmZpZ1tdOw0KPj4+ICt9Ow0KPj4+ICsNCj4+PiArc3RydWN0IGNvbWJpbmVkX2NoaXBf aW5mbyB7DQo+Pj4gK8KgwqDCoCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvIGNoaXA7DQo+Pj4gK8Kg wqDCoCBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICppbmZvW107DQo+Pj4gK307DQo+ Pj4gKw0KPj4+IMKgIHN0cnVjdCBkZWxsX3dtaV9kZHZfZGF0YSB7DQo+Pj4gwqDCoMKgwqDCoCBz dHJ1Y3QgYWNwaV9iYXR0ZXJ5X2hvb2sgaG9vazsNCj4+PiDCoMKgwqDCoMKgIHN0cnVjdCBkZXZp Y2VfYXR0cmlidXRlIHRlbXBfYXR0cjsNCj4+PiBAQCAtNzAsNiArOTcsMjQgQEAgc3RydWN0IGRl bGxfd21pX2Rkdl9kYXRhIHsNCj4+PiDCoMKgwqDCoMKgIHN0cnVjdCB3bWlfZGV2aWNlICp3ZGV2 Ow0KPj4+IMKgIH07DQo+Pj4NCj4+PiArc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmYW5fbGFi ZWxzW10gPSB7DQo+Pj4gK8KgwqDCoCAiQ1BVIEZhbiIsDQo+Pj4gK8KgwqDCoCAiQ2hhc3NpcyBN b3RoZXJib2FyZCBGYW4iLA0KPj4+ICvCoMKgwqAgIlZpZGVvIEZhbiIsDQo+Pj4gK8KgwqDCoCAi UG93ZXIgU3VwcGx5IEZhbiIsDQo+Pj4gK8KgwqDCoCAiQ2hpcHNldCBGYW4iLA0KPj4+ICvCoMKg wqAgIk1lbW9yeSBGYW4iLA0KPj4+ICvCoMKgwqAgIlBDSSBGYW4iLA0KPj4+ICvCoMKgwqAgIkhE RCBGYW4iLA0KPj4+ICt9Ow0KPj4+ICsNCj4+PiArc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBm YW5fZG9ja19sYWJlbHNbXSA9IHsNCj4+PiArwqDCoMKgICJEb2NraW5nIENoYXNzaXMvTW90aGVy Ym9hcmQgRmFuIiwNCj4+PiArwqDCoMKgICJEb2NraW5nIFZpZGVvIEZhbiIsDQo+Pj4gK8KgwqDC oCAiRG9ja2luZyBQb3dlciBTdXBwbHkgRmFuIiwNCj4+PiArwqDCoMKgICJEb2NraW5nIENoaXBz ZXQgRmFuIiwNCj4+PiArfTsNCj4+PiArDQo+Pj4gwqAgc3RhdGljIGludCBkZWxsX3dtaV9kZHZf cXVlcnlfdHlwZShzdHJ1Y3Qgd21pX2RldmljZSAqd2RldiwgZW51bSANCj4+PiBkZWxsX2Rkdl9t ZXRob2QgbWV0aG9kLCB1MzIgYXJnLA0KPj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgdW5pb24gYWNwaV9vYmplY3QgKipyZXN1bHQsIGFjcGlfb2JqZWN0X3R5cGUg dHlwZSkNCj4+PiDCoCB7DQo+Pj4gQEAgLTE3MSw2ICsyMTYsMzg2IEBAIHN0YXRpYyBpbnQgZGVs bF93bWlfZGR2X3F1ZXJ5X3N0cmluZyhzdHJ1Y3QgDQo+Pj4gd21pX2RldmljZSAqd2RldiwgZW51 bSBkZWxsX2Rkdl9tZXRoDQo+Pj4gwqDCoMKgwqDCoCByZXR1cm4gZGVsbF93bWlfZGR2X3F1ZXJ5 X3R5cGUod2RldiwgbWV0aG9kLCBhcmcsIHJlc3VsdCwgDQo+Pj4gQUNQSV9UWVBFX1NUUklORyk7 DQo+Pj4gwqAgfQ0KPj4+DQo+Pj4gK3N0YXRpYyBpbnQgZGVsbF93bWlfZGR2X3F1ZXJ5X3NlbnNv cnMoc3RydWN0IHdtaV9kZXZpY2UgKndkZXYsIGVudW0gDQo+Pj4gZGVsbF9kZHZfbWV0aG9kIG1l dGhvZCwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNp emVfdCBlbnRyeV9zaXplLCB1bmlvbiBhY3BpX29iamVjdCANCj4+PiAqKnJlc3VsdCwgdTY0ICpj b3VudCkNCj4+PiArew0KPj4+ICvCoMKgwqAgdW5pb24gYWNwaV9vYmplY3QgKm9iajsNCj4+PiAr wqDCoMKgIHU2NCBidWZmZXJfc2l6ZTsNCj4+PiArwqDCoMKgIHU4ICpidWZmZXI7DQo+Pj4gK8Kg wqDCoCBpbnQgcmV0Ow0KPj4+ICsNCj4+PiArwqDCoMKgIHJldCA9IGRlbGxfd21pX2Rkdl9xdWVy eV9idWZmZXIod2RldiwgbWV0aG9kLCAwLCAmb2JqKTsNCj4+PiArwqDCoMKgIGlmIChyZXQgPCAw KQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Ow0KPj4+ICsNCj4+PiArwqDCoMKgIGJ1 ZmZlcl9zaXplID0gb2JqLT5wYWNrYWdlLmVsZW1lbnRzWzBdLmludGVnZXIudmFsdWU7DQo+Pj4g K8KgwqDCoCBidWZmZXIgPSBvYmotPnBhY2thZ2UuZWxlbWVudHNbMV0uYnVmZmVyLnBvaW50ZXI7 DQo+Pj4gK8KgwqDCoCBpZiAoYnVmZmVyX3NpemUgJSBlbnRyeV9zaXplICE9IDEgfHwgYnVmZmVy W2J1ZmZlcl9zaXplIC0gMV0gIT0gDQo+Pj4gMHhmZikgew0KPj4+ICvCoMKgwqDCoMKgwqDCoCBr ZnJlZShvYmopOw0KPj4+ICsNCj4+IFN0cmF5IGVtcHR5IGxpbmUNCj4+DQo+Pj4gK8KgwqDCoMKg wqDCoMKgIHJldHVybiAtRU5PTVNHOw0KPj4+ICvCoMKgwqAgfQ0KPj4+ICsNCj4+PiArwqDCoMKg ICpjb3VudCA9IChidWZmZXJfc2l6ZSAtIDEpIC8gZW50cnlfc2l6ZTsNCj4+PiArwqDCoMKgICpy ZXN1bHQgPSBvYmo7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcmV0dXJuIDA7DQo+Pj4gK30NCj4+PiAr DQo+Pj4gK3N0YXRpYyB1bW9kZV90IGRlbGxfd21pX2Rkdl9pc192aXNpYmxlKGNvbnN0IHZvaWQg KmRydmRhdGEsIGVudW0gDQo+Pj4gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsIHUzMiBhdHRyLA0K Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbnQgY2hh bm5lbCkNCj4+PiArew0KPj4+ICvCoMKgwqAgcmV0dXJuIDA0NDQ7DQo+Pj4gK30NCj4+PiArDQo+ Pj4gK3N0YXRpYyBpbnQgZGVsbF93bWlfZGR2X2Zhbl9yZWFkX2NoYW5uZWwoc3RydWN0IGRlbGxf d21pX2Rkdl9kYXRhIA0KPj4+ICpkYXRhLCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsDQo+Pj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbG9uZyAqdmFsKQ0KPj4+ICt7 DQo+Pj4gK8KgwqDCoCBzdHJ1Y3QgZmFuX3NlbnNvcl9lbnRyeSAqZW50cnk7DQo+Pj4gK8KgwqDC oCB1bmlvbiBhY3BpX29iamVjdCAqb2JqOw0KPj4+ICvCoMKgwqAgdTY0IGNvdW50Ow0KPj4+ICvC oMKgwqAgaW50IHJldDsNCj4+PiArDQo+Pj4gK8KgwqDCoCByZXQgPSBkZWxsX3dtaV9kZHZfcXVl cnlfc2Vuc29ycyhkYXRhLT53ZGV2LCANCj4+PiBERUxMX0REVl9GQU5fU0VOU09SX0lORk9STUFU SU9OLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNpemVv ZigqZW50cnkpLCAmb2JqLCAmY291bnQpOw0KPj4+ICvCoMKgwqAgaWYgKHJldCA8IDApDQo+Pj4g K8KgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgZW50cnkgPSAo c3RydWN0IGZhbl9zZW5zb3JfZW50cnkgDQo+Pj4gKilvYmotPnBhY2thZ2UuZWxlbWVudHNbMV0u YnVmZmVyLnBvaW50ZXI7DQo+Pj4gK8KgwqDCoCBpZiAoY291bnQgPiBjaGFubmVsKSB7DQo+Pj4g K8KgwqDCoMKgwqDCoMKgIHN3aXRjaCAoYXR0cikgew0KPj4+ICvCoMKgwqDCoMKgwqDCoCBjYXNl IGh3bW9uX2Zhbl9pbnB1dDoNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqdmFsID0gZ2V0 X3VuYWxpZ25lZF9sZTE2KCZlbnRyeVtjaGFubmVsXS5ycG0pOw0KPj4+ICsNCj4+IEFub3RoZXIg c3RyYXkgZW1wdHkgbGluZS4gSSBzZWUgdGhhdCAiZW1wdHkgbGluZSBiZWZvcmUgcmV0dXJuIG9y IGJyZWFrIg0KPj4gaXMgY29tbW9uLiBMb29rcyBvZGQgdG8gbWUsIGFuZCBJIGRvbid0IHNlZSB0 aGUgcG9pbnQgKGl0IGNvbmZ1c2VzDQo+PiB0aGUgY29kZSBmbG93IGZvciBtZSBhbmQgbGV0cyBt eSBicmFpbiBmb2N1cyBvbiB0aGUgZW1wdHkgbGluZSBpbnN0ZWFkDQo+PiBvZiB0aGUgY29kZSBp biBxdWVzdGlvbiksIGJ1dCBJIGd1ZXNzIHRoYXQgaXMgUG9WLiBJIHdvbid0IGNvbW1lbnQgb24N Cj4+IGl0IGZ1cnRoZXIgYW5kIGxldCB0aGUgbWFpbnRhaW5lciBkZWNpZGUuDQo+Pg0KPj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOw0KPj4+ICvCoMKgwqDCoMKgwqDCoCBkZWZhdWx0 Og0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCA9IC1FT1BOT1RTVVBQOw0KPj4+ICvC oMKgwqDCoMKgwqDCoCB9DQo+Pj4gK8KgwqDCoCB9IGVsc2Ugew0KPj4+ICvCoMKgwqDCoMKgwqDC oCByZXQgPSAtRU5YSU87DQo+Pj4gK8KgwqDCoCB9DQo+PiBFcnJvciBoYW5kbGluZyBzaG91bGQg Y29tZSBmaXJzdC4NCj4+PiArDQo+Pj4gK8KgwqDCoCBrZnJlZShvYmopOw0KPj4+ICsNCj4+PiAr wqDCoMKgIHJldHVybiByZXQ7DQo+Pj4gK30NCj4+PiArDQo+Pj4gK3N0YXRpYyBpbnQgZGVsbF93 bWlfZGR2X3RlbXBfcmVhZF9jaGFubmVsKHN0cnVjdCBkZWxsX3dtaV9kZHZfZGF0YSANCj4+PiAq ZGF0YSwgdTMyIGF0dHIsIGludCBjaGFubmVsLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgbG9uZyAqdmFsKQ0KPj4+ICt7DQo+Pj4gK8KgwqDCoCBzdHJ1 Y3QgdGhlcm1hbF9zZW5zb3JfZW50cnkgKmVudHJ5Ow0KPj4+ICvCoMKgwqAgdW5pb24gYWNwaV9v YmplY3QgKm9iajsNCj4+PiArwqDCoMKgIHU2NCBjb3VudDsNCj4+PiArwqDCoMKgIGludCByZXQ7 DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcmV0ID0gZGVsbF93bWlfZGR2X3F1ZXJ5X3NlbnNvcnMoZGF0 YS0+d2RldiwgDQo+Pj4gREVMTF9ERFZfVEhFUk1BTF9TRU5TT1JfSU5GT1JNQVRJT04sDQo+Pj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2l6ZW9mKCplbnRyeSks ICZvYmosICZjb3VudCk7DQo+Pj4gK8KgwqDCoCBpZiAocmV0IDwgMCkNCj4+PiArwqDCoMKgwqDC oMKgwqAgcmV0dXJuIHJldDsNCj4+PiArDQo+Pj4gK8KgwqDCoCBlbnRyeSA9IChzdHJ1Y3QgdGhl cm1hbF9zZW5zb3JfZW50cnkgDQo+Pj4gKilvYmotPnBhY2thZ2UuZWxlbWVudHNbMV0uYnVmZmVy LnBvaW50ZXI7DQo+Pj4gK8KgwqDCoCBpZiAoY291bnQgPiBjaGFubmVsKSB7DQo+PiBUaGlzIGlz IGEgYml0IG9mIEpvZGEgcHJvZ3JhbW1pbmcuIEl0IGlzIHJlYWxseSAiY2hhbm5lbCA8IGNvdW50 IiwNCj4+IGllIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbCBudW1iZXIgaXMgaW4gdGhlIHJhbmdlIG9m IGNoYW5uZWxzIHJlcG9ydGVkDQo+PiBieSB0aGUgV01JIGNvZGUuIFBvViwgb2YgY291cnNlLCBi dXQgSSBmaW5kIHRoYXQgdGhlIGFib3ZlIG1ha2VzIHRoZQ0KPj4gY29kZSBtb3JlIGRpZmZpY3Vs dCB0byByZWFkLg0KPj4+ICvCoMKgwqDCoMKgwqDCoCBzd2l0Y2ggKGF0dHIpIHsNCj4+PiArwqDC oMKgwqDCoMKgwqAgY2FzZSBod21vbl90ZW1wX2lucHV0Og0KPj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICp2YWwgPSBlbnRyeVtjaGFubmVsXS5ub3cgKiAxMDAwOw0KPj4+ICsNCj4+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsNCj4+PiArwqDCoMKgwqDCoMKgwqAgY2FzZSBod21v bl90ZW1wX21pbjoNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqdmFsID0gZW50cnlbY2hh bm5lbF0ubWluICogMTAwMDsNCj4+PiArDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJl YWs7DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGNhc2UgaHdtb25fdGVtcF9tYXg6DQo+Pj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgKnZhbCA9IGVudHJ5W2NoYW5uZWxdLm1heCAqIDEwMDA7DQo+Pj4g Kw0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOw0KPj4+ICvCoMKgwqDCoMKgwqDC oCBkZWZhdWx0Og0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCA9IC1FT1BOT1RTVVBQ Ow0KPj4gYnJlYWs7IG1pc3NpbmcNCj4+DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIH0NCj4+PiArwqDC oMKgIH0gZWxzZSB7DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9IC1FTlhJTzsNCj4+PiArwqDC oMKgIH0NCj4+IFNhbWUgYXMgYWJvdmUgLSBlcnJvciBoYW5kbGluZyBzaG91bGQgY29tZSBmaXJz dC4NCj4+DQo+Pj4gKw0KPj4+ICvCoMKgwqAga2ZyZWUob2JqKTsNCj4+PiArDQo+Pj4gK8KgwqDC oCByZXR1cm4gcmV0Ow0KPj4+ICt9DQo+Pj4gKw0KPj4+ICtzdGF0aWMgaW50IGRlbGxfd21pX2Rk dl9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSANCj4+PiBod21vbl9zZW5zb3JfdHlwZXMg dHlwZSwgdTMyIGF0dHIsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlu dCBjaGFubmVsLCBsb25nICp2YWwpDQo+Pj4gK3sNCj4+PiArwqDCoMKgIHN0cnVjdCBkZWxsX3dt aV9kZHZfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOw0KPj4+ICsNCj4+PiArwqDC oMKgIHN3aXRjaCAodHlwZSkgew0KPj4+ICvCoMKgwqAgY2FzZSBod21vbl9mYW46DQo+Pj4gK8Kg wqDCoMKgwqDCoMKgIHJldHVybiBkZWxsX3dtaV9kZHZfZmFuX3JlYWRfY2hhbm5lbChkYXRhLCBh dHRyLCBjaGFubmVsLCANCj4+PiB2YWwpOw0KPj4+ICvCoMKgwqAgY2FzZSBod21vbl90ZW1wOg0K Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gZGVsbF93bWlfZGR2X3RlbXBfcmVhZF9jaGFubmVs KGRhdGEsIGF0dHIsIGNoYW5uZWwsIA0KPj4+IHZhbCk7DQo+Pj4gK8KgwqDCoCBkZWZhdWx0Og0K Pj4+ICvCoMKgwqDCoMKgwqDCoCBicmVhazsNCj4+PiArwqDCoMKgIH0NCj4+PiArDQo+Pj4gK8Kg wqDCoCByZXR1cm4gLUVPUE5PVFNVUFA7DQo+Pj4gK30NCj4+PiArDQo+Pj4gK3N0YXRpYyBpbnQg ZGVsbF93bWlfZGR2X2Zhbl9yZWFkX3N0cmluZyhzdHJ1Y3QgZGVsbF93bWlfZGR2X2RhdGEgDQo+ Pj4gKmRhdGEsIGludCBjaGFubmVsLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBjb25zdCBjaGFyICoqc3RyKQ0KPj4+ICt7DQo+Pj4gK8KgwqDCoCBzdHJ1Y3Qg ZmFuX3NlbnNvcl9lbnRyeSAqZW50cnk7DQo+Pj4gK8KgwqDCoCB1bmlvbiBhY3BpX29iamVjdCAq b2JqOw0KPj4+ICvCoMKgwqAgdTY0IGNvdW50Ow0KPj4+ICvCoMKgwqAgdTggdHlwZTsNCj4+PiAr wqDCoMKgIGludCByZXQ7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcmV0ID0gZGVsbF93bWlfZGR2X3F1 ZXJ5X3NlbnNvcnMoZGF0YS0+d2RldiwgDQo+Pj4gREVMTF9ERFZfRkFOX1NFTlNPUl9JTkZPUk1B VElPTiwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXpl b2YoKmVudHJ5KSwgJm9iaiwgJmNvdW50KTsNCj4+PiArwqDCoMKgIGlmIChyZXQgPCAwKQ0KPj4+ ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Ow0KPj4+ICsNCj4+PiArwqDCoMKgIGVudHJ5ID0g KHN0cnVjdCBmYW5fc2Vuc29yX2VudHJ5IA0KPj4+ICopb2JqLT5wYWNrYWdlLmVsZW1lbnRzWzFd LmJ1ZmZlci5wb2ludGVyOw0KPj4+ICvCoMKgwqAgaWYgKGNvdW50ID4gY2hhbm5lbCkgew0KPj4+ ICvCoMKgwqDCoMKgwqDCoCB0eXBlID0gZW50cnlbY2hhbm5lbF0udHlwZTsNCj4+PiArDQo+Pj4g K8KgwqDCoMKgwqDCoMKgIHN3aXRjaCAodHlwZSkgew0KPj4+ICvCoMKgwqDCoMKgwqDCoCBjYXNl IDB4MDAgLi4uIDB4MDc6DQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKnN0ciA9IGZhbl9s YWJlbHNbdHlwZV07DQo+Pj4gKw0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOw0K Pj4+ICvCoMKgwqDCoMKgwqDCoCBjYXNlIDB4MTEgLi4uIDB4MTQ6DQo+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgKnN0ciA9IGZhbl9kb2NrX2xhYmVsc1t0eXBlIC0gMHgxMV07DQo+Pj4gKw0K Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOw0KPj4+ICvCoMKgwqDCoMKgwqDCoCBk ZWZhdWx0Og0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICpzdHIgPSAiVW5rbm93biBGYW4i Ow0KPj4gYnJlYWs7IG1pc3NpbmcuDQo+Pg0KPj4+ICvCoMKgwqDCoMKgwqDCoCB9DQo+Pj4gK8Kg wqDCoCB9IGVsc2Ugew0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXQgPSAtRU5YSU87DQo+Pj4gK8Kg wqDCoCB9DQo+PiBBbmQgYWdhaW4uDQo+Pg0KPj4+ICsNCj4+PiArwqDCoMKgIGtmcmVlKG9iaik7 DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcmV0dXJuIHJldDsNCj4+PiArfQ0KPj4+ICsNCj4+PiArc3Rh dGljIGludCBkZWxsX3dtaV9kZHZfdGVtcF9yZWFkX3N0cmluZyhzdHJ1Y3QgZGVsbF93bWlfZGR2 X2RhdGEgDQo+Pj4gKmRhdGEsIGludCBjaGFubmVsLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IGNoYXIgKipzdHIpDQo+Pj4gK3sNCj4+PiArwqDC oMKgIHN0cnVjdCB0aGVybWFsX3NlbnNvcl9lbnRyeSAqZW50cnk7DQo+Pj4gK8KgwqDCoCB1bmlv biBhY3BpX29iamVjdCAqb2JqOw0KPj4+ICvCoMKgwqAgdTY0IGNvdW50Ow0KPj4+ICvCoMKgwqAg aW50IHJldDsNCj4+PiArDQo+Pj4gK8KgwqDCoCByZXQgPSBkZWxsX3dtaV9kZHZfcXVlcnlfc2Vu c29ycyhkYXRhLT53ZGV2LCANCj4+PiBERUxMX0REVl9USEVSTUFMX1NFTlNPUl9JTkZPUk1BVElP TiwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXplb2Yo KmVudHJ5KSwgJm9iaiwgJmNvdW50KTsNCj4+PiArwqDCoMKgIGlmIChyZXQgPCAwKQ0KPj4+ICvC oMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Ow0KPj4+ICsNCj4+PiArwqDCoMKgIGVudHJ5ID0gKHN0 cnVjdCB0aGVybWFsX3NlbnNvcl9lbnRyeSANCj4+PiAqKW9iai0+cGFja2FnZS5lbGVtZW50c1sx XS5idWZmZXIucG9pbnRlcjsNCj4+PiArwqDCoMKgIGlmIChjb3VudCA+IGNoYW5uZWwpIHsNCj4+ PiArwqDCoMKgwqDCoMKgwqAgc3dpdGNoIChlbnRyeVtjaGFubmVsXS50eXBlKSB7DQo+Pj4gK8Kg wqDCoMKgwqDCoMKgIGNhc2UgMHgwMDoNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqc3Ry ID0gIkNQVSI7DQo+Pj4gKw0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOw0KPj4+ ICvCoMKgwqDCoMKgwqDCoCBjYXNlIDB4MTE6DQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg KnN0ciA9ICJWaWRlbyI7DQo+Pj4gKw0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFr Ow0KPj4+ICvCoMKgwqDCoMKgwqDCoCBjYXNlIDB4MjI6DQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgKnN0ciA9ICJNZW1vcnkiOyAvLyBzb21ldGltZXMgY2FsbGVkIERJTU0NCj4+IFBlcnNv bmFsbHkgSSBkb24ndCBwZXJtaXQgQysrIHN0eWxlIGNvbW1lbnRzIGluIGEgaHdtb24gZHJpdmVy DQo+PiB1bmxlc3MgX2FsbF8gY29tbWVudHMgYXJlIEMrKyBzdHlsZS4gSnVzdCBhIHJlbWFyayBo ZXJlLg0KPj4NCj4+PiArDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7DQo+Pj4g K8KgwqDCoMKgwqDCoMKgIGNhc2UgMHgzMzoNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAq c3RyID0gIk90aGVyIjsNCj4+PiArDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7 DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGNhc2UgMHg0NDoNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAqc3RyID0gIkFtYmllbnQiOyAvLyBzb21ldGltZXMgY2FsbGVkIFNLSU4NCj4+PiArDQo+ Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGNh c2UgMHg1MjoNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqc3RyID0gIlNPRElNTSI7DQo+ Pj4gKw0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOw0KPj4+ICvCoMKgwqDCoMKg wqDCoCBjYXNlIDB4NTU6DQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKnN0ciA9ICJIREQi Ow0KPj4+ICsNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsNCj4+PiArwqDCoMKg wqDCoMKgwqAgY2FzZSAweDYyOg0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICpzdHIgPSAi U09ESU1NIDIiOw0KPj4+ICsNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsNCj4+ PiArwqDCoMKgwqDCoMKgwqAgY2FzZSAweDczOg0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ICpzdHIgPSAiTkIiOw0KPj4+ICsNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsN Cj4+PiArwqDCoMKgwqDCoMKgwqAgY2FzZSAweDgzOg0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICpzdHIgPSAiQ2hhcmdlciI7DQo+Pj4gKw0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGJyZWFrOw0KPj4+ICvCoMKgwqDCoMKgwqDCoCBjYXNlIDB4YmI6DQo+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgKnN0ciA9ICJNZW1vcnkgMyI7DQo+Pj4gKw0KPj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGJyZWFrOw0KPj4+ICvCoMKgwqDCoMKgwqDCoCBkZWZhdWx0Og0KPj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgICpzdHIgPSAiVW5rbm93biI7DQo+PiBicmVhazsgbWlzc2luZw0K Pj4gT2ssIEkgZ3Vlc3MgdGhpcyBpcyBvbiBwdXJwb3NlLiBJIHBlcnNvbmFsbHkgZG9uJ3QgcGVy bWl0DQo+PiB0aGF0IHNpbmNlIGl0IGFsd2F5cyBsZWF2ZXMgdGhlIHF1ZXN0aW9uIGlmIGl0IHdh cyBvbiBwdXJwb3NlIG9yIG5vdC4NCj4+DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIH0NCj4+PiArwqDC oMKgIH0gZWxzZSB7DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9IC1FTlhJTzsNCj4+PiArwqDC oMKgIH0NCj4+PiArDQo+Pj4gK8KgwqDCoCBrZnJlZShvYmopOw0KPj4+ICsNCj4+PiArwqDCoMKg IHJldHVybiByZXQ7DQo+Pj4gK30NCj4+PiArDQo+Pj4gK3N0YXRpYyBpbnQgZGVsbF93bWlfZGR2 X3JlYWRfc3RyaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSANCj4+PiBod21vbl9zZW5zb3Jf dHlwZXMgdHlwZSwgdTMyIGF0dHIsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGludCBjaGFubmVsLCBjb25zdCBjaGFyICoqc3RyKQ0KPj4+ICt7DQo+Pj4gK8Kg wqDCoCBzdHJ1Y3QgZGVsbF93bWlfZGR2X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2 KTsNCj4+PiArDQo+Pj4gK8KgwqDCoCBzd2l0Y2ggKHR5cGUpIHsNCj4+PiArwqDCoMKgIGNhc2Ug aHdtb25fZmFuOg0KPj4+ICvCoMKgwqDCoMKgwqDCoCBzd2l0Y2ggKGF0dHIpIHsNCj4+PiArwqDC oMKgwqDCoMKgwqAgY2FzZSBod21vbl9mYW5fbGFiZWw6DQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcmV0dXJuIGRlbGxfd21pX2Rkdl9mYW5fcmVhZF9zdHJpbmcoZGF0YSwgY2hhbm5lbCwg c3RyKTsNCj4+PiArwqDCoMKgwqDCoMKgwqAgZGVmYXVsdDoNCj4+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBicmVhazsNCj4+PiArwqDCoMKgwqDCoMKgwqAgfQ0KPj4+ICvCoMKgwqDCoMKgwqDC oCBicmVhazsNCj4+PiArwqDCoMKgIGNhc2UgaHdtb25fdGVtcDoNCj4+PiArwqDCoMKgwqDCoMKg wqAgc3dpdGNoIChhdHRyKSB7DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGNhc2UgaHdtb25fdGVtcF9s YWJlbDoNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gZGVsbF93bWlfZGR2X3Rl bXBfcmVhZF9zdHJpbmcoZGF0YSwgY2hhbm5lbCwgc3RyKTsNCj4+PiArwqDCoMKgwqDCoMKgwqAg ZGVmYXVsdDoNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsNCj4+PiArwqDCoMKg wqDCoMKgwqAgfQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCBicmVhazsNCj4+PiArwqDCoMKgIGRlZmF1 bHQ6DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGJyZWFrOw0KPj4+ICvCoMKgwqAgfQ0KPj4+ICsNCj4+ PiArwqDCoMKgIHJldHVybiAtRU9QTk9UU1VQUDsNCj4+PiArfQ0KPj4+ICsNCj4+PiArc3RhdGlj IGNvbnN0IHN0cnVjdCBod21vbl9vcHMgZGVsbF93bWlfZGR2X29wcyA9IHsNCj4+PiArwqDCoMKg IC5pc192aXNpYmxlID0gZGVsbF93bWlfZGR2X2lzX3Zpc2libGUsDQo+Pj4gK8KgwqDCoCAucmVh ZCA9IGRlbGxfd21pX2Rkdl9yZWFkLA0KPj4+ICvCoMKgwqAgLnJlYWRfc3RyaW5nID0gZGVsbF93 bWlfZGR2X3JlYWRfc3RyaW5nLA0KPj4+ICt9Ow0KPj4+ICsNCj4+PiArc3RhdGljIHN0cnVjdCBo d21vbl9jaGFubmVsX2luZm8gDQo+Pj4gKmRlbGxfd21pX2Rkdl9jaGFubmVsX2NyZWF0ZShzdHJ1 Y3QgZGV2aWNlICpkZXYsIHU2NCBjb3VudCwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVudW0gaHdtb25fc2Vu c29yX3R5cGVzIHR5cGUsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1MzIgY29uZmlnKQ0KPj4+ICt7DQo+Pj4g K8KgwqDCoCBzdHJ1Y3QgY29tYmluZWRfY2hhbm5lbF9pbmZvICpjaW5mbzsNCj4+PiArwqDCoMKg IGludCBpOw0KPj4+ICsNCj4+PiArwqDCoMKgIGNpbmZvID0gZGV2bV9remFsbG9jKGRldiwgc3Ry dWN0X3NpemUoY2luZm8sIGNvbmZpZywgY291bnQgKyANCj4+PiAxKSwgR0ZQX0tFUk5FTCk7DQo+ Pj4gK8KgwqDCoCBpZiAoIWNpbmZvKQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gRVJSX1BU UigtRU5PTUVNKTsNCj4+PiArDQo+Pj4gK8KgwqDCoCBjaW5mby0+aW5mby50eXBlID0gdHlwZTsN Cj4+PiArwqDCoMKgIGNpbmZvLT5pbmZvLmNvbmZpZyA9IGNpbmZvLT5jb25maWc7DQo+Pj4gKw0K Pj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspDQo+Pj4gK8KgwqDCoMKgwqDC oMKgIGNpbmZvLT5jb25maWdbaV0gPSBjb25maWc7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcmV0dXJu ICZjaW5mby0+aW5mbzsNCj4+PiArfQ0KPj4+ICsNCj4+PiArc3RhdGljIHN0cnVjdCBod21vbl9j aGFubmVsX2luZm8gKmRlbGxfd21pX2Rkdl9jaGFubmVsX2luaXQoc3RydWN0IA0KPj4+IHdtaV9k ZXZpY2UgKndkZXYsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVudW0gZGVsbF9kZHZfbWV0aG9kIG1ldGhvZCwNCj4+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgc2l6ZV90IGVudHJ5X3NpemUsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVudW0gaHdtb25fc2Vuc29y X3R5cGVzIHR5cGUsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHUzMiBjb25maWcpDQo+Pj4gK3sNCj4+PiArwqDCoMKg IHVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7DQo+Pj4gK8KgwqDCoCB1NjQgY291bnQ7DQo+Pj4gK8Kg wqDCoCBpbnQgcmV0Ow0KPj4+ICsNCj4+PiArwqDCoMKgIHJldCA9IGRlbGxfd21pX2Rkdl9xdWVy eV9zZW5zb3JzKHdkZXYsIG1ldGhvZCwgZW50cnlfc2l6ZSwgDQo+Pj4gJm9iaiwgJmNvdW50KTsN Cj4+PiArwqDCoMKgIGlmIChyZXQgPCAwKQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gRVJS X1BUUihyZXQpOw0KPj4+ICsNCj4+PiArwqDCoMKgIGtmcmVlKG9iaik7DQo+Pj4gKw0KPj4+ICvC oMKgwqAgaWYgKCFjb3VudCkNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIEVSUl9QVFIoLUVO T0RFVik7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcmV0dXJuIGRlbGxfd21pX2Rkdl9jaGFubmVsX2Ny ZWF0ZSgmd2Rldi0+ZGV2LCBjb3VudCwgdHlwZSwgDQo+Pj4gY29uZmlnKTsNCj4+PiArfQ0KPj4+ ICsNCj4+PiArc3RhdGljIGludCBkZWxsX3dtaV9kZHZfaHdtb25fYWRkKHN0cnVjdCBkZWxsX3dt aV9kZHZfZGF0YSAqZGF0YSkNCj4+PiArew0KPj4+ICvCoMKgwqAgc3RydWN0IHdtaV9kZXZpY2Ug KndkZXYgPSBkYXRhLT53ZGV2Ow0KPj4+ICvCoMKgwqAgc3RydWN0IGNvbWJpbmVkX2NoaXBfaW5m byAqY2luZm87DQo+Pj4gK8KgwqDCoCBzdHJ1Y3QgZGV2aWNlICpoZGV2Ow0KPj4+ICvCoMKgwqAg aW50IGluZGV4ID0gMDsNCj4+PiArwqDCoMKgIGludCByZXQ7DQo+Pj4gKw0KPj4+ICvCoMKgwqAg aWYgKCFkZXZyZXNfb3Blbl9ncm91cCgmd2Rldi0+ZGV2LCBkZWxsX3dtaV9kZHZfaHdtb25fYWRk LCANCj4+PiBHRlBfS0VSTkVMKSkNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9NRU07 DQo+Pj4gKw0KPj4+ICvCoMKgwqAgY2luZm8gPSBkZXZtX2t6YWxsb2MoJndkZXYtPmRldiwgc3Ry dWN0X3NpemUoY2luZm8sIGluZm8sIDQpLCANCj4+PiBHRlBfS0VSTkVMKTsNCj4+PiArwqDCoMKg IGlmICghY2luZm8pIHsNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0ID0gLUVOT01FTTsNCj4+PiAr DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gZXJyX3JlbGVhc2U7DQo+Pj4gK8KgwqDCoCB9DQo+ Pj4gKw0KPj4+ICvCoMKgwqAgY2luZm8tPmNoaXAub3BzID0gJmRlbGxfd21pX2Rkdl9vcHM7DQo+ Pj4gK8KgwqDCoCBjaW5mby0+Y2hpcC5pbmZvID0gY2luZm8tPmluZm87DQo+Pj4gKw0KPj4+ICvC oMKgwqAgY2luZm8tPmluZm9baW5kZXhdID0gZGVsbF93bWlfZGR2X2NoYW5uZWxfY3JlYXRlKCZ3 ZGV2LT5kZXYsIDEsIA0KPj4+IGh3bW9uX2NoaXAsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEhXTU9OX0NfUkVHSVNURVJfVFop Ow0KPj4+ICsNCj4+PiArwqDCoMKgIGlmIChJU19FUlIoY2luZm8tPmluZm9baW5kZXhdKSkgew0K Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXQgPSBQVFJfRVJSKGNpbmZvLT5pbmZvW2luZGV4XSk7DQo+ Pj4gKw0KPj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIGVycl9yZWxlYXNlOw0KPj4+ICvCoMKgwqAg fQ0KPj4+ICsNCj4+PiArwqDCoMKgIGluZGV4Kys7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgY2luZm8t PmluZm9baW5kZXhdID0gZGVsbF93bWlfZGR2X2NoYW5uZWxfaW5pdCh3ZGV2LCANCj4+PiBERUxM X0REVl9GQU5fU0VOU09SX0lORk9STUFUSU9OLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2l6ZW9mKHN0cnVjdCBmYW5f c2Vuc29yX2VudHJ5KSwgDQo+Pj4gaHdtb25fZmFuLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKEhXTU9OX0ZfSU5QVVQg fCBIV01PTl9GX0xBQkVMKSk7DQo+Pj4gK8KgwqDCoCBpZiAoIUlTX0VSUihjaW5mby0+aW5mb1tp bmRleF0pKQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCBpbmRleCsrOw0KPj4+ICsNCj4+PiArwqDCoMKg IGNpbmZvLT5pbmZvW2luZGV4XSA9IGRlbGxfd21pX2Rkdl9jaGFubmVsX2luaXQod2RldiwgDQo+ Pj4gREVMTF9ERFZfVEhFUk1BTF9TRU5TT1JfSU5GT1JNQVRJT04sDQo+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXplb2Yo c3RydWN0IHRoZXJtYWxfc2Vuc29yX2VudHJ5KSwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGh3bW9uX3RlbXAsIChIV01P Tl9UX0lOUFVUIHwgDQo+Pj4gSFdNT05fVF9NSU4gfA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgSFdNT05fVF9NQVggfCBI V01PTl9UX0xBQkVMKSk7DQo+Pj4gK8KgwqDCoCBpZiAoIUlTX0VSUihjaW5mby0+aW5mb1tpbmRl eF0pKQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCBpbmRleCsrOw0KPj4+ICsNCj4+PiArwqDCoMKgIGlm ICghaW5kZXgpIHsNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0ID0gLUVOT0RFVjsNCj4+PiArDQo+ Pj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gZXJyX3JlbGVhc2U7DQo+Pj4gK8KgwqDCoCB9DQo+Pj4g Kw0KPj4+ICvCoMKgwqAgY2luZm8tPmluZm9baW5kZXhdID0gTlVMTDsNCj4+PiArDQo+Pj4gK8Kg wqDCoCBoZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKCZ3ZGV2LT5k ZXYsIA0KPj4+ICJkZWxsX2RkdiIsIGRhdGEsICZjaW5mby0+Y2hpcCwNCj4+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIE5VTEwpOw0KPj4+ ICvCoMKgwqAgaWYgKElTX0VSUihoZGV2KSkgew0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXQgPSBQ VFJfRVJSKGhkZXYpOw0KPj4+ICsNCj4+PiArwqDCoMKgwqDCoMKgwqAgZ290byBlcnJfcmVsZWFz ZTsNCj4+PiArwqDCoMKgIH0NCj4+PiArDQo+Pj4gK8KgwqDCoCBkZXZyZXNfY2xvc2VfZ3JvdXAo JndkZXYtPmRldiwgZGVsbF93bWlfZGR2X2h3bW9uX2FkZCk7DQo+Pj4gKw0KPj4+ICvCoMKgwqAg cmV0dXJuIDA7DQo+Pj4gKw0KPj4+ICtlcnJfcmVsZWFzZToNCj4+PiArwqDCoMKgIGRldnJlc19y ZWxlYXNlX2dyb3VwKCZ3ZGV2LT5kZXYsIGRlbGxfd21pX2Rkdl9od21vbl9hZGQpOw0KPj4+ICsN Cj4+PiArwqDCoMKgIHJldHVybiByZXQ7DQo+Pj4gK30NCj4+PiArDQo+Pj4gwqAgc3RhdGljIGlu dCBkZWxsX3dtaV9kZHZfYmF0dGVyeV9pbmRleChzdHJ1Y3QgYWNwaV9kZXZpY2UgDQo+Pj4gKmFj cGlfZGV2LCB1MzIgKmluZGV4KQ0KPj4+IMKgIHsNCj4+PiDCoMKgwqDCoMKgIGNvbnN0IGNoYXIg KnVpZF9zdHI7DQo+Pj4gQEAgLTM3MCw3ICs3OTUsMTUgQEAgc3RhdGljIGludCBkZWxsX3dtaV9k ZHZfcHJvYmUoc3RydWN0IHdtaV9kZXZpY2UgDQo+Pj4gKndkZXYsIGNvbnN0IHZvaWQgKmNvbnRl eHQpDQo+Pj4NCj4+PiDCoMKgwqDCoMKgIGRlbGxfd21pX2Rkdl9kZWJ1Z2ZzX2luaXQod2Rldik7 DQo+Pj4NCj4+PiAtwqDCoMKgIHJldHVybiBkZWxsX3dtaV9kZHZfYmF0dGVyeV9hZGQoZGF0YSk7 DQo+Pj4gK8KgwqDCoCByZXQgPSBkZWxsX3dtaV9kZHZfaHdtb25fYWRkKGRhdGEpOw0KPj4+ICvC oMKgwqAgaWYgKHJldCA8IDApDQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGRldl9kYmcoJndkZXYtPmRl diwgIlVuYWJsZSB0byByZWdpc3RlciBod21vbiBpbnRlcmZhY2U6IA0KPj4+ICVkXG4iLCByZXQp Ow0KPj4+ICsNCj4+PiArwqDCoMKgIHJldCA9IGRlbGxfd21pX2Rkdl9iYXR0ZXJ5X2FkZChkYXRh KTsNCj4+PiArwqDCoMKgIGlmIChyZXQgPCAwKQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCBkZXZfZGJn KCZ3ZGV2LT5kZXYsICJVbmFibGUgdG8gcmVnaXN0ZXIgYWNwaSBiYXR0ZXJ5IGhvb2s6IA0KPj4+ ICVkXG4iLCByZXQpOw0KPj4+ICsNCj4+IFRoaXMgdXNlZCB0byBiZSBhbiBlcnJvciwgYnV0IG5v IGxvbmdlciBpcy4gTm90IG15IGNhbGwgdG8gbWFrZQ0KPj4gaWYgdGhpcyBpcyBhY2NlcHRhYmxl LCBqdXN0IHBvaW50aW5nIGl0IG91dC4NCj4NCj4gSSBkZWNpZGVkIHRvIG5vdCB0cmVhdCB0aGUg YmF0dGVyeSBob29rIGFzIGVzc2VudGlhbCBmdW5jdGlvbiBhbnltb3JlIA0KPiBiZWNhdXNlDQo+ IHRoZSBiYXR0ZXJ5IGhvb2sgYW5kIGh3bW9uIGZ1bmN0aW9uYWxpdHkgYXJlIG1vcmUgb3IgbGVz cyBkaXNjb25uZWN0ZWQgDQo+IGZyb20NCj4gZWFjaCBvdGhlciwgc28gaGF2aW5nIHRoZSBkcml2 ZXIgYWJvcnQgcHJvYmluZyBqdXN0IGJlY2F1c2Ugb25lIA0KPiBmdW5jdGlvbmFsaXR5DQo+IGNv dWxkIG5vdCBiZSBpbml0aWFsaXplZCBzZWVtZWQgdW5yZWFzb25hYmxlIHRvIG1lLg0KPg0KPiBJ IGFscmVhZHkgdGhvdWdodCBhYm91dCBwdXR0aW5nIHRoZSBiYXR0ZXJ5IGhvb2sgYW5kIGh3bW9u IA0KPiBmdW5jdGlvbmFsaXR5IGludG8NCj4gc2VwYXJhdGUgZHJpdmVycywgd2l0aCB0aGUgbWFp biBkcml2ZXIgcmVnaXN0ZXJpbmcgYSBNRkQgZGV2aWNlIG9yIA0KPiBzb21ldGhpbmcgc2ltaWxh ci4NCj4gQmVjYXVzZSBhcGFydCBmcm9tIHNvbWUgZ2VuZXJpYyByb3V0aW5lcywgYm90aCBmdW5j dGlvbnMgYXJlIG5vdCANCj4gY29ubmVjdGVkIGluIGFueSB3YXkuDQo+DQo+IElzIGl0IGFjY2Vw dGFibGUgdG8gc3BsaXQgdGhlIGRyaXZlciBmb3Igc3VjaCBhIHRoaW5nPw0KPg0KPiBBcm1pbiBX b2xmDQo+DQpBbnkgdGhvdWdodHMgYWJvdXQgdGhpcz8gT3RoZXJ3aXNlIGkgd2lsbCBqdXN0IHVz ZSBjb25kaXRpb25hbHMuDQoNCkFybWluIFdvbGYNCg0KPj4+ICvCoMKgwqAgcmV0dXJuIDA7DQo+ Pj4gwqAgfQ0KPj4+DQo+Pj4gwqAgc3RhdGljIGNvbnN0IHN0cnVjdCB3bWlfZGV2aWNlX2lkIGRl bGxfd21pX2Rkdl9pZF90YWJsZVtdID0gew0KPj4+IC0tIA0KPj4+IDIuMzAuMg0KPj4+DQo=