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=-9.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MIME_BASE64_TEXT,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, USER_AGENT_GIT 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 C5295C0044D for ; Mon, 16 Mar 2020 07:25:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6D90420679 for ; Mon, 16 Mar 2020 07:25:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="unpnLR8y" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729638AbgCPHZE (ORCPT ); Mon, 16 Mar 2020 03:25:04 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:11199 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1729967AbgCPHZD (ORCPT ); Mon, 16 Mar 2020 03:25:03 -0400 X-UUID: db23c19b67474699b30d8cd0c18f44b8-20200316 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=D0AT81v9iPbt/yKrx3J5r7dFexcxgjWm77Yn1c7jYzw=; b=unpnLR8yGeZKP5bYBNzwGb5wuFIjdLPJ06B/ZD97F/ekWyHdqa98eAZH1u/o63pMiFmS7RNVaH91PrmpGOVs1MNsUcw73vk7OhMotrn76Sij4sUQKhmigMzOzVRz7KoJ7/5zD07OWKApGAqIIxXaUXwgxddRPQYHCp+/ku+kvUE=; X-UUID: db23c19b67474699b30d8cd0c18f44b8-20200316 Received: from mtkcas06.mediatek.inc [(172.21.101.30)] by mailgw02.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.10 Build 0809 with TLS) with ESMTP id 307088226; Mon, 16 Mar 2020 15:24:41 +0800 Received: from MTKCAS06.mediatek.inc (172.21.101.30) by mtkmbs05n2.mediatek.inc (172.21.101.140) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Mon, 16 Mar 2020 15:23:33 +0800 Received: from mtksdaap41.mediatek.inc (172.21.77.4) by MTKCAS06.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Mon, 16 Mar 2020 15:21:42 +0800 From: Roger Lu To: Kevin Hilman , Rob Herring , Nicolas Boichat , Stephen Boyd CC: Fan Chen , HenryC Chen , YT Lee , Xiaoqing Liu , Charles Yang , Angus Lin , Mark Rutland , Matthias Brugger , Nishanth Menon , Roger Lu , , , , , Subject: [PATCH v7 3/3] PM / AVS: SVS: Introduce SVS engine Date: Mon, 16 Mar 2020 15:23:17 +0800 Message-ID: <20200316072316.7156-4-roger.lu@mediatek.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20200316072316.7156-1-roger.lu@mediatek.com> References: <20200316072316.7156-1-roger.lu@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain X-MTK: N Content-Transfer-Encoding: base64 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org VGhlIFNWUyAoU21hcnQgVm9sdGFnZSBTY2FsaW5nKSBlbmdpbmUgaXMgYSBwaWVjZQ0Kb2YgaGFy ZHdhcmUgd2hpY2ggaXMgdXNlZCB0byBjYWxjdWxhdGUgb3B0aW1pemVkDQp2b2x0YWdlIHZhbHVl cyBvZiBzZXZlcmFsIHBvd2VyIGRvbWFpbnMsDQplLmcuIENQVS9HUFUvQ0NJLCBhY2NvcmRpbmcg dG8gY2hpcCBwcm9jZXNzIGNvcm5lciwNCnRlbXBlcmF0dXJlcywgYW5kIG90aGVyIGZhY3RvcnMu IFRoZW4gRFZGUyBkcml2ZXINCmNvdWxkIGFwcGx5IHRob3NlIG9wdGltaXplZCB2b2x0YWdlIHZh bHVlcyB0byByZWR1Y2UNCnBvd2VyIGNvbnN1bXB0aW9uLg0KDQpTaWduZWQtb2ZmLWJ5OiBSb2dl ciBMdSA8cm9nZXIubHVAbWVkaWF0ZWsuY29tPg0KLS0tDQogZHJpdmVycy9wb3dlci9hdnMvS2Nv bmZpZyAgICAgfCAgIDEwICsNCiBkcml2ZXJzL3Bvd2VyL2F2cy9NYWtlZmlsZSAgICB8ICAgIDEg Kw0KIGRyaXZlcnMvcG93ZXIvYXZzL210a19zdnMuYyAgIHwgMjA3NCArKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysNCiBpbmNsdWRlL2xpbnV4L3Bvd2VyL210a19zdnMuaCB8ICAgMjMg Kw0KIDQgZmlsZXMgY2hhbmdlZCwgMjEwOCBpbnNlcnRpb25zKCspDQogY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvcG93ZXIvYXZzL210a19zdnMuYw0KIGNyZWF0ZSBtb2RlIDEwMDY0NCBpbmNs dWRlL2xpbnV4L3Bvd2VyL210a19zdnMuaA0KDQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9h dnMvS2NvbmZpZyBiL2RyaXZlcnMvcG93ZXIvYXZzL0tjb25maWcNCmluZGV4IGNkYjQyMzdiZmQw Mi4uNjcwODlhYzYwNDBlIDEwMDY0NA0KLS0tIGEvZHJpdmVycy9wb3dlci9hdnMvS2NvbmZpZw0K KysrIGIvZHJpdmVycy9wb3dlci9hdnMvS2NvbmZpZw0KQEAgLTM1LDMgKzM1LDEzIEBAIGNvbmZp ZyBST0NLQ0hJUF9JT0RPTUFJTg0KIAkgIFNheSB5IGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgaW8g ZG9tYWlucyBvbiBSb2NrY2hpcCBTb0NzLiBJdCBpcw0KIAkgIG5lY2Vzc2FyeSBmb3IgdGhlIGlv IGRvbWFpbiBzZXR0aW5nIG9mIHRoZSBTb0MgdG8gbWF0Y2ggdGhlDQogCSAgdm9sdGFnZSBzdXBw bGllZCBieSB0aGUgcmVndWxhdG9ycy4NCisNCitjb25maWcgTVRLX1NWUw0KKwlib29sICJNZWRp YVRlayBTbWFydCBWb2x0YWdlIFNjYWxpbmcoU1ZTKSINCisJZGVwZW5kcyBvbiBQT1dFUl9BVlMg JiYgTVRLX0VGVVNFICYmIE5WTUVNDQorCWhlbHANCisJICBUaGUgU1ZTIGVuZ2luZSBpcyBhIHBp ZWNlIG9mIGhhcmR3YXJlIHdoaWNoIGlzIHVzZWQgdG8gY2FsY3VsYXRlDQorCSAgb3B0aW1pemVk IHZvbHRhZ2UgdmFsdWVzIG9mIHNldmVyYWwgcG93ZXIgZG9tYWlucywgZS5nLg0KKwkgIENQVSBj bHVzdGVycy9HUFUvQ0NJLCBhY2NvcmRpbmcgdG8gY2hpcCBwcm9jZXNzIGNvcm5lciwgdGVtcGVy YXR1cmVzLA0KKwkgIGFuZCBvdGhlciBmYWN0b3JzLiBUaGVuIERWRlMgZHJpdmVyIGNvdWxkIGFw cGx5IHRob3NlIG9wdGltaXplZCB2b2x0YWdlDQorCSAgdmFsdWVzIHRvIHJlZHVjZSBwb3dlciBj b25zdW1wdGlvbi4NCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2F2cy9NYWtlZmlsZSBiL2Ry aXZlcnMvcG93ZXIvYXZzL01ha2VmaWxlDQppbmRleCA5MDA3ZDA1ODUzZTIuLjIzMWFkZjA3ODU4 MiAxMDA2NDQNCi0tLSBhL2RyaXZlcnMvcG93ZXIvYXZzL01ha2VmaWxlDQorKysgYi9kcml2ZXJz L3Bvd2VyL2F2cy9NYWtlZmlsZQ0KQEAgLTIsMyArMiw0IEBADQogb2JqLSQoQ09ORklHX1BPV0VS X0FWU19PTUFQKQkJKz0gc21hcnRyZWZsZXgubw0KIG9iai0kKENPTkZJR19RQ09NX0NQUikJCQkr PSBxY29tLWNwci5vDQogb2JqLSQoQ09ORklHX1JPQ0tDSElQX0lPRE9NQUlOKQkJKz0gcm9ja2No aXAtaW8tZG9tYWluLm8NCitvYmotJChDT05GSUdfTVRLX1NWUykJCQkrPSBtdGtfc3ZzLm8NCmRp ZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2F2cy9tdGtfc3ZzLmMgYi9kcml2ZXJzL3Bvd2VyL2F2 cy9tdGtfc3ZzLmMNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLjVm Y2NhZTZkOGZlOQ0KLS0tIC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9wb3dlci9hdnMvbXRrX3N2 cy5jDQpAQCAtMCwwICsxLDIwNzQgQEANCisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BM LTIuMA0KKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDIwIE1lZGlhVGVrIEluYy4NCisgKi8NCisN CisjZGVmaW5lIHByX2ZtdChmbXQpCSJbbXRrX3N2c10gIiBmbXQNCisNCisjaW5jbHVkZSA8bGlu dXgvYml0cy5oPg0KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4NCisjaW5jbHVkZSA8bGludXgvY29t cGxldGlvbi5oPg0KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+DQorI2luY2x1ZGUgPGxpbnV4L2lu dGVycnVwdC5oPg0KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4NCisjaW5jbHVkZSA8bGludXgv a3RocmVhZC5oPg0KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4NCisjaW5jbHVkZSA8bGludXgv bXV0ZXguaD4NCisjaW5jbHVkZSA8bGludXgvbnZtZW0tY29uc3VtZXIuaD4NCisjaW5jbHVkZSA8 bGludXgvb2ZfYWRkcmVzcy5oPg0KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4NCisjaW5jbHVk ZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+DQorI2luY2x1ZGUgPGxpbnV4L3BtX2RvbWFpbi5o Pg0KKyNpbmNsdWRlIDxsaW51eC9wbV9vcHAuaD4NCisjaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+ DQorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4NCisjaW5jbHVkZSA8bGludXgvcG93ZXIv bXRrX3N2cy5oPg0KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+DQorI2luY2x1ZGUgPGxpbnV4 L3JlZ3VsYXRvci9jb25zdW1lci5oPg0KKyNpbmNsdWRlIDxsaW51eC9yZXNldC5oPg0KKyNpbmNs dWRlIDxsaW51eC9zZXFfZmlsZS5oPg0KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+DQorI2luY2x1 ZGUgPGxpbnV4L3NwaW5sb2NrLmg+DQorI2luY2x1ZGUgPGxpbnV4L3RoZXJtYWwuaD4NCisjaW5j bHVkZSA8bGludXgvdWFjY2Vzcy5oPg0KKw0KKy8qIHN2cyAxLWxpbmUgc3cgaWQgKi8NCisjZGVm aW5lIFNWU19DUFVfTElUVExFCQkJQklUKDApDQorI2RlZmluZSBTVlNfQ1BVX0JJRwkJCUJJVCgx KQ0KKyNkZWZpbmUgU1ZTX0NDSQkJCQlCSVQoMikNCisjZGVmaW5lIFNWU19HUFUJCQkJQklUKDMp DQorDQorLyogc3ZzIGJhbmsgbW9kZSBzdXBwb3J0ICovDQorI2RlZmluZSBTVlNCX01PREVfQUxM X0RJU0FCTEUJCSgwKQ0KKyNkZWZpbmUgU1ZTQl9NT0RFX0lOSVQwMQkJQklUKDEpDQorI2RlZmlu ZSBTVlNCX01PREVfSU5JVDAyCQlCSVQoMikNCisjZGVmaW5lIFNWU0JfTU9ERV9NT04JCQlCSVQo MykNCisNCisvKiBzdnMgYmFuayBpbml0MDEgY29uZGl0aW9uICovDQorI2RlZmluZSBTVlNCX0lO SVQwMV9WT0xUX0lHTk9SRQkJQklUKDEpDQorI2RlZmluZSBTVlNCX0lOSVQwMV9WT0xUX0lOQ19P TkxZCUJJVCgyKQ0KKw0KKy8qIHN2cyBiYW5rIGNvbW1vbiBzZXR0aW5nICovDQorI2RlZmluZSBI SUdIX1RFTVBfTUFYCQkJKFUzMl9NQVgpDQorI2RlZmluZSBSVU5DT05GSUdfREVGQVVMVAkJKDB4 ODAwMDAwMDApDQorI2RlZmluZSBEQ19TSUdORURfQklUCQkJKDB4ODAwMCkNCisjZGVmaW5lIElO VEVOX0lOSVQweAkJCSgweDAwMDA1ZjAxKQ0KKyNkZWZpbmUgSU5URU5fTU9OVk9QRU4JCQkoMHgw MGZmMDAwMCkNCisjZGVmaW5lIFNWU0VOX09GRgkJCSgweDApDQorI2RlZmluZSBTVlNFTl9NQVNL CQkJKDB4NykNCisjZGVmaW5lIFNWU0VOX0lOSVQwMQkJCSgweDEpDQorI2RlZmluZSBTVlNFTl9J TklUMDIJCQkoMHg1KQ0KKyNkZWZpbmUgU1ZTRU5fTU9OCQkJKDB4MikNCisjZGVmaW5lIElOVFNU U19NT05WT1AJCQkoMHgwMGZmMDAwMCkNCisjZGVmaW5lIElOVFNUU19DT01QTEVURQkJCSgweDEp DQorI2RlZmluZSBJTlRTVFNfQ0xFQU4JCQkoMHgwMGZmZmZmZikNCisNCisjZGVmaW5lIHByb2Nf Zm9wc19ydyhuYW1lKSBcDQorCXN0YXRpYyBpbnQgbmFtZSAjIyBfcHJvY19vcGVuKHN0cnVjdCBp bm9kZSAqaW5vZGUsCVwNCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGUpCVwNCisJewkJCQkJ CQlcDQorCQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgbmFtZSAjIyBfcHJvY19zaG93LAlcDQor CQkJCSAgIFBERV9EQVRBKGlub2RlKSk7CQlcDQorCX0JCQkJCQkJXA0KKwlzdGF0aWMgY29uc3Qg c3RydWN0IHByb2Nfb3BzIG5hbWUgIyMgX3Byb2NfZm9wcyA9IHsJXA0KKwkJLnByb2Nfb3Blbgk9 IG5hbWUgIyMgX3Byb2Nfb3BlbiwJCVwNCisJCS5wcm9jX3JlYWQJPSBzZXFfcmVhZCwJCQlcDQor CQkucHJvY19sc2Vlawk9IHNlcV9sc2VlaywJCQlcDQorCQkucHJvY19yZWxlYXNlCT0gc2luZ2xl X3JlbGVhc2UsCQlcDQorCQkucHJvY193cml0ZQk9IG5hbWUgIyMgX3Byb2Nfd3JpdGUsCQlcDQor CX0NCisNCisjZGVmaW5lIHByb2NfZm9wc19ybyhuYW1lKSBcDQorCXN0YXRpYyBpbnQgbmFtZSAj IyBfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsCVwNCisJCQkJICAgICAgc3RydWN0IGZp bGUgKmZpbGUpCVwNCisJewkJCQkJCQlcDQorCQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgbmFt ZSAjIyBfcHJvY19zaG93LAlcDQorCQkJCSAgIFBERV9EQVRBKGlub2RlKSk7CQlcDQorCX0JCQkJ CQkJXA0KKwlzdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nfb3BzIG5hbWUgIyMgX3Byb2NfZm9wcyA9 IHsJXA0KKwkJLnByb2Nfb3Blbgk9IG5hbWUgIyMgX3Byb2Nfb3BlbiwJCVwNCisJCS5wcm9jX3Jl YWQJPSBzZXFfcmVhZCwJCQlcDQorCQkucHJvY19sc2Vlawk9IHNlcV9sc2VlaywJCQlcDQorCQku cHJvY19yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCQlcDQorCX0NCisNCisjZGVmaW5lIHByb2Nf ZW50cnkobmFtZSkJe19fc3RyaW5naWZ5KG5hbWUpLCAmbmFtZSAjIyBfcHJvY19mb3BzfQ0KKw0K K3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobXRrX3N2c19sb2NrKTsNCitzdHJ1Y3QgbXRrX3N2czsN CisNCitlbnVtIHN2c2JfcGhhc2Ugew0KKwlTVlNCX1BIQVNFX0lOSVQwMSA9IDAsDQorCVNWU0Jf UEhBU0VfSU5JVDAyLA0KKwlTVlNCX1BIQVNFX01PTiwNCisJU1ZTQl9QSEFTRV9FUlJPUiwNCit9 Ow0KKw0KK2VudW0gcmVnX2luZGV4IHsNCisJVEVNUE1PTkNUTDAgPSAwLA0KKwlURU1QTU9OQ1RM MSwNCisJVEVNUE1PTkNUTDIsDQorCVRFTVBNT05JTlQsDQorCVRFTVBNT05JTlRTVFMsDQorCVRF TVBNT05JREVUMCwNCisJVEVNUE1PTklERVQxLA0KKwlURU1QTU9OSURFVDIsDQorCVRFTVBIMk5U SFJFLA0KKwlURU1QSFRIUkUsDQorCVRFTVBDVEhSRSwNCisJVEVNUE9GRlNFVEgsDQorCVRFTVBP RkZTRVRMLA0KKwlURU1QTVNSQ1RMMCwNCisJVEVNUE1TUkNUTDEsDQorCVRFTVBBSEJQT0xMLA0K KwlURU1QQUhCVE8sDQorCVRFTVBBRENQTlAwLA0KKwlURU1QQURDUE5QMSwNCisJVEVNUEFEQ1BO UDIsDQorCVRFTVBBRENNVVgsDQorCVRFTVBBRENFWFQsDQorCVRFTVBBRENFWFQxLA0KKwlURU1Q QURDRU4sDQorCVRFTVBQTlBNVVhBRERSLA0KKwlURU1QQURDTVVYQUREUiwNCisJVEVNUEFEQ0VY VEFERFIsDQorCVRFTVBBRENFWFQxQUREUiwNCisJVEVNUEFEQ0VOQUREUiwNCisJVEVNUEFEQ1ZB TElEQUREUiwNCisJVEVNUEFEQ1ZPTFRBRERSLA0KKwlURU1QUkRDVFJMLA0KKwlURU1QQURDVkFM SURNQVNLLA0KKwlURU1QQURDVk9MVEFHRVNISUZULA0KKwlURU1QQURDV1JJVEVDVFJMLA0KKwlU RU1QTVNSMCwNCisJVEVNUE1TUjEsDQorCVRFTVBNU1IyLA0KKwlURU1QQURDSEFERFIsDQorCVRF TVBJTU1EMCwNCisJVEVNUElNTUQxLA0KKwlURU1QSU1NRDIsDQorCVRFTVBNT05JREVUMywNCisJ VEVNUEFEQ1BOUDMsDQorCVRFTVBNU1IzLA0KKwlURU1QSU1NRDMsDQorCVRFTVBQUk9UQ1RMLA0K KwlURU1QUFJPVFRBLA0KKwlURU1QUFJPVFRCLA0KKwlURU1QUFJPVFRDLA0KKwlURU1QU1BBUkUw LA0KKwlURU1QU1BBUkUxLA0KKwlURU1QU1BBUkUyLA0KKwlURU1QU1BBUkUzLA0KKwlURU1QTVNS MF8xLA0KKwlURU1QTVNSMV8xLA0KKwlURU1QTVNSMl8xLA0KKwlURU1QTVNSM18xLA0KKwlERVND SEFSLA0KKwlURU1QQ0hBUiwNCisJREVUQ0hBUiwNCisJQUdFQ0hBUiwNCisJRENDT05GSUcsDQor CUFHRUNPTkZJRywNCisJRlJFUVBDVDMwLA0KKwlGUkVRUENUNzQsDQorCUxJTUlUVkFMUywNCisJ VkJPT1QsDQorCURFVFdJTkRPVywNCisJQ09ORklHLA0KKwlUU0NBTENTLA0KKwlSVU5DT05GSUcs DQorCVNWU0VOLA0KKwlJTklUMlZBTFMsDQorCURDVkFMVUVTLA0KKwlBR0VWQUxVRVMsDQorCVZP UDMwLA0KKwlWT1A3NCwNCisJVEVNUCwNCisJSU5UU1RTLA0KKwlJTlRTVFNSQVcsDQorCUlOVEVO LA0KKwlDSEtJTlQsDQorCUNIS1NISUZULA0KKwlTVEFUVVMsDQorCVZERVNJR04zMCwNCisJVkRF U0lHTjc0LA0KKwlEVlQzMCwNCisJRFZUNzQsDQorCUFHRUNPVU5ULA0KKwlTTVNUQVRFMCwNCisJ U01TVEFURTEsDQorCUNUTDAsDQorCURFU0RFVFNFQywNCisJVEVNUEFHRVNFQywNCisJQ1RSTFNQ QVJFMCwNCisJQ1RSTFNQQVJFMSwNCisJQ1RSTFNQQVJFMiwNCisJQ1RSTFNQQVJFMywNCisJQ09S RVNFTCwNCisJVEhFUk1JTlRTVCwNCisJSU5UU1QsDQorCVRIU1RBR0UwU1QsDQorCVRIU1RBR0Ux U1QsDQorCVRIU1RBR0UyU1QsDQorCVRIQUhCU1QwLA0KKwlUSEFIQlNUMSwNCisJU1BBUkUwLA0K KwlTUEFSRTEsDQorCVNQQVJFMiwNCisJU1BBUkUzLA0KKwlUSFNMUEVWRUIsDQorCXJlZ19udW0s DQorfTsNCisNCitzdGF0aWMgY29uc3QgdTMyIHN2c19yZWdzX3YyW10gPSB7DQorCVtURU1QTU9O Q1RMMF0JCT0gMHgwMDAsDQorCVtURU1QTU9OQ1RMMV0JCT0gMHgwMDQsDQorCVtURU1QTU9OQ1RM Ml0JCT0gMHgwMDgsDQorCVtURU1QTU9OSU5UXQkJPSAweDAwYywNCisJW1RFTVBNT05JTlRTVFNd CQk9IDB4MDEwLA0KKwlbVEVNUE1PTklERVQwXQkJPSAweDAxNCwNCisJW1RFTVBNT05JREVUMV0J CT0gMHgwMTgsDQorCVtURU1QTU9OSURFVDJdCQk9IDB4MDFjLA0KKwlbVEVNUEgyTlRIUkVdCQk9 IDB4MDI0LA0KKwlbVEVNUEhUSFJFXQkJPSAweDAyOCwNCisJW1RFTVBDVEhSRV0JCT0gMHgwMmMs DQorCVtURU1QT0ZGU0VUSF0JCT0gMHgwMzAsDQorCVtURU1QT0ZGU0VUTF0JCT0gMHgwMzQsDQor CVtURU1QTVNSQ1RMMF0JCT0gMHgwMzgsDQorCVtURU1QTVNSQ1RMMV0JCT0gMHgwM2MsDQorCVtU RU1QQUhCUE9MTF0JCT0gMHgwNDAsDQorCVtURU1QQUhCVE9dCQk9IDB4MDQ0LA0KKwlbVEVNUEFE Q1BOUDBdCQk9IDB4MDQ4LA0KKwlbVEVNUEFEQ1BOUDFdCQk9IDB4MDRjLA0KKwlbVEVNUEFEQ1BO UDJdCQk9IDB4MDUwLA0KKwlbVEVNUEFEQ01VWF0JCT0gMHgwNTQsDQorCVtURU1QQURDRVhUXQkJ PSAweDA1OCwNCisJW1RFTVBBRENFWFQxXQkJPSAweDA1YywNCisJW1RFTVBBRENFTl0JCT0gMHgw NjAsDQorCVtURU1QUE5QTVVYQUREUl0JPSAweDA2NCwNCisJW1RFTVBBRENNVVhBRERSXQk9IDB4 MDY4LA0KKwlbVEVNUEFEQ0VYVEFERFJdCT0gMHgwNmMsDQorCVtURU1QQURDRVhUMUFERFJdCT0g MHgwNzAsDQorCVtURU1QQURDRU5BRERSXQkJPSAweDA3NCwNCisJW1RFTVBBRENWQUxJREFERFJd CT0gMHgwNzgsDQorCVtURU1QQURDVk9MVEFERFJdCT0gMHgwN2MsDQorCVtURU1QUkRDVFJMXQkJ PSAweDA4MCwNCisJW1RFTVBBRENWQUxJRE1BU0tdCT0gMHgwODQsDQorCVtURU1QQURDVk9MVEFH RVNISUZUXQk9IDB4MDg4LA0KKwlbVEVNUEFEQ1dSSVRFQ1RSTF0JPSAweDA4YywNCisJW1RFTVBN U1IwXQkJPSAweDA5MCwNCisJW1RFTVBNU1IxXQkJPSAweDA5NCwNCisJW1RFTVBNU1IyXQkJPSAw eDA5OCwNCisJW1RFTVBBRENIQUREUl0JCT0gMHgwOWMsDQorCVtURU1QSU1NRDBdCQk9IDB4MGEw LA0KKwlbVEVNUElNTUQxXQkJPSAweDBhNCwNCisJW1RFTVBJTU1EMl0JCT0gMHgwYTgsDQorCVtU RU1QTU9OSURFVDNdCQk9IDB4MGIwLA0KKwlbVEVNUEFEQ1BOUDNdCQk9IDB4MGI0LA0KKwlbVEVN UE1TUjNdCQk9IDB4MGI4LA0KKwlbVEVNUElNTUQzXQkJPSAweDBiYywNCisJW1RFTVBQUk9UQ1RM XQkJPSAweDBjMCwNCisJW1RFTVBQUk9UVEFdCQk9IDB4MGM0LA0KKwlbVEVNUFBST1RUQl0JCT0g MHgwYzgsDQorCVtURU1QUFJPVFRDXQkJPSAweDBjYywNCisJW1RFTVBTUEFSRTBdCQk9IDB4MGYw LA0KKwlbVEVNUFNQQVJFMV0JCT0gMHgwZjQsDQorCVtURU1QU1BBUkUyXQkJPSAweDBmOCwNCisJ W1RFTVBTUEFSRTNdCQk9IDB4MGZjLA0KKwlbVEVNUE1TUjBfMV0JCT0gMHgxOTAsDQorCVtURU1Q TVNSMV8xXQkJPSAweDE5NCwNCisJW1RFTVBNU1IyXzFdCQk9IDB4MTk4LA0KKwlbVEVNUE1TUjNf MV0JCT0gMHgxYjgsDQorCVtERVNDSEFSXQkJPSAweGMwMCwNCisJW1RFTVBDSEFSXQkJPSAweGMw NCwNCisJW0RFVENIQVJdCQk9IDB4YzA4LA0KKwlbQUdFQ0hBUl0JCT0gMHhjMGMsDQorCVtEQ0NP TkZJR10JCT0gMHhjMTAsDQorCVtBR0VDT05GSUddCQk9IDB4YzE0LA0KKwlbRlJFUVBDVDMwXQkJ PSAweGMxOCwNCisJW0ZSRVFQQ1Q3NF0JCT0gMHhjMWMsDQorCVtMSU1JVFZBTFNdCQk9IDB4YzIw LA0KKwlbVkJPT1RdCQkJPSAweGMyNCwNCisJW0RFVFdJTkRPV10JCT0gMHhjMjgsDQorCVtDT05G SUddCQk9IDB4YzJjLA0KKwlbVFNDQUxDU10JCT0gMHhjMzAsDQorCVtSVU5DT05GSUddCQk9IDB4 YzM0LA0KKwlbU1ZTRU5dCQkJPSAweGMzOCwNCisJW0lOSVQyVkFMU10JCT0gMHhjM2MsDQorCVtE Q1ZBTFVFU10JCT0gMHhjNDAsDQorCVtBR0VWQUxVRVNdCQk9IDB4YzQ0LA0KKwlbVk9QMzBdCQkJ PSAweGM0OCwNCisJW1ZPUDc0XQkJCT0gMHhjNGMsDQorCVtURU1QXQkJCT0gMHhjNTAsDQorCVtJ TlRTVFNdCQk9IDB4YzU0LA0KKwlbSU5UU1RTUkFXXQkJPSAweGM1OCwNCisJW0lOVEVOXQkJCT0g MHhjNWMsDQorCVtDSEtJTlRdCQk9IDB4YzYwLA0KKwlbQ0hLU0hJRlRdCQk9IDB4YzY0LA0KKwlb U1RBVFVTXQkJPSAweGM2OCwNCisJW1ZERVNJR04zMF0JCT0gMHhjNmMsDQorCVtWREVTSUdONzRd CQk9IDB4YzcwLA0KKwlbRFZUMzBdCQkJPSAweGM3NCwNCisJW0RWVDc0XQkJCT0gMHhjNzgsDQor CVtBR0VDT1VOVF0JCT0gMHhjN2MsDQorCVtTTVNUQVRFMF0JCT0gMHhjODAsDQorCVtTTVNUQVRF MV0JCT0gMHhjODQsDQorCVtDVEwwXQkJCT0gMHhjODgsDQorCVtERVNERVRTRUNdCQk9IDB4Y2Uw LA0KKwlbVEVNUEFHRVNFQ10JCT0gMHhjZTQsDQorCVtDVFJMU1BBUkUwXQkJPSAweGNmMCwNCisJ W0NUUkxTUEFSRTFdCQk9IDB4Y2Y0LA0KKwlbQ1RSTFNQQVJFMl0JCT0gMHhjZjgsDQorCVtDVFJM U1BBUkUzXQkJPSAweGNmYywNCisJW0NPUkVTRUxdCQk9IDB4ZjAwLA0KKwlbVEhFUk1JTlRTVF0J CT0gMHhmMDQsDQorCVtJTlRTVF0JCQk9IDB4ZjA4LA0KKwlbVEhTVEFHRTBTVF0JCT0gMHhmMGMs DQorCVtUSFNUQUdFMVNUXQkJPSAweGYxMCwNCisJW1RIU1RBR0UyU1RdCQk9IDB4ZjE0LA0KKwlb VEhBSEJTVDBdCQk9IDB4ZjE4LA0KKwlbVEhBSEJTVDFdCQk9IDB4ZjFjLA0KKwlbU1BBUkUwXQkJ PSAweGYyMCwNCisJW1NQQVJFMV0JCT0gMHhmMjQsDQorCVtTUEFSRTJdCQk9IDB4ZjI4LA0KKwlb U1BBUkUzXQkJPSAweGYyYywNCisJW1RIU0xQRVZFQl0JCT0gMHhmMzAsDQorfTsNCisNCitzdHJ1 Y3QgdGhlcm1hbF9wYXJhbWV0ZXIgew0KKwlpbnQgYWRjX2dlX3Q7DQorCWludCBhZGNfb2VfdDsN CisJaW50IGdlOw0KKwlpbnQgb2U7DQorCWludCBnYWluOw0KKwlpbnQgb192dHNhYmI7DQorCWlu dCBvX3Z0c21jdTE7DQorCWludCBvX3Z0c21jdTI7DQorCWludCBvX3Z0c21jdTM7DQorCWludCBv X3Z0c21jdTQ7DQorCWludCBvX3Z0c21jdTU7DQorCWludCBkZWdjX2NhbGk7DQorCWludCBhZGNf Y2FsaV9lbl90Ow0KKwlpbnQgb19zbG9wZTsNCisJaW50IG9fc2xvcGVfc2lnbjsNCisJaW50IHRz X2lkOw0KK307DQorDQorc3RydWN0IHN2c19iYW5rX29wcyB7DQorCXZvaWQgKCpzZXRfZnJlcXNf cGN0KShzdHJ1Y3QgbXRrX3N2cyAqc3ZzKTsNCisJdm9pZCAoKmdldF92b3BzKShzdHJ1Y3QgbXRr X3N2cyAqc3ZzKTsNCit9Ow0KKw0KK3N0cnVjdCBzdnNfYmFuayB7DQorCXN0cnVjdCBzdnNfYmFu a19vcHMgKm9wczsNCisJc3RydWN0IGNvbXBsZXRpb24gaW5pdF9jb21wbGV0aW9uOw0KKwlzdHJ1 Y3QgZGV2aWNlICpkZXY7DQorCXN0cnVjdCByZWd1bGF0b3IgKmJ1Y2s7DQorCXN0cnVjdCBtdXRl eCBsb2NrOwkvKiBMb2NrIHRvIHByb3RlY3QgdXBkYXRlIHZvbHRhZ2UgcHJvY2VzcyAqLw0KKwli b29sIHN1c3BlbmRlZDsNCisJYm9vbCBtdGNtb3NfcmVxdWVzdDsNCisJczMyIHZvbHRfb2Zmc2V0 Ow0KKwl1MzIgbW9kZV9zdXBwb3J0Ow0KKwl1MzIgb3BwX2ZyZXFzWzE2XTsNCisJdTMyIGZyZXFz X3BjdFsxNl07DQorCXUzMiBvcHBfdm9sdHNbMTZdOw0KKwl1MzIgaW5pdDAyX3ZvbHRzWzE2XTsN CisJdTMyIHZvbHRzWzE2XTsNCisJdTMyIHJlZ19kYXRhWzNdW3JlZ19udW1dOw0KKwl1MzIgZnJl cV9iYXNlOw0KKwl1MzIgdmJvb3Q7DQorCXUzMiB2b2x0X3N0ZXA7DQorCXUzMiB2b2x0X2Jhc2U7 DQorCXUzMiBpbml0MDFfdm9sdF9mbGFnOw0KKwl1MzIgcGhhc2U7DQorCXUzMiB2bWF4Ow0KKwl1 MzIgdm1pbjsNCisJdTMyIGJ0czsNCisJdTMyIG10czsNCisJdTMyIGJkZXM7DQorCXUzMiBtZGVz Ow0KKwl1MzIgbXRkZXM7DQorCXUzMiBkY2JkZXQ7DQorCXUzMiBkY21kZXQ7DQorCXUzMiBkdGhp Ow0KKwl1MzIgZHRsbzsNCisJdTMyIGRldF93aW5kb3c7DQorCXUzMiBkZXRfbWF4Ow0KKwl1MzIg YWdlX2NvbmZpZzsNCisJdTMyIGFnZV92b2Zmc2V0X2luOw0KKwl1MzIgYWdlbTsNCisJdTMyIGRj X2NvbmZpZzsNCisJdTMyIGRjX3ZvZmZzZXRfaW47DQorCXUzMiBkdnRfZml4ZWQ7DQorCXUzMiB2 Y287DQorCXUzMiBjaGtfc2hpZnQ7DQorCXUzMiBzdnNfdGVtcDsNCisJdTMyIHVwcGVyX3RlbXBf Ym91bmQ7DQorCXUzMiBsb3dlcl90ZW1wX2JvdW5kOw0KKwl1MzIgaGlnaF90ZW1wX3RocmVhc2hv bGQ7DQorCXUzMiBoaWdoX3RlbXBfb2Zmc2V0Ow0KKwl1MzIgbG93X3RlbXBfdGhyZWFzaG9sZDsN CisJdTMyIGxvd190ZW1wX29mZnNldDsNCisJdTMyIGNvcmVfc2VsOw0KKwl1MzIgb3BwX2NvdW50 Ow0KKwl1MzIgaW50X3N0Ow0KKwl1MzIgc3lzdGVtY2xrX2VuOw0KKwl1MzIgc3dfaWQ7DQorCXUz MiBiYW5rX2lkOw0KKwl1MzIgY3RsMDsNCisJdTggKm9mX2NvbXBhdGlibGU7DQorCXU4ICpuYW1l Ow0KKwl1OCAqdHpvbmVfbmFtZTsNCisJdTggKmJ1Y2tfbmFtZTsNCit9Ow0KKw0KK3N0cnVjdCBz dnNfcGxhdGZvcm0gew0KKwlzdHJ1Y3Qgc3ZzX2JhbmsgKmJhbmtzOw0KKwlib29sICgqZWZ1c2Vf cGFyc2luZykoc3RydWN0IG10a19zdnMgKnN2cyk7DQorCWJvb2wgZmFrZV9lZnVzZTsNCisJYm9v bCBuZWVkX2h3X3Jlc2V0Ow0KKwljb25zdCB1MzIgKnJlZ3M7DQorCXVuc2lnbmVkIGxvbmcgaXJx ZmxhZ3M7DQorCXUzMiBiYW5rX251bTsNCisJdTMyIGVmdXNlX251bTsNCisJdTMyIGVmdXNlX2No ZWNrOw0KKwl1MzIgdGhlcm1hbF9lZnVzZV9udW07DQorCXU4ICpuYW1lOw0KK307DQorDQorc3Ry dWN0IG10a19zdnMgew0KKwljb25zdCBzdHJ1Y3Qgc3ZzX3BsYXRmb3JtICpwbGF0Zm9ybTsNCisJ c3RydWN0IHN2c19iYW5rICpiYW5rOw0KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7DQorCXZvaWQgX19p b21lbSAqYmFzZTsNCisJc3RydWN0IGNsayAqbWFpbl9jbGs7DQorCXUzMiAqZWZ1c2U7DQorCXUz MiAqdGhlcm1hbF9lZnVzZTsNCit9Ow0KKw0KK3Vuc2lnbmVkIGxvbmcgY2xhaW1fbXRrX3N2c19s b2NrKHZvaWQpDQorCV9fYWNxdWlyZXMoJm10a19zdnNfbG9jaykNCit7DQorCXVuc2lnbmVkIGxv bmcgZmxhZ3M7DQorDQorCXNwaW5fbG9ja19pcnFzYXZlKCZtdGtfc3ZzX2xvY2ssIGZsYWdzKTsN CisNCisJcmV0dXJuIGZsYWdzOw0KK30NCitFWFBPUlRfU1lNQk9MX0dQTChjbGFpbV9tdGtfc3Zz X2xvY2spOw0KKw0KK3ZvaWQgcmVsZWFzZV9tdGtfc3ZzX2xvY2sodW5zaWduZWQgbG9uZyBmbGFn cykNCisJX19yZWxlYXNlcygmbXRrX3N2c19sb2NrKQ0KK3sNCisJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmbXRrX3N2c19sb2NrLCBmbGFncyk7DQorfQ0KK0VYUE9SVF9TWU1CT0xfR1BMKHJlbGVh c2VfbXRrX3N2c19sb2NrKTsNCisNCitzdGF0aWMgdTMyIHBlcmNlbnQodTMyIG51bWVyYXRvciwg dTMyIGRlbm9taW5hdG9yKQ0KK3sNCisJdTMyIHBjdDsNCisNCisJLyogSWYgbm90IGRpdmlkZSAx MDAwLCAibnVtZXJhdG9yICogMTAwIiB3b3VsZCBiZSBkYXRhIG92ZXJmbG93LiAqLw0KKwludW1l cmF0b3IgLz0gMTAwMDsNCisJZGVub21pbmF0b3IgLz0gMTAwMDsNCisJcGN0ID0gKChudW1lcmF0 b3IgKiAxMDApICsgZGVub21pbmF0b3IgLSAxKSAvIGRlbm9taW5hdG9yOw0KKwlwY3QgJj0gR0VO TUFTSyg3LCAwKTsNCisNCisJcmV0dXJuIHBjdDsNCit9DQorDQorc3RhdGljIHUzMiBzdnNfcmVh ZGwoc3RydWN0IG10a19zdnMgKnN2cywgZW51bSByZWdfaW5kZXggcmdfaSkNCit7DQorCXJldHVy biByZWFkbChzdnMtPmJhc2UgKyBzdnMtPnBsYXRmb3JtLT5yZWdzW3JnX2ldKTsNCit9DQorDQor c3RhdGljIHZvaWQgc3ZzX3dyaXRlbChzdHJ1Y3QgbXRrX3N2cyAqc3ZzLCB1MzIgdmFsLCBlbnVt IHJlZ19pbmRleCByZ19pKQ0KK3sNCisJd3JpdGVsKHZhbCwgc3ZzLT5iYXNlICsgc3ZzLT5wbGF0 Zm9ybS0+cmVnc1tyZ19pXSk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHN2c19zd2l0Y2hfYmFuayhz dHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0KK3sNCisJc3RydWN0IHN2c19iYW5rICpzdnNiID0gc3ZzLT5i YW5rOw0KKw0KKwlzdnNfd3JpdGVsKHN2cywgc3ZzYi0+Y29yZV9zZWwsIENPUkVTRUwpOw0KK30N CisNCitzdGF0aWMgdTMyIHN2c2Jfdm9sdF90b19vcHBfdm9sdCh1MzIgc3ZzYl92b2x0LCB1MzIg c3ZzYl92b2x0X3N0ZXAsDQorCQkJCSB1MzIgc3ZzYl92b2x0X2Jhc2UpDQorew0KKwl1MzIgdV92 b2x0Ow0KKw0KKwl1X3ZvbHQgPSAoc3ZzYl92b2x0ICogc3ZzYl92b2x0X3N0ZXApICsgc3ZzYl92 b2x0X2Jhc2U7DQorDQorCXJldHVybiB1X3ZvbHQ7DQorfQ0KKw0KK3N0YXRpYyBpbnQgc3ZzYl9n ZXRfem9uZV90ZW1wZXJhdHVyZShzdHJ1Y3Qgc3ZzX2JhbmsgKnN2c2IsIGludCAqdHpvbmVfdGVt cCkNCit7DQorCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0emQ7DQorDQorCXR6ZCA9IHRo ZXJtYWxfem9uZV9nZXRfem9uZV9ieV9uYW1lKHN2c2ItPnR6b25lX25hbWUpOw0KKwlpZiAoSVNf RVJSKHR6ZCkpDQorCQlyZXR1cm4gUFRSX0VSUih0emQpOw0KKw0KKwlyZXR1cm4gdGhlcm1hbF96 b25lX2dldF90ZW1wKHR6ZCwgdHpvbmVfdGVtcCk7DQorfQ0KKw0KK3N0YXRpYyBpbnQgc3ZzYl9z ZXRfdm9sdHMoc3RydWN0IHN2c19iYW5rICpzdnNiLCBib29sIGZvcmNlX3VwZGF0ZSkNCit7DQor CXUzMiBpLCBzdnNiX3ZvbHQsIG9wcF92b2x0LCB0ZW1wX29mZnNldCA9IDA7DQorCWludCB0em9u ZV90ZW1wLCByZXQ7DQorDQorCW11dGV4X2xvY2soJnN2c2ItPmxvY2spOw0KKw0KKwkvKg0KKwkg KiBJZiBiYW5rIGlzIHN1c3BlbmRlZCwgaXQgbWVhbnMgc2lnbmVkLW9mZiB2b2x0YWdlcyBhcmUg YXBwbGllZC4NCisJICogRG9uJ3QgbmVlZCB0byB1cGRhdGUgb3BwIHZvbHRhZ2UgYW55bW9yZS4N CisJICovDQorCWlmIChzdnNiLT5zdXNwZW5kZWQgJiYgIWZvcmNlX3VwZGF0ZSkgew0KKwkJcHJf bm90aWNlKCIlczogYmFuayBpcyBzdXNwZW5kZWRcbiIsIHN2c2ItPm5hbWUpOw0KKwkJbXV0ZXhf dW5sb2NrKCZzdnNiLT5sb2NrKTsNCisJCXJldHVybiAtRVBFUk07DQorCX0NCisNCisJLyogR2V0 IHRoZXJtYWwgZWZmZWN0ICovDQorCWlmIChzdnNiLT5waGFzZSA9PSBTVlNCX1BIQVNFX01PTikg ew0KKwkJaWYgKHN2c2ItPnN2c190ZW1wID4gc3ZzYi0+dXBwZXJfdGVtcF9ib3VuZCAmJg0KKwkJ ICAgIHN2c2ItPnN2c190ZW1wIDwgc3ZzYi0+bG93ZXJfdGVtcF9ib3VuZCkgew0KKwkJCXByX2Vy cigiJXM6IHN2c190ZW1wIGlzIGFibm9ybWFsICgweCV4KT9cbiIsDQorCQkJICAgICAgIHN2c2It Pm5hbWUsIHN2c2ItPnN2c190ZW1wKTsNCisJCQltdXRleF91bmxvY2soJnN2c2ItPmxvY2spOw0K KwkJCXJldHVybiAtRUlOVkFMOw0KKwkJfQ0KKw0KKwkJcmV0ID0gc3ZzYl9nZXRfem9uZV90ZW1w ZXJhdHVyZShzdnNiLCAmdHpvbmVfdGVtcCk7DQorCQlpZiAocmV0KSB7DQorCQkJcHJfZXJyKCIl czogY2Fubm90IGdldCB6b25lIFwiJXNcIiB0ZW1wZXJhdHVyZSglZClcbiIsDQorCQkJICAgICAg IHN2c2ItPm5hbWUsIHN2c2ItPnR6b25lX25hbWUsIHJldCk7DQorCQkJcHJfZXJyKCIlczogc2V0 IHNpZ25lZC1vZmYgdm9sdGFnZSB0aGlzIHRpbWUuXG4iLA0KKwkJCSAgICAgICBzdnNiLT5uYW1l KTsNCisJCQlzdnNiLT5waGFzZSA9IFNWU0JfUEhBU0VfRVJST1I7DQorCQl9DQorDQorCQlpZiAo dHpvbmVfdGVtcCA+PSBzdnNiLT5oaWdoX3RlbXBfdGhyZWFzaG9sZCkNCisJCQl0ZW1wX29mZnNl dCArPSBzdnNiLT5oaWdoX3RlbXBfb2Zmc2V0Ow0KKw0KKwkJaWYgKHR6b25lX3RlbXAgPD0gc3Zz Yi0+bG93X3RlbXBfdGhyZWFzaG9sZCkNCisJCQl0ZW1wX29mZnNldCArPSBzdnNiLT5sb3dfdGVt cF9vZmZzZXQ7DQorCX0NCisNCisJLyogdm1pbiA8PSBzdnNiX3ZvbHQgKG9wcF92b2x0KSA8PSBz aWduZWQtb2ZmIHZvbHRhZ2UgKi8NCisJZm9yIChpID0gMDsgaSA8IHN2c2ItPm9wcF9jb3VudDsg aSsrKSB7DQorCQlpZiAoc3ZzYi0+cGhhc2UgPT0gU1ZTQl9QSEFTRV9NT04pIHsNCisJCQlzdnNi X3ZvbHQgPSBtYXgoKHN2c2ItPnZvbHRzW2ldICsgc3ZzYi0+dm9sdF9vZmZzZXQgKw0KKwkJCQkJ IHRlbXBfb2Zmc2V0KSwgc3ZzYi0+dm1pbik7DQorCQkJb3BwX3ZvbHQgPSBzdnNiX3ZvbHRfdG9f b3BwX3ZvbHQoc3ZzYl92b2x0LA0KKwkJCQkJCQkgc3ZzYi0+dm9sdF9zdGVwLA0KKwkJCQkJCQkg c3ZzYi0+dm9sdF9iYXNlKTsNCisJCX0gZWxzZSBpZiAoc3ZzYi0+cGhhc2UgPT0gU1ZTQl9QSEFT RV9JTklUMDIpIHsNCisJCQlzdnNiX3ZvbHQgPSBtYXgoKHN2c2ItPmluaXQwMl92b2x0c1tpXSAr DQorCQkJCQkgc3ZzYi0+dm9sdF9vZmZzZXQpLCBzdnNiLT52bWluKTsNCisJCQlvcHBfdm9sdCA9 IHN2c2Jfdm9sdF90b19vcHBfdm9sdChzdnNiX3ZvbHQsDQorCQkJCQkJCSBzdnNiLT52b2x0X3N0 ZXAsDQorCQkJCQkJCSBzdnNiLT52b2x0X2Jhc2UpOw0KKwkJfSBlbHNlIGlmIChzdnNiLT5waGFz ZSA9PSBTVlNCX1BIQVNFX0VSUk9SKSB7DQorCQkJb3BwX3ZvbHQgPSBzdnNiLT5vcHBfdm9sdHNb aV07DQorCQl9IGVsc2Ugew0KKwkJCXByX2VycigiJXM6IHVua25vd24gcGhhc2U6ICV1P1xuIiwN CisJCQkgICAgICAgc3ZzYi0+bmFtZSwgc3ZzYi0+cGhhc2UpOw0KKwkJCW11dGV4X3VubG9jaygm c3ZzYi0+bG9jayk7DQorCQkJcmV0dXJuIC1FSU5WQUw7DQorCQl9DQorDQorCQlvcHBfdm9sdCA9 IG1pbihvcHBfdm9sdCwgc3ZzYi0+b3BwX3ZvbHRzW2ldKTsNCisJCXJldCA9IGRldl9wbV9vcHBf YWRqdXN0X3ZvbHRhZ2Uoc3ZzYi0+ZGV2LCBzdnNiLT5vcHBfZnJlcXNbaV0sDQorCQkJCQkJb3Bw X3ZvbHQsIG9wcF92b2x0LA0KKwkJCQkJCXN2c2ItPm9wcF92b2x0c1tpXSk7DQorCQlpZiAocmV0 KSB7DQorCQkJcHJfZXJyKCIlczogc2V0IHZvbHRhZ2UgZmFpbGVkOiAlZFxuIiwgc3ZzYi0+bmFt ZSwgcmV0KTsNCisJCQltdXRleF91bmxvY2soJnN2c2ItPmxvY2spOw0KKwkJCXJldHVybiByZXQ7 DQorCQl9DQorCX0NCisNCisJbXV0ZXhfdW5sb2NrKCZzdnNiLT5sb2NrKTsNCisNCisJcmV0dXJu IDA7DQorfQ0KKw0KK3N0YXRpYyB1MzIgaW50ZXJwb2xhdGUodTMyIGYwLCB1MzIgZjEsIHUzMiB2 MCwgdTMyIHYxLCB1MzIgZngpDQorew0KKwl1MzIgdnk7DQorDQorCWlmICh2MCA9PSB2MSB8fCBm MCA9PSBmMSkNCisJCXJldHVybiB2MDsNCisNCisJLyogKjEwMCB0byBoYXZlIGRlY2ltYWwgZnJh Y3Rpb24gZmFjdG9yLCArOTkgZm9yIHJvdW5kaW5nIHVwLiAqLw0KKwl2eSA9ICh2MCAqIDEwMCkg LSAoKCgodjAgLSB2MSkgKiAxMDApIC8gKGYwIC0gZjEpKSAqIChmMCAtIGZ4KSk7DQorCXZ5ID0g KHZ5ICsgOTkpIC8gMTAwOw0KKw0KKwlyZXR1cm4gdnk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHN2 c19nZXRfdm9wc192MihzdHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0KK3sNCisJc3RydWN0IHN2c19iYW5r ICpzdnNiID0gc3ZzLT5iYW5rOw0KKwl1MzIgdGVtcCwgaTsNCisNCisJdGVtcCA9IHN2c19yZWFk bChzdnMsIFZPUDMwKTsNCisJc3ZzYi0+dm9sdHNbNl0gPSAodGVtcCA+PiAyNCkgJiBHRU5NQVNL KDcsIDApOw0KKwlzdnNiLT52b2x0c1s0XSA9ICh0ZW1wID4+IDE2KSAmIEdFTk1BU0soNywgMCk7 DQorCXN2c2ItPnZvbHRzWzJdID0gKHRlbXAgPj4gOCkgICYgR0VOTUFTSyg3LCAwKTsNCisJc3Zz Yi0+dm9sdHNbMF0gPSAodGVtcCAmIEdFTk1BU0soNywgMCkpOw0KKw0KKwl0ZW1wID0gc3ZzX3Jl YWRsKHN2cywgVk9QNzQpOw0KKwlzdnNiLT52b2x0c1sxNF0gPSAodGVtcCA+PiAyNCkgJiBHRU5N QVNLKDcsIDApOw0KKwlzdnNiLT52b2x0c1sxMl0gPSAodGVtcCA+PiAxNikgJiBHRU5NQVNLKDcs IDApOw0KKwlzdnNiLT52b2x0c1sxMF0gPSAodGVtcCA+PiA4KSAgJiBHRU5NQVNLKDcsIDApOw0K KwlzdnNiLT52b2x0c1s4XSA9ICh0ZW1wICYgR0VOTUFTSyg3LCAwKSk7DQorDQorCWZvciAoaSA9 IDA7IGkgPD0gNzsgaSsrKSB7DQorCQlpZiAoaSA8IDcpIHsNCisJCQlzdnNiLT52b2x0c1soaSAq IDIpICsgMV0gPQ0KKwkJCQlpbnRlcnBvbGF0ZShzdnNiLT5mcmVxc19wY3RbaSAqIDJdLA0KKwkJ CQkJICAgIHN2c2ItPmZyZXFzX3BjdFsoaSArIDEpICogMl0sDQorCQkJCQkgICAgc3ZzYi0+dm9s dHNbaSAqIDJdLA0KKwkJCQkJICAgIHN2c2ItPnZvbHRzWyhpICsgMSkgKiAyXSwNCisJCQkJCSAg ICBzdnNiLT5mcmVxc19wY3RbKGkgKiAyKSArIDFdKTsNCisJCX0gZWxzZSBpZiAoaSA9PSA3KSB7 DQorCQkJc3ZzYi0+dm9sdHNbKGkgKiAyKSArIDFdID0NCisJCQkJaW50ZXJwb2xhdGUoc3ZzYi0+ ZnJlcXNfcGN0WyhpIC0gMSkgKiAyXSwNCisJCQkJCSAgICBzdnNiLT5mcmVxc19wY3RbaSAqIDJd LA0KKwkJCQkJICAgIHN2c2ItPnZvbHRzWyhpIC0gMSkgKiAyXSwNCisJCQkJCSAgICBzdnNiLT52 b2x0c1tpICogMl0sDQorCQkJCQkgICAgc3ZzYi0+ZnJlcXNfcGN0WyhpICogMikgKyAxXSk7DQor CQl9DQorCX0NCit9DQorDQorc3RhdGljIHZvaWQgc3ZzX3NldF9mcmVxc19wY3RfdjIoc3RydWN0 IG10a19zdnMgKnN2cykNCit7DQorCXN0cnVjdCBzdnNfYmFuayAqc3ZzYiA9IHN2cy0+YmFuazsN CisNCisJc3ZzX3dyaXRlbChzdnMsDQorCQkgICAoKHN2c2ItPmZyZXFzX3BjdFs2XSA8PCAyNCkg JiBHRU5NQVNLKDMxLCAyNCkpIHwNCisJCSAgICgoc3ZzYi0+ZnJlcXNfcGN0WzRdIDw8IDE2KSAm IEdFTk1BU0soMjMsIDE2KSkgfA0KKwkJICAgKChzdnNiLT5mcmVxc19wY3RbMl0gPDwgOCkgJiBH RU5NQVNLKDE1LCA4KSkgfA0KKwkJICAgKHN2c2ItPmZyZXFzX3BjdFswXSAmIEdFTk1BU0soNywg MCkpLA0KKwkJICAgRlJFUVBDVDMwKTsNCisJc3ZzX3dyaXRlbChzdnMsDQorCQkgICAoKHN2c2It PmZyZXFzX3BjdFsxNF0gPDwgMjQpICYgR0VOTUFTSygzMSwgMjQpKSB8DQorCQkgICAoKHN2c2It PmZyZXFzX3BjdFsxMl0gPDwgMTYpICYgR0VOTUFTSygyMywgMTYpKSB8DQorCQkgICAoKHN2c2It PmZyZXFzX3BjdFsxMF0gPDwgOCkgJiBHRU5NQVNLKDE1LCA4KSkgfA0KKwkJICAgKChzdnNiLT5m cmVxc19wY3RbOF0pICYgR0VOTUFTSyg3LCAwKSksDQorCQkgICBGUkVRUENUNzQpOw0KK30NCisN CitzdGF0aWMgdm9pZCBzdnNfc2V0X3BoYXNlKHN0cnVjdCBtdGtfc3ZzICpzdnMsIHUzMiB0YXJn ZXRfcGhhc2UpDQorew0KKwlzdHJ1Y3Qgc3ZzX2JhbmsgKnN2c2IgPSBzdnMtPmJhbms7DQorCXUz MiBkZXNfY2hhciwgdGVtcF9jaGFyLCBkZXRfY2hhciwgbGltaXRfdmFsczsNCisJdTMyIGluaXQy dmFscywgdHNfY2FsY3MsIHZhbCwgZmlsdGVyLCBpOw0KKw0KKwlzdnNfc3dpdGNoX2Jhbmsoc3Zz KTsNCisNCisJZGVzX2NoYXIgPSAoKHN2c2ItPmJkZXMgPDwgOCkgJiBHRU5NQVNLKDE1LCA4KSkg fA0KKwkJICAgKHN2c2ItPm1kZXMgJiBHRU5NQVNLKDcsIDApKTsNCisJc3ZzX3dyaXRlbChzdnMs IGRlc19jaGFyLCBERVNDSEFSKTsNCisNCisJdGVtcF9jaGFyID0gKChzdnNiLT52Y28gPDwgMTYp ICYgR0VOTUFTSygyMywgMTYpKSB8DQorCQkgICAgKChzdnNiLT5tdGRlcyA8PCA4KSAmIEdFTk1B U0soMTUsIDgpKSB8DQorCQkgICAgKHN2c2ItPmR2dF9maXhlZCAmIEdFTk1BU0soNywgMCkpOw0K KwlzdnNfd3JpdGVsKHN2cywgdGVtcF9jaGFyLCBURU1QQ0hBUik7DQorDQorCWRldF9jaGFyID0g KChzdnNiLT5kY2JkZXQgPDwgOCkgJiBHRU5NQVNLKDE1LCA4KSkgfA0KKwkJICAgKHN2c2ItPmRj bWRldCAmIEdFTk1BU0soNywgMCkpOw0KKwlzdnNfd3JpdGVsKHN2cywgZGV0X2NoYXIsIERFVENI QVIpOw0KKw0KKwlzdnNfd3JpdGVsKHN2cywgc3ZzYi0+ZGNfY29uZmlnLCBEQ0NPTkZJRyk7DQor CXN2c193cml0ZWwoc3ZzLCBzdnNiLT5hZ2VfY29uZmlnLCBBR0VDT05GSUcpOw0KKw0KKwlpZiAo IXN2c2ItPmFnZW0pIHsNCisJCXN2c193cml0ZWwoc3ZzLCBSVU5DT05GSUdfREVGQVVMVCwgUlVO Q09ORklHKTsNCisJfSBlbHNlIHsNCisJCXZhbCA9IDB4MDsNCisNCisJCWZvciAoaSA9IDA7IGkg PCAyNDsgaSArPSAyKSB7DQorCQkJZmlsdGVyID0gMHgzIDw8IGk7DQorDQorCQkJaWYgKCEoc3Zz Yi0+YWdlX2NvbmZpZyAmIGZpbHRlcikpDQorCQkJCXZhbCB8PSAoMHgxIDw8IGkpOw0KKwkJCWVs c2UNCisJCQkJdmFsIHw9IChzdnNiLT5hZ2VfY29uZmlnICYgZmlsdGVyKTsNCisJCX0NCisJCXN2 c193cml0ZWwoc3ZzLCB2YWwsIFJVTkNPTkZJRyk7DQorCX0NCisNCisJc3ZzYi0+b3BzLT5zZXRf ZnJlcXNfcGN0KHN2cyk7DQorDQorCWxpbWl0X3ZhbHMgPSAoKHN2c2ItPnZtYXggPDwgMjQpICYg R0VOTUFTSygzMSwgMjQpKSB8DQorCQkgICAgICgoc3ZzYi0+dm1pbiA8PCAxNikgJiBHRU5NQVNL KDIzLCAxNikpIHwNCisJCSAgICAgKChzdnNiLT5kdGhpIDw8IDgpICYgR0VOTUFTSygxNSwgOCkp IHwNCisJCSAgICAgKHN2c2ItPmR0bG8gJiBHRU5NQVNLKDcsIDApKTsNCisJc3ZzX3dyaXRlbChz dnMsIGxpbWl0X3ZhbHMsIExJTUlUVkFMUyk7DQorCXN2c193cml0ZWwoc3ZzLCAoc3ZzYi0+dmJv b3QgJiBHRU5NQVNLKDcsIDApKSwgVkJPT1QpOw0KKwlzdnNfd3JpdGVsKHN2cywgKHN2c2ItPmRl dF93aW5kb3cgJiBHRU5NQVNLKDE1LCAwKSksIERFVFdJTkRPVyk7DQorCXN2c193cml0ZWwoc3Zz LCAoc3ZzYi0+ZGV0X21heCAmIEdFTk1BU0soMTUsIDApKSwgQ09ORklHKTsNCisNCisJaWYgKHN2 c2ItPmNoa19zaGlmdCkNCisJCXN2c193cml0ZWwoc3ZzLCAoc3ZzYi0+Y2hrX3NoaWZ0ICYgR0VO TUFTSyg3LCAwKSksIENIS1NISUZUKTsNCisNCisJaWYgKHN2c2ItPmN0bDApDQorCQlzdnNfd3Jp dGVsKHN2cywgc3ZzYi0+Y3RsMCwgQ1RMMCk7DQorDQorCXN2c193cml0ZWwoc3ZzLCBJTlRTVFNf Q0xFQU4sIElOVFNUUyk7DQorDQorCXN3aXRjaCAodGFyZ2V0X3BoYXNlKSB7DQorCWNhc2UgU1ZT Ql9QSEFTRV9JTklUMDE6DQorCQlzdnNfd3JpdGVsKHN2cywgSU5URU5fSU5JVDB4LCBJTlRFTik7 DQorCQlzdnNfd3JpdGVsKHN2cywgU1ZTRU5fSU5JVDAxLCBTVlNFTik7DQorCQlicmVhazsNCisJ Y2FzZSBTVlNCX1BIQVNFX0lOSVQwMjoNCisJCXN2c193cml0ZWwoc3ZzLCBJTlRFTl9JTklUMHgs IElOVEVOKTsNCisJCWluaXQydmFscyA9ICgoc3ZzYi0+YWdlX3ZvZmZzZXRfaW4gPDwgMTYpICYg R0VOTUFTSygzMSwgMTYpKSB8DQorCQkJICAgIChzdnNiLT5kY192b2Zmc2V0X2luICYgR0VOTUFT SygxNSwgMCkpOw0KKwkJc3ZzX3dyaXRlbChzdnMsIGluaXQydmFscywgSU5JVDJWQUxTKTsNCisJ CXN2c193cml0ZWwoc3ZzLCBTVlNFTl9JTklUMDIsIFNWU0VOKTsNCisJCWJyZWFrOw0KKwljYXNl IFNWU0JfUEhBU0VfTU9OOg0KKwkJdHNfY2FsY3MgPSAoKHN2c2ItPmJ0cyA8PCAxMikgJiBHRU5N QVNLKDIzLCAxMikpIHwNCisJCQkgICAoc3ZzYi0+bXRzICYgR0VOTUFTSygxMSwgMCkpOw0KKwkJ c3ZzX3dyaXRlbChzdnMsIHRzX2NhbGNzLCBUU0NBTENTKTsNCisJCXN2c193cml0ZWwoc3ZzLCBJ TlRFTl9NT05WT1BFTiwgSU5URU4pOw0KKwkJc3ZzX3dyaXRlbChzdnMsIFNWU0VOX01PTiwgU1ZT RU4pOw0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQorCQlXQVJOX09OKDEpOw0KKwkJYnJlYWs7DQor CX0NCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIHN2c19pbml0MDFfaXNyX2hhbmRsZXIoc3Ry dWN0IG10a19zdnMgKnN2cykNCit7DQorCXN0cnVjdCBzdnNfYmFuayAqc3ZzYiA9IHN2cy0+YmFu azsNCisJZW51bSByZWdfaW5kZXggcmdfaTsNCisNCisJcHJfbm90aWNlKCIlczogJXM6IFZETjc0 OjB4JTA4eCwgVkROMzA6MHglMDh4LCBEQ1ZBTFVFUzoweCUwOHhcbiIsDQorCQkgIHN2c2ItPm5h bWUsIF9fZnVuY19fLCBzdnNfcmVhZGwoc3ZzLCBWREVTSUdONzQpLA0KKwkJICBzdnNfcmVhZGwo c3ZzLCBWREVTSUdOMzApLCBzdnNfcmVhZGwoc3ZzLCBEQ1ZBTFVFUykpOw0KKw0KKwlmb3IgKHJn X2kgPSBURU1QTU9OQ1RMMDsgcmdfaSA8IHJlZ19udW07IHJnX2krKykNCisJCXN2c2ItPnJlZ19k YXRhW1NWU0JfUEhBU0VfSU5JVDAxXVtyZ19pXSA9IHN2c19yZWFkbChzdnMsIHJnX2kpOw0KKw0K KwlzdnNiLT5waGFzZSA9IFNWU0JfUEhBU0VfSU5JVDAxOw0KKwlzdnNiLT5kY192b2Zmc2V0X2lu ID0gfihzdnNfcmVhZGwoc3ZzLCBEQ1ZBTFVFUykgJiBHRU5NQVNLKDE1LCAwKSkgKyAxOw0KKwlp ZiAoc3ZzYi0+aW5pdDAxX3ZvbHRfZmxhZyA9PSBTVlNCX0lOSVQwMV9WT0xUX0lHTk9SRSkNCisJ CXN2c2ItPmRjX3ZvZmZzZXRfaW4gPSAwOw0KKwllbHNlIGlmICgoc3ZzYi0+ZGNfdm9mZnNldF9p biAmIERDX1NJR05FRF9CSVQpICYmDQorCQkgKHN2c2ItPmluaXQwMV92b2x0X2ZsYWcgPT0gU1ZT Ql9JTklUMDFfVk9MVF9JTkNfT05MWSkpDQorCQlzdnNiLT5kY192b2Zmc2V0X2luID0gMDsNCisN CisJc3ZzYi0+YWdlX3ZvZmZzZXRfaW4gPSBzdnNfcmVhZGwoc3ZzLCBBR0VWQUxVRVMpICYgR0VO TUFTSygxNSwgMCk7DQorDQorCXN2c193cml0ZWwoc3ZzLCBTVlNFTl9PRkYsIFNWU0VOKTsNCisJ c3ZzX3dyaXRlbChzdnMsIElOVFNUU19DT01QTEVURSwgSU5UU1RTKTsNCisNCisJLyogc3ZzIGlu aXQwMSBjbG9jayBnYXRpbmcgKi8NCisJc3ZzYi0+Y29yZV9zZWwgJj0gfnN2c2ItPnN5c3RlbWNs a19lbjsNCisJY29tcGxldGUoJnN2c2ItPmluaXRfY29tcGxldGlvbik7DQorfQ0KKw0KK3N0YXRp YyBpbmxpbmUgdm9pZCBzdnNfaW5pdDAyX2lzcl9oYW5kbGVyKHN0cnVjdCBtdGtfc3ZzICpzdnMp DQorew0KKwlzdHJ1Y3Qgc3ZzX2JhbmsgKnN2c2IgPSBzdnMtPmJhbms7DQorCWVudW0gcmVnX2lu ZGV4IHJnX2k7DQorDQorCXByX25vdGljZSgiJXM6ICVzOiBWT1A3NDoweCUwOHgsIFZPUDMwOjB4 JTA4eCwgRENWQUxVRVM6MHglMDh4XG4iLA0KKwkJICBzdnNiLT5uYW1lLCBfX2Z1bmNfXywgc3Zz X3JlYWRsKHN2cywgVk9QNzQpLA0KKwkJICBzdnNfcmVhZGwoc3ZzLCBWT1AzMCksIHN2c19yZWFk bChzdnMsIERDVkFMVUVTKSk7DQorDQorCWZvciAocmdfaSA9IFRFTVBNT05DVEwwOyByZ19pIDwg cmVnX251bTsgcmdfaSsrKQ0KKwkJc3ZzYi0+cmVnX2RhdGFbU1ZTQl9QSEFTRV9JTklUMDJdW3Jn X2ldID0gc3ZzX3JlYWRsKHN2cywgcmdfaSk7DQorDQorCXN2c2ItPnBoYXNlID0gU1ZTQl9QSEFT RV9JTklUMDI7DQorCXN2c2ItPm9wcy0+Z2V0X3ZvcHMoc3ZzKTsNCisJbWVtY3B5KHN2c2ItPmlu aXQwMl92b2x0cywgc3ZzYi0+dm9sdHMsIHNpemVvZih1MzIpICogc3ZzYi0+b3BwX2NvdW50KTsN CisNCisJc3ZzX3dyaXRlbChzdnMsIFNWU0VOX09GRiwgU1ZTRU4pOw0KKwlzdnNfd3JpdGVsKHN2 cywgSU5UU1RTX0NPTVBMRVRFLCBJTlRTVFMpOw0KKw0KKwljb21wbGV0ZSgmc3ZzYi0+aW5pdF9j b21wbGV0aW9uKTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIHN2c19tb25fbW9kZV9pc3Jf aGFuZGxlcihzdHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0KK3sNCisJc3RydWN0IHN2c19iYW5rICpzdnNi ID0gc3ZzLT5iYW5rOw0KKwllbnVtIHJlZ19pbmRleCByZ19pOw0KKw0KKwlmb3IgKHJnX2kgPSBU RU1QTU9OQ1RMMDsgcmdfaSA8IHJlZ19udW07IHJnX2krKykNCisJCXN2c2ItPnJlZ19kYXRhW1NW U0JfUEhBU0VfTU9OXVtyZ19pXSA9IHN2c19yZWFkbChzdnMsIHJnX2kpOw0KKw0KKwlzdnNiLT5w aGFzZSA9IFNWU0JfUEhBU0VfTU9OOw0KKwlzdnNiLT5zdnNfdGVtcCA9IHN2c19yZWFkbChzdnMs IFRFTVApICYgR0VOTUFTSyg3LCAwKTsNCisJc3ZzYi0+b3BzLT5nZXRfdm9wcyhzdnMpOw0KKw0K KwlzdnNfd3JpdGVsKHN2cywgSU5UU1RTX01PTlZPUCwgSU5UU1RTKTsNCit9DQorDQorc3RhdGlj IGlubGluZSB2b2lkIHN2c19lcnJvcl9pc3JfaGFuZGxlcihzdHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0K K3sNCisJY29uc3Qgc3RydWN0IHN2c19wbGF0Zm9ybSAqc3ZzcCA9IHN2cy0+cGxhdGZvcm07DQor CXN0cnVjdCBzdnNfYmFuayAqc3ZzYiA9IHN2cy0+YmFuazsNCisJZW51bSByZWdfaW5kZXggcmdf aTsNCisNCisJcHJfZXJyKCIlcygpOiAlcyglcykiLCBfX2Z1bmNfXywgc3ZzcC0+bmFtZSwgc3Zz Yi0+bmFtZSk7DQorCXByX2VycigiQ09SRVNFTCgweCV4KSA9IDB4JTA4eFxuIiwNCisJICAgICAg IHN2c3AtPnJlZ3NbQ09SRVNFTF0sIHN2c19yZWFkbChzdnMsIENPUkVTRUwpKSwNCisJcHJfZXJy KCJTVlNFTigweCV4KSA9IDB4JTA4eCwgSU5UU1RTKDB4JXgpID0gMHglMDh4XG4iLA0KKwkgICAg ICAgc3ZzcC0+cmVnc1tTVlNFTl0sIHN2c19yZWFkbChzdnMsIFNWU0VOKSwNCisJICAgICAgIHN2 c3AtPnJlZ3NbSU5UU1RTXSwgc3ZzX3JlYWRsKHN2cywgSU5UU1RTKSk7DQorCXByX2VycigiU01T VEFURTAoMHgleCkgPSAweCUwOHgsIFNNU1RBVEUxKDB4JXgpID0gMHglMDh4XG4iLA0KKwkgICAg ICAgc3ZzcC0+cmVnc1tTTVNUQVRFMF0sIHN2c19yZWFkbChzdnMsIFNNU1RBVEUwKSwNCisJICAg ICAgIHN2c3AtPnJlZ3NbU01TVEFURTFdLCBzdnNfcmVhZGwoc3ZzLCBTTVNUQVRFMSkpOw0KKwlw cl9lcnIoIlRFTVAoMHgleCkgPSAweCUwOHgsIFRFTVBNU1IwKDB4JXgpID0gMHglMDh4XG4iLA0K KwkgICAgICAgc3ZzcC0+cmVnc1tURU1QXSwgc3ZzX3JlYWRsKHN2cywgVEVNUCksDQorCSAgICAg ICBzdnNwLT5yZWdzW1RFTVBNU1IwXSwgc3ZzX3JlYWRsKHN2cywgVEVNUE1TUjApKTsNCisJcHJf ZXJyKCJURU1QTVNSMSgweCV4KSA9IDB4JTA4eCwgVEVNUE1TUjIoMHgleCkgPSAweCUwOHhcbiIs DQorCSAgICAgICBzdnNwLT5yZWdzW1RFTVBNU1IxXSwgc3ZzX3JlYWRsKHN2cywgVEVNUE1TUjEp LA0KKwkgICAgICAgc3ZzcC0+cmVnc1tURU1QTVNSMl0sIHN2c19yZWFkbChzdnMsIFRFTVBNU1Iy KSk7DQorCXByX2VycigiVEVNUE1PTkNUTDAoMHgleCkgPSAweCUwOHgsIFRFTVBNU1JDVEwxKDB4 JXgpID0gMHglMDh4XG4iLA0KKwkgICAgICAgc3ZzcC0+cmVnc1tURU1QTU9OQ1RMMF0sIHN2c19y ZWFkbChzdnMsIFRFTVBNT05DVEwwKSwNCisJICAgICAgIHN2c3AtPnJlZ3NbVEVNUE1TUkNUTDFd LCBzdnNfcmVhZGwoc3ZzLCBURU1QTVNSQ1RMMSkpOw0KKw0KKwlmb3IgKHJnX2kgPSBURU1QTU9O Q1RMMDsgcmdfaSA8IHJlZ19udW07IHJnX2krKykNCisJCXN2c2ItPnJlZ19kYXRhW1NWU0JfUEhB U0VfTU9OXVtyZ19pXSA9IHN2c19yZWFkbChzdnMsIHJnX2kpOw0KKw0KKwlzdnNiLT5tb2RlX3N1 cHBvcnQgPSBTVlNCX01PREVfQUxMX0RJU0FCTEU7DQorDQorCWlmIChzdnNiLT5waGFzZSAhPSBT VlNCX1BIQVNFX0lOSVQwMSkNCisJCXN2c2ItPnBoYXNlID0gU1ZTQl9QSEFTRV9FUlJPUjsNCisN CisJc3ZzX3dyaXRlbChzdnMsIFNWU0VOX09GRiwgU1ZTRU4pOw0KKwlzdnNfd3JpdGVsKHN2cywg SU5UU1RTX0NMRUFOLCBJTlRTVFMpOw0KK30NCisNCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3ZzX2lz cihpbnQgaXJxLCB2b2lkICpkYXRhKQ0KK3sNCisJc3RydWN0IG10a19zdnMgKnN2cyA9IChzdHJ1 Y3QgbXRrX3N2cyAqKWRhdGE7DQorCWNvbnN0IHN0cnVjdCBzdnNfcGxhdGZvcm0gKnN2c3AgPSBz dnMtPnBsYXRmb3JtOw0KKwlzdHJ1Y3Qgc3ZzX2JhbmsgKnN2c2IgPSBOVUxMOw0KKwl1bnNpZ25l ZCBsb25nIGZsYWdzOw0KKwl1MzIgaWR4LCBpbnRfc3RzLCBzdnNfZW47DQorDQorCWZsYWdzID0g Y2xhaW1fbXRrX3N2c19sb2NrKCk7DQorCWZvciAoaWR4ID0gMDsgaWR4IDwgc3ZzcC0+YmFua19u dW07IGlkeCsrKSB7DQorCQlzdnNiID0gJnN2c3AtPmJhbmtzW2lkeF07DQorCQlzdnMtPmJhbmsg PSBzdnNiOw0KKw0KKwkJaWYgKHN2c2ItPmludF9zdCAmIHN2c19yZWFkbChzdnMsIElOVFNUKSkN CisJCQljb250aW51ZTsNCisNCisJCWlmICghc3ZzYi0+c3VzcGVuZGVkKSB7DQorCQkJc3ZzX3N3 aXRjaF9iYW5rKHN2cyk7DQorCQkJaW50X3N0cyA9IHN2c19yZWFkbChzdnMsIElOVFNUUyk7DQor CQkJc3ZzX2VuID0gc3ZzX3JlYWRsKHN2cywgU1ZTRU4pOw0KKw0KKwkJCWlmIChpbnRfc3RzID09 IElOVFNUU19DT01QTEVURSAmJg0KKwkJCSAgICAoKHN2c19lbiAmIFNWU0VOX01BU0spID09IFNW U0VOX0lOSVQwMSkpDQorCQkJCXN2c19pbml0MDFfaXNyX2hhbmRsZXIoc3ZzKTsNCisJCQllbHNl IGlmICgoaW50X3N0cyA9PSBJTlRTVFNfQ09NUExFVEUpICYmDQorCQkJCSAoKHN2c19lbiAmIFNW U0VOX01BU0spID09IFNWU0VOX0lOSVQwMikpDQorCQkJCXN2c19pbml0MDJfaXNyX2hhbmRsZXIo c3ZzKTsNCisJCQllbHNlIGlmICghIShpbnRfc3RzICYgSU5UU1RTX01PTlZPUCkpDQorCQkJCXN2 c19tb25fbW9kZV9pc3JfaGFuZGxlcihzdnMpOw0KKwkJCWVsc2UNCisJCQkJc3ZzX2Vycm9yX2lz cl9oYW5kbGVyKHN2cyk7DQorCQl9DQorDQorCQlicmVhazsNCisJfQ0KKwlyZWxlYXNlX210a19z dnNfbG9jayhmbGFncyk7DQorDQorCWlmIChzdnNiLT5waGFzZSAhPSBTVlNCX1BIQVNFX0lOSVQw MSkNCisJCXN2c2Jfc2V0X3ZvbHRzKHN2c2IsIGZhbHNlKTsNCisNCisJcmV0dXJuIElSUV9IQU5E TEVEOw0KK30NCisNCitzdGF0aWMgdm9pZCBzdnNfbW9uX21vZGUoc3RydWN0IG10a19zdnMgKnN2 cykNCit7DQorCWNvbnN0IHN0cnVjdCBzdnNfcGxhdGZvcm0gKnN2c3AgPSBzdnMtPnBsYXRmb3Jt Ow0KKwlzdHJ1Y3Qgc3ZzX2JhbmsgKnN2c2I7DQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQorCXUz MiBpZHg7DQorDQorCWZsYWdzID0gY2xhaW1fbXRrX3N2c19sb2NrKCk7DQorCWZvciAoaWR4ID0g MDsgaWR4IDwgc3ZzcC0+YmFua19udW07IGlkeCsrKSB7DQorCQlzdnNiID0gJnN2c3AtPmJhbmtz W2lkeF07DQorCQlzdnMtPmJhbmsgPSBzdnNiOw0KKw0KKwkJaWYgKCEoc3ZzYi0+bW9kZV9zdXBw b3J0ICYgU1ZTQl9NT0RFX01PTikpDQorCQkJY29udGludWU7DQorDQorCQlzdnNfc2V0X3BoYXNl KHN2cywgU1ZTQl9QSEFTRV9NT04pOw0KKwl9DQorCXJlbGVhc2VfbXRrX3N2c19sb2NrKGZsYWdz KTsNCit9DQorDQorc3RhdGljIGludCBzdnNfaW5pdDAyKHN0cnVjdCBtdGtfc3ZzICpzdnMpDQor ew0KKwljb25zdCBzdHJ1Y3Qgc3ZzX3BsYXRmb3JtICpzdnNwID0gc3ZzLT5wbGF0Zm9ybTsNCisJ c3RydWN0IHN2c19iYW5rICpzdnNiOw0KKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB0aW1lX2xlZnQ7 DQorCXUzMiBpZHg7DQorDQorCWZvciAoaWR4ID0gMDsgaWR4IDwgc3ZzcC0+YmFua19udW07IGlk eCsrKSB7DQorCQlzdnNiID0gJnN2c3AtPmJhbmtzW2lkeF07DQorCQlzdnMtPmJhbmsgPSBzdnNi Ow0KKw0KKwkJaWYgKCEoc3ZzYi0+bW9kZV9zdXBwb3J0ICYgU1ZTQl9NT0RFX0lOSVQwMikpDQor CQkJY29udGludWU7DQorDQorCQlyZWluaXRfY29tcGxldGlvbigmc3ZzYi0+aW5pdF9jb21wbGV0 aW9uKTsNCisJCWZsYWdzID0gY2xhaW1fbXRrX3N2c19sb2NrKCk7DQorCQlzdnNfc2V0X3BoYXNl KHN2cywgU1ZTQl9QSEFTRV9JTklUMDIpOw0KKwkJcmVsZWFzZV9tdGtfc3ZzX2xvY2soZmxhZ3Mp Ow0KKwkJdGltZV9sZWZ0ID0NCisJCQl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnN2c2It PmluaXRfY29tcGxldGlvbiwNCisJCQkJCQkgICAgbXNlY3NfdG9famlmZmllcygyMDAwKSk7DQor CQlpZiAoIXRpbWVfbGVmdCkgew0KKwkJCXByX2VycigiJXM6IGluaXQwMiBjb21wbGV0aW9uIHRp bWVvdXRcbiIsIHN2c2ItPm5hbWUpOw0KKwkJCXJldHVybiAtRUJVU1k7DQorCQl9DQorCX0NCisN CisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBpbnQgc3ZzX2luaXQwMShzdHJ1Y3QgbXRrX3N2 cyAqc3ZzKQ0KK3sNCisJY29uc3Qgc3RydWN0IHN2c19wbGF0Zm9ybSAqc3ZzcCA9IHN2cy0+cGxh dGZvcm07DQorCXN0cnVjdCBzdnNfYmFuayAqc3ZzYjsNCisJc3RydWN0IHBtX3Fvc19yZXF1ZXN0 ICpxb3NfcmVxdWVzdDsNCisJdW5zaWduZWQgbG9uZyBmbGFncywgdGltZV9sZWZ0Ow0KKwlib29s IHNlYXJjaF9kb25lOw0KKwlpbnQgcmV0Ow0KKwl1MzIgb3BwX2ZyZXFzLCBvcHBfdmJvb3QsIGJ1 Y2tfdm9sdCwgaWR4LCBpOw0KKw0KKwlxb3NfcmVxdWVzdCA9IGt6YWxsb2Moc2l6ZW9mKCpxb3Nf cmVxdWVzdCksIEdGUF9LRVJORUwpOw0KKwlpZiAoIXFvc19yZXF1ZXN0KQ0KKwkJcmV0dXJuIC1F Tk9NRU07DQorDQorCS8qIExldCBDUFVzIGxlYXZlIGlkbGUtb2ZmIHN0YXRlIGZvciBpbml0aWFs aXppbmcgc3ZzX2luaXQwMS4gKi8NCisJcG1fcW9zX2FkZF9yZXF1ZXN0KHFvc19yZXF1ZXN0LCBQ TV9RT1NfQ1BVX0RNQV9MQVRFTkNZLCAwKTsNCisNCisJLyoNCisJICogU29tZXRpbWVzIHR3byBz dnMgYmFua3MgdXNlIHRoZSBzYW1lIGJ1Y2suDQorCSAqIFRoZXJlZm9yZSwgd2Ugc2V0IGVhY2gg c3ZzIGJhbmsgdG8gdmJvb3Qgdm9sdGFnZSBmaXJzdC4NCisJICovDQorCWZvciAoaWR4ID0gMDsg aWR4IDwgc3ZzcC0+YmFua19udW07IGlkeCsrKSB7DQorCQlzdnNiID0gJnN2c3AtPmJhbmtzW2lk eF07DQorCQlzZWFyY2hfZG9uZSA9IGZhbHNlOw0KKw0KKwkJcmV0ID0gcmVndWxhdG9yX3NldF9t b2RlKHN2c2ItPmJ1Y2ssIFJFR1VMQVRPUl9NT0RFX0ZBU1QpOw0KKwkJaWYgKHJldCkNCisJCQlw cl9ub3RpY2UoIiVzOiBmYWlsIHRvIHNldCBmYXN0IG1vZGU6ICVkXG4iLA0KKwkJCQkgIHN2c2It Pm5hbWUsIHJldCk7DQorDQorCQlpZiAoc3ZzYi0+bXRjbW9zX3JlcXVlc3QpIHsNCisJCQlyZXQg PSByZWd1bGF0b3JfZW5hYmxlKHN2c2ItPmJ1Y2spOw0KKwkJCWlmIChyZXQpIHsNCisJCQkJcHJf ZXJyKCIlczogZmFpbCB0byBlbmFibGUgJXMgcG93ZXI6ICVkXG4iLA0KKwkJCQkgICAgICAgc3Zz Yi0+bmFtZSwgc3ZzYi0+YnVja19uYW1lLCByZXQpOw0KKwkJCQlnb3RvIGluaXQwMV9maW5pc2g7 DQorCQkJfQ0KKw0KKwkJCXJldCA9IGRldl9wbV9kb21haW5fYXR0YWNoKHN2c2ItPmRldiwgZmFs c2UpOw0KKwkJCWlmIChyZXQpIHsNCisJCQkJcHJfZXJyKCIlczogYXR0YWNoIHBtIGRvbWFpbiBm YWlsOiAlZFxuIiwNCisJCQkJICAgICAgIHN2c2ItPm5hbWUsIHJldCk7DQorCQkJCWdvdG8gaW5p dDAxX2ZpbmlzaDsNCisJCQl9DQorDQorCQkJcG1fcnVudGltZV9lbmFibGUoc3ZzYi0+ZGV2KTsN CisJCQlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKHN2c2ItPmRldik7DQorCQkJaWYgKHJldCA8 IDApIHsNCisJCQkJcHJfZXJyKCIlczogdHVybiBtdGNtb3Mgb24gZmFpbDogJWRcbiIsDQorCQkJ CSAgICAgICBzdnNiLT5uYW1lLCByZXQpOw0KKwkJCQlnb3RvIGluaXQwMV9maW5pc2g7DQorCQkJ fQ0KKwkJfQ0KKw0KKwkJLyoNCisJCSAqIEZpbmQgdGhlIGZhc3Rlc3QgZnJlcSB0aGF0IGNhbiBi ZSBydW4gYXQgdmJvb3QgYW5kDQorCQkgKiBmaXggdG8gdGhhdCBmcmVxIHVudGlsIHN2c19pbml0 MDEgaXMgZG9uZS4NCisJCSAqLw0KKwkJb3BwX3Zib290ID0gc3ZzYl92b2x0X3RvX29wcF92b2x0 KHN2c2ItPnZib290LA0KKwkJCQkJCSAgc3ZzYi0+dm9sdF9zdGVwLA0KKwkJCQkJCSAgc3ZzYi0+ dm9sdF9iYXNlKTsNCisNCisJCWZvciAoaSA9IDA7IGkgPCBzdnNiLT5vcHBfY291bnQ7IGkrKykg ew0KKwkJCW9wcF9mcmVxcyA9IHN2c2ItPm9wcF9mcmVxc1tpXTsNCisJCQlpZiAoIXNlYXJjaF9k b25lICYmIHN2c2ItPm9wcF92b2x0c1tpXSA8PSBvcHBfdmJvb3QpIHsNCisJCQkJcmV0ID0gZGV2 X3BtX29wcF9hZGp1c3Rfdm9sdGFnZShzdnNiLT5kZXYsDQorCQkJCQkJCQlvcHBfZnJlcXMsDQor CQkJCQkJCQlvcHBfdmJvb3QsDQorCQkJCQkJCQlvcHBfdmJvb3QsDQorCQkJCQkJCQlvcHBfdmJv b3QpOw0KKwkJCQlpZiAocmV0KSB7DQorCQkJCQlwcl9lcnIoIiVzOiBzZXQgdm9sdGFnZSBmYWls ZWQ6ICVkXG4iLA0KKwkJCQkJICAgICAgIHN2c2ItPm5hbWUsIHJldCk7DQorCQkJCQlnb3RvIGlu aXQwMV9maW5pc2g7DQorCQkJCX0NCisNCisJCQkJc2VhcmNoX2RvbmUgPSB0cnVlOw0KKwkJCX0g ZWxzZSB7DQorCQkJCWRldl9wbV9vcHBfZGlzYWJsZShzdnNiLT5kZXYsDQorCQkJCQkJICAgc3Zz Yi0+b3BwX2ZyZXFzW2ldKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyogc3ZzIGJhbmsgaW5p dDAxIGJlZ2lucyAqLw0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHN2c3AtPmJhbmtfbnVtOyBpZHgr Kykgew0KKwkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tpZHhdOw0KKwkJc3ZzLT5iYW5rID0gc3ZzYjsN CisNCisJCWlmICghKHN2c2ItPm1vZGVfc3VwcG9ydCAmIFNWU0JfTU9ERV9JTklUMDEpKQ0KKwkJ CWNvbnRpbnVlOw0KKw0KKwkJb3BwX3Zib290ID0gc3ZzYl92b2x0X3RvX29wcF92b2x0KHN2c2It PnZib290LA0KKwkJCQkJCSAgc3ZzYi0+dm9sdF9zdGVwLA0KKwkJCQkJCSAgc3ZzYi0+dm9sdF9i YXNlKTsNCisNCisJCWJ1Y2tfdm9sdCA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZShzdnNiLT5idWNr KTsNCisJCWlmIChidWNrX3ZvbHQgIT0gb3BwX3Zib290KSB7DQorCQkJcHJfZXJyKCIlczogYnVj ayB2b2x0YWdlOiAldSwgZXhwZWN0ZWQgdmJvb3Q6ICV1XG4iLA0KKwkJCSAgICAgICBzdnNiLT5u YW1lLCBidWNrX3ZvbHQsIG9wcF92Ym9vdCk7DQorCQkJcmV0ID0gLUVQRVJNOw0KKwkJCWdvdG8g aW5pdDAxX2ZpbmlzaDsNCisJCX0NCisNCisJCWluaXRfY29tcGxldGlvbigmc3ZzYi0+aW5pdF9j b21wbGV0aW9uKTsNCisJCWZsYWdzID0gY2xhaW1fbXRrX3N2c19sb2NrKCk7DQorCQlzdnNfc2V0 X3BoYXNlKHN2cywgU1ZTQl9QSEFTRV9JTklUMDEpOw0KKwkJcmVsZWFzZV9tdGtfc3ZzX2xvY2so ZmxhZ3MpOw0KKwkJdGltZV9sZWZ0ID0NCisJCQl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQo JnN2c2ItPmluaXRfY29tcGxldGlvbiwNCisJCQkJCQkgICAgbXNlY3NfdG9famlmZmllcygyMDAw KSk7DQorCQlpZiAoIXRpbWVfbGVmdCkgew0KKwkJCXByX2VycigiJXM6IGluaXQwMSBjb21wbGV0 aW9uIHRpbWVvdXRcbiIsIHN2c2ItPm5hbWUpOw0KKwkJCXJldCA9IC1FQlVTWTsNCisJCQlnb3Rv IGluaXQwMV9maW5pc2g7DQorCQl9DQorCX0NCisNCitpbml0MDFfZmluaXNoOg0KKwlmb3IgKGlk eCA9IDA7IGlkeCA8IHN2c3AtPmJhbmtfbnVtOyBpZHgrKykgew0KKwkJc3ZzYiA9ICZzdnNwLT5i YW5rc1tpZHhdOw0KKw0KKwkJZm9yIChpID0gMDsgaSA8IHN2c2ItPm9wcF9jb3VudDsgaSsrKQ0K KwkJCWRldl9wbV9vcHBfZW5hYmxlKHN2c2ItPmRldiwgc3ZzYi0+b3BwX2ZyZXFzW2ldKTsNCisN CisJCWlmIChyZWd1bGF0b3Jfc2V0X21vZGUoc3ZzYi0+YnVjaywgUkVHVUxBVE9SX01PREVfTk9S TUFMKSkNCisJCQlwcl9ub3RpY2UoIiVzOiBmYWlsIHRvIHNldCBub3JtYWwgbW9kZTogJWRcbiIs DQorCQkJCSAgc3ZzYi0+bmFtZSwgcmV0KTsNCisNCisJCWlmIChzdnNiLT5tdGNtb3NfcmVxdWVz dCkgew0KKwkJCWlmIChwbV9ydW50aW1lX3B1dF9zeW5jKHN2c2ItPmRldikpDQorCQkJCXByX2Vy cigiJXM6IHR1cm4gbXRjbW9zIG9mZiBmYWlsOiAlZFxuIiwNCisJCQkJICAgICAgIHN2c2ItPm5h bWUsIHJldCk7DQorCQkJcG1fcnVudGltZV9kaXNhYmxlKHN2c2ItPmRldik7DQorCQkJZGV2X3Bt X2RvbWFpbl9kZXRhY2goc3ZzYi0+ZGV2LCAwKTsNCisJCQlpZiAocmVndWxhdG9yX2Rpc2FibGUo c3ZzYi0+YnVjaykpDQorCQkJCXByX2VycigiJXM6IGZhaWwgdG8gZGlzYWJsZSAlcyBwb3dlcjog JWRcbiIsDQorCQkJCSAgICAgICBzdnNiLT5uYW1lLCBzdnNiLT5idWNrX25hbWUsIHJldCk7DQor CQl9DQorCX0NCisNCisJcG1fcW9zX3JlbW92ZV9yZXF1ZXN0KHFvc19yZXF1ZXN0KTsNCisJa2Zy ZWUocW9zX3JlcXVlc3QpOw0KKw0KKwlyZXR1cm4gcmV0Ow0KK30NCisNCitzdGF0aWMgaW50IHN2 c19zdGFydChzdHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0KK3sNCisJaW50IHJldDsNCisNCisJcmV0ID0g c3ZzX2luaXQwMShzdnMpOw0KKwlpZiAocmV0KQ0KKwkJcmV0dXJuIHJldDsNCisNCisJcmV0ID0g c3ZzX2luaXQwMihzdnMpOw0KKwlpZiAocmV0KQ0KKwkJcmV0dXJuIHJldDsNCisNCisJc3ZzX21v bl9tb2RlKHN2cyk7DQorDQorCXJldHVybiByZXQ7DQorfQ0KKw0KK3N0YXRpYyBib29sIHN2c19t dDgxODNfZWZ1c2VfcGFyc2luZyhzdHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0KK3sNCisJY29uc3Qgc3Ry dWN0IHN2c19wbGF0Zm9ybSAqc3ZzcCA9IHN2cy0+cGxhdGZvcm07DQorCXN0cnVjdCB0aGVybWFs X3BhcmFtZXRlciB0cDsNCisJc3RydWN0IHN2c19iYW5rICpzdnNiOw0KKwlib29sIG1vbl9tb2Rl X3N1cHBvcnQgPSB0cnVlOw0KKwlpbnQgZm9ybWF0WzZdLCB4X3Jvb210WzZdLCB0Yl9yb29tdCA9 IDA7DQorCXN0cnVjdCBudm1lbV9jZWxsICpjZWxsOw0KKwlzaXplX3QgbGVuOw0KKwl1MzIgaWR4 LCBpLCBmdF9wZ20sIG10cywgdGVtcDAsIHRlbXAxLCB0ZW1wMjsNCisNCisJaWYgKHN2c3AtPmZh a2VfZWZ1c2UpIHsNCisJCXByX25vdGljZSgiZmFrZSBlZnVzZVxuIik7DQorCQlzdnMtPmVmdXNl WzBdID0gMHgwMDMxMDA4MDsNCisJCXN2cy0+ZWZ1c2VbMV0gPSAweGFiZmJmNzU3Ow0KKwkJc3Zz LT5lZnVzZVsyXSA9IDB4NDdjNzQ3Yzc7DQorCQlzdnMtPmVmdXNlWzNdID0gMHhhYmZiZjc1NzsN CisJCXN2cy0+ZWZ1c2VbNF0gPSAweGU3ZmNhMGVjOw0KKwkJc3ZzLT5lZnVzZVs1XSA9IDB4NDdi ZjRiODg7DQorCQlzdnMtPmVmdXNlWzZdID0gMHhhYmZiOGZhNTsNCisJCXN2cy0+ZWZ1c2VbN10g PSAweGFiZmIyMTdiOw0KKwkJc3ZzLT5lZnVzZVs4XSA9IDB4NGJmMzRiZTE7DQorCQlzdnMtPmVm dXNlWzldID0gMHhhYmZiNjcwZDsNCisJCXN2cy0+ZWZ1c2VbMTZdID0gMHhhYmZiYzY1MzsNCisJ CXN2cy0+ZWZ1c2VbMTddID0gMHg0N2YzNDdlMTsNCisJCXN2cy0+ZWZ1c2VbMThdID0gMHhhYmZi ZDg0ODsNCisJfQ0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgc3ZzcC0+ZWZ1c2VfbnVtOyBpKyspDQor CQlpZiAoc3ZzLT5lZnVzZVtpXSkNCisJCQlwcl9ub3RpY2UoIk1fSFdfUkVTJWQ6IDB4JTA4eFxu IiwgaSwgc3ZzLT5lZnVzZVtpXSk7DQorDQorCS8qIHN2cyBlZnVzZSBwYXJzaW5nICovDQorCWZ0 X3BnbSA9IChzdnMtPmVmdXNlWzBdID4+IDQpICYgR0VOTUFTSygzLCAwKTsNCisNCisJZm9yIChp ZHggPSAwOyBpZHggPCBzdnNwLT5iYW5rX251bTsgaWR4KyspIHsNCisJCXN2c2IgPSAmc3ZzcC0+ YmFua3NbaWR4XTsNCisJCWlmIChmdF9wZ20gPD0gMSkNCisJCQlzdnNiLT5pbml0MDFfdm9sdF9m bGFnID0gU1ZTQl9JTklUMDFfVk9MVF9JR05PUkU7DQorDQorCQlzd2l0Y2ggKHN2c2ItPnN3X2lk KSB7DQorCQljYXNlIFNWU19DUFVfTElUVExFOg0KKwkJCXN2c2ItPmJkZXMgPSBzdnMtPmVmdXNl WzE2XSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+bWRlcyA9IChzdnMtPmVmdXNlWzE2XSA+ PiA4KSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+ZGNiZGV0ID0gKHN2cy0+ZWZ1c2VbMTZd ID4+IDE2KSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+ZGNtZGV0ID0gKHN2cy0+ZWZ1c2Vb MTZdID4+IDI0KSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+bXRkZXMgID0gKHN2cy0+ZWZ1 c2VbMTddID4+IDE2KSAmIEdFTk1BU0soNywgMCk7DQorDQorCQkJaWYgKGZ0X3BnbSA8PSAzKQ0K KwkJCQlzdnNiLT52b2x0X29mZnNldCArPSAxMDsNCisJCQllbHNlDQorCQkJCXN2c2ItPnZvbHRf b2Zmc2V0ICs9IDI7DQorCQkJYnJlYWs7DQorCQljYXNlIFNWU19DUFVfQklHOg0KKwkJCXN2c2It PmJkZXMgPSBzdnMtPmVmdXNlWzE4XSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+bWRlcyA9 IChzdnMtPmVmdXNlWzE4XSA+PiA4KSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+ZGNiZGV0 ID0gKHN2cy0+ZWZ1c2VbMThdID4+IDE2KSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+ZGNt ZGV0ID0gKHN2cy0+ZWZ1c2VbMThdID4+IDI0KSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+ bXRkZXMgID0gc3ZzLT5lZnVzZVsxN10gJiBHRU5NQVNLKDcsIDApOw0KKw0KKwkJCWlmIChmdF9w Z20gPD0gMykNCisJCQkJc3ZzYi0+dm9sdF9vZmZzZXQgKz0gMTU7DQorCQkJZWxzZQ0KKwkJCQlz dnNiLT52b2x0X29mZnNldCArPSAxMjsNCisJCQlicmVhazsNCisJCWNhc2UgU1ZTX0NDSToNCisJ CQlzdnNiLT5iZGVzID0gc3ZzLT5lZnVzZVs0XSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+ bWRlcyA9IChzdnMtPmVmdXNlWzRdID4+IDgpICYgR0VOTUFTSyg3LCAwKTsNCisJCQlzdnNiLT5k Y2JkZXQgPSAoc3ZzLT5lZnVzZVs0XSA+PiAxNikgJiBHRU5NQVNLKDcsIDApOw0KKwkJCXN2c2It PmRjbWRldCA9IChzdnMtPmVmdXNlWzRdID4+IDI0KSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3Zz Yi0+bXRkZXMgID0gKHN2cy0+ZWZ1c2VbNV0gPj4gMTYpICYgR0VOTUFTSyg3LCAwKTsNCisNCisJ CQlpZiAoZnRfcGdtIDw9IDMpDQorCQkJCXN2c2ItPnZvbHRfb2Zmc2V0ICs9IDEwOw0KKwkJCWVs c2UNCisJCQkJc3ZzYi0+dm9sdF9vZmZzZXQgKz0gMjsNCisJCQlicmVhazsNCisJCWNhc2UgU1ZT X0dQVToNCisJCQlzdnNiLT5iZGVzID0gc3ZzLT5lZnVzZVs2XSAmIEdFTk1BU0soNywgMCk7DQor CQkJc3ZzYi0+bWRlcyA9IChzdnMtPmVmdXNlWzZdID4+IDgpICYgR0VOTUFTSyg3LCAwKTsNCisJ CQlzdnNiLT5kY2JkZXQgPSAoc3ZzLT5lZnVzZVs2XSA+PiAxNikgJiBHRU5NQVNLKDcsIDApOw0K KwkJCXN2c2ItPmRjbWRldCA9IChzdnMtPmVmdXNlWzZdID4+IDI0KSAmIEdFTk1BU0soNywgMCk7 DQorCQkJc3ZzYi0+bXRkZXMgID0gc3ZzLT5lZnVzZVs1XSAmIEdFTk1BU0soNywgMCk7DQorDQor CQkJaWYgKGZ0X3BnbSA+PSAyKSB7DQorCQkJCXN2c2ItPmZyZXFfYmFzZSA9IDgwMDAwMDAwMDsg LyogODAwTUh6ICovDQorCQkJCXN2c2ItPmR2dF9maXhlZCA9IDI7DQorCQkJfQ0KKwkJCWJyZWFr Ow0KKwkJZGVmYXVsdDoNCisJCQlicmVhazsNCisJCX0NCisJfQ0KKw0KKwlpZiAoc3ZzcC0+ZmFr ZV9lZnVzZSkgew0KKwkJc3ZzLT50aGVybWFsX2VmdXNlWzBdID0gMHgwMjg3M2Y2OTsNCisJCXN2 cy0+dGhlcm1hbF9lZnVzZVsxXSA9IDB4YTExZDkxNDI7DQorCQlzdnMtPnRoZXJtYWxfZWZ1c2Vb Ml0gPSAweGEyNTI2OTAwOw0KKwl9IGVsc2Ugew0KKwkJLyogR2V0IHRoZXJtYWwgZWZ1c2UgYnkg bnZtZW0gKi8NCisJCWNlbGwgPSBudm1lbV9jZWxsX2dldChzdnMtPmRldiwgImNhbGlicmF0aW9u LWRhdGEiKTsNCisJCWlmIChJU19FUlIoY2VsbCkpIHsNCisJCQlwcl9lcnIoIm5vIHRoZXJtYWwg ZWZ1c2U/IGRpc2FibGUgbW9uIG1vZGVcbiIpOw0KKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgc3Zz cC0+YmFua19udW07IGlkeCsrKSB7DQorCQkJCXN2c2IgPSAmc3ZzcC0+YmFua3NbaWR4XTsNCisJ CQkJc3ZzYi0+bW9kZV9zdXBwb3J0ICY9IH5TVlNCX01PREVfTU9OOw0KKwkJCX0NCisNCisJCQly ZXR1cm4gdHJ1ZTsNCisJCX0NCisNCisJCXN2cy0+dGhlcm1hbF9lZnVzZSA9ICh1MzIgKiludm1l bV9jZWxsX3JlYWQoY2VsbCwgJmxlbik7DQorCQludm1lbV9jZWxsX3B1dChjZWxsKTsNCisJfQ0K Kw0KKwkvKiBUaGVybWFsIGVmdXNlIHBhcnNpbmcgKi8NCisJdHAuYWRjX2dlX3QgPSAoc3ZzLT50 aGVybWFsX2VmdXNlWzFdID4+IDIyKSAmIEdFTk1BU0soOSwgMCk7DQorCXRwLmFkY19vZV90ID0g KHN2cy0+dGhlcm1hbF9lZnVzZVsxXSA+PiAxMikgJiBHRU5NQVNLKDksIDApOw0KKw0KKwl0cC5v X3Z0c21jdTEgPSAoc3ZzLT50aGVybWFsX2VmdXNlWzBdID4+IDE3KSAmIEdFTk1BU0soOCwgMCk7 DQorCXRwLm9fdnRzbWN1MiA9IChzdnMtPnRoZXJtYWxfZWZ1c2VbMF0gPj4gOCkgJiBHRU5NQVNL KDgsIDApOw0KKwl0cC5vX3Z0c21jdTMgPSBzdnMtPnRoZXJtYWxfZWZ1c2VbMV0gJiBHRU5NQVNL KDgsIDApOw0KKwl0cC5vX3Z0c21jdTQgPSAoc3ZzLT50aGVybWFsX2VmdXNlWzJdID4+IDIzKSAm IEdFTk1BU0soOCwgMCk7DQorCXRwLm9fdnRzbWN1NSA9IChzdnMtPnRoZXJtYWxfZWZ1c2VbMl0g Pj4gNSkgJiBHRU5NQVNLKDgsIDApOw0KKwl0cC5vX3Z0c2FiYiA9IChzdnMtPnRoZXJtYWxfZWZ1 c2VbMl0gPj4gMTQpICYgR0VOTUFTSyg4LCAwKTsNCisNCisJdHAuZGVnY19jYWxpID0gKHN2cy0+ dGhlcm1hbF9lZnVzZVswXSA+PiAxKSAmIEdFTk1BU0soNSwgMCk7DQorCXRwLmFkY19jYWxpX2Vu X3QgPSBzdnMtPnRoZXJtYWxfZWZ1c2VbMF0gJiBCSVQoMCk7DQorCXRwLm9fc2xvcGVfc2lnbiA9 IChzdnMtPnRoZXJtYWxfZWZ1c2VbMF0gPj4gNykgJiBCSVQoMCk7DQorDQorCXRwLnRzX2lkID0g KHN2cy0+dGhlcm1hbF9lZnVzZVsxXSA+PiA5KSAmIEJJVCgwKTsNCisJdHAub19zbG9wZSA9IChz dnMtPnRoZXJtYWxfZWZ1c2VbMF0gPj4gMjYpICYgR0VOTUFTSyg1LCAwKTsNCisNCisJaWYgKHRw LmFkY19jYWxpX2VuX3QgPT0gMSkgew0KKwkJaWYgKCF0cC50c19pZCkNCisJCQl0cC5vX3Nsb3Bl ID0gMDsNCisNCisJCWlmICgodHAuYWRjX2dlX3QgPCAyNjUgfHwgdHAuYWRjX2dlX3QgPiA3NTgp IHx8DQorCQkgICAgKHRwLmFkY19vZV90IDwgMjY1IHx8IHRwLmFkY19vZV90ID4gNzU4KSB8fA0K KwkJICAgICh0cC5vX3Z0c21jdTEgPCAtOCB8fCB0cC5vX3Z0c21jdTEgPiA0ODQpIHx8DQorCQkg ICAgKHRwLm9fdnRzbWN1MiA8IC04IHx8IHRwLm9fdnRzbWN1MiA+IDQ4NCkgfHwNCisJCSAgICAo dHAub192dHNtY3UzIDwgLTggfHwgdHAub192dHNtY3UzID4gNDg0KSB8fA0KKwkJICAgICh0cC5v X3Z0c21jdTQgPCAtOCB8fCB0cC5vX3Z0c21jdTQgPiA0ODQpIHx8DQorCQkgICAgKHRwLm9fdnRz bWN1NSA8IC04IHx8IHRwLm9fdnRzbWN1NSA+IDQ4NCkgfHwNCisJCSAgICAodHAub192dHNhYmIg PCAtOCB8fCB0cC5vX3Z0c2FiYiA+IDQ4NCkgfHwNCisJCSAgICAodHAuZGVnY19jYWxpIDwgMSB8 fCB0cC5kZWdjX2NhbGkgPiA2MykpIHsNCisJCQlwcl9lcnIoImJhZCB0aGVybWFsIGVmdXNlIGRh dGEsIGRpc2FibGUgbW9uIG1vZGVcbiIpOw0KKwkJCW1vbl9tb2RlX3N1cHBvcnQgPSBmYWxzZTsN CisJCX0NCisJfSBlbHNlIHsNCisJCXByX2Vycigibm8gdGhlcm1hbCBlZnVzZSBkYXRhLCBkaXNh YmxlIG1vbiBtb2RlXG4iKTsNCisJCW1vbl9tb2RlX3N1cHBvcnQgPSBmYWxzZTsNCisJfQ0KKw0K KwlpZiAoIW1vbl9tb2RlX3N1cHBvcnQpIHsNCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgc3ZzcC0+ YmFua19udW07IGlkeCsrKSB7DQorCQkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tpZHhdOw0KKwkJCXN2 c2ItPm1vZGVfc3VwcG9ydCAmPSB+U1ZTQl9NT0RFX01PTjsNCisJCX0NCisNCisJCXJldHVybiB0 cnVlOw0KKwl9DQorDQorCXRwLmdlID0gKCh0cC5hZGNfZ2VfdCAtIDUxMikgKiAxMDAwMCkgLyA0 MDk2Ow0KKwl0cC5vZSA9ICh0cC5hZGNfb2VfdCAtIDUxMik7DQorCXRwLmdhaW4gPSAoMTAwMDAg KyB0cC5nZSk7DQorDQorCWZvcm1hdFswXSA9ICh0cC5vX3Z0c21jdTEgKyAzMzUwIC0gdHAub2Up Ow0KKwlmb3JtYXRbMV0gPSAodHAub192dHNtY3UyICsgMzM1MCAtIHRwLm9lKTsNCisJZm9ybWF0 WzJdID0gKHRwLm9fdnRzbWN1MyArIDMzNTAgLSB0cC5vZSk7DQorCWZvcm1hdFszXSA9ICh0cC5v X3Z0c21jdTQgKyAzMzUwIC0gdHAub2UpOw0KKwlmb3JtYXRbNF0gPSAodHAub192dHNtY3U1ICsg MzM1MCAtIHRwLm9lKTsNCisJZm9ybWF0WzVdID0gKHRwLm9fdnRzYWJiICsgMzM1MCAtIHRwLm9l KTsNCisNCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykNCisJCXhfcm9vbXRbaV0gPSAoKChmb3Jt YXRbaV0gKiAxMDAwMCkgLyA0MDk2KSAqIDEwMDAwKSAvIHRwLmdhaW47DQorDQorCXRlbXAwID0g KDEwMDAwICogMTAwMDAwIC8gdHAuZ2FpbikgKiAxNSAvIDE4Ow0KKw0KKwlpZiAoIXRwLm9fc2xv cGVfc2lnbikNCisJCW10cyA9ICh0ZW1wMCAqIDEwKSAvICgxNTM0ICsgdHAub19zbG9wZSAqIDEw KTsNCisJZWxzZQ0KKwkJbXRzID0gKHRlbXAwICogMTApIC8gKDE1MzQgLSB0cC5vX3Nsb3BlICog MTApOw0KKw0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHN2c3AtPmJhbmtfbnVtOyBpZHgrKykgew0K KwkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tpZHhdOw0KKwkJc3ZzYi0+bXRzID0gbXRzOw0KKw0KKwkJ c3dpdGNoIChzdnNiLT5zd19pZCkgew0KKwkJY2FzZSBTVlNfQ1BVX0xJVFRMRToNCisJCQl0Yl9y b29tdCA9IHhfcm9vbXRbM107DQorCQkJYnJlYWs7DQorCQljYXNlIFNWU19DUFVfQklHOg0KKwkJ CXRiX3Jvb210ID0geF9yb29tdFs0XTsNCisJCQlicmVhazsNCisJCWNhc2UgU1ZTX0NDSToNCisJ CQl0Yl9yb29tdCA9IHhfcm9vbXRbM107DQorCQkJYnJlYWs7DQorCQljYXNlIFNWU19HUFU6DQor CQkJdGJfcm9vbXQgPSB4X3Jvb210WzFdOw0KKwkJCWJyZWFrOw0KKwkJZGVmYXVsdDoNCisJCQli cmVhazsNCisJCX0NCisNCisJCXRlbXAwID0gKHRwLmRlZ2NfY2FsaSAqIDEwIC8gMik7DQorCQl0 ZW1wMSA9ICgoMTAwMDAgKiAxMDAwMDAgLyA0MDk2IC8gdHAuZ2FpbikgKg0KKwkJCSB0cC5vZSAr IHRiX3Jvb210ICogMTApICogMTUgLyAxODsNCisNCisJCWlmICghdHAub19zbG9wZV9zaWduKQ0K KwkJCXRlbXAyID0gdGVtcDEgKiAxMDAgLyAoMTUzNCArIHRwLm9fc2xvcGUgKiAxMCk7DQorCQll bHNlDQorCQkJdGVtcDIgPSB0ZW1wMSAqIDEwMCAvICgxNTM0IC0gdHAub19zbG9wZSAqIDEwKTsN CisNCisJCXN2c2ItPmJ0cyA9ICh0ZW1wMCArIHRlbXAyIC0gMjUwKSAqIDQgLyAxMDsNCisJfQ0K Kw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorc3RhdGljIGJvb2wgc3ZzX2lzX3N1cHBvcnRlZChz dHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0KK3sNCisJY29uc3Qgc3RydWN0IHN2c19wbGF0Zm9ybSAqc3Zz cCA9IHN2cy0+cGxhdGZvcm07DQorCXN0cnVjdCBudm1lbV9jZWxsICpjZWxsOw0KKwlzaXplX3Qg bGVuOw0KKwlib29sIHJldDsNCisNCisJaWYgKHN2c3AtPmZha2VfZWZ1c2UpIHsNCisJCWxlbiA9 IHN2c3AtPmVmdXNlX251bSAqIHNpemVvZih1MzIpOw0KKwkJc3ZzLT5lZnVzZSA9IGRldm1fa3ph bGxvYyhzdnMtPmRldiwgbGVuLCBHRlBfS0VSTkVMKTsNCisJCWlmICghc3ZzLT5lZnVzZSkgew0K KwkJCXByX2Vycigibm8gbWVtb3J5IGZvciBhbGxvY2F0aW5nIHN2c19lZnVzZVxuIik7DQorCQkJ cmV0dXJuIGZhbHNlOw0KKwkJfQ0KKw0KKwkJbGVuID0gc3ZzcC0+dGhlcm1hbF9lZnVzZV9udW0g KiBzaXplb2YodTMyKTsNCisJCXN2cy0+dGhlcm1hbF9lZnVzZSA9IGRldm1fa3phbGxvYyhzdnMt PmRldiwgbGVuLCBHRlBfS0VSTkVMKTsNCisJCWlmICghc3ZzLT50aGVybWFsX2VmdXNlKSB7DQor CQkJcHJfZXJyKCJubyBtZW1vcnkgZm9yIGFsbG9jYXRpbmcgc3ZzX3RoZXJtYWxfZWZ1c2VcbiIp Ow0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisNCisJCWdvdG8gc3ZzcF9lZnVzZV9wYXJzaW5n Ow0KKwl9DQorDQorCS8qIEdldCBzdnMgZWZ1c2UgYnkgbnZtZW0gKi8NCisJY2VsbCA9IG52bWVt X2NlbGxfZ2V0KHN2cy0+ZGV2LCAic3ZzLWNhbGlicmF0aW9uLWRhdGEiKTsNCisJaWYgKElTX0VS UihjZWxsKSkgew0KKwkJcHJfZXJyKCJubyBcInN2cy1jYWxpYnJhdGlvbi1kYXRhXCIgZnJvbSBk dHM/IGRpc2FibGUgc3ZzXG4iKTsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwlzdnMtPmVm dXNlID0gKHUzMiAqKW52bWVtX2NlbGxfcmVhZChjZWxsLCAmbGVuKTsNCisJbnZtZW1fY2VsbF9w dXQoY2VsbCk7DQorDQorCWlmICghc3ZzLT5lZnVzZVtzdnNwLT5lZnVzZV9jaGVja10pIHsNCisJ CXByX2Vycigic3ZzX2VmdXNlWyV1XSA9IDB4JXg/XG4iLA0KKwkJICAgICAgIHN2c3AtPmVmdXNl X2NoZWNrLCBzdnMtPmVmdXNlW3N2c3AtPmVmdXNlX2NoZWNrXSk7DQorCQlyZXR1cm4gZmFsc2U7 DQorCX0NCisNCitzdnNwX2VmdXNlX3BhcnNpbmc6DQorCXJldCA9IHN2c3AtPmVmdXNlX3BhcnNp bmcoc3ZzKTsNCisNCisJcmV0dXJuIHJldDsNCit9DQorDQorc3RhdGljIGludCBzdnNfcmVzb3Vy Y2Vfc2V0dXAoc3RydWN0IG10a19zdnMgKnN2cykNCit7DQorCWNvbnN0IHN0cnVjdCBzdnNfcGxh dGZvcm0gKnN2c3AgPSBzdnMtPnBsYXRmb3JtOw0KKwlzdHJ1Y3Qgc3ZzX2JhbmsgKnN2c2I7DQor CXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7DQorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAg PSBOVUxMOw0KKwlzdHJ1Y3QgZGV2X3BtX29wcCAqb3BwOw0KKwl1bnNpZ25lZCBsb25nIGZyZXE7 DQorCWludCBjb3VudCwgcmV0Ow0KKwl1MzIgaWR4LCBpOw0KKw0KKwlmb3IgKGlkeCA9IDA7IGlk eCA8IHN2c3AtPmJhbmtfbnVtOyBpZHgrKykgew0KKwkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tpZHhd Ow0KKw0KKwkJc3dpdGNoIChzdnNiLT5zd19pZCkgew0KKwkJY2FzZSBTVlNfQ1BVX0xJVFRMRToN CisJCQlzdnNiLT5uYW1lID0gIlNWU19DUFVfTElUVExFIjsNCisJCQlicmVhazsNCisJCWNhc2Ug U1ZTX0NQVV9CSUc6DQorCQkJc3ZzYi0+bmFtZSA9ICJTVlNfQ1BVX0JJRyI7DQorCQkJYnJlYWs7 DQorCQljYXNlIFNWU19DQ0k6DQorCQkJc3ZzYi0+bmFtZSA9ICJTVlNfQ0NJIjsNCisJCQlicmVh azsNCisJCWNhc2UgU1ZTX0dQVToNCisJCQlzdnNiLT5uYW1lID0gIlNWU19HUFUiOw0KKwkJCWJy ZWFrOw0KKwkJZGVmYXVsdDoNCisJCQlXQVJOX09OKDEpOw0KKwkJCXJldHVybiAtRUlOVkFMOw0K KwkJfQ0KKw0KKwkJLyogQWRkIHN2cyBiYW5rIGRldmljZSBmb3Igb3BwLXRhYmxlL210Y21vcy9i dWNrIGNvbnRyb2wgKi8NCisJCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2Moc3ZzYi0+bmFt ZSwgMCk7DQorCQlpZiAoIXBkZXYpIHsNCisJCQlwcl9lcnIoIiVzOiBmYWlsIHRvIGFsbG9jIHBk ZXYgZm9yIHN2c19iYW5rXG4iLA0KKwkJCSAgICAgICBzdnNiLT5uYW1lKTsNCisJCQlyZXR1cm4g LUVOT01FTTsNCisJCX0NCisNCisJCWZvcl9lYWNoX2NoaWxkX29mX25vZGUoc3ZzLT5kZXYtPm9m X25vZGUsIG5wKSB7DQorCQkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCBzdnNiLT5v Zl9jb21wYXRpYmxlKSkgew0KKwkJCQlwZGV2LT5kZXYub2Zfbm9kZSA9IG5wOw0KKwkJCQlicmVh azsNCisJCQl9DQorCQl9DQorDQorCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOw0K KwkJaWYgKHJldCkgew0KKwkJCXByX2VycigiJXM6IGZhaWwgdG8gYWRkIHN2c19iYW5rIGRldmlj ZTogJWRcbiIsDQorCQkJICAgICAgIHN2c2ItPm5hbWUsIHJldCk7DQorCQkJcmV0dXJuIHJldDsN CisJCX0NCisNCisJCXN2c2ItPmRldiA9ICZwZGV2LT5kZXY7DQorCQlkZXZfc2V0X2RydmRhdGEo c3ZzYi0+ZGV2LCBzdnMpOw0KKwkJcmV0ID0gZGV2X3BtX29wcF9vZl9hZGRfdGFibGUoc3ZzYi0+ ZGV2KTsNCisJCWlmIChyZXQpIHsNCisJCQlwcl9lcnIoIiVzOiBmYWlsIHRvIGFkZCBvcHAgdGFi bGU6ICVkXG4iLA0KKwkJCSAgICAgICBzdnNiLT5uYW1lLCByZXQpOw0KKwkJCXJldHVybiByZXQ7 DQorCQl9DQorDQorCQltdXRleF9pbml0KCZzdnNiLT5sb2NrKTsNCisNCisJCXN2c2ItPmJ1Y2sg PSBkZXZtX3JlZ3VsYXRvcl9nZXRfb3B0aW9uYWwoc3ZzYi0+ZGV2LA0KKwkJCQkJCQkgc3ZzYi0+ YnVja19uYW1lKTsNCisJCWlmIChJU19FUlIoc3ZzYi0+YnVjaykpIHsNCisJCQlwcl9lcnIoIiVz OiBjYW5ub3QgZ2V0IHJlZ3VsYXRvciBcIiVzLXN1cHBseVwiXG4iLA0KKwkJCSAgICAgICBzdnNi LT5uYW1lLCBzdnNiLT5idWNrX25hbWUpOw0KKwkJCXJldHVybiBQVFJfRVJSKHN2c2ItPmJ1Y2sp Ow0KKwkJfQ0KKw0KKwkJY291bnQgPSBkZXZfcG1fb3BwX2dldF9vcHBfY291bnQoc3ZzYi0+ZGV2 KTsNCisJCWlmIChzdnNiLT5vcHBfY291bnQgIT0gY291bnQpIHsNCisJCQlwcl9lcnIoIiVzOiBv cHBfY291bnQgbm90IFwiJXVcIiBidXQgZ2V0IFwiJWRcIj9cbiIsDQorCQkJICAgICAgIHN2c2It Pm5hbWUsIHN2c2ItPm9wcF9jb3VudCwgY291bnQpOw0KKwkJCXJldHVybiBjb3VudDsNCisJCX0N CisNCisJCWZvciAoaSA9IDAsIGZyZXEgPSBVMzJfTUFYOyBpIDwgc3ZzYi0+b3BwX2NvdW50OyBp KyssIGZyZXEtLSkgew0KKwkJCW9wcCA9IGRldl9wbV9vcHBfZmluZF9mcmVxX2Zsb29yKHN2c2It PmRldiwgJmZyZXEpOw0KKwkJCWlmIChJU19FUlIob3BwKSkgew0KKwkJCQlwcl9lcnIoIiVzOiBl cnJvciBvcHAgZW50cnkhISwgZXJyID0gJWxkXG4iLA0KKwkJCQkgICAgICAgc3ZzYi0+bmFtZSwg UFRSX0VSUihvcHApKTsNCisJCQkJcmV0dXJuIFBUUl9FUlIob3BwKTsNCisJCQl9DQorDQorCQkJ c3ZzYi0+b3BwX2ZyZXFzW2ldID0gZnJlcTsNCisJCQlzdnNiLT5vcHBfdm9sdHNbaV0gPSBkZXZf cG1fb3BwX2dldF92b2x0YWdlKG9wcCk7DQorCQkJc3ZzYi0+ZnJlcXNfcGN0W2ldID0gcGVyY2Vu dChzdnNiLT5vcHBfZnJlcXNbaV0sDQorCQkJCQkJICAgICBzdnNiLT5mcmVxX2Jhc2UpOw0KKwkJ CWRldl9wbV9vcHBfcHV0KG9wcCk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0K K3N0YXRpYyBpbnQgc3ZzX3BtX29wc19wcmVwYXJlKHN0cnVjdCBkZXZpY2UgKmRldikNCit7DQor CXN0cnVjdCBtdGtfc3ZzICpzdnMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsNCisJY29uc3Qgc3Ry dWN0IHN2c19wbGF0Zm9ybSAqc3ZzcCA9IHN2cy0+cGxhdGZvcm07DQorCXN0cnVjdCBzdnNfYmFu ayAqc3ZzYjsNCisJdW5zaWduZWQgbG9uZyBmbGFnczsNCisJaW50IHJldDsNCisJdTMyIGlkeDsN CisNCisJLyogV2FpdCBpZiB0aGVyZSBpcyBwcm9jZXNzaW5nIHN2c19pc3IoKS4gU3VzcGVuZCBh bGwgYmFua3MuICovDQorCWZsYWdzID0gY2xhaW1fbXRrX3N2c19sb2NrKCk7DQorCWZvciAoaWR4 ID0gMDsgaWR4IDwgc3ZzcC0+YmFua19udW07IGlkeCsrKSB7DQorCQlzdnNiID0gJnN2c3AtPmJh bmtzW2lkeF07DQorCQlzdnMtPmJhbmsgPSBzdnNiOw0KKwkJc3ZzX3N3aXRjaF9iYW5rKHN2cyk7 DQorCQlzdnNfd3JpdGVsKHN2cywgU1ZTRU5fT0ZGLCBTVlNFTik7DQorCQlzdnNfd3JpdGVsKHN2 cywgSU5UU1RTX0NMRUFOLCBJTlRTVFMpOw0KKwkJc3ZzYi0+c3VzcGVuZGVkID0gdHJ1ZTsNCisJ fQ0KKwlyZWxlYXNlX210a19zdnNfbG9jayhmbGFncyk7DQorDQorCWZvciAoaWR4ID0gMDsgaWR4 IDwgc3ZzcC0+YmFua19udW07IGlkeCsrKSB7DQorCQlzdnNiID0gJnN2c3AtPmJhbmtzW2lkeF07 DQorCQlpZiAoc3ZzYi0+cGhhc2UgIT0gU1ZTQl9QSEFTRV9JTklUMDEpIHsNCisJCQlzdnNiLT5w aGFzZSA9IFNWU0JfUEhBU0VfRVJST1I7DQorCQkJc3ZzYl9zZXRfdm9sdHMoc3ZzYiwgdHJ1ZSk7 DQorCQl9DQorCX0NCisNCisJaWYgKHN2c3AtPm5lZWRfaHdfcmVzZXQpIHsNCisJCXJldCA9IGRl dmljZV9yZXNldChzdnMtPmRldik7DQorCQlpZiAocmV0KSB7DQorCQkJcHJfZXJyKCIlczogcmV0 ID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOw0KKwkJCXJldHVybiByZXQ7DQorCQl9DQorCX0NCisN CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHN2cy0+bWFpbl9jbGspOw0KKw0KKwlyZXR1cm4gMDsN Cit9DQorDQorc3RhdGljIHZvaWQgc3ZzX3BtX29wc19jb21wbGV0ZShzdHJ1Y3QgZGV2aWNlICpk ZXYpDQorew0KKwlzdHJ1Y3QgbXRrX3N2cyAqc3ZzID0gZGV2X2dldF9kcnZkYXRhKGRldik7DQor CWNvbnN0IHN0cnVjdCBzdnNfcGxhdGZvcm0gKnN2c3AgPSBzdnMtPnBsYXRmb3JtOw0KKwlzdHJ1 Y3Qgc3ZzX2JhbmsgKnN2c2I7DQorCWludCByZXQ7DQorCXUzMiBpZHg7DQorDQorCXJldCA9IGNs a19wcmVwYXJlX2VuYWJsZShzdnMtPm1haW5fY2xrKTsNCisJaWYgKHJldCkgew0KKwkJcHJfZXJy KCJjYW5ub3QgZW5hYmxlIG1haW5fY2xrLCBkaXNhYmxlIHN2c1xuIik7DQorCQlyZXR1cm47DQor CX0NCisNCisJZm9yIChpZHggPSAwOyBpZHggPCBzdnNwLT5iYW5rX251bTsgaWR4KyspIHsNCisJ CXN2c2IgPSAmc3ZzcC0+YmFua3NbaWR4XTsNCisJCXN2c2ItPnN1c3BlbmRlZCA9IGZhbHNlOw0K Kwl9DQorDQorCXJldCA9IHN2c19pbml0MDIoc3ZzKTsNCisJaWYgKHJldCkNCisJCXJldHVybjsN CisNCisJc3ZzX21vbl9tb2RlKHN2cyk7DQorfQ0KKw0KK3N0YXRpYyBpbnQgc3ZzX2RlYnVnX3By b2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpDQorew0KKwlzdHJ1Y3Qgc3ZzX2Jh bmsgKnN2c2IgPSAoc3RydWN0IHN2c19iYW5rICopbS0+cHJpdmF0ZTsNCisNCisJaWYgKHN2c2It PnBoYXNlID09IFNWU0JfUEhBU0VfSU5JVDAxKQ0KKwkJc2VxX3B1dHMobSwgImluaXQxXG4iKTsN CisJZWxzZSBpZiAoc3ZzYi0+cGhhc2UgPT0gU1ZTQl9QSEFTRV9JTklUMDIpDQorCQlzZXFfcHV0 cyhtLCAiaW5pdDJcbiIpOw0KKwllbHNlIGlmIChzdnNiLT5waGFzZSA9PSBTVlNCX1BIQVNFX01P TikNCisJCXNlcV9wdXRzKG0sICJtb24gbW9kZVxuIik7DQorCWVsc2UgaWYgKHN2c2ItPnBoYXNl ID09IFNWU0JfUEhBU0VfRVJST1IpDQorCQlzZXFfcHV0cyhtLCAiZGlzYWJsZWRcbiIpOw0KKwll bHNlDQorCQlzZXFfcHV0cyhtLCAidW5rbm93blxuIik7DQorDQorCXJldHVybiAwOw0KK30NCisN CitzdGF0aWMgc3NpemVfdCBzdnNfZGVidWdfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwN CisJCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsDQorCQkJCSAgICBzaXplX3QgY291 bnQsIGxvZmZfdCAqcG9zKQ0KK3sNCisJc3RydWN0IHN2c19iYW5rICpzdnNiID0gKHN0cnVjdCBz dnNfYmFuayAqKVBERV9EQVRBKGZpbGVfaW5vZGUoZmlsZSkpOw0KKwlzdHJ1Y3QgbXRrX3N2cyAq c3ZzID0gZGV2X2dldF9kcnZkYXRhKHN2c2ItPmRldik7DQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 DQorCWludCBlbmFibGVkLCByZXQ7DQorCWNoYXIgKmJ1ZiA9IE5VTEw7DQorDQorCWlmIChjb3Vu dCA+PSBQQUdFX1NJWkUpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJYnVmID0gKGNoYXIgKilt ZW1kdXBfdXNlcl9udWwoYnVmZmVyLCBjb3VudCk7DQorCWlmIChJU19FUlIoYnVmKSkNCisJCXJl dHVybiBQVFJfRVJSKGJ1Zik7DQorDQorCXJldCA9IGtzdHJ0b2ludChidWYsIDEwLCAmZW5hYmxl ZCk7DQorCWlmIChyZXQpDQorCQlyZXR1cm4gcmV0Ow0KKw0KKwlpZiAoIWVuYWJsZWQpIHsNCisJ CWZsYWdzID0gY2xhaW1fbXRrX3N2c19sb2NrKCk7DQorCQlzdnMtPmJhbmsgPSBzdnNiOw0KKwkJ c3ZzYi0+bW9kZV9zdXBwb3J0ID0gU1ZTQl9NT0RFX0FMTF9ESVNBQkxFOw0KKwkJc3ZzX3N3aXRj aF9iYW5rKHN2cyk7DQorCQlzdnNfd3JpdGVsKHN2cywgU1ZTRU5fT0ZGLCBTVlNFTik7DQorCQlz dnNfd3JpdGVsKHN2cywgSU5UU1RTX0NMRUFOLCBJTlRTVFMpOw0KKwkJcmVsZWFzZV9tdGtfc3Zz X2xvY2soZmxhZ3MpOw0KKw0KKwkJc3ZzYi0+cGhhc2UgPSBTVlNCX1BIQVNFX0VSUk9SOw0KKwkJ c3ZzYl9zZXRfdm9sdHMoc3ZzYiwgdHJ1ZSk7DQorCX0NCisNCisJa2ZyZWUoYnVmKTsNCisNCisJ cmV0dXJuIGNvdW50Ow0KK30NCisNCitwcm9jX2ZvcHNfcncoc3ZzX2RlYnVnKTsNCisNCitzdGF0 aWMgaW50IHN2c19kdW1wX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpDQor ew0KKwlzdHJ1Y3QgbXRrX3N2cyAqc3ZzID0gKHN0cnVjdCBtdGtfc3ZzICopbS0+cHJpdmF0ZTsN CisJY29uc3Qgc3RydWN0IHN2c19wbGF0Zm9ybSAqc3ZzcCA9IHN2cy0+cGxhdGZvcm07DQorCXN0 cnVjdCBzdnNfYmFuayAqc3ZzYjsNCisJdW5zaWduZWQgbG9uZyBzdnNfcmVnX2FkZHI7DQorCXUz MiBpZHgsIGksIGo7DQorDQorCWZvciAoaSA9IDA7IGkgPCBzdnNwLT5lZnVzZV9udW07IGkrKykN CisJCWlmIChzdnMtPmVmdXNlICYmIHN2cy0+ZWZ1c2VbaV0pDQorCQkJc2VxX3ByaW50ZihtLCAi TV9IV19SRVMlZCA9IDB4JTA4eFxuIiwNCisJCQkJICAgaSwgc3ZzLT5lZnVzZVtpXSk7DQorDQor CWZvciAoaSA9IDA7IGkgPCBzdnNwLT50aGVybWFsX2VmdXNlX251bTsgaSsrKQ0KKwkJaWYgKHN2 cy0+dGhlcm1hbF9lZnVzZSkNCisJCQlzZXFfcHJpbnRmKG0sICJUSEVSTUFMX0VGVVNFJWQgPSAw eCUwOHhcbiIsDQorCQkJCSAgIGksIHN2cy0+dGhlcm1hbF9lZnVzZVtpXSk7DQorDQorCWZvciAo aWR4ID0gMDsgaWR4IDwgc3ZzcC0+YmFua19udW07IGlkeCsrKSB7DQorCQlzdnNiID0gJnN2c3At PmJhbmtzW2lkeF07DQorDQorCQlmb3IgKGkgPSBTVlNCX1BIQVNFX0lOSVQwMTsgaSA8PSBTVlNC X1BIQVNFX01PTjsgaSsrKSB7DQorCQkJc2VxX3ByaW50ZihtLCAiQmFua19udW1iZXIgPSAldVxu Iiwgc3ZzYi0+YmFua19pZCk7DQorDQorCQkJaWYgKGkgPCBTVlNCX1BIQVNFX01PTikNCisJCQkJ c2VxX3ByaW50ZihtLCAibW9kZSA9IGluaXQlZFxuIiwgaSArIDEpOw0KKwkJCWVsc2UNCisJCQkJ c2VxX3B1dHMobSwgIm1vZGUgPSBtb25cbiIpOw0KKw0KKwkJCWZvciAoaiA9IFRFTVBNT05DVEww OyBqIDwgcmVnX251bTsgaisrKSB7DQorCQkJCXN2c19yZWdfYWRkciA9ICh1bnNpZ25lZCBsb25n KShzdnMtPmJhc2UgKw0KKwkJCQkJCQkgICAgICAgc3ZzcC0+cmVnc1tqXSk7DQorCQkJCXNlcV9w cmludGYobSwgIjB4JTA4bHggPSAweCUwOHhcbiIsDQorCQkJCQkgICBzdnNfcmVnX2FkZHIsIHN2 c2ItPnJlZ19kYXRhW2ldW2pdKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJcmV0dXJuIDA7DQor fQ0KKw0KK3Byb2NfZm9wc19ybyhzdnNfZHVtcCk7DQorDQorc3RhdGljIGludCBzdnNfc3RhdHVz X3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpDQorew0KKwlzdHJ1Y3Qgc3Zz X2JhbmsgKnN2c2IgPSAoc3RydWN0IHN2c19iYW5rICopbS0+cHJpdmF0ZTsNCisJc3RydWN0IGRl dl9wbV9vcHAgKm9wcDsNCisJdW5zaWduZWQgbG9uZyBmcmVxOw0KKwlpbnQgdHpvbmVfdGVtcCwg cmV0Ow0KKwl1MzIgaTsNCisNCisJcmV0ID0gc3ZzYl9nZXRfem9uZV90ZW1wZXJhdHVyZShzdnNi LCAmdHpvbmVfdGVtcCk7DQorCWlmIChyZXQpDQorCQlzZXFfcHJpbnRmKG0sICIlczogY2Fubm90 IGdldCB6b25lIFwiJXNcIiB0ZW1wZXJhdHVyZVxuIiwNCisJCQkgICBzdnNiLT5uYW1lLCBzdnNi LT50em9uZV9uYW1lKTsNCisJZWxzZQ0KKwkJc2VxX3ByaW50ZihtLCAiJXM6IHRlbXBlcmF0dXJl ID0gJWRcbiIsIHN2c2ItPm5hbWUsIHR6b25lX3RlbXApOw0KKw0KKwlmb3IgKGkgPSAwLCBmcmVx ID0gVTMyX01BWDsgaSA8IHN2c2ItPm9wcF9jb3VudDsgaSsrLCBmcmVxLS0pIHsNCisJCW9wcCA9 IGRldl9wbV9vcHBfZmluZF9mcmVxX2Zsb29yKHN2c2ItPmRldiwgJmZyZXEpOw0KKwkJaWYgKElT X0VSUihvcHApKSB7DQorCQkJc2VxX3ByaW50ZihtLCAiJXM6IGVycm9yIG9wcCBlbnRyeSEhLCBl cnIgPSAlbGRcbiIsDQorCQkJCSAgIHN2c2ItPm5hbWUsIFBUUl9FUlIob3BwKSk7DQorCQkJcmV0 dXJuIFBUUl9FUlIob3BwKTsNCisJCX0NCisNCisJCXNlcV9wcmludGYobSwgIm9wcF9mcmVxc1sl MDJ1XTogJWx1LCB2b2x0c1slMDJ1XTogJWx1LCAiLA0KKwkJCSAgIGksIGZyZXEsIGksIGRldl9w bV9vcHBfZ2V0X3ZvbHRhZ2Uob3BwKSk7DQorCQlzZXFfcHJpbnRmKG0sICJzdnNiX3ZvbHRzWyUw MnVdOiAweCV4LCBmcmVxc19wY3RbJTAydV06ICV1XG4iLA0KKwkJCSAgIGksIHN2c2ItPnZvbHRz W2ldLCBpLCBzdnNiLT5mcmVxc19wY3RbaV0pOw0KKwkJZGV2X3BtX29wcF9wdXQob3BwKTsNCisJ fQ0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorcHJvY19mb3BzX3JvKHN2c19zdGF0dXMpOw0KKw0K K3N0YXRpYyBpbnQgc3ZzX3ZvbHRfb2Zmc2V0X3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0s IHZvaWQgKnYpDQorew0KKwlzdHJ1Y3Qgc3ZzX2JhbmsgKnN2c2IgPSAoc3RydWN0IHN2c19iYW5r ICopbS0+cHJpdmF0ZTsNCisNCisJc2VxX3ByaW50ZihtLCAiJWRcbiIsIHN2c2ItPnZvbHRfb2Zm c2V0KTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBzc2l6ZV90IHN2c192b2x0X29m ZnNldF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLA0KKwkJCQkJICBjb25zdCBjaGFyIF9f dXNlciAqYnVmZmVyLA0KKwkJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQ0KK3sNCisJ c3RydWN0IHN2c19iYW5rICpzdnNiID0gKHN0cnVjdCBzdnNfYmFuayAqKVBERV9EQVRBKGZpbGVf aW5vZGUoZmlsZSkpOw0KKwljaGFyICpidWYgPSBOVUxMOw0KKwlzMzIgdm9sdF9vZmZzZXQ7DQor DQorCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJYnVm ID0gKGNoYXIgKiltZW1kdXBfdXNlcl9udWwoYnVmZmVyLCBjb3VudCk7DQorCWlmIChJU19FUlIo YnVmKSkNCisJCXJldHVybiBQVFJfRVJSKGJ1Zik7DQorDQorCWlmICgha3N0cnRvaW50KGJ1Ziwg MTAsICZ2b2x0X29mZnNldCkpIHsNCisJCXN2c2ItPnZvbHRfb2Zmc2V0ID0gdm9sdF9vZmZzZXQ7 DQorCQlzdnNiX3NldF92b2x0cyhzdnNiLCB0cnVlKTsNCisJfQ0KKw0KKwlrZnJlZShidWYpOw0K Kw0KKwlyZXR1cm4gY291bnQ7DQorfQ0KKw0KK3Byb2NfZm9wc19ydyhzdnNfdm9sdF9vZmZzZXQp Ow0KKw0KK3N0YXRpYyBpbnQgc3ZzX2NyZWF0ZV9zdnNfcHJvY2ZzKHN0cnVjdCBtdGtfc3ZzICpz dnMpDQorew0KKwljb25zdCBzdHJ1Y3Qgc3ZzX3BsYXRmb3JtICpzdnNwID0gc3ZzLT5wbGF0Zm9y bTsNCisJc3RydWN0IHN2c19iYW5rICpzdnNiOw0KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnN2 c19kaXIsICpiYW5rX2RpcjsNCisJdTMyIGlkeCwgaTsNCisNCisJc3RydWN0IHBlbnRyeSB7DQor CQljb25zdCBjaGFyICpuYW1lOw0KKwkJY29uc3Qgc3RydWN0IHByb2Nfb3BzICpmb3BzOw0KKwl9 Ow0KKw0KKwlzdHJ1Y3QgcGVudHJ5IHN2c19lbnRyaWVzW10gPSB7DQorCQlwcm9jX2VudHJ5KHN2 c19kdW1wKSwNCisJfTsNCisNCisJc3RydWN0IHBlbnRyeSBiYW5rX2VudHJpZXNbXSA9IHsNCisJ CXByb2NfZW50cnkoc3ZzX2RlYnVnKSwNCisJCXByb2NfZW50cnkoc3ZzX3N0YXR1cyksDQorCQlw cm9jX2VudHJ5KHN2c192b2x0X29mZnNldCksDQorCX07DQorDQorCXN2c19kaXIgPSBwcm9jX21r ZGlyKCJzdnMiLCBOVUxMKTsNCisJaWYgKCFzdnNfZGlyKSB7DQorCQlwcl9lcnIoIm1rZGlyIC9w cm9jL3N2cyBmYWlsZWRcbiIpOw0KKwkJcmV0dXJuIC1FUEVSTTsNCisJfQ0KKw0KKwlmb3IgKGkg PSAwOyBpIDwgQVJSQVlfU0laRShzdnNfZW50cmllcyk7IGkrKykgew0KKwkJaWYgKCFwcm9jX2Ny ZWF0ZV9kYXRhKHN2c19lbnRyaWVzW2ldLm5hbWUsIDA2NjQsDQorCQkJCSAgICAgIHN2c19kaXIs IHN2c19lbnRyaWVzW2ldLmZvcHMsIHN2cykpIHsNCisJCQlwcl9lcnIoImNyZWF0ZSAvcHJvYy9z dnMvJXMgZmFpbGVkXG4iLA0KKwkJCSAgICAgICBzdnNfZW50cmllc1tpXS5uYW1lKTsNCisJCQly ZXR1cm4gLUVQRVJNOw0KKwkJfQ0KKwl9DQorDQorCWZvciAoaWR4ID0gMDsgaWR4IDwgc3ZzcC0+ YmFua19udW07IGlkeCsrKSB7DQorCQlzdnNiID0gJnN2c3AtPmJhbmtzW2lkeF07DQorDQorCQlp ZiAoc3ZzYi0+bW9kZV9zdXBwb3J0ID09IFNWU0JfTU9ERV9BTExfRElTQUJMRSkNCisJCQljb250 aW51ZTsNCisNCisJCWJhbmtfZGlyID0gcHJvY19ta2RpcihzdnNiLT5uYW1lLCBzdnNfZGlyKTsN CisJCWlmICghYmFua19kaXIpIHsNCisJCQlwcl9lcnIoIm1rZGlyIC9wcm9jL3N2cy8lcyBmYWls ZWRcbiIsIHN2c2ItPm5hbWUpOw0KKwkJCXJldHVybiAtRVBFUk07DQorCQl9DQorDQorCQlmb3Ig KGkgPSAwOyBpIDwgQVJSQVlfU0laRShiYW5rX2VudHJpZXMpOyBpKyspIHsNCisJCQlpZiAoIXBy b2NfY3JlYXRlX2RhdGEoYmFua19lbnRyaWVzW2ldLm5hbWUsIDA2NjQsDQorCQkJCQkgICAgICBi YW5rX2RpciwgYmFua19lbnRyaWVzW2ldLmZvcHMsDQorCQkJCQkgICAgICBzdnNiKSkgew0KKwkJ CQlwcl9lcnIoImNyZWF0ZSAvcHJvYy9zdnMvJXMvJXMgZmFpbGVkXG4iLA0KKwkJCQkgICAgICAg c3ZzYi0+bmFtZSwgYmFua19lbnRyaWVzW2ldLm5hbWUpOw0KKwkJCQlyZXR1cm4gLUVQRVJNOw0K KwkJCX0NCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIHN0cnVjdCBz dnNfYmFua19vcHMgc3ZzX210ODE4M19iYW5rc19vcHMgPSB7DQorCS5zZXRfZnJlcXNfcGN0CT0g c3ZzX3NldF9mcmVxc19wY3RfdjIsDQorCS5nZXRfdm9wcwk9IHN2c19nZXRfdm9wc192MiwNCit9 Ow0KKw0KK3N0YXRpYyBzdHJ1Y3Qgc3ZzX2Jhbmsgc3ZzX210ODE4M19iYW5rc1s0XSA9IHsNCisJ ew0KKwkJLm9mX2NvbXBhdGlibGUJCT0gIm1lZGlhdGVrLG10ODE4My1zdnMtY3B1LWxpdHRsZSIs DQorCQkuc3dfaWQJCQk9IFNWU19DUFVfTElUVExFLA0KKwkJLmJhbmtfaWQJCT0gMCwNCisJCS5v cHMJCQk9ICZzdnNfbXQ4MTgzX2JhbmtzX29wcywNCisJCS50em9uZV9uYW1lCQk9ICJ0enRzNCIs DQorCQkuYnVja19uYW1lCQk9ICJ2Y3B1LWxpdHRsZSIsDQorCQkubXRjbW9zX3JlcXVlc3QJCT0g ZmFsc2UsDQorCQkuaW5pdDAxX3ZvbHRfZmxhZwk9IFNWU0JfSU5JVDAxX1ZPTFRfSU5DX09OTFks DQorCQkubW9kZV9zdXBwb3J0CQk9IFNWU0JfTU9ERV9JTklUMDEgfCBTVlNCX01PREVfSU5JVDAy LA0KKwkJLm9wcF9jb3VudAkJPSAxNiwNCisJCS5mcmVxX2Jhc2UJCT0gMTk4OTAwMDAwMCwNCisJ CS52Ym9vdAkJCT0gMHgzMCwNCisJCS52b2x0X3N0ZXAJCT0gNjI1MCwNCisJCS52b2x0X2Jhc2UJ CT0gNTAwMDAwLA0KKwkJLnZvbHRfb2Zmc2V0CQk9IDAsDQorCQkudm1heAkJCT0gMHg2NCwNCisJ CS52bWluCQkJPSAweDE4LA0KKwkJLmR0aGkJCQk9IDB4MSwNCisJCS5kdGxvCQkJPSAweGZlLA0K KwkJLmRldF93aW5kb3cJCT0gMHhhMjgsDQorCQkuZGV0X21heAkJPSAweGZmZmYsDQorCQkuYWdl X2NvbmZpZwkJPSAweDU1NTU1NSwNCisJCS5hZ2VtCQkJPSAwLA0KKwkJLmRjX2NvbmZpZwkJPSAw eDU1NTU1NSwNCisJCS5kdnRfZml4ZWQJCT0gMHg3LA0KKwkJLnZjbwkJCT0gMHgxMCwNCisJCS5j aGtfc2hpZnQJCT0gMHg3NywNCisJCS51cHBlcl90ZW1wX2JvdW5kCT0gMHg2NCwNCisJCS5sb3dl cl90ZW1wX2JvdW5kCT0gMHhiMiwNCisJCS5oaWdoX3RlbXBfdGhyZWFzaG9sZAk9IEhJR0hfVEVN UF9NQVgsDQorCQkubG93X3RlbXBfdGhyZWFzaG9sZAk9IDI1MDAwLA0KKwkJLmxvd190ZW1wX29m ZnNldAk9IDAsDQorCQkuY29yZV9zZWwJCT0gMHg4ZmZmMDAwMCwNCisJCS5zeXN0ZW1jbGtfZW4J CT0gQklUKDMxKSwNCisJCS5pbnRfc3QJCQk9IEJJVCgwKSwNCisJCS5jdGwwCQkJPSAweDAwMDEw MDAxLA0KKwl9LA0KKwl7DQorCQkub2ZfY29tcGF0aWJsZQkJPSAibWVkaWF0ZWssbXQ4MTgzLXN2 cy1jcHUtYmlnIiwNCisJCS5zd19pZAkJCT0gU1ZTX0NQVV9CSUcsDQorCQkuYmFua19pZAkJPSAx LA0KKwkJLm9wcwkJCT0gJnN2c19tdDgxODNfYmFua3Nfb3BzLA0KKwkJLnR6b25lX25hbWUJCT0g InR6dHM1IiwNCisJCS5idWNrX25hbWUJCT0gInZjcHUtYmlnIiwNCisJCS5tdGNtb3NfcmVxdWVz dAkJPSBmYWxzZSwNCisJCS5pbml0MDFfdm9sdF9mbGFnCT0gU1ZTQl9JTklUMDFfVk9MVF9JTkNf T05MWSwNCisJCS5tb2RlX3N1cHBvcnQJCT0gU1ZTQl9NT0RFX0lOSVQwMSB8IFNWU0JfTU9ERV9J TklUMDIsDQorCQkub3BwX2NvdW50CQk9IDE2LA0KKwkJLmZyZXFfYmFzZQkJPSAxOTg5MDAwMDAw LA0KKwkJLnZib290CQkJPSAweDMwLA0KKwkJLnZvbHRfc3RlcAkJPSA2MjUwLA0KKwkJLnZvbHRf YmFzZQkJPSA1MDAwMDAsDQorCQkudm9sdF9vZmZzZXQJCT0gMCwNCisJCS52bWF4CQkJPSAweDU4 LA0KKwkJLnZtaW4JCQk9IDB4MTAsDQorCQkuZHRoaQkJCT0gMHgxLA0KKwkJLmR0bG8JCQk9IDB4 ZmUsDQorCQkuZGV0X3dpbmRvdwkJPSAweGEyOCwNCisJCS5kZXRfbWF4CQk9IDB4ZmZmZiwNCisJ CS5hZ2VfY29uZmlnCQk9IDB4NTU1NTU1LA0KKwkJLmFnZW0JCQk9IDAsDQorCQkuZGNfY29uZmln CQk9IDB4NTU1NTU1LA0KKwkJLmR2dF9maXhlZAkJPSAweDcsDQorCQkudmNvCQkJPSAweDEwLA0K KwkJLmNoa19zaGlmdAkJPSAweDc3LA0KKwkJLnVwcGVyX3RlbXBfYm91bmQJPSAweDY0LA0KKwkJ Lmxvd2VyX3RlbXBfYm91bmQJPSAweGIyLA0KKwkJLmhpZ2hfdGVtcF90aHJlYXNob2xkCT0gSElH SF9URU1QX01BWCwNCisJCS5sb3dfdGVtcF90aHJlYXNob2xkCT0gMjUwMDAsDQorCQkubG93X3Rl bXBfb2Zmc2V0CT0gMCwNCisJCS5jb3JlX3NlbAkJPSAweDhmZmYwMDAxLA0KKwkJLnN5c3RlbWNs a19lbgkJPSBCSVQoMzEpLA0KKwkJLmludF9zdAkJCT0gQklUKDEpLA0KKwkJLmN0bDAJCQk9IDB4 MDAwMDAwMDEsDQorCX0sDQorCXsNCisJCS5vZl9jb21wYXRpYmxlCQk9ICJtZWRpYXRlayxtdDgx ODMtc3ZzLWNjaSIsDQorCQkuc3dfaWQJCQk9IFNWU19DQ0ksDQorCQkuYmFua19pZAkJPSAyLA0K KwkJLm9wcwkJCT0gJnN2c19tdDgxODNfYmFua3Nfb3BzLA0KKwkJLnR6b25lX25hbWUJCT0gInR6 dHM0IiwNCisJCS5idWNrX25hbWUJCT0gInZjY2kiLA0KKwkJLm10Y21vc19yZXF1ZXN0CQk9IGZh bHNlLA0KKwkJLmluaXQwMV92b2x0X2ZsYWcJPSBTVlNCX0lOSVQwMV9WT0xUX0lOQ19PTkxZLA0K KwkJLm1vZGVfc3VwcG9ydAkJPSBTVlNCX01PREVfSU5JVDAxIHwgU1ZTQl9NT0RFX0lOSVQwMiwN CisJCS5vcHBfY291bnQJCT0gMTYsDQorCQkuZnJlcV9iYXNlCQk9IDExOTYwMDAwMDAsDQorCQku dmJvb3QJCQk9IDB4MzAsDQorCQkudm9sdF9zdGVwCQk9IDYyNTAsDQorCQkudm9sdF9iYXNlCQk9 IDUwMDAwMCwNCisJCS52b2x0X29mZnNldAkJPSAwLA0KKwkJLnZtYXgJCQk9IDB4NjQsDQorCQku dm1pbgkJCT0gMHgxOCwNCisJCS5kdGhpCQkJPSAweDEsDQorCQkuZHRsbwkJCT0gMHhmZSwNCisJ CS5kZXRfd2luZG93CQk9IDB4YTI4LA0KKwkJLmRldF9tYXgJCT0gMHhmZmZmLA0KKwkJLmFnZV9j b25maWcJCT0gMHg1NTU1NTUsDQorCQkuYWdlbQkJCT0gMCwNCisJCS5kY19jb25maWcJCT0gMHg1 NTU1NTUsDQorCQkuZHZ0X2ZpeGVkCQk9IDB4NywNCisJCS52Y28JCQk9IDB4MTAsDQorCQkuY2hr X3NoaWZ0CQk9IDB4NzcsDQorCQkudXBwZXJfdGVtcF9ib3VuZAk9IDB4NjQsDQorCQkubG93ZXJf dGVtcF9ib3VuZAk9IDB4YjIsDQorCQkuaGlnaF90ZW1wX3RocmVhc2hvbGQJPSBISUdIX1RFTVBf TUFYLA0KKwkJLmxvd190ZW1wX3RocmVhc2hvbGQJPSAyNTAwMCwNCisJCS5sb3dfdGVtcF9vZmZz ZXQJPSAwLA0KKwkJLmNvcmVfc2VsCQk9IDB4OGZmZjAwMDIsDQorCQkuc3lzdGVtY2xrX2VuCQk9 IEJJVCgzMSksDQorCQkuaW50X3N0CQkJPSBCSVQoMiksDQorCQkuY3RsMAkJCT0gMHgwMDEwMDAw MywNCisJfSwNCisJew0KKwkJLm9mX2NvbXBhdGlibGUJCT0gIm1lZGlhdGVrLG10ODE4My1zdnMt Z3B1IiwNCisJCS5zd19pZAkJCT0gU1ZTX0dQVSwNCisJCS5iYW5rX2lkCQk9IDMsDQorCQkub3Bz CQkJPSAmc3ZzX210ODE4M19iYW5rc19vcHMsDQorCQkudHpvbmVfbmFtZQkJPSAidHp0czIiLA0K KwkJLmJ1Y2tfbmFtZQkJPSAidmdwdSIsDQorCQkubXRjbW9zX3JlcXVlc3QJCT0gdHJ1ZSwNCisJ CS5pbml0MDFfdm9sdF9mbGFnCT0gU1ZTQl9JTklUMDFfVk9MVF9JTkNfT05MWSwNCisJCS5tb2Rl X3N1cHBvcnQJCT0gU1ZTQl9NT0RFX0lOSVQwMSB8IFNWU0JfTU9ERV9JTklUMDIgfA0KKwkJCQkJ ICBTVlNCX01PREVfTU9OLA0KKwkJLm9wcF9jb3VudAkJPSAxNiwNCisJCS5mcmVxX2Jhc2UJCT0g OTAwMDAwMDAwLA0KKwkJLnZib290CQkJPSAweDMwLA0KKwkJLnZvbHRfc3RlcAkJPSA2MjUwLA0K KwkJLnZvbHRfYmFzZQkJPSA1MDAwMDAsDQorCQkudm9sdF9vZmZzZXQJCT0gMCwNCisJCS52bWF4 CQkJPSAweDQwLA0KKwkJLnZtaW4JCQk9IDB4MTQsDQorCQkuZHRoaQkJCT0gMHgxLA0KKwkJLmR0 bG8JCQk9IDB4ZmUsDQorCQkuZGV0X3dpbmRvdwkJPSAweGEyOCwNCisJCS5kZXRfbWF4CQk9IDB4 ZmZmZiwNCisJCS5hZ2VfY29uZmlnCQk9IDB4NTU1NTU1LA0KKwkJLmFnZW0JCQk9IDAsDQorCQku ZGNfY29uZmlnCQk9IDB4NTU1NTU1LA0KKwkJLmR2dF9maXhlZAkJPSAweDMsDQorCQkudmNvCQkJ PSAweDEwLA0KKwkJLmNoa19zaGlmdAkJPSAweDc3LA0KKwkJLnVwcGVyX3RlbXBfYm91bmQJPSAw eDY0LA0KKwkJLmxvd2VyX3RlbXBfYm91bmQJPSAweGIyLA0KKwkJLmhpZ2hfdGVtcF90aHJlYXNo b2xkCT0gSElHSF9URU1QX01BWCwNCisJCS5sb3dfdGVtcF90aHJlYXNob2xkCT0gMjUwMDAsDQor CQkubG93X3RlbXBfb2Zmc2V0CT0gMywNCisJCS5jb3JlX3NlbAkJPSAweDhmZmYwMDAzLA0KKwkJ LnN5c3RlbWNsa19lbgkJPSBCSVQoMzEpLA0KKwkJLmludF9zdAkJCT0gQklUKDMpLA0KKwkJLmN0 bDAJCQk9IDB4MDAwNTAwMDEsDQorCX0sDQorfTsNCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IHN2 c19wbGF0Zm9ybSBzdnNfbXQ4MTgzX3BsYXRmb3JtID0gew0KKwkubmFtZQkJCT0gIm10ODE4My1z dnMiLA0KKwkuYmFua3MJCQk9IHN2c19tdDgxODNfYmFua3MsDQorCS5lZnVzZV9wYXJzaW5nCQk9 IHN2c19tdDgxODNfZWZ1c2VfcGFyc2luZywNCisJLnJlZ3MJCQk9IHN2c19yZWdzX3YyLA0KKwku aXJxZmxhZ3MJCT0gSVJRRl9UUklHR0VSX0xPVyB8IElSUUZfT05FU0hPVCwNCisJLm5lZWRfaHdf cmVzZXQJCT0gZmFsc2UsDQorCS5mYWtlX2VmdXNlCQk9IGZhbHNlLA0KKwkuYmFua19udW0JCT0g NCwNCisJLmVmdXNlX251bQkJPSAyNSwNCisJLmVmdXNlX2NoZWNrCQk9IDIsDQorCS50aGVybWFs X2VmdXNlX251bQk9IDMsDQorfTsNCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9p ZCBtdGtfc3ZzX29mX21hdGNoW10gPSB7DQorCXsNCisJCS5jb21wYXRpYmxlID0gIm1lZGlhdGVr LG10ODE4My1zdnMiLA0KKwkJLmRhdGEgPSAmc3ZzX210ODE4M19wbGF0Zm9ybSwNCisJfSwgew0K KwkJLyogU2VudGluZWwgKi8NCisJfSwNCit9Ow0KKw0KK3N0YXRpYyBpbnQgc3ZzX3Byb2JlKHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQorew0KKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNl X2lkICpvZl9kZXZfaWQ7DQorCXN0cnVjdCBtdGtfc3ZzICpzdnM7DQorCWludCByZXQ7DQorCXUz MiBzdnNfaXJxOw0KKw0KKwlzdnMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpz dnMpLCBHRlBfS0VSTkVMKTsNCisJaWYgKCFzdnMpDQorCQlyZXR1cm4gLUVOT01FTTsNCisNCisJ c3ZzLT5kZXYgPSAmcGRldi0+ZGV2Ow0KKwlpZiAoIXN2cy0+ZGV2LT5vZl9ub2RlKSB7DQorCQlw cl9lcnIoImNhbm5vdCBmaW5kIGRldmljZSBub2RlXG4iKTsNCisJCXJldHVybiAtRU5PREVWOw0K Kwl9DQorDQorCXN2cy0+YmFzZSA9IG9mX2lvbWFwKHN2cy0+ZGV2LT5vZl9ub2RlLCAwKTsNCisJ aWYgKElTX0VSUihzdnMtPmJhc2UpKSB7DQorCQlwcl9lcnIoImNhbm5vdCBmaW5kIHN2cyByZWdp c3RlciBiYXNlXG4iKTsNCisJCXJldHVybiBQVFJfRVJSKHN2cy0+YmFzZSk7DQorCX0NCisNCisJ b2ZfZGV2X2lkID0gb2ZfbWF0Y2hfbm9kZShtdGtfc3ZzX29mX21hdGNoLCBzdnMtPmRldi0+b2Zf bm9kZSk7DQorCWlmICghb2ZfZGV2X2lkIHx8ICFvZl9kZXZfaWQtPmRhdGEpDQorCQlyZXR1cm4g LUVJTlZBTDsNCisNCisJc3ZzLT5wbGF0Zm9ybSA9IG9mX2Rldl9pZC0+ZGF0YTsNCisJZGV2X3Nl dF9kcnZkYXRhKHN2cy0+ZGV2LCBzdnMpOw0KKw0KKwlzdnNfaXJxID0gaXJxX29mX3BhcnNlX2Fu ZF9tYXAoc3ZzLT5kZXYtPm9mX25vZGUsIDApOw0KKwlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFk ZWRfaXJxKHN2cy0+ZGV2LCBzdnNfaXJxLCBOVUxMLCBzdnNfaXNyLA0KKwkJCQkJc3ZzLT5wbGF0 Zm9ybS0+aXJxZmxhZ3MsICJtdGstc3ZzIiwNCisJCQkJCXN2cyk7DQorCWlmIChyZXQpIHsNCisJ CXByX2VycigicmVnaXN0ZXIgaXJxKCVkKSBmYWlsZWQ6ICVkXG4iLCBzdnNfaXJxLCByZXQpOw0K KwkJcmV0dXJuIHJldDsNCisJfQ0KKw0KKwlzdnMtPm1haW5fY2xrID0gZGV2bV9jbGtfZ2V0KHN2 cy0+ZGV2LCAibWFpbiIpOw0KKwlpZiAoSVNfRVJSKHN2cy0+bWFpbl9jbGspKSB7DQorCQlwcl9l cnIoImZhaWxlZCB0byBnZXQgY2xvY2s6ICVsZFxuIiwgUFRSX0VSUihzdnMtPm1haW5fY2xrKSk7 DQorCQlyZXR1cm4gUFRSX0VSUihzdnMtPm1haW5fY2xrKTsNCisJfQ0KKw0KKwlyZXQgPSBjbGtf cHJlcGFyZV9lbmFibGUoc3ZzLT5tYWluX2Nsayk7DQorCWlmIChyZXQpIHsNCisJCXByX2Vycigi Y2Fubm90IGVuYWJsZSBtYWluIGNsazogJWRcbiIsIHJldCk7DQorCQlyZXR1cm4gcmV0Ow0KKwl9 DQorDQorCWlmICghc3ZzX2lzX3N1cHBvcnRlZChzdnMpKSB7DQorCQlwcl9ub3RpY2UoInN2cyBp cyBub3Qgc3VwcG9ydGVkXG4iKTsNCisJCXJldCA9IC1FUEVSTTsNCisJCWdvdG8gc3ZzX3Byb2Jl X2ZhaWw7DQorCX0NCisNCisJcmV0ID0gc3ZzX3Jlc291cmNlX3NldHVwKHN2cyk7DQorCWlmIChy ZXQpDQorCQlnb3RvIHN2c19wcm9iZV9mYWlsOw0KKw0KKwlyZXQgPSBzdnNfc3RhcnQoc3ZzKTsN CisJaWYgKHJldCkNCisJCWdvdG8gc3ZzX3Byb2JlX2ZhaWw7DQorDQorCXJldCA9IHN2c19jcmVh dGVfc3ZzX3Byb2NmcyhzdnMpOw0KKwlpZiAocmV0KQ0KKwkJZ290byBzdnNfcHJvYmVfZmFpbDsN CisNCisJcmV0dXJuIDA7DQorDQorc3ZzX3Byb2JlX2ZhaWw6DQorCWNsa19kaXNhYmxlX3VucHJl cGFyZShzdnMtPm1haW5fY2xrKTsNCisNCisJcmV0dXJuIHJldDsNCit9DQorDQorc3RhdGljIGNv bnN0IHN0cnVjdCBkZXZfcG1fb3BzIHN2c19wbV9vcHMgPSB7DQorCS5wcmVwYXJlCT0gc3ZzX3Bt X29wc19wcmVwYXJlLA0KKwkuY29tcGxldGUJPSBzdnNfcG1fb3BzX2NvbXBsZXRlLA0KK307DQor DQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3ZzX2RyaXZlciA9IHsNCisJLnByb2Jl CT0gc3ZzX3Byb2JlLA0KKwkuZHJpdmVyCT0gew0KKwkJLm5hbWUJCT0gIm10ay1zdnMiLA0KKwkJ LnBtCQk9ICZzdnNfcG1fb3BzLA0KKwkJLm9mX21hdGNoX3RhYmxlCT0gb2ZfbWF0Y2hfcHRyKG10 a19zdnNfb2ZfbWF0Y2gpLA0KKwl9LA0KK307DQorDQorc3RhdGljIGludCBfX2luaXQgc3ZzX2lu aXQodm9pZCkNCit7DQorCWludCByZXQ7DQorDQorCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdp c3Rlcigmc3ZzX2RyaXZlcik7DQorCWlmIChyZXQpIHsNCisJCXByX2Vycigic3ZzIHBsYXRmb3Jt IGRyaXZlciByZWdpc3RlciBmYWlsZWQ6ICVkXG4iLCByZXQpOw0KKwkJcmV0dXJuIHJldDsNCisJ fQ0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorbGF0ZV9pbml0Y2FsbF9zeW5jKHN2c19pbml0KTsN CisNCitNT0RVTEVfREVTQ1JJUFRJT04oIk1lZGlhVGVrIFNWUyBEcml2ZXIgdjEuMCIpOw0KK01P RFVMRV9MSUNFTlNFKCJHUEwiKTsNCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bvd2VyL210 a19zdnMuaCBiL2luY2x1ZGUvbGludXgvcG93ZXIvbXRrX3N2cy5oDQpuZXcgZmlsZSBtb2RlIDEw MDY0NA0KaW5kZXggMDAwMDAwMDAwMDAwLi41YzAzOTgyZTM1NzYNCi0tLSAvZGV2L251bGwNCisr KyBiL2luY2x1ZGUvbGludXgvcG93ZXIvbXRrX3N2cy5oDQpAQCAtMCwwICsxLDIzIEBADQorLyog U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjANCisgKg0KKyAqIENvcHlyaWdodCAoQykg MjAyMCBNZWRpYVRlayBJbmMuDQorICovDQorDQorI2lmbmRlZiBfX01US19TVlNfSF9fDQorI2Rl ZmluZSBfX01US19TVlNfSF9fDQorDQorI2lmIElTX0VOQUJMRUQoQ09ORklHX01US19TVlMpDQor dW5zaWduZWQgbG9uZyBjbGFpbV9tdGtfc3ZzX2xvY2sodm9pZCk7DQordm9pZCByZWxlYXNlX210 a19zdnNfbG9jayh1bnNpZ25lZCBsb25nIGZsYWdzKTsNCisjZWxzZQ0KK3N0YXRpYyBpbmxpbmUg dW5zaWduZWQgbG9uZyBjbGFpbV9tdGtfc3ZzX2xvY2sodm9pZCkNCit7DQorCXJldHVybiAwOw0K K30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgcmVsZWFzZV9tdGtfc3ZzX2xvY2sodW5zaWduZWQg bG9uZyBmbGFncykNCit7DQorfQ0KKyNlbmRpZiAvKiBDT05GSUdfTVRLX1NWUyAqLw0KKw0KKyNl bmRpZiAvKiBfX01US19TVlNfSF9fICovDQotLSANCjIuMTguMA0K