From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id AA8B7A00C4 for ; Wed, 27 Jul 2022 09:27:48 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9F527400D7; Wed, 27 Jul 2022 09:27:48 +0200 (CEST) Received: from APC01-TYZ-obe.outbound.protection.outlook.com (mail-tyzapc01on2053.outbound.protection.outlook.com [40.107.117.53]) by mails.dpdk.org (Postfix) with ESMTP id 8CE8D40684; Tue, 26 Jul 2022 02:53:02 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=M5VpAac/dTYaEeo7JZ6LE2g0iO0zIYhg+Pkm+rh3XnJHQIWW9m8DoeJTrNwhQUu9EM0QQmyWnzACU0du56mFgQaw5tOBC2SUuSc2awayvQ0Le3WkVuxNWMkYQTYo32lqsqrJ82Wrq8/3nC9j4fJnaNyBVKMpbc+QE3Ok7I7ymvJxEq1CGJveEVAfqpHYXVaKPRmQIHuSNvhPiI7H5r3a369Ku5lvVxz3D6xHxSuUMHcDHE5nfS2ctUguSE86satidJ6jZ4odF1mscvKEWQCwrijC/TeNh8GCl70ZcJ3Zq/t1DeauhLddr33jbL0LS0PRuZrq/QGuT8J4L5e+SFdq/g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=r7iCs161fz/kfdBzM/CArRGE/39NuOq3aK0OIHoJyg4=; b=Hl4dKDK5N5VskSGGkZWudTgUcqmnkFBqRwyZ4blZdRh6T7zznv4pBFeFUYFPWXeL8jZJmbDwJFzMxQZRFFypxSH3cHVr8UDnsvo+th5nGqjQWAdK52/FvxLnTEuBJR9KcE/IDj2zQGH05ylQ6SGOVMWxhNYcLiFqLThodRf+3GwtoN6sQVc7HsUg4w8kqgqPHXuub2Vy/eYqvBTNJuVa29O1GTFY9jG6mUQ6fKZcOtZpAgaxj1ceRrv2OmZyqcAzgjlpQZY6agaGujgG2+chndd9LM90uqk0f7cES9QW2MQ52vuFIpEIacN1x3h1oG3SjEFjyEK1acfogvnegBVGZg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=jaguarmicro.com; dmarc=pass action=none header.from=jaguarmicro.com; dkim=pass header.d=jaguarmicro.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jaguarmicro.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=r7iCs161fz/kfdBzM/CArRGE/39NuOq3aK0OIHoJyg4=; b=VH9W6i4NTnVQEQVFjmfkflJZZxYuzU1kcnnRj6Ap01ytqDdl9Io2sVzUeA+bKibArJ8tyDGJw9DyD8fgv3v9IIDb6uvx2CdyM8u3qd2hL0qdcDE1vlFkFndNu7f4XKgesOkvXvqlQr53f2LKPOkFCYgzD6P9yS9XFx3vOMA93od10D8UOx/32UUV5+cU7SrZf3JDhJWzEFH86rRaZ+yV/efeiDqOpRiBeYkLFcdymNzeO3l0egEf0wrkeITJCaWoolTLJz8TTp+AqlrDIrpwldQTJvwRP6LVcydm+QJYksq020zGK+Oa9WMRXa7U1oZgy1DxWbsWJ/CxkEyekkgaOg== Received: from KL1PR0601MB4530.apcprd06.prod.outlook.com (2603:1096:820:64::10) by TY0PR06MB5329.apcprd06.prod.outlook.com (2603:1096:400:212::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5458.25; Tue, 26 Jul 2022 00:52:54 +0000 Received: from KL1PR0601MB4530.apcprd06.prod.outlook.com ([fe80::59b6:ff9c:d103:9e97]) by KL1PR0601MB4530.apcprd06.prod.outlook.com ([fe80::59b6:ff9c:d103:9e97%9]) with mapi id 15.20.5458.025; Tue, 26 Jul 2022 00:52:54 +0000 From: Jun Qiu To: "humin (Q)" , "dev@dpdk.org" CC: "chas3@att.com" , "radu.nicolau@intel.com" , "stable@dpdk.org" Subject: =?utf-8?B?562U5aSNOiBbUEFUQ0hdIG5ldC9ib25kaW5nOiBmaXggeG1pdCBsMzQgaGFz?= =?utf-8?Q?h_calculate_for_tcp?= Thread-Topic: [PATCH] net/bonding: fix xmit l34 hash calculate for tcp Thread-Index: AQHYoBdVBgoxPIoZw0qdnYLAgQvcl62PB+SAgADLVmA= Date: Tue, 26 Jul 2022 00:52:54 +0000 Message-ID: References: <20220725111106.5405-1-jun.qiu@jaguarmicro.com> In-Reply-To: Accept-Language: en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=jaguarmicro.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: b6b69984-c963-4441-dc94-08da6ea12cc4 x-ms-traffictypediagnostic: TY0PR06MB5329:EE_ x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 9dSKNmXntqS5tBQGs12MCBiYOa6ukaURetrPhDBjT43PCHBXnytn6N1J8xt3sbaU4GzP+Yebji02MABhoARrVbVpK+GBJ3YaD3xVmNq7vNAPzoBwaMecH+WxEqEr0gfDtaaTAjw910HfWMwic2DQdFUuB4Wjd50xVECz5NjX32oBPPj120MW9l53IYzOIeaZFxaVm6KIWyZfSZ8IknP6irfOHdeT5iafYeobLAP2nEqjj2bxtEhI6By10torCWNw34JXKRRPeMOQCDPw1ZGiqnxYeuCNXRhPjqUd+vv7wT/mhlEaEG5HF2grWNF8WlwuIsbzwTeZsxqmoWwlNk7ADmITzPZFZB8FjT2HKZKHy5g8//5LiwNYMoExY90DxIa3QMGoj+rINq9XWfRCl+6pKWzJ0yQ3fLADPGOj/X0ckTX2+Zmj4hUVWMPV73bquC7AthKDsaONIAPDsArhoVx33ozdt07V2VotyO2ojl8QK2zIVUvOBqIztt3tIWeVSXoHm1TukBhZlF9WA7QYIL6vP/PrK7dvM45HTr2OgVO50uWaraAdE49hmzWi50CdaKPX4cwmE3HViYWAdhh65LFcTzadWyijYlux1CFaGcUPjL27Au5oY/je0ITzn6rD79+fZ2cKMzz5NAhU698pIEAyyD/prYmz3VsgM/plZHlsMKJL3THtUJgkWaWyHNerlNZIWtPNfOxHgpVsix4+rx0Cj7l642aEk+Gm5+g3QguX7PoSAGS5VnGjC1EIcerapEPU4/HWrkRkWRYqIuBfsaWX+KymqV7NPjuYOY0Apw7ZAyw= x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:KL1PR0601MB4530.apcprd06.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230016)(366004)(39840400004)(346002)(136003)(376002)(396003)(110136005)(41300700001)(224303003)(316002)(38100700002)(54906003)(66446008)(38070700005)(64756008)(76116006)(66946007)(66556008)(122000001)(66476007)(71200400001)(4326008)(8936002)(55016003)(30864003)(186003)(478600001)(52536014)(5660300002)(86362001)(83380400001)(44832011)(2906002)(7696005)(6506007)(26005)(9686003)(33656002)(579004)(559001); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?Q1FaWDhYcTZHeXBEL0tnNXFhWjc4RFRqaG00TWk2Sk0ySExXaTkxUm9FQVdW?= =?utf-8?B?d0I0Tkx6QXdJNVZtYkttekVXMmNGb0hJOGM3eVFWWmR1SWQ3Z1YzMzgvb1NG?= =?utf-8?B?bE5ONWlRZkJqcEIyRkpQZjVlUk1Qalp5cTRLNnI4aW1pbERwYzhkME9SMExn?= =?utf-8?B?WEdRL0tDTzhpV2lzcDJKREFudVpSZ1FuUTdXZDFTdFlWWUlvZzdhYlAyQnVQ?= =?utf-8?B?bDE2cU5GT0pmWGJWRThhTUdjYk1TcktZSVpMVm1jN1k2RHZ6a2kzcFQ3dGdV?= =?utf-8?B?MkpvUDJnNk40aW1VN3NCYm9ta3p0RU9ZQ0huZHVQODZxNTg1c3Q5QXF4d1JD?= =?utf-8?B?LzVQNHZMZjV1OEwzTllxd2pPc0txRG0yb0E0bU9GSGFSS1FIaEltT09ZbHdN?= =?utf-8?B?aHYyWUtUYXo5cm13aGVSK0ZFdExpNXpkemR1bGRWdm16eThZMDlRQ1NKWXp1?= =?utf-8?B?QTlTY3NnZmdCem1SMlRPejVRSGIwS3NZSU1FWmp1UTI1ckhhckFDS1N5K1Bk?= =?utf-8?B?UHUvTWxUSEFCUHF6aDM3ZytqdlYxdVg3by9WU2s0Y1cvK1V6WXp2YzdVOUpl?= =?utf-8?B?VHJpdythLzUvSDhBeTZWYWR0K2NJekxSczBEamVWcTZUcnNWU21NRktnL0lB?= =?utf-8?B?Y3JzWXRSMjhOSFRxVU1Pa2xsQVN5NDRJVDg5YTZMM2wycGZhMXM1YjQ0eDFV?= =?utf-8?B?R01YSHpOb2k3MGtka0NRMnJBdzdUWXRSdzZFdkhGNG1UOVpTVzBMMmZyNm9L?= =?utf-8?B?T2oxTENGQkJiSXJndDlqS2Z1dlRaRzZ5b29MYjNicUZINWNzQUdXQW1xem1Q?= =?utf-8?B?YzhtTW5RcUlsaU1DaUZ1UEhsd2ZpY0ZlWFRCdU5iSTlaSlBxaklucit3QkhB?= =?utf-8?B?Rm4vTW11Q2FvaGY2M0lzUVF4anZmTk9qakFsbm9kVEZtc04xNmlEcU9Hakxp?= =?utf-8?B?UlBqSGJuRUxVRDY5NWsxYWdOU3BlUEZtRjZxTXdhcjRQY3piSVdMc3pZbHEr?= =?utf-8?B?U0IxVS9aK3VNZWRYUXB5N3FNblUrd2djVExySW5RdmtIRUd2eVlqUlpRUDVP?= =?utf-8?B?NVV6Ykg4d1RmdE5BR3ZnaGI0THRRSDhFSldzK0s2WlJISXBwZDhDUlUvaTQ4?= =?utf-8?B?VEtIU2JHYmJBSlN1S0dGMkNQNWxwRE9IUEQ2THAybEdvanl0VXl3MmN4QnFl?= =?utf-8?B?Q2NXb2l6bXcrd1IxV3QzelZPWTg5NVJqRElDellwMlNXM3pVZ0drRWQ4M0lQ?= =?utf-8?B?SEN0N0dIcGVlWlhubGR6ZkFObm1hSC9IL09DdXZPNFlsa2dSekwyRHBPcGY0?= =?utf-8?B?VCs1T05LY1p4SGFBSkhkUVBNU1dmdnJKYzV2RUcxNG5hbzBrbU1wbUFQVEI5?= =?utf-8?B?eHBva0RhRHg2Sk9idXl2VGRRWW51R01YeWFKSDJZdk1YR0Z1U0xpRmtOWGc4?= =?utf-8?B?cVBicUI5QVdNZnhtaU9JUEs2bFR3bXNXK2pkbXFJdzhmeXhYZ3VFem5GMU1F?= =?utf-8?B?aHNTWnRtek9VeTloY1pwbzM0YThodWw5ZU1BNUZvWWRyc01HUnV6T2g1Y2Z4?= =?utf-8?B?d3RTUkJuVzY4SVJVNmovblhjbGpPY2tGK2phd3JsczRta1I5QTZjQ3pOK0oz?= =?utf-8?B?MXlJc0dZSVpYZWZWbEpwNkxwNHdhejRjdnREU2h4T1FQNGs5ckZ6WWorbWVx?= =?utf-8?B?VmlUU1hlMkRjNjE0Ym9TdThWaTZaNk1oaS9lMUlpRkZWUlpzUlRSc2hhTTlq?= =?utf-8?B?dVpKS05tNVUyU0hzUGJ1SHU2ZFlnWHo1d0R2RmRGbThNNko1emhtcGNkSFpS?= =?utf-8?B?bWFTWmN3U2wyN1FFYW5odjViYk03OXlPVWZFeUhjNDdtUStBT2xPcE44amhB?= =?utf-8?B?UjBJRGYyOVpva2xJYkRVV2JlVFdMM0trTlRtVTdSZlgxOCtieDZ6QlJFcndU?= =?utf-8?B?dEgrQUNXaCtsUlhiQWljaHNRSzhORjZqZjhRK1VKM3FtdlUwTEZ3Y3MvTHZQ?= =?utf-8?B?WFMvNkcwQWNLdHMxaFkvZjBtZTRzQXRwWXdGcUVyRkk4MVlKc1BTSUR3Mm85?= =?utf-8?B?SWlraGtHcXhrZmFnWkxEUnNLTzdjdmZMSzVWNzdrTXdNRTZ2QU4rN2Vudmxz?= =?utf-8?Q?jeMggO7iUV2t5QJWwPkKVcO1M?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: jaguarmicro.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: KL1PR0601MB4530.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: b6b69984-c963-4441-dc94-08da6ea12cc4 X-MS-Exchange-CrossTenant-originalarrivaltime: 26 Jul 2022 00:52:54.5923 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 1e45a5c2-d3e1-46b3-a0e6-c5ebf6d8ba7b X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: Yk/tASNGz8qwZfsKcJrlPO8EiFRDcQsxK2HHOgscQTTyUqO4U45Z9FgNzLISgsy5opoQ+cDtbT/woF+Ghc0lWQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY0PR06MB5329 X-Mailman-Approved-At: Wed, 27 Jul 2022 09:27:45 +0200 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org U29ycnkhDQpUaGVyZSBpcyBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGUgZm9ybWF0IG9mIHRoZSBj b2RlIHN1Ym1pdHRlZCB5ZXN0ZXJkYXkgKHRoZSBkaWZmZXJlbmNlIGNhbm5vdCBiZSBzZWVuKSwg IEkgc3VibWl0dGVkIGl0IGFnYWluIGp1c3Qgbm93LCBhbmQgdGhlIGNvZGUgbW9kaWZpY2F0aW9u IGNhbiBiZSBjbGVhcmx5IHNlZW4uDQoNCi0tLS0t6YKu5Lu25Y6f5Lu2LS0tLS0NCuWPkeS7tuS6 ujogaHVtaW4gKFEpIDxodW1pbjI5QGh1YXdlaS5jb20+IA0K5Y+R6YCB5pe26Ze0OiAyMDIy5bm0 N+aciDI15pelIDIwOjQzDQrmlLbku7bkuro6IEp1biBRaXUgPGp1bi5xaXVAamFndWFybWljcm8u Y29tPjsgZGV2QGRwZGsub3JnDQrmioTpgIE6IGNoYXMzQGF0dC5jb207IHJhZHUubmljb2xhdUBp bnRlbC5jb207IHN0YWJsZUBkcGRrLm9yZw0K5Li76aKYOiBSZTogW1BBVENIXSBuZXQvYm9uZGlu ZzogZml4IHhtaXQgbDM0IGhhc2ggY2FsY3VsYXRlIGZvciB0Y3ANCg0KSGnvvIwNCg0K5ZyoIDIw MjIvNy8yNSAxOToxMSwgSnVuIFFpdSDlhpnpgZM6DQo+IEluIHRoZSBmb2xsb3dpbmcgdHdvIGNh c2VzLCB0Y3BfaGRyICsgc2l6ZW9mKCp0Y3BfaGRyKSA9PSBwa3RfZW5kLA0KPiBhbmQgdGhlIFRD UCBwb3J0IGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gY2FsY3VsYXRpbmcgdGhlIEhBU0gN Cj4gdmFsdWUgb2YgVENQIHBhY2tldHMuIFRDUCBjb25uZWN0aW9ucyB3aXRoIHRoZSBzYW1lIHNv dXJjZSBhbmQNCj4gZGVzdGluYXRpb24gSVAgYWRkcmVzc2VzIHdpbGwgYmUgaGFzaGVkIHRvIHRo ZSBzYW1lIHNsYXZlIHBvcnQsDQo+IHdoaWNoIG1heSBjYXVzZSBsb2FkIGltYmFsYW5jZS4NCj4g MS4gVENQIFB1cmUgQUNLIHBhY2tldHMgd2l0aCBubyBvcHRpb25zLCBUaGUgaGVhZGVyIGxlbmd0 aCBpcyAyMA0KPiBhbmQgdGhlcmUgaXMgbm8gZGF0YS4NCj4gMi4gQSBUQ1AgcGFja2V0IGNvbnRh aW5zIGRhdGEsIGJ1dCB0aGUgZmlyc3Qgc2VnIG9mIHRoZSBtYnVmDQo+IGNvbnRhaW5zIG9ubHkg dGhlIGhlYWRlciBpbmZvcm1hdGlvbiAoRVRILCBJUCwgVENQKSwgYW5kIHRoZQ0KPiBkYXRhIGlz IGluIHN1YnNlcXVlbnQgc2Vncywgd2hpY2ggaXMgdXN1YWxseSB0aGUgY2FzZSBpbiB0aGUNCj4g aW5kaXJlY3QgbWJ1ZiB1c2VkIGZvciB6ZXJvLWNvcHkuDQo+DQo+IEZpeGVzOiA3MjYxNTgwNjBk NTUgKCJuZXQvYm9uZGluZzogZml4IHBvdGVudGlhbCBvdXQgb2YgYm91bmRzIHJlYWQiKQ0KPiBD Yzogc3RhYmxlQGRwZGsub3JnDQo+DQo+IFNpZ25lZC1vZmYtYnk6IEp1biBRaXUgPGp1bi5xaXVA amFndWFybWljcm8uY29tPg0KPiAtLS0NCj4gICBkcml2ZXJzL25ldC9ib25kaW5nL3J0ZV9ldGhf Ym9uZF9wbWQuYyB8IDc4NjYgKysrKysrKysrKysrLS0tLS0tLS0tLS0tDQo+ICAgMSBmaWxlIGNo YW5nZWQsIDM5MzMgaW5zZXJ0aW9ucygrKSwgMzkzMyBkZWxldGlvbnMoLSkNCiDCoMKgwqAgSXMg dGhlcmUgc29tZXRoaW5nIHdyb25nIHdpdGggdGhlIGZvcm1hdCBvZiB5b3UgcGF0Y2g/IEl0IGxv b2tzIHdlaXJkLg0KPg0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ydGVfZXRo X2JvbmRfcG1kLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL3J0ZV9ldGhfYm9uZF9wbWQuYw0KPiBp bmRleCA3M2U2OTcyMDM1Li4xZjY3Yjc2Mjg2IDEwMDY0NA0KPiAtLS0gYS9kcml2ZXJzL25ldC9i b25kaW5nL3J0ZV9ldGhfYm9uZF9wbWQuYw0KPiArKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL3J0 ZV9ldGhfYm9uZF9wbWQuYw0KPiBAQCAtMSwzOTMzICsxLDM5MzMgQEANCj4gLS8qIFNQRFgtTGlj ZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UNCj4gLSAqIENvcHlyaWdodChjKSAyMDEwLTIw MTcgSW50ZWwgQ29ycG9yYXRpb24NCj4gLSAqLw0KPiAtI2luY2x1ZGUgPHN0ZGxpYi5oPg0KPiAt I2luY2x1ZGUgPHN0ZGJvb2wuaD4NCj4gLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+DQo+IC0NCj4g LSNpbmNsdWRlIDxydGVfbWJ1Zi5oPg0KPiAtI2luY2x1ZGUgPHJ0ZV9tYWxsb2MuaD4NCj4gLSNp bmNsdWRlIDxldGhkZXZfZHJpdmVyLmg+DQo+IC0jaW5jbHVkZSA8ZXRoZGV2X3ZkZXYuaD4NCj4g LSNpbmNsdWRlIDxydGVfdGNwLmg+DQo+IC0jaW5jbHVkZSA8cnRlX3VkcC5oPg0KPiAtI2luY2x1 ZGUgPHJ0ZV9pcC5oPg0KPiAtI2luY2x1ZGUgPHJ0ZV9pcF9mcmFnLmg+DQo+IC0jaW5jbHVkZSA8 cnRlX2RldmFyZ3MuaD4NCj4gLSNpbmNsdWRlIDxydGVfa3ZhcmdzLmg+DQo+IC0jaW5jbHVkZSA8 cnRlX2J1c192ZGV2Lmg+DQo+IC0jaW5jbHVkZSA8cnRlX2FsYXJtLmg+DQo+IC0jaW5jbHVkZSA8 cnRlX2N5Y2xlcy5oPg0KPiAtI2luY2x1ZGUgPHJ0ZV9zdHJpbmdfZm5zLmg+DQo+IC0NCj4gLSNp bmNsdWRlICJydGVfZXRoX2JvbmQuaCINCj4gLSNpbmNsdWRlICJldGhfYm9uZF9wcml2YXRlLmgi DQo+IC0jaW5jbHVkZSAiZXRoX2JvbmRfODAyM2FkX3ByaXZhdGUuaCINCj4gLQ0KPiAtI2RlZmlu ZSBSRU9SREVSX1BFUklPRF9NUyAxMA0KPiAtI2RlZmluZSBERUZBVUxUX1BPTExJTkdfSU5URVJW QUxfMTBfTVMgKDEwKQ0KPiAtI2RlZmluZSBCT05EX01BWF9NQUNfQUREUlMgMTYNCj4gLQ0KPiAt I2RlZmluZSBIQVNIX0w0X1BPUlRTKGgpICgoaCktPnNyY19wb3J0IF4gKGgpLT5kc3RfcG9ydCkN Cj4gLQ0KPiAtLyogVGFibGUgZm9yIHN0YXRpc3RpY3MgaW4gbW9kZSA1IFRMQiAqLw0KPiAtc3Rh dGljIHVpbnQ2NF90IHRsYl9sYXN0X29ieXRldHNbUlRFX01BWF9FVEhQT1JUU107DQo+IC0NCj4g LXN0YXRpYyBpbmxpbmUgc2l6ZV90DQo+IC1nZXRfdmxhbl9vZmZzZXQoc3RydWN0IHJ0ZV9ldGhl cl9oZHIgKmV0aF9oZHIsIHVpbnQxNl90ICpwcm90bykNCj4gLXsNCj4gLQlzaXplX3Qgdmxhbl9v ZmZzZXQgPSAwOw0KPiAtDQo+IC0JaWYgKHJ0ZV9jcHVfdG9fYmVfMTYoUlRFX0VUSEVSX1RZUEVf VkxBTikgPT0gKnByb3RvIHx8DQo+IC0JCXJ0ZV9jcHVfdG9fYmVfMTYoUlRFX0VUSEVSX1RZUEVf UUlOUSkgPT0gKnByb3RvKSB7DQo+IC0JCXN0cnVjdCBydGVfdmxhbl9oZHIgKnZsYW5faGRyID0N Cj4gLQkJCShzdHJ1Y3QgcnRlX3ZsYW5faGRyICopKGV0aF9oZHIgKyAxKTsNCj4gLQ0KPiAtCQl2 bGFuX29mZnNldCA9IHNpemVvZihzdHJ1Y3QgcnRlX3ZsYW5faGRyKTsNCj4gLQkJKnByb3RvID0g dmxhbl9oZHItPmV0aF9wcm90bzsNCj4gLQ0KPiAtCQlpZiAocnRlX2NwdV90b19iZV8xNihSVEVf RVRIRVJfVFlQRV9WTEFOKSA9PSAqcHJvdG8pIHsNCj4gLQkJCXZsYW5faGRyID0gdmxhbl9oZHIg KyAxOw0KPiAtCQkJKnByb3RvID0gdmxhbl9oZHItPmV0aF9wcm90bzsNCj4gLQkJCXZsYW5fb2Zm c2V0ICs9IHNpemVvZihzdHJ1Y3QgcnRlX3ZsYW5faGRyKTsNCj4gLQkJfQ0KPiAtCX0NCj4gLQly ZXR1cm4gdmxhbl9vZmZzZXQ7DQo+IC19DQo+IC0NCj4gLXN0YXRpYyB1aW50MTZfdA0KPiAtYm9u ZF9ldGhkZXZfcnhfYnVyc3Qodm9pZCAqcXVldWUsIHN0cnVjdCBydGVfbWJ1ZiAqKmJ1ZnMsIHVp bnQxNl90IG5iX3BrdHMpDQo+IC17DQo+IC0Jc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVy bmFsczsNCj4gLQ0KPiAtCXVpbnQxNl90IG51bV9yeF90b3RhbCA9IDA7DQo+IC0JdWludDE2X3Qg c2xhdmVfY291bnQ7DQo+IC0JdWludDE2X3QgYWN0aXZlX3NsYXZlOw0KPiAtCWludCBpOw0KPiAt DQo+IC0JLyogQ2FzdCB0byBzdHJ1Y3R1cmUsIGNvbnRhaW5pbmcgYm9uZGVkIGRldmljZSdzIHBv cnQgaWQgYW5kIHF1ZXVlIGlkICovDQo+IC0Jc3RydWN0IGJvbmRfcnhfcXVldWUgKmJkX3J4X3Eg PSAoc3RydWN0IGJvbmRfcnhfcXVldWUgKilxdWV1ZTsNCj4gLQlpbnRlcm5hbHMgPSBiZF9yeF9x LT5kZXZfcHJpdmF0ZTsNCj4gLQlzbGF2ZV9jb3VudCA9IGludGVybmFscy0+YWN0aXZlX3NsYXZl X2NvdW50Ow0KPiAtCWFjdGl2ZV9zbGF2ZSA9IGJkX3J4X3EtPmFjdGl2ZV9zbGF2ZTsNCj4gLQ0K PiAtCWZvciAoaSA9IDA7IGkgPCBzbGF2ZV9jb3VudCAmJiBuYl9wa3RzOyBpKyspIHsNCj4gLQkJ dWludDE2X3QgbnVtX3J4X3NsYXZlOw0KPiAtDQo+IC0JCS8qIE9mZnNldCBvZiBwb2ludGVyIHRv ICpidWZzIGluY3JlYXNlcyBhcyBwYWNrZXRzIGFyZSByZWNlaXZlZA0KPiAtCQkgKiBmcm9tIG90 aGVyIHNsYXZlcyAqLw0KPiAtCQludW1fcnhfc2xhdmUgPQ0KPiAtCQkJcnRlX2V0aF9yeF9idXJz dChpbnRlcm5hbHMtPmFjdGl2ZV9zbGF2ZXNbYWN0aXZlX3NsYXZlXSwNCj4gLQkJCQkJIGJkX3J4 X3EtPnF1ZXVlX2lkLA0KPiAtCQkJCQkgYnVmcyArIG51bV9yeF90b3RhbCwgbmJfcGt0cyk7DQo+ IC0JCW51bV9yeF90b3RhbCArPSBudW1fcnhfc2xhdmU7DQo+IC0JCW5iX3BrdHMgLT0gbnVtX3J4 X3NsYXZlOw0KPiAtCQlpZiAoKythY3RpdmVfc2xhdmUgPT0gc2xhdmVfY291bnQpDQo+IC0JCQlh Y3RpdmVfc2xhdmUgPSAwOw0KPiAtCX0NCj4gLQ0KPiAtCWlmICgrK2JkX3J4X3EtPmFjdGl2ZV9z bGF2ZSA+PSBzbGF2ZV9jb3VudCkNCj4gLQkJYmRfcnhfcS0+YWN0aXZlX3NsYXZlID0gMDsNCj4g LQlyZXR1cm4gbnVtX3J4X3RvdGFsOw0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMgdWludDE2X3QNCj4g LWJvbmRfZXRoZGV2X3J4X2J1cnN0X2FjdGl2ZV9iYWNrdXAodm9pZCAqcXVldWUsIHN0cnVjdCBy dGVfbWJ1ZiAqKmJ1ZnMsDQo+IC0JCXVpbnQxNl90IG5iX3BrdHMpDQo+IC17DQo+IC0Jc3RydWN0 IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFsczsNCj4gLQ0KPiAtCS8qIENhc3QgdG8gc3RydWN0 dXJlLCBjb250YWluaW5nIGJvbmRlZCBkZXZpY2UncyBwb3J0IGlkIGFuZCBxdWV1ZSBpZCAqLw0K PiAtCXN0cnVjdCBib25kX3J4X3F1ZXVlICpiZF9yeF9xID0gKHN0cnVjdCBib25kX3J4X3F1ZXVl ICopcXVldWU7DQo+IC0NCj4gLQlpbnRlcm5hbHMgPSBiZF9yeF9xLT5kZXZfcHJpdmF0ZTsNCj4g LQ0KPiAtCXJldHVybiBydGVfZXRoX3J4X2J1cnN0KGludGVybmFscy0+Y3VycmVudF9wcmltYXJ5 X3BvcnQsDQo+IC0JCQliZF9yeF9xLT5xdWV1ZV9pZCwgYnVmcywgbmJfcGt0cyk7DQo+IC19DQo+ IC0NCj4gLXN0YXRpYyBpbmxpbmUgdWludDhfdA0KPiAtaXNfbGFjcF9wYWNrZXRzKHVpbnQxNl90 IGV0aGVydHlwZSwgdWludDhfdCBzdWJ0eXBlLCBzdHJ1Y3QgcnRlX21idWYgKm1idWYpDQo+IC17 DQo+IC0JY29uc3QgdWludDE2X3QgZXRoZXJfdHlwZV9zbG93X2JlID0NCj4gLQkJcnRlX2JlX3Rv X2NwdV8xNihSVEVfRVRIRVJfVFlQRV9TTE9XKTsNCj4gLQ0KPiAtCXJldHVybiAhKChtYnVmLT5v bF9mbGFncyAmIFJURV9NQlVGX0ZfUlhfVkxBTikgPyBtYnVmLT52bGFuX3RjaSA6IDApICYmDQo+ IC0JCShldGhlcnR5cGUgPT0gZXRoZXJfdHlwZV9zbG93X2JlICYmDQo+IC0JCShzdWJ0eXBlID09 IFNMT1dfU1VCVFlQRV9NQVJLRVIgfHwgc3VidHlwZSA9PSBTTE9XX1NVQlRZUEVfTEFDUCkpOw0K PiAtfQ0KPiAtDQo+IC0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCj4gLSAqIEZsb3cgZGlyZWN0b3In cyBzZXR1cCBmb3IgbW9kZSA0IG9wdGltaXphdGlvbg0KPiAtICovDQo+IC0NCj4gLXN0YXRpYyBz dHJ1Y3QgcnRlX2Zsb3dfaXRlbV9ldGggZmxvd19pdGVtX2V0aF90eXBlXzgwMjNhZCA9IHsNCj4g LQkuZHN0LmFkZHJfYnl0ZXMgPSB7IDAgfSwNCj4gLQkuc3JjLmFkZHJfYnl0ZXMgPSB7IDAgfSwN Cj4gLQkudHlwZSA9IFJURV9CRTE2KFJURV9FVEhFUl9UWVBFX1NMT1cpLA0KPiAtfTsNCj4gLQ0K PiAtc3RhdGljIHN0cnVjdCBydGVfZmxvd19pdGVtX2V0aCBmbG93X2l0ZW1fZXRoX21hc2tfdHlw ZV84MDIzYWQgPSB7DQo+IC0JLmRzdC5hZGRyX2J5dGVzID0geyAwIH0sDQo+IC0JLnNyYy5hZGRy X2J5dGVzID0geyAwIH0sDQo+IC0JLnR5cGUgPSAweEZGRkYsDQo+IC19Ow0KPiAtDQo+IC1zdGF0 aWMgc3RydWN0IHJ0ZV9mbG93X2l0ZW0gZmxvd19pdGVtXzgwMjNhZFtdID0gew0KPiAtCXsNCj4g LQkJLnR5cGUgPSBSVEVfRkxPV19JVEVNX1RZUEVfRVRILA0KPiAtCQkuc3BlYyA9ICZmbG93X2l0 ZW1fZXRoX3R5cGVfODAyM2FkLA0KPiAtCQkubGFzdCA9IE5VTEwsDQo+IC0JCS5tYXNrID0gJmZs b3dfaXRlbV9ldGhfbWFza190eXBlXzgwMjNhZCwNCj4gLQl9LA0KPiAtCXsNCj4gLQkJLnR5cGUg PSBSVEVfRkxPV19JVEVNX1RZUEVfRU5ELA0KPiAtCQkuc3BlYyA9IE5VTEwsDQo+IC0JCS5sYXN0 ID0gTlVMTCwNCj4gLQkJLm1hc2sgPSBOVUxMLA0KPiAtCX0NCj4gLX07DQo+IC0NCj4gLWNvbnN0 IHN0cnVjdCBydGVfZmxvd19hdHRyIGZsb3dfYXR0cl84MDIzYWQgPSB7DQo+IC0JLmdyb3VwID0g MCwNCj4gLQkucHJpb3JpdHkgPSAwLA0KPiAtCS5pbmdyZXNzID0gMSwNCj4gLQkuZWdyZXNzID0g MCwNCj4gLQkucmVzZXJ2ZWQgPSAwLA0KPiAtfTsNCj4gLQ0KPiAtaW50DQo+IC1ib25kX2V0aGRl dl84MDIzYWRfZmxvd192ZXJpZnkoc3RydWN0IHJ0ZV9ldGhfZGV2ICpib25kX2RldiwNCj4gLQkJ dWludDE2X3Qgc2xhdmVfcG9ydCkgew0KPiAtCXN0cnVjdCBydGVfZXRoX2Rldl9pbmZvIHNsYXZl X2luZm87DQo+IC0Jc3RydWN0IHJ0ZV9mbG93X2Vycm9yIGVycm9yOw0KPiAtCXN0cnVjdCBib25k X2Rldl9wcml2YXRlICppbnRlcm5hbHMgPSBib25kX2Rldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+ IC0NCj4gLQljb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfYWN0aW9uX3F1ZXVlIGxhY3BfcXVldWVfY29u ZiA9IHsNCj4gLQkJLmluZGV4ID0gMCwNCj4gLQl9Ow0KPiAtDQo+IC0JY29uc3Qgc3RydWN0IHJ0 ZV9mbG93X2FjdGlvbiBhY3Rpb25zW10gPSB7DQo+IC0JCXsNCj4gLQkJCS50eXBlID0gUlRFX0ZM T1dfQUNUSU9OX1RZUEVfUVVFVUUsDQo+IC0JCQkuY29uZiA9ICZsYWNwX3F1ZXVlX2NvbmYNCj4g LQkJfSwNCj4gLQkJew0KPiAtCQkJLnR5cGUgPSBSVEVfRkxPV19BQ1RJT05fVFlQRV9FTkQsDQo+ IC0JCX0NCj4gLQl9Ow0KPiAtDQo+IC0JaW50IHJldCA9IHJ0ZV9mbG93X3ZhbGlkYXRlKHNsYXZl X3BvcnQsICZmbG93X2F0dHJfODAyM2FkLA0KPiAtCQkJZmxvd19pdGVtXzgwMjNhZCwgYWN0aW9u cywgJmVycm9yKTsNCj4gLQlpZiAocmV0IDwgMCkgew0KPiAtCQlSVEVfQk9ORF9MT0coRVJSLCAi JXM6ICVzIChzbGF2ZV9wb3J0PSVkIHF1ZXVlX2lkPSVkKSIsDQo+IC0JCQkJX19mdW5jX18sIGVy cm9yLm1lc3NhZ2UsIHNsYXZlX3BvcnQsDQo+IC0JCQkJaW50ZXJuYWxzLT5tb2RlNC5kZWRpY2F0 ZWRfcXVldWVzLnJ4X3FpZCk7DQo+IC0JCXJldHVybiAtMTsNCj4gLQl9DQo+IC0NCj4gLQlyZXQg PSBydGVfZXRoX2Rldl9pbmZvX2dldChzbGF2ZV9wb3J0LCAmc2xhdmVfaW5mbyk7DQo+IC0JaWYg KHJldCAhPSAwKSB7DQo+IC0JCVJURV9CT05EX0xPRyhFUlIsDQo+IC0JCQkiJXM6IEVycm9yIGR1 cmluZyBnZXR0aW5nIGRldmljZSAocG9ydCAldSkgaW5mbzogJXNcbiIsDQo+IC0JCQlfX2Z1bmNf Xywgc2xhdmVfcG9ydCwgc3RyZXJyb3IoLXJldCkpOw0KPiAtDQo+IC0JCXJldHVybiByZXQ7DQo+ IC0JfQ0KPiAtDQo+IC0JaWYgKHNsYXZlX2luZm8ubWF4X3J4X3F1ZXVlcyA8IGJvbmRfZGV2LT5k YXRhLT5uYl9yeF9xdWV1ZXMgfHwNCj4gLQkJCXNsYXZlX2luZm8ubWF4X3R4X3F1ZXVlcyA8IGJv bmRfZGV2LT5kYXRhLT5uYl90eF9xdWV1ZXMpIHsNCj4gLQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4g LQkJCSIlczogU2xhdmUgJWQgY2FwYWJpbGl0aWVzIGRvZXNuJ3QgYWxsb3cgdG8gYWxsb2NhdGUg YWRkaXRpb25hbCBxdWV1ZXMiLA0KPiAtCQkJX19mdW5jX18sIHNsYXZlX3BvcnQpOw0KPiAtCQly ZXR1cm4gLTE7DQo+IC0JfQ0KPiAtDQo+IC0JcmV0dXJuIDA7DQo+IC19DQo+IC0NCj4gLWludA0K PiAtYm9uZF84MDIzYWRfc2xvd19wa3RfaHdfZmlsdGVyX3N1cHBvcnRlZCh1aW50MTZfdCBwb3J0 X2lkKSB7DQo+IC0Jc3RydWN0IHJ0ZV9ldGhfZGV2ICpib25kX2RldiA9ICZydGVfZXRoX2Rldmlj ZXNbcG9ydF9pZF07DQo+IC0Jc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFscyA9IGJv bmRfZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4gLQlzdHJ1Y3QgcnRlX2V0aF9kZXZfaW5mbyBi b25kX2luZm87DQo+IC0JdWludDE2X3QgaWR4Ow0KPiAtCWludCByZXQ7DQo+IC0NCj4gLQkvKiBW ZXJpZnkgaWYgYWxsIHNsYXZlcyBpbiBib25kaW5nIHN1cHBvcnRzIGZsb3cgZGlyZWN0b3IgYW5k ICovDQo+IC0JaWYgKGludGVybmFscy0+c2xhdmVfY291bnQgPiAwKSB7DQo+IC0JCXJldCA9IHJ0 ZV9ldGhfZGV2X2luZm9fZ2V0KGJvbmRfZGV2LT5kYXRhLT5wb3J0X2lkLCAmYm9uZF9pbmZvKTsN Cj4gLQkJaWYgKHJldCAhPSAwKSB7DQo+IC0JCQlSVEVfQk9ORF9MT0coRVJSLA0KPiAtCQkJCSIl czogRXJyb3IgZHVyaW5nIGdldHRpbmcgZGV2aWNlIChwb3J0ICV1KSBpbmZvOiAlc1xuIiwNCj4g LQkJCQlfX2Z1bmNfXywgYm9uZF9kZXYtPmRhdGEtPnBvcnRfaWQsDQo+IC0JCQkJc3RyZXJyb3Io LXJldCkpOw0KPiAtDQo+IC0JCQlyZXR1cm4gcmV0Ow0KPiAtCQl9DQo+IC0NCj4gLQkJaW50ZXJu YWxzLT5tb2RlNC5kZWRpY2F0ZWRfcXVldWVzLnJ4X3FpZCA9IGJvbmRfaW5mby5uYl9yeF9xdWV1 ZXM7DQo+IC0JCWludGVybmFscy0+bW9kZTQuZGVkaWNhdGVkX3F1ZXVlcy50eF9xaWQgPSBib25k X2luZm8ubmJfdHhfcXVldWVzOw0KPiAtDQo+IC0JCWZvciAoaWR4ID0gMDsgaWR4IDwgaW50ZXJu YWxzLT5zbGF2ZV9jb3VudDsgaWR4KyspIHsNCj4gLQkJCWlmIChib25kX2V0aGRldl84MDIzYWRf Zmxvd192ZXJpZnkoYm9uZF9kZXYsDQo+IC0JCQkJCWludGVybmFscy0+c2xhdmVzW2lkeF0ucG9y dF9pZCkgIT0gMCkNCj4gLQkJCQlyZXR1cm4gLTE7DQo+IC0JCX0NCj4gLQl9DQo+IC0NCj4gLQly ZXR1cm4gMDsNCj4gLX0NCj4gLQ0KPiAtaW50DQo+IC1ib25kX2V0aGRldl84MDIzYWRfZmxvd19z ZXQoc3RydWN0IHJ0ZV9ldGhfZGV2ICpib25kX2RldiwgdWludDE2X3Qgc2xhdmVfcG9ydCkgew0K PiAtDQo+IC0Jc3RydWN0IHJ0ZV9mbG93X2Vycm9yIGVycm9yOw0KPiAtCXN0cnVjdCBib25kX2Rl dl9wcml2YXRlICppbnRlcm5hbHMgPSBib25kX2Rldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+IC0J c3RydWN0IHJ0ZV9mbG93X2FjdGlvbl9xdWV1ZSBsYWNwX3F1ZXVlX2NvbmYgPSB7DQo+IC0JCS5p bmRleCA9IGludGVybmFscy0+bW9kZTQuZGVkaWNhdGVkX3F1ZXVlcy5yeF9xaWQsDQo+IC0JfTsN Cj4gLQ0KPiAtCWNvbnN0IHN0cnVjdCBydGVfZmxvd19hY3Rpb24gYWN0aW9uc1tdID0gew0KPiAt CQl7DQo+IC0JCQkudHlwZSA9IFJURV9GTE9XX0FDVElPTl9UWVBFX1FVRVVFLA0KPiAtCQkJLmNv bmYgPSAmbGFjcF9xdWV1ZV9jb25mDQo+IC0JCX0sDQo+IC0JCXsNCj4gLQkJCS50eXBlID0gUlRF X0ZMT1dfQUNUSU9OX1RZUEVfRU5ELA0KPiAtCQl9DQo+IC0JfTsNCj4gLQ0KPiAtCWludGVybmFs cy0+bW9kZTQuZGVkaWNhdGVkX3F1ZXVlcy5mbG93W3NsYXZlX3BvcnRdID0gcnRlX2Zsb3dfY3Jl YXRlKHNsYXZlX3BvcnQsDQo+IC0JCQkmZmxvd19hdHRyXzgwMjNhZCwgZmxvd19pdGVtXzgwMjNh ZCwgYWN0aW9ucywgJmVycm9yKTsNCj4gLQlpZiAoaW50ZXJuYWxzLT5tb2RlNC5kZWRpY2F0ZWRf cXVldWVzLmZsb3dbc2xhdmVfcG9ydF0gPT0gTlVMTCkgew0KPiAtCQlSVEVfQk9ORF9MT0coRVJS LCAiYm9uZF9ldGhkZXZfODAyM2FkX2Zsb3dfc2V0OiAlcyAiDQo+IC0JCQkJIihzbGF2ZV9wb3J0 PSVkIHF1ZXVlX2lkPSVkKSIsDQo+IC0JCQkJZXJyb3IubWVzc2FnZSwgc2xhdmVfcG9ydCwNCj4g LQkJCQlpbnRlcm5hbHMtPm1vZGU0LmRlZGljYXRlZF9xdWV1ZXMucnhfcWlkKTsNCj4gLQkJcmV0 dXJuIC0xOw0KPiAtCX0NCj4gLQ0KPiAtCXJldHVybiAwOw0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMg aW5saW5lIHVpbnQxNl90DQo+IC1yeF9idXJzdF84MDIzYWQodm9pZCAqcXVldWUsIHN0cnVjdCBy dGVfbWJ1ZiAqKmJ1ZnMsIHVpbnQxNl90IG5iX3BrdHMsDQo+IC0JCWJvb2wgZGVkaWNhdGVkX3J4 cSkNCj4gLXsNCj4gLQkvKiBDYXN0IHRvIHN0cnVjdHVyZSwgY29udGFpbmluZyBib25kZWQgZGV2 aWNlJ3MgcG9ydCBpZCBhbmQgcXVldWUgaWQgKi8NCj4gLQlzdHJ1Y3QgYm9uZF9yeF9xdWV1ZSAq YmRfcnhfcSA9IChzdHJ1Y3QgYm9uZF9yeF9xdWV1ZSAqKXF1ZXVlOw0KPiAtCXN0cnVjdCBib25k X2Rldl9wcml2YXRlICppbnRlcm5hbHMgPSBiZF9yeF9xLT5kZXZfcHJpdmF0ZTsNCj4gLQlzdHJ1 Y3QgcnRlX2V0aF9kZXYgKmJvbmRlZF9ldGhfZGV2ID0NCj4gLQkJCQkJJnJ0ZV9ldGhfZGV2aWNl c1tpbnRlcm5hbHMtPnBvcnRfaWRdOw0KPiAtCXN0cnVjdCBydGVfZXRoZXJfYWRkciAqYm9uZF9t YWMgPSBib25kZWRfZXRoX2Rldi0+ZGF0YS0+bWFjX2FkZHJzOw0KPiAtCXN0cnVjdCBydGVfZXRo ZXJfaGRyICpoZHI7DQo+IC0NCj4gLQljb25zdCB1aW50MTZfdCBldGhlcl90eXBlX3Nsb3dfYmUg PQ0KPiAtCQlydGVfYmVfdG9fY3B1XzE2KFJURV9FVEhFUl9UWVBFX1NMT1cpOw0KPiAtCXVpbnQx Nl90IG51bV9yeF90b3RhbCA9IDA7CS8qIFRvdGFsIG51bWJlciBvZiByZWNlaXZlZCBwYWNrZXRz ICovDQo+IC0JdWludDE2X3Qgc2xhdmVzW1JURV9NQVhfRVRIUE9SVFNdOw0KPiAtCXVpbnQxNl90 IHNsYXZlX2NvdW50LCBpZHg7DQo+IC0NCj4gLQl1aW50OF90IGNvbGxlY3Rpbmc7ICAvKiBjdXJy ZW50IHNsYXZlIGNvbGxlY3Rpbmcgc3RhdHVzICovDQo+IC0JY29uc3QgdWludDhfdCBwcm9taXNj ID0gcnRlX2V0aF9wcm9taXNjdW91c19nZXQoaW50ZXJuYWxzLT5wb3J0X2lkKTsNCj4gLQljb25z dCB1aW50OF90IGFsbG11bHRpID0gcnRlX2V0aF9hbGxtdWx0aWNhc3RfZ2V0KGludGVybmFscy0+ cG9ydF9pZCk7DQo+IC0JdWludDhfdCBzdWJ0eXBlOw0KPiAtCXVpbnQxNl90IGk7DQo+IC0JdWlu dDE2X3QgajsNCj4gLQl1aW50MTZfdCBrOw0KPiAtDQo+IC0JLyogQ29weSBzbGF2ZSBsaXN0IHRv IHByb3RlY3QgYWdhaW5zdCBzbGF2ZSB1cC9kb3duIGNoYW5nZXMgZHVyaW5nIHR4DQo+IC0JICog YnVyc3RpbmcgKi8NCj4gLQlzbGF2ZV9jb3VudCA9IGludGVybmFscy0+YWN0aXZlX3NsYXZlX2Nv dW50Ow0KPiAtCW1lbWNweShzbGF2ZXMsIGludGVybmFscy0+YWN0aXZlX3NsYXZlcywNCj4gLQkJ CXNpemVvZihpbnRlcm5hbHMtPmFjdGl2ZV9zbGF2ZXNbMF0pICogc2xhdmVfY291bnQpOw0KPiAt DQo+IC0JaWR4ID0gYmRfcnhfcS0+YWN0aXZlX3NsYXZlOw0KPiAtCWlmIChpZHggPj0gc2xhdmVf Y291bnQpIHsNCj4gLQkJYmRfcnhfcS0+YWN0aXZlX3NsYXZlID0gMDsNCj4gLQkJaWR4ID0gMDsN Cj4gLQl9DQo+IC0JZm9yIChpID0gMDsgaSA8IHNsYXZlX2NvdW50ICYmIG51bV9yeF90b3RhbCA8 IG5iX3BrdHM7IGkrKykgew0KPiAtCQlqID0gbnVtX3J4X3RvdGFsOw0KPiAtCQljb2xsZWN0aW5n ID0gQUNUT1JfU1RBVEUoJmJvbmRfbW9kZV84MDIzYWRfcG9ydHNbc2xhdmVzW2lkeF1dLA0KPiAt CQkJCQkgQ09MTEVDVElORyk7DQo+IC0NCj4gLQkJLyogUmVhZCBwYWNrZXRzIGZyb20gdGhpcyBz bGF2ZSAqLw0KPiAtCQludW1fcnhfdG90YWwgKz0gcnRlX2V0aF9yeF9idXJzdChzbGF2ZXNbaWR4 XSwgYmRfcnhfcS0+cXVldWVfaWQsDQo+IC0JCQkJJmJ1ZnNbbnVtX3J4X3RvdGFsXSwgbmJfcGt0 cyAtIG51bV9yeF90b3RhbCk7DQo+IC0NCj4gLQkJZm9yIChrID0gajsgayA8IDIgJiYgayA8IG51 bV9yeF90b3RhbDsgaysrKQ0KPiAtCQkJcnRlX3ByZWZldGNoMChydGVfcGt0bWJ1Zl9tdG9kKGJ1 ZnNba10sIHZvaWQgKikpOw0KPiAtDQo+IC0JCS8qIEhhbmRsZSBzbG93IHByb3RvY29sIHBhY2tl dHMuICovDQo+IC0JCXdoaWxlIChqIDwgbnVtX3J4X3RvdGFsKSB7DQo+IC0JCQlpZiAoaiArIDMg PCBudW1fcnhfdG90YWwpDQo+IC0JCQkJcnRlX3ByZWZldGNoMChydGVfcGt0bWJ1Zl9tdG9kKGJ1 ZnNbaiArIDNdLCB2b2lkICopKTsNCj4gLQ0KPiAtCQkJaGRyID0gcnRlX3BrdG1idWZfbXRvZChi dWZzW2pdLCBzdHJ1Y3QgcnRlX2V0aGVyX2hkciAqKTsNCj4gLQkJCXN1YnR5cGUgPSAoKHN0cnVj dCBzbG93X3Byb3RvY29sX2ZyYW1lICopaGRyKS0+c2xvd19wcm90b2NvbC5zdWJ0eXBlOw0KPiAt DQo+IC0JCQkvKiBSZW1vdmUgcGFja2V0IGZyb20gYXJyYXkgaWY6DQo+IC0JCQkgKiAtIGl0IGlz IHNsb3cgcGFja2V0IGJ1dCBubyBkZWRpY2F0ZWQgcnhxIGlzIHByZXNlbnQsDQo+IC0JCQkgKiAt IHNsYXZlIGlzIG5vdCBpbiBjb2xsZWN0aW5nIHN0YXRlLA0KPiAtCQkJICogLSBib25kaW5nIGlu dGVyZmFjZSBpcyBub3QgaW4gcHJvbWlzY3VvdXMgbW9kZToNCj4gLQkJCSAqICAgLSBwYWNrZXQg aXMgdW5pY2FzdCBhbmQgYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCwNCj4gLQkJCSAqICAgLSBwYWNr ZXQgaXMgbXVsdGljYXN0IGFuZCBib25kaW5nIGludGVyZmFjZQ0KPiAtCQkJICogICAgIGlzIG5v dCBpbiBhbGxtdWx0aSwNCj4gLQkJCSAqLw0KPiAtCQkJaWYgKHVubGlrZWx5KA0KPiAtCQkJCSgh ZGVkaWNhdGVkX3J4cSAmJg0KPiAtCQkJCSBpc19sYWNwX3BhY2tldHMoaGRyLT5ldGhlcl90eXBl LCBzdWJ0eXBlLA0KPiAtCQkJCQkJIGJ1ZnNbal0pKSB8fA0KPiAtCQkJCSFjb2xsZWN0aW5nIHx8 DQo+IC0JCQkJKCFwcm9taXNjICYmDQo+IC0JCQkJICgocnRlX2lzX3VuaWNhc3RfZXRoZXJfYWRk cigmaGRyLT5kc3RfYWRkcikgJiYNCj4gLQkJCQkgICAhcnRlX2lzX3NhbWVfZXRoZXJfYWRkcihi b25kX21hYywNCj4gLQkJCQkJCSAgICAgICAmaGRyLT5kc3RfYWRkcikpIHx8DQo+IC0JCQkJICAo IWFsbG11bHRpICYmDQo+IC0JCQkJICAgcnRlX2lzX211bHRpY2FzdF9ldGhlcl9hZGRyKCZoZHIt PmRzdF9hZGRyKSkpKSkpIHsNCj4gLQ0KPiAtCQkJCWlmIChoZHItPmV0aGVyX3R5cGUgPT0gZXRo ZXJfdHlwZV9zbG93X2JlKSB7DQo+IC0JCQkJCWJvbmRfbW9kZV84MDIzYWRfaGFuZGxlX3Nsb3df cGt0KA0KPiAtCQkJCQkgICAgaW50ZXJuYWxzLCBzbGF2ZXNbaWR4XSwgYnVmc1tqXSk7DQo+IC0J CQkJfSBlbHNlDQo+IC0JCQkJCXJ0ZV9wa3RtYnVmX2ZyZWUoYnVmc1tqXSk7DQo+IC0NCj4gLQkJ CQkvKiBQYWNrZXQgaXMgbWFuYWdlZCBieSBtb2RlIDQgb3IgZHJvcHBlZCwgc2hpZnQgdGhlIGFy cmF5ICovDQo+IC0JCQkJbnVtX3J4X3RvdGFsLS07DQo+IC0JCQkJaWYgKGogPCBudW1fcnhfdG90 YWwpIHsNCj4gLQkJCQkJbWVtbW92ZSgmYnVmc1tqXSwgJmJ1ZnNbaiArIDFdLCBzaXplb2YoYnVm c1swXSkgKg0KPiAtCQkJCQkJKG51bV9yeF90b3RhbCAtIGopKTsNCj4gLQkJCQl9DQo+IC0JCQl9 IGVsc2UNCj4gLQkJCQlqKys7DQo+IC0JCX0NCj4gLQkJaWYgKHVubGlrZWx5KCsraWR4ID09IHNs YXZlX2NvdW50KSkNCj4gLQkJCWlkeCA9IDA7DQo+IC0JfQ0KPiAtDQo+IC0JaWYgKCsrYmRfcnhf cS0+YWN0aXZlX3NsYXZlID49IHNsYXZlX2NvdW50KQ0KPiAtCQliZF9yeF9xLT5hY3RpdmVfc2xh dmUgPSAwOw0KPiAtDQo+IC0JcmV0dXJuIG51bV9yeF90b3RhbDsNCj4gLX0NCj4gLQ0KPiAtc3Rh dGljIHVpbnQxNl90DQo+IC1ib25kX2V0aGRldl9yeF9idXJzdF84MDIzYWQodm9pZCAqcXVldWUs IHN0cnVjdCBydGVfbWJ1ZiAqKmJ1ZnMsDQo+IC0JCXVpbnQxNl90IG5iX3BrdHMpDQo+IC17DQo+ IC0JcmV0dXJuIHJ4X2J1cnN0XzgwMjNhZChxdWV1ZSwgYnVmcywgbmJfcGt0cywgZmFsc2UpOw0K PiAtfQ0KPiAtDQo+IC1zdGF0aWMgdWludDE2X3QNCj4gLWJvbmRfZXRoZGV2X3J4X2J1cnN0Xzgw MjNhZF9mYXN0X3F1ZXVlKHZvaWQgKnF1ZXVlLCBzdHJ1Y3QgcnRlX21idWYgKipidWZzLA0KPiAt CQl1aW50MTZfdCBuYl9wa3RzKQ0KPiAtew0KPiAtCXJldHVybiByeF9idXJzdF84MDIzYWQocXVl dWUsIGJ1ZnMsIG5iX3BrdHMsIHRydWUpOw0KPiAtfQ0KPiAtDQo+IC0jaWYgZGVmaW5lZChSVEVf TElCUlRFX0JPTkRfREVCVUdfQUxCKSB8fCBkZWZpbmVkKFJURV9MSUJSVEVfQk9ORF9ERUJVR19B TEJfTDEpDQo+IC11aW50MzJfdCBidXJzdG51bWJlclJYOw0KPiAtdWludDMyX3QgYnVyc3RudW1i ZXJUWDsNCj4gLQ0KPiAtI2lmZGVmIFJURV9MSUJSVEVfQk9ORF9ERUJVR19BTEINCj4gLQ0KPiAt c3RhdGljIHZvaWQNCj4gLWFycF9vcF9uYW1lKHVpbnQxNl90IGFycF9vcCwgY2hhciAqYnVmLCBz aXplX3QgYnVmX2xlbikNCj4gLXsNCj4gLQlzd2l0Y2ggKGFycF9vcCkgew0KPiAtCWNhc2UgUlRF X0FSUF9PUF9SRVFVRVNUOg0KPiAtCQlzdHJsY3B5KGJ1ZiwgIkFSUCBSZXF1ZXN0IiwgYnVmX2xl bik7DQo+IC0JCXJldHVybjsNCj4gLQljYXNlIFJURV9BUlBfT1BfUkVQTFk6DQo+IC0JCXN0cmxj cHkoYnVmLCAiQVJQIFJlcGx5IiwgYnVmX2xlbik7DQo+IC0JCXJldHVybjsNCj4gLQljYXNlIFJU RV9BUlBfT1BfUkVWUkVRVUVTVDoNCj4gLQkJc3RybGNweShidWYsICJSZXZlcnNlIEFSUCBSZXF1 ZXN0IiwgYnVmX2xlbik7DQo+IC0JCXJldHVybjsNCj4gLQljYXNlIFJURV9BUlBfT1BfUkVWUkVQ TFk6DQo+IC0JCXN0cmxjcHkoYnVmLCAiUmV2ZXJzZSBBUlAgUmVwbHkiLCBidWZfbGVuKTsNCj4g LQkJcmV0dXJuOw0KPiAtCWNhc2UgUlRFX0FSUF9PUF9JTlZSRVFVRVNUOg0KPiAtCQlzdHJsY3B5 KGJ1ZiwgIlBlZXIgSWRlbnRpZnkgUmVxdWVzdCIsIGJ1Zl9sZW4pOw0KPiAtCQlyZXR1cm47DQo+ IC0JY2FzZSBSVEVfQVJQX09QX0lOVlJFUExZOg0KPiAtCQlzdHJsY3B5KGJ1ZiwgIlBlZXIgSWRl bnRpZnkgUmVwbHkiLCBidWZfbGVuKTsNCj4gLQkJcmV0dXJuOw0KPiAtCWRlZmF1bHQ6DQo+IC0J CWJyZWFrOw0KPiAtCX0NCj4gLQlzdHJsY3B5KGJ1ZiwgIlVua25vd24iLCBidWZfbGVuKTsNCj4g LQlyZXR1cm47DQo+IC19DQo+IC0jZW5kaWYNCj4gLSNkZWZpbmUgTWF4SVB2NFN0cmluZwkxNg0K PiAtc3RhdGljIHZvaWQNCj4gLWlwdjRfYWRkcl90b19kb3QodWludDMyX3QgYmVfaXB2NF9hZGRy LCBjaGFyICpidWYsIHVpbnQ4X3QgYnVmX3NpemUpDQo+IC17DQo+IC0JdWludDMyX3QgaXB2NF9h ZGRyOw0KPiAtDQo+IC0JaXB2NF9hZGRyID0gcnRlX2JlX3RvX2NwdV8zMihiZV9pcHY0X2FkZHIp Ow0KPiAtCXNucHJpbnRmKGJ1ZiwgYnVmX3NpemUsICIlZC4lZC4lZC4lZCIsIChpcHY0X2FkZHIg Pj4gMjQpICYgMHhGRiwNCj4gLQkJKGlwdjRfYWRkciA+PiAxNikgJiAweEZGLCAoaXB2NF9hZGRy ID4+IDgpICYgMHhGRiwNCj4gLQkJaXB2NF9hZGRyICYgMHhGRik7DQo+IC19DQo+IC0NCj4gLSNk ZWZpbmUgTUFYX0NMSUVOVFNfTlVNQkVSCTEyOA0KPiAtdWludDhfdCBhY3RpdmVfY2xpZW50czsN Cj4gLXN0cnVjdCBjbGllbnRfc3RhdHNfdCB7DQo+IC0JdWludDE2X3QgcG9ydDsNCj4gLQl1aW50 MzJfdCBpcHY0X2FkZHI7DQo+IC0JdWludDMyX3QgaXB2NF9yeF9wYWNrZXRzOw0KPiAtCXVpbnQz Ml90IGlwdjRfdHhfcGFja2V0czsNCj4gLX07DQo+IC1zdHJ1Y3QgY2xpZW50X3N0YXRzX3QgY2xp ZW50X3N0YXRzW01BWF9DTElFTlRTX05VTUJFUl07DQo+IC0NCj4gLXN0YXRpYyB2b2lkDQo+IC11 cGRhdGVfY2xpZW50X3N0YXRzKHVpbnQzMl90IGFkZHIsIHVpbnQxNl90IHBvcnQsIHVpbnQzMl90 ICpUWG9yUlhpbmRpY2F0b3IpDQo+IC17DQo+IC0JaW50IGkgPSAwOw0KPiAtDQo+IC0JZm9yICg7 IGkgPCBNQVhfQ0xJRU5UU19OVU1CRVI7IGkrKykJew0KPiAtCQlpZiAoKGNsaWVudF9zdGF0c1tp XS5pcHY0X2FkZHIgPT0gYWRkcikgJiYgKGNsaWVudF9zdGF0c1tpXS5wb3J0ID09IHBvcnQpKQl7 DQo+IC0JCQkvKiBKdXN0IHVwZGF0ZSBSWCBwYWNrZXRzIG51bWJlciBmb3IgdGhpcyBjbGllbnQg Ki8NCj4gLQkJCWlmIChUWG9yUlhpbmRpY2F0b3IgPT0gJmJ1cnN0bnVtYmVyUlgpDQo+IC0JCQkJ Y2xpZW50X3N0YXRzW2ldLmlwdjRfcnhfcGFja2V0cysrOw0KPiAtCQkJZWxzZQ0KPiAtCQkJCWNs aWVudF9zdGF0c1tpXS5pcHY0X3R4X3BhY2tldHMrKzsNCj4gLQkJCXJldHVybjsNCj4gLQkJfQ0K PiAtCX0NCj4gLQkvKiBXZSBoYXZlIGEgbmV3IGNsaWVudC4gSW5zZXJ0IGhpbSB0byB0aGUgdGFi bGUsIGFuZCBpbmNyZW1lbnQgc3RhdHMgKi8NCj4gLQlpZiAoVFhvclJYaW5kaWNhdG9yID09ICZi dXJzdG51bWJlclJYKQ0KPiAtCQljbGllbnRfc3RhdHNbYWN0aXZlX2NsaWVudHNdLmlwdjRfcnhf cGFja2V0cysrOw0KPiAtCWVsc2UNCj4gLQkJY2xpZW50X3N0YXRzW2FjdGl2ZV9jbGllbnRzXS5p cHY0X3R4X3BhY2tldHMrKzsNCj4gLQljbGllbnRfc3RhdHNbYWN0aXZlX2NsaWVudHNdLmlwdjRf YWRkciA9IGFkZHI7DQo+IC0JY2xpZW50X3N0YXRzW2FjdGl2ZV9jbGllbnRzXS5wb3J0ID0gcG9y dDsNCj4gLQlhY3RpdmVfY2xpZW50cysrOw0KPiAtDQo+IC19DQo+IC0NCj4gLSNpZmRlZiBSVEVf TElCUlRFX0JPTkRfREVCVUdfQUxCDQo+IC0jZGVmaW5lIE1PREU2X0RFQlVHKGluZm8sIHNyY19p cCwgZHN0X2lwLCBldGhfaCwgYXJwX29wLCBwb3J0LCBidXJzdG51bWJlcikgXA0KPiAtCXJ0ZV9s b2coUlRFX0xPR19ERUJVRywgYm9uZF9sb2d0eXBlLAkJCQlcDQo+IC0JCSIlcyBwb3J0OiVkIFNy Y01BQzoiIFJURV9FVEhFUl9BRERSX1BSVF9GTVQgIiBTcmNJUDolcyAiIFwNCj4gLQkJIkRzdE1B QzoiIFJURV9FVEhFUl9BRERSX1BSVF9GTVQgIiBEc3RJUDolcyAlcyAlZFxuIiwgXA0KPiAtCQlp bmZvLAkJCQkJCQlcDQo+IC0JCXBvcnQsCQkJCQkJCVwNCj4gLQkJUlRFX0VUSEVSX0FERFJfQllU RVMoJmV0aF9oLT5zcmNfYWRkciksICAgICAgICAgICAgICAgICAgXA0KPiAtCQlzcmNfaXAsCQkJ CQkJCVwNCj4gLQkJUlRFX0VUSEVSX0FERFJfQllURVMoJmV0aF9oLT5kc3RfYWRkciksICAgICAg ICAgICAgICAgICAgXA0KPiAtCQlkc3RfaXAsCQkJCQkJCVwNCj4gLQkJYXJwX29wLCArK2J1cnN0 bnVtYmVyKQ0KPiAtI2VuZGlmDQo+IC0NCj4gLXN0YXRpYyB2b2lkDQo+IC1tb2RlNl9kZWJ1Zyhj b25zdCBjaGFyIF9fcnRlX3VudXNlZCAqaW5mbywNCj4gLQlzdHJ1Y3QgcnRlX2V0aGVyX2hkciAq ZXRoX2gsIHVpbnQxNl90IHBvcnQsDQo+IC0JdWludDMyX3QgX19ydGVfdW51c2VkICpidXJzdG51 bWJlcikNCj4gLXsNCj4gLQlzdHJ1Y3QgcnRlX2lwdjRfaGRyICppcHY0X2g7DQo+IC0jaWZkZWYg UlRFX0xJQlJURV9CT05EX0RFQlVHX0FMQg0KPiAtCXN0cnVjdCBydGVfYXJwX2hkciAqYXJwX2g7 DQo+IC0JY2hhciBkc3RfaXBbMTZdOw0KPiAtCWNoYXIgQXJwT3BbMjRdOw0KPiAtCWNoYXIgYnVm WzE2XTsNCj4gLSNlbmRpZg0KPiAtCWNoYXIgc3JjX2lwWzE2XTsNCj4gLQ0KPiAtCXVpbnQxNl90 IGV0aGVyX3R5cGUgPSBldGhfaC0+ZXRoZXJfdHlwZTsNCj4gLQl1aW50MTZfdCBvZmZzZXQgPSBn ZXRfdmxhbl9vZmZzZXQoZXRoX2gsICZldGhlcl90eXBlKTsNCj4gLQ0KPiAtI2lmZGVmIFJURV9M SUJSVEVfQk9ORF9ERUJVR19BTEINCj4gLQlzdHJsY3B5KGJ1ZiwgaW5mbywgMTYpOw0KPiAtI2Vu ZGlmDQo+IC0NCj4gLQlpZiAoZXRoZXJfdHlwZSA9PSBydGVfY3B1X3RvX2JlXzE2KFJURV9FVEhF Ul9UWVBFX0lQVjQpKSB7DQo+IC0JCWlwdjRfaCA9IChzdHJ1Y3QgcnRlX2lwdjRfaGRyICopKChj aGFyICopKGV0aF9oICsgMSkgKyBvZmZzZXQpOw0KPiAtCQlpcHY0X2FkZHJfdG9fZG90KGlwdjRf aC0+c3JjX2FkZHIsIHNyY19pcCwgTWF4SVB2NFN0cmluZyk7DQo+IC0jaWZkZWYgUlRFX0xJQlJU RV9CT05EX0RFQlVHX0FMQg0KPiAtCQlpcHY0X2FkZHJfdG9fZG90KGlwdjRfaC0+ZHN0X2FkZHIs IGRzdF9pcCwgTWF4SVB2NFN0cmluZyk7DQo+IC0JCU1PREU2X0RFQlVHKGJ1Ziwgc3JjX2lwLCBk c3RfaXAsIGV0aF9oLCAiIiwgcG9ydCwgKmJ1cnN0bnVtYmVyKTsNCj4gLSNlbmRpZg0KPiAtCQl1 cGRhdGVfY2xpZW50X3N0YXRzKGlwdjRfaC0+c3JjX2FkZHIsIHBvcnQsIGJ1cnN0bnVtYmVyKTsN Cj4gLQl9DQo+IC0jaWZkZWYgUlRFX0xJQlJURV9CT05EX0RFQlVHX0FMQg0KPiAtCWVsc2UgaWYg KGV0aGVyX3R5cGUgPT0gcnRlX2NwdV90b19iZV8xNihSVEVfRVRIRVJfVFlQRV9BUlApKSB7DQo+ IC0JCWFycF9oID0gKHN0cnVjdCBydGVfYXJwX2hkciAqKSgoY2hhciAqKShldGhfaCArIDEpICsg b2Zmc2V0KTsNCj4gLQkJaXB2NF9hZGRyX3RvX2RvdChhcnBfaC0+YXJwX2RhdGEuYXJwX3NpcCwg c3JjX2lwLCBNYXhJUHY0U3RyaW5nKTsNCj4gLQkJaXB2NF9hZGRyX3RvX2RvdChhcnBfaC0+YXJw X2RhdGEuYXJwX3RpcCwgZHN0X2lwLCBNYXhJUHY0U3RyaW5nKTsNCj4gLQkJYXJwX29wX25hbWUo cnRlX2JlX3RvX2NwdV8xNihhcnBfaC0+YXJwX29wY29kZSksDQo+IC0JCQkJQXJwT3AsIHNpemVv ZihBcnBPcCkpOw0KPiAtCQlNT0RFNl9ERUJVRyhidWYsIHNyY19pcCwgZHN0X2lwLCBldGhfaCwg QXJwT3AsIHBvcnQsICpidXJzdG51bWJlcik7DQo+IC0JfQ0KPiAtI2VuZGlmDQo+IC19DQo+IC0j ZW5kaWYNCj4gLQ0KPiAtc3RhdGljIHVpbnQxNl90DQo+IC1ib25kX2V0aGRldl9yeF9idXJzdF9h bGIodm9pZCAqcXVldWUsIHN0cnVjdCBydGVfbWJ1ZiAqKmJ1ZnMsIHVpbnQxNl90IG5iX3BrdHMp DQo+IC17DQo+IC0Jc3RydWN0IGJvbmRfcnhfcXVldWUgKmJkX3J4X3EgPSAoc3RydWN0IGJvbmRf cnhfcXVldWUgKilxdWV1ZTsNCj4gLQlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxz ID0gYmRfcnhfcS0+ZGV2X3ByaXZhdGU7DQo+IC0Jc3RydWN0IHJ0ZV9ldGhlcl9oZHIgKmV0aF9o Ow0KPiAtCXVpbnQxNl90IGV0aGVyX3R5cGUsIG9mZnNldDsNCj4gLQl1aW50MTZfdCBuYl9yZWN2 X3BrdHM7DQo+IC0JaW50IGk7DQo+IC0NCj4gLQluYl9yZWN2X3BrdHMgPSBib25kX2V0aGRldl9y eF9idXJzdChxdWV1ZSwgYnVmcywgbmJfcGt0cyk7DQo+IC0NCj4gLQlmb3IgKGkgPSAwOyBpIDwg bmJfcmVjdl9wa3RzOyBpKyspIHsNCj4gLQkJZXRoX2ggPSBydGVfcGt0bWJ1Zl9tdG9kKGJ1ZnNb aV0sIHN0cnVjdCBydGVfZXRoZXJfaGRyICopOw0KPiAtCQlldGhlcl90eXBlID0gZXRoX2gtPmV0 aGVyX3R5cGU7DQo+IC0JCW9mZnNldCA9IGdldF92bGFuX29mZnNldChldGhfaCwgJmV0aGVyX3R5 cGUpOw0KPiAtDQo+IC0JCWlmIChldGhlcl90eXBlID09IHJ0ZV9jcHVfdG9fYmVfMTYoUlRFX0VU SEVSX1RZUEVfQVJQKSkgew0KPiAtI2lmIGRlZmluZWQoUlRFX0xJQlJURV9CT05EX0RFQlVHX0FM QikgfHwgZGVmaW5lZChSVEVfTElCUlRFX0JPTkRfREVCVUdfQUxCX0wxKQ0KPiAtCQkJbW9kZTZf ZGVidWcoIlJYIEFSUDoiLCBldGhfaCwgYnVmc1tpXS0+cG9ydCwgJmJ1cnN0bnVtYmVyUlgpOw0K PiAtI2VuZGlmDQo+IC0JCQlib25kX21vZGVfYWxiX2FycF9yZWN2KGV0aF9oLCBvZmZzZXQsIGlu dGVybmFscyk7DQo+IC0JCX0NCj4gLSNpZiBkZWZpbmVkKFJURV9MSUJSVEVfQk9ORF9ERUJVR19B TEIpIHx8IGRlZmluZWQoUlRFX0xJQlJURV9CT05EX0RFQlVHX0FMQl9MMSkNCj4gLQkJZWxzZSBp ZiAoZXRoZXJfdHlwZSA9PSBydGVfY3B1X3RvX2JlXzE2KFJURV9FVEhFUl9UWVBFX0lQVjQpKQ0K PiAtCQkJbW9kZTZfZGVidWcoIlJYIElQdjQ6IiwgZXRoX2gsIGJ1ZnNbaV0tPnBvcnQsICZidXJz dG51bWJlclJYKTsNCj4gLSNlbmRpZg0KPiAtCX0NCj4gLQ0KPiAtCXJldHVybiBuYl9yZWN2X3Br dHM7DQo+IC19DQo+IC0NCj4gLXN0YXRpYyB1aW50MTZfdA0KPiAtYm9uZF9ldGhkZXZfdHhfYnVy c3Rfcm91bmRfcm9iaW4odm9pZCAqcXVldWUsIHN0cnVjdCBydGVfbWJ1ZiAqKmJ1ZnMsDQo+IC0J CXVpbnQxNl90IG5iX3BrdHMpDQo+IC17DQo+IC0Jc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmlu dGVybmFsczsNCj4gLQlzdHJ1Y3QgYm9uZF90eF9xdWV1ZSAqYmRfdHhfcTsNCj4gLQ0KPiAtCXN0 cnVjdCBydGVfbWJ1ZiAqc2xhdmVfYnVmc1tSVEVfTUFYX0VUSFBPUlRTXVtuYl9wa3RzXTsNCj4g LQl1aW50MTZfdCBzbGF2ZV9uYl9wa3RzW1JURV9NQVhfRVRIUE9SVFNdID0geyAwIH07DQo+IC0N Cj4gLQl1aW50MTZfdCBudW1fb2Zfc2xhdmVzOw0KPiAtCXVpbnQxNl90IHNsYXZlc1tSVEVfTUFY X0VUSFBPUlRTXTsNCj4gLQ0KPiAtCXVpbnQxNl90IG51bV90eF90b3RhbCA9IDAsIG51bV90eF9z bGF2ZTsNCj4gLQ0KPiAtCXN0YXRpYyBpbnQgc2xhdmVfaWR4ID0gMDsNCj4gLQlpbnQgaSwgY3Ns YXZlX2lkeCA9IDAsIHR4X2ZhaWxfdG90YWwgPSAwOw0KPiAtDQo+IC0JYmRfdHhfcSA9IChzdHJ1 Y3QgYm9uZF90eF9xdWV1ZSAqKXF1ZXVlOw0KPiAtCWludGVybmFscyA9IGJkX3R4X3EtPmRldl9w cml2YXRlOw0KPiAtDQo+IC0JLyogQ29weSBzbGF2ZSBsaXN0IHRvIHByb3RlY3QgYWdhaW5zdCBz bGF2ZSB1cC9kb3duIGNoYW5nZXMgZHVyaW5nIHR4DQo+IC0JICogYnVyc3RpbmcgKi8NCj4gLQlu dW1fb2Zfc2xhdmVzID0gaW50ZXJuYWxzLT5hY3RpdmVfc2xhdmVfY291bnQ7DQo+IC0JbWVtY3B5 KHNsYXZlcywgaW50ZXJuYWxzLT5hY3RpdmVfc2xhdmVzLA0KPiAtCQkJc2l6ZW9mKGludGVybmFs cy0+YWN0aXZlX3NsYXZlc1swXSkgKiBudW1fb2Zfc2xhdmVzKTsNCj4gLQ0KPiAtCWlmIChudW1f b2Zfc2xhdmVzIDwgMSkNCj4gLQkJcmV0dXJuIG51bV90eF90b3RhbDsNCj4gLQ0KPiAtCS8qIFBv cHVsYXRlIHNsYXZlcyBtYnVmIHdpdGggd2hpY2ggcGFja2V0cyBhcmUgdG8gYmUgc2VudCBvbiBp dCAgKi8NCj4gLQlmb3IgKGkgPSAwOyBpIDwgbmJfcGt0czsgaSsrKSB7DQo+IC0JCWNzbGF2ZV9p ZHggPSAoc2xhdmVfaWR4ICsgaSkgJSBudW1fb2Zfc2xhdmVzOw0KPiAtCQlzbGF2ZV9idWZzW2Nz bGF2ZV9pZHhdWyhzbGF2ZV9uYl9wa3RzW2NzbGF2ZV9pZHhdKSsrXSA9IGJ1ZnNbaV07DQo+IC0J fQ0KPiAtDQo+IC0JLyogaW5jcmVtZW50IGN1cnJlbnQgc2xhdmUgaW5kZXggc28gdGhlIG5leHQg Y2FsbCB0byB0eCBidXJzdCBzdGFydHMgb24gdGhlDQo+IC0JICogbmV4dCBzbGF2ZSAqLw0KPiAt CXNsYXZlX2lkeCA9ICsrY3NsYXZlX2lkeDsNCj4gLQ0KPiAtCS8qIFNlbmQgcGFja2V0IGJ1cnN0 IG9uIGVhY2ggc2xhdmUgZGV2aWNlICovDQo+IC0JZm9yIChpID0gMDsgaSA8IG51bV9vZl9zbGF2 ZXM7IGkrKykgew0KPiAtCQlpZiAoc2xhdmVfbmJfcGt0c1tpXSA+IDApIHsNCj4gLQkJCW51bV90 eF9zbGF2ZSA9IHJ0ZV9ldGhfdHhfYnVyc3Qoc2xhdmVzW2ldLCBiZF90eF9xLT5xdWV1ZV9pZCwN Cj4gLQkJCQkJc2xhdmVfYnVmc1tpXSwgc2xhdmVfbmJfcGt0c1tpXSk7DQo+IC0NCj4gLQkJCS8q IGlmIHR4IGJ1cnN0IGZhaWxzIG1vdmUgcGFja2V0cyB0byBlbmQgb2YgYnVmcyAqLw0KPiAtCQkJ aWYgKHVubGlrZWx5KG51bV90eF9zbGF2ZSA8IHNsYXZlX25iX3BrdHNbaV0pKSB7DQo+IC0JCQkJ aW50IHR4X2ZhaWxfc2xhdmUgPSBzbGF2ZV9uYl9wa3RzW2ldIC0gbnVtX3R4X3NsYXZlOw0KPiAt DQo+IC0JCQkJdHhfZmFpbF90b3RhbCArPSB0eF9mYWlsX3NsYXZlOw0KPiAtDQo+IC0JCQkJbWVt Y3B5KCZidWZzW25iX3BrdHMgLSB0eF9mYWlsX3RvdGFsXSwNCj4gLQkJCQkgICAgICAgJnNsYXZl X2J1ZnNbaV1bbnVtX3R4X3NsYXZlXSwNCj4gLQkJCQkgICAgICAgdHhfZmFpbF9zbGF2ZSAqIHNp emVvZihidWZzWzBdKSk7DQo+IC0JCQl9DQo+IC0JCQludW1fdHhfdG90YWwgKz0gbnVtX3R4X3Ns YXZlOw0KPiAtCQl9DQo+IC0JfQ0KPiAtDQo+IC0JcmV0dXJuIG51bV90eF90b3RhbDsNCj4gLX0N Cj4gLQ0KPiAtc3RhdGljIHVpbnQxNl90DQo+IC1ib25kX2V0aGRldl90eF9idXJzdF9hY3RpdmVf YmFja3VwKHZvaWQgKnF1ZXVlLA0KPiAtCQlzdHJ1Y3QgcnRlX21idWYgKipidWZzLCB1aW50MTZf dCBuYl9wa3RzKQ0KPiAtew0KPiAtCXN0cnVjdCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHM7 DQo+IC0Jc3RydWN0IGJvbmRfdHhfcXVldWUgKmJkX3R4X3E7DQo+IC0NCj4gLQliZF90eF9xID0g KHN0cnVjdCBib25kX3R4X3F1ZXVlICopcXVldWU7DQo+IC0JaW50ZXJuYWxzID0gYmRfdHhfcS0+ ZGV2X3ByaXZhdGU7DQo+IC0NCj4gLQlpZiAoaW50ZXJuYWxzLT5hY3RpdmVfc2xhdmVfY291bnQg PCAxKQ0KPiAtCQlyZXR1cm4gMDsNCj4gLQ0KPiAtCXJldHVybiBydGVfZXRoX3R4X2J1cnN0KGlu dGVybmFscy0+Y3VycmVudF9wcmltYXJ5X3BvcnQsIGJkX3R4X3EtPnF1ZXVlX2lkLA0KPiAtCQkJ YnVmcywgbmJfcGt0cyk7DQo+IC19DQo+IC0NCj4gLXN0YXRpYyBpbmxpbmUgdWludDE2X3QNCj4g LWV0aGVyX2hhc2goc3RydWN0IHJ0ZV9ldGhlcl9oZHIgKmV0aF9oZHIpDQo+IC17DQo+IC0JdW5h bGlnbmVkX3VpbnQxNl90ICp3b3JkX3NyY19hZGRyID0NCj4gLQkJKHVuYWxpZ25lZF91aW50MTZf dCAqKWV0aF9oZHItPnNyY19hZGRyLmFkZHJfYnl0ZXM7DQo+IC0JdW5hbGlnbmVkX3VpbnQxNl90 ICp3b3JkX2RzdF9hZGRyID0NCj4gLQkJKHVuYWxpZ25lZF91aW50MTZfdCAqKWV0aF9oZHItPmRz dF9hZGRyLmFkZHJfYnl0ZXM7DQo+IC0NCj4gLQlyZXR1cm4gKHdvcmRfc3JjX2FkZHJbMF0gXiB3 b3JkX2RzdF9hZGRyWzBdKSBeDQo+IC0JCQkod29yZF9zcmNfYWRkclsxXSBeIHdvcmRfZHN0X2Fk ZHJbMV0pIF4NCj4gLQkJCSh3b3JkX3NyY19hZGRyWzJdIF4gd29yZF9kc3RfYWRkclsyXSk7DQo+ IC19DQo+IC0NCj4gLXN0YXRpYyBpbmxpbmUgdWludDMyX3QNCj4gLWlwdjRfaGFzaChzdHJ1Y3Qg cnRlX2lwdjRfaGRyICppcHY0X2hkcikNCj4gLXsNCj4gLQlyZXR1cm4gaXB2NF9oZHItPnNyY19h ZGRyIF4gaXB2NF9oZHItPmRzdF9hZGRyOw0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMgaW5saW5lIHVp bnQzMl90DQo+IC1pcHY2X2hhc2goc3RydWN0IHJ0ZV9pcHY2X2hkciAqaXB2Nl9oZHIpDQo+IC17 DQo+IC0JdW5hbGlnbmVkX3VpbnQzMl90ICp3b3JkX3NyY19hZGRyID0NCj4gLQkJKHVuYWxpZ25l ZF91aW50MzJfdCAqKSYoaXB2Nl9oZHItPnNyY19hZGRyWzBdKTsNCj4gLQl1bmFsaWduZWRfdWlu dDMyX3QgKndvcmRfZHN0X2FkZHIgPQ0KPiAtCQkodW5hbGlnbmVkX3VpbnQzMl90ICopJihpcHY2 X2hkci0+ZHN0X2FkZHJbMF0pOw0KPiAtDQo+IC0JcmV0dXJuICh3b3JkX3NyY19hZGRyWzBdIF4g d29yZF9kc3RfYWRkclswXSkgXg0KPiAtCQkJKHdvcmRfc3JjX2FkZHJbMV0gXiB3b3JkX2RzdF9h ZGRyWzFdKSBeDQo+IC0JCQkod29yZF9zcmNfYWRkclsyXSBeIHdvcmRfZHN0X2FkZHJbMl0pIF4N Cj4gLQkJCSh3b3JkX3NyY19hZGRyWzNdIF4gd29yZF9kc3RfYWRkclszXSk7DQo+IC19DQo+IC0N Cj4gLQ0KPiAtdm9pZA0KPiAtYnVyc3RfeG1pdF9sMl9oYXNoKHN0cnVjdCBydGVfbWJ1ZiAqKmJ1 ZiwgdWludDE2X3QgbmJfcGt0cywNCj4gLQkJdWludDE2X3Qgc2xhdmVfY291bnQsIHVpbnQxNl90 ICpzbGF2ZXMpDQo+IC17DQo+IC0Jc3RydWN0IHJ0ZV9ldGhlcl9oZHIgKmV0aF9oZHI7DQo+IC0J dWludDMyX3QgaGFzaDsNCj4gLQlpbnQgaTsNCj4gLQ0KPiAtCWZvciAoaSA9IDA7IGkgPCBuYl9w a3RzOyBpKyspIHsNCj4gLQkJZXRoX2hkciA9IHJ0ZV9wa3RtYnVmX210b2QoYnVmW2ldLCBzdHJ1 Y3QgcnRlX2V0aGVyX2hkciAqKTsNCj4gLQ0KPiAtCQloYXNoID0gZXRoZXJfaGFzaChldGhfaGRy KTsNCj4gLQ0KPiAtCQlzbGF2ZXNbaV0gPSAoaGFzaCBePSBoYXNoID4+IDgpICUgc2xhdmVfY291 bnQ7DQo+IC0JfQ0KPiAtfQ0KPiAtDQo+IC12b2lkDQo+IC1idXJzdF94bWl0X2wyM19oYXNoKHN0 cnVjdCBydGVfbWJ1ZiAqKmJ1ZiwgdWludDE2X3QgbmJfcGt0cywNCj4gLQkJdWludDE2X3Qgc2xh dmVfY291bnQsIHVpbnQxNl90ICpzbGF2ZXMpDQo+IC17DQo+IC0JdWludDE2X3QgaTsNCj4gLQlz dHJ1Y3QgcnRlX2V0aGVyX2hkciAqZXRoX2hkcjsNCj4gLQl1aW50MTZfdCBwcm90bzsNCj4gLQlz aXplX3Qgdmxhbl9vZmZzZXQ7DQo+IC0JdWludDMyX3QgaGFzaCwgbDNoYXNoOw0KPiAtDQo+IC0J Zm9yIChpID0gMDsgaSA8IG5iX3BrdHM7IGkrKykgew0KPiAtCQlldGhfaGRyID0gcnRlX3BrdG1i dWZfbXRvZChidWZbaV0sIHN0cnVjdCBydGVfZXRoZXJfaGRyICopOw0KPiAtCQlsM2hhc2ggPSAw Ow0KPiAtDQo+IC0JCXByb3RvID0gZXRoX2hkci0+ZXRoZXJfdHlwZTsNCj4gLQkJaGFzaCA9IGV0 aGVyX2hhc2goZXRoX2hkcik7DQo+IC0NCj4gLQkJdmxhbl9vZmZzZXQgPSBnZXRfdmxhbl9vZmZz ZXQoZXRoX2hkciwgJnByb3RvKTsNCj4gLQ0KPiAtCQlpZiAocnRlX2NwdV90b19iZV8xNihSVEVf RVRIRVJfVFlQRV9JUFY0KSA9PSBwcm90bykgew0KPiAtCQkJc3RydWN0IHJ0ZV9pcHY0X2hkciAq aXB2NF9oZHIgPSAoc3RydWN0IHJ0ZV9pcHY0X2hkciAqKQ0KPiAtCQkJCQkoKGNoYXIgKikoZXRo X2hkciArIDEpICsgdmxhbl9vZmZzZXQpOw0KPiAtCQkJbDNoYXNoID0gaXB2NF9oYXNoKGlwdjRf aGRyKTsNCj4gLQ0KPiAtCQl9IGVsc2UgaWYgKHJ0ZV9jcHVfdG9fYmVfMTYoUlRFX0VUSEVSX1RZ UEVfSVBWNikgPT0gcHJvdG8pIHsNCj4gLQkJCXN0cnVjdCBydGVfaXB2Nl9oZHIgKmlwdjZfaGRy ID0gKHN0cnVjdCBydGVfaXB2Nl9oZHIgKikNCj4gLQkJCQkJKChjaGFyICopKGV0aF9oZHIgKyAx KSArIHZsYW5fb2Zmc2V0KTsNCj4gLQkJCWwzaGFzaCA9IGlwdjZfaGFzaChpcHY2X2hkcik7DQo+ IC0JCX0NCj4gLQ0KPiAtCQloYXNoID0gaGFzaCBeIGwzaGFzaDsNCj4gLQkJaGFzaCBePSBoYXNo ID4+IDE2Ow0KPiAtCQloYXNoIF49IGhhc2ggPj4gODsNCj4gLQ0KPiAtCQlzbGF2ZXNbaV0gPSBo YXNoICUgc2xhdmVfY291bnQ7DQo+IC0JfQ0KPiAtfQ0KPiAtDQo+IC12b2lkDQo+IC1idXJzdF94 bWl0X2wzNF9oYXNoKHN0cnVjdCBydGVfbWJ1ZiAqKmJ1ZiwgdWludDE2X3QgbmJfcGt0cywNCj4g LQkJdWludDE2X3Qgc2xhdmVfY291bnQsIHVpbnQxNl90ICpzbGF2ZXMpDQo+IC17DQo+IC0Jc3Ry dWN0IHJ0ZV9ldGhlcl9oZHIgKmV0aF9oZHI7DQo+IC0JdWludDE2X3QgcHJvdG87DQo+IC0Jc2l6 ZV90IHZsYW5fb2Zmc2V0Ow0KPiAtCWludCBpOw0KPiAtDQo+IC0Jc3RydWN0IHJ0ZV91ZHBfaGRy ICp1ZHBfaGRyOw0KPiAtCXN0cnVjdCBydGVfdGNwX2hkciAqdGNwX2hkcjsNCj4gLQl1aW50MzJf dCBoYXNoLCBsM2hhc2gsIGw0aGFzaDsNCj4gLQ0KPiAtCWZvciAoaSA9IDA7IGkgPCBuYl9wa3Rz OyBpKyspIHsNCj4gLQkJZXRoX2hkciA9IHJ0ZV9wa3RtYnVmX210b2QoYnVmW2ldLCBzdHJ1Y3Qg cnRlX2V0aGVyX2hkciAqKTsNCj4gLQkJc2l6ZV90IHBrdF9lbmQgPSAoc2l6ZV90KWV0aF9oZHIg KyBydGVfcGt0bWJ1Zl9kYXRhX2xlbihidWZbaV0pOw0KPiAtCQlwcm90byA9IGV0aF9oZHItPmV0 aGVyX3R5cGU7DQo+IC0JCXZsYW5fb2Zmc2V0ID0gZ2V0X3ZsYW5fb2Zmc2V0KGV0aF9oZHIsICZw cm90byk7DQo+IC0JCWwzaGFzaCA9IDA7DQo+IC0JCWw0aGFzaCA9IDA7DQo+IC0NCj4gLQkJaWYg KHJ0ZV9jcHVfdG9fYmVfMTYoUlRFX0VUSEVSX1RZUEVfSVBWNCkgPT0gcHJvdG8pIHsNCj4gLQkJ CXN0cnVjdCBydGVfaXB2NF9oZHIgKmlwdjRfaGRyID0gKHN0cnVjdCBydGVfaXB2NF9oZHIgKikN Cj4gLQkJCQkJKChjaGFyICopKGV0aF9oZHIgKyAxKSArIHZsYW5fb2Zmc2V0KTsNCj4gLQkJCXNp emVfdCBpcF9oZHJfb2Zmc2V0Ow0KPiAtDQo+IC0JCQlsM2hhc2ggPSBpcHY0X2hhc2goaXB2NF9o ZHIpOw0KPiAtDQo+IC0JCQkvKiB0aGVyZSBpcyBubyBMNCBoZWFkZXIgaW4gZnJhZ21lbnRlZCBw YWNrZXQgKi8NCj4gLQkJCWlmIChsaWtlbHkocnRlX2lwdjRfZnJhZ19wa3RfaXNfZnJhZ21lbnRl ZChpcHY0X2hkcikNCj4gLQkJCQkJCQkJPT0gMCkpIHsNCj4gLQkJCQlpcF9oZHJfb2Zmc2V0ID0g KGlwdjRfaGRyLT52ZXJzaW9uX2lobA0KPiAtCQkJCQkmIFJURV9JUFY0X0hEUl9JSExfTUFTSykg Kg0KPiAtCQkJCQlSVEVfSVBWNF9JSExfTVVMVElQTElFUjsNCj4gLQ0KPiAtCQkJCWlmIChpcHY0 X2hkci0+bmV4dF9wcm90b19pZCA9PSBJUFBST1RPX1RDUCkgew0KPiAtCQkJCQl0Y3BfaGRyID0g KHN0cnVjdCBydGVfdGNwX2hkciAqKQ0KPiAtCQkJCQkJKChjaGFyICopaXB2NF9oZHIgKw0KPiAt CQkJCQkJCWlwX2hkcl9vZmZzZXQpOw0KPiAtCQkJCQlpZiAoKHNpemVfdCl0Y3BfaGRyICsgc2l6 ZW9mKCp0Y3BfaGRyKQ0KPiAtCQkJCQkJCTwgcGt0X2VuZCkNCj4gLQkJCQkJCWw0aGFzaCA9IEhB U0hfTDRfUE9SVFModGNwX2hkcik7DQo+IC0JCQkJfSBlbHNlIGlmIChpcHY0X2hkci0+bmV4dF9w cm90b19pZCA9PQ0KPiAtCQkJCQkJCQlJUFBST1RPX1VEUCkgew0KPiAtCQkJCQl1ZHBfaGRyID0g KHN0cnVjdCBydGVfdWRwX2hkciAqKQ0KPiAtCQkJCQkJKChjaGFyICopaXB2NF9oZHIgKw0KPiAt CQkJCQkJCWlwX2hkcl9vZmZzZXQpOw0KPiAtCQkJCQlpZiAoKHNpemVfdCl1ZHBfaGRyICsgc2l6 ZW9mKCp1ZHBfaGRyKQ0KPiAtCQkJCQkJCTwgcGt0X2VuZCkNCj4gLQkJCQkJCWw0aGFzaCA9IEhB U0hfTDRfUE9SVFModWRwX2hkcik7DQo+IC0JCQkJfQ0KPiAtCQkJfQ0KPiAtCQl9IGVsc2UgaWYg IChydGVfY3B1X3RvX2JlXzE2KFJURV9FVEhFUl9UWVBFX0lQVjYpID09IHByb3RvKSB7DQo+IC0J CQlzdHJ1Y3QgcnRlX2lwdjZfaGRyICppcHY2X2hkciA9IChzdHJ1Y3QgcnRlX2lwdjZfaGRyICop DQo+IC0JCQkJCSgoY2hhciAqKShldGhfaGRyICsgMSkgKyB2bGFuX29mZnNldCk7DQo+IC0JCQls M2hhc2ggPSBpcHY2X2hhc2goaXB2Nl9oZHIpOw0KPiAtDQo+IC0JCQlpZiAoaXB2Nl9oZHItPnBy b3RvID09IElQUFJPVE9fVENQKSB7DQo+IC0JCQkJdGNwX2hkciA9IChzdHJ1Y3QgcnRlX3RjcF9o ZHIgKikoaXB2Nl9oZHIgKyAxKTsNCj4gLQkJCQlsNGhhc2ggPSBIQVNIX0w0X1BPUlRTKHRjcF9o ZHIpOw0KPiAtCQkJfSBlbHNlIGlmIChpcHY2X2hkci0+cHJvdG8gPT0gSVBQUk9UT19VRFApIHsN Cj4gLQkJCQl1ZHBfaGRyID0gKHN0cnVjdCBydGVfdWRwX2hkciAqKShpcHY2X2hkciArIDEpOw0K PiAtCQkJCWw0aGFzaCA9IEhBU0hfTDRfUE9SVFModWRwX2hkcik7DQo+IC0JCQl9DQo+IC0JCX0N Cj4gLQ0KPiAtCQloYXNoID0gbDNoYXNoIF4gbDRoYXNoOw0KPiAtCQloYXNoIF49IGhhc2ggPj4g MTY7DQo+IC0JCWhhc2ggXj0gaGFzaCA+PiA4Ow0KPiAtDQo+IC0JCXNsYXZlc1tpXSA9IGhhc2gg JSBzbGF2ZV9jb3VudDsNCj4gLQl9DQo+IC19DQo+IC0NCj4gLXN0cnVjdCBid2dfc2xhdmUgew0K PiAtCXVpbnQ2NF90IGJ3Z19sZWZ0X2ludDsNCj4gLQl1aW50NjRfdCBid2dfbGVmdF9yZW1haW5k ZXI7DQo+IC0JdWludDE2X3Qgc2xhdmU7DQo+IC19Ow0KPiAtDQo+IC12b2lkDQo+IC1ib25kX3Rs Yl9hY3RpdmF0ZV9zbGF2ZShzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzKSB7DQo+ IC0JaW50IGk7DQo+IC0NCj4gLQlmb3IgKGkgPSAwOyBpIDwgaW50ZXJuYWxzLT5hY3RpdmVfc2xh dmVfY291bnQ7IGkrKykgew0KPiAtCQl0bGJfbGFzdF9vYnl0ZXRzW2ludGVybmFscy0+YWN0aXZl X3NsYXZlc1tpXV0gPSAwOw0KPiAtCX0NCj4gLX0NCj4gLQ0KPiAtc3RhdGljIGludA0KPiAtYmFu ZHdpZHRoX2NtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQ0KPiAtew0KPiAtCWNvbnN0 IHN0cnVjdCBid2dfc2xhdmUgKmJ3Z19hID0gYTsNCj4gLQljb25zdCBzdHJ1Y3QgYndnX3NsYXZl ICpid2dfYiA9IGI7DQo+IC0JaW50NjRfdCBkaWZmID0gKGludDY0X3QpYndnX2ItPmJ3Z19sZWZ0 X2ludCAtIChpbnQ2NF90KWJ3Z19hLT5id2dfbGVmdF9pbnQ7DQo+IC0JaW50NjRfdCBkaWZmMiA9 IChpbnQ2NF90KWJ3Z19iLT5id2dfbGVmdF9yZW1haW5kZXIgLQ0KPiAtCQkJKGludDY0X3QpYndn X2EtPmJ3Z19sZWZ0X3JlbWFpbmRlcjsNCj4gLQlpZiAoZGlmZiA+IDApDQo+IC0JCXJldHVybiAx Ow0KPiAtCWVsc2UgaWYgKGRpZmYgPCAwKQ0KPiAtCQlyZXR1cm4gLTE7DQo+IC0JZWxzZSBpZiAo ZGlmZjIgPiAwKQ0KPiAtCQlyZXR1cm4gMTsNCj4gLQllbHNlIGlmIChkaWZmMiA8IDApDQo+IC0J CXJldHVybiAtMTsNCj4gLQllbHNlDQo+IC0JCXJldHVybiAwOw0KPiAtfQ0KPiAtDQo+IC1zdGF0 aWMgdm9pZA0KPiAtYmFuZHdpZHRoX2xlZnQodWludDE2X3QgcG9ydF9pZCwgdWludDY0X3QgbG9h ZCwgdWludDhfdCB1cGRhdGVfaWR4LA0KPiAtCQlzdHJ1Y3QgYndnX3NsYXZlICpid2dfc2xhdmUp DQo+IC17DQo+IC0Jc3RydWN0IHJ0ZV9ldGhfbGluayBsaW5rX3N0YXR1czsNCj4gLQlpbnQgcmV0 Ow0KPiAtDQo+IC0JcmV0ID0gcnRlX2V0aF9saW5rX2dldF9ub3dhaXQocG9ydF9pZCwgJmxpbmtf c3RhdHVzKTsNCj4gLQlpZiAocmV0IDwgMCkgew0KPiAtCQlSVEVfQk9ORF9MT0coRVJSLCAiU2xh dmUgKHBvcnQgJXUpIGxpbmsgZ2V0IGZhaWxlZDogJXMiLA0KPiAtCQkJICAgICBwb3J0X2lkLCBy dGVfc3RyZXJyb3IoLXJldCkpOw0KPiAtCQlyZXR1cm47DQo+IC0JfQ0KPiAtCXVpbnQ2NF90IGxp bmtfYndnID0gbGlua19zdGF0dXMubGlua19zcGVlZCAqIDEwMDAwMDBVTEwgLyA4Ow0KPiAtCWlm IChsaW5rX2J3ZyA9PSAwKQ0KPiAtCQlyZXR1cm47DQo+IC0JbGlua19id2cgPSBsaW5rX2J3ZyAq ICh1cGRhdGVfaWR4KzEpICogUkVPUkRFUl9QRVJJT0RfTVM7DQo+IC0JYndnX3NsYXZlLT5id2df bGVmdF9pbnQgPSAobGlua19id2cgLSAxMDAwKmxvYWQpIC8gbGlua19id2c7DQo+IC0JYndnX3Ns YXZlLT5id2dfbGVmdF9yZW1haW5kZXIgPSAobGlua19id2cgLSAxMDAwKmxvYWQpICUgbGlua19i d2c7DQo+IC19DQo+IC0NCj4gLXN0YXRpYyB2b2lkDQo+IC1ib25kX2V0aGRldl91cGRhdGVfdGxi X3NsYXZlX2NiKHZvaWQgKmFyZykNCj4gLXsNCj4gLQlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAq aW50ZXJuYWxzID0gYXJnOw0KPiAtCXN0cnVjdCBydGVfZXRoX3N0YXRzIHNsYXZlX3N0YXRzOw0K PiAtCXN0cnVjdCBid2dfc2xhdmUgYndnX2FycmF5W1JURV9NQVhfRVRIUE9SVFNdOw0KPiAtCXVp bnQxNl90IHNsYXZlX2NvdW50Ow0KPiAtCXVpbnQ2NF90IHR4X2J5dGVzOw0KPiAtDQo+IC0JdWlu dDhfdCB1cGRhdGVfc3RhdHMgPSAwOw0KPiAtCXVpbnQxNl90IHNsYXZlX2lkOw0KPiAtCXVpbnQx Nl90IGk7DQo+IC0NCj4gLQlpbnRlcm5hbHMtPnNsYXZlX3VwZGF0ZV9pZHgrKzsNCj4gLQ0KPiAt DQo+IC0JaWYgKGludGVybmFscy0+c2xhdmVfdXBkYXRlX2lkeCA+PSBSRU9SREVSX1BFUklPRF9N UykNCj4gLQkJdXBkYXRlX3N0YXRzID0gMTsNCj4gLQ0KPiAtCWZvciAoaSA9IDA7IGkgPCBpbnRl cm5hbHMtPmFjdGl2ZV9zbGF2ZV9jb3VudDsgaSsrKSB7DQo+IC0JCXNsYXZlX2lkID0gaW50ZXJu YWxzLT5hY3RpdmVfc2xhdmVzW2ldOw0KPiAtCQlydGVfZXRoX3N0YXRzX2dldChzbGF2ZV9pZCwg JnNsYXZlX3N0YXRzKTsNCj4gLQkJdHhfYnl0ZXMgPSBzbGF2ZV9zdGF0cy5vYnl0ZXMgLSB0bGJf bGFzdF9vYnl0ZXRzW3NsYXZlX2lkXTsNCj4gLQkJYmFuZHdpZHRoX2xlZnQoc2xhdmVfaWQsIHR4 X2J5dGVzLA0KPiAtCQkJCWludGVybmFscy0+c2xhdmVfdXBkYXRlX2lkeCwgJmJ3Z19hcnJheVtp XSk7DQo+IC0JCWJ3Z19hcnJheVtpXS5zbGF2ZSA9IHNsYXZlX2lkOw0KPiAtDQo+IC0JCWlmICh1 cGRhdGVfc3RhdHMpIHsNCj4gLQkJCXRsYl9sYXN0X29ieXRldHNbc2xhdmVfaWRdID0gc2xhdmVf c3RhdHMub2J5dGVzOw0KPiAtCQl9DQo+IC0JfQ0KPiAtDQo+IC0JaWYgKHVwZGF0ZV9zdGF0cyA9 PSAxKQ0KPiAtCQlpbnRlcm5hbHMtPnNsYXZlX3VwZGF0ZV9pZHggPSAwOw0KPiAtDQo+IC0Jc2xh dmVfY291bnQgPSBpOw0KPiAtCXFzb3J0KGJ3Z19hcnJheSwgc2xhdmVfY291bnQsIHNpemVvZihi d2dfYXJyYXlbMF0pLCBiYW5kd2lkdGhfY21wKTsNCj4gLQlmb3IgKGkgPSAwOyBpIDwgc2xhdmVf Y291bnQ7IGkrKykNCj4gLQkJaW50ZXJuYWxzLT50bGJfc2xhdmVzX29yZGVyW2ldID0gYndnX2Fy cmF5W2ldLnNsYXZlOw0KPiAtDQo+IC0JcnRlX2VhbF9hbGFybV9zZXQoUkVPUkRFUl9QRVJJT0Rf TVMgKiAxMDAwLCBib25kX2V0aGRldl91cGRhdGVfdGxiX3NsYXZlX2NiLA0KPiAtCQkJKHN0cnVj dCBib25kX2Rldl9wcml2YXRlICopaW50ZXJuYWxzKTsNCj4gLX0NCj4gLQ0KPiAtc3RhdGljIHVp bnQxNl90DQo+IC1ib25kX2V0aGRldl90eF9idXJzdF90bGIodm9pZCAqcXVldWUsIHN0cnVjdCBy dGVfbWJ1ZiAqKmJ1ZnMsIHVpbnQxNl90IG5iX3BrdHMpDQo+IC17DQo+IC0Jc3RydWN0IGJvbmRf dHhfcXVldWUgKmJkX3R4X3EgPSAoc3RydWN0IGJvbmRfdHhfcXVldWUgKilxdWV1ZTsNCj4gLQlz dHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzID0gYmRfdHhfcS0+ZGV2X3ByaXZhdGU7 DQo+IC0NCj4gLQlzdHJ1Y3QgcnRlX2V0aF9kZXYgKnByaW1hcnlfcG9ydCA9DQo+IC0JCQkmcnRl X2V0aF9kZXZpY2VzW2ludGVybmFscy0+cHJpbWFyeV9wb3J0XTsNCj4gLQl1aW50MTZfdCBudW1f dHhfdG90YWwgPSAwOw0KPiAtCXVpbnQxNl90IGksIGo7DQo+IC0NCj4gLQl1aW50MTZfdCBudW1f b2Zfc2xhdmVzID0gaW50ZXJuYWxzLT5hY3RpdmVfc2xhdmVfY291bnQ7DQo+IC0JdWludDE2X3Qg c2xhdmVzW1JURV9NQVhfRVRIUE9SVFNdOw0KPiAtDQo+IC0Jc3RydWN0IHJ0ZV9ldGhlcl9oZHIg KmV0aGVyX2hkcjsNCj4gLQlzdHJ1Y3QgcnRlX2V0aGVyX2FkZHIgcHJpbWFyeV9zbGF2ZV9hZGRy Ow0KPiAtCXN0cnVjdCBydGVfZXRoZXJfYWRkciBhY3RpdmVfc2xhdmVfYWRkcjsNCj4gLQ0KPiAt CWlmIChudW1fb2Zfc2xhdmVzIDwgMSkNCj4gLQkJcmV0dXJuIG51bV90eF90b3RhbDsNCj4gLQ0K PiAtCW1lbWNweShzbGF2ZXMsIGludGVybmFscy0+dGxiX3NsYXZlc19vcmRlciwNCj4gLQkJCQlz aXplb2YoaW50ZXJuYWxzLT50bGJfc2xhdmVzX29yZGVyWzBdKSAqIG51bV9vZl9zbGF2ZXMpOw0K PiAtDQo+IC0NCj4gLQlydGVfZXRoZXJfYWRkcl9jb3B5KHByaW1hcnlfcG9ydC0+ZGF0YS0+bWFj X2FkZHJzLCAmcHJpbWFyeV9zbGF2ZV9hZGRyKTsNCj4gLQ0KPiAtCWlmIChuYl9wa3RzID4gMykg ew0KPiAtCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQ0KPiAtCQkJcnRlX3ByZWZldGNoMChydGVf cGt0bWJ1Zl9tdG9kKGJ1ZnNbaV0sIHZvaWQqKSk7DQo+IC0JfQ0KPiAtDQo+IC0JZm9yIChpID0g MDsgaSA8IG51bV9vZl9zbGF2ZXM7IGkrKykgew0KPiAtCQlydGVfZXRoX21hY2FkZHJfZ2V0KHNs YXZlc1tpXSwgJmFjdGl2ZV9zbGF2ZV9hZGRyKTsNCj4gLQkJZm9yIChqID0gbnVtX3R4X3RvdGFs OyBqIDwgbmJfcGt0czsgaisrKSB7DQo+IC0JCQlpZiAoaiArIDMgPCBuYl9wa3RzKQ0KPiAtCQkJ CXJ0ZV9wcmVmZXRjaDAocnRlX3BrdG1idWZfbXRvZChidWZzW2orM10sIHZvaWQqKSk7DQo+IC0N Cj4gLQkJCWV0aGVyX2hkciA9IHJ0ZV9wa3RtYnVmX210b2QoYnVmc1tqXSwNCj4gLQkJCQkJCXN0 cnVjdCBydGVfZXRoZXJfaGRyICopOw0KPiAtCQkJaWYgKHJ0ZV9pc19zYW1lX2V0aGVyX2FkZHIo JmV0aGVyX2hkci0+c3JjX2FkZHIsDQo+IC0JCQkJCQkJJnByaW1hcnlfc2xhdmVfYWRkcikpDQo+ IC0JCQkJcnRlX2V0aGVyX2FkZHJfY29weSgmYWN0aXZlX3NsYXZlX2FkZHIsDQo+IC0JCQkJCQkm ZXRoZXJfaGRyLT5zcmNfYWRkcik7DQo+IC0jaWYgZGVmaW5lZChSVEVfTElCUlRFX0JPTkRfREVC VUdfQUxCKSB8fCBkZWZpbmVkKFJURV9MSUJSVEVfQk9ORF9ERUJVR19BTEJfTDEpDQo+IC0JCQkJ CW1vZGU2X2RlYnVnKCJUWCBJUHY0OiIsIGV0aGVyX2hkciwgc2xhdmVzW2ldLCAmYnVyc3RudW1i ZXJUWCk7DQo+IC0jZW5kaWYNCj4gLQkJfQ0KPiAtDQo+IC0JCW51bV90eF90b3RhbCArPSBydGVf ZXRoX3R4X2J1cnN0KHNsYXZlc1tpXSwgYmRfdHhfcS0+cXVldWVfaWQsDQo+IC0JCQkJYnVmcyAr IG51bV90eF90b3RhbCwgbmJfcGt0cyAtIG51bV90eF90b3RhbCk7DQo+IC0NCj4gLQkJaWYgKG51 bV90eF90b3RhbCA9PSBuYl9wa3RzKQ0KPiAtCQkJYnJlYWs7DQo+IC0JfQ0KPiAtDQo+IC0JcmV0 dXJuIG51bV90eF90b3RhbDsNCj4gLX0NCj4gLQ0KPiAtdm9pZA0KPiAtYm9uZF90bGJfZGlzYWJs ZShzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzKQ0KPiAtew0KPiAtCXJ0ZV9lYWxf YWxhcm1fY2FuY2VsKGJvbmRfZXRoZGV2X3VwZGF0ZV90bGJfc2xhdmVfY2IsIGludGVybmFscyk7 DQo+IC19DQo+IC0NCj4gLXZvaWQNCj4gLWJvbmRfdGxiX2VuYWJsZShzdHJ1Y3QgYm9uZF9kZXZf cHJpdmF0ZSAqaW50ZXJuYWxzKQ0KPiAtew0KPiAtCWJvbmRfZXRoZGV2X3VwZGF0ZV90bGJfc2xh dmVfY2IoaW50ZXJuYWxzKTsNCj4gLX0NCj4gLQ0KPiAtc3RhdGljIHVpbnQxNl90DQo+IC1ib25k X2V0aGRldl90eF9idXJzdF9hbGIodm9pZCAqcXVldWUsIHN0cnVjdCBydGVfbWJ1ZiAqKmJ1ZnMs IHVpbnQxNl90IG5iX3BrdHMpDQo+IC17DQo+IC0Jc3RydWN0IGJvbmRfdHhfcXVldWUgKmJkX3R4 X3EgPSAoc3RydWN0IGJvbmRfdHhfcXVldWUgKilxdWV1ZTsNCj4gLQlzdHJ1Y3QgYm9uZF9kZXZf cHJpdmF0ZSAqaW50ZXJuYWxzID0gYmRfdHhfcS0+ZGV2X3ByaXZhdGU7DQo+IC0NCj4gLQlzdHJ1 Y3QgcnRlX2V0aGVyX2hkciAqZXRoX2g7DQo+IC0JdWludDE2X3QgZXRoZXJfdHlwZSwgb2Zmc2V0 Ow0KPiAtDQo+IC0Jc3RydWN0IGNsaWVudF9kYXRhICpjbGllbnRfaW5mbzsNCj4gLQ0KPiAtCS8q DQo+IC0JICogV2UgY3JlYXRlIHRyYW5zbWl0IGJ1ZmZlcnMgZm9yIGV2ZXJ5IHNsYXZlIGFuZCBv bmUgYWRkaXRpb25hbCB0byBzZW5kDQo+IC0JICogdGhyb3VnaCB0bGIuIEluIHdvcnN0IGNhc2Ug ZXZlcnkgcGFja2V0IHdpbGwgYmUgc2VuZCBvbiBvbmUgcG9ydC4NCj4gLQkgKi8NCj4gLQlzdHJ1 Y3QgcnRlX21idWYgKnNsYXZlX2J1ZnNbUlRFX01BWF9FVEhQT1JUUyArIDFdW25iX3BrdHNdOw0K PiAtCXVpbnQxNl90IHNsYXZlX2J1ZnNfcGt0c1tSVEVfTUFYX0VUSFBPUlRTICsgMV0gPSB7IDAg fTsNCj4gLQ0KPiAtCS8qDQo+IC0JICogV2UgY3JlYXRlIHNlcGFyYXRlIHRyYW5zbWl0IGJ1ZmZl cnMgZm9yIHVwZGF0ZSBwYWNrZXRzIGFzIHRoZXkgd29uJ3QNCj4gLQkgKiBiZSBjb3VudGVkIGlu IG51bV90eF90b3RhbC4NCj4gLQkgKi8NCj4gLQlzdHJ1Y3QgcnRlX21idWYgKnVwZGF0ZV9idWZz W1JURV9NQVhfRVRIUE9SVFNdW0FMQl9IQVNIX1RBQkxFX1NJWkVdOw0KPiAtCXVpbnQxNl90IHVw ZGF0ZV9idWZzX3BrdHNbUlRFX01BWF9FVEhQT1JUU10gPSB7IDAgfTsNCj4gLQ0KPiAtCXN0cnVj dCBydGVfbWJ1ZiAqdXBkX3BrdDsNCj4gLQlzaXplX3QgcGt0X3NpemU7DQo+IC0NCj4gLQl1aW50 MTZfdCBudW1fc2VuZCwgbnVtX25vdF9zZW5kID0gMDsNCj4gLQl1aW50MTZfdCBudW1fdHhfdG90 YWwgPSAwOw0KPiAtCXVpbnQxNl90IHNsYXZlX2lkeDsNCj4gLQ0KPiAtCWludCBpLCBqOw0KPiAt DQo+IC0JLyogU2VhcmNoIHR4IGJ1ZmZlciBmb3IgQVJQIHBhY2tldHMgYW5kIGZvcndhcmQgdGhl bSB0byBhbGIgKi8NCj4gLQlmb3IgKGkgPSAwOyBpIDwgbmJfcGt0czsgaSsrKSB7DQo+IC0JCWV0 aF9oID0gcnRlX3BrdG1idWZfbXRvZChidWZzW2ldLCBzdHJ1Y3QgcnRlX2V0aGVyX2hkciAqKTsN Cj4gLQkJZXRoZXJfdHlwZSA9IGV0aF9oLT5ldGhlcl90eXBlOw0KPiAtCQlvZmZzZXQgPSBnZXRf dmxhbl9vZmZzZXQoZXRoX2gsICZldGhlcl90eXBlKTsNCj4gLQ0KPiAtCQlpZiAoZXRoZXJfdHlw ZSA9PSBydGVfY3B1X3RvX2JlXzE2KFJURV9FVEhFUl9UWVBFX0FSUCkpIHsNCj4gLQkJCXNsYXZl X2lkeCA9IGJvbmRfbW9kZV9hbGJfYXJwX3htaXQoZXRoX2gsIG9mZnNldCwgaW50ZXJuYWxzKTsN Cj4gLQ0KPiAtCQkJLyogQ2hhbmdlIHNyYyBtYWMgaW4gZXRoIGhlYWRlciAqLw0KPiAtCQkJcnRl X2V0aF9tYWNhZGRyX2dldChzbGF2ZV9pZHgsICZldGhfaC0+c3JjX2FkZHIpOw0KPiAtDQo+IC0J CQkvKiBBZGQgcGFja2V0IHRvIHNsYXZlIHR4IGJ1ZmZlciAqLw0KPiAtCQkJc2xhdmVfYnVmc1tz bGF2ZV9pZHhdW3NsYXZlX2J1ZnNfcGt0c1tzbGF2ZV9pZHhdXSA9IGJ1ZnNbaV07DQo+IC0JCQlz bGF2ZV9idWZzX3BrdHNbc2xhdmVfaWR4XSsrOw0KPiAtCQl9IGVsc2Ugew0KPiAtCQkJLyogSWYg cGFja2V0IGlzIG5vdCBBUlAsIHNlbmQgaXQgd2l0aCBUTEIgcG9saWN5ICovDQo+IC0JCQlzbGF2 ZV9idWZzW1JURV9NQVhfRVRIUE9SVFNdW3NsYXZlX2J1ZnNfcGt0c1tSVEVfTUFYX0VUSFBPUlRT XV0gPQ0KPiAtCQkJCQlidWZzW2ldOw0KPiAtCQkJc2xhdmVfYnVmc19wa3RzW1JURV9NQVhfRVRI UE9SVFNdKys7DQo+IC0JCX0NCj4gLQl9DQo+IC0NCj4gLQkvKiBVcGRhdGUgY29ubmVjdGVkIGNs aWVudCBBUlAgdGFibGVzICovDQo+IC0JaWYgKGludGVybmFscy0+bW9kZTYubnR0KSB7DQo+IC0J CWZvciAoaSA9IDA7IGkgPCBBTEJfSEFTSF9UQUJMRV9TSVpFOyBpKyspIHsNCj4gLQkJCWNsaWVu dF9pbmZvID0gJmludGVybmFscy0+bW9kZTYuY2xpZW50X3RhYmxlW2ldOw0KPiAtDQo+IC0JCQlp ZiAoY2xpZW50X2luZm8tPmluX3VzZSkgew0KPiAtCQkJCS8qIEFsbG9jYXRlIG5ldyBwYWNrZXQg dG8gc2VuZCBBUlAgdXBkYXRlIG9uIGN1cnJlbnQgc2xhdmUgKi8NCj4gLQkJCQl1cGRfcGt0ID0g cnRlX3BrdG1idWZfYWxsb2MoaW50ZXJuYWxzLT5tb2RlNi5tZW1wb29sKTsNCj4gLQkJCQlpZiAo dXBkX3BrdCA9PSBOVUxMKSB7DQo+IC0JCQkJCVJURV9CT05EX0xPRyhFUlIsDQo+IC0JCQkJCQkg ICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgQVJQIHBhY2tldCBmcm9tIHBvb2wiKTsNCj4gLQkJCQkJ Y29udGludWU7DQo+IC0JCQkJfQ0KPiAtCQkJCXBrdF9zaXplID0gc2l6ZW9mKHN0cnVjdCBydGVf ZXRoZXJfaGRyKSArDQo+IC0JCQkJCXNpemVvZihzdHJ1Y3QgcnRlX2FycF9oZHIpICsNCj4gLQkJ CQkJY2xpZW50X2luZm8tPnZsYW5fY291bnQgKg0KPiAtCQkJCQlzaXplb2Yoc3RydWN0IHJ0ZV92 bGFuX2hkcik7DQo+IC0JCQkJdXBkX3BrdC0+ZGF0YV9sZW4gPSBwa3Rfc2l6ZTsNCj4gLQkJCQl1 cGRfcGt0LT5wa3RfbGVuID0gcGt0X3NpemU7DQo+IC0NCj4gLQkJCQlzbGF2ZV9pZHggPSBib25k X21vZGVfYWxiX2FycF91cGQoY2xpZW50X2luZm8sIHVwZF9wa3QsDQo+IC0JCQkJCQlpbnRlcm5h bHMpOw0KPiAtDQo+IC0JCQkJLyogQWRkIHBhY2tldCB0byB1cGRhdGUgdHggYnVmZmVyICovDQo+ IC0JCQkJdXBkYXRlX2J1ZnNbc2xhdmVfaWR4XVt1cGRhdGVfYnVmc19wa3RzW3NsYXZlX2lkeF1d ID0gdXBkX3BrdDsNCj4gLQkJCQl1cGRhdGVfYnVmc19wa3RzW3NsYXZlX2lkeF0rKzsNCj4gLQkJ CX0NCj4gLQkJfQ0KPiAtCQlpbnRlcm5hbHMtPm1vZGU2Lm50dCA9IDA7DQo+IC0JfQ0KPiAtDQo+ IC0JLyogU2VuZCBBUlAgcGFja2V0cyBvbiBwcm9wZXIgc2xhdmVzICovDQo+IC0JZm9yIChpID0g MDsgaSA8IFJURV9NQVhfRVRIUE9SVFM7IGkrKykgew0KPiAtCQlpZiAoc2xhdmVfYnVmc19wa3Rz W2ldID4gMCkgew0KPiAtCQkJbnVtX3NlbmQgPSBydGVfZXRoX3R4X2J1cnN0KGksIGJkX3R4X3Et PnF1ZXVlX2lkLA0KPiAtCQkJCQlzbGF2ZV9idWZzW2ldLCBzbGF2ZV9idWZzX3BrdHNbaV0pOw0K PiAtCQkJZm9yIChqID0gMDsgaiA8IHNsYXZlX2J1ZnNfcGt0c1tpXSAtIG51bV9zZW5kOyBqKysp IHsNCj4gLQkJCQlidWZzW25iX3BrdHMgLSAxIC0gbnVtX25vdF9zZW5kIC0gal0gPQ0KPiAtCQkJ CQkJc2xhdmVfYnVmc1tpXVtuYl9wa3RzIC0gMSAtIGpdOw0KPiAtCQkJfQ0KPiAtDQo+IC0JCQlu dW1fdHhfdG90YWwgKz0gbnVtX3NlbmQ7DQo+IC0JCQludW1fbm90X3NlbmQgKz0gc2xhdmVfYnVm c19wa3RzW2ldIC0gbnVtX3NlbmQ7DQo+IC0NCj4gLSNpZiBkZWZpbmVkKFJURV9MSUJSVEVfQk9O RF9ERUJVR19BTEIpIHx8IGRlZmluZWQoUlRFX0xJQlJURV9CT05EX0RFQlVHX0FMQl9MMSkNCj4g LQkvKiBQcmludCBUWCBzdGF0cyBpbmNsdWRpbmcgdXBkYXRlIHBhY2tldHMgKi8NCj4gLQkJCWZv ciAoaiA9IDA7IGogPCBzbGF2ZV9idWZzX3BrdHNbaV07IGorKykgew0KPiAtCQkJCWV0aF9oID0g cnRlX3BrdG1idWZfbXRvZChzbGF2ZV9idWZzW2ldW2pdLA0KPiAtCQkJCQkJCXN0cnVjdCBydGVf ZXRoZXJfaGRyICopOw0KPiAtCQkJCW1vZGU2X2RlYnVnKCJUWCBBUlA6IiwgZXRoX2gsIGksICZi dXJzdG51bWJlclRYKTsNCj4gLQkJCX0NCj4gLSNlbmRpZg0KPiAtCQl9DQo+IC0JfQ0KPiAtDQo+ IC0JLyogU2VuZCB1cGRhdGUgcGFja2V0cyBvbiBwcm9wZXIgc2xhdmVzICovDQo+IC0JZm9yIChp ID0gMDsgaSA8IFJURV9NQVhfRVRIUE9SVFM7IGkrKykgew0KPiAtCQlpZiAodXBkYXRlX2J1ZnNf cGt0c1tpXSA+IDApIHsNCj4gLQkJCW51bV9zZW5kID0gcnRlX2V0aF90eF9idXJzdChpLCBiZF90 eF9xLT5xdWV1ZV9pZCwgdXBkYXRlX2J1ZnNbaV0sDQo+IC0JCQkJCXVwZGF0ZV9idWZzX3BrdHNb aV0pOw0KPiAtCQkJZm9yIChqID0gbnVtX3NlbmQ7IGogPCB1cGRhdGVfYnVmc19wa3RzW2ldOyBq KyspIHsNCj4gLQkJCQlydGVfcGt0bWJ1Zl9mcmVlKHVwZGF0ZV9idWZzW2ldW2pdKTsNCj4gLQkJ CX0NCj4gLSNpZiBkZWZpbmVkKFJURV9MSUJSVEVfQk9ORF9ERUJVR19BTEIpIHx8IGRlZmluZWQo UlRFX0xJQlJURV9CT05EX0RFQlVHX0FMQl9MMSkNCj4gLQkJCWZvciAoaiA9IDA7IGogPCB1cGRh dGVfYnVmc19wa3RzW2ldOyBqKyspIHsNCj4gLQkJCQlldGhfaCA9IHJ0ZV9wa3RtYnVmX210b2Qo dXBkYXRlX2J1ZnNbaV1bal0sDQo+IC0JCQkJCQkJc3RydWN0IHJ0ZV9ldGhlcl9oZHIgKik7DQo+ IC0JCQkJbW9kZTZfZGVidWcoIlRYIEFSUHVwZDoiLCBldGhfaCwgaSwgJmJ1cnN0bnVtYmVyVFgp Ow0KPiAtCQkJfQ0KPiAtI2VuZGlmDQo+IC0JCX0NCj4gLQl9DQo+IC0NCj4gLQkvKiBTZW5kIG5v bi1BUlAgcGFja2V0cyB1c2luZyB0bGIgcG9saWN5ICovDQo+IC0JaWYgKHNsYXZlX2J1ZnNfcGt0 c1tSVEVfTUFYX0VUSFBPUlRTXSA+IDApIHsNCj4gLQkJbnVtX3NlbmQgPSBib25kX2V0aGRldl90 eF9idXJzdF90bGIocXVldWUsDQo+IC0JCQkJc2xhdmVfYnVmc1tSVEVfTUFYX0VUSFBPUlRTXSwN Cj4gLQkJCQlzbGF2ZV9idWZzX3BrdHNbUlRFX01BWF9FVEhQT1JUU10pOw0KPiAtDQo+IC0JCWZv ciAoaiA9IDA7IGogPCBzbGF2ZV9idWZzX3BrdHNbUlRFX01BWF9FVEhQT1JUU107IGorKykgew0K PiAtCQkJYnVmc1tuYl9wa3RzIC0gMSAtIG51bV9ub3Rfc2VuZCAtIGpdID0NCj4gLQkJCQkJc2xh dmVfYnVmc1tSVEVfTUFYX0VUSFBPUlRTXVtuYl9wa3RzIC0gMSAtIGpdOw0KPiAtCQl9DQo+IC0N Cj4gLQkJbnVtX3R4X3RvdGFsICs9IG51bV9zZW5kOw0KPiAtCX0NCj4gLQ0KPiAtCXJldHVybiBu dW1fdHhfdG90YWw7DQo+IC19DQo+IC0NCj4gLXN0YXRpYyBpbmxpbmUgdWludDE2X3QNCj4gLXR4 X2J1cnN0X2JhbGFuY2Uodm9pZCAqcXVldWUsIHN0cnVjdCBydGVfbWJ1ZiAqKmJ1ZnMsIHVpbnQx Nl90IG5iX2J1ZnMsDQo+IC0JCSB1aW50MTZfdCAqc2xhdmVfcG9ydF9pZHMsIHVpbnQxNl90IHNs YXZlX2NvdW50KQ0KPiAtew0KPiAtCXN0cnVjdCBib25kX3R4X3F1ZXVlICpiZF90eF9xID0gKHN0 cnVjdCBib25kX3R4X3F1ZXVlICopcXVldWU7DQo+IC0Jc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUg KmludGVybmFscyA9IGJkX3R4X3EtPmRldl9wcml2YXRlOw0KPiAtDQo+IC0JLyogQXJyYXkgdG8g c29ydCBtYnVmcyBmb3IgdHJhbnNtaXNzaW9uIG9uIGVhY2ggc2xhdmUgaW50byAqLw0KPiAtCXN0 cnVjdCBydGVfbWJ1ZiAqc2xhdmVfYnVmc1tSVEVfTUFYX0VUSFBPUlRTXVtuYl9idWZzXTsNCj4g LQkvKiBOdW1iZXIgb2YgbWJ1ZnMgZm9yIHRyYW5zbWlzc2lvbiBvbiBlYWNoIHNsYXZlICovDQo+ IC0JdWludDE2X3Qgc2xhdmVfbmJfYnVmc1tSVEVfTUFYX0VUSFBPUlRTXSA9IHsgMCB9Ow0KPiAt CS8qIE1hcHBpbmcgYXJyYXkgZ2VuZXJhdGVkIGJ5IGhhc2ggZnVuY3Rpb24gdG8gbWFwIG1idWZz IHRvIHNsYXZlcyAqLw0KPiAtCXVpbnQxNl90IGJ1ZnNfc2xhdmVfcG9ydF9pZHhzW25iX2J1ZnNd Ow0KPiAtDQo+IC0JdWludDE2X3Qgc2xhdmVfdHhfY291bnQ7DQo+IC0JdWludDE2X3QgdG90YWxf dHhfY291bnQgPSAwLCB0b3RhbF90eF9mYWlsX2NvdW50ID0gMDsNCj4gLQ0KPiAtCXVpbnQxNl90 IGk7DQo+IC0NCj4gLQkvKg0KPiAtCSAqIFBvcHVsYXRlIHNsYXZlcyBtYnVmIHdpdGggdGhlIHBh Y2tldHMgd2hpY2ggYXJlIHRvIGJlIHNlbnQgb24gaXQNCj4gLQkgKiBzZWxlY3Rpbmcgb3V0cHV0 IHNsYXZlIHVzaW5nIGhhc2ggYmFzZWQgb24geG1pdCBwb2xpY3kNCj4gLQkgKi8NCj4gLQlpbnRl cm5hbHMtPmJ1cnN0X3htaXRfaGFzaChidWZzLCBuYl9idWZzLCBzbGF2ZV9jb3VudCwNCj4gLQkJ CWJ1ZnNfc2xhdmVfcG9ydF9pZHhzKTsNCj4gLQ0KPiAtCWZvciAoaSA9IDA7IGkgPCBuYl9idWZz OyBpKyspIHsNCj4gLQkJLyogUG9wdWxhdGUgc2xhdmUgbWJ1ZiBhcnJheXMgd2l0aCBtYnVmcyBm b3IgdGhhdCBzbGF2ZS4gKi8NCj4gLQkJdWludDE2X3Qgc2xhdmVfaWR4ID0gYnVmc19zbGF2ZV9w b3J0X2lkeHNbaV07DQo+IC0NCj4gLQkJc2xhdmVfYnVmc1tzbGF2ZV9pZHhdW3NsYXZlX25iX2J1 ZnNbc2xhdmVfaWR4XSsrXSA9IGJ1ZnNbaV07DQo+IC0JfQ0KPiAtDQo+IC0JLyogU2VuZCBwYWNr ZXQgYnVyc3Qgb24gZWFjaCBzbGF2ZSBkZXZpY2UgKi8NCj4gLQlmb3IgKGkgPSAwOyBpIDwgc2xh dmVfY291bnQ7IGkrKykgew0KPiAtCQlpZiAoc2xhdmVfbmJfYnVmc1tpXSA9PSAwKQ0KPiAtCQkJ Y29udGludWU7DQo+IC0NCj4gLQkJc2xhdmVfdHhfY291bnQgPSBydGVfZXRoX3R4X2J1cnN0KHNs YXZlX3BvcnRfaWRzW2ldLA0KPiAtCQkJCWJkX3R4X3EtPnF1ZXVlX2lkLCBzbGF2ZV9idWZzW2ld LA0KPiAtCQkJCXNsYXZlX25iX2J1ZnNbaV0pOw0KPiAtDQo+IC0JCXRvdGFsX3R4X2NvdW50ICs9 IHNsYXZlX3R4X2NvdW50Ow0KPiAtDQo+IC0JCS8qIElmIHR4IGJ1cnN0IGZhaWxzIG1vdmUgcGFj a2V0cyB0byBlbmQgb2YgYnVmcyAqLw0KPiAtCQlpZiAodW5saWtlbHkoc2xhdmVfdHhfY291bnQg PCBzbGF2ZV9uYl9idWZzW2ldKSkgew0KPiAtCQkJaW50IHNsYXZlX3R4X2ZhaWxfY291bnQgPSBz bGF2ZV9uYl9idWZzW2ldIC0NCj4gLQkJCQkJc2xhdmVfdHhfY291bnQ7DQo+IC0JCQl0b3RhbF90 eF9mYWlsX2NvdW50ICs9IHNsYXZlX3R4X2ZhaWxfY291bnQ7DQo+IC0JCQltZW1jcHkoJmJ1ZnNb bmJfYnVmcyAtIHRvdGFsX3R4X2ZhaWxfY291bnRdLA0KPiAtCQkJICAgICAgICZzbGF2ZV9idWZz W2ldW3NsYXZlX3R4X2NvdW50XSwNCj4gLQkJCSAgICAgICBzbGF2ZV90eF9mYWlsX2NvdW50ICog c2l6ZW9mKGJ1ZnNbMF0pKTsNCj4gLQkJfQ0KPiAtCX0NCj4gLQ0KPiAtCXJldHVybiB0b3RhbF90 eF9jb3VudDsNCj4gLX0NCj4gLQ0KPiAtc3RhdGljIHVpbnQxNl90DQo+IC1ib25kX2V0aGRldl90 eF9idXJzdF9iYWxhbmNlKHZvaWQgKnF1ZXVlLCBzdHJ1Y3QgcnRlX21idWYgKipidWZzLA0KPiAt CQl1aW50MTZfdCBuYl9idWZzKQ0KPiAtew0KPiAtCXN0cnVjdCBib25kX3R4X3F1ZXVlICpiZF90 eF9xID0gKHN0cnVjdCBib25kX3R4X3F1ZXVlICopcXVldWU7DQo+IC0Jc3RydWN0IGJvbmRfZGV2 X3ByaXZhdGUgKmludGVybmFscyA9IGJkX3R4X3EtPmRldl9wcml2YXRlOw0KPiAtDQo+IC0JdWlu dDE2X3Qgc2xhdmVfcG9ydF9pZHNbUlRFX01BWF9FVEhQT1JUU107DQo+IC0JdWludDE2X3Qgc2xh dmVfY291bnQ7DQo+IC0NCj4gLQlpZiAodW5saWtlbHkobmJfYnVmcyA9PSAwKSkNCj4gLQkJcmV0 dXJuIDA7DQo+IC0NCj4gLQkvKiBDb3B5IHNsYXZlIGxpc3QgdG8gcHJvdGVjdCBhZ2FpbnN0IHNs YXZlIHVwL2Rvd24gY2hhbmdlcyBkdXJpbmcgdHgNCj4gLQkgKiBidXJzdGluZw0KPiAtCSAqLw0K PiAtCXNsYXZlX2NvdW50ID0gaW50ZXJuYWxzLT5hY3RpdmVfc2xhdmVfY291bnQ7DQo+IC0JaWYg KHVubGlrZWx5KHNsYXZlX2NvdW50IDwgMSkpDQo+IC0JCXJldHVybiAwOw0KPiAtDQo+IC0JbWVt Y3B5KHNsYXZlX3BvcnRfaWRzLCBpbnRlcm5hbHMtPmFjdGl2ZV9zbGF2ZXMsDQo+IC0JCQlzaXpl b2Yoc2xhdmVfcG9ydF9pZHNbMF0pICogc2xhdmVfY291bnQpOw0KPiAtCXJldHVybiB0eF9idXJz dF9iYWxhbmNlKHF1ZXVlLCBidWZzLCBuYl9idWZzLCBzbGF2ZV9wb3J0X2lkcywNCj4gLQkJCQlz bGF2ZV9jb3VudCk7DQo+IC19DQo+IC0NCj4gLXN0YXRpYyBpbmxpbmUgdWludDE2X3QNCj4gLXR4 X2J1cnN0XzgwMjNhZCh2b2lkICpxdWV1ZSwgc3RydWN0IHJ0ZV9tYnVmICoqYnVmcywgdWludDE2 X3QgbmJfYnVmcywNCj4gLQkJYm9vbCBkZWRpY2F0ZWRfdHhxKQ0KPiAtew0KPiAtCXN0cnVjdCBi b25kX3R4X3F1ZXVlICpiZF90eF9xID0gKHN0cnVjdCBib25kX3R4X3F1ZXVlICopcXVldWU7DQo+ IC0Jc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFscyA9IGJkX3R4X3EtPmRldl9wcml2 YXRlOw0KPiAtDQo+IC0JdWludDE2X3Qgc2xhdmVfcG9ydF9pZHNbUlRFX01BWF9FVEhQT1JUU107 DQo+IC0JdWludDE2X3Qgc2xhdmVfY291bnQ7DQo+IC0NCj4gLQl1aW50MTZfdCBkaXN0X3NsYXZl X3BvcnRfaWRzW1JURV9NQVhfRVRIUE9SVFNdOw0KPiAtCXVpbnQxNl90IGRpc3Rfc2xhdmVfY291 bnQ7DQo+IC0NCj4gLQl1aW50MTZfdCBzbGF2ZV90eF9jb3VudDsNCj4gLQ0KPiAtCXVpbnQxNl90 IGk7DQo+IC0NCj4gLQkvKiBDb3B5IHNsYXZlIGxpc3QgdG8gcHJvdGVjdCBhZ2FpbnN0IHNsYXZl IHVwL2Rvd24gY2hhbmdlcyBkdXJpbmcgdHgNCj4gLQkgKiBidXJzdGluZyAqLw0KPiAtCXNsYXZl X2NvdW50ID0gaW50ZXJuYWxzLT5hY3RpdmVfc2xhdmVfY291bnQ7DQo+IC0JaWYgKHVubGlrZWx5 KHNsYXZlX2NvdW50IDwgMSkpDQo+IC0JCXJldHVybiAwOw0KPiAtDQo+IC0JbWVtY3B5KHNsYXZl X3BvcnRfaWRzLCBpbnRlcm5hbHMtPmFjdGl2ZV9zbGF2ZXMsDQo+IC0JCQlzaXplb2Yoc2xhdmVf cG9ydF9pZHNbMF0pICogc2xhdmVfY291bnQpOw0KPiAtDQo+IC0JaWYgKGRlZGljYXRlZF90eHEp DQo+IC0JCWdvdG8gc2tpcF90eF9yaW5nOw0KPiAtDQo+IC0JLyogQ2hlY2sgZm9yIExBQ1AgY29u dHJvbCBwYWNrZXRzIGFuZCBzZW5kIGlmIGF2YWlsYWJsZSAqLw0KPiAtCWZvciAoaSA9IDA7IGkg PCBzbGF2ZV9jb3VudDsgaSsrKSB7DQo+IC0JCXN0cnVjdCBwb3J0ICpwb3J0ID0gJmJvbmRfbW9k ZV84MDIzYWRfcG9ydHNbc2xhdmVfcG9ydF9pZHNbaV1dOw0KPiAtCQlzdHJ1Y3QgcnRlX21idWYg KmN0cmxfcGt0ID0gTlVMTDsNCj4gLQ0KPiAtCQlpZiAobGlrZWx5KHJ0ZV9yaW5nX2VtcHR5KHBv cnQtPnR4X3JpbmcpKSkNCj4gLQkJCWNvbnRpbnVlOw0KPiAtDQo+IC0JCWlmIChydGVfcmluZ19k ZXF1ZXVlKHBvcnQtPnR4X3JpbmcsDQo+IC0JCQkJICAgICAodm9pZCAqKikmY3RybF9wa3QpICE9 IC1FTk9FTlQpIHsNCj4gLQkJCXNsYXZlX3R4X2NvdW50ID0gcnRlX2V0aF90eF9idXJzdChzbGF2 ZV9wb3J0X2lkc1tpXSwNCj4gLQkJCQkJYmRfdHhfcS0+cXVldWVfaWQsICZjdHJsX3BrdCwgMSk7 DQo+IC0JCQkvKg0KPiAtCQkJICogcmUtZW5xdWV1ZSBMQUcgY29udHJvbCBwbGFuZSBwYWNrZXRz IHRvIGJ1ZmZlcmluZw0KPiAtCQkJICogcmluZyBpZiB0cmFuc21pc3Npb24gZmFpbHMgc28gdGhl IHBhY2tldCBpc24ndCBsb3N0Lg0KPiAtCQkJICovDQo+IC0JCQlpZiAoc2xhdmVfdHhfY291bnQg IT0gMSkNCj4gLQkJCQlydGVfcmluZ19lbnF1ZXVlKHBvcnQtPnR4X3JpbmcsCWN0cmxfcGt0KTsN Cj4gLQkJfQ0KPiAtCX0NCj4gLQ0KPiAtc2tpcF90eF9yaW5nOg0KPiAtCWlmICh1bmxpa2VseShu Yl9idWZzID09IDApKQ0KPiAtCQlyZXR1cm4gMDsNCj4gLQ0KPiAtCWRpc3Rfc2xhdmVfY291bnQg PSAwOw0KPiAtCWZvciAoaSA9IDA7IGkgPCBzbGF2ZV9jb3VudDsgaSsrKSB7DQo+IC0JCXN0cnVj dCBwb3J0ICpwb3J0ID0gJmJvbmRfbW9kZV84MDIzYWRfcG9ydHNbc2xhdmVfcG9ydF9pZHNbaV1d Ow0KPiAtDQo+IC0JCWlmIChBQ1RPUl9TVEFURShwb3J0LCBESVNUUklCVVRJTkcpKQ0KPiAtCQkJ ZGlzdF9zbGF2ZV9wb3J0X2lkc1tkaXN0X3NsYXZlX2NvdW50KytdID0NCj4gLQkJCQkJc2xhdmVf cG9ydF9pZHNbaV07DQo+IC0JfQ0KPiAtDQo+IC0JaWYgKHVubGlrZWx5KGRpc3Rfc2xhdmVfY291 bnQgPCAxKSkNCj4gLQkJcmV0dXJuIDA7DQo+IC0NCj4gLQlyZXR1cm4gdHhfYnVyc3RfYmFsYW5j ZShxdWV1ZSwgYnVmcywgbmJfYnVmcywgZGlzdF9zbGF2ZV9wb3J0X2lkcywNCj4gLQkJCQlkaXN0 X3NsYXZlX2NvdW50KTsNCj4gLX0NCj4gLQ0KPiAtc3RhdGljIHVpbnQxNl90DQo+IC1ib25kX2V0 aGRldl90eF9idXJzdF84MDIzYWQodm9pZCAqcXVldWUsIHN0cnVjdCBydGVfbWJ1ZiAqKmJ1ZnMs DQo+IC0JCXVpbnQxNl90IG5iX2J1ZnMpDQo+IC17DQo+IC0JcmV0dXJuIHR4X2J1cnN0XzgwMjNh ZChxdWV1ZSwgYnVmcywgbmJfYnVmcywgZmFsc2UpOw0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMgdWlu dDE2X3QNCj4gLWJvbmRfZXRoZGV2X3R4X2J1cnN0XzgwMjNhZF9mYXN0X3F1ZXVlKHZvaWQgKnF1 ZXVlLCBzdHJ1Y3QgcnRlX21idWYgKipidWZzLA0KPiAtCQl1aW50MTZfdCBuYl9idWZzKQ0KPiAt ew0KPiAtCXJldHVybiB0eF9idXJzdF84MDIzYWQocXVldWUsIGJ1ZnMsIG5iX2J1ZnMsIHRydWUp Ow0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMgdWludDE2X3QNCj4gLWJvbmRfZXRoZGV2X3R4X2J1cnN0 X2Jyb2FkY2FzdCh2b2lkICpxdWV1ZSwgc3RydWN0IHJ0ZV9tYnVmICoqYnVmcywNCj4gLQkJdWlu dDE2X3QgbmJfcGt0cykNCj4gLXsNCj4gLQlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJu YWxzOw0KPiAtCXN0cnVjdCBib25kX3R4X3F1ZXVlICpiZF90eF9xOw0KPiAtDQo+IC0JdWludDE2 X3Qgc2xhdmVzW1JURV9NQVhfRVRIUE9SVFNdOw0KPiAtCXVpbnQ4X3QgdHhfZmFpbGVkX2ZsYWcg PSAwOw0KPiAtCXVpbnQxNl90IG51bV9vZl9zbGF2ZXM7DQo+IC0NCj4gLQl1aW50MTZfdCBtYXhf bmJfb2ZfdHhfcGt0cyA9IDA7DQo+IC0NCj4gLQlpbnQgc2xhdmVfdHhfdG90YWxbUlRFX01BWF9F VEhQT1JUU107DQo+IC0JaW50IGksIG1vc3Rfc3VjY2Vzc2Z1bF90eF9zbGF2ZSA9IC0xOw0KPiAt DQo+IC0JYmRfdHhfcSA9IChzdHJ1Y3QgYm9uZF90eF9xdWV1ZSAqKXF1ZXVlOw0KPiAtCWludGVy bmFscyA9IGJkX3R4X3EtPmRldl9wcml2YXRlOw0KPiAtDQo+IC0JLyogQ29weSBzbGF2ZSBsaXN0 IHRvIHByb3RlY3QgYWdhaW5zdCBzbGF2ZSB1cC9kb3duIGNoYW5nZXMgZHVyaW5nIHR4DQo+IC0J ICogYnVyc3RpbmcgKi8NCj4gLQludW1fb2Zfc2xhdmVzID0gaW50ZXJuYWxzLT5hY3RpdmVfc2xh dmVfY291bnQ7DQo+IC0JbWVtY3B5KHNsYXZlcywgaW50ZXJuYWxzLT5hY3RpdmVfc2xhdmVzLA0K PiAtCQkJc2l6ZW9mKGludGVybmFscy0+YWN0aXZlX3NsYXZlc1swXSkgKiBudW1fb2Zfc2xhdmVz KTsNCj4gLQ0KPiAtCWlmIChudW1fb2Zfc2xhdmVzIDwgMSkNCj4gLQkJcmV0dXJuIDA7DQo+IC0N Cj4gLQkvKiBJbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IG9uIG1idWZzICovDQo+IC0JZm9yIChp ID0gMDsgaSA8IG5iX3BrdHM7IGkrKykNCj4gLQkJcnRlX3BrdG1idWZfcmVmY250X3VwZGF0ZShi dWZzW2ldLCBudW1fb2Zfc2xhdmVzIC0gMSk7DQo+IC0NCj4gLQkvKiBUcmFuc21pdCBidXJzdCBv biBlYWNoIGFjdGl2ZSBzbGF2ZSAqLw0KPiAtCWZvciAoaSA9IDA7IGkgPCBudW1fb2Zfc2xhdmVz OyBpKyspIHsNCj4gLQkJc2xhdmVfdHhfdG90YWxbaV0gPSBydGVfZXRoX3R4X2J1cnN0KHNsYXZl c1tpXSwgYmRfdHhfcS0+cXVldWVfaWQsDQo+IC0JCQkJCWJ1ZnMsIG5iX3BrdHMpOw0KPiAtDQo+ IC0JCWlmICh1bmxpa2VseShzbGF2ZV90eF90b3RhbFtpXSA8IG5iX3BrdHMpKQ0KPiAtCQkJdHhf ZmFpbGVkX2ZsYWcgPSAxOw0KPiAtDQo+IC0JCS8qIHJlY29yZCB0aGUgdmFsdWUgYW5kIHNsYXZl IGluZGV4IGZvciB0aGUgc2xhdmUgd2hpY2ggdHJhbnNtaXRzIHRoZQ0KPiAtCQkgKiBtYXhpbXVt IG51bWJlciBvZiBwYWNrZXRzICovDQo+IC0JCWlmIChzbGF2ZV90eF90b3RhbFtpXSA+IG1heF9u Yl9vZl90eF9wa3RzKSB7DQo+IC0JCQltYXhfbmJfb2ZfdHhfcGt0cyA9IHNsYXZlX3R4X3RvdGFs W2ldOw0KPiAtCQkJbW9zdF9zdWNjZXNzZnVsX3R4X3NsYXZlID0gaTsNCj4gLQkJfQ0KPiAtCX0N Cj4gLQ0KPiAtCS8qIGlmIHNsYXZlcyBmYWlsIHRvIHRyYW5zbWl0IHBhY2tldHMgZnJvbSBidXJz dCwgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24NCj4gLQkgKiBpcyBub3QgZXhwZWN0ZWQgdG8ga25v dyBhYm91dCBtdWx0aXBsZSByZWZlcmVuY2VzIHRvIHBhY2tldHMgc28gd2UgbXVzdA0KPiAtCSAq IGhhbmRsZSBmYWlsdXJlcyBvZiBhbGwgcGFja2V0cyBleGNlcHQgdGhvc2Ugb2YgdGhlIG1vc3Qg c3VjY2Vzc2Z1bCBzbGF2ZQ0KPiAtCSAqLw0KPiAtCWlmICh1bmxpa2VseSh0eF9mYWlsZWRfZmxh ZykpDQo+IC0JCWZvciAoaSA9IDA7IGkgPCBudW1fb2Zfc2xhdmVzOyBpKyspDQo+IC0JCQlpZiAo aSAhPSBtb3N0X3N1Y2Nlc3NmdWxfdHhfc2xhdmUpDQo+IC0JCQkJd2hpbGUgKHNsYXZlX3R4X3Rv dGFsW2ldIDwgbmJfcGt0cykNCj4gLQkJCQkJcnRlX3BrdG1idWZfZnJlZShidWZzW3NsYXZlX3R4 X3RvdGFsW2ldKytdKTsNCj4gLQ0KPiAtCXJldHVybiBtYXhfbmJfb2ZfdHhfcGt0czsNCj4gLX0N Cj4gLQ0KPiAtc3RhdGljIHZvaWQNCj4gLWxpbmtfcHJvcGVydGllc19zZXQoc3RydWN0IHJ0ZV9l dGhfZGV2ICpldGhkZXYsIHN0cnVjdCBydGVfZXRoX2xpbmsgKnNsYXZlX2xpbmspDQo+IC17DQo+ IC0Jc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmJvbmRfY3R4ID0gZXRoZGV2LT5kYXRhLT5kZXZf cHJpdmF0ZTsNCj4gLQ0KPiAtCWlmIChib25kX2N0eC0+bW9kZSA9PSBCT05ESU5HX01PREVfODAy M0FEKSB7DQo+IC0JCS8qKg0KPiAtCQkgKiBJZiBpbiBtb2RlIDQgdGhlbiBzYXZlIHRoZSBsaW5r IHByb3BlcnRpZXMgb2YgdGhlIGZpcnN0DQo+IC0JCSAqIHNsYXZlLCBhbGwgc3Vic2VxdWVudCBz bGF2ZXMgbXVzdCBtYXRjaCB0aGVzZSBwcm9wZXJ0aWVzDQo+IC0JCSAqLw0KPiAtCQlzdHJ1Y3Qg cnRlX2V0aF9saW5rICpib25kX2xpbmsgPSAmYm9uZF9jdHgtPm1vZGU0LnNsYXZlX2xpbms7DQo+ IC0NCj4gLQkJYm9uZF9saW5rLT5saW5rX2F1dG9uZWcgPSBzbGF2ZV9saW5rLT5saW5rX2F1dG9u ZWc7DQo+IC0JCWJvbmRfbGluay0+bGlua19kdXBsZXggPSBzbGF2ZV9saW5rLT5saW5rX2R1cGxl eDsNCj4gLQkJYm9uZF9saW5rLT5saW5rX3NwZWVkID0gc2xhdmVfbGluay0+bGlua19zcGVlZDsN Cj4gLQl9IGVsc2Ugew0KPiAtCQkvKioNCj4gLQkJICogSW4gYW55IG90aGVyIG1vZGUgdGhlIGxp bmsgcHJvcGVydGllcyBhcmUgc2V0IHRvIGRlZmF1bHQNCj4gLQkJICogdmFsdWVzIG9mIEFVVE9O RUcvRFVQTEVYDQo+IC0JCSAqLw0KPiAtCQlldGhkZXYtPmRhdGEtPmRldl9saW5rLmxpbmtfYXV0 b25lZyA9IFJURV9FVEhfTElOS19BVVRPTkVHOw0KPiAtCQlldGhkZXYtPmRhdGEtPmRldl9saW5r LmxpbmtfZHVwbGV4ID0gUlRFX0VUSF9MSU5LX0ZVTExfRFVQTEVYOw0KPiAtCX0NCj4gLX0NCj4g LQ0KPiAtc3RhdGljIGludA0KPiAtbGlua19wcm9wZXJ0aWVzX3ZhbGlkKHN0cnVjdCBydGVfZXRo X2RldiAqZXRoZGV2LA0KPiAtCQlzdHJ1Y3QgcnRlX2V0aF9saW5rICpzbGF2ZV9saW5rKQ0KPiAt ew0KPiAtCXN0cnVjdCBib25kX2Rldl9wcml2YXRlICpib25kX2N0eCA9IGV0aGRldi0+ZGF0YS0+ ZGV2X3ByaXZhdGU7DQo+IC0NCj4gLQlpZiAoYm9uZF9jdHgtPm1vZGUgPT0gQk9ORElOR19NT0RF XzgwMjNBRCkgew0KPiAtCQlzdHJ1Y3QgcnRlX2V0aF9saW5rICpib25kX2xpbmsgPSAmYm9uZF9j dHgtPm1vZGU0LnNsYXZlX2xpbms7DQo+IC0NCj4gLQkJaWYgKGJvbmRfbGluay0+bGlua19kdXBs ZXggIT0gc2xhdmVfbGluay0+bGlua19kdXBsZXggfHwNCj4gLQkJCWJvbmRfbGluay0+bGlua19h dXRvbmVnICE9IHNsYXZlX2xpbmstPmxpbmtfYXV0b25lZyB8fA0KPiAtCQkJYm9uZF9saW5rLT5s aW5rX3NwZWVkICE9IHNsYXZlX2xpbmstPmxpbmtfc3BlZWQpDQo+IC0JCQlyZXR1cm4gLTE7DQo+ IC0JfQ0KPiAtDQo+IC0JcmV0dXJuIDA7DQo+IC19DQo+IC0NCj4gLWludA0KPiAtbWFjX2FkZHJl c3NfZ2V0KHN0cnVjdCBydGVfZXRoX2RldiAqZXRoX2RldiwNCj4gLQkJc3RydWN0IHJ0ZV9ldGhl cl9hZGRyICpkc3RfbWFjX2FkZHIpDQo+IC17DQo+IC0Jc3RydWN0IHJ0ZV9ldGhlcl9hZGRyICpt YWNfYWRkcjsNCj4gLQ0KPiAtCWlmIChldGhfZGV2ID09IE5VTEwpIHsNCj4gLQkJUlRFX0JPTkRf TE9HKEVSUiwgIk5VTEwgcG9pbnRlciBldGhfZGV2IHNwZWNpZmllZCIpOw0KPiAtCQlyZXR1cm4g LTE7DQo+IC0JfQ0KPiAtDQo+IC0JaWYgKGRzdF9tYWNfYWRkciA9PSBOVUxMKSB7DQo+IC0JCVJU RV9CT05EX0xPRyhFUlIsICJOVUxMIHBvaW50ZXIgTUFDIHNwZWNpZmllZCIpOw0KPiAtCQlyZXR1 cm4gLTE7DQo+IC0JfQ0KPiAtDQo+IC0JbWFjX2FkZHIgPSBldGhfZGV2LT5kYXRhLT5tYWNfYWRk cnM7DQo+IC0NCj4gLQlydGVfZXRoZXJfYWRkcl9jb3B5KG1hY19hZGRyLCBkc3RfbWFjX2FkZHIp Ow0KPiAtCXJldHVybiAwOw0KPiAtfQ0KPiAtDQo+IC1pbnQNCj4gLW1hY19hZGRyZXNzX3NldChz dHJ1Y3QgcnRlX2V0aF9kZXYgKmV0aF9kZXYsDQo+IC0JCXN0cnVjdCBydGVfZXRoZXJfYWRkciAq bmV3X21hY19hZGRyKQ0KPiAtew0KPiAtCXN0cnVjdCBydGVfZXRoZXJfYWRkciAqbWFjX2FkZHI7 DQo+IC0NCj4gLQlpZiAoZXRoX2RldiA9PSBOVUxMKSB7DQo+IC0JCVJURV9CT05EX0xPRyhFUlIs ICJOVUxMIHBvaW50ZXIgZXRoX2RldiBzcGVjaWZpZWQiKTsNCj4gLQkJcmV0dXJuIC0xOw0KPiAt CX0NCj4gLQ0KPiAtCWlmIChuZXdfbWFjX2FkZHIgPT0gTlVMTCkgew0KPiAtCQlSVEVfQk9ORF9M T0coRVJSLCAiTlVMTCBwb2ludGVyIE1BQyBzcGVjaWZpZWQiKTsNCj4gLQkJcmV0dXJuIC0xOw0K PiAtCX0NCj4gLQ0KPiAtCW1hY19hZGRyID0gZXRoX2Rldi0+ZGF0YS0+bWFjX2FkZHJzOw0KPiAt DQo+IC0JLyogSWYgbmV3IE1BQyBpcyBkaWZmZXJlbnQgdG8gY3VycmVudCBNQUMgdGhlbiB1cGRh dGUgKi8NCj4gLQlpZiAobWVtY21wKG1hY19hZGRyLCBuZXdfbWFjX2FkZHIsIHNpemVvZigqbWFj X2FkZHIpKSAhPSAwKQ0KPiAtCQltZW1jcHkobWFjX2FkZHIsIG5ld19tYWNfYWRkciwgc2l6ZW9m KCptYWNfYWRkcikpOw0KPiAtDQo+IC0JcmV0dXJuIDA7DQo+IC19DQo+IC0NCj4gLXN0YXRpYyBj b25zdCBzdHJ1Y3QgcnRlX2V0aGVyX2FkZHIgbnVsbF9tYWNfYWRkcjsNCj4gLQ0KPiAtLyoNCj4g LSAqIEFkZCBhZGRpdGlvbmFsIE1BQyBhZGRyZXNzZXMgdG8gdGhlIHNsYXZlDQo+IC0gKi8NCj4g LWludA0KPiAtc2xhdmVfYWRkX21hY19hZGRyZXNzZXMoc3RydWN0IHJ0ZV9ldGhfZGV2ICpib25k ZWRfZXRoX2RldiwNCj4gLQkJdWludDE2X3Qgc2xhdmVfcG9ydF9pZCkNCj4gLXsNCj4gLQlpbnQg aSwgcmV0Ow0KPiAtCXN0cnVjdCBydGVfZXRoZXJfYWRkciAqbWFjX2FkZHI7DQo+IC0NCj4gLQlm b3IgKGkgPSAxOyBpIDwgQk9ORF9NQVhfTUFDX0FERFJTOyBpKyspIHsNCj4gLQkJbWFjX2FkZHIg PSAmYm9uZGVkX2V0aF9kZXYtPmRhdGEtPm1hY19hZGRyc1tpXTsNCj4gLQkJaWYgKHJ0ZV9pc19z YW1lX2V0aGVyX2FkZHIobWFjX2FkZHIsICZudWxsX21hY19hZGRyKSkNCj4gLQkJCWJyZWFrOw0K PiAtDQo+IC0JCXJldCA9IHJ0ZV9ldGhfZGV2X21hY19hZGRyX2FkZChzbGF2ZV9wb3J0X2lkLCBt YWNfYWRkciwgMCk7DQo+IC0JCWlmIChyZXQgPCAwKSB7DQo+IC0JCQkvKiByb2xsYmFjayAqLw0K PiAtCQkJZm9yIChpLS07IGkgPiAwOyBpLS0pDQo+IC0JCQkJcnRlX2V0aF9kZXZfbWFjX2FkZHJf cmVtb3ZlKHNsYXZlX3BvcnRfaWQsDQo+IC0JCQkJCSZib25kZWRfZXRoX2Rldi0+ZGF0YS0+bWFj X2FkZHJzW2ldKTsNCj4gLQkJCXJldHVybiByZXQ7DQo+IC0JCX0NCj4gLQl9DQo+IC0NCj4gLQly ZXR1cm4gMDsNCj4gLX0NCj4gLQ0KPiAtLyoNCj4gLSAqIFJlbW92ZSBhZGRpdGlvbmFsIE1BQyBh ZGRyZXNzZXMgZnJvbSB0aGUgc2xhdmUNCj4gLSAqLw0KPiAtaW50DQo+IC1zbGF2ZV9yZW1vdmVf bWFjX2FkZHJlc3NlcyhzdHJ1Y3QgcnRlX2V0aF9kZXYgKmJvbmRlZF9ldGhfZGV2LA0KPiAtCQl1 aW50MTZfdCBzbGF2ZV9wb3J0X2lkKQ0KPiAtew0KPiAtCWludCBpLCByYywgcmV0Ow0KPiAtCXN0 cnVjdCBydGVfZXRoZXJfYWRkciAqbWFjX2FkZHI7DQo+IC0NCj4gLQlyYyA9IDA7DQo+IC0JZm9y IChpID0gMTsgaSA8IEJPTkRfTUFYX01BQ19BRERSUzsgaSsrKSB7DQo+IC0JCW1hY19hZGRyID0g JmJvbmRlZF9ldGhfZGV2LT5kYXRhLT5tYWNfYWRkcnNbaV07DQo+IC0JCWlmIChydGVfaXNfc2Ft ZV9ldGhlcl9hZGRyKG1hY19hZGRyLCAmbnVsbF9tYWNfYWRkcikpDQo+IC0JCQlicmVhazsNCj4g LQ0KPiAtCQlyZXQgPSBydGVfZXRoX2Rldl9tYWNfYWRkcl9yZW1vdmUoc2xhdmVfcG9ydF9pZCwg bWFjX2FkZHIpOw0KPiAtCQkvKiBzYXZlIG9ubHkgdGhlIGZpcnN0IGVycm9yICovDQo+IC0JCWlm IChyZXQgPCAwICYmIHJjID09IDApDQo+IC0JCQlyYyA9IHJldDsNCj4gLQl9DQo+IC0NCj4gLQly ZXR1cm4gcmM7DQo+IC19DQo+IC0NCj4gLWludA0KPiAtbWFjX2FkZHJlc3Nfc2xhdmVzX3VwZGF0 ZShzdHJ1Y3QgcnRlX2V0aF9kZXYgKmJvbmRlZF9ldGhfZGV2KQ0KPiAtew0KPiAtCXN0cnVjdCBi b25kX2Rldl9wcml2YXRlICppbnRlcm5hbHMgPSBib25kZWRfZXRoX2Rldi0+ZGF0YS0+ZGV2X3By aXZhdGU7DQo+IC0JYm9vbCBzZXQ7DQo+IC0JaW50IGk7DQo+IC0NCj4gLQkvKiBVcGRhdGUgc2xh dmUgZGV2aWNlcyBNQUMgYWRkcmVzc2VzICovDQo+IC0JaWYgKGludGVybmFscy0+c2xhdmVfY291 bnQgPCAxKQ0KPiAtCQlyZXR1cm4gLTE7DQo+IC0NCj4gLQlzd2l0Y2ggKGludGVybmFscy0+bW9k ZSkgew0KPiAtCWNhc2UgQk9ORElOR19NT0RFX1JPVU5EX1JPQklOOg0KPiAtCWNhc2UgQk9ORElO R19NT0RFX0JBTEFOQ0U6DQo+IC0JY2FzZSBCT05ESU5HX01PREVfQlJPQURDQVNUOg0KPiAtCQlm b3IgKGkgPSAwOyBpIDwgaW50ZXJuYWxzLT5zbGF2ZV9jb3VudDsgaSsrKSB7DQo+IC0JCQlpZiAo cnRlX2V0aF9kZXZfZGVmYXVsdF9tYWNfYWRkcl9zZXQoDQo+IC0JCQkJCWludGVybmFscy0+c2xh dmVzW2ldLnBvcnRfaWQsDQo+IC0JCQkJCWJvbmRlZF9ldGhfZGV2LT5kYXRhLT5tYWNfYWRkcnMp KSB7DQo+IC0JCQkJUlRFX0JPTkRfTE9HKEVSUiwgIkZhaWxlZCB0byB1cGRhdGUgcG9ydCBJZCAl ZCBNQUMgYWRkcmVzcyIsDQo+IC0JCQkJCQlpbnRlcm5hbHMtPnNsYXZlc1tpXS5wb3J0X2lkKTsN Cj4gLQkJCQlyZXR1cm4gLTE7DQo+IC0JCQl9DQo+IC0JCX0NCj4gLQkJYnJlYWs7DQo+IC0JY2Fz ZSBCT05ESU5HX01PREVfODAyM0FEOg0KPiAtCQlib25kX21vZGVfODAyM2FkX21hY19hZGRyZXNz X3VwZGF0ZShib25kZWRfZXRoX2Rldik7DQo+IC0JCWJyZWFrOw0KPiAtCWNhc2UgQk9ORElOR19N T0RFX0FDVElWRV9CQUNLVVA6DQo+IC0JY2FzZSBCT05ESU5HX01PREVfVExCOg0KPiAtCWNhc2Ug Qk9ORElOR19NT0RFX0FMQjoNCj4gLQlkZWZhdWx0Og0KPiAtCQlzZXQgPSB0cnVlOw0KPiAtCQlm b3IgKGkgPSAwOyBpIDwgaW50ZXJuYWxzLT5zbGF2ZV9jb3VudDsgaSsrKSB7DQo+IC0JCQlpZiAo aW50ZXJuYWxzLT5zbGF2ZXNbaV0ucG9ydF9pZCA9PQ0KPiAtCQkJCQlpbnRlcm5hbHMtPmN1cnJl bnRfcHJpbWFyeV9wb3J0KSB7DQo+IC0JCQkJaWYgKHJ0ZV9ldGhfZGV2X2RlZmF1bHRfbWFjX2Fk ZHJfc2V0KA0KPiAtCQkJCQkJaW50ZXJuYWxzLT5jdXJyZW50X3ByaW1hcnlfcG9ydCwNCj4gLQkJ CQkJCWJvbmRlZF9ldGhfZGV2LT5kYXRhLT5tYWNfYWRkcnMpKSB7DQo+IC0JCQkJCVJURV9CT05E X0xPRyhFUlIsICJGYWlsZWQgdG8gdXBkYXRlIHBvcnQgSWQgJWQgTUFDIGFkZHJlc3MiLA0KPiAt CQkJCQkJCWludGVybmFscy0+Y3VycmVudF9wcmltYXJ5X3BvcnQpOw0KPiAtCQkJCQlzZXQgPSBm YWxzZTsNCj4gLQkJCQl9DQo+IC0JCQl9IGVsc2Ugew0KPiAtCQkJCWlmIChydGVfZXRoX2Rldl9k ZWZhdWx0X21hY19hZGRyX3NldCgNCj4gLQkJCQkJCWludGVybmFscy0+c2xhdmVzW2ldLnBvcnRf aWQsDQo+IC0JCQkJCQkmaW50ZXJuYWxzLT5zbGF2ZXNbaV0ucGVyc2lzdGVkX21hY19hZGRyKSkg ew0KPiAtCQkJCQlSVEVfQk9ORF9MT0coRVJSLCAiRmFpbGVkIHRvIHVwZGF0ZSBwb3J0IElkICVk IE1BQyBhZGRyZXNzIiwNCj4gLQkJCQkJCQlpbnRlcm5hbHMtPnNsYXZlc1tpXS5wb3J0X2lkKTsN Cj4gLQkJCQl9DQo+IC0JCQl9DQo+IC0JCX0NCj4gLQkJaWYgKCFzZXQpDQo+IC0JCQlyZXR1cm4g LTE7DQo+IC0JfQ0KPiAtDQo+IC0JcmV0dXJuIDA7DQo+IC19DQo+IC0NCj4gLWludA0KPiAtYm9u ZF9ldGhkZXZfbW9kZV9zZXQoc3RydWN0IHJ0ZV9ldGhfZGV2ICpldGhfZGV2LCB1aW50OF90IG1v ZGUpDQo+IC17DQo+IC0Jc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFsczsNCj4gLQ0K PiAtCWludGVybmFscyA9IGV0aF9kZXYtPmRhdGEtPmRldl9wcml2YXRlOw0KPiAtDQo+IC0Jc3dp dGNoIChtb2RlKSB7DQo+IC0JY2FzZSBCT05ESU5HX01PREVfUk9VTkRfUk9CSU46DQo+IC0JCWV0 aF9kZXYtPnR4X3BrdF9idXJzdCA9IGJvbmRfZXRoZGV2X3R4X2J1cnN0X3JvdW5kX3JvYmluOw0K PiAtCQlldGhfZGV2LT5yeF9wa3RfYnVyc3QgPSBib25kX2V0aGRldl9yeF9idXJzdDsNCj4gLQkJ YnJlYWs7DQo+IC0JY2FzZSBCT05ESU5HX01PREVfQUNUSVZFX0JBQ0tVUDoNCj4gLQkJZXRoX2Rl di0+dHhfcGt0X2J1cnN0ID0gYm9uZF9ldGhkZXZfdHhfYnVyc3RfYWN0aXZlX2JhY2t1cDsNCj4g LQkJZXRoX2Rldi0+cnhfcGt0X2J1cnN0ID0gYm9uZF9ldGhkZXZfcnhfYnVyc3RfYWN0aXZlX2Jh Y2t1cDsNCj4gLQkJYnJlYWs7DQo+IC0JY2FzZSBCT05ESU5HX01PREVfQkFMQU5DRToNCj4gLQkJ ZXRoX2Rldi0+dHhfcGt0X2J1cnN0ID0gYm9uZF9ldGhkZXZfdHhfYnVyc3RfYmFsYW5jZTsNCj4g LQkJZXRoX2Rldi0+cnhfcGt0X2J1cnN0ID0gYm9uZF9ldGhkZXZfcnhfYnVyc3Q7DQo+IC0JCWJy ZWFrOw0KPiAtCWNhc2UgQk9ORElOR19NT0RFX0JST0FEQ0FTVDoNCj4gLQkJZXRoX2Rldi0+dHhf cGt0X2J1cnN0ID0gYm9uZF9ldGhkZXZfdHhfYnVyc3RfYnJvYWRjYXN0Ow0KPiAtCQlldGhfZGV2 LT5yeF9wa3RfYnVyc3QgPSBib25kX2V0aGRldl9yeF9idXJzdDsNCj4gLQkJYnJlYWs7DQo+IC0J Y2FzZSBCT05ESU5HX01PREVfODAyM0FEOg0KPiAtCQlpZiAoYm9uZF9tb2RlXzgwMjNhZF9lbmFi bGUoZXRoX2RldikgIT0gMCkNCj4gLQkJCXJldHVybiAtMTsNCj4gLQ0KPiAtCQlpZiAoaW50ZXJu YWxzLT5tb2RlNC5kZWRpY2F0ZWRfcXVldWVzLmVuYWJsZWQgPT0gMCkgew0KPiAtCQkJZXRoX2Rl di0+cnhfcGt0X2J1cnN0ID0gYm9uZF9ldGhkZXZfcnhfYnVyc3RfODAyM2FkOw0KPiAtCQkJZXRo X2Rldi0+dHhfcGt0X2J1cnN0ID0gYm9uZF9ldGhkZXZfdHhfYnVyc3RfODAyM2FkOw0KPiAtCQkJ UlRFX0JPTkRfTE9HKFdBUk5JTkcsDQo+IC0JCQkJIlVzaW5nIG1vZGUgNCwgaXQgaXMgbmVjZXNz YXJ5IHRvIGRvIFRYIGJ1cnN0ICINCj4gLQkJCQkiYW5kIFJYIGJ1cnN0IGF0IGxlYXN0IGV2ZXJ5 IDEwMG1zLiIpOw0KPiAtCQl9IGVsc2Ugew0KPiAtCQkJLyogVXNlIGZsb3cgZGlyZWN0b3IncyBv cHRpbWl6YXRpb24gKi8NCj4gLQkJCWV0aF9kZXYtPnJ4X3BrdF9idXJzdCA9DQo+IC0JCQkJCWJv bmRfZXRoZGV2X3J4X2J1cnN0XzgwMjNhZF9mYXN0X3F1ZXVlOw0KPiAtCQkJZXRoX2Rldi0+dHhf cGt0X2J1cnN0ID0NCj4gLQkJCQkJYm9uZF9ldGhkZXZfdHhfYnVyc3RfODAyM2FkX2Zhc3RfcXVl dWU7DQo+IC0JCX0NCj4gLQkJYnJlYWs7DQo+IC0JY2FzZSBCT05ESU5HX01PREVfVExCOg0KPiAt CQlldGhfZGV2LT50eF9wa3RfYnVyc3QgPSBib25kX2V0aGRldl90eF9idXJzdF90bGI7DQo+IC0J CWV0aF9kZXYtPnJ4X3BrdF9idXJzdCA9IGJvbmRfZXRoZGV2X3J4X2J1cnN0X2FjdGl2ZV9iYWNr dXA7DQo+IC0JCWJyZWFrOw0KPiAtCWNhc2UgQk9ORElOR19NT0RFX0FMQjoNCj4gLQkJaWYgKGJv bmRfbW9kZV9hbGJfZW5hYmxlKGV0aF9kZXYpICE9IDApDQo+IC0JCQlyZXR1cm4gLTE7DQo+IC0N Cj4gLQkJZXRoX2Rldi0+dHhfcGt0X2J1cnN0ID0gYm9uZF9ldGhkZXZfdHhfYnVyc3RfYWxiOw0K PiAtCQlldGhfZGV2LT5yeF9wa3RfYnVyc3QgPSBib25kX2V0aGRldl9yeF9idXJzdF9hbGI7DQo+ IC0JCWJyZWFrOw0KPiAtCWRlZmF1bHQ6DQo+IC0JCXJldHVybiAtMTsNCj4gLQl9DQo+IC0NCj4g LQlpbnRlcm5hbHMtPm1vZGUgPSBtb2RlOw0KPiAtDQo+IC0JcmV0dXJuIDA7DQo+IC19DQo+IC0N Cj4gLQ0KPiAtc3RhdGljIGludA0KPiAtc2xhdmVfY29uZmlndXJlX3Nsb3dfcXVldWUoc3RydWN0 IHJ0ZV9ldGhfZGV2ICpib25kZWRfZXRoX2RldiwNCj4gLQkJc3RydWN0IHJ0ZV9ldGhfZGV2ICpz bGF2ZV9ldGhfZGV2KQ0KPiAtew0KPiAtCWludCBlcnJ2YWwgPSAwOw0KPiAtCXN0cnVjdCBib25k X2Rldl9wcml2YXRlICppbnRlcm5hbHMgPSBib25kZWRfZXRoX2Rldi0+ZGF0YS0+ZGV2X3ByaXZh dGU7DQo+IC0Jc3RydWN0IHBvcnQgKnBvcnQgPSAmYm9uZF9tb2RlXzgwMjNhZF9wb3J0c1tzbGF2 ZV9ldGhfZGV2LT5kYXRhLT5wb3J0X2lkXTsNCj4gLQ0KPiAtCWlmIChwb3J0LT5zbG93X3Bvb2wg PT0gTlVMTCkgew0KPiAtCQljaGFyIG1lbV9uYW1lWzI1Nl07DQo+IC0JCWludCBzbGF2ZV9pZCA9 IHNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQ7DQo+IC0NCj4gLQkJc25wcmludGYobWVtX25h bWUsIFJURV9ESU0obWVtX25hbWUpLCAic2xhdmVfcG9ydCV1X3Nsb3dfcG9vbCIsDQo+IC0JCQkJ c2xhdmVfaWQpOw0KPiAtCQlwb3J0LT5zbG93X3Bvb2wgPSBydGVfcGt0bWJ1Zl9wb29sX2NyZWF0 ZShtZW1fbmFtZSwgODE5MSwNCj4gLQkJCTI1MCwgMCwgUlRFX01CVUZfREVGQVVMVF9CVUZfU0la RSwNCj4gLQkJCXNsYXZlX2V0aF9kZXYtPmRhdGEtPm51bWFfbm9kZSk7DQo+IC0NCj4gLQkJLyog QW55IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgaW4gaW5pdGlhbGl6YXRpb24gaXMgY3JpdGlj YWwgYmVjYXVzZQ0KPiAtCQkgKiByZXNvdXJjZXMgY2FuJ3QgYmUgZnJlZSwgc28gcmVpbml0aWFs aXphdGlvbiBpcyBpbXBvc3NpYmxlLiAqLw0KPiAtCQlpZiAocG9ydC0+c2xvd19wb29sID09IE5V TEwpIHsNCj4gLQkJCXJ0ZV9wYW5pYygiU2xhdmUgJXU6IEZhaWxlZCB0byBjcmVhdGUgbWVtb3J5 IHBvb2wgJyVzJzogJXNcbiIsDQo+IC0JCQkJc2xhdmVfaWQsIG1lbV9uYW1lLCBydGVfc3RyZXJy b3IocnRlX2Vycm5vKSk7DQo+IC0JCX0NCj4gLQl9DQo+IC0NCj4gLQlpZiAoaW50ZXJuYWxzLT5t b2RlNC5kZWRpY2F0ZWRfcXVldWVzLmVuYWJsZWQgPT0gMSkgew0KPiAtCQkvKiBDb25maWd1cmUg c2xvdyBSeCBxdWV1ZSAqLw0KPiAtDQo+IC0JCWVycnZhbCA9IHJ0ZV9ldGhfcnhfcXVldWVfc2V0 dXAoc2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCwNCj4gLQkJCQlpbnRlcm5hbHMtPm1vZGU0 LmRlZGljYXRlZF9xdWV1ZXMucnhfcWlkLCAxMjgsDQo+IC0JCQkJcnRlX2V0aF9kZXZfc29ja2V0 X2lkKHNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQpLA0KPiAtCQkJCU5VTEwsIHBvcnQtPnNs b3dfcG9vbCk7DQo+IC0JCWlmIChlcnJ2YWwgIT0gMCkgew0KPiAtCQkJUlRFX0JPTkRfTE9HKEVS UiwNCj4gLQkJCQkJInJ0ZV9ldGhfcnhfcXVldWVfc2V0dXA6IHBvcnQ9JWQgcXVldWVfaWQgJWQs IGVyciAoJWQpIiwNCj4gLQkJCQkJc2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCwNCj4gLQkJ CQkJaW50ZXJuYWxzLT5tb2RlNC5kZWRpY2F0ZWRfcXVldWVzLnJ4X3FpZCwNCj4gLQkJCQkJZXJy dmFsKTsNCj4gLQkJCXJldHVybiBlcnJ2YWw7DQo+IC0JCX0NCj4gLQ0KPiAtCQllcnJ2YWwgPSBy dGVfZXRoX3R4X3F1ZXVlX3NldHVwKHNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQsDQo+IC0J CQkJaW50ZXJuYWxzLT5tb2RlNC5kZWRpY2F0ZWRfcXVldWVzLnR4X3FpZCwgNTEyLA0KPiAtCQkJ CXJ0ZV9ldGhfZGV2X3NvY2tldF9pZChzbGF2ZV9ldGhfZGV2LT5kYXRhLT5wb3J0X2lkKSwNCj4g LQkJCQlOVUxMKTsNCj4gLQkJaWYgKGVycnZhbCAhPSAwKSB7DQo+IC0JCQlSVEVfQk9ORF9MT0co RVJSLA0KPiAtCQkJCSJydGVfZXRoX3R4X3F1ZXVlX3NldHVwOiBwb3J0PSVkIHF1ZXVlX2lkICVk LCBlcnIgKCVkKSIsDQo+IC0JCQkJc2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCwNCj4gLQkJ CQlpbnRlcm5hbHMtPm1vZGU0LmRlZGljYXRlZF9xdWV1ZXMudHhfcWlkLA0KPiAtCQkJCWVycnZh bCk7DQo+IC0JCQlyZXR1cm4gZXJydmFsOw0KPiAtCQl9DQo+IC0JfQ0KPiAtCXJldHVybiAwOw0K PiAtfQ0KPiAtDQo+IC1pbnQNCj4gLXNsYXZlX2NvbmZpZ3VyZShzdHJ1Y3QgcnRlX2V0aF9kZXYg KmJvbmRlZF9ldGhfZGV2LA0KPiAtCQlzdHJ1Y3QgcnRlX2V0aF9kZXYgKnNsYXZlX2V0aF9kZXYp DQo+IC17DQo+IC0JdWludDE2X3QgbmJfcnhfcXVldWVzOw0KPiAtCXVpbnQxNl90IG5iX3R4X3F1 ZXVlczsNCj4gLQ0KPiAtCWludCBlcnJ2YWw7DQo+IC0NCj4gLQlzdHJ1Y3QgYm9uZF9kZXZfcHJp dmF0ZSAqaW50ZXJuYWxzID0gYm9uZGVkX2V0aF9kZXYtPmRhdGEtPmRldl9wcml2YXRlOw0KPiAt DQo+IC0JLyogU3RvcCBzbGF2ZSAqLw0KPiAtCWVycnZhbCA9IHJ0ZV9ldGhfZGV2X3N0b3Aoc2xh dmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCk7DQo+IC0JaWYgKGVycnZhbCAhPSAwKQ0KPiAtCQlS VEVfQk9ORF9MT0coRVJSLCAicnRlX2V0aF9kZXZfc3RvcDogcG9ydCAldSwgZXJyICglZCkiLA0K PiAtCQkJICAgICBzbGF2ZV9ldGhfZGV2LT5kYXRhLT5wb3J0X2lkLCBlcnJ2YWwpOw0KPiAtDQo+ IC0JLyogRW5hYmxlIGludGVycnVwdHMgb24gc2xhdmUgZGV2aWNlIGlmIHN1cHBvcnRlZCAqLw0K PiAtCWlmIChzbGF2ZV9ldGhfZGV2LT5kYXRhLT5kZXZfZmxhZ3MgJiBSVEVfRVRIX0RFVl9JTlRS X0xTQykNCj4gLQkJc2xhdmVfZXRoX2Rldi0+ZGF0YS0+ZGV2X2NvbmYuaW50cl9jb25mLmxzYyA9 IDE7DQo+IC0NCj4gLQkvKiBJZiBSU1MgaXMgZW5hYmxlZCBmb3IgYm9uZGluZywgdHJ5IHRvIGVu YWJsZSBpdCBmb3Igc2xhdmVzICAqLw0KPiAtCWlmIChib25kZWRfZXRoX2Rldi0+ZGF0YS0+ZGV2 X2NvbmYucnhtb2RlLm1xX21vZGUgJiBSVEVfRVRIX01RX1JYX1JTU19GTEFHKSB7DQo+IC0JCS8q IHJzc19rZXkgd29uJ3QgYmUgZW1wdHkgaWYgUlNTIGlzIGNvbmZpZ3VyZWQgaW4gYm9uZGVkIGRl diAqLw0KPiAtCQlzbGF2ZV9ldGhfZGV2LT5kYXRhLT5kZXZfY29uZi5yeF9hZHZfY29uZi5yc3Nf Y29uZi5yc3Nfa2V5X2xlbiA9DQo+IC0JCQkJCWludGVybmFscy0+cnNzX2tleV9sZW47DQo+IC0J CXNsYXZlX2V0aF9kZXYtPmRhdGEtPmRldl9jb25mLnJ4X2Fkdl9jb25mLnJzc19jb25mLnJzc19r ZXkgPQ0KPiAtCQkJCQlpbnRlcm5hbHMtPnJzc19rZXk7DQo+IC0NCj4gLQkJc2xhdmVfZXRoX2Rl di0+ZGF0YS0+ZGV2X2NvbmYucnhfYWR2X2NvbmYucnNzX2NvbmYucnNzX2hmID0NCj4gLQkJCQli b25kZWRfZXRoX2Rldi0+ZGF0YS0+ZGV2X2NvbmYucnhfYWR2X2NvbmYucnNzX2NvbmYucnNzX2hm Ow0KPiAtCQlzbGF2ZV9ldGhfZGV2LT5kYXRhLT5kZXZfY29uZi5yeG1vZGUubXFfbW9kZSA9DQo+ IC0JCQkJYm9uZGVkX2V0aF9kZXYtPmRhdGEtPmRldl9jb25mLnJ4bW9kZS5tcV9tb2RlOw0KPiAt CX0gZWxzZSB7DQo+IC0JCXNsYXZlX2V0aF9kZXYtPmRhdGEtPmRldl9jb25mLnJ4X2Fkdl9jb25m LnJzc19jb25mLnJzc19rZXlfbGVuID0gMDsNCj4gLQkJc2xhdmVfZXRoX2Rldi0+ZGF0YS0+ZGV2 X2NvbmYucnhfYWR2X2NvbmYucnNzX2NvbmYucnNzX2tleSA9IE5VTEw7DQo+IC0JCXNsYXZlX2V0 aF9kZXYtPmRhdGEtPmRldl9jb25mLnJ4X2Fkdl9jb25mLnJzc19jb25mLnJzc19oZiA9IDA7DQo+ IC0JCXNsYXZlX2V0aF9kZXYtPmRhdGEtPmRldl9jb25mLnJ4bW9kZS5tcV9tb2RlID0NCj4gLQkJ CQlib25kZWRfZXRoX2Rldi0+ZGF0YS0+ZGV2X2NvbmYucnhtb2RlLm1xX21vZGU7DQo+IC0JfQ0K PiAtDQo+IC0Jc2xhdmVfZXRoX2Rldi0+ZGF0YS0+ZGV2X2NvbmYucnhtb2RlLm10dSA9DQo+IC0J CQlib25kZWRfZXRoX2Rldi0+ZGF0YS0+ZGV2X2NvbmYucnhtb2RlLm10dTsNCj4gLQ0KPiAtCXNs YXZlX2V0aF9kZXYtPmRhdGEtPmRldl9jb25mLnR4bW9kZS5vZmZsb2FkcyB8PQ0KPiAtCQlib25k ZWRfZXRoX2Rldi0+ZGF0YS0+ZGV2X2NvbmYudHhtb2RlLm9mZmxvYWRzOw0KPiAtDQo+IC0Jc2xh dmVfZXRoX2Rldi0+ZGF0YS0+ZGV2X2NvbmYudHhtb2RlLm9mZmxvYWRzICY9DQo+IC0JCShib25k ZWRfZXRoX2Rldi0+ZGF0YS0+ZGV2X2NvbmYudHhtb2RlLm9mZmxvYWRzIHwNCj4gLQkJfmludGVy bmFscy0+dHhfb2ZmbG9hZF9jYXBhKTsNCj4gLQ0KPiAtCXNsYXZlX2V0aF9kZXYtPmRhdGEtPmRl dl9jb25mLnJ4bW9kZS5vZmZsb2FkcyB8PQ0KPiAtCQlib25kZWRfZXRoX2Rldi0+ZGF0YS0+ZGV2 X2NvbmYucnhtb2RlLm9mZmxvYWRzOw0KPiAtDQo+IC0Jc2xhdmVfZXRoX2Rldi0+ZGF0YS0+ZGV2 X2NvbmYucnhtb2RlLm9mZmxvYWRzICY9DQo+IC0JCShib25kZWRfZXRoX2Rldi0+ZGF0YS0+ZGV2 X2NvbmYucnhtb2RlLm9mZmxvYWRzIHwNCj4gLQkJfmludGVybmFscy0+cnhfb2ZmbG9hZF9jYXBh KTsNCj4gLQ0KPiAtDQo+IC0JbmJfcnhfcXVldWVzID0gYm9uZGVkX2V0aF9kZXYtPmRhdGEtPm5i X3J4X3F1ZXVlczsNCj4gLQluYl90eF9xdWV1ZXMgPSBib25kZWRfZXRoX2Rldi0+ZGF0YS0+bmJf dHhfcXVldWVzOw0KPiAtDQo+IC0JaWYgKGludGVybmFscy0+bW9kZSA9PSBCT05ESU5HX01PREVf ODAyM0FEKSB7DQo+IC0JCWlmIChpbnRlcm5hbHMtPm1vZGU0LmRlZGljYXRlZF9xdWV1ZXMuZW5h YmxlZCA9PSAxKSB7DQo+IC0JCQluYl9yeF9xdWV1ZXMrKzsNCj4gLQkJCW5iX3R4X3F1ZXVlcysr Ow0KPiAtCQl9DQo+IC0JfQ0KPiAtDQo+IC0JLyogQ29uZmlndXJlIGRldmljZSAqLw0KPiAtCWVy cnZhbCA9IHJ0ZV9ldGhfZGV2X2NvbmZpZ3VyZShzbGF2ZV9ldGhfZGV2LT5kYXRhLT5wb3J0X2lk LA0KPiAtCQkJbmJfcnhfcXVldWVzLCBuYl90eF9xdWV1ZXMsDQo+IC0JCQkmKHNsYXZlX2V0aF9k ZXYtPmRhdGEtPmRldl9jb25mKSk7DQo+IC0JaWYgKGVycnZhbCAhPSAwKSB7DQo+IC0JCVJURV9C T05EX0xPRyhFUlIsICJDYW5ub3QgY29uZmlndXJlIHNsYXZlIGRldmljZTogcG9ydCAldSwgZXJy ICglZCkiLA0KPiAtCQkJCXNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQsIGVycnZhbCk7DQo+ IC0JCXJldHVybiBlcnJ2YWw7DQo+IC0JfQ0KPiAtDQo+IC0JZXJydmFsID0gcnRlX2V0aF9kZXZf c2V0X210dShzbGF2ZV9ldGhfZGV2LT5kYXRhLT5wb3J0X2lkLA0KPiAtCQkJCSAgICAgYm9uZGVk X2V0aF9kZXYtPmRhdGEtPm10dSk7DQo+IC0JaWYgKGVycnZhbCAhPSAwICYmIGVycnZhbCAhPSAt RU5PVFNVUCkgew0KPiAtCQlSVEVfQk9ORF9MT0coRVJSLCAicnRlX2V0aF9kZXZfc2V0X210dTog cG9ydCAldSwgZXJyICglZCkiLA0KPiAtCQkJCXNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQs IGVycnZhbCk7DQo+IC0JCXJldHVybiBlcnJ2YWw7DQo+IC0JfQ0KPiAtCXJldHVybiAwOw0KPiAt fQ0KPiAtDQo+IC1pbnQNCj4gLXNsYXZlX3N0YXJ0KHN0cnVjdCBydGVfZXRoX2RldiAqYm9uZGVk X2V0aF9kZXYsDQo+IC0JCXN0cnVjdCBydGVfZXRoX2RldiAqc2xhdmVfZXRoX2RldikNCj4gLXsN Cj4gLQlpbnQgZXJydmFsID0gMDsNCj4gLQlzdHJ1Y3QgYm9uZF9yeF9xdWV1ZSAqYmRfcnhfcTsN Cj4gLQlzdHJ1Y3QgYm9uZF90eF9xdWV1ZSAqYmRfdHhfcTsNCj4gLQl1aW50MTZfdCBxX2lkOw0K PiAtCXN0cnVjdCBydGVfZmxvd19lcnJvciBmbG93X2Vycm9yOw0KPiAtCXN0cnVjdCBib25kX2Rl dl9wcml2YXRlICppbnRlcm5hbHMgPSBib25kZWRfZXRoX2Rldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7 DQo+IC0NCj4gLQkvKiBTZXR1cCBSeCBRdWV1ZXMgKi8NCj4gLQlmb3IgKHFfaWQgPSAwOyBxX2lk IDwgYm9uZGVkX2V0aF9kZXYtPmRhdGEtPm5iX3J4X3F1ZXVlczsgcV9pZCsrKSB7DQo+IC0JCWJk X3J4X3EgPSAoc3RydWN0IGJvbmRfcnhfcXVldWUgKilib25kZWRfZXRoX2Rldi0+ZGF0YS0+cnhf cXVldWVzW3FfaWRdOw0KPiAtDQo+IC0JCWVycnZhbCA9IHJ0ZV9ldGhfcnhfcXVldWVfc2V0dXAo c2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCwgcV9pZCwNCj4gLQkJCQliZF9yeF9xLT5uYl9y eF9kZXNjLA0KPiAtCQkJCXJ0ZV9ldGhfZGV2X3NvY2tldF9pZChzbGF2ZV9ldGhfZGV2LT5kYXRh LT5wb3J0X2lkKSwNCj4gLQkJCQkmKGJkX3J4X3EtPnJ4X2NvbmYpLCBiZF9yeF9xLT5tYl9wb29s KTsNCj4gLQkJaWYgKGVycnZhbCAhPSAwKSB7DQo+IC0JCQlSVEVfQk9ORF9MT0coRVJSLA0KPiAt CQkJCQkicnRlX2V0aF9yeF9xdWV1ZV9zZXR1cDogcG9ydD0lZCBxdWV1ZV9pZCAlZCwgZXJyICgl ZCkiLA0KPiAtCQkJCQlzbGF2ZV9ldGhfZGV2LT5kYXRhLT5wb3J0X2lkLCBxX2lkLCBlcnJ2YWwp Ow0KPiAtCQkJcmV0dXJuIGVycnZhbDsNCj4gLQkJfQ0KPiAtCX0NCj4gLQ0KPiAtCS8qIFNldHVw IFR4IFF1ZXVlcyAqLw0KPiAtCWZvciAocV9pZCA9IDA7IHFfaWQgPCBib25kZWRfZXRoX2Rldi0+ ZGF0YS0+bmJfdHhfcXVldWVzOyBxX2lkKyspIHsNCj4gLQkJYmRfdHhfcSA9IChzdHJ1Y3QgYm9u ZF90eF9xdWV1ZSAqKWJvbmRlZF9ldGhfZGV2LT5kYXRhLT50eF9xdWV1ZXNbcV9pZF07DQo+IC0N Cj4gLQkJZXJydmFsID0gcnRlX2V0aF90eF9xdWV1ZV9zZXR1cChzbGF2ZV9ldGhfZGV2LT5kYXRh LT5wb3J0X2lkLCBxX2lkLA0KPiAtCQkJCWJkX3R4X3EtPm5iX3R4X2Rlc2MsDQo+IC0JCQkJcnRl X2V0aF9kZXZfc29ja2V0X2lkKHNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQpLA0KPiAtCQkJ CSZiZF90eF9xLT50eF9jb25mKTsNCj4gLQkJaWYgKGVycnZhbCAhPSAwKSB7DQo+IC0JCQlSVEVf Qk9ORF9MT0coRVJSLA0KPiAtCQkJCSJydGVfZXRoX3R4X3F1ZXVlX3NldHVwOiBwb3J0PSVkIHF1 ZXVlX2lkICVkLCBlcnIgKCVkKSIsDQo+IC0JCQkJc2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9p ZCwgcV9pZCwgZXJydmFsKTsNCj4gLQkJCXJldHVybiBlcnJ2YWw7DQo+IC0JCX0NCj4gLQl9DQo+ IC0NCj4gLQlpZiAoaW50ZXJuYWxzLT5tb2RlID09IEJPTkRJTkdfTU9ERV84MDIzQUQgJiYNCj4g LQkJCWludGVybmFscy0+bW9kZTQuZGVkaWNhdGVkX3F1ZXVlcy5lbmFibGVkID09IDEpIHsNCj4g LQkJaWYgKHNsYXZlX2NvbmZpZ3VyZV9zbG93X3F1ZXVlKGJvbmRlZF9ldGhfZGV2LCBzbGF2ZV9l dGhfZGV2KQ0KPiAtCQkJCSE9IDApDQo+IC0JCQlyZXR1cm4gZXJydmFsOw0KPiAtDQo+IC0JCWVy cnZhbCA9IGJvbmRfZXRoZGV2XzgwMjNhZF9mbG93X3ZlcmlmeShib25kZWRfZXRoX2RldiwNCj4g LQkJCQlzbGF2ZV9ldGhfZGV2LT5kYXRhLT5wb3J0X2lkKTsNCj4gLQkJaWYgKGVycnZhbCAhPSAw KSB7DQo+IC0JCQlSVEVfQk9ORF9MT0coRVJSLA0KPiAtCQkJCSJib25kX2V0aGRldl84MDIzYWRf Zmxvd192ZXJpZnk6IHBvcnQ9JWQsIGVyciAoJWQpIiwNCj4gLQkJCQlzbGF2ZV9ldGhfZGV2LT5k YXRhLT5wb3J0X2lkLCBlcnJ2YWwpOw0KPiAtCQkJcmV0dXJuIGVycnZhbDsNCj4gLQkJfQ0KPiAt DQo+IC0JCWlmIChpbnRlcm5hbHMtPm1vZGU0LmRlZGljYXRlZF9xdWV1ZXMuZmxvd1tzbGF2ZV9l dGhfZGV2LT5kYXRhLT5wb3J0X2lkXSAhPSBOVUxMKSB7DQo+IC0JCQllcnJ2YWwgPSBydGVfZmxv d19kZXN0cm95KHNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQsDQo+IC0JCQkJCWludGVybmFs cy0+bW9kZTQuZGVkaWNhdGVkX3F1ZXVlcy5mbG93W3NsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRf aWRdLA0KPiAtCQkJCQkmZmxvd19lcnJvcik7DQo+IC0JCQlSVEVfQk9ORF9MT0coRVJSLCAiYm9u ZF9ldGhkZXZfODAyM2FkX2Zsb3dfZGVzdHJveTogcG9ydD0lZCwgZXJyICglZCkiLA0KPiAtCQkJ CXNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQsIGVycnZhbCk7DQo+IC0JCX0NCj4gLQ0KPiAt CQllcnJ2YWwgPSBib25kX2V0aGRldl84MDIzYWRfZmxvd19zZXQoYm9uZGVkX2V0aF9kZXYsDQo+ IC0JCQkJc2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCk7DQo+IC0JCWlmIChlcnJ2YWwgIT0g MCkgew0KPiAtCQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4gLQkJCQkiYm9uZF9ldGhkZXZfODAyM2Fk X2Zsb3dfc2V0OiBwb3J0PSVkLCBlcnIgKCVkKSIsDQo+IC0JCQkJc2xhdmVfZXRoX2Rldi0+ZGF0 YS0+cG9ydF9pZCwgZXJydmFsKTsNCj4gLQkJCXJldHVybiBlcnJ2YWw7DQo+IC0JCX0NCj4gLQl9 DQo+IC0NCj4gLQkvKiBTdGFydCBkZXZpY2UgKi8NCj4gLQllcnJ2YWwgPSBydGVfZXRoX2Rldl9z dGFydChzbGF2ZV9ldGhfZGV2LT5kYXRhLT5wb3J0X2lkKTsNCj4gLQlpZiAoZXJydmFsICE9IDAp IHsNCj4gLQkJUlRFX0JPTkRfTE9HKEVSUiwgInJ0ZV9ldGhfZGV2X3N0YXJ0OiBwb3J0PSV1LCBl cnIgKCVkKSIsDQo+IC0JCQkJc2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCwgZXJydmFsKTsN Cj4gLQkJcmV0dXJuIC0xOw0KPiAtCX0NCj4gLQ0KPiAtCS8qIElmIFJTUyBpcyBlbmFibGVkIGZv ciBib25kaW5nLCBzeW5jaHJvbml6ZSBSRVRBICovDQo+IC0JaWYgKGJvbmRlZF9ldGhfZGV2LT5k YXRhLT5kZXZfY29uZi5yeG1vZGUubXFfbW9kZSAmIFJURV9FVEhfTVFfUlhfUlNTKSB7DQo+IC0J CWludCBpOw0KPiAtCQlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzOw0KPiAtDQo+ IC0JCWludGVybmFscyA9IGJvbmRlZF9ldGhfZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4gLQ0K PiAtCQlmb3IgKGkgPSAwOyBpIDwgaW50ZXJuYWxzLT5zbGF2ZV9jb3VudDsgaSsrKSB7DQo+IC0J CQlpZiAoaW50ZXJuYWxzLT5zbGF2ZXNbaV0ucG9ydF9pZCA9PSBzbGF2ZV9ldGhfZGV2LT5kYXRh LT5wb3J0X2lkKSB7DQo+IC0JCQkJZXJydmFsID0gcnRlX2V0aF9kZXZfcnNzX3JldGFfdXBkYXRl KA0KPiAtCQkJCQkJc2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCwNCj4gLQkJCQkJCSZpbnRl cm5hbHMtPnJldGFfY29uZlswXSwNCj4gLQkJCQkJCWludGVybmFscy0+c2xhdmVzW2ldLnJldGFf c2l6ZSk7DQo+IC0JCQkJaWYgKGVycnZhbCAhPSAwKSB7DQo+IC0JCQkJCVJURV9CT05EX0xPRyhX QVJOSU5HLA0KPiAtCQkJCQkJICAgICAicnRlX2V0aF9kZXZfcnNzX3JldGFfdXBkYXRlIG9uIHNs YXZlIHBvcnQgJWQgZmFpbHMgKGVyciAlZCkuIg0KPiAtCQkJCQkJICAgICAiIFJTUyBDb25maWd1 cmF0aW9uIGZvciBib25kaW5nIG1heSBiZSBpbmNvbnNpc3RlbnQuIiwNCj4gLQkJCQkJCSAgICAg c2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCwgZXJydmFsKTsNCj4gLQkJCQl9DQo+IC0JCQkJ YnJlYWs7DQo+IC0JCQl9DQo+IC0JCX0NCj4gLQl9DQo+IC0NCj4gLQkvKiBJZiBsc2MgaW50ZXJy dXB0IGlzIHNldCwgY2hlY2sgaW5pdGlhbCBzbGF2ZSdzIGxpbmsgc3RhdHVzICovDQo+IC0JaWYg KHNsYXZlX2V0aF9kZXYtPmRhdGEtPmRldl9mbGFncyAmIFJURV9FVEhfREVWX0lOVFJfTFNDKSB7 DQo+IC0JCXNsYXZlX2V0aF9kZXYtPmRldl9vcHMtPmxpbmtfdXBkYXRlKHNsYXZlX2V0aF9kZXYs IDApOw0KPiAtCQlib25kX2V0aGRldl9sc2NfZXZlbnRfY2FsbGJhY2soc2xhdmVfZXRoX2Rldi0+ ZGF0YS0+cG9ydF9pZCwNCj4gLQkJCVJURV9FVEhfRVZFTlRfSU5UUl9MU0MsICZib25kZWRfZXRo X2Rldi0+ZGF0YS0+cG9ydF9pZCwNCj4gLQkJCU5VTEwpOw0KPiAtCX0NCj4gLQ0KPiAtCXJldHVy biAwOw0KPiAtfQ0KPiAtDQo+IC12b2lkDQo+IC1zbGF2ZV9yZW1vdmUoc3RydWN0IGJvbmRfZGV2 X3ByaXZhdGUgKmludGVybmFscywNCj4gLQkJc3RydWN0IHJ0ZV9ldGhfZGV2ICpzbGF2ZV9ldGhf ZGV2KQ0KPiAtew0KPiAtCXVpbnQxNl90IGk7DQo+IC0NCj4gLQlmb3IgKGkgPSAwOyBpIDwgaW50 ZXJuYWxzLT5zbGF2ZV9jb3VudDsgaSsrKQ0KPiAtCQlpZiAoaW50ZXJuYWxzLT5zbGF2ZXNbaV0u cG9ydF9pZCA9PQ0KPiAtCQkJCXNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQpDQo+IC0JCQli cmVhazsNCj4gLQ0KPiAtCWlmIChpIDwgKGludGVybmFscy0+c2xhdmVfY291bnQgLSAxKSkgew0K PiAtCQlzdHJ1Y3QgcnRlX2Zsb3cgKmZsb3c7DQo+IC0NCj4gLQkJbWVtbW92ZSgmaW50ZXJuYWxz LT5zbGF2ZXNbaV0sICZpbnRlcm5hbHMtPnNsYXZlc1tpICsgMV0sDQo+IC0JCQkJc2l6ZW9mKGlu dGVybmFscy0+c2xhdmVzWzBdKSAqDQo+IC0JCQkJKGludGVybmFscy0+c2xhdmVfY291bnQgLSBp IC0gMSkpOw0KPiAtCQlUQUlMUV9GT1JFQUNIKGZsb3csICZpbnRlcm5hbHMtPmZsb3dfbGlzdCwg bmV4dCkgew0KPiAtCQkJbWVtbW92ZSgmZmxvdy0+Zmxvd3NbaV0sICZmbG93LT5mbG93c1tpICsg MV0sDQo+IC0JCQkJc2l6ZW9mKGZsb3ctPmZsb3dzWzBdKSAqDQo+IC0JCQkJKGludGVybmFscy0+ c2xhdmVfY291bnQgLSBpIC0gMSkpOw0KPiAtCQkJZmxvdy0+Zmxvd3NbaW50ZXJuYWxzLT5zbGF2 ZV9jb3VudCAtIDFdID0gTlVMTDsNCj4gLQkJfQ0KPiAtCX0NCj4gLQ0KPiAtCWludGVybmFscy0+ c2xhdmVfY291bnQtLTsNCj4gLQ0KPiAtCS8qIGZvcmNlIHJlY29uZmlndXJhdGlvbiBvZiBzbGF2 ZSBpbnRlcmZhY2VzICovDQo+IC0JcnRlX2V0aF9kZXZfaW50ZXJuYWxfcmVzZXQoc2xhdmVfZXRo X2Rldik7DQo+IC19DQo+IC0NCj4gLXN0YXRpYyB2b2lkDQo+IC1ib25kX2V0aGRldl9zbGF2ZV9s aW5rX3N0YXR1c19jaGFuZ2VfbW9uaXRvcih2b2lkICpjYl9hcmcpOw0KPiAtDQo+IC12b2lkDQo+ IC1zbGF2ZV9hZGQoc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFscywNCj4gLQkJc3Ry dWN0IHJ0ZV9ldGhfZGV2ICpzbGF2ZV9ldGhfZGV2KQ0KPiAtew0KPiAtCXN0cnVjdCBib25kX3Ns YXZlX2RldGFpbHMgKnNsYXZlX2RldGFpbHMgPQ0KPiAtCQkJJmludGVybmFscy0+c2xhdmVzW2lu dGVybmFscy0+c2xhdmVfY291bnRdOw0KPiAtDQo+IC0Jc2xhdmVfZGV0YWlscy0+cG9ydF9pZCA9 IHNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQ7DQo+IC0Jc2xhdmVfZGV0YWlscy0+bGFzdF9s aW5rX3N0YXR1cyA9IDA7DQo+IC0NCj4gLQkvKiBNYXJrIHNsYXZlIGRldmljZXMgdGhhdCBkb24n dCBzdXBwb3J0IGludGVycnVwdHMgc28gd2UgY2FuDQo+IC0JICogY29tcGVuc2F0ZSB3aGVuIHdl IHN0YXJ0IHRoZSBib25kDQo+IC0JICovDQo+IC0JaWYgKCEoc2xhdmVfZXRoX2Rldi0+ZGF0YS0+ ZGV2X2ZsYWdzICYgUlRFX0VUSF9ERVZfSU5UUl9MU0MpKSB7DQo+IC0JCXNsYXZlX2RldGFpbHMt Pmxpbmtfc3RhdHVzX3BvbGxfZW5hYmxlZCA9IDE7DQo+IC0JfQ0KPiAtDQo+IC0Jc2xhdmVfZGV0 YWlscy0+bGlua19zdGF0dXNfd2FpdF90b19jb21wbGV0ZSA9IDA7DQo+IC0JLyogY2xlYW4gdGxi X2xhc3Rfb2J5dGVzIHdoZW4gYWRkaW5nIHBvcnQgZm9yIGJvbmRpbmcgZGV2aWNlICovDQo+IC0J bWVtY3B5KCYoc2xhdmVfZGV0YWlscy0+cGVyc2lzdGVkX21hY19hZGRyKSwgc2xhdmVfZXRoX2Rl di0+ZGF0YS0+bWFjX2FkZHJzLA0KPiAtCQkJc2l6ZW9mKHN0cnVjdCBydGVfZXRoZXJfYWRkcikp Ow0KPiAtfQ0KPiAtDQo+IC12b2lkDQo+IC1ib25kX2V0aGRldl9wcmltYXJ5X3NldChzdHJ1Y3Qg Ym9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzLA0KPiAtCQl1aW50MTZfdCBzbGF2ZV9wb3J0X2lk KQ0KPiAtew0KPiAtCWludCBpOw0KPiAtDQo+IC0JaWYgKGludGVybmFscy0+YWN0aXZlX3NsYXZl X2NvdW50IDwgMSkNCj4gLQkJaW50ZXJuYWxzLT5jdXJyZW50X3ByaW1hcnlfcG9ydCA9IHNsYXZl X3BvcnRfaWQ7DQo+IC0JZWxzZQ0KPiAtCQkvKiBTZWFyY2ggYm9uZGVkIGRldmljZSBzbGF2ZSBw b3J0cyBmb3IgbmV3IHByb3Bvc2VkIHByaW1hcnkgcG9ydCAqLw0KPiAtCQlmb3IgKGkgPSAwOyBp IDwgaW50ZXJuYWxzLT5hY3RpdmVfc2xhdmVfY291bnQ7IGkrKykgew0KPiAtCQkJaWYgKGludGVy bmFscy0+YWN0aXZlX3NsYXZlc1tpXSA9PSBzbGF2ZV9wb3J0X2lkKQ0KPiAtCQkJCWludGVybmFs cy0+Y3VycmVudF9wcmltYXJ5X3BvcnQgPSBzbGF2ZV9wb3J0X2lkOw0KPiAtCQl9DQo+IC19DQo+ IC0NCj4gLXN0YXRpYyBpbnQNCj4gLWJvbmRfZXRoZGV2X3Byb21pc2N1b3VzX2VuYWJsZShzdHJ1 Y3QgcnRlX2V0aF9kZXYgKmV0aF9kZXYpOw0KPiAtDQo+IC1zdGF0aWMgaW50DQo+IC1ib25kX2V0 aGRldl9zdGFydChzdHJ1Y3QgcnRlX2V0aF9kZXYgKmV0aF9kZXYpDQo+IC17DQo+IC0Jc3RydWN0 IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFsczsNCj4gLQlpbnQgaTsNCj4gLQ0KPiAtCS8qIHNs YXZlIGV0aCBkZXYgd2lsbCBiZSBzdGFydGVkIGJ5IGJvbmRlZCBkZXZpY2UgKi8NCj4gLQlpZiAo Y2hlY2tfZm9yX2JvbmRlZF9ldGhkZXYoZXRoX2RldikpIHsNCj4gLQkJUlRFX0JPTkRfTE9HKEVS UiwgIlVzZXIgdHJpZWQgdG8gZXhwbGljaXRseSBzdGFydCBhIHNsYXZlIGV0aF9kZXYgKCVkKSIs DQo+IC0JCQkJZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCk7DQo+IC0JCXJldHVybiAtMTsNCj4gLQl9 DQo+IC0NCj4gLQlldGhfZGV2LT5kYXRhLT5kZXZfbGluay5saW5rX3N0YXR1cyA9IFJURV9FVEhf TElOS19ET1dOOw0KPiAtCWV0aF9kZXYtPmRhdGEtPmRldl9zdGFydGVkID0gMTsNCj4gLQ0KPiAt CWludGVybmFscyA9IGV0aF9kZXYtPmRhdGEtPmRldl9wcml2YXRlOw0KPiAtDQo+IC0JaWYgKGlu dGVybmFscy0+c2xhdmVfY291bnQgPT0gMCkgew0KPiAtCQlSVEVfQk9ORF9MT0coRVJSLCAiQ2Fu bm90IHN0YXJ0IHBvcnQgc2luY2UgdGhlcmUgYXJlIG5vIHNsYXZlIGRldmljZXMiKTsNCj4gLQkJ Z290byBvdXRfZXJyOw0KPiAtCX0NCj4gLQ0KPiAtCWlmIChpbnRlcm5hbHMtPnVzZXJfZGVmaW5l ZF9tYWMgPT0gMCkgew0KPiAtCQlzdHJ1Y3QgcnRlX2V0aGVyX2FkZHIgKm5ld19tYWNfYWRkciA9 IE5VTEw7DQo+IC0NCj4gLQkJZm9yIChpID0gMDsgaSA8IGludGVybmFscy0+c2xhdmVfY291bnQ7 IGkrKykNCj4gLQkJCWlmIChpbnRlcm5hbHMtPnNsYXZlc1tpXS5wb3J0X2lkID09IGludGVybmFs cy0+cHJpbWFyeV9wb3J0KQ0KPiAtCQkJCW5ld19tYWNfYWRkciA9ICZpbnRlcm5hbHMtPnNsYXZl c1tpXS5wZXJzaXN0ZWRfbWFjX2FkZHI7DQo+IC0NCj4gLQkJaWYgKG5ld19tYWNfYWRkciA9PSBO VUxMKQ0KPiAtCQkJZ290byBvdXRfZXJyOw0KPiAtDQo+IC0JCWlmIChtYWNfYWRkcmVzc19zZXQo ZXRoX2RldiwgbmV3X21hY19hZGRyKSAhPSAwKSB7DQo+IC0JCQlSVEVfQk9ORF9MT0coRVJSLCAi Ym9uZGVkIHBvcnQgKCVkKSBmYWlsZWQgdG8gdXBkYXRlIE1BQyBhZGRyZXNzIiwNCj4gLQkJCQkJ ZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCk7DQo+IC0JCQlnb3RvIG91dF9lcnI7DQo+IC0JCX0NCj4g LQl9DQo+IC0NCj4gLQlpZiAoaW50ZXJuYWxzLT5tb2RlID09IEJPTkRJTkdfTU9ERV84MDIzQUQp IHsNCj4gLQkJaWYgKGludGVybmFscy0+bW9kZTQuZGVkaWNhdGVkX3F1ZXVlcy5lbmFibGVkID09 IDEpIHsNCj4gLQkJCWludGVybmFscy0+bW9kZTQuZGVkaWNhdGVkX3F1ZXVlcy5yeF9xaWQgPQ0K PiAtCQkJCQlldGhfZGV2LT5kYXRhLT5uYl9yeF9xdWV1ZXM7DQo+IC0JCQlpbnRlcm5hbHMtPm1v ZGU0LmRlZGljYXRlZF9xdWV1ZXMudHhfcWlkID0NCj4gLQkJCQkJZXRoX2Rldi0+ZGF0YS0+bmJf dHhfcXVldWVzOw0KPiAtCQl9DQo+IC0JfQ0KPiAtDQo+IC0NCj4gLQkvKiBSZWNvbmZpZ3VyZSBl YWNoIHNsYXZlIGRldmljZSBpZiBzdGFydGluZyBib25kZWQgZGV2aWNlICovDQo+IC0JZm9yIChp ID0gMDsgaSA8IGludGVybmFscy0+c2xhdmVfY291bnQ7IGkrKykgew0KPiAtCQlzdHJ1Y3QgcnRl X2V0aF9kZXYgKnNsYXZlX2V0aGRldiA9DQo+IC0JCQkJJihydGVfZXRoX2RldmljZXNbaW50ZXJu YWxzLT5zbGF2ZXNbaV0ucG9ydF9pZF0pOw0KPiAtCQlpZiAoc2xhdmVfY29uZmlndXJlKGV0aF9k ZXYsIHNsYXZlX2V0aGRldikgIT0gMCkgew0KPiAtCQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4gLQkJ CQkiYm9uZGVkIHBvcnQgKCVkKSBmYWlsZWQgdG8gcmVjb25maWd1cmUgc2xhdmUgZGV2aWNlICgl ZCkiLA0KPiAtCQkJCWV0aF9kZXYtPmRhdGEtPnBvcnRfaWQsDQo+IC0JCQkJaW50ZXJuYWxzLT5z bGF2ZXNbaV0ucG9ydF9pZCk7DQo+IC0JCQlnb3RvIG91dF9lcnI7DQo+IC0JCX0NCj4gLQkJaWYg KHNsYXZlX3N0YXJ0KGV0aF9kZXYsIHNsYXZlX2V0aGRldikgIT0gMCkgew0KPiAtCQkJUlRFX0JP TkRfTE9HKEVSUiwNCj4gLQkJCQkiYm9uZGVkIHBvcnQgKCVkKSBmYWlsZWQgdG8gc3RhcnQgc2xh dmUgZGV2aWNlICglZCkiLA0KPiAtCQkJCWV0aF9kZXYtPmRhdGEtPnBvcnRfaWQsDQo+IC0JCQkJ aW50ZXJuYWxzLT5zbGF2ZXNbaV0ucG9ydF9pZCk7DQo+IC0JCQlnb3RvIG91dF9lcnI7DQo+IC0J CX0NCj4gLQkJLyogV2Ugd2lsbCBuZWVkIHRvIHBvbGwgZm9yIGxpbmsgc3RhdHVzIGlmIGFueSBz bGF2ZSBkb2Vzbid0DQo+IC0JCSAqIHN1cHBvcnQgaW50ZXJydXB0cw0KPiAtCQkgKi8NCj4gLQkJ aWYgKGludGVybmFscy0+c2xhdmVzW2ldLmxpbmtfc3RhdHVzX3BvbGxfZW5hYmxlZCkNCj4gLQkJ CWludGVybmFscy0+bGlua19zdGF0dXNfcG9sbGluZ19lbmFibGVkID0gMTsNCj4gLQl9DQo+IC0N Cj4gLQkvKiBzdGFydCBwb2xsaW5nIGlmIG5lZWRlZCAqLw0KPiAtCWlmIChpbnRlcm5hbHMtPmxp bmtfc3RhdHVzX3BvbGxpbmdfZW5hYmxlZCkgew0KPiAtCQlydGVfZWFsX2FsYXJtX3NldCgNCj4g LQkJCWludGVybmFscy0+bGlua19zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyAqIDEwMDAsDQo+ IC0JCQlib25kX2V0aGRldl9zbGF2ZV9saW5rX3N0YXR1c19jaGFuZ2VfbW9uaXRvciwNCj4gLQkJ CSh2b2lkICopJnJ0ZV9ldGhfZGV2aWNlc1tpbnRlcm5hbHMtPnBvcnRfaWRdKTsNCj4gLQl9DQo+ IC0NCj4gLQkvKiBVcGRhdGUgYWxsIHNsYXZlIGRldmljZXMgTUFDcyovDQo+IC0JaWYgKG1hY19h ZGRyZXNzX3NsYXZlc191cGRhdGUoZXRoX2RldikgIT0gMCkNCj4gLQkJZ290byBvdXRfZXJyOw0K PiAtDQo+IC0JaWYgKGludGVybmFscy0+dXNlcl9kZWZpbmVkX3ByaW1hcnlfcG9ydCkNCj4gLQkJ Ym9uZF9ldGhkZXZfcHJpbWFyeV9zZXQoaW50ZXJuYWxzLCBpbnRlcm5hbHMtPnByaW1hcnlfcG9y dCk7DQo+IC0NCj4gLQlpZiAoaW50ZXJuYWxzLT5tb2RlID09IEJPTkRJTkdfTU9ERV84MDIzQUQp DQo+IC0JCWJvbmRfbW9kZV84MDIzYWRfc3RhcnQoZXRoX2Rldik7DQo+IC0NCj4gLQlpZiAoaW50 ZXJuYWxzLT5tb2RlID09IEJPTkRJTkdfTU9ERV9UTEIgfHwNCj4gLQkJCWludGVybmFscy0+bW9k ZSA9PSBCT05ESU5HX01PREVfQUxCKQ0KPiAtCQlib25kX3RsYl9lbmFibGUoaW50ZXJuYWxzKTsN Cj4gLQ0KPiAtCXJldHVybiAwOw0KPiAtDQo+IC1vdXRfZXJyOg0KPiAtCWV0aF9kZXYtPmRhdGEt PmRldl9zdGFydGVkID0gMDsNCj4gLQlyZXR1cm4gLTE7DQo+IC19DQo+IC0NCj4gLXN0YXRpYyB2 b2lkDQo+IC1ib25kX2V0aGRldl9mcmVlX3F1ZXVlcyhzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldikN Cj4gLXsNCj4gLQl1aW50MTZfdCBpOw0KPiAtDQo+IC0JaWYgKGRldi0+ZGF0YS0+cnhfcXVldWVz ICE9IE5VTEwpIHsNCj4gLQkJZm9yIChpID0gMDsgaSA8IGRldi0+ZGF0YS0+bmJfcnhfcXVldWVz OyBpKyspIHsNCj4gLQkJCXJ0ZV9mcmVlKGRldi0+ZGF0YS0+cnhfcXVldWVzW2ldKTsNCj4gLQkJ CWRldi0+ZGF0YS0+cnhfcXVldWVzW2ldID0gTlVMTDsNCj4gLQkJfQ0KPiAtCQlkZXYtPmRhdGEt Pm5iX3J4X3F1ZXVlcyA9IDA7DQo+IC0JfQ0KPiAtDQo+IC0JaWYgKGRldi0+ZGF0YS0+dHhfcXVl dWVzICE9IE5VTEwpIHsNCj4gLQkJZm9yIChpID0gMDsgaSA8IGRldi0+ZGF0YS0+bmJfdHhfcXVl dWVzOyBpKyspIHsNCj4gLQkJCXJ0ZV9mcmVlKGRldi0+ZGF0YS0+dHhfcXVldWVzW2ldKTsNCj4g LQkJCWRldi0+ZGF0YS0+dHhfcXVldWVzW2ldID0gTlVMTDsNCj4gLQkJfQ0KPiAtCQlkZXYtPmRh dGEtPm5iX3R4X3F1ZXVlcyA9IDA7DQo+IC0JfQ0KPiAtfQ0KPiAtDQo+IC1pbnQNCj4gLWJvbmRf ZXRoZGV2X3N0b3Aoc3RydWN0IHJ0ZV9ldGhfZGV2ICpldGhfZGV2KQ0KPiAtew0KPiAtCXN0cnVj dCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHMgPSBldGhfZGV2LT5kYXRhLT5kZXZfcHJpdmF0 ZTsNCj4gLQl1aW50MTZfdCBpOw0KPiAtCWludCByZXQ7DQo+IC0NCj4gLQlpZiAoaW50ZXJuYWxz LT5tb2RlID09IEJPTkRJTkdfTU9ERV84MDIzQUQpIHsNCj4gLQkJc3RydWN0IHBvcnQgKnBvcnQ7 DQo+IC0JCXZvaWQgKnBrdCA9IE5VTEw7DQo+IC0NCj4gLQkJYm9uZF9tb2RlXzgwMjNhZF9zdG9w KGV0aF9kZXYpOw0KPiAtDQo+IC0JCS8qIERpc2NhcmQgYWxsIG1lc3NhZ2VzIHRvL2Zyb20gbW9k ZSA0IHN0YXRlIG1hY2hpbmVzICovDQo+IC0JCWZvciAoaSA9IDA7IGkgPCBpbnRlcm5hbHMtPmFj dGl2ZV9zbGF2ZV9jb3VudDsgaSsrKSB7DQo+IC0JCQlwb3J0ID0gJmJvbmRfbW9kZV84MDIzYWRf cG9ydHNbaW50ZXJuYWxzLT5hY3RpdmVfc2xhdmVzW2ldXTsNCj4gLQ0KPiAtCQkJUlRFX0FTU0VS VChwb3J0LT5yeF9yaW5nICE9IE5VTEwpOw0KPiAtCQkJd2hpbGUgKHJ0ZV9yaW5nX2RlcXVldWUo cG9ydC0+cnhfcmluZywgJnBrdCkgIT0gLUVOT0VOVCkNCj4gLQkJCQlydGVfcGt0bWJ1Zl9mcmVl KHBrdCk7DQo+IC0NCj4gLQkJCVJURV9BU1NFUlQocG9ydC0+dHhfcmluZyAhPSBOVUxMKTsNCj4g LQkJCXdoaWxlIChydGVfcmluZ19kZXF1ZXVlKHBvcnQtPnR4X3JpbmcsICZwa3QpICE9IC1FTk9F TlQpDQo+IC0JCQkJcnRlX3BrdG1idWZfZnJlZShwa3QpOw0KPiAtCQl9DQo+IC0JfQ0KPiAtDQo+ IC0JaWYgKGludGVybmFscy0+bW9kZSA9PSBCT05ESU5HX01PREVfVExCIHx8DQo+IC0JCQlpbnRl cm5hbHMtPm1vZGUgPT0gQk9ORElOR19NT0RFX0FMQikgew0KPiAtCQlib25kX3RsYl9kaXNhYmxl KGludGVybmFscyk7DQo+IC0JCWZvciAoaSA9IDA7IGkgPCBpbnRlcm5hbHMtPmFjdGl2ZV9zbGF2 ZV9jb3VudDsgaSsrKQ0KPiAtCQkJdGxiX2xhc3Rfb2J5dGV0c1tpbnRlcm5hbHMtPmFjdGl2ZV9z bGF2ZXNbaV1dID0gMDsNCj4gLQl9DQo+IC0NCj4gLQlldGhfZGV2LT5kYXRhLT5kZXZfbGluay5s aW5rX3N0YXR1cyA9IFJURV9FVEhfTElOS19ET1dOOw0KPiAtCWV0aF9kZXYtPmRhdGEtPmRldl9z dGFydGVkID0gMDsNCj4gLQ0KPiAtCWludGVybmFscy0+bGlua19zdGF0dXNfcG9sbGluZ19lbmFi bGVkID0gMDsNCj4gLQlmb3IgKGkgPSAwOyBpIDwgaW50ZXJuYWxzLT5zbGF2ZV9jb3VudDsgaSsr KSB7DQo+IC0JCXVpbnQxNl90IHNsYXZlX2lkID0gaW50ZXJuYWxzLT5zbGF2ZXNbaV0ucG9ydF9p ZDsNCj4gLQ0KPiAtCQlpbnRlcm5hbHMtPnNsYXZlc1tpXS5sYXN0X2xpbmtfc3RhdHVzID0gMDsN Cj4gLQkJcmV0ID0gcnRlX2V0aF9kZXZfc3RvcChzbGF2ZV9pZCk7DQo+IC0JCWlmIChyZXQgIT0g MCkgew0KPiAtCQkJUlRFX0JPTkRfTE9HKEVSUiwgIkZhaWxlZCB0byBzdG9wIGRldmljZSBvbiBw b3J0ICV1IiwNCj4gLQkJCQkgICAgIHNsYXZlX2lkKTsNCj4gLQkJCXJldHVybiByZXQ7DQo+IC0J CX0NCj4gLQ0KPiAtCQkvKiBhY3RpdmUgc2xhdmVzIG5lZWQgdG8gYmUgZGVhY3RpdmF0ZWQuICov DQo+IC0JCWlmIChmaW5kX3NsYXZlX2J5X2lkKGludGVybmFscy0+YWN0aXZlX3NsYXZlcywNCj4g LQkJCQlpbnRlcm5hbHMtPmFjdGl2ZV9zbGF2ZV9jb3VudCwgc2xhdmVfaWQpICE9DQo+IC0JCQkJ CWludGVybmFscy0+YWN0aXZlX3NsYXZlX2NvdW50KQ0KPiAtCQkJZGVhY3RpdmF0ZV9zbGF2ZShl dGhfZGV2LCBzbGF2ZV9pZCk7DQo+IC0JfQ0KPiAtDQo+IC0JcmV0dXJuIDA7DQo+IC19DQo+IC0N Cj4gLWludA0KPiAtYm9uZF9ldGhkZXZfY2xvc2Uoc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYpDQo+ IC17DQo+IC0Jc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFscyA9IGRldi0+ZGF0YS0+ ZGV2X3ByaXZhdGU7DQo+IC0JdWludDE2X3QgYm9uZF9wb3J0X2lkID0gaW50ZXJuYWxzLT5wb3J0 X2lkOw0KPiAtCWludCBza2lwcGVkID0gMDsNCj4gLQlzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgZmVy cm9yOw0KPiAtDQo+IC0JaWYgKHJ0ZV9lYWxfcHJvY2Vzc190eXBlKCkgIT0gUlRFX1BST0NfUFJJ TUFSWSkNCj4gLQkJcmV0dXJuIDA7DQo+IC0NCj4gLQlSVEVfQk9ORF9MT0coSU5GTywgIkNsb3Np bmcgYm9uZGVkIGRldmljZSAlcyIsIGRldi0+ZGV2aWNlLT5uYW1lKTsNCj4gLQl3aGlsZSAoaW50 ZXJuYWxzLT5zbGF2ZV9jb3VudCAhPSBza2lwcGVkKSB7DQo+IC0JCXVpbnQxNl90IHBvcnRfaWQg PSBpbnRlcm5hbHMtPnNsYXZlc1tza2lwcGVkXS5wb3J0X2lkOw0KPiAtDQo+IC0JCWlmIChydGVf ZXRoX2Rldl9zdG9wKHBvcnRfaWQpICE9IDApIHsNCj4gLQkJCVJURV9CT05EX0xPRyhFUlIsICJG YWlsZWQgdG8gc3RvcCBkZXZpY2Ugb24gcG9ydCAldSIsDQo+IC0JCQkJICAgICBwb3J0X2lkKTsN Cj4gLQkJCXNraXBwZWQrKzsNCj4gLQkJCWNvbnRpbnVlOw0KPiAtCQl9DQo+IC0NCj4gLQkJaWYg KHJ0ZV9ldGhfYm9uZF9zbGF2ZV9yZW1vdmUoYm9uZF9wb3J0X2lkLCBwb3J0X2lkKSAhPSAwKSB7 DQo+IC0JCQlSVEVfQk9ORF9MT0coRVJSLA0KPiAtCQkJCSAgICAgIkZhaWxlZCB0byByZW1vdmUg cG9ydCAlZCBmcm9tIGJvbmRlZCBkZXZpY2UgJXMiLA0KPiAtCQkJCSAgICAgcG9ydF9pZCwgZGV2 LT5kZXZpY2UtPm5hbWUpOw0KPiAtCQkJc2tpcHBlZCsrOw0KPiAtCQl9DQo+IC0JfQ0KPiAtCWJv bmRfZmxvd19vcHMuZmx1c2goZGV2LCAmZmVycm9yKTsNCj4gLQlib25kX2V0aGRldl9mcmVlX3F1 ZXVlcyhkZXYpOw0KPiAtCXJ0ZV9iaXRtYXBfcmVzZXQoaW50ZXJuYWxzLT52bGFuX2ZpbHRlcl9i bXApOw0KPiAtCXJ0ZV9iaXRtYXBfZnJlZShpbnRlcm5hbHMtPnZsYW5fZmlsdGVyX2JtcCk7DQo+ IC0JcnRlX2ZyZWUoaW50ZXJuYWxzLT52bGFuX2ZpbHRlcl9ibXBtZW0pOw0KPiAtDQo+IC0JLyog VHJ5IHRvIHJlbGVhc2UgbWVtcG9vbCB1c2VkIGluIG1vZGU2LiBJZiB0aGUgYm9uZA0KPiAtCSAq IGRldmljZSBpcyBub3QgbW9kZTYsIGZyZWUgdGhlIE5VTEwgaXMgbm90IHByb2JsZW0uDQo+IC0J ICovDQo+IC0JcnRlX21lbXBvb2xfZnJlZShpbnRlcm5hbHMtPm1vZGU2Lm1lbXBvb2wpOw0KPiAt DQo+IC0JcnRlX2t2YXJnc19mcmVlKGludGVybmFscy0+a3ZsaXN0KTsNCj4gLQ0KPiAtCXJldHVy biAwOw0KPiAtfQ0KPiAtDQo+IC0vKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovDQo+IC1zdGF0aWMg aW50IGJvbmRfZXRoZGV2X2NvbmZpZ3VyZShzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldik7DQo+IC0N Cj4gLXN0YXRpYyBpbnQNCj4gLWJvbmRfZXRoZGV2X2luZm8oc3RydWN0IHJ0ZV9ldGhfZGV2ICpk ZXYsIHN0cnVjdCBydGVfZXRoX2Rldl9pbmZvICpkZXZfaW5mbykNCj4gLXsNCj4gLQlzdHJ1Y3Qg Ym9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4g LQlzdHJ1Y3QgYm9uZF9zbGF2ZV9kZXRhaWxzIHNsYXZlOw0KPiAtCWludCByZXQ7DQo+IC0NCj4g LQl1aW50MTZfdCBtYXhfbmJfcnhfcXVldWVzID0gVUlOVDE2X01BWDsNCj4gLQl1aW50MTZfdCBt YXhfbmJfdHhfcXVldWVzID0gVUlOVDE2X01BWDsNCj4gLQl1aW50MTZfdCBtYXhfcnhfZGVzY19s aW0gPSBVSU5UMTZfTUFYOw0KPiAtCXVpbnQxNl90IG1heF90eF9kZXNjX2xpbSA9IFVJTlQxNl9N QVg7DQo+IC0NCj4gLQlkZXZfaW5mby0+bWF4X21hY19hZGRycyA9IEJPTkRfTUFYX01BQ19BRERS UzsNCj4gLQ0KPiAtCWRldl9pbmZvLT5tYXhfcnhfcGt0bGVuID0gaW50ZXJuYWxzLT5jYW5kaWRh dGVfbWF4X3J4X3BrdGxlbiA/DQo+IC0JCQlpbnRlcm5hbHMtPmNhbmRpZGF0ZV9tYXhfcnhfcGt0 bGVuIDoNCj4gLQkJCVJURV9FVEhFUl9NQVhfSlVNQk9fRlJBTUVfTEVOOw0KPiAtDQo+IC0JLyog TWF4IG51bWJlciBvZiB0eC9yeCBxdWV1ZXMgdGhhdCB0aGUgYm9uZGVkIGRldmljZSBjYW4gc3Vw cG9ydCBpcyB0aGUNCj4gLQkgKiBtaW5pbXVtIHZhbHVlcyBvZiB0aGUgYm9uZGVkIHNsYXZlcywg YXMgYWxsIHNsYXZlcyBtdXN0IGJlIGNhcGFibGUNCj4gLQkgKiBvZiBzdXBwb3J0aW5nIHRoZSBz YW1lIG51bWJlciBvZiB0eC9yeCBxdWV1ZXMuDQo+IC0JICovDQo+IC0JaWYgKGludGVybmFscy0+ c2xhdmVfY291bnQgPiAwKSB7DQo+IC0JCXN0cnVjdCBydGVfZXRoX2Rldl9pbmZvIHNsYXZlX2lu Zm87DQo+IC0JCXVpbnQxNl90IGlkeDsNCj4gLQ0KPiAtCQlmb3IgKGlkeCA9IDA7IGlkeCA8IGlu dGVybmFscy0+c2xhdmVfY291bnQ7IGlkeCsrKSB7DQo+IC0JCQlzbGF2ZSA9IGludGVybmFscy0+ c2xhdmVzW2lkeF07DQo+IC0JCQlyZXQgPSBydGVfZXRoX2Rldl9pbmZvX2dldChzbGF2ZS5wb3J0 X2lkLCAmc2xhdmVfaW5mbyk7DQo+IC0JCQlpZiAocmV0ICE9IDApIHsNCj4gLQkJCQlSVEVfQk9O RF9MT0coRVJSLA0KPiAtCQkJCQkiJXM6IEVycm9yIGR1cmluZyBnZXR0aW5nIGRldmljZSAocG9y dCAldSkgaW5mbzogJXNcbiIsDQo+IC0JCQkJCV9fZnVuY19fLA0KPiAtCQkJCQlzbGF2ZS5wb3J0 X2lkLA0KPiAtCQkJCQlzdHJlcnJvcigtcmV0KSk7DQo+IC0NCj4gLQkJCQlyZXR1cm4gcmV0Ow0K PiAtCQkJfQ0KPiAtDQo+IC0JCQlpZiAoc2xhdmVfaW5mby5tYXhfcnhfcXVldWVzIDwgbWF4X25i X3J4X3F1ZXVlcykNCj4gLQkJCQltYXhfbmJfcnhfcXVldWVzID0gc2xhdmVfaW5mby5tYXhfcnhf cXVldWVzOw0KPiAtDQo+IC0JCQlpZiAoc2xhdmVfaW5mby5tYXhfdHhfcXVldWVzIDwgbWF4X25i X3R4X3F1ZXVlcykNCj4gLQkJCQltYXhfbmJfdHhfcXVldWVzID0gc2xhdmVfaW5mby5tYXhfdHhf cXVldWVzOw0KPiAtDQo+IC0JCQlpZiAoc2xhdmVfaW5mby5yeF9kZXNjX2xpbS5uYl9tYXggPCBt YXhfcnhfZGVzY19saW0pDQo+IC0JCQkJbWF4X3J4X2Rlc2NfbGltID0gc2xhdmVfaW5mby5yeF9k ZXNjX2xpbS5uYl9tYXg7DQo+IC0NCj4gLQkJCWlmIChzbGF2ZV9pbmZvLnR4X2Rlc2NfbGltLm5i X21heCA8IG1heF90eF9kZXNjX2xpbSkNCj4gLQkJCQltYXhfdHhfZGVzY19saW0gPSBzbGF2ZV9p bmZvLnR4X2Rlc2NfbGltLm5iX21heDsNCj4gLQkJfQ0KPiAtCX0NCj4gLQ0KPiAtCWRldl9pbmZv LT5tYXhfcnhfcXVldWVzID0gbWF4X25iX3J4X3F1ZXVlczsNCj4gLQlkZXZfaW5mby0+bWF4X3R4 X3F1ZXVlcyA9IG1heF9uYl90eF9xdWV1ZXM7DQo+IC0NCj4gLQltZW1jcHkoJmRldl9pbmZvLT5k ZWZhdWx0X3J4Y29uZiwgJmludGVybmFscy0+ZGVmYXVsdF9yeGNvbmYsDQo+IC0JICAgICAgIHNp emVvZihkZXZfaW5mby0+ZGVmYXVsdF9yeGNvbmYpKTsNCj4gLQltZW1jcHkoJmRldl9pbmZvLT5k ZWZhdWx0X3R4Y29uZiwgJmludGVybmFscy0+ZGVmYXVsdF90eGNvbmYsDQo+IC0JICAgICAgIHNp emVvZihkZXZfaW5mby0+ZGVmYXVsdF90eGNvbmYpKTsNCj4gLQ0KPiAtCWRldl9pbmZvLT5yeF9k ZXNjX2xpbS5uYl9tYXggPSBtYXhfcnhfZGVzY19saW07DQo+IC0JZGV2X2luZm8tPnR4X2Rlc2Nf bGltLm5iX21heCA9IG1heF90eF9kZXNjX2xpbTsNCj4gLQ0KPiAtCS8qKg0KPiAtCSAqIElmIGRl ZGljYXRlZCBodyBxdWV1ZXMgZW5hYmxlZCBmb3IgbGluayBib25kaW5nIGRldmljZSBpbiBMQUNQ IG1vZGUNCj4gLQkgKiB0aGVuIHdlIG5lZWQgdG8gcmVkdWNlIHRoZSBtYXhpbXVtIG51bWJlciBv ZiBkYXRhIHBhdGggcXVldWVzIGJ5IDEuDQo+IC0JICovDQo+IC0JaWYgKGludGVybmFscy0+bW9k ZSA9PSBCT05ESU5HX01PREVfODAyM0FEICYmDQo+IC0JCWludGVybmFscy0+bW9kZTQuZGVkaWNh dGVkX3F1ZXVlcy5lbmFibGVkID09IDEpIHsNCj4gLQkJZGV2X2luZm8tPm1heF9yeF9xdWV1ZXMt LTsNCj4gLQkJZGV2X2luZm8tPm1heF90eF9xdWV1ZXMtLTsNCj4gLQl9DQo+IC0NCj4gLQlkZXZf aW5mby0+bWluX3J4X2J1ZnNpemUgPSAwOw0KPiAtDQo+IC0JZGV2X2luZm8tPnJ4X29mZmxvYWRf Y2FwYSA9IGludGVybmFscy0+cnhfb2ZmbG9hZF9jYXBhOw0KPiAtCWRldl9pbmZvLT50eF9vZmZs b2FkX2NhcGEgPSBpbnRlcm5hbHMtPnR4X29mZmxvYWRfY2FwYTsNCj4gLQlkZXZfaW5mby0+cnhf cXVldWVfb2ZmbG9hZF9jYXBhID0gaW50ZXJuYWxzLT5yeF9xdWV1ZV9vZmZsb2FkX2NhcGE7DQo+ IC0JZGV2X2luZm8tPnR4X3F1ZXVlX29mZmxvYWRfY2FwYSA9IGludGVybmFscy0+dHhfcXVldWVf b2ZmbG9hZF9jYXBhOw0KPiAtCWRldl9pbmZvLT5mbG93X3R5cGVfcnNzX29mZmxvYWRzID0gaW50 ZXJuYWxzLT5mbG93X3R5cGVfcnNzX29mZmxvYWRzOw0KPiAtDQo+IC0JZGV2X2luZm8tPnJldGFf c2l6ZSA9IGludGVybmFscy0+cmV0YV9zaXplOw0KPiAtCWRldl9pbmZvLT5oYXNoX2tleV9zaXpl ID0gaW50ZXJuYWxzLT5yc3Nfa2V5X2xlbjsNCj4gLQ0KPiAtCXJldHVybiAwOw0KPiAtfQ0KPiAt DQo+IC1zdGF0aWMgaW50DQo+IC1ib25kX2V0aGRldl92bGFuX2ZpbHRlcl9zZXQoc3RydWN0IHJ0 ZV9ldGhfZGV2ICpkZXYsIHVpbnQxNl90IHZsYW5faWQsIGludCBvbikNCj4gLXsNCj4gLQlpbnQg cmVzOw0KPiAtCXVpbnQxNl90IGk7DQo+IC0Jc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVy bmFscyA9IGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+IC0NCj4gLQkvKiBkb24ndCBkbyB0aGlz IHdoaWxlIGEgc2xhdmUgaXMgYmVpbmcgYWRkZWQgKi8NCj4gLQlydGVfc3BpbmxvY2tfbG9jaygm aW50ZXJuYWxzLT5sb2NrKTsNCj4gLQ0KPiAtCWlmIChvbikNCj4gLQkJcnRlX2JpdG1hcF9zZXQo aW50ZXJuYWxzLT52bGFuX2ZpbHRlcl9ibXAsIHZsYW5faWQpOw0KPiAtCWVsc2UNCj4gLQkJcnRl X2JpdG1hcF9jbGVhcihpbnRlcm5hbHMtPnZsYW5fZmlsdGVyX2JtcCwgdmxhbl9pZCk7DQo+IC0N Cj4gLQlmb3IgKGkgPSAwOyBpIDwgaW50ZXJuYWxzLT5zbGF2ZV9jb3VudDsgaSsrKSB7DQo+IC0J CXVpbnQxNl90IHBvcnRfaWQgPSBpbnRlcm5hbHMtPnNsYXZlc1tpXS5wb3J0X2lkOw0KPiAtDQo+ IC0JCXJlcyA9IHJ0ZV9ldGhfZGV2X3ZsYW5fZmlsdGVyKHBvcnRfaWQsIHZsYW5faWQsIG9uKTsN Cj4gLQkJaWYgKHJlcyA9PSBFTk9UU1VQKQ0KPiAtCQkJUlRFX0JPTkRfTE9HKFdBUk5JTkcsDQo+ IC0JCQkJICAgICAiU2V0dGluZyBWTEFOIGZpbHRlciBvbiBzbGF2ZSBwb3J0ICV1IG5vdCBzdXBw b3J0ZWQuIiwNCj4gLQkJCQkgICAgIHBvcnRfaWQpOw0KPiAtCX0NCj4gLQ0KPiAtCXJ0ZV9zcGlu bG9ja191bmxvY2soJmludGVybmFscy0+bG9jayk7DQo+IC0JcmV0dXJuIDA7DQo+IC19DQo+IC0N Cj4gLXN0YXRpYyBpbnQNCj4gLWJvbmRfZXRoZGV2X3J4X3F1ZXVlX3NldHVwKHN0cnVjdCBydGVf ZXRoX2RldiAqZGV2LCB1aW50MTZfdCByeF9xdWV1ZV9pZCwNCj4gLQkJdWludDE2X3QgbmJfcnhf ZGVzYywgdW5zaWduZWQgaW50IHNvY2tldF9pZCBfX3J0ZV91bnVzZWQsDQo+IC0JCWNvbnN0IHN0 cnVjdCBydGVfZXRoX3J4Y29uZiAqcnhfY29uZiwgc3RydWN0IHJ0ZV9tZW1wb29sICptYl9wb29s KQ0KPiAtew0KPiAtCXN0cnVjdCBib25kX3J4X3F1ZXVlICpiZF9yeF9xID0gKHN0cnVjdCBib25k X3J4X3F1ZXVlICopDQo+IC0JCQlydGVfem1hbGxvY19zb2NrZXQoTlVMTCwgc2l6ZW9mKHN0cnVj dCBib25kX3J4X3F1ZXVlKSwNCj4gLQkJCQkJMCwgZGV2LT5kYXRhLT5udW1hX25vZGUpOw0KPiAt CWlmIChiZF9yeF9xID09IE5VTEwpDQo+IC0JCXJldHVybiAtMTsNCj4gLQ0KPiAtCWJkX3J4X3Et PnF1ZXVlX2lkID0gcnhfcXVldWVfaWQ7DQo+IC0JYmRfcnhfcS0+ZGV2X3ByaXZhdGUgPSBkZXYt PmRhdGEtPmRldl9wcml2YXRlOw0KPiAtDQo+IC0JYmRfcnhfcS0+bmJfcnhfZGVzYyA9IG5iX3J4 X2Rlc2M7DQo+IC0NCj4gLQltZW1jcHkoJihiZF9yeF9xLT5yeF9jb25mKSwgcnhfY29uZiwgc2l6 ZW9mKHN0cnVjdCBydGVfZXRoX3J4Y29uZikpOw0KPiAtCWJkX3J4X3EtPm1iX3Bvb2wgPSBtYl9w b29sOw0KPiAtDQo+IC0JZGV2LT5kYXRhLT5yeF9xdWV1ZXNbcnhfcXVldWVfaWRdID0gYmRfcnhf cTsNCj4gLQ0KPiAtCXJldHVybiAwOw0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMgaW50DQo+IC1ib25k X2V0aGRldl90eF9xdWV1ZV9zZXR1cChzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwgdWludDE2X3Qg dHhfcXVldWVfaWQsDQo+IC0JCXVpbnQxNl90IG5iX3R4X2Rlc2MsIHVuc2lnbmVkIGludCBzb2Nr ZXRfaWQgX19ydGVfdW51c2VkLA0KPiAtCQljb25zdCBzdHJ1Y3QgcnRlX2V0aF90eGNvbmYgKnR4 X2NvbmYpDQo+IC17DQo+IC0Jc3RydWN0IGJvbmRfdHhfcXVldWUgKmJkX3R4X3EgID0gKHN0cnVj dCBib25kX3R4X3F1ZXVlICopDQo+IC0JCQlydGVfem1hbGxvY19zb2NrZXQoTlVMTCwgc2l6ZW9m KHN0cnVjdCBib25kX3R4X3F1ZXVlKSwNCj4gLQkJCQkJMCwgZGV2LT5kYXRhLT5udW1hX25vZGUp Ow0KPiAtDQo+IC0JaWYgKGJkX3R4X3EgPT0gTlVMTCkNCj4gLQkJcmV0dXJuIC0xOw0KPiAtDQo+ IC0JYmRfdHhfcS0+cXVldWVfaWQgPSB0eF9xdWV1ZV9pZDsNCj4gLQliZF90eF9xLT5kZXZfcHJp dmF0ZSA9IGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+IC0NCj4gLQliZF90eF9xLT5uYl90eF9k ZXNjID0gbmJfdHhfZGVzYzsNCj4gLQltZW1jcHkoJihiZF90eF9xLT50eF9jb25mKSwgdHhfY29u Ziwgc2l6ZW9mKGJkX3R4X3EtPnR4X2NvbmYpKTsNCj4gLQ0KPiAtCWRldi0+ZGF0YS0+dHhfcXVl dWVzW3R4X3F1ZXVlX2lkXSA9IGJkX3R4X3E7DQo+IC0NCj4gLQlyZXR1cm4gMDsNCj4gLX0NCj4g LQ0KPiAtc3RhdGljIHZvaWQNCj4gLWJvbmRfZXRoZGV2X3J4X3F1ZXVlX3JlbGVhc2Uoc3RydWN0 IHJ0ZV9ldGhfZGV2ICpkZXYsIHVpbnQxNl90IHF1ZXVlX2lkKQ0KPiAtew0KPiAtCXZvaWQgKnF1 ZXVlID0gZGV2LT5kYXRhLT5yeF9xdWV1ZXNbcXVldWVfaWRdOw0KPiAtDQo+IC0JaWYgKHF1ZXVl ID09IE5VTEwpDQo+IC0JCXJldHVybjsNCj4gLQ0KPiAtCXJ0ZV9mcmVlKHF1ZXVlKTsNCj4gLX0N Cj4gLQ0KPiAtc3RhdGljIHZvaWQNCj4gLWJvbmRfZXRoZGV2X3R4X3F1ZXVlX3JlbGVhc2Uoc3Ry dWN0IHJ0ZV9ldGhfZGV2ICpkZXYsIHVpbnQxNl90IHF1ZXVlX2lkKQ0KPiAtew0KPiAtCXZvaWQg KnF1ZXVlID0gZGV2LT5kYXRhLT50eF9xdWV1ZXNbcXVldWVfaWRdOw0KPiAtDQo+IC0JaWYgKHF1 ZXVlID09IE5VTEwpDQo+IC0JCXJldHVybjsNCj4gLQ0KPiAtCXJ0ZV9mcmVlKHF1ZXVlKTsNCj4g LX0NCj4gLQ0KPiAtc3RhdGljIHZvaWQNCj4gLWJvbmRfZXRoZGV2X3NsYXZlX2xpbmtfc3RhdHVz X2NoYW5nZV9tb25pdG9yKHZvaWQgKmNiX2FyZykNCj4gLXsNCj4gLQlzdHJ1Y3QgcnRlX2V0aF9k ZXYgKmJvbmRlZF9ldGhkZXYsICpzbGF2ZV9ldGhkZXY7DQo+IC0Jc3RydWN0IGJvbmRfZGV2X3By aXZhdGUgKmludGVybmFsczsNCj4gLQ0KPiAtCS8qIERlZmF1bHQgdmFsdWUgZm9yIHBvbGxpbmcg c2xhdmUgZm91bmQgaXMgdHJ1ZSBhcyB3ZSBkb24ndCB3YW50IHRvDQo+IC0JICogZGlzYWJsZSB0 aGUgcG9sbGluZyB0aHJlYWQgaWYgd2UgY2Fubm90IGdldCB0aGUgbG9jayAqLw0KPiAtCWludCBp LCBwb2xsaW5nX3NsYXZlX2ZvdW5kID0gMTsNCj4gLQ0KPiAtCWlmIChjYl9hcmcgPT0gTlVMTCkN Cj4gLQkJcmV0dXJuOw0KPiAtDQo+IC0JYm9uZGVkX2V0aGRldiA9IGNiX2FyZzsNCj4gLQlpbnRl cm5hbHMgPSBib25kZWRfZXRoZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4gLQ0KPiAtCWlmICgh Ym9uZGVkX2V0aGRldi0+ZGF0YS0+ZGV2X3N0YXJ0ZWQgfHwNCj4gLQkJIWludGVybmFscy0+bGlu a19zdGF0dXNfcG9sbGluZ19lbmFibGVkKQ0KPiAtCQlyZXR1cm47DQo+IC0NCj4gLQkvKiBJZiBk ZXZpY2UgaXMgY3VycmVudGx5IGJlaW5nIGNvbmZpZ3VyZWQgdGhlbiBkb24ndCBjaGVjayBzbGF2 ZXMgbGluaw0KPiAtCSAqIHN0YXR1cywgd2FpdCB1bnRpbCBuZXh0IHBlcmlvZCAqLw0KPiAtCWlm IChydGVfc3BpbmxvY2tfdHJ5bG9jaygmaW50ZXJuYWxzLT5sb2NrKSkgew0KPiAtCQlpZiAoaW50 ZXJuYWxzLT5zbGF2ZV9jb3VudCA+IDApDQo+IC0JCQlwb2xsaW5nX3NsYXZlX2ZvdW5kID0gMDsN Cj4gLQ0KPiAtCQlmb3IgKGkgPSAwOyBpIDwgaW50ZXJuYWxzLT5zbGF2ZV9jb3VudDsgaSsrKSB7 DQo+IC0JCQlpZiAoIWludGVybmFscy0+c2xhdmVzW2ldLmxpbmtfc3RhdHVzX3BvbGxfZW5hYmxl ZCkNCj4gLQkJCQljb250aW51ZTsNCj4gLQ0KPiAtCQkJc2xhdmVfZXRoZGV2ID0gJnJ0ZV9ldGhf ZGV2aWNlc1tpbnRlcm5hbHMtPnNsYXZlc1tpXS5wb3J0X2lkXTsNCj4gLQkJCXBvbGxpbmdfc2xh dmVfZm91bmQgPSAxOw0KPiAtDQo+IC0JCQkvKiBVcGRhdGUgc2xhdmUgbGluayBzdGF0dXMgKi8N Cj4gLQkJCSgqc2xhdmVfZXRoZGV2LT5kZXZfb3BzLT5saW5rX3VwZGF0ZSkoc2xhdmVfZXRoZGV2 LA0KPiAtCQkJCQlpbnRlcm5hbHMtPnNsYXZlc1tpXS5saW5rX3N0YXR1c193YWl0X3RvX2NvbXBs ZXRlKTsNCj4gLQ0KPiAtCQkJLyogaWYgbGluayBzdGF0dXMgaGFzIGNoYW5nZWQgc2luY2UgbGFz dCBjaGVja2VkIHRoZW4gY2FsbCBsc2MNCj4gLQkJCSAqIGV2ZW50IGNhbGxiYWNrICovDQo+IC0J CQlpZiAoc2xhdmVfZXRoZGV2LT5kYXRhLT5kZXZfbGluay5saW5rX3N0YXR1cyAhPQ0KPiAtCQkJ CQlpbnRlcm5hbHMtPnNsYXZlc1tpXS5sYXN0X2xpbmtfc3RhdHVzKSB7DQo+IC0JCQkJaW50ZXJu YWxzLT5zbGF2ZXNbaV0ubGFzdF9saW5rX3N0YXR1cyA9DQo+IC0JCQkJCQlzbGF2ZV9ldGhkZXYt PmRhdGEtPmRldl9saW5rLmxpbmtfc3RhdHVzOw0KPiAtDQo+IC0JCQkJYm9uZF9ldGhkZXZfbHNj X2V2ZW50X2NhbGxiYWNrKGludGVybmFscy0+c2xhdmVzW2ldLnBvcnRfaWQsDQo+IC0JCQkJCQlS VEVfRVRIX0VWRU5UX0lOVFJfTFNDLA0KPiAtCQkJCQkJJmJvbmRlZF9ldGhkZXYtPmRhdGEtPnBv cnRfaWQsDQo+IC0JCQkJCQlOVUxMKTsNCj4gLQkJCX0NCj4gLQkJfQ0KPiAtCQlydGVfc3Bpbmxv Y2tfdW5sb2NrKCZpbnRlcm5hbHMtPmxvY2spOw0KPiAtCX0NCj4gLQ0KPiAtCWlmIChwb2xsaW5n X3NsYXZlX2ZvdW5kKQ0KPiAtCQkvKiBTZXQgYWxhcm0gdG8gY29udGludWUgbW9uaXRvcmluZyBs aW5rIHN0YXR1cyBvZiBzbGF2ZSBldGhkZXYncyAqLw0KPiAtCQlydGVfZWFsX2FsYXJtX3NldChp bnRlcm5hbHMtPmxpbmtfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMgKiAxMDAwLA0KPiAtCQkJ CWJvbmRfZXRoZGV2X3NsYXZlX2xpbmtfc3RhdHVzX2NoYW5nZV9tb25pdG9yLCBjYl9hcmcpOw0K PiAtfQ0KPiAtDQo+IC1zdGF0aWMgaW50DQo+IC1ib25kX2V0aGRldl9saW5rX3VwZGF0ZShzdHJ1 Y3QgcnRlX2V0aF9kZXYgKmV0aGRldiwgaW50IHdhaXRfdG9fY29tcGxldGUpDQo+IC17DQo+IC0J aW50ICgqbGlua191cGRhdGUpKHVpbnQxNl90IHBvcnRfaWQsIHN0cnVjdCBydGVfZXRoX2xpbmsg KmV0aF9saW5rKTsNCj4gLQ0KPiAtCXN0cnVjdCBib25kX2Rldl9wcml2YXRlICpib25kX2N0eDsN Cj4gLQlzdHJ1Y3QgcnRlX2V0aF9saW5rIHNsYXZlX2xpbms7DQo+IC0NCj4gLQlib29sIG9uZV9s aW5rX3VwZGF0ZV9zdWNjZWVkZWQ7DQo+IC0JdWludDMyX3QgaWR4Ow0KPiAtCWludCByZXQ7DQo+ IC0NCj4gLQlib25kX2N0eCA9IGV0aGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+IC0NCj4gLQll dGhkZXYtPmRhdGEtPmRldl9saW5rLmxpbmtfc3BlZWQgPSBSVEVfRVRIX1NQRUVEX05VTV9OT05F Ow0KPiAtDQo+IC0JaWYgKGV0aGRldi0+ZGF0YS0+ZGV2X3N0YXJ0ZWQgPT0gMCB8fA0KPiAtCQkJ Ym9uZF9jdHgtPmFjdGl2ZV9zbGF2ZV9jb3VudCA9PSAwKSB7DQo+IC0JCWV0aGRldi0+ZGF0YS0+ ZGV2X2xpbmsubGlua19zdGF0dXMgPSBSVEVfRVRIX0xJTktfRE9XTjsNCj4gLQkJcmV0dXJuIDA7 DQo+IC0JfQ0KPiAtDQo+IC0JZXRoZGV2LT5kYXRhLT5kZXZfbGluay5saW5rX3N0YXR1cyA9IFJU RV9FVEhfTElOS19VUDsNCj4gLQ0KPiAtCWlmICh3YWl0X3RvX2NvbXBsZXRlKQ0KPiAtCQlsaW5r X3VwZGF0ZSA9IHJ0ZV9ldGhfbGlua19nZXQ7DQo+IC0JZWxzZQ0KPiAtCQlsaW5rX3VwZGF0ZSA9 IHJ0ZV9ldGhfbGlua19nZXRfbm93YWl0Ow0KPiAtDQo+IC0Jc3dpdGNoIChib25kX2N0eC0+bW9k ZSkgew0KPiAtCWNhc2UgQk9ORElOR19NT0RFX0JST0FEQ0FTVDoNCj4gLQkJLyoqDQo+IC0JCSAq IFNldHRpbmcgbGluayBzcGVlZCB0byBVSU5UMzJfTUFYIHRvIGVuc3VyZSB3ZSBwaWNrIHVwIHRo ZQ0KPiAtCQkgKiB2YWx1ZSBvZiB0aGUgZmlyc3QgYWN0aXZlIHNsYXZlDQo+IC0JCSAqLw0KPiAt CQlldGhkZXYtPmRhdGEtPmRldl9saW5rLmxpbmtfc3BlZWQgPSBVSU5UMzJfTUFYOw0KPiAtDQo+ IC0JCS8qKg0KPiAtCQkgKiBsaW5rIHNwZWVkIGlzIG1pbmltdW0gdmFsdWUgb2YgYWxsIHRoZSBz bGF2ZXMgbGluayBzcGVlZCBhcw0KPiAtCQkgKiBwYWNrZXQgbG9zcyB3aWxsIG9jY3VyIG9uIHRo aXMgc2xhdmUgaWYgdHJhbnNtaXNzaW9uIGF0IHJhdGVzDQo+IC0JCSAqIGdyZWF0ZXIgdGhhbiB0 aGlzIGFyZSBhdHRlbXB0ZWQNCj4gLQkJICovDQo+IC0JCWZvciAoaWR4ID0gMDsgaWR4IDwgYm9u ZF9jdHgtPmFjdGl2ZV9zbGF2ZV9jb3VudDsgaWR4KyspIHsNCj4gLQkJCXJldCA9IGxpbmtfdXBk YXRlKGJvbmRfY3R4LT5hY3RpdmVfc2xhdmVzW2lkeF0sDQo+IC0JCQkJCSAgJnNsYXZlX2xpbmsp Ow0KPiAtCQkJaWYgKHJldCA8IDApIHsNCj4gLQkJCQlldGhkZXYtPmRhdGEtPmRldl9saW5rLmxp bmtfc3BlZWQgPQ0KPiAtCQkJCQlSVEVfRVRIX1NQRUVEX05VTV9OT05FOw0KPiAtCQkJCVJURV9C T05EX0xPRyhFUlIsDQo+IC0JCQkJCSJTbGF2ZSAocG9ydCAldSkgbGluayBnZXQgZmFpbGVkOiAl cyIsDQo+IC0JCQkJCWJvbmRfY3R4LT5hY3RpdmVfc2xhdmVzW2lkeF0sDQo+IC0JCQkJCXJ0ZV9z dHJlcnJvcigtcmV0KSk7DQo+IC0JCQkJcmV0dXJuIDA7DQo+IC0JCQl9DQo+IC0NCj4gLQkJCWlm IChzbGF2ZV9saW5rLmxpbmtfc3BlZWQgPA0KPiAtCQkJCQlldGhkZXYtPmRhdGEtPmRldl9saW5r Lmxpbmtfc3BlZWQpDQo+IC0JCQkJZXRoZGV2LT5kYXRhLT5kZXZfbGluay5saW5rX3NwZWVkID0N Cj4gLQkJCQkJCXNsYXZlX2xpbmsubGlua19zcGVlZDsNCj4gLQkJfQ0KPiAtCQlicmVhazsNCj4g LQljYXNlIEJPTkRJTkdfTU9ERV9BQ1RJVkVfQkFDS1VQOg0KPiAtCQkvKiBDdXJyZW50IHByaW1h cnkgc2xhdmUgKi8NCj4gLQkJcmV0ID0gbGlua191cGRhdGUoYm9uZF9jdHgtPmN1cnJlbnRfcHJp bWFyeV9wb3J0LCAmc2xhdmVfbGluayk7DQo+IC0JCWlmIChyZXQgPCAwKSB7DQo+IC0JCQlSVEVf Qk9ORF9MT0coRVJSLCAiU2xhdmUgKHBvcnQgJXUpIGxpbmsgZ2V0IGZhaWxlZDogJXMiLA0KPiAt CQkJCWJvbmRfY3R4LT5jdXJyZW50X3ByaW1hcnlfcG9ydCwNCj4gLQkJCQlydGVfc3RyZXJyb3Io LXJldCkpOw0KPiAtCQkJcmV0dXJuIDA7DQo+IC0JCX0NCj4gLQ0KPiAtCQlldGhkZXYtPmRhdGEt PmRldl9saW5rLmxpbmtfc3BlZWQgPSBzbGF2ZV9saW5rLmxpbmtfc3BlZWQ7DQo+IC0JCWJyZWFr Ow0KPiAtCWNhc2UgQk9ORElOR19NT0RFXzgwMjNBRDoNCj4gLQkJZXRoZGV2LT5kYXRhLT5kZXZf bGluay5saW5rX2F1dG9uZWcgPQ0KPiAtCQkJCWJvbmRfY3R4LT5tb2RlNC5zbGF2ZV9saW5rLmxp bmtfYXV0b25lZzsNCj4gLQkJZXRoZGV2LT5kYXRhLT5kZXZfbGluay5saW5rX2R1cGxleCA9DQo+ IC0JCQkJYm9uZF9jdHgtPm1vZGU0LnNsYXZlX2xpbmsubGlua19kdXBsZXg7DQo+IC0JCS8qIGZh bGwgdGhyb3VnaCAqLw0KPiAtCQkvKiB0byB1cGRhdGUgbGluayBzcGVlZCAqLw0KPiAtCWNhc2Ug Qk9ORElOR19NT0RFX1JPVU5EX1JPQklOOg0KPiAtCWNhc2UgQk9ORElOR19NT0RFX0JBTEFOQ0U6 DQo+IC0JY2FzZSBCT05ESU5HX01PREVfVExCOg0KPiAtCWNhc2UgQk9ORElOR19NT0RFX0FMQjoN Cj4gLQlkZWZhdWx0Og0KPiAtCQkvKioNCj4gLQkJICogSW4gdGhlc2VzIG1vZGUgdGhlIG1heGlt dW0gdGhlb3JldGljYWwgbGluayBzcGVlZCBpcyB0aGUgc3VtDQo+IC0JCSAqIG9mIGFsbCB0aGUg c2xhdmVzDQo+IC0JCSAqLw0KPiAtCQlldGhkZXYtPmRhdGEtPmRldl9saW5rLmxpbmtfc3BlZWQg PSBSVEVfRVRIX1NQRUVEX05VTV9OT05FOw0KPiAtCQlvbmVfbGlua191cGRhdGVfc3VjY2VlZGVk ID0gZmFsc2U7DQo+IC0NCj4gLQkJZm9yIChpZHggPSAwOyBpZHggPCBib25kX2N0eC0+YWN0aXZl X3NsYXZlX2NvdW50OyBpZHgrKykgew0KPiAtCQkJcmV0ID0gbGlua191cGRhdGUoYm9uZF9jdHgt PmFjdGl2ZV9zbGF2ZXNbaWR4XSwNCj4gLQkJCQkJJnNsYXZlX2xpbmspOw0KPiAtCQkJaWYgKHJl dCA8IDApIHsNCj4gLQkJCQlSVEVfQk9ORF9MT0coRVJSLA0KPiAtCQkJCQkiU2xhdmUgKHBvcnQg JXUpIGxpbmsgZ2V0IGZhaWxlZDogJXMiLA0KPiAtCQkJCQlib25kX2N0eC0+YWN0aXZlX3NsYXZl c1tpZHhdLA0KPiAtCQkJCQlydGVfc3RyZXJyb3IoLXJldCkpOw0KPiAtCQkJCWNvbnRpbnVlOw0K PiAtCQkJfQ0KPiAtDQo+IC0JCQlvbmVfbGlua191cGRhdGVfc3VjY2VlZGVkID0gdHJ1ZTsNCj4g LQkJCWV0aGRldi0+ZGF0YS0+ZGV2X2xpbmsubGlua19zcGVlZCArPQ0KPiAtCQkJCQlzbGF2ZV9s aW5rLmxpbmtfc3BlZWQ7DQo+IC0JCX0NCj4gLQ0KPiAtCQlpZiAoIW9uZV9saW5rX3VwZGF0ZV9z dWNjZWVkZWQpIHsNCj4gLQkJCVJURV9CT05EX0xPRyhFUlIsICJBbGwgc2xhdmVzIGxpbmsgZ2V0 IGZhaWxlZCIpOw0KPiAtCQkJcmV0dXJuIDA7DQo+IC0JCX0NCj4gLQl9DQo+IC0NCj4gLQ0KPiAt CXJldHVybiAwOw0KPiAtfQ0KPiAtDQo+IC0NCj4gLXN0YXRpYyBpbnQNCj4gLWJvbmRfZXRoZGV2 X3N0YXRzX2dldChzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwgc3RydWN0IHJ0ZV9ldGhfc3RhdHMg KnN0YXRzKQ0KPiAtew0KPiAtCXN0cnVjdCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHMgPSBk ZXYtPmRhdGEtPmRldl9wcml2YXRlOw0KPiAtCXN0cnVjdCBydGVfZXRoX3N0YXRzIHNsYXZlX3N0 YXRzOw0KPiAtCWludCBpLCBqOw0KPiAtDQo+IC0JZm9yIChpID0gMDsgaSA8IGludGVybmFscy0+ c2xhdmVfY291bnQ7IGkrKykgew0KPiAtCQlydGVfZXRoX3N0YXRzX2dldChpbnRlcm5hbHMtPnNs YXZlc1tpXS5wb3J0X2lkLCAmc2xhdmVfc3RhdHMpOw0KPiAtDQo+IC0JCXN0YXRzLT5pcGFja2V0 cyArPSBzbGF2ZV9zdGF0cy5pcGFja2V0czsNCj4gLQkJc3RhdHMtPm9wYWNrZXRzICs9IHNsYXZl X3N0YXRzLm9wYWNrZXRzOw0KPiAtCQlzdGF0cy0+aWJ5dGVzICs9IHNsYXZlX3N0YXRzLmlieXRl czsNCj4gLQkJc3RhdHMtPm9ieXRlcyArPSBzbGF2ZV9zdGF0cy5vYnl0ZXM7DQo+IC0JCXN0YXRz LT5pbWlzc2VkICs9IHNsYXZlX3N0YXRzLmltaXNzZWQ7DQo+IC0JCXN0YXRzLT5pZXJyb3JzICs9 IHNsYXZlX3N0YXRzLmllcnJvcnM7DQo+IC0JCXN0YXRzLT5vZXJyb3JzICs9IHNsYXZlX3N0YXRz Lm9lcnJvcnM7DQo+IC0JCXN0YXRzLT5yeF9ub21idWYgKz0gc2xhdmVfc3RhdHMucnhfbm9tYnVm Ow0KPiAtDQo+IC0JCWZvciAoaiA9IDA7IGogPCBSVEVfRVRIREVWX1FVRVVFX1NUQVRfQ05UUlM7 IGorKykgew0KPiAtCQkJc3RhdHMtPnFfaXBhY2tldHNbal0gKz0gc2xhdmVfc3RhdHMucV9pcGFj a2V0c1tqXTsNCj4gLQkJCXN0YXRzLT5xX29wYWNrZXRzW2pdICs9IHNsYXZlX3N0YXRzLnFfb3Bh Y2tldHNbal07DQo+IC0JCQlzdGF0cy0+cV9pYnl0ZXNbal0gKz0gc2xhdmVfc3RhdHMucV9pYnl0 ZXNbal07DQo+IC0JCQlzdGF0cy0+cV9vYnl0ZXNbal0gKz0gc2xhdmVfc3RhdHMucV9vYnl0ZXNb al07DQo+IC0JCQlzdGF0cy0+cV9lcnJvcnNbal0gKz0gc2xhdmVfc3RhdHMucV9lcnJvcnNbal07 DQo+IC0JCX0NCj4gLQ0KPiAtCX0NCj4gLQ0KPiAtCXJldHVybiAwOw0KPiAtfQ0KPiAtDQo+IC1z dGF0aWMgaW50DQo+IC1ib25kX2V0aGRldl9zdGF0c19yZXNldChzdHJ1Y3QgcnRlX2V0aF9kZXYg KmRldikNCj4gLXsNCj4gLQlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzID0gZGV2 LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4gLQlpbnQgaTsNCj4gLQlpbnQgZXJyOw0KPiAtCWludCBy ZXQ7DQo+IC0NCj4gLQlmb3IgKGkgPSAwLCBlcnIgPSAwOyBpIDwgaW50ZXJuYWxzLT5zbGF2ZV9j b3VudDsgaSsrKSB7DQo+IC0JCXJldCA9IHJ0ZV9ldGhfc3RhdHNfcmVzZXQoaW50ZXJuYWxzLT5z bGF2ZXNbaV0ucG9ydF9pZCk7DQo+IC0JCWlmIChyZXQgIT0gMCkNCj4gLQkJCWVyciA9IHJldDsN Cj4gLQl9DQo+IC0NCj4gLQlyZXR1cm4gZXJyOw0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMgaW50DQo+ IC1ib25kX2V0aGRldl9wcm9taXNjdW91c19lbmFibGUoc3RydWN0IHJ0ZV9ldGhfZGV2ICpldGhf ZGV2KQ0KPiAtew0KPiAtCXN0cnVjdCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHMgPSBldGhf ZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4gLQlpbnQgaTsNCj4gLQlpbnQgcmV0ID0gMDsNCj4g LQl1aW50MTZfdCBwb3J0X2lkOw0KPiAtDQo+IC0Jc3dpdGNoIChpbnRlcm5hbHMtPm1vZGUpIHsN Cj4gLQkvKiBQcm9taXNjdW91cyBtb2RlIGlzIHByb3BhZ2F0ZWQgdG8gYWxsIHNsYXZlcyAqLw0K PiAtCWNhc2UgQk9ORElOR19NT0RFX1JPVU5EX1JPQklOOg0KPiAtCWNhc2UgQk9ORElOR19NT0RF X0JBTEFOQ0U6DQo+IC0JY2FzZSBCT05ESU5HX01PREVfQlJPQURDQVNUOg0KPiAtCWNhc2UgQk9O RElOR19NT0RFXzgwMjNBRDogew0KPiAtCQl1bnNpZ25lZCBpbnQgc2xhdmVfb2sgPSAwOw0KPiAt DQo+IC0JCWZvciAoaSA9IDA7IGkgPCBpbnRlcm5hbHMtPnNsYXZlX2NvdW50OyBpKyspIHsNCj4g LQkJCXBvcnRfaWQgPSBpbnRlcm5hbHMtPnNsYXZlc1tpXS5wb3J0X2lkOw0KPiAtDQo+IC0JCQly ZXQgPSBydGVfZXRoX3Byb21pc2N1b3VzX2VuYWJsZShwb3J0X2lkKTsNCj4gLQkJCWlmIChyZXQg IT0gMCkNCj4gLQkJCQlSVEVfQk9ORF9MT0coRVJSLA0KPiAtCQkJCQkiRmFpbGVkIHRvIGVuYWJs ZSBwcm9taXNjdW91cyBtb2RlIGZvciBwb3J0ICV1OiAlcyIsDQo+IC0JCQkJCXBvcnRfaWQsIHJ0 ZV9zdHJlcnJvcigtcmV0KSk7DQo+IC0JCQllbHNlDQo+IC0JCQkJc2xhdmVfb2srKzsNCj4gLQkJ fQ0KPiAtCQkvKg0KPiAtCQkgKiBSZXBvcnQgc3VjY2VzcyBpZiBvcGVyYXRpb24gaXMgc3VjY2Vz c2Z1bCBvbiBhdCBsZWFzdA0KPiAtCQkgKiBvbiBvbmUgc2xhdmUuIE90aGVyd2lzZSByZXR1cm4g bGFzdCBlcnJvciBjb2RlLg0KPiAtCQkgKi8NCj4gLQkJaWYgKHNsYXZlX29rID4gMCkNCj4gLQkJ CXJldCA9IDA7DQo+IC0JCWJyZWFrOw0KPiAtCX0NCj4gLQkvKiBQcm9taXNjdW91cyBtb2RlIGlz IHByb3BhZ2F0ZWQgb25seSB0byBwcmltYXJ5IHNsYXZlICovDQo+IC0JY2FzZSBCT05ESU5HX01P REVfQUNUSVZFX0JBQ0tVUDoNCj4gLQljYXNlIEJPTkRJTkdfTU9ERV9UTEI6DQo+IC0JY2FzZSBC T05ESU5HX01PREVfQUxCOg0KPiAtCWRlZmF1bHQ6DQo+IC0JCS8qIERvIG5vdCB0b3VjaCBwcm9t aXNjIHdoZW4gdGhlcmUgY2Fubm90IGJlIHByaW1hcnkgcG9ydHMgKi8NCj4gLQkJaWYgKGludGVy bmFscy0+c2xhdmVfY291bnQgPT0gMCkNCj4gLQkJCWJyZWFrOw0KPiAtCQlwb3J0X2lkID0gaW50 ZXJuYWxzLT5jdXJyZW50X3ByaW1hcnlfcG9ydDsNCj4gLQkJcmV0ID0gcnRlX2V0aF9wcm9taXNj dW91c19lbmFibGUocG9ydF9pZCk7DQo+IC0JCWlmIChyZXQgIT0gMCkNCj4gLQkJCVJURV9CT05E X0xPRyhFUlIsDQo+IC0JCQkJIkZhaWxlZCB0byBlbmFibGUgcHJvbWlzY3VvdXMgbW9kZSBmb3Ig cG9ydCAldTogJXMiLA0KPiAtCQkJCXBvcnRfaWQsIHJ0ZV9zdHJlcnJvcigtcmV0KSk7DQo+IC0J fQ0KPiAtDQo+IC0JcmV0dXJuIHJldDsNCj4gLX0NCj4gLQ0KPiAtc3RhdGljIGludA0KPiAtYm9u ZF9ldGhkZXZfcHJvbWlzY3VvdXNfZGlzYWJsZShzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldikNCj4g LXsNCj4gLQlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzID0gZGV2LT5kYXRhLT5k ZXZfcHJpdmF0ZTsNCj4gLQlpbnQgaTsNCj4gLQlpbnQgcmV0ID0gMDsNCj4gLQl1aW50MTZfdCBw b3J0X2lkOw0KPiAtDQo+IC0Jc3dpdGNoIChpbnRlcm5hbHMtPm1vZGUpIHsNCj4gLQkvKiBQcm9t aXNjdW91cyBtb2RlIGlzIHByb3BhZ2F0ZWQgdG8gYWxsIHNsYXZlcyAqLw0KPiAtCWNhc2UgQk9O RElOR19NT0RFX1JPVU5EX1JPQklOOg0KPiAtCWNhc2UgQk9ORElOR19NT0RFX0JBTEFOQ0U6DQo+ IC0JY2FzZSBCT05ESU5HX01PREVfQlJPQURDQVNUOg0KPiAtCWNhc2UgQk9ORElOR19NT0RFXzgw MjNBRDogew0KPiAtCQl1bnNpZ25lZCBpbnQgc2xhdmVfb2sgPSAwOw0KPiAtDQo+IC0JCWZvciAo aSA9IDA7IGkgPCBpbnRlcm5hbHMtPnNsYXZlX2NvdW50OyBpKyspIHsNCj4gLQkJCXBvcnRfaWQg PSBpbnRlcm5hbHMtPnNsYXZlc1tpXS5wb3J0X2lkOw0KPiAtDQo+IC0JCQlpZiAoaW50ZXJuYWxz LT5tb2RlID09IEJPTkRJTkdfTU9ERV84MDIzQUQgJiYNCj4gLQkJCSAgICBib25kX21vZGVfODAy M2FkX3BvcnRzW3BvcnRfaWRdLmZvcmNlZF9yeF9mbGFncyA9PQ0KPiAtCQkJCQlCT05EXzgwMjNB RF9GT1JDRURfUFJPTUlTQykgew0KPiAtCQkJCXNsYXZlX29rKys7DQo+IC0JCQkJY29udGludWU7 DQo+IC0JCQl9DQo+IC0JCQlyZXQgPSBydGVfZXRoX3Byb21pc2N1b3VzX2Rpc2FibGUocG9ydF9p ZCk7DQo+IC0JCQlpZiAocmV0ICE9IDApDQo+IC0JCQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4gLQkJ CQkJIkZhaWxlZCB0byBkaXNhYmxlIHByb21pc2N1b3VzIG1vZGUgZm9yIHBvcnQgJXU6ICVzIiwN Cj4gLQkJCQkJcG9ydF9pZCwgcnRlX3N0cmVycm9yKC1yZXQpKTsNCj4gLQkJCWVsc2UNCj4gLQkJ CQlzbGF2ZV9vaysrOw0KPiAtCQl9DQo+IC0JCS8qDQo+IC0JCSAqIFJlcG9ydCBzdWNjZXNzIGlm IG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsIG9uIGF0IGxlYXN0DQo+IC0JCSAqIG9uIG9uZSBzbGF2 ZS4gT3RoZXJ3aXNlIHJldHVybiBsYXN0IGVycm9yIGNvZGUuDQo+IC0JCSAqLw0KPiAtCQlpZiAo c2xhdmVfb2sgPiAwKQ0KPiAtCQkJcmV0ID0gMDsNCj4gLQkJYnJlYWs7DQo+IC0JfQ0KPiAtCS8q IFByb21pc2N1b3VzIG1vZGUgaXMgcHJvcGFnYXRlZCBvbmx5IHRvIHByaW1hcnkgc2xhdmUgKi8N Cj4gLQljYXNlIEJPTkRJTkdfTU9ERV9BQ1RJVkVfQkFDS1VQOg0KPiAtCWNhc2UgQk9ORElOR19N T0RFX1RMQjoNCj4gLQljYXNlIEJPTkRJTkdfTU9ERV9BTEI6DQo+IC0JZGVmYXVsdDoNCj4gLQkJ LyogRG8gbm90IHRvdWNoIHByb21pc2Mgd2hlbiB0aGVyZSBjYW5ub3QgYmUgcHJpbWFyeSBwb3J0 cyAqLw0KPiAtCQlpZiAoaW50ZXJuYWxzLT5zbGF2ZV9jb3VudCA9PSAwKQ0KPiAtCQkJYnJlYWs7 DQo+IC0JCXBvcnRfaWQgPSBpbnRlcm5hbHMtPmN1cnJlbnRfcHJpbWFyeV9wb3J0Ow0KPiAtCQly ZXQgPSBydGVfZXRoX3Byb21pc2N1b3VzX2Rpc2FibGUocG9ydF9pZCk7DQo+IC0JCWlmIChyZXQg IT0gMCkNCj4gLQkJCVJURV9CT05EX0xPRyhFUlIsDQo+IC0JCQkJIkZhaWxlZCB0byBkaXNhYmxl IHByb21pc2N1b3VzIG1vZGUgZm9yIHBvcnQgJXU6ICVzIiwNCj4gLQkJCQlwb3J0X2lkLCBydGVf c3RyZXJyb3IoLXJldCkpOw0KPiAtCX0NCj4gLQ0KPiAtCXJldHVybiByZXQ7DQo+IC19DQo+IC0N Cj4gLXN0YXRpYyBpbnQNCj4gLWJvbmRfZXRoZGV2X3Byb21pc2N1b3VzX3VwZGF0ZShzdHJ1Y3Qg cnRlX2V0aF9kZXYgKmRldikNCj4gLXsNCj4gLQlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50 ZXJuYWxzID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4gLQl1aW50MTZfdCBwb3J0X2lkID0g aW50ZXJuYWxzLT5jdXJyZW50X3ByaW1hcnlfcG9ydDsNCj4gLQ0KPiAtCXN3aXRjaCAoaW50ZXJu YWxzLT5tb2RlKSB7DQo+IC0JY2FzZSBCT05ESU5HX01PREVfUk9VTkRfUk9CSU46DQo+IC0JY2Fz ZSBCT05ESU5HX01PREVfQkFMQU5DRToNCj4gLQljYXNlIEJPTkRJTkdfTU9ERV9CUk9BRENBU1Q6 DQo+IC0JY2FzZSBCT05ESU5HX01PREVfODAyM0FEOg0KPiAtCQkvKiBBcyBwcm9taXNjdW91cyBt b2RlIGlzIHByb3BhZ2F0ZWQgdG8gYWxsIHNsYXZlcyBmb3IgdGhlc2UNCj4gLQkJICogbW9kZSwg bm8gbmVlZCB0byB1cGRhdGUgZm9yIGJvbmRpbmcgZGV2aWNlLg0KPiAtCQkgKi8NCj4gLQkJYnJl YWs7DQo+IC0JY2FzZSBCT05ESU5HX01PREVfQUNUSVZFX0JBQ0tVUDoNCj4gLQljYXNlIEJPTkRJ TkdfTU9ERV9UTEI6DQo+IC0JY2FzZSBCT05ESU5HX01PREVfQUxCOg0KPiAtCWRlZmF1bHQ6DQo+ IC0JCS8qIEFzIHByb21pc2N1b3VzIG1vZGUgaXMgcHJvcGFnYXRlZCBvbmx5IHRvIHByaW1hcnkg c2xhdmUNCj4gLQkJICogZm9yIHRoZXNlIG1vZGUuIFdoZW4gYWN0aXZlL3N0YW5kYnkgc3dpdGNo b3ZlciwgcHJvbWlzY3VvdXMNCj4gLQkJICogbW9kZSBzaG91bGQgYmUgc2V0IHRvIG5ldyBwcmlt YXJ5IHNsYXZlIGFjY29yZGluZyB0byBib25kaW5nDQo+IC0JCSAqIGRldmljZS4NCj4gLQkJICov DQo+IC0JCWlmIChydGVfZXRoX3Byb21pc2N1b3VzX2dldChpbnRlcm5hbHMtPnBvcnRfaWQpID09 IDEpDQo+IC0JCQlydGVfZXRoX3Byb21pc2N1b3VzX2VuYWJsZShwb3J0X2lkKTsNCj4gLQkJZWxz ZQ0KPiAtCQkJcnRlX2V0aF9wcm9taXNjdW91c19kaXNhYmxlKHBvcnRfaWQpOw0KPiAtCX0NCj4g LQ0KPiAtCXJldHVybiAwOw0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMgaW50DQo+IC1ib25kX2V0aGRl dl9hbGxtdWx0aWNhc3RfZW5hYmxlKHN0cnVjdCBydGVfZXRoX2RldiAqZXRoX2RldikNCj4gLXsN Cj4gLQlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzID0gZXRoX2Rldi0+ZGF0YS0+ ZGV2X3ByaXZhdGU7DQo+IC0JaW50IGk7DQo+IC0JaW50IHJldCA9IDA7DQo+IC0JdWludDE2X3Qg cG9ydF9pZDsNCj4gLQ0KPiAtCXN3aXRjaCAoaW50ZXJuYWxzLT5tb2RlKSB7DQo+IC0JLyogYWxs bXVsdGkgbW9kZSBpcyBwcm9wYWdhdGVkIHRvIGFsbCBzbGF2ZXMgKi8NCj4gLQljYXNlIEJPTkRJ TkdfTU9ERV9ST1VORF9ST0JJTjoNCj4gLQljYXNlIEJPTkRJTkdfTU9ERV9CQUxBTkNFOg0KPiAt CWNhc2UgQk9ORElOR19NT0RFX0JST0FEQ0FTVDoNCj4gLQljYXNlIEJPTkRJTkdfTU9ERV84MDIz QUQ6IHsNCj4gLQkJdW5zaWduZWQgaW50IHNsYXZlX29rID0gMDsNCj4gLQ0KPiAtCQlmb3IgKGkg PSAwOyBpIDwgaW50ZXJuYWxzLT5zbGF2ZV9jb3VudDsgaSsrKSB7DQo+IC0JCQlwb3J0X2lkID0g aW50ZXJuYWxzLT5zbGF2ZXNbaV0ucG9ydF9pZDsNCj4gLQ0KPiAtCQkJcmV0ID0gcnRlX2V0aF9h bGxtdWx0aWNhc3RfZW5hYmxlKHBvcnRfaWQpOw0KPiAtCQkJaWYgKHJldCAhPSAwKQ0KPiAtCQkJ CVJURV9CT05EX0xPRyhFUlIsDQo+IC0JCQkJCSJGYWlsZWQgdG8gZW5hYmxlIGFsbG11bHRpIG1v ZGUgZm9yIHBvcnQgJXU6ICVzIiwNCj4gLQkJCQkJcG9ydF9pZCwgcnRlX3N0cmVycm9yKC1yZXQp KTsNCj4gLQkJCWVsc2UNCj4gLQkJCQlzbGF2ZV9vaysrOw0KPiAtCQl9DQo+IC0JCS8qDQo+IC0J CSAqIFJlcG9ydCBzdWNjZXNzIGlmIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsIG9uIGF0IGxlYXN0 DQo+IC0JCSAqIG9uIG9uZSBzbGF2ZS4gT3RoZXJ3aXNlIHJldHVybiBsYXN0IGVycm9yIGNvZGUu DQo+IC0JCSAqLw0KPiAtCQlpZiAoc2xhdmVfb2sgPiAwKQ0KPiAtCQkJcmV0ID0gMDsNCj4gLQkJ YnJlYWs7DQo+IC0JfQ0KPiAtCS8qIGFsbG11bHRpIG1vZGUgaXMgcHJvcGFnYXRlZCBvbmx5IHRv IHByaW1hcnkgc2xhdmUgKi8NCj4gLQljYXNlIEJPTkRJTkdfTU9ERV9BQ1RJVkVfQkFDS1VQOg0K PiAtCWNhc2UgQk9ORElOR19NT0RFX1RMQjoNCj4gLQljYXNlIEJPTkRJTkdfTU9ERV9BTEI6DQo+ IC0JZGVmYXVsdDoNCj4gLQkJLyogRG8gbm90IHRvdWNoIGFsbG11bHRpIHdoZW4gdGhlcmUgY2Fu bm90IGJlIHByaW1hcnkgcG9ydHMgKi8NCj4gLQkJaWYgKGludGVybmFscy0+c2xhdmVfY291bnQg PT0gMCkNCj4gLQkJCWJyZWFrOw0KPiAtCQlwb3J0X2lkID0gaW50ZXJuYWxzLT5jdXJyZW50X3By aW1hcnlfcG9ydDsNCj4gLQkJcmV0ID0gcnRlX2V0aF9hbGxtdWx0aWNhc3RfZW5hYmxlKHBvcnRf aWQpOw0KPiAtCQlpZiAocmV0ICE9IDApDQo+IC0JCQlSVEVfQk9ORF9MT0coRVJSLA0KPiAtCQkJ CSJGYWlsZWQgdG8gZW5hYmxlIGFsbG11bHRpIG1vZGUgZm9yIHBvcnQgJXU6ICVzIiwNCj4gLQkJ CQlwb3J0X2lkLCBydGVfc3RyZXJyb3IoLXJldCkpOw0KPiAtCX0NCj4gLQ0KPiAtCXJldHVybiBy ZXQ7DQo+IC19DQo+IC0NCj4gLXN0YXRpYyBpbnQNCj4gLWJvbmRfZXRoZGV2X2FsbG11bHRpY2Fz dF9kaXNhYmxlKHN0cnVjdCBydGVfZXRoX2RldiAqZXRoX2RldikNCj4gLXsNCj4gLQlzdHJ1Y3Qg Ym9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzID0gZXRoX2Rldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7 DQo+IC0JaW50IGk7DQo+IC0JaW50IHJldCA9IDA7DQo+IC0JdWludDE2X3QgcG9ydF9pZDsNCj4g LQ0KPiAtCXN3aXRjaCAoaW50ZXJuYWxzLT5tb2RlKSB7DQo+IC0JLyogYWxsbXVsdGkgbW9kZSBp cyBwcm9wYWdhdGVkIHRvIGFsbCBzbGF2ZXMgKi8NCj4gLQljYXNlIEJPTkRJTkdfTU9ERV9ST1VO RF9ST0JJTjoNCj4gLQljYXNlIEJPTkRJTkdfTU9ERV9CQUxBTkNFOg0KPiAtCWNhc2UgQk9ORElO R19NT0RFX0JST0FEQ0FTVDoNCj4gLQljYXNlIEJPTkRJTkdfTU9ERV84MDIzQUQ6IHsNCj4gLQkJ dW5zaWduZWQgaW50IHNsYXZlX29rID0gMDsNCj4gLQ0KPiAtCQlmb3IgKGkgPSAwOyBpIDwgaW50 ZXJuYWxzLT5zbGF2ZV9jb3VudDsgaSsrKSB7DQo+IC0JCQl1aW50MTZfdCBwb3J0X2lkID0gaW50 ZXJuYWxzLT5zbGF2ZXNbaV0ucG9ydF9pZDsNCj4gLQ0KPiAtCQkJaWYgKGludGVybmFscy0+bW9k ZSA9PSBCT05ESU5HX01PREVfODAyM0FEICYmDQo+IC0JCQkgICAgYm9uZF9tb2RlXzgwMjNhZF9w b3J0c1twb3J0X2lkXS5mb3JjZWRfcnhfZmxhZ3MgPT0NCj4gLQkJCQkJQk9ORF84MDIzQURfRk9S Q0VEX0FMTE1VTFRJKQ0KPiAtCQkJCWNvbnRpbnVlOw0KPiAtDQo+IC0JCQlyZXQgPSBydGVfZXRo X2FsbG11bHRpY2FzdF9kaXNhYmxlKHBvcnRfaWQpOw0KPiAtCQkJaWYgKHJldCAhPSAwKQ0KPiAt CQkJCVJURV9CT05EX0xPRyhFUlIsDQo+IC0JCQkJCSJGYWlsZWQgdG8gZGlzYWJsZSBhbGxtdWx0 aSBtb2RlIGZvciBwb3J0ICV1OiAlcyIsDQo+IC0JCQkJCXBvcnRfaWQsIHJ0ZV9zdHJlcnJvcigt cmV0KSk7DQo+IC0JCQllbHNlDQo+IC0JCQkJc2xhdmVfb2srKzsNCj4gLQkJfQ0KPiAtCQkvKg0K PiAtCQkgKiBSZXBvcnQgc3VjY2VzcyBpZiBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCBvbiBhdCBs ZWFzdA0KPiAtCQkgKiBvbiBvbmUgc2xhdmUuIE90aGVyd2lzZSByZXR1cm4gbGFzdCBlcnJvciBj b2RlLg0KPiAtCQkgKi8NCj4gLQkJaWYgKHNsYXZlX29rID4gMCkNCj4gLQkJCXJldCA9IDA7DQo+ IC0JCWJyZWFrOw0KPiAtCX0NCj4gLQkvKiBhbGxtdWx0aSBtb2RlIGlzIHByb3BhZ2F0ZWQgb25s eSB0byBwcmltYXJ5IHNsYXZlICovDQo+IC0JY2FzZSBCT05ESU5HX01PREVfQUNUSVZFX0JBQ0tV UDoNCj4gLQljYXNlIEJPTkRJTkdfTU9ERV9UTEI6DQo+IC0JY2FzZSBCT05ESU5HX01PREVfQUxC Og0KPiAtCWRlZmF1bHQ6DQo+IC0JCS8qIERvIG5vdCB0b3VjaCBhbGxtdWx0aSB3aGVuIHRoZXJl IGNhbm5vdCBiZSBwcmltYXJ5IHBvcnRzICovDQo+IC0JCWlmIChpbnRlcm5hbHMtPnNsYXZlX2Nv dW50ID09IDApDQo+IC0JCQlicmVhazsNCj4gLQkJcG9ydF9pZCA9IGludGVybmFscy0+Y3VycmVu dF9wcmltYXJ5X3BvcnQ7DQo+IC0JCXJldCA9IHJ0ZV9ldGhfYWxsbXVsdGljYXN0X2Rpc2FibGUo cG9ydF9pZCk7DQo+IC0JCWlmIChyZXQgIT0gMCkNCj4gLQkJCVJURV9CT05EX0xPRyhFUlIsDQo+ IC0JCQkJIkZhaWxlZCB0byBkaXNhYmxlIGFsbG11bHRpIG1vZGUgZm9yIHBvcnQgJXU6ICVzIiwN Cj4gLQkJCQlwb3J0X2lkLCBydGVfc3RyZXJyb3IoLXJldCkpOw0KPiAtCX0NCj4gLQ0KPiAtCXJl dHVybiByZXQ7DQo+IC19DQo+IC0NCj4gLXN0YXRpYyBpbnQNCj4gLWJvbmRfZXRoZGV2X2FsbG11 bHRpY2FzdF91cGRhdGUoc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYpDQo+IC17DQo+IC0Jc3RydWN0 IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFscyA9IGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+ IC0JdWludDE2X3QgcG9ydF9pZCA9IGludGVybmFscy0+Y3VycmVudF9wcmltYXJ5X3BvcnQ7DQo+ IC0NCj4gLQlzd2l0Y2ggKGludGVybmFscy0+bW9kZSkgew0KPiAtCWNhc2UgQk9ORElOR19NT0RF X1JPVU5EX1JPQklOOg0KPiAtCWNhc2UgQk9ORElOR19NT0RFX0JBTEFOQ0U6DQo+IC0JY2FzZSBC T05ESU5HX01PREVfQlJPQURDQVNUOg0KPiAtCWNhc2UgQk9ORElOR19NT0RFXzgwMjNBRDoNCj4g LQkJLyogQXMgYWxsbXVsdGljYXN0IG1vZGUgaXMgcHJvcGFnYXRlZCB0byBhbGwgc2xhdmVzIGZv ciB0aGVzZQ0KPiAtCQkgKiBtb2RlLCBubyBuZWVkIHRvIHVwZGF0ZSBmb3IgYm9uZGluZyBkZXZp Y2UuDQo+IC0JCSAqLw0KPiAtCQlicmVhazsNCj4gLQljYXNlIEJPTkRJTkdfTU9ERV9BQ1RJVkVf QkFDS1VQOg0KPiAtCWNhc2UgQk9ORElOR19NT0RFX1RMQjoNCj4gLQljYXNlIEJPTkRJTkdfTU9E RV9BTEI6DQo+IC0JZGVmYXVsdDoNCj4gLQkJLyogQXMgYWxsbXVsdGljYXN0IG1vZGUgaXMgcHJv cGFnYXRlZCBvbmx5IHRvIHByaW1hcnkgc2xhdmUNCj4gLQkJICogZm9yIHRoZXNlIG1vZGUuIFdo ZW4gYWN0aXZlL3N0YW5kYnkgc3dpdGNob3ZlciwgYWxsbXVsdGljYXN0DQo+IC0JCSAqIG1vZGUg c2hvdWxkIGJlIHNldCB0byBuZXcgcHJpbWFyeSBzbGF2ZSBhY2NvcmRpbmcgdG8gYm9uZGluZw0K PiAtCQkgKiBkZXZpY2UuDQo+IC0JCSAqLw0KPiAtCQlpZiAocnRlX2V0aF9hbGxtdWx0aWNhc3Rf Z2V0KGludGVybmFscy0+cG9ydF9pZCkgPT0gMSkNCj4gLQkJCXJ0ZV9ldGhfYWxsbXVsdGljYXN0 X2VuYWJsZShwb3J0X2lkKTsNCj4gLQkJZWxzZQ0KPiAtCQkJcnRlX2V0aF9hbGxtdWx0aWNhc3Rf ZGlzYWJsZShwb3J0X2lkKTsNCj4gLQl9DQo+IC0NCj4gLQlyZXR1cm4gMDsNCj4gLX0NCj4gLQ0K PiAtc3RhdGljIHZvaWQNCj4gLWJvbmRfZXRoZGV2X2RlbGF5ZWRfbHNjX3Byb3BhZ2F0aW9uKHZv aWQgKmFyZykNCj4gLXsNCj4gLQlpZiAoYXJnID09IE5VTEwpDQo+IC0JCXJldHVybjsNCj4gLQ0K PiAtCXJ0ZV9ldGhfZGV2X2NhbGxiYWNrX3Byb2Nlc3MoKHN0cnVjdCBydGVfZXRoX2RldiAqKWFy ZywNCj4gLQkJCVJURV9FVEhfRVZFTlRfSU5UUl9MU0MsIE5VTEwpOw0KPiAtfQ0KPiAtDQo+IC1p bnQNCj4gLWJvbmRfZXRoZGV2X2xzY19ldmVudF9jYWxsYmFjayh1aW50MTZfdCBwb3J0X2lkLCBl bnVtIHJ0ZV9ldGhfZXZlbnRfdHlwZSB0eXBlLA0KPiAtCQl2b2lkICpwYXJhbSwgdm9pZCAqcmV0 X3BhcmFtIF9fcnRlX3VudXNlZCkNCj4gLXsNCj4gLQlzdHJ1Y3QgcnRlX2V0aF9kZXYgKmJvbmRl ZF9ldGhfZGV2Ow0KPiAtCXN0cnVjdCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHM7DQo+IC0J c3RydWN0IHJ0ZV9ldGhfbGluayBsaW5rOw0KPiAtCWludCByYyA9IC0xOw0KPiAtCWludCByZXQ7 DQo+IC0NCj4gLQl1aW50OF90IGxzY19mbGFnID0gMDsNCj4gLQlpbnQgdmFsaWRfc2xhdmUgPSAw Ow0KPiAtCXVpbnQxNl90IGFjdGl2ZV9wb3M7DQo+IC0JdWludDE2X3QgaTsNCj4gLQ0KPiAtCWlm ICh0eXBlICE9IFJURV9FVEhfRVZFTlRfSU5UUl9MU0MgfHwgcGFyYW0gPT0gTlVMTCkNCj4gLQkJ cmV0dXJuIHJjOw0KPiAtDQo+IC0JYm9uZGVkX2V0aF9kZXYgPSAmcnRlX2V0aF9kZXZpY2VzWyoo dWludDE2X3QgKilwYXJhbV07DQo+IC0NCj4gLQlpZiAoY2hlY2tfZm9yX2JvbmRlZF9ldGhkZXYo Ym9uZGVkX2V0aF9kZXYpKQ0KPiAtCQlyZXR1cm4gcmM7DQo+IC0NCj4gLQlpbnRlcm5hbHMgPSBi b25kZWRfZXRoX2Rldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+IC0NCj4gLQkvKiBJZiB0aGUgZGV2 aWNlIGlzbid0IHN0YXJ0ZWQgZG9uJ3QgaGFuZGxlIGludGVycnVwdHMgKi8NCj4gLQlpZiAoIWJv bmRlZF9ldGhfZGV2LT5kYXRhLT5kZXZfc3RhcnRlZCkNCj4gLQkJcmV0dXJuIHJjOw0KPiAtDQo+ IC0JLyogdmVyaWZ5IHRoYXQgcG9ydF9pZCBpcyBhIHZhbGlkIHNsYXZlIG9mIGJvbmRlZCBwb3J0 ICovDQo+IC0JZm9yIChpID0gMDsgaSA8IGludGVybmFscy0+c2xhdmVfY291bnQ7IGkrKykgew0K PiAtCQlpZiAoaW50ZXJuYWxzLT5zbGF2ZXNbaV0ucG9ydF9pZCA9PSBwb3J0X2lkKSB7DQo+IC0J CQl2YWxpZF9zbGF2ZSA9IDE7DQo+IC0JCQlicmVhazsNCj4gLQkJfQ0KPiAtCX0NCj4gLQ0KPiAt CWlmICghdmFsaWRfc2xhdmUpDQo+IC0JCXJldHVybiByYzsNCj4gLQ0KPiAtCS8qIFN5bmNocm9u aXplIGxzYyBjYWxsYmFjayBwYXJhbGxlbCBjYWxscyBlaXRoZXIgYnkgcmVhbCBsaW5rIGV2ZW50 DQo+IC0JICogZnJvbSB0aGUgc2xhdmVzIFBNRHMgb3IgYnkgdGhlIGJvbmRpbmcgUE1EIGl0c2Vs Zi4NCj4gLQkgKi8NCj4gLQlydGVfc3BpbmxvY2tfbG9jaygmaW50ZXJuYWxzLT5sc2NfbG9jayk7 DQo+IC0NCj4gLQkvKiBTZWFyY2ggZm9yIHBvcnQgaW4gYWN0aXZlIHBvcnQgbGlzdCAqLw0KPiAt CWFjdGl2ZV9wb3MgPSBmaW5kX3NsYXZlX2J5X2lkKGludGVybmFscy0+YWN0aXZlX3NsYXZlcywN Cj4gLQkJCWludGVybmFscy0+YWN0aXZlX3NsYXZlX2NvdW50LCBwb3J0X2lkKTsNCj4gLQ0KPiAt CXJldCA9IHJ0ZV9ldGhfbGlua19nZXRfbm93YWl0KHBvcnRfaWQsICZsaW5rKTsNCj4gLQlpZiAo cmV0IDwgMCkNCj4gLQkJUlRFX0JPTkRfTE9HKEVSUiwgIlNsYXZlIChwb3J0ICV1KSBsaW5rIGdl dCBmYWlsZWQiLCBwb3J0X2lkKTsNCj4gLQ0KPiAtCWlmIChyZXQgPT0gMCAmJiBsaW5rLmxpbmtf c3RhdHVzKSB7DQo+IC0JCWlmIChhY3RpdmVfcG9zIDwgaW50ZXJuYWxzLT5hY3RpdmVfc2xhdmVf Y291bnQpDQo+IC0JCQlnb3RvIGxpbmtfdXBkYXRlOw0KPiAtDQo+IC0JCS8qIGNoZWNrIGxpbmsg c3RhdGUgcHJvcGVydGllcyBpZiBib25kZWQgbGluayBpcyB1cCovDQo+IC0JCWlmIChib25kZWRf ZXRoX2Rldi0+ZGF0YS0+ZGV2X2xpbmsubGlua19zdGF0dXMgPT0gUlRFX0VUSF9MSU5LX1VQKSB7 DQo+IC0JCQlpZiAobGlua19wcm9wZXJ0aWVzX3ZhbGlkKGJvbmRlZF9ldGhfZGV2LCAmbGluaykg IT0gMCkNCj4gLQkJCQlSVEVfQk9ORF9MT0coRVJSLCAiSW52YWxpZCBsaW5rIHByb3BlcnRpZXMg Ig0KPiAtCQkJCQkgICAgICJmb3Igc2xhdmUgJWQgaW4gYm9uZGluZyBtb2RlICVkIiwNCj4gLQkJ CQkJICAgICBwb3J0X2lkLCBpbnRlcm5hbHMtPm1vZGUpOw0KPiAtCQl9IGVsc2Ugew0KPiAtCQkJ LyogaW5oZXJpdCBzbGF2ZSBsaW5rIHByb3BlcnRpZXMgKi8NCj4gLQkJCWxpbmtfcHJvcGVydGll c19zZXQoYm9uZGVkX2V0aF9kZXYsICZsaW5rKTsNCj4gLQkJfQ0KPiAtDQo+IC0JCS8qIElmIG5v IGFjdGl2ZSBzbGF2ZSBwb3J0cyB0aGVuIHNldCB0aGlzIHBvcnQgdG8gYmUNCj4gLQkJICogdGhl IHByaW1hcnkgcG9ydC4NCj4gLQkJICovDQo+IC0JCWlmIChpbnRlcm5hbHMtPmFjdGl2ZV9zbGF2 ZV9jb3VudCA8IDEpIHsNCj4gLQkJCS8qIElmIGZpcnN0IGFjdGl2ZSBzbGF2ZSwgdGhlbiBjaGFu Z2UgbGluayBzdGF0dXMgKi8NCj4gLQkJCWJvbmRlZF9ldGhfZGV2LT5kYXRhLT5kZXZfbGluay5s aW5rX3N0YXR1cyA9DQo+IC0JCQkJCQkJCVJURV9FVEhfTElOS19VUDsNCj4gLQkJCWludGVybmFs cy0+Y3VycmVudF9wcmltYXJ5X3BvcnQgPSBwb3J0X2lkOw0KPiAtCQkJbHNjX2ZsYWcgPSAxOw0K PiAtDQo+IC0JCQltYWNfYWRkcmVzc19zbGF2ZXNfdXBkYXRlKGJvbmRlZF9ldGhfZGV2KTsNCj4g LQkJCWJvbmRfZXRoZGV2X3Byb21pc2N1b3VzX3VwZGF0ZShib25kZWRfZXRoX2Rldik7DQo+IC0J CQlib25kX2V0aGRldl9hbGxtdWx0aWNhc3RfdXBkYXRlKGJvbmRlZF9ldGhfZGV2KTsNCj4gLQkJ fQ0KPiAtDQo+IC0JCWFjdGl2YXRlX3NsYXZlKGJvbmRlZF9ldGhfZGV2LCBwb3J0X2lkKTsNCj4g LQ0KPiAtCQkvKiBJZiB0aGUgdXNlciBoYXMgZGVmaW5lZCB0aGUgcHJpbWFyeSBwb3J0IHRoZW4g ZGVmYXVsdCB0bw0KPiAtCQkgKiB1c2luZyBpdC4NCj4gLQkJICovDQo+IC0JCWlmIChpbnRlcm5h bHMtPnVzZXJfZGVmaW5lZF9wcmltYXJ5X3BvcnQgJiYNCj4gLQkJCQlpbnRlcm5hbHMtPnByaW1h cnlfcG9ydCA9PSBwb3J0X2lkKQ0KPiAtCQkJYm9uZF9ldGhkZXZfcHJpbWFyeV9zZXQoaW50ZXJu YWxzLCBwb3J0X2lkKTsNCj4gLQl9IGVsc2Ugew0KPiAtCQlpZiAoYWN0aXZlX3BvcyA9PSBpbnRl cm5hbHMtPmFjdGl2ZV9zbGF2ZV9jb3VudCkNCj4gLQkJCWdvdG8gbGlua191cGRhdGU7DQo+IC0N Cj4gLQkJLyogUmVtb3ZlIGZyb20gYWN0aXZlIHNsYXZlIGxpc3QgKi8NCj4gLQkJZGVhY3RpdmF0 ZV9zbGF2ZShib25kZWRfZXRoX2RldiwgcG9ydF9pZCk7DQo+IC0NCj4gLQkJaWYgKGludGVybmFs cy0+YWN0aXZlX3NsYXZlX2NvdW50IDwgMSkNCj4gLQkJCWxzY19mbGFnID0gMTsNCj4gLQ0KPiAt CQkvKiBVcGRhdGUgcHJpbWFyeSBpZCwgdGFrZSBmaXJzdCBhY3RpdmUgc2xhdmUgZnJvbSBsaXN0 IG9yIGlmIG5vbmUNCj4gLQkJICogYXZhaWxhYmxlIHNldCB0byAtMSAqLw0KPiAtCQlpZiAocG9y dF9pZCA9PSBpbnRlcm5hbHMtPmN1cnJlbnRfcHJpbWFyeV9wb3J0KSB7DQo+IC0JCQlpZiAoaW50 ZXJuYWxzLT5hY3RpdmVfc2xhdmVfY291bnQgPiAwKQ0KPiAtCQkJCWJvbmRfZXRoZGV2X3ByaW1h cnlfc2V0KGludGVybmFscywNCj4gLQkJCQkJCWludGVybmFscy0+YWN0aXZlX3NsYXZlc1swXSk7 DQo+IC0JCQllbHNlDQo+IC0JCQkJaW50ZXJuYWxzLT5jdXJyZW50X3ByaW1hcnlfcG9ydCA9IGlu dGVybmFscy0+cHJpbWFyeV9wb3J0Ow0KPiAtCQkJbWFjX2FkZHJlc3Nfc2xhdmVzX3VwZGF0ZShi b25kZWRfZXRoX2Rldik7DQo+IC0JCQlib25kX2V0aGRldl9wcm9taXNjdW91c191cGRhdGUoYm9u ZGVkX2V0aF9kZXYpOw0KPiAtCQkJYm9uZF9ldGhkZXZfYWxsbXVsdGljYXN0X3VwZGF0ZShib25k ZWRfZXRoX2Rldik7DQo+IC0JCX0NCj4gLQl9DQo+IC0NCj4gLWxpbmtfdXBkYXRlOg0KPiAtCS8q Kg0KPiAtCSAqIFVwZGF0ZSBib25kZWQgZGV2aWNlIGxpbmsgcHJvcGVydGllcyBhZnRlciBhbnkg Y2hhbmdlIHRvIGFjdGl2ZQ0KPiAtCSAqIHNsYXZlcw0KPiAtCSAqLw0KPiAtCWJvbmRfZXRoZGV2 X2xpbmtfdXBkYXRlKGJvbmRlZF9ldGhfZGV2LCAwKTsNCj4gLQ0KPiAtCWlmIChsc2NfZmxhZykg ew0KPiAtCQkvKiBDYW5jZWwgYW55IHBvc3NpYmxlIG91dHN0YW5kaW5nIGludGVycnVwdHMgaWYg ZGVsYXlzIGFyZSBlbmFibGVkICovDQo+IC0JCWlmIChpbnRlcm5hbHMtPmxpbmtfdXBfZGVsYXlf bXMgPiAwIHx8DQo+IC0JCQlpbnRlcm5hbHMtPmxpbmtfZG93bl9kZWxheV9tcyA+IDApDQo+IC0J CQlydGVfZWFsX2FsYXJtX2NhbmNlbChib25kX2V0aGRldl9kZWxheWVkX2xzY19wcm9wYWdhdGlv biwNCj4gLQkJCQkJYm9uZGVkX2V0aF9kZXYpOw0KPiAtDQo+IC0JCWlmIChib25kZWRfZXRoX2Rl di0+ZGF0YS0+ZGV2X2xpbmsubGlua19zdGF0dXMpIHsNCj4gLQkJCWlmIChpbnRlcm5hbHMtPmxp bmtfdXBfZGVsYXlfbXMgPiAwKQ0KPiAtCQkJCXJ0ZV9lYWxfYWxhcm1fc2V0KGludGVybmFscy0+ bGlua191cF9kZWxheV9tcyAqIDEwMDAsDQo+IC0JCQkJCQlib25kX2V0aGRldl9kZWxheWVkX2xz Y19wcm9wYWdhdGlvbiwNCj4gLQkJCQkJCSh2b2lkICopYm9uZGVkX2V0aF9kZXYpOw0KPiAtCQkJ ZWxzZQ0KPiAtCQkJCXJ0ZV9ldGhfZGV2X2NhbGxiYWNrX3Byb2Nlc3MoYm9uZGVkX2V0aF9kZXYs DQo+IC0JCQkJCQlSVEVfRVRIX0VWRU5UX0lOVFJfTFNDLA0KPiAtCQkJCQkJTlVMTCk7DQo+IC0N Cj4gLQkJfSBlbHNlIHsNCj4gLQkJCWlmIChpbnRlcm5hbHMtPmxpbmtfZG93bl9kZWxheV9tcyA+ IDApDQo+IC0JCQkJcnRlX2VhbF9hbGFybV9zZXQoaW50ZXJuYWxzLT5saW5rX2Rvd25fZGVsYXlf bXMgKiAxMDAwLA0KPiAtCQkJCQkJYm9uZF9ldGhkZXZfZGVsYXllZF9sc2NfcHJvcGFnYXRpb24s DQo+IC0JCQkJCQkodm9pZCAqKWJvbmRlZF9ldGhfZGV2KTsNCj4gLQkJCWVsc2UNCj4gLQkJCQly dGVfZXRoX2Rldl9jYWxsYmFja19wcm9jZXNzKGJvbmRlZF9ldGhfZGV2LA0KPiAtCQkJCQkJUlRF X0VUSF9FVkVOVF9JTlRSX0xTQywNCj4gLQkJCQkJCU5VTEwpOw0KPiAtCQl9DQo+IC0JfQ0KPiAt DQo+IC0JcnRlX3NwaW5sb2NrX3VubG9jaygmaW50ZXJuYWxzLT5sc2NfbG9jayk7DQo+IC0NCj4g LQlyZXR1cm4gcmM7DQo+IC19DQo+IC0NCj4gLXN0YXRpYyBpbnQNCj4gLWJvbmRfZXRoZGV2X3Jz c19yZXRhX3VwZGF0ZShzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwNCj4gLQkJc3RydWN0IHJ0ZV9l dGhfcnNzX3JldGFfZW50cnk2NCAqcmV0YV9jb25mLCB1aW50MTZfdCByZXRhX3NpemUpDQo+IC17 DQo+IC0JdW5zaWduZWQgaSwgajsNCj4gLQlpbnQgcmVzdWx0ID0gMDsNCj4gLQlpbnQgc2xhdmVf cmV0YV9zaXplOw0KPiAtCXVuc2lnbmVkIHJldGFfY291bnQ7DQo+IC0Jc3RydWN0IGJvbmRfZGV2 X3ByaXZhdGUgKmludGVybmFscyA9IGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+IC0NCj4gLQlp ZiAocmV0YV9zaXplICE9IGludGVybmFscy0+cmV0YV9zaXplKQ0KPiAtCQlyZXR1cm4gLUVJTlZB TDsNCj4gLQ0KPiAtCSAvKiBDb3B5IFJFVEEgdGFibGUgKi8NCj4gLQlyZXRhX2NvdW50ID0gKHJl dGFfc2l6ZSArIFJURV9FVEhfUkVUQV9HUk9VUF9TSVpFIC0gMSkgLw0KPiAtCQkJUlRFX0VUSF9S RVRBX0dST1VQX1NJWkU7DQo+IC0NCj4gLQlmb3IgKGkgPSAwOyBpIDwgcmV0YV9jb3VudDsgaSsr KSB7DQo+IC0JCWludGVybmFscy0+cmV0YV9jb25mW2ldLm1hc2sgPSByZXRhX2NvbmZbaV0ubWFz azsNCj4gLQkJZm9yIChqID0gMDsgaiA8IFJURV9FVEhfUkVUQV9HUk9VUF9TSVpFOyBqKyspDQo+ IC0JCQlpZiAoKHJldGFfY29uZltpXS5tYXNrID4+IGopICYgMHgwMSkNCj4gLQkJCQlpbnRlcm5h bHMtPnJldGFfY29uZltpXS5yZXRhW2pdID0gcmV0YV9jb25mW2ldLnJldGFbal07DQo+IC0JfQ0K PiAtDQo+IC0JLyogRmlsbCByZXN0IG9mIGFycmF5ICovDQo+IC0JZm9yICg7IGkgPCBSVEVfRElN KGludGVybmFscy0+cmV0YV9jb25mKTsgaSArPSByZXRhX2NvdW50KQ0KPiAtCQltZW1jcHkoJmlu dGVybmFscy0+cmV0YV9jb25mW2ldLCAmaW50ZXJuYWxzLT5yZXRhX2NvbmZbMF0sDQo+IC0JCQkJ c2l6ZW9mKGludGVybmFscy0+cmV0YV9jb25mWzBdKSAqIHJldGFfY291bnQpOw0KPiAtDQo+IC0J LyogUHJvcGFnYXRlIFJFVEEgb3ZlciBzbGF2ZXMgKi8NCj4gLQlmb3IgKGkgPSAwOyBpIDwgaW50 ZXJuYWxzLT5zbGF2ZV9jb3VudDsgaSsrKSB7DQo+IC0JCXNsYXZlX3JldGFfc2l6ZSA9IGludGVy bmFscy0+c2xhdmVzW2ldLnJldGFfc2l6ZTsNCj4gLQkJcmVzdWx0ID0gcnRlX2V0aF9kZXZfcnNz X3JldGFfdXBkYXRlKGludGVybmFscy0+c2xhdmVzW2ldLnBvcnRfaWQsDQo+IC0JCQkJJmludGVy bmFscy0+cmV0YV9jb25mWzBdLCBzbGF2ZV9yZXRhX3NpemUpOw0KPiAtCQlpZiAocmVzdWx0IDwg MCkNCj4gLQkJCXJldHVybiByZXN1bHQ7DQo+IC0JfQ0KPiAtDQo+IC0JcmV0dXJuIDA7DQo+IC19 DQo+IC0NCj4gLXN0YXRpYyBpbnQNCj4gLWJvbmRfZXRoZGV2X3Jzc19yZXRhX3F1ZXJ5KHN0cnVj dCBydGVfZXRoX2RldiAqZGV2LA0KPiAtCQlzdHJ1Y3QgcnRlX2V0aF9yc3NfcmV0YV9lbnRyeTY0 ICpyZXRhX2NvbmYsIHVpbnQxNl90IHJldGFfc2l6ZSkNCj4gLXsNCj4gLQlpbnQgaSwgajsNCj4g LQlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzID0gZGV2LT5kYXRhLT5kZXZfcHJp dmF0ZTsNCj4gLQ0KPiAtCWlmIChyZXRhX3NpemUgIT0gaW50ZXJuYWxzLT5yZXRhX3NpemUpDQo+ IC0JCXJldHVybiAtRUlOVkFMOw0KPiAtDQo+IC0JIC8qIENvcHkgUkVUQSB0YWJsZSAqLw0KPiAt CWZvciAoaSA9IDA7IGkgPCByZXRhX3NpemUgLyBSVEVfRVRIX1JFVEFfR1JPVVBfU0laRTsgaSsr KQ0KPiAtCQlmb3IgKGogPSAwOyBqIDwgUlRFX0VUSF9SRVRBX0dST1VQX1NJWkU7IGorKykNCj4g LQkJCWlmICgocmV0YV9jb25mW2ldLm1hc2sgPj4gaikgJiAweDAxKQ0KPiAtCQkJCXJldGFfY29u ZltpXS5yZXRhW2pdID0gaW50ZXJuYWxzLT5yZXRhX2NvbmZbaV0ucmV0YVtqXTsNCj4gLQ0KPiAt CXJldHVybiAwOw0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMgaW50DQo+IC1ib25kX2V0aGRldl9yc3Nf aGFzaF91cGRhdGUoc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYsDQo+IC0JCXN0cnVjdCBydGVfZXRo X3Jzc19jb25mICpyc3NfY29uZikNCj4gLXsNCj4gLQlpbnQgaSwgcmVzdWx0ID0gMDsNCj4gLQlz dHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0 ZTsNCj4gLQlzdHJ1Y3QgcnRlX2V0aF9yc3NfY29uZiBib25kX3Jzc19jb25mOw0KPiAtDQo+IC0J bWVtY3B5KCZib25kX3Jzc19jb25mLCByc3NfY29uZiwgc2l6ZW9mKHN0cnVjdCBydGVfZXRoX3Jz c19jb25mKSk7DQo+IC0NCj4gLQlib25kX3Jzc19jb25mLnJzc19oZiAmPSBpbnRlcm5hbHMtPmZs b3dfdHlwZV9yc3Nfb2ZmbG9hZHM7DQo+IC0NCj4gLQlpZiAoYm9uZF9yc3NfY29uZi5yc3NfaGYg IT0gMCkNCj4gLQkJZGV2LT5kYXRhLT5kZXZfY29uZi5yeF9hZHZfY29uZi5yc3NfY29uZi5yc3Nf aGYgPSBib25kX3Jzc19jb25mLnJzc19oZjsNCj4gLQ0KPiAtCWlmIChib25kX3Jzc19jb25mLnJz c19rZXkpIHsNCj4gLQkJaWYgKGJvbmRfcnNzX2NvbmYucnNzX2tleV9sZW4gPCBpbnRlcm5hbHMt PnJzc19rZXlfbGVuKQ0KPiAtCQkJcmV0dXJuIC1FSU5WQUw7DQo+IC0JCWVsc2UgaWYgKGJvbmRf cnNzX2NvbmYucnNzX2tleV9sZW4gPiBpbnRlcm5hbHMtPnJzc19rZXlfbGVuKQ0KPiAtCQkJUlRF X0JPTkRfTE9HKFdBUk5JTkcsICJyc3Nfa2V5IHdpbGwgYmUgdHJ1bmNhdGVkIik7DQo+IC0NCj4g LQkJbWVtY3B5KGludGVybmFscy0+cnNzX2tleSwgYm9uZF9yc3NfY29uZi5yc3Nfa2V5LA0KPiAt CQkJCWludGVybmFscy0+cnNzX2tleV9sZW4pOw0KPiAtCQlib25kX3Jzc19jb25mLnJzc19rZXlf bGVuID0gaW50ZXJuYWxzLT5yc3Nfa2V5X2xlbjsNCj4gLQl9DQo+IC0NCj4gLQlmb3IgKGkgPSAw OyBpIDwgaW50ZXJuYWxzLT5zbGF2ZV9jb3VudDsgaSsrKSB7DQo+IC0JCXJlc3VsdCA9IHJ0ZV9l dGhfZGV2X3Jzc19oYXNoX3VwZGF0ZShpbnRlcm5hbHMtPnNsYXZlc1tpXS5wb3J0X2lkLA0KPiAt CQkJCSZib25kX3Jzc19jb25mKTsNCj4gLQkJaWYgKHJlc3VsdCA8IDApDQo+IC0JCQlyZXR1cm4g cmVzdWx0Ow0KPiAtCX0NCj4gLQ0KPiAtCXJldHVybiAwOw0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMg aW50DQo+IC1ib25kX2V0aGRldl9yc3NfaGFzaF9jb25mX2dldChzdHJ1Y3QgcnRlX2V0aF9kZXYg KmRldiwNCj4gLQkJc3RydWN0IHJ0ZV9ldGhfcnNzX2NvbmYgKnJzc19jb25mKQ0KPiAtew0KPiAt CXN0cnVjdCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHMgPSBkZXYtPmRhdGEtPmRldl9wcml2 YXRlOw0KPiAtDQo+IC0JcnNzX2NvbmYtPnJzc19oZiA9IGRldi0+ZGF0YS0+ZGV2X2NvbmYucnhf YWR2X2NvbmYucnNzX2NvbmYucnNzX2hmOw0KPiAtCXJzc19jb25mLT5yc3Nfa2V5X2xlbiA9IGlu dGVybmFscy0+cnNzX2tleV9sZW47DQo+IC0JaWYgKHJzc19jb25mLT5yc3Nfa2V5KQ0KPiAtCQlt ZW1jcHkocnNzX2NvbmYtPnJzc19rZXksIGludGVybmFscy0+cnNzX2tleSwgaW50ZXJuYWxzLT5y c3Nfa2V5X2xlbik7DQo+IC0NCj4gLQlyZXR1cm4gMDsNCj4gLX0NCj4gLQ0KPiAtc3RhdGljIGlu dA0KPiAtYm9uZF9ldGhkZXZfbXR1X3NldChzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwgdWludDE2 X3QgbXR1KQ0KPiAtew0KPiAtCXN0cnVjdCBydGVfZXRoX2RldiAqc2xhdmVfZXRoX2RldjsNCj4g LQlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzID0gZGV2LT5kYXRhLT5kZXZfcHJp dmF0ZTsNCj4gLQlpbnQgcmV0LCBpOw0KPiAtDQo+IC0JcnRlX3NwaW5sb2NrX2xvY2soJmludGVy bmFscy0+bG9jayk7DQo+IC0NCj4gLQlmb3IgKGkgPSAwOyBpIDwgaW50ZXJuYWxzLT5zbGF2ZV9j b3VudDsgaSsrKSB7DQo+IC0JCXNsYXZlX2V0aF9kZXYgPSAmcnRlX2V0aF9kZXZpY2VzW2ludGVy bmFscy0+c2xhdmVzW2ldLnBvcnRfaWRdOw0KPiAtCQlpZiAoKnNsYXZlX2V0aF9kZXYtPmRldl9v cHMtPm10dV9zZXQgPT0gTlVMTCkgew0KPiAtCQkJcnRlX3NwaW5sb2NrX3VubG9jaygmaW50ZXJu YWxzLT5sb2NrKTsNCj4gLQkJCXJldHVybiAtRU5PVFNVUDsNCj4gLQkJfQ0KPiAtCX0NCj4gLQlm b3IgKGkgPSAwOyBpIDwgaW50ZXJuYWxzLT5zbGF2ZV9jb3VudDsgaSsrKSB7DQo+IC0JCXJldCA9 IHJ0ZV9ldGhfZGV2X3NldF9tdHUoaW50ZXJuYWxzLT5zbGF2ZXNbaV0ucG9ydF9pZCwgbXR1KTsN Cj4gLQkJaWYgKHJldCA8IDApIHsNCj4gLQkJCXJ0ZV9zcGlubG9ja191bmxvY2soJmludGVybmFs cy0+bG9jayk7DQo+IC0JCQlyZXR1cm4gcmV0Ow0KPiAtCQl9DQo+IC0JfQ0KPiAtDQo+IC0JcnRl X3NwaW5sb2NrX3VubG9jaygmaW50ZXJuYWxzLT5sb2NrKTsNCj4gLQlyZXR1cm4gMDsNCj4gLX0N Cj4gLQ0KPiAtc3RhdGljIGludA0KPiAtYm9uZF9ldGhkZXZfbWFjX2FkZHJlc3Nfc2V0KHN0cnVj dCBydGVfZXRoX2RldiAqZGV2LA0KPiAtCQkJc3RydWN0IHJ0ZV9ldGhlcl9hZGRyICphZGRyKQ0K PiAtew0KPiAtCWlmIChtYWNfYWRkcmVzc19zZXQoZGV2LCBhZGRyKSkgew0KPiAtCQlSVEVfQk9O RF9MT0coRVJSLCAiRmFpbGVkIHRvIHVwZGF0ZSBNQUMgYWRkcmVzcyIpOw0KPiAtCQlyZXR1cm4g LUVJTlZBTDsNCj4gLQl9DQo+IC0NCj4gLQlyZXR1cm4gMDsNCj4gLX0NCj4gLQ0KPiAtc3RhdGlj IGludA0KPiAtYm9uZF9mbG93X29wc19nZXQoc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYgX19ydGVf dW51c2VkLA0KPiAtCQkgIGNvbnN0IHN0cnVjdCBydGVfZmxvd19vcHMgKipvcHMpDQo+IC17DQo+ IC0JKm9wcyA9ICZib25kX2Zsb3dfb3BzOw0KPiAtCXJldHVybiAwOw0KPiAtfQ0KPiAtDQo+IC1z dGF0aWMgaW50DQo+IC1ib25kX2V0aGRldl9tYWNfYWRkcl9hZGQoc3RydWN0IHJ0ZV9ldGhfZGV2 ICpkZXYsDQo+IC0JCQlzdHJ1Y3QgcnRlX2V0aGVyX2FkZHIgKm1hY19hZGRyLA0KPiAtCQkJX19y dGVfdW51c2VkIHVpbnQzMl90IGluZGV4LCB1aW50MzJfdCB2bWRxKQ0KPiAtew0KPiAtCXN0cnVj dCBydGVfZXRoX2RldiAqc2xhdmVfZXRoX2RldjsNCj4gLQlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0 ZSAqaW50ZXJuYWxzID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4gLQlpbnQgcmV0LCBpOw0K PiAtDQo+IC0JcnRlX3NwaW5sb2NrX2xvY2soJmludGVybmFscy0+bG9jayk7DQo+IC0NCj4gLQlm b3IgKGkgPSAwOyBpIDwgaW50ZXJuYWxzLT5zbGF2ZV9jb3VudDsgaSsrKSB7DQo+IC0JCXNsYXZl X2V0aF9kZXYgPSAmcnRlX2V0aF9kZXZpY2VzW2ludGVybmFscy0+c2xhdmVzW2ldLnBvcnRfaWRd Ow0KPiAtCQlpZiAoKnNsYXZlX2V0aF9kZXYtPmRldl9vcHMtPm1hY19hZGRyX2FkZCA9PSBOVUxM IHx8DQo+IC0JCQkgKnNsYXZlX2V0aF9kZXYtPmRldl9vcHMtPm1hY19hZGRyX3JlbW92ZSA9PSBO VUxMKSB7DQo+IC0JCQlyZXQgPSAtRU5PVFNVUDsNCj4gLQkJCWdvdG8gZW5kOw0KPiAtCQl9DQo+ IC0JfQ0KPiAtDQo+IC0JZm9yIChpID0gMDsgaSA8IGludGVybmFscy0+c2xhdmVfY291bnQ7IGkr Kykgew0KPiAtCQlyZXQgPSBydGVfZXRoX2Rldl9tYWNfYWRkcl9hZGQoaW50ZXJuYWxzLT5zbGF2 ZXNbaV0ucG9ydF9pZCwNCj4gLQkJCQltYWNfYWRkciwgdm1kcSk7DQo+IC0JCWlmIChyZXQgPCAw KSB7DQo+IC0JCQkvKiByb2xsYmFjayAqLw0KPiAtCQkJZm9yIChpLS07IGkgPj0gMDsgaS0tKQ0K PiAtCQkJCXJ0ZV9ldGhfZGV2X21hY19hZGRyX3JlbW92ZSgNCj4gLQkJCQkJaW50ZXJuYWxzLT5z bGF2ZXNbaV0ucG9ydF9pZCwgbWFjX2FkZHIpOw0KPiAtCQkJZ290byBlbmQ7DQo+IC0JCX0NCj4g LQl9DQo+IC0NCj4gLQlyZXQgPSAwOw0KPiAtZW5kOg0KPiAtCXJ0ZV9zcGlubG9ja191bmxvY2so JmludGVybmFscy0+bG9jayk7DQo+IC0JcmV0dXJuIHJldDsNCj4gLX0NCj4gLQ0KPiAtc3RhdGlj IHZvaWQNCj4gLWJvbmRfZXRoZGV2X21hY19hZGRyX3JlbW92ZShzdHJ1Y3QgcnRlX2V0aF9kZXYg KmRldiwgdWludDMyX3QgaW5kZXgpDQo+IC17DQo+IC0Jc3RydWN0IHJ0ZV9ldGhfZGV2ICpzbGF2 ZV9ldGhfZGV2Ow0KPiAtCXN0cnVjdCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHMgPSBkZXYt PmRhdGEtPmRldl9wcml2YXRlOw0KPiAtCWludCBpOw0KPiAtDQo+IC0JcnRlX3NwaW5sb2NrX2xv Y2soJmludGVybmFscy0+bG9jayk7DQo+IC0NCj4gLQlmb3IgKGkgPSAwOyBpIDwgaW50ZXJuYWxz LT5zbGF2ZV9jb3VudDsgaSsrKSB7DQo+IC0JCXNsYXZlX2V0aF9kZXYgPSAmcnRlX2V0aF9kZXZp Y2VzW2ludGVybmFscy0+c2xhdmVzW2ldLnBvcnRfaWRdOw0KPiAtCQlpZiAoKnNsYXZlX2V0aF9k ZXYtPmRldl9vcHMtPm1hY19hZGRyX3JlbW92ZSA9PSBOVUxMKQ0KPiAtCQkJZ290byBlbmQ7DQo+ IC0JfQ0KPiAtDQo+IC0Jc3RydWN0IHJ0ZV9ldGhlcl9hZGRyICptYWNfYWRkciA9ICZkZXYtPmRh dGEtPm1hY19hZGRyc1tpbmRleF07DQo+IC0NCj4gLQlmb3IgKGkgPSAwOyBpIDwgaW50ZXJuYWxz LT5zbGF2ZV9jb3VudDsgaSsrKQ0KPiAtCQlydGVfZXRoX2Rldl9tYWNfYWRkcl9yZW1vdmUoaW50 ZXJuYWxzLT5zbGF2ZXNbaV0ucG9ydF9pZCwNCj4gLQkJCQltYWNfYWRkcik7DQo+IC0NCj4gLWVu ZDoNCj4gLQlydGVfc3BpbmxvY2tfdW5sb2NrKCZpbnRlcm5hbHMtPmxvY2spOw0KPiAtfQ0KPiAt DQo+IC1jb25zdCBzdHJ1Y3QgZXRoX2Rldl9vcHMgZGVmYXVsdF9kZXZfb3BzID0gew0KPiAtCS5k ZXZfc3RhcnQgICAgICAgICAgICA9IGJvbmRfZXRoZGV2X3N0YXJ0LA0KPiAtCS5kZXZfc3RvcCAg ICAgICAgICAgICA9IGJvbmRfZXRoZGV2X3N0b3AsDQo+IC0JLmRldl9jbG9zZSAgICAgICAgICAg ID0gYm9uZF9ldGhkZXZfY2xvc2UsDQo+IC0JLmRldl9jb25maWd1cmUgICAgICAgID0gYm9uZF9l dGhkZXZfY29uZmlndXJlLA0KPiAtCS5kZXZfaW5mb3NfZ2V0ICAgICAgICA9IGJvbmRfZXRoZGV2 X2luZm8sDQo+IC0JLnZsYW5fZmlsdGVyX3NldCAgICAgID0gYm9uZF9ldGhkZXZfdmxhbl9maWx0 ZXJfc2V0LA0KPiAtCS5yeF9xdWV1ZV9zZXR1cCAgICAgICA9IGJvbmRfZXRoZGV2X3J4X3F1ZXVl X3NldHVwLA0KPiAtCS50eF9xdWV1ZV9zZXR1cCAgICAgICA9IGJvbmRfZXRoZGV2X3R4X3F1ZXVl X3NldHVwLA0KPiAtCS5yeF9xdWV1ZV9yZWxlYXNlICAgICA9IGJvbmRfZXRoZGV2X3J4X3F1ZXVl X3JlbGVhc2UsDQo+IC0JLnR4X3F1ZXVlX3JlbGVhc2UgICAgID0gYm9uZF9ldGhkZXZfdHhfcXVl dWVfcmVsZWFzZSwNCj4gLQkubGlua191cGRhdGUgICAgICAgICAgPSBib25kX2V0aGRldl9saW5r X3VwZGF0ZSwNCj4gLQkuc3RhdHNfZ2V0ICAgICAgICAgICAgPSBib25kX2V0aGRldl9zdGF0c19n ZXQsDQo+IC0JLnN0YXRzX3Jlc2V0ICAgICAgICAgID0gYm9uZF9ldGhkZXZfc3RhdHNfcmVzZXQs DQo+IC0JLnByb21pc2N1b3VzX2VuYWJsZSAgID0gYm9uZF9ldGhkZXZfcHJvbWlzY3VvdXNfZW5h YmxlLA0KPiAtCS5wcm9taXNjdW91c19kaXNhYmxlICA9IGJvbmRfZXRoZGV2X3Byb21pc2N1b3Vz X2Rpc2FibGUsDQo+IC0JLmFsbG11bHRpY2FzdF9lbmFibGUgID0gYm9uZF9ldGhkZXZfYWxsbXVs dGljYXN0X2VuYWJsZSwNCj4gLQkuYWxsbXVsdGljYXN0X2Rpc2FibGUgPSBib25kX2V0aGRldl9h bGxtdWx0aWNhc3RfZGlzYWJsZSwNCj4gLQkucmV0YV91cGRhdGUgICAgICAgICAgPSBib25kX2V0 aGRldl9yc3NfcmV0YV91cGRhdGUsDQo+IC0JLnJldGFfcXVlcnkgICAgICAgICAgID0gYm9uZF9l dGhkZXZfcnNzX3JldGFfcXVlcnksDQo+IC0JLnJzc19oYXNoX3VwZGF0ZSAgICAgID0gYm9uZF9l dGhkZXZfcnNzX2hhc2hfdXBkYXRlLA0KPiAtCS5yc3NfaGFzaF9jb25mX2dldCAgICA9IGJvbmRf ZXRoZGV2X3Jzc19oYXNoX2NvbmZfZ2V0LA0KPiAtCS5tdHVfc2V0ICAgICAgICAgICAgICA9IGJv bmRfZXRoZGV2X210dV9zZXQsDQo+IC0JLm1hY19hZGRyX3NldCAgICAgICAgID0gYm9uZF9ldGhk ZXZfbWFjX2FkZHJlc3Nfc2V0LA0KPiAtCS5tYWNfYWRkcl9hZGQgICAgICAgICA9IGJvbmRfZXRo ZGV2X21hY19hZGRyX2FkZCwNCj4gLQkubWFjX2FkZHJfcmVtb3ZlICAgICAgPSBib25kX2V0aGRl dl9tYWNfYWRkcl9yZW1vdmUsDQo+IC0JLmZsb3dfb3BzX2dldCAgICAgICAgID0gYm9uZF9mbG93 X29wc19nZXQNCj4gLX07DQo+IC0NCj4gLXN0YXRpYyBpbnQNCj4gLWJvbmRfYWxsb2Moc3RydWN0 IHJ0ZV92ZGV2X2RldmljZSAqZGV2LCB1aW50OF90IG1vZGUpDQo+IC17DQo+IC0JY29uc3QgY2hh ciAqbmFtZSA9IHJ0ZV92ZGV2X2RldmljZV9uYW1lKGRldik7DQo+IC0JdWludDhfdCBzb2NrZXRf aWQgPSBkZXYtPmRldmljZS5udW1hX25vZGU7DQo+IC0Jc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUg KmludGVybmFscyA9IE5VTEw7DQo+IC0Jc3RydWN0IHJ0ZV9ldGhfZGV2ICpldGhfZGV2ID0gTlVM TDsNCj4gLQl1aW50MzJfdCB2bGFuX2ZpbHRlcl9ibXBfc2l6ZTsNCj4gLQ0KPiAtCS8qIG5vdyBk byBhbGwgZGF0YSBhbGxvY2F0aW9uIC0gZm9yIGV0aF9kZXYgc3RydWN0dXJlLCBkdW1teSBwY2kg ZHJpdmVyDQo+IC0JICogYW5kIGludGVybmFsIChwcml2YXRlKSBkYXRhDQo+IC0JICovDQo+IC0N Cj4gLQkvKiByZXNlcnZlIGFuIGV0aGRldiBlbnRyeSAqLw0KPiAtCWV0aF9kZXYgPSBydGVfZXRo X3ZkZXZfYWxsb2NhdGUoZGV2LCBzaXplb2YoKmludGVybmFscykpOw0KPiAtCWlmIChldGhfZGV2 ID09IE5VTEwpIHsNCj4gLQkJUlRFX0JPTkRfTE9HKEVSUiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBy dGVfZXRoX2RldiIpOw0KPiAtCQlnb3RvIGVycjsNCj4gLQl9DQo+IC0NCj4gLQlpbnRlcm5hbHMg PSBldGhfZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4gLQlldGhfZGV2LT5kYXRhLT5uYl9yeF9x dWV1ZXMgPSAodWludDE2X3QpMTsNCj4gLQlldGhfZGV2LT5kYXRhLT5uYl90eF9xdWV1ZXMgPSAo dWludDE2X3QpMTsNCj4gLQ0KPiAtCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3RvcmluZyBNQUMg YWRkcmVzc2VzICovDQo+IC0JZXRoX2Rldi0+ZGF0YS0+bWFjX2FkZHJzID0gcnRlX3ptYWxsb2Nf c29ja2V0KG5hbWUsIFJURV9FVEhFUl9BRERSX0xFTiAqDQo+IC0JCQlCT05EX01BWF9NQUNfQURE UlMsIDAsIHNvY2tldF9pZCk7DQo+IC0JaWYgKGV0aF9kZXYtPmRhdGEtPm1hY19hZGRycyA9PSBO VUxMKSB7DQo+IC0JCVJURV9CT05EX0xPRyhFUlIsDQo+IC0JCQkgICAgICJGYWlsZWQgdG8gYWxs b2NhdGUgJXUgYnl0ZXMgbmVlZGVkIHRvIHN0b3JlIE1BQyBhZGRyZXNzZXMiLA0KPiAtCQkJICAg ICBSVEVfRVRIRVJfQUREUl9MRU4gKiBCT05EX01BWF9NQUNfQUREUlMpOw0KPiAtCQlnb3RvIGVy cjsNCj4gLQl9DQo+IC0NCj4gLQlldGhfZGV2LT5kZXZfb3BzID0gJmRlZmF1bHRfZGV2X29wczsN Cj4gLQlldGhfZGV2LT5kYXRhLT5kZXZfZmxhZ3MgPSBSVEVfRVRIX0RFVl9JTlRSX0xTQyB8DQo+ IC0JCQkJCVJURV9FVEhfREVWX0FVVE9GSUxMX1FVRVVFX1hTVEFUUzsNCj4gLQ0KPiAtCXJ0ZV9z cGlubG9ja19pbml0KCZpbnRlcm5hbHMtPmxvY2spOw0KPiAtCXJ0ZV9zcGlubG9ja19pbml0KCZp bnRlcm5hbHMtPmxzY19sb2NrKTsNCj4gLQ0KPiAtCWludGVybmFscy0+cG9ydF9pZCA9IGV0aF9k ZXYtPmRhdGEtPnBvcnRfaWQ7DQo+IC0JaW50ZXJuYWxzLT5tb2RlID0gQk9ORElOR19NT0RFX0lO VkFMSUQ7DQo+IC0JaW50ZXJuYWxzLT5jdXJyZW50X3ByaW1hcnlfcG9ydCA9IFJURV9NQVhfRVRI UE9SVFMgKyAxOw0KPiAtCWludGVybmFscy0+YmFsYW5jZV94bWl0X3BvbGljeSA9IEJBTEFOQ0Vf WE1JVF9QT0xJQ1lfTEFZRVIyOw0KPiAtCWludGVybmFscy0+YnVyc3RfeG1pdF9oYXNoID0gYnVy c3RfeG1pdF9sMl9oYXNoOw0KPiAtCWludGVybmFscy0+dXNlcl9kZWZpbmVkX21hYyA9IDA7DQo+ IC0NCj4gLQlpbnRlcm5hbHMtPmxpbmtfc3RhdHVzX3BvbGxpbmdfZW5hYmxlZCA9IDA7DQo+IC0N Cj4gLQlpbnRlcm5hbHMtPmxpbmtfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMgPQ0KPiAtCQlE RUZBVUxUX1BPTExJTkdfSU5URVJWQUxfMTBfTVM7DQo+IC0JaW50ZXJuYWxzLT5saW5rX2Rvd25f ZGVsYXlfbXMgPSAwOw0KPiAtCWludGVybmFscy0+bGlua191cF9kZWxheV9tcyA9IDA7DQo+IC0N Cj4gLQlpbnRlcm5hbHMtPnNsYXZlX2NvdW50ID0gMDsNCj4gLQlpbnRlcm5hbHMtPmFjdGl2ZV9z bGF2ZV9jb3VudCA9IDA7DQo+IC0JaW50ZXJuYWxzLT5yeF9vZmZsb2FkX2NhcGEgPSAwOw0KPiAt CWludGVybmFscy0+dHhfb2ZmbG9hZF9jYXBhID0gMDsNCj4gLQlpbnRlcm5hbHMtPnJ4X3F1ZXVl X29mZmxvYWRfY2FwYSA9IDA7DQo+IC0JaW50ZXJuYWxzLT50eF9xdWV1ZV9vZmZsb2FkX2NhcGEg PSAwOw0KPiAtCWludGVybmFscy0+Y2FuZGlkYXRlX21heF9yeF9wa3RsZW4gPSAwOw0KPiAtCWlu dGVybmFscy0+bWF4X3J4X3BrdGxlbiA9IDA7DQo+IC0NCj4gLQkvKiBJbml0aWFsbHkgYWxsb3cg dG8gY2hvb3NlIGFueSBvZmZsb2FkIHR5cGUgKi8NCj4gLQlpbnRlcm5hbHMtPmZsb3dfdHlwZV9y c3Nfb2ZmbG9hZHMgPSBSVEVfRVRIX1JTU19QUk9UT19NQVNLOw0KPiAtDQo+IC0JbWVtc2V0KCZp bnRlcm5hbHMtPmRlZmF1bHRfcnhjb25mLCAwLA0KPiAtCSAgICAgICBzaXplb2YoaW50ZXJuYWxz LT5kZWZhdWx0X3J4Y29uZikpOw0KPiAtCW1lbXNldCgmaW50ZXJuYWxzLT5kZWZhdWx0X3R4Y29u ZiwgMCwNCj4gLQkgICAgICAgc2l6ZW9mKGludGVybmFscy0+ZGVmYXVsdF90eGNvbmYpKTsNCj4g LQ0KPiAtCW1lbXNldCgmaW50ZXJuYWxzLT5yeF9kZXNjX2xpbSwgMCwgc2l6ZW9mKGludGVybmFs cy0+cnhfZGVzY19saW0pKTsNCj4gLQltZW1zZXQoJmludGVybmFscy0+dHhfZGVzY19saW0sIDAs IHNpemVvZihpbnRlcm5hbHMtPnR4X2Rlc2NfbGltKSk7DQo+IC0NCj4gLQltZW1zZXQoaW50ZXJu YWxzLT5hY3RpdmVfc2xhdmVzLCAwLCBzaXplb2YoaW50ZXJuYWxzLT5hY3RpdmVfc2xhdmVzKSk7 DQo+IC0JbWVtc2V0KGludGVybmFscy0+c2xhdmVzLCAwLCBzaXplb2YoaW50ZXJuYWxzLT5zbGF2 ZXMpKTsNCj4gLQ0KPiAtCVRBSUxRX0lOSVQoJmludGVybmFscy0+Zmxvd19saXN0KTsNCj4gLQlp bnRlcm5hbHMtPmZsb3dfaXNvbGF0ZWRfdmFsaWQgPSAwOw0KPiAtDQo+IC0JLyogU2V0IG1vZGUg NCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8NCj4gLQlib25kX21vZGVfODAyM2FkX3NldHVwKGV0 aF9kZXYsIE5VTEwpOw0KPiAtCWlmIChib25kX2V0aGRldl9tb2RlX3NldChldGhfZGV2LCBtb2Rl KSkgew0KPiAtCQlSVEVfQk9ORF9MT0coRVJSLCAiRmFpbGVkIHRvIHNldCBib25kZWQgZGV2aWNl ICV1IG1vZGUgdG8gJXUiLA0KPiAtCQkJCSBldGhfZGV2LT5kYXRhLT5wb3J0X2lkLCBtb2RlKTsN Cj4gLQkJZ290byBlcnI7DQo+IC0JfQ0KPiAtDQo+IC0Jdmxhbl9maWx0ZXJfYm1wX3NpemUgPQ0K PiAtCQlydGVfYml0bWFwX2dldF9tZW1vcnlfZm9vdHByaW50KFJURV9FVEhFUl9NQVhfVkxBTl9J RCArIDEpOw0KPiAtCWludGVybmFscy0+dmxhbl9maWx0ZXJfYm1wbWVtID0gcnRlX21hbGxvYyhu YW1lLCB2bGFuX2ZpbHRlcl9ibXBfc2l6ZSwNCj4gLQkJCQkJCSAgIFJURV9DQUNIRV9MSU5FX1NJ WkUpOw0KPiAtCWlmIChpbnRlcm5hbHMtPnZsYW5fZmlsdGVyX2JtcG1lbSA9PSBOVUxMKSB7DQo+ IC0JCVJURV9CT05EX0xPRyhFUlIsDQo+IC0JCQkgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgdmxh biBiaXRtYXAgZm9yIGJvbmRlZCBkZXZpY2UgJXUiLA0KPiAtCQkJICAgICBldGhfZGV2LT5kYXRh LT5wb3J0X2lkKTsNCj4gLQkJZ290byBlcnI7DQo+IC0JfQ0KPiAtDQo+IC0JaW50ZXJuYWxzLT52 bGFuX2ZpbHRlcl9ibXAgPSBydGVfYml0bWFwX2luaXQoUlRFX0VUSEVSX01BWF9WTEFOX0lEICsg MSwNCj4gLQkJCWludGVybmFscy0+dmxhbl9maWx0ZXJfYm1wbWVtLCB2bGFuX2ZpbHRlcl9ibXBf c2l6ZSk7DQo+IC0JaWYgKGludGVybmFscy0+dmxhbl9maWx0ZXJfYm1wID09IE5VTEwpIHsNCj4g LQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4gLQkJCSAgICAgIkZhaWxlZCB0byBpbml0IHZsYW4gYml0 bWFwIGZvciBib25kZWQgZGV2aWNlICV1IiwNCj4gLQkJCSAgICAgZXRoX2Rldi0+ZGF0YS0+cG9y dF9pZCk7DQo+IC0JCXJ0ZV9mcmVlKGludGVybmFscy0+dmxhbl9maWx0ZXJfYm1wbWVtKTsNCj4g LQkJZ290byBlcnI7DQo+IC0JfQ0KPiAtDQo+IC0JcmV0dXJuIGV0aF9kZXYtPmRhdGEtPnBvcnRf aWQ7DQo+IC0NCj4gLWVycjoNCj4gLQlydGVfZnJlZShpbnRlcm5hbHMpOw0KPiAtCWlmIChldGhf ZGV2ICE9IE5VTEwpDQo+IC0JCWV0aF9kZXYtPmRhdGEtPmRldl9wcml2YXRlID0gTlVMTDsNCj4g LQlydGVfZXRoX2Rldl9yZWxlYXNlX3BvcnQoZXRoX2Rldik7DQo+IC0JcmV0dXJuIC0xOw0KPiAt fQ0KPiAtDQo+IC1zdGF0aWMgaW50DQo+IC1ib25kX3Byb2JlKHN0cnVjdCBydGVfdmRldl9kZXZp Y2UgKmRldikNCj4gLXsNCj4gLQljb25zdCBjaGFyICpuYW1lOw0KPiAtCXN0cnVjdCBib25kX2Rl dl9wcml2YXRlICppbnRlcm5hbHM7DQo+IC0Jc3RydWN0IHJ0ZV9rdmFyZ3MgKmt2bGlzdDsNCj4g LQl1aW50OF90IGJvbmRpbmdfbW9kZTsNCj4gLQlpbnQgYXJnX2NvdW50LCBwb3J0X2lkOw0KPiAt CWludCBzb2NrZXRfaWQ7DQo+IC0JdWludDhfdCBhZ2dfbW9kZTsNCj4gLQlzdHJ1Y3QgcnRlX2V0 aF9kZXYgKmV0aF9kZXY7DQo+IC0NCj4gLQlpZiAoIWRldikNCj4gLQkJcmV0dXJuIC1FSU5WQUw7 DQo+IC0NCj4gLQluYW1lID0gcnRlX3ZkZXZfZGV2aWNlX25hbWUoZGV2KTsNCj4gLQlSVEVfQk9O RF9MT0coSU5GTywgIkluaXRpYWxpemluZyBwbWRfYm9uZCBmb3IgJXMiLCBuYW1lKTsNCj4gLQ0K PiAtCWlmIChydGVfZWFsX3Byb2Nlc3NfdHlwZSgpID09IFJURV9QUk9DX1NFQ09OREFSWSkgew0K PiAtCQlldGhfZGV2ID0gcnRlX2V0aF9kZXZfYXR0YWNoX3NlY29uZGFyeShuYW1lKTsNCj4gLQkJ aWYgKCFldGhfZGV2KSB7DQo+IC0JCQlSVEVfQk9ORF9MT0coRVJSLCAiRmFpbGVkIHRvIHByb2Jl ICVzIiwgbmFtZSk7DQo+IC0JCQlyZXR1cm4gLTE7DQo+IC0JCX0NCj4gLQkJLyogVE9ETzogcmVx dWVzdCBpbmZvIGZyb20gcHJpbWFyeSB0byBzZXQgdXAgUnggYW5kIFR4ICovDQo+IC0JCWV0aF9k ZXYtPmRldl9vcHMgPSAmZGVmYXVsdF9kZXZfb3BzOw0KPiAtCQlldGhfZGV2LT5kZXZpY2UgPSAm ZGV2LT5kZXZpY2U7DQo+IC0JCXJ0ZV9ldGhfZGV2X3Byb2JpbmdfZmluaXNoKGV0aF9kZXYpOw0K PiAtCQlyZXR1cm4gMDsNCj4gLQl9DQo+IC0NCj4gLQlrdmxpc3QgPSBydGVfa3ZhcmdzX3BhcnNl KHJ0ZV92ZGV2X2RldmljZV9hcmdzKGRldiksDQo+IC0JCXBtZF9ib25kX2luaXRfdmFsaWRfYXJn dW1lbnRzKTsNCj4gLQlpZiAoa3ZsaXN0ID09IE5VTEwpIHsNCj4gLQkJUlRFX0JPTkRfTE9HKEVS UiwgIkludmFsaWQgYXJncyBpbiAlcyIsIHJ0ZV92ZGV2X2RldmljZV9hcmdzKGRldikpOw0KPiAt CQlyZXR1cm4gLTE7DQo+IC0JfQ0KPiAtDQo+IC0JLyogUGFyc2UgbGluayBib25kaW5nIG1vZGUg Ki8NCj4gLQlpZiAocnRlX2t2YXJnc19jb3VudChrdmxpc3QsIFBNRF9CT05EX01PREVfS1ZBUkcp ID09IDEpIHsNCj4gLQkJaWYgKHJ0ZV9rdmFyZ3NfcHJvY2Vzcyhrdmxpc3QsIFBNRF9CT05EX01P REVfS1ZBUkcsDQo+IC0JCQkJJmJvbmRfZXRoZGV2X3BhcnNlX3NsYXZlX21vZGVfa3ZhcmcsDQo+ IC0JCQkJJmJvbmRpbmdfbW9kZSkgIT0gMCkgew0KPiAtCQkJUlRFX0JPTkRfTE9HKEVSUiwgIklu dmFsaWQgbW9kZSBmb3IgYm9uZGVkIGRldmljZSAlcyIsDQo+IC0JCQkJCW5hbWUpOw0KPiAtCQkJ Z290byBwYXJzZV9lcnJvcjsNCj4gLQkJfQ0KPiAtCX0gZWxzZSB7DQo+IC0JCVJURV9CT05EX0xP RyhFUlIsICJNb2RlIG11c3QgYmUgc3BlY2lmaWVkIG9ubHkgb25jZSBmb3IgYm9uZGVkICINCj4g LQkJCQkiZGV2aWNlICVzIiwgbmFtZSk7DQo+IC0JCWdvdG8gcGFyc2VfZXJyb3I7DQo+IC0JfQ0K PiAtDQo+IC0JLyogUGFyc2Ugc29ja2V0IGlkIHRvIGNyZWF0ZSBib25kaW5nIGRldmljZSBvbiAq Lw0KPiAtCWFyZ19jb3VudCA9IHJ0ZV9rdmFyZ3NfY291bnQoa3ZsaXN0LCBQTURfQk9ORF9TT0NL RVRfSURfS1ZBUkcpOw0KPiAtCWlmIChhcmdfY291bnQgPT0gMSkgew0KPiAtCQlpZiAocnRlX2t2 YXJnc19wcm9jZXNzKGt2bGlzdCwgUE1EX0JPTkRfU09DS0VUX0lEX0tWQVJHLA0KPiAtCQkJCSZi b25kX2V0aGRldl9wYXJzZV9zb2NrZXRfaWRfa3ZhcmcsICZzb2NrZXRfaWQpDQo+IC0JCQkJIT0g MCkgew0KPiAtCQkJUlRFX0JPTkRfTE9HKEVSUiwgIkludmFsaWQgc29ja2V0IElkIHNwZWNpZmll ZCBmb3IgIg0KPiAtCQkJCQkiYm9uZGVkIGRldmljZSAlcyIsIG5hbWUpOw0KPiAtCQkJZ290byBw YXJzZV9lcnJvcjsNCj4gLQkJfQ0KPiAtCX0gZWxzZSBpZiAoYXJnX2NvdW50ID4gMSkgew0KPiAt CQlSVEVfQk9ORF9MT0coRVJSLCAiU29ja2V0IElkIGNhbiBiZSBzcGVjaWZpZWQgb25seSBvbmNl IGZvciAiDQo+IC0JCQkJImJvbmRlZCBkZXZpY2UgJXMiLCBuYW1lKTsNCj4gLQkJZ290byBwYXJz ZV9lcnJvcjsNCj4gLQl9IGVsc2Ugew0KPiAtCQlzb2NrZXRfaWQgPSBydGVfc29ja2V0X2lkKCk7 DQo+IC0JfQ0KPiAtDQo+IC0JZGV2LT5kZXZpY2UubnVtYV9ub2RlID0gc29ja2V0X2lkOw0KPiAt DQo+IC0JLyogQ3JlYXRlIGxpbmsgYm9uZGluZyBldGggZGV2aWNlICovDQo+IC0JcG9ydF9pZCA9 IGJvbmRfYWxsb2MoZGV2LCBib25kaW5nX21vZGUpOw0KPiAtCWlmIChwb3J0X2lkIDwgMCkgew0K PiAtCQlSVEVfQk9ORF9MT0coRVJSLCAiRmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQgJXMgaW4gbW9k ZSAldSBvbiAiDQo+IC0JCQkJInNvY2tldCAldS4iLAluYW1lLCBib25kaW5nX21vZGUsIHNvY2tl dF9pZCk7DQo+IC0JCWdvdG8gcGFyc2VfZXJyb3I7DQo+IC0JfQ0KPiAtCWludGVybmFscyA9IHJ0 ZV9ldGhfZGV2aWNlc1twb3J0X2lkXS5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4gLQlpbnRlcm5hbHMt Pmt2bGlzdCA9IGt2bGlzdDsNCj4gLQ0KPiAtCWlmIChydGVfa3ZhcmdzX2NvdW50KGt2bGlzdCwg UE1EX0JPTkRfQUdHX01PREVfS1ZBUkcpID09IDEpIHsNCj4gLQkJaWYgKHJ0ZV9rdmFyZ3NfcHJv Y2Vzcyhrdmxpc3QsDQo+IC0JCQkJUE1EX0JPTkRfQUdHX01PREVfS1ZBUkcsDQo+IC0JCQkJJmJv bmRfZXRoZGV2X3BhcnNlX3NsYXZlX2FnZ19tb2RlX2t2YXJnLA0KPiAtCQkJCSZhZ2dfbW9kZSkg IT0gMCkgew0KPiAtCQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4gLQkJCQkJIkZhaWxlZCB0byBwYXJz ZSBhZ2cgc2VsZWN0aW9uIG1vZGUgZm9yIGJvbmRlZCBkZXZpY2UgJXMiLA0KPiAtCQkJCQluYW1l KTsNCj4gLQkJCWdvdG8gcGFyc2VfZXJyb3I7DQo+IC0JCX0NCj4gLQ0KPiAtCQlpZiAoaW50ZXJu YWxzLT5tb2RlID09IEJPTkRJTkdfTU9ERV84MDIzQUQpDQo+IC0JCQlpbnRlcm5hbHMtPm1vZGU0 LmFnZ19zZWxlY3Rpb24gPSBhZ2dfbW9kZTsNCj4gLQl9IGVsc2Ugew0KPiAtCQlpbnRlcm5hbHMt Pm1vZGU0LmFnZ19zZWxlY3Rpb24gPSBBR0dfU1RBQkxFOw0KPiAtCX0NCj4gLQ0KPiAtCXJ0ZV9l dGhfZGV2X3Byb2JpbmdfZmluaXNoKCZydGVfZXRoX2RldmljZXNbcG9ydF9pZF0pOw0KPiAtCVJU RV9CT05EX0xPRyhJTkZPLCAiQ3JlYXRlIGJvbmRlZCBkZXZpY2UgJXMgb24gcG9ydCAlZCBpbiBt b2RlICV1IG9uICINCj4gLQkJCSJzb2NrZXQgJXUuIiwJbmFtZSwgcG9ydF9pZCwgYm9uZGluZ19t b2RlLCBzb2NrZXRfaWQpOw0KPiAtCXJldHVybiAwOw0KPiAtDQo+IC1wYXJzZV9lcnJvcjoNCj4g LQlydGVfa3ZhcmdzX2ZyZWUoa3ZsaXN0KTsNCj4gLQ0KPiAtCXJldHVybiAtMTsNCj4gLX0NCj4g LQ0KPiAtc3RhdGljIGludA0KPiAtYm9uZF9yZW1vdmUoc3RydWN0IHJ0ZV92ZGV2X2RldmljZSAq ZGV2KQ0KPiAtew0KPiAtCXN0cnVjdCBydGVfZXRoX2RldiAqZXRoX2RldjsNCj4gLQlzdHJ1Y3Qg Ym9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzOw0KPiAtCWNvbnN0IGNoYXIgKm5hbWU7DQo+IC0J aW50IHJldCA9IDA7DQo+IC0NCj4gLQlpZiAoIWRldikNCj4gLQkJcmV0dXJuIC1FSU5WQUw7DQo+ IC0NCj4gLQluYW1lID0gcnRlX3ZkZXZfZGV2aWNlX25hbWUoZGV2KTsNCj4gLQlSVEVfQk9ORF9M T0coSU5GTywgIlVuaW5pdGlhbGl6aW5nIHBtZF9ib25kIGZvciAlcyIsIG5hbWUpOw0KPiAtDQo+ IC0JLyogZmluZCBhbiBldGhkZXYgZW50cnkgKi8NCj4gLQlldGhfZGV2ID0gcnRlX2V0aF9kZXZf YWxsb2NhdGVkKG5hbWUpOw0KPiAtCWlmIChldGhfZGV2ID09IE5VTEwpDQo+IC0JCXJldHVybiAw OyAvKiBwb3J0IGFscmVhZHkgcmVsZWFzZWQgKi8NCj4gLQ0KPiAtCWlmIChydGVfZWFsX3Byb2Nl c3NfdHlwZSgpICE9IFJURV9QUk9DX1BSSU1BUlkpDQo+IC0JCXJldHVybiBydGVfZXRoX2Rldl9y ZWxlYXNlX3BvcnQoZXRoX2Rldik7DQo+IC0NCj4gLQlSVEVfQVNTRVJUKGV0aF9kZXYtPmRldmlj ZSA9PSAmZGV2LT5kZXZpY2UpOw0KPiAtDQo+IC0JaW50ZXJuYWxzID0gZXRoX2Rldi0+ZGF0YS0+ ZGV2X3ByaXZhdGU7DQo+IC0JaWYgKGludGVybmFscy0+c2xhdmVfY291bnQgIT0gMCkNCj4gLQkJ cmV0dXJuIC1FQlVTWTsNCj4gLQ0KPiAtCWlmIChldGhfZGV2LT5kYXRhLT5kZXZfc3RhcnRlZCA9 PSAxKSB7DQo+IC0JCXJldCA9IGJvbmRfZXRoZGV2X3N0b3AoZXRoX2Rldik7DQo+IC0JCWJvbmRf ZXRoZGV2X2Nsb3NlKGV0aF9kZXYpOw0KPiAtCX0NCj4gLQlydGVfZXRoX2Rldl9yZWxlYXNlX3Bv cnQoZXRoX2Rldik7DQo+IC0NCj4gLQlyZXR1cm4gcmV0Ow0KPiAtfQ0KPiAtDQo+IC0vKiB0aGlz IHBhcnQgd2lsbCByZXNvbHZlIHRoZSBzbGF2ZSBwb3J0aWRzIGFmdGVyIGFsbCB0aGUgb3RoZXIg cGRldiBhbmQgdmRldg0KPiAtICogaGF2ZSBiZWVuIGFsbG9jYXRlZCAqLw0KPiAtc3RhdGljIGlu dA0KPiAtYm9uZF9ldGhkZXZfY29uZmlndXJlKHN0cnVjdCBydGVfZXRoX2RldiAqZGV2KQ0KPiAt ew0KPiAtCWNvbnN0IGNoYXIgKm5hbWUgPSBkZXYtPmRldmljZS0+bmFtZTsNCj4gLQlzdHJ1Y3Qg Ym9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4g LQlzdHJ1Y3QgcnRlX2t2YXJncyAqa3ZsaXN0ID0gaW50ZXJuYWxzLT5rdmxpc3Q7DQo+IC0JdWlu dDY0X3Qgb2ZmbG9hZHM7DQo+IC0JaW50IGFyZ19jb3VudDsNCj4gLQl1aW50MTZfdCBwb3J0X2lk ID0gZGV2IC0gcnRlX2V0aF9kZXZpY2VzOw0KPiAtCXVpbnQ4X3QgYWdnX21vZGU7DQo+IC0NCj4g LQlzdGF0aWMgY29uc3QgdWludDhfdCBkZWZhdWx0X3Jzc19rZXlbNDBdID0gew0KPiAtCQkweDZE LCAweDVBLCAweDU2LCAweERBLCAweDI1LCAweDVCLCAweDBFLCAweEMyLCAweDQxLCAweDY3LCAw eDI1LCAweDNELA0KPiAtCQkweDQzLCAweEEzLCAweDhGLCAweEIwLCAweEQwLCAweENBLCAweDJC LCAweENCLCAweEFFLCAweDdCLCAweDMwLCAweEI0LA0KPiAtCQkweDc3LCAweENCLCAweDJELCAw eEEzLCAweDgwLCAweDMwLCAweEYyLCAweDBDLCAweDZBLCAweDQyLCAweEI3LCAweDNCLA0KPiAt CQkweEJFLCAweEFDLCAweDAxLCAweEZBDQo+IC0JfTsNCj4gLQ0KPiAtCXVuc2lnbmVkIGksIGo7 DQo+IC0NCj4gLQkvKg0KPiAtCSAqIElmIFJTUyBpcyBlbmFibGVkLCBmaWxsIHRhYmxlIHdpdGgg ZGVmYXVsdCB2YWx1ZXMgYW5kDQo+IC0JICogc2V0IGtleSB0byB0aGUgdmFsdWUgc3BlY2lmaWVk IGluIHBvcnQgUlNTIGNvbmZpZ3VyYXRpb24uDQo+IC0JICogRmFsbCBiYWNrIHRvIGRlZmF1bHQg UlNTIGtleSBpZiB0aGUga2V5IGlzIG5vdCBzcGVjaWZpZWQNCj4gLQkgKi8NCj4gLQlpZiAoZGV2 LT5kYXRhLT5kZXZfY29uZi5yeG1vZGUubXFfbW9kZSAmIFJURV9FVEhfTVFfUlhfUlNTKSB7DQo+ IC0JCXN0cnVjdCBydGVfZXRoX3Jzc19jb25mICpyc3NfY29uZiA9DQo+IC0JCQkmZGV2LT5kYXRh LT5kZXZfY29uZi5yeF9hZHZfY29uZi5yc3NfY29uZjsNCj4gLQ0KPiAtCQlpZiAoaW50ZXJuYWxz LT5yc3Nfa2V5X2xlbiA9PSAwKSB7DQo+IC0JCQlpbnRlcm5hbHMtPnJzc19rZXlfbGVuID0gc2l6 ZW9mKGRlZmF1bHRfcnNzX2tleSk7DQo+IC0JCX0NCj4gLQ0KPiAtCQlpZiAocnNzX2NvbmYtPnJz c19rZXkgIT0gTlVMTCkgew0KPiAtCQkJaWYgKGludGVybmFscy0+cnNzX2tleV9sZW4gPiByc3Nf Y29uZi0+cnNzX2tleV9sZW4pIHsNCj4gLQkJCQlSVEVfQk9ORF9MT0coRVJSLCAiSW52YWxpZCBy c3Mga2V5IGxlbmd0aCgldSkiLA0KPiAtCQkJCQkJcnNzX2NvbmYtPnJzc19rZXlfbGVuKTsNCj4g LQkJCQlyZXR1cm4gLUVJTlZBTDsNCj4gLQkJCX0NCj4gLQ0KPiAtCQkJbWVtY3B5KGludGVybmFs cy0+cnNzX2tleSwgcnNzX2NvbmYtPnJzc19rZXksDQo+IC0JCQkgICAgICAgaW50ZXJuYWxzLT5y c3Nfa2V5X2xlbik7DQo+IC0JCX0gZWxzZSB7DQo+IC0JCQlpZiAoaW50ZXJuYWxzLT5yc3Nfa2V5 X2xlbiA+IHNpemVvZihkZWZhdWx0X3Jzc19rZXkpKSB7DQo+IC0JCQkJLyoNCj4gLQkJCQkgKiBJ ZiB0aGUgcnNzX2tleSBpbmNsdWRlcyBzdGFuZGFyZF9yc3Nfa2V5IGFuZA0KPiAtCQkJCSAqIGV4 dGVuZGVkX2hhc2hfa2V5LCB0aGUgcnNzIGtleSBsZW5ndGggd2lsbCBiZQ0KPiAtCQkJCSAqIGxh cmdlciB0aGFuIGRlZmF1bHQgcnNzIGtleSBsZW5ndGgsIHNvIGl0IHNob3VsZA0KPiAtCQkJCSAq IHJlLWNhbGN1bGF0ZSB0aGUgaGFzaCBrZXkuDQo+IC0JCQkJICovDQo+IC0JCQkJZm9yIChpID0g MDsgaSA8IGludGVybmFscy0+cnNzX2tleV9sZW47IGkrKykNCj4gLQkJCQkJaW50ZXJuYWxzLT5y c3Nfa2V5W2ldID0gKHVpbnQ4X3QpcnRlX3JhbmQoKTsNCj4gLQkJCX0gZWxzZSB7DQo+IC0JCQkJ bWVtY3B5KGludGVybmFscy0+cnNzX2tleSwgZGVmYXVsdF9yc3Nfa2V5LA0KPiAtCQkJCQlpbnRl cm5hbHMtPnJzc19rZXlfbGVuKTsNCj4gLQkJCX0NCj4gLQkJfQ0KPiAtDQo+IC0JCWZvciAoaSA9 IDA7IGkgPCBSVEVfRElNKGludGVybmFscy0+cmV0YV9jb25mKTsgaSsrKSB7DQo+IC0JCQlpbnRl cm5hbHMtPnJldGFfY29uZltpXS5tYXNrID0gfjBMTDsNCj4gLQkJCWZvciAoaiA9IDA7IGogPCBS VEVfRVRIX1JFVEFfR1JPVVBfU0laRTsgaisrKQ0KPiAtCQkJCWludGVybmFscy0+cmV0YV9jb25m W2ldLnJldGFbal0gPQ0KPiAtCQkJCQkJKGkgKiBSVEVfRVRIX1JFVEFfR1JPVVBfU0laRSArIGop ICUNCj4gLQkJCQkJCWRldi0+ZGF0YS0+bmJfcnhfcXVldWVzOw0KPiAtCQl9DQo+IC0JfQ0KPiAt DQo+IC0Jb2ZmbG9hZHMgPSBkZXYtPmRhdGEtPmRldl9jb25mLnR4bW9kZS5vZmZsb2FkczsNCj4g LQlpZiAoKG9mZmxvYWRzICYgUlRFX0VUSF9UWF9PRkZMT0FEX01CVUZfRkFTVF9GUkVFKSAmJg0K PiAtCQkJKGludGVybmFscy0+bW9kZSA9PSBCT05ESU5HX01PREVfODAyM0FEIHx8DQo+IC0JCQlp bnRlcm5hbHMtPm1vZGUgPT0gQk9ORElOR19NT0RFX0JST0FEQ0FTVCkpIHsNCj4gLQkJUlRFX0JP TkRfTE9HKFdBUk5JTkcsDQo+IC0JCQkiYm9uZCBtb2RlIGJyb2FkY2FzdCAmIDgwMjNBRCBkb24n dCBzdXBwb3J0IE1CVUZfRkFTVF9GUkVFIG9mZmxvYWQsIGZvcmNlIGRpc2FibGUgaXQuIik7DQo+ IC0JCW9mZmxvYWRzICY9IH5SVEVfRVRIX1RYX09GRkxPQURfTUJVRl9GQVNUX0ZSRUU7DQo+IC0J CWRldi0+ZGF0YS0+ZGV2X2NvbmYudHhtb2RlLm9mZmxvYWRzID0gb2ZmbG9hZHM7DQo+IC0JfQ0K PiAtDQo+IC0JLyogc2V0IHRoZSBtYXhfcnhfcGt0bGVuICovDQo+IC0JaW50ZXJuYWxzLT5tYXhf cnhfcGt0bGVuID0gaW50ZXJuYWxzLT5jYW5kaWRhdGVfbWF4X3J4X3BrdGxlbjsNCj4gLQ0KPiAt CS8qDQo+IC0JICogaWYgbm8ga3ZsaXN0LCBpdCBtZWFucyB0aGF0IHRoaXMgYm9uZGVkIGRldmlj ZSBoYXMgYmVlbiBjcmVhdGVkDQo+IC0JICogdGhyb3VnaCB0aGUgYm9uZGluZyBhcGkuDQo+IC0J ICovDQo+IC0JaWYgKCFrdmxpc3QpDQo+IC0JCXJldHVybiAwOw0KPiAtDQo+IC0JLyogUGFyc2Ug TUFDIGFkZHJlc3MgZm9yIGJvbmRlZCBkZXZpY2UgKi8NCj4gLQlhcmdfY291bnQgPSBydGVfa3Zh cmdzX2NvdW50KGt2bGlzdCwgUE1EX0JPTkRfTUFDX0FERFJfS1ZBUkcpOw0KPiAtCWlmIChhcmdf Y291bnQgPT0gMSkgew0KPiAtCQlzdHJ1Y3QgcnRlX2V0aGVyX2FkZHIgYm9uZF9tYWM7DQo+IC0N Cj4gLQkJaWYgKHJ0ZV9rdmFyZ3NfcHJvY2Vzcyhrdmxpc3QsIFBNRF9CT05EX01BQ19BRERSX0tW QVJHLA0KPiAtCQkJCSAgICAgICAmYm9uZF9ldGhkZXZfcGFyc2VfYm9uZF9tYWNfYWRkcl9rdmFy ZywgJmJvbmRfbWFjKSA8IDApIHsNCj4gLQkJCVJURV9CT05EX0xPRyhJTkZPLCAiSW52YWxpZCBt YWMgYWRkcmVzcyBmb3IgYm9uZGVkIGRldmljZSAlcyIsDQo+IC0JCQkJICAgICBuYW1lKTsNCj4g LQkJCXJldHVybiAtMTsNCj4gLQkJfQ0KPiAtDQo+IC0JCS8qIFNldCBNQUMgYWRkcmVzcyAqLw0K PiAtCQlpZiAocnRlX2V0aF9ib25kX21hY19hZGRyZXNzX3NldChwb3J0X2lkLCAmYm9uZF9tYWMp ICE9IDApIHsNCj4gLQkJCVJURV9CT05EX0xPRyhFUlIsDQo+IC0JCQkJICAgICAiRmFpbGVkIHRv IHNldCBtYWMgYWRkcmVzcyBvbiBib25kZWQgZGV2aWNlICVzIiwNCj4gLQkJCQkgICAgIG5hbWUp Ow0KPiAtCQkJcmV0dXJuIC0xOw0KPiAtCQl9DQo+IC0JfSBlbHNlIGlmIChhcmdfY291bnQgPiAx KSB7DQo+IC0JCVJURV9CT05EX0xPRyhFUlIsDQo+IC0JCQkgICAgICJNQUMgYWRkcmVzcyBjYW4g YmUgc3BlY2lmaWVkIG9ubHkgb25jZSBmb3IgYm9uZGVkIGRldmljZSAlcyIsDQo+IC0JCQkgICAg IG5hbWUpOw0KPiAtCQlyZXR1cm4gLTE7DQo+IC0JfQ0KPiAtDQo+IC0JLyogUGFyc2Uvc2V0IGJh bGFuY2UgbW9kZSB0cmFuc21pdCBwb2xpY3kgKi8NCj4gLQlhcmdfY291bnQgPSBydGVfa3Zhcmdz X2NvdW50KGt2bGlzdCwgUE1EX0JPTkRfWE1JVF9QT0xJQ1lfS1ZBUkcpOw0KPiAtCWlmIChhcmdf Y291bnQgPT0gMSkgew0KPiAtCQl1aW50OF90IHhtaXRfcG9saWN5Ow0KPiAtDQo+IC0JCWlmIChy dGVfa3ZhcmdzX3Byb2Nlc3Moa3ZsaXN0LCBQTURfQk9ORF9YTUlUX1BPTElDWV9LVkFSRywNCj4g LQkJCQkgICAgICAgJmJvbmRfZXRoZGV2X3BhcnNlX2JhbGFuY2VfeG1pdF9wb2xpY3lfa3Zhcmcs ICZ4bWl0X3BvbGljeSkgIT0NCj4gLQkJICAgIDApIHsNCj4gLQkJCVJURV9CT05EX0xPRyhJTkZP LA0KPiAtCQkJCSAgICAgIkludmFsaWQgeG1pdCBwb2xpY3kgc3BlY2lmaWVkIGZvciBib25kZWQg ZGV2aWNlICVzIiwNCj4gLQkJCQkgICAgIG5hbWUpOw0KPiAtCQkJcmV0dXJuIC0xOw0KPiAtCQl9 DQo+IC0NCj4gLQkJLyogU2V0IGJhbGFuY2UgbW9kZSB0cmFuc21pdCBwb2xpY3kqLw0KPiAtCQlp ZiAocnRlX2V0aF9ib25kX3htaXRfcG9saWN5X3NldChwb3J0X2lkLCB4bWl0X3BvbGljeSkgIT0g MCkgew0KPiAtCQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4gLQkJCQkgICAgICJGYWlsZWQgdG8gc2V0 IGJhbGFuY2UgeG1pdCBwb2xpY3kgb24gYm9uZGVkIGRldmljZSAlcyIsDQo+IC0JCQkJICAgICBu YW1lKTsNCj4gLQkJCXJldHVybiAtMTsNCj4gLQkJfQ0KPiAtCX0gZWxzZSBpZiAoYXJnX2NvdW50 ID4gMSkgew0KPiAtCQlSVEVfQk9ORF9MT0coRVJSLA0KPiAtCQkJICAgICAiVHJhbnNtaXQgcG9s aWN5IGNhbiBiZSBzcGVjaWZpZWQgb25seSBvbmNlIGZvciBib25kZWQgZGV2aWNlICVzIiwNCj4g LQkJCSAgICAgbmFtZSk7DQo+IC0JCXJldHVybiAtMTsNCj4gLQl9DQo+IC0NCj4gLQlpZiAocnRl X2t2YXJnc19jb3VudChrdmxpc3QsIFBNRF9CT05EX0FHR19NT0RFX0tWQVJHKSA9PSAxKSB7DQo+ IC0JCWlmIChydGVfa3ZhcmdzX3Byb2Nlc3Moa3ZsaXN0LA0KPiAtCQkJCSAgICAgICBQTURfQk9O RF9BR0dfTU9ERV9LVkFSRywNCj4gLQkJCQkgICAgICAgJmJvbmRfZXRoZGV2X3BhcnNlX3NsYXZl X2FnZ19tb2RlX2t2YXJnLA0KPiAtCQkJCSAgICAgICAmYWdnX21vZGUpICE9IDApIHsNCj4gLQkJ CVJURV9CT05EX0xPRyhFUlIsDQo+IC0JCQkJICAgICAiRmFpbGVkIHRvIHBhcnNlIGFnZyBzZWxl Y3Rpb24gbW9kZSBmb3IgYm9uZGVkIGRldmljZSAlcyIsDQo+IC0JCQkJICAgICBuYW1lKTsNCj4g LQkJfQ0KPiAtCQlpZiAoaW50ZXJuYWxzLT5tb2RlID09IEJPTkRJTkdfTU9ERV84MDIzQUQpIHsN Cj4gLQkJCWludCByZXQgPSBydGVfZXRoX2JvbmRfODAyM2FkX2FnZ19zZWxlY3Rpb25fc2V0KHBv cnRfaWQsDQo+IC0JCQkJCWFnZ19tb2RlKTsNCj4gLQkJCWlmIChyZXQgPCAwKSB7DQo+IC0JCQkJ UlRFX0JPTkRfTE9HKEVSUiwNCj4gLQkJCQkJIkludmFsaWQgYXJncyBmb3IgYWdnIHNlbGVjdGlv biBzZXQgZm9yIGJvbmRlZCBkZXZpY2UgJXMiLA0KPiAtCQkJCQluYW1lKTsNCj4gLQkJCQlyZXR1 cm4gLTE7DQo+IC0JCQl9DQo+IC0JCX0NCj4gLQl9DQo+IC0NCj4gLQkvKiBQYXJzZS9hZGQgc2xh dmUgcG9ydHMgdG8gYm9uZGVkIGRldmljZSAqLw0KPiAtCWlmIChydGVfa3ZhcmdzX2NvdW50KGt2 bGlzdCwgUE1EX0JPTkRfU0xBVkVfUE9SVF9LVkFSRykgPiAwKSB7DQo+IC0JCXN0cnVjdCBib25k X2V0aGRldl9zbGF2ZV9wb3J0cyBzbGF2ZV9wb3J0czsNCj4gLQkJdW5zaWduZWQgaTsNCj4gLQ0K PiAtCQltZW1zZXQoJnNsYXZlX3BvcnRzLCAwLCBzaXplb2Yoc2xhdmVfcG9ydHMpKTsNCj4gLQ0K PiAtCQlpZiAocnRlX2t2YXJnc19wcm9jZXNzKGt2bGlzdCwgUE1EX0JPTkRfU0xBVkVfUE9SVF9L VkFSRywNCj4gLQkJCQkgICAgICAgJmJvbmRfZXRoZGV2X3BhcnNlX3NsYXZlX3BvcnRfa3Zhcmcs ICZzbGF2ZV9wb3J0cykgIT0gMCkgew0KPiAtCQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4gLQkJCQkg ICAgICJGYWlsZWQgdG8gcGFyc2Ugc2xhdmUgcG9ydHMgZm9yIGJvbmRlZCBkZXZpY2UgJXMiLA0K PiAtCQkJCSAgICAgbmFtZSk7DQo+IC0JCQlyZXR1cm4gLTE7DQo+IC0JCX0NCj4gLQ0KPiAtCQlm b3IgKGkgPSAwOyBpIDwgc2xhdmVfcG9ydHMuc2xhdmVfY291bnQ7IGkrKykgew0KPiAtCQkJaWYg KHJ0ZV9ldGhfYm9uZF9zbGF2ZV9hZGQocG9ydF9pZCwgc2xhdmVfcG9ydHMuc2xhdmVzW2ldKSAh PSAwKSB7DQo+IC0JCQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4gLQkJCQkJICAgICAiRmFpbGVkIHRv IGFkZCBwb3J0ICVkIGFzIHNsYXZlIHRvIGJvbmRlZCBkZXZpY2UgJXMiLA0KPiAtCQkJCQkgICAg IHNsYXZlX3BvcnRzLnNsYXZlc1tpXSwgbmFtZSk7DQo+IC0JCQl9DQo+IC0JCX0NCj4gLQ0KPiAt CX0gZWxzZSB7DQo+IC0JCVJURV9CT05EX0xPRyhJTkZPLCAiTm8gc2xhdmVzIHNwZWNpZmllZCBm b3IgYm9uZGVkIGRldmljZSAlcyIsIG5hbWUpOw0KPiAtCQlyZXR1cm4gLTE7DQo+IC0JfQ0KPiAt DQo+IC0JLyogUGFyc2Uvc2V0IHByaW1hcnkgc2xhdmUgcG9ydCBpZCovDQo+IC0JYXJnX2NvdW50 ID0gcnRlX2t2YXJnc19jb3VudChrdmxpc3QsIFBNRF9CT05EX1BSSU1BUllfU0xBVkVfS1ZBUkcp Ow0KPiAtCWlmIChhcmdfY291bnQgPT0gMSkgew0KPiAtCQl1aW50MTZfdCBwcmltYXJ5X3NsYXZl X3BvcnRfaWQ7DQo+IC0NCj4gLQkJaWYgKHJ0ZV9rdmFyZ3NfcHJvY2Vzcyhrdmxpc3QsDQo+IC0J CQkJICAgICAgIFBNRF9CT05EX1BSSU1BUllfU0xBVkVfS1ZBUkcsDQo+IC0JCQkJICAgICAgICZi b25kX2V0aGRldl9wYXJzZV9wcmltYXJ5X3NsYXZlX3BvcnRfaWRfa3ZhcmcsDQo+IC0JCQkJICAg ICAgICZwcmltYXJ5X3NsYXZlX3BvcnRfaWQpIDwgMCkgew0KPiAtCQkJUlRFX0JPTkRfTE9HKElO Rk8sDQo+IC0JCQkJICAgICAiSW52YWxpZCBwcmltYXJ5IHNsYXZlIHBvcnQgaWQgc3BlY2lmaWVk IGZvciBib25kZWQgZGV2aWNlICVzIiwNCj4gLQkJCQkgICAgIG5hbWUpOw0KPiAtCQkJcmV0dXJu IC0xOw0KPiAtCQl9DQo+IC0NCj4gLQkJLyogU2V0IGJhbGFuY2UgbW9kZSB0cmFuc21pdCBwb2xp Y3kqLw0KPiAtCQlpZiAocnRlX2V0aF9ib25kX3ByaW1hcnlfc2V0KHBvcnRfaWQsIHByaW1hcnlf c2xhdmVfcG9ydF9pZCkNCj4gLQkJICAgICE9IDApIHsNCj4gLQkJCVJURV9CT05EX0xPRyhFUlIs DQo+IC0JCQkJICAgICAiRmFpbGVkIHRvIHNldCBwcmltYXJ5IHNsYXZlIHBvcnQgJWQgb24gYm9u ZGVkIGRldmljZSAlcyIsDQo+IC0JCQkJICAgICBwcmltYXJ5X3NsYXZlX3BvcnRfaWQsIG5hbWUp Ow0KPiAtCQkJcmV0dXJuIC0xOw0KPiAtCQl9DQo+IC0JfSBlbHNlIGlmIChhcmdfY291bnQgPiAx KSB7DQo+IC0JCVJURV9CT05EX0xPRyhJTkZPLA0KPiAtCQkJICAgICAiUHJpbWFyeSBzbGF2ZSBj YW4gYmUgc3BlY2lmaWVkIG9ubHkgb25jZSBmb3IgYm9uZGVkIGRldmljZSAlcyIsDQo+IC0JCQkg ICAgIG5hbWUpOw0KPiAtCQlyZXR1cm4gLTE7DQo+IC0JfQ0KPiAtDQo+IC0JLyogUGFyc2UgbGlu ayBzdGF0dXMgbW9uaXRvciBwb2xsaW5nIGludGVydmFsICovDQo+IC0JYXJnX2NvdW50ID0gcnRl X2t2YXJnc19jb3VudChrdmxpc3QsIFBNRF9CT05EX0xTQ19QT0xMX1BFUklPRF9LVkFSRyk7DQo+ IC0JaWYgKGFyZ19jb3VudCA9PSAxKSB7DQo+IC0JCXVpbnQzMl90IGxzY19wb2xsX2ludGVydmFs X21zOw0KPiAtDQo+IC0JCWlmIChydGVfa3ZhcmdzX3Byb2Nlc3Moa3ZsaXN0LA0KPiAtCQkJCSAg ICAgICBQTURfQk9ORF9MU0NfUE9MTF9QRVJJT0RfS1ZBUkcsDQo+IC0JCQkJICAgICAgICZib25k X2V0aGRldl9wYXJzZV90aW1lX21zX2t2YXJnLA0KPiAtCQkJCSAgICAgICAmbHNjX3BvbGxfaW50 ZXJ2YWxfbXMpIDwgMCkgew0KPiAtCQkJUlRFX0JPTkRfTE9HKElORk8sDQo+IC0JCQkJICAgICAi SW52YWxpZCBsc2MgcG9sbGluZyBpbnRlcnZhbCB2YWx1ZSBzcGVjaWZpZWQgZm9yIGJvbmRlZCIN Cj4gLQkJCQkgICAgICIgZGV2aWNlICVzIiwgbmFtZSk7DQo+IC0JCQlyZXR1cm4gLTE7DQo+IC0J CX0NCj4gLQ0KPiAtCQlpZiAocnRlX2V0aF9ib25kX2xpbmtfbW9uaXRvcmluZ19zZXQocG9ydF9p ZCwgbHNjX3BvbGxfaW50ZXJ2YWxfbXMpDQo+IC0JCSAgICAhPSAwKSB7DQo+IC0JCQlSVEVfQk9O RF9MT0coRVJSLA0KPiAtCQkJCSAgICAgIkZhaWxlZCB0byBzZXQgbHNjIG1vbml0b3IgcG9sbGlu ZyBpbnRlcnZhbCAoJXUgbXMpIG9uIGJvbmRlZCBkZXZpY2UgJXMiLA0KPiAtCQkJCSAgICAgbHNj X3BvbGxfaW50ZXJ2YWxfbXMsIG5hbWUpOw0KPiAtCQkJcmV0dXJuIC0xOw0KPiAtCQl9DQo+IC0J fSBlbHNlIGlmIChhcmdfY291bnQgPiAxKSB7DQo+IC0JCVJURV9CT05EX0xPRyhJTkZPLA0KPiAt CQkJICAgICAiTFNDIHBvbGxpbmcgaW50ZXJ2YWwgY2FuIGJlIHNwZWNpZmllZCBvbmx5IG9uY2Ug Zm9yIGJvbmRlZCINCj4gLQkJCSAgICAgIiBkZXZpY2UgJXMiLCBuYW1lKTsNCj4gLQkJcmV0dXJu IC0xOw0KPiAtCX0NCj4gLQ0KPiAtCS8qIFBhcnNlIGxpbmsgdXAgaW50ZXJydXB0IHByb3BhZ2F0 aW9uIGRlbGF5ICovDQo+IC0JYXJnX2NvdW50ID0gcnRlX2t2YXJnc19jb3VudChrdmxpc3QsIFBN RF9CT05EX0xJTktfVVBfUFJPUF9ERUxBWV9LVkFSRyk7DQo+IC0JaWYgKGFyZ19jb3VudCA9PSAx KSB7DQo+IC0JCXVpbnQzMl90IGxpbmtfdXBfZGVsYXlfbXM7DQo+IC0NCj4gLQkJaWYgKHJ0ZV9r dmFyZ3NfcHJvY2Vzcyhrdmxpc3QsDQo+IC0JCQkJICAgICAgIFBNRF9CT05EX0xJTktfVVBfUFJP UF9ERUxBWV9LVkFSRywNCj4gLQkJCQkgICAgICAgJmJvbmRfZXRoZGV2X3BhcnNlX3RpbWVfbXNf a3ZhcmcsDQo+IC0JCQkJICAgICAgICZsaW5rX3VwX2RlbGF5X21zKSA8IDApIHsNCj4gLQkJCVJU RV9CT05EX0xPRyhJTkZPLA0KPiAtCQkJCSAgICAgIkludmFsaWQgbGluayB1cCBwcm9wYWdhdGlv biBkZWxheSB2YWx1ZSBzcGVjaWZpZWQgZm9yIg0KPiAtCQkJCSAgICAgIiBib25kZWQgZGV2aWNl ICVzIiwgbmFtZSk7DQo+IC0JCQlyZXR1cm4gLTE7DQo+IC0JCX0NCj4gLQ0KPiAtCQkvKiBTZXQg YmFsYW5jZSBtb2RlIHRyYW5zbWl0IHBvbGljeSovDQo+IC0JCWlmIChydGVfZXRoX2JvbmRfbGlu a191cF9wcm9wX2RlbGF5X3NldChwb3J0X2lkLCBsaW5rX3VwX2RlbGF5X21zKQ0KPiAtCQkgICAg IT0gMCkgew0KPiAtCQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4gLQkJCQkgICAgICJGYWlsZWQgdG8g c2V0IGxpbmsgdXAgcHJvcGFnYXRpb24gZGVsYXkgKCV1IG1zKSBvbiBib25kZWQiDQo+IC0JCQkJ ICAgICAiIGRldmljZSAlcyIsIGxpbmtfdXBfZGVsYXlfbXMsIG5hbWUpOw0KPiAtCQkJcmV0dXJu IC0xOw0KPiAtCQl9DQo+IC0JfSBlbHNlIGlmIChhcmdfY291bnQgPiAxKSB7DQo+IC0JCVJURV9C T05EX0xPRyhJTkZPLA0KPiAtCQkJICAgICAiTGluayB1cCBwcm9wYWdhdGlvbiBkZWxheSBjYW4g YmUgc3BlY2lmaWVkIG9ubHkgb25jZSBmb3IiDQo+IC0JCQkgICAgICIgYm9uZGVkIGRldmljZSAl cyIsIG5hbWUpOw0KPiAtCQlyZXR1cm4gLTE7DQo+IC0JfQ0KPiAtDQo+IC0JLyogUGFyc2UgbGlu ayBkb3duIGludGVycnVwdCBwcm9wYWdhdGlvbiBkZWxheSAqLw0KPiAtCWFyZ19jb3VudCA9IHJ0 ZV9rdmFyZ3NfY291bnQoa3ZsaXN0LCBQTURfQk9ORF9MSU5LX0RPV05fUFJPUF9ERUxBWV9LVkFS Ryk7DQo+IC0JaWYgKGFyZ19jb3VudCA9PSAxKSB7DQo+IC0JCXVpbnQzMl90IGxpbmtfZG93bl9k ZWxheV9tczsNCj4gLQ0KPiAtCQlpZiAocnRlX2t2YXJnc19wcm9jZXNzKGt2bGlzdCwNCj4gLQkJ CQkgICAgICAgUE1EX0JPTkRfTElOS19ET1dOX1BST1BfREVMQVlfS1ZBUkcsDQo+IC0JCQkJICAg ICAgICZib25kX2V0aGRldl9wYXJzZV90aW1lX21zX2t2YXJnLA0KPiAtCQkJCSAgICAgICAmbGlu a19kb3duX2RlbGF5X21zKSA8IDApIHsNCj4gLQkJCVJURV9CT05EX0xPRyhJTkZPLA0KPiAtCQkJ CSAgICAgIkludmFsaWQgbGluayBkb3duIHByb3BhZ2F0aW9uIGRlbGF5IHZhbHVlIHNwZWNpZmll ZCBmb3IiDQo+IC0JCQkJICAgICAiIGJvbmRlZCBkZXZpY2UgJXMiLCBuYW1lKTsNCj4gLQkJCXJl dHVybiAtMTsNCj4gLQkJfQ0KPiAtDQo+IC0JCS8qIFNldCBiYWxhbmNlIG1vZGUgdHJhbnNtaXQg cG9saWN5Ki8NCj4gLQkJaWYgKHJ0ZV9ldGhfYm9uZF9saW5rX2Rvd25fcHJvcF9kZWxheV9zZXQo cG9ydF9pZCwgbGlua19kb3duX2RlbGF5X21zKQ0KPiAtCQkgICAgIT0gMCkgew0KPiAtCQkJUlRF X0JPTkRfTE9HKEVSUiwNCj4gLQkJCQkgICAgICJGYWlsZWQgdG8gc2V0IGxpbmsgZG93biBwcm9w YWdhdGlvbiBkZWxheSAoJXUgbXMpIG9uIGJvbmRlZCBkZXZpY2UgJXMiLA0KPiAtCQkJCSAgICAg bGlua19kb3duX2RlbGF5X21zLCBuYW1lKTsNCj4gLQkJCXJldHVybiAtMTsNCj4gLQkJfQ0KPiAt CX0gZWxzZSBpZiAoYXJnX2NvdW50ID4gMSkgew0KPiAtCQlSVEVfQk9ORF9MT0coSU5GTywNCj4g LQkJCSAgICAgIkxpbmsgZG93biBwcm9wYWdhdGlvbiBkZWxheSBjYW4gYmUgc3BlY2lmaWVkIG9u bHkgb25jZSBmb3IgIGJvbmRlZCBkZXZpY2UgJXMiLA0KPiAtCQkJICAgICBuYW1lKTsNCj4gLQkJ cmV0dXJuIC0xOw0KPiAtCX0NCj4gLQ0KPiAtCS8qIGNvbmZpZ3VyZSBzbGF2ZXMgc28gd2UgY2Fu IHBhc3MgbXR1IHNldHRpbmcgKi8NCj4gLQlmb3IgKGkgPSAwOyBpIDwgaW50ZXJuYWxzLT5zbGF2 ZV9jb3VudDsgaSsrKSB7DQo+IC0JCXN0cnVjdCBydGVfZXRoX2RldiAqc2xhdmVfZXRoZGV2ID0N Cj4gLQkJCQkmKHJ0ZV9ldGhfZGV2aWNlc1tpbnRlcm5hbHMtPnNsYXZlc1tpXS5wb3J0X2lkXSk7 DQo+IC0JCWlmIChzbGF2ZV9jb25maWd1cmUoZGV2LCBzbGF2ZV9ldGhkZXYpICE9IDApIHsNCj4g LQkJCVJURV9CT05EX0xPRyhFUlIsDQo+IC0JCQkJImJvbmRlZCBwb3J0ICglZCkgZmFpbGVkIHRv IGNvbmZpZ3VyZSBzbGF2ZSBkZXZpY2UgKCVkKSIsDQo+IC0JCQkJZGV2LT5kYXRhLT5wb3J0X2lk LA0KPiAtCQkJCWludGVybmFscy0+c2xhdmVzW2ldLnBvcnRfaWQpOw0KPiAtCQkJcmV0dXJuIC0x Ow0KPiAtCQl9DQo+IC0JfQ0KPiAtCXJldHVybiAwOw0KPiAtfQ0KPiAtDQo+IC1zdHJ1Y3QgcnRl X3ZkZXZfZHJpdmVyIHBtZF9ib25kX2RydiA9IHsNCj4gLQkucHJvYmUgPSBib25kX3Byb2JlLA0K PiAtCS5yZW1vdmUgPSBib25kX3JlbW92ZSwNCj4gLX07DQo+IC0NCj4gLVJURV9QTURfUkVHSVNU RVJfVkRFVihuZXRfYm9uZGluZywgcG1kX2JvbmRfZHJ2KTsNCj4gLVJURV9QTURfUkVHSVNURVJf QUxJQVMobmV0X2JvbmRpbmcsIGV0aF9ib25kKTsNCj4gLQ0KPiAtUlRFX1BNRF9SRUdJU1RFUl9Q QVJBTV9TVFJJTkcobmV0X2JvbmRpbmcsDQo+IC0JInNsYXZlPTxpZmM+ICINCj4gLQkicHJpbWFy eT08aWZjPiAiDQo+IC0JIm1vZGU9WzAtNl0gIg0KPiAtCSJ4bWl0X3BvbGljeT1bbDIgfCBsMjMg fCBsMzRdICINCj4gLQkiYWdnX21vZGU9W2NvdW50IHwgc3RhYmxlIHwgYmFuZHdpZHRoXSAiDQo+ IC0JInNvY2tldF9pZD08aW50PiAiDQo+IC0JIm1hYz08bWFjIGFkZHI+ICINCj4gLQkibHNjX3Bv bGxfcGVyaW9kX21zPTxpbnQ+ICINCj4gLQkidXBfZGVsYXk9PGludD4gIg0KPiAtCSJkb3duX2Rl bGF5PTxpbnQ+Iik7DQo+IC0NCj4gLS8qIFdlIGNhbid0IHVzZSBSVEVfTE9HX1JFR0lTVEVSX0RF RkFVTFQgYmVjYXVzZSBvZiB0aGUgZm9yY2VkIG5hbWUgZm9yDQo+IC0gKiB0aGlzIGxpYnJhcnks IHNlZSBtZXNvbi5idWlsZC4NCj4gLSAqLw0KPiAtUlRFX0xPR19SRUdJU1RFUihib25kX2xvZ3R5 cGUsIHBtZC5uZXQuYm9uZGluZywgTk9USUNFKTsNCj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlm aWVyOiBCU0QtMy1DbGF1c2UNCj4NCj4gKyAqIENvcHlyaWdodChjKSAyMDEwLTIwMTcgSW50ZWwg Q29ycG9yYXRpb24NCj4NCj4gKyAqLw0KPg0KPiArI2luY2x1ZGUgPHN0ZGxpYi5oPg0KPg0KPiAr I2luY2x1ZGUgPHN0ZGJvb2wuaD4NCj4NCj4gKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+DQo+DQo+ ICsNCj4NCj4gKyNpbmNsdWRlIDxydGVfbWJ1Zi5oPg0KPg0KPiArI2luY2x1ZGUgPHJ0ZV9tYWxs b2MuaD4NCj4NCj4gKyNpbmNsdWRlIDxldGhkZXZfZHJpdmVyLmg+DQo+DQo+ICsjaW5jbHVkZSA8 ZXRoZGV2X3ZkZXYuaD4NCj4NCj4gKyNpbmNsdWRlIDxydGVfdGNwLmg+DQo+DQo+ICsjaW5jbHVk ZSA8cnRlX3VkcC5oPg0KPg0KPiArI2luY2x1ZGUgPHJ0ZV9pcC5oPg0KPg0KPiArI2luY2x1ZGUg PHJ0ZV9pcF9mcmFnLmg+DQo+DQo+ICsjaW5jbHVkZSA8cnRlX2RldmFyZ3MuaD4NCj4NCj4gKyNp bmNsdWRlIDxydGVfa3ZhcmdzLmg+DQo+DQo+ICsjaW5jbHVkZSA8cnRlX2J1c192ZGV2Lmg+DQo+ DQo+ICsjaW5jbHVkZSA8cnRlX2FsYXJtLmg+DQo+DQo+ICsjaW5jbHVkZSA8cnRlX2N5Y2xlcy5o Pg0KPg0KPiArI2luY2x1ZGUgPHJ0ZV9zdHJpbmdfZm5zLmg+DQo+DQo+ICsNCj4NCj4gKyNpbmNs dWRlICJydGVfZXRoX2JvbmQuaCINCj4NCj4gKyNpbmNsdWRlICJldGhfYm9uZF9wcml2YXRlLmgi DQo+DQo+ICsjaW5jbHVkZSAiZXRoX2JvbmRfODAyM2FkX3ByaXZhdGUuaCINCj4NCj4gKw0KPg0K PiArI2RlZmluZSBSRU9SREVSX1BFUklPRF9NUyAxMA0KPg0KPiArI2RlZmluZSBERUZBVUxUX1BP TExJTkdfSU5URVJWQUxfMTBfTVMgKDEwKQ0KPg0KPiArI2RlZmluZSBCT05EX01BWF9NQUNfQURE UlMgMTYNCj4NCj4gKw0KPg0KPiArI2RlZmluZSBIQVNIX0w0X1BPUlRTKGgpICgoaCktPnNyY19w b3J0IF4gKGgpLT5kc3RfcG9ydCkNCj4NCj4gKw0KPg0KPiArLyogVGFibGUgZm9yIHN0YXRpc3Rp Y3MgaW4gbW9kZSA1IFRMQiAqLw0KPg0KPiArc3RhdGljIHVpbnQ2NF90IHRsYl9sYXN0X29ieXRl dHNbUlRFX01BWF9FVEhQT1JUU107DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyBpbmxpbmUgc2l6ZV90 DQo+DQo+ICtnZXRfdmxhbl9vZmZzZXQoc3RydWN0IHJ0ZV9ldGhlcl9oZHIgKmV0aF9oZHIsIHVp bnQxNl90ICpwcm90bykNCj4NCj4gK3sNCj4NCj4gKwlzaXplX3Qgdmxhbl9vZmZzZXQgPSAwOw0K Pg0KPiArDQo+DQo+ICsJaWYgKHJ0ZV9jcHVfdG9fYmVfMTYoUlRFX0VUSEVSX1RZUEVfVkxBTikg PT0gKnByb3RvIHx8DQo+DQo+ICsJCXJ0ZV9jcHVfdG9fYmVfMTYoUlRFX0VUSEVSX1RZUEVfUUlO USkgPT0gKnByb3RvKSB7DQo+DQo+ICsJCXN0cnVjdCBydGVfdmxhbl9oZHIgKnZsYW5faGRyID0N Cj4NCj4gKwkJCShzdHJ1Y3QgcnRlX3ZsYW5faGRyICopKGV0aF9oZHIgKyAxKTsNCj4NCj4gKw0K Pg0KPiArCQl2bGFuX29mZnNldCA9IHNpemVvZihzdHJ1Y3QgcnRlX3ZsYW5faGRyKTsNCj4NCj4g KwkJKnByb3RvID0gdmxhbl9oZHItPmV0aF9wcm90bzsNCj4NCj4gKw0KPg0KPiArCQlpZiAocnRl X2NwdV90b19iZV8xNihSVEVfRVRIRVJfVFlQRV9WTEFOKSA9PSAqcHJvdG8pIHsNCj4NCj4gKwkJ CXZsYW5faGRyID0gdmxhbl9oZHIgKyAxOw0KPg0KPiArCQkJKnByb3RvID0gdmxhbl9oZHItPmV0 aF9wcm90bzsNCj4NCj4gKwkJCXZsYW5fb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgcnRlX3ZsYW5f aGRyKTsNCj4NCj4gKwkJfQ0KPg0KPiArCX0NCj4NCj4gKwlyZXR1cm4gdmxhbl9vZmZzZXQ7DQo+ DQo+ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyB1aW50MTZfdA0KPg0KPiArYm9uZF9ldGhkZXZf cnhfYnVyc3Qodm9pZCAqcXVldWUsIHN0cnVjdCBydGVfbWJ1ZiAqKmJ1ZnMsIHVpbnQxNl90IG5i X3BrdHMpDQo+DQo+ICt7DQo+DQo+ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFs czsNCj4NCj4gKw0KPg0KPiArCXVpbnQxNl90IG51bV9yeF90b3RhbCA9IDA7DQo+DQo+ICsJdWlu dDE2X3Qgc2xhdmVfY291bnQ7DQo+DQo+ICsJdWludDE2X3QgYWN0aXZlX3NsYXZlOw0KPg0KPiAr CWludCBpOw0KPg0KPiArDQo+DQo+ICsJLyogQ2FzdCB0byBzdHJ1Y3R1cmUsIGNvbnRhaW5pbmcg Ym9uZGVkIGRldmljZSdzIHBvcnQgaWQgYW5kIHF1ZXVlIGlkICovDQo+DQo+ICsJc3RydWN0IGJv bmRfcnhfcXVldWUgKmJkX3J4X3EgPSAoc3RydWN0IGJvbmRfcnhfcXVldWUgKilxdWV1ZTsNCj4N Cj4gKwlpbnRlcm5hbHMgPSBiZF9yeF9xLT5kZXZfcHJpdmF0ZTsNCj4NCj4gKwlzbGF2ZV9jb3Vu dCA9IGludGVybmFscy0+YWN0aXZlX3NsYXZlX2NvdW50Ow0KPg0KPiArCWFjdGl2ZV9zbGF2ZSA9 IGJkX3J4X3EtPmFjdGl2ZV9zbGF2ZTsNCj4NCj4gKw0KPg0KPiArCWZvciAoaSA9IDA7IGkgPCBz bGF2ZV9jb3VudCAmJiBuYl9wa3RzOyBpKyspIHsNCj4NCj4gKwkJdWludDE2X3QgbnVtX3J4X3Ns YXZlOw0KPg0KPiArDQo+DQo+ICsJCS8qIE9mZnNldCBvZiBwb2ludGVyIHRvICpidWZzIGluY3Jl YXNlcyBhcyBwYWNrZXRzIGFyZSByZWNlaXZlZA0KPg0KPiArCQkgKiBmcm9tIG90aGVyIHNsYXZl cyAqLw0KPg0KPiArCQludW1fcnhfc2xhdmUgPQ0KPg0KPiArCQkJcnRlX2V0aF9yeF9idXJzdChp bnRlcm5hbHMtPmFjdGl2ZV9zbGF2ZXNbYWN0aXZlX3NsYXZlXSwNCj4NCj4gKwkJCQkJIGJkX3J4 X3EtPnF1ZXVlX2lkLA0KPg0KPiArCQkJCQkgYnVmcyArIG51bV9yeF90b3RhbCwgbmJfcGt0cyk7 DQo+DQo+ICsJCW51bV9yeF90b3RhbCArPSBudW1fcnhfc2xhdmU7DQo+DQo+ICsJCW5iX3BrdHMg LT0gbnVtX3J4X3NsYXZlOw0KPg0KPiArCQlpZiAoKythY3RpdmVfc2xhdmUgPT0gc2xhdmVfY291 bnQpDQo+DQo+ICsJCQlhY3RpdmVfc2xhdmUgPSAwOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiAr CWlmICgrK2JkX3J4X3EtPmFjdGl2ZV9zbGF2ZSA+PSBzbGF2ZV9jb3VudCkNCj4NCj4gKwkJYmRf cnhfcS0+YWN0aXZlX3NsYXZlID0gMDsNCj4NCj4gKwlyZXR1cm4gbnVtX3J4X3RvdGFsOw0KPg0K PiArfQ0KPg0KPiArDQo+DQo+ICtzdGF0aWMgdWludDE2X3QNCj4NCj4gK2JvbmRfZXRoZGV2X3J4 X2J1cnN0X2FjdGl2ZV9iYWNrdXAodm9pZCAqcXVldWUsIHN0cnVjdCBydGVfbWJ1ZiAqKmJ1ZnMs DQo+DQo+ICsJCXVpbnQxNl90IG5iX3BrdHMpDQo+DQo+ICt7DQo+DQo+ICsJc3RydWN0IGJvbmRf ZGV2X3ByaXZhdGUgKmludGVybmFsczsNCj4NCj4gKw0KPg0KPiArCS8qIENhc3QgdG8gc3RydWN0 dXJlLCBjb250YWluaW5nIGJvbmRlZCBkZXZpY2UncyBwb3J0IGlkIGFuZCBxdWV1ZSBpZCAqLw0K Pg0KPiArCXN0cnVjdCBib25kX3J4X3F1ZXVlICpiZF9yeF9xID0gKHN0cnVjdCBib25kX3J4X3F1 ZXVlICopcXVldWU7DQo+DQo+ICsNCj4NCj4gKwlpbnRlcm5hbHMgPSBiZF9yeF9xLT5kZXZfcHJp dmF0ZTsNCj4NCj4gKw0KPg0KPiArCXJldHVybiBydGVfZXRoX3J4X2J1cnN0KGludGVybmFscy0+ Y3VycmVudF9wcmltYXJ5X3BvcnQsDQo+DQo+ICsJCQliZF9yeF9xLT5xdWV1ZV9pZCwgYnVmcywg bmJfcGt0cyk7DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyBpbmxpbmUgdWludDhfdA0K Pg0KPiAraXNfbGFjcF9wYWNrZXRzKHVpbnQxNl90IGV0aGVydHlwZSwgdWludDhfdCBzdWJ0eXBl LCBzdHJ1Y3QgcnRlX21idWYgKm1idWYpDQo+DQo+ICt7DQo+DQo+ICsJY29uc3QgdWludDE2X3Qg ZXRoZXJfdHlwZV9zbG93X2JlID0NCj4NCj4gKwkJcnRlX2JlX3RvX2NwdV8xNihSVEVfRVRIRVJf VFlQRV9TTE9XKTsNCj4NCj4gKw0KPg0KPiArCXJldHVybiAhKChtYnVmLT5vbF9mbGFncyAmIFJU RV9NQlVGX0ZfUlhfVkxBTikgPyBtYnVmLT52bGFuX3RjaSA6IDApICYmDQo+DQo+ICsJCShldGhl cnR5cGUgPT0gZXRoZXJfdHlwZV9zbG93X2JlICYmDQo+DQo+ICsJCShzdWJ0eXBlID09IFNMT1df U1VCVFlQRV9NQVJLRVIgfHwgc3VidHlwZSA9PSBTTE9XX1NVQlRZUEVfTEFDUCkpOw0KPg0KPiAr fQ0KPg0KPiArDQo+DQo+ICsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCj4NCj4gKyAqIEZsb3cgZGly ZWN0b3IncyBzZXR1cCBmb3IgbW9kZSA0IG9wdGltaXphdGlvbg0KPg0KPiArICovDQo+DQo+ICsN Cj4NCj4gK3N0YXRpYyBzdHJ1Y3QgcnRlX2Zsb3dfaXRlbV9ldGggZmxvd19pdGVtX2V0aF90eXBl XzgwMjNhZCA9IHsNCj4NCj4gKwkuZHN0LmFkZHJfYnl0ZXMgPSB7IDAgfSwNCj4NCj4gKwkuc3Jj LmFkZHJfYnl0ZXMgPSB7IDAgfSwNCj4NCj4gKwkudHlwZSA9IFJURV9CRTE2KFJURV9FVEhFUl9U WVBFX1NMT1cpLA0KPg0KPiArfTsNCj4NCj4gKw0KPg0KPiArc3RhdGljIHN0cnVjdCBydGVfZmxv d19pdGVtX2V0aCBmbG93X2l0ZW1fZXRoX21hc2tfdHlwZV84MDIzYWQgPSB7DQo+DQo+ICsJLmRz dC5hZGRyX2J5dGVzID0geyAwIH0sDQo+DQo+ICsJLnNyYy5hZGRyX2J5dGVzID0geyAwIH0sDQo+ DQo+ICsJLnR5cGUgPSAweEZGRkYsDQo+DQo+ICt9Ow0KPg0KPiArDQo+DQo+ICtzdGF0aWMgc3Ry dWN0IHJ0ZV9mbG93X2l0ZW0gZmxvd19pdGVtXzgwMjNhZFtdID0gew0KPg0KPiArCXsNCj4NCj4g KwkJLnR5cGUgPSBSVEVfRkxPV19JVEVNX1RZUEVfRVRILA0KPg0KPiArCQkuc3BlYyA9ICZmbG93 X2l0ZW1fZXRoX3R5cGVfODAyM2FkLA0KPg0KPiArCQkubGFzdCA9IE5VTEwsDQo+DQo+ICsJCS5t YXNrID0gJmZsb3dfaXRlbV9ldGhfbWFza190eXBlXzgwMjNhZCwNCj4NCj4gKwl9LA0KPg0KPiAr CXsNCj4NCj4gKwkJLnR5cGUgPSBSVEVfRkxPV19JVEVNX1RZUEVfRU5ELA0KPg0KPiArCQkuc3Bl YyA9IE5VTEwsDQo+DQo+ICsJCS5sYXN0ID0gTlVMTCwNCj4NCj4gKwkJLm1hc2sgPSBOVUxMLA0K Pg0KPiArCX0NCj4NCj4gK307DQo+DQo+ICsNCj4NCj4gK2NvbnN0IHN0cnVjdCBydGVfZmxvd19h dHRyIGZsb3dfYXR0cl84MDIzYWQgPSB7DQo+DQo+ICsJLmdyb3VwID0gMCwNCj4NCj4gKwkucHJp b3JpdHkgPSAwLA0KPg0KPiArCS5pbmdyZXNzID0gMSwNCj4NCj4gKwkuZWdyZXNzID0gMCwNCj4N Cj4gKwkucmVzZXJ2ZWQgPSAwLA0KPg0KPiArfTsNCj4NCj4gKw0KPg0KPiAraW50DQo+DQo+ICti b25kX2V0aGRldl84MDIzYWRfZmxvd192ZXJpZnkoc3RydWN0IHJ0ZV9ldGhfZGV2ICpib25kX2Rl diwNCj4NCj4gKwkJdWludDE2X3Qgc2xhdmVfcG9ydCkgew0KPg0KPiArCXN0cnVjdCBydGVfZXRo X2Rldl9pbmZvIHNsYXZlX2luZm87DQo+DQo+ICsJc3RydWN0IHJ0ZV9mbG93X2Vycm9yIGVycm9y Ow0KPg0KPiArCXN0cnVjdCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHMgPSBib25kX2Rldi0+ ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsNCj4NCj4gKwljb25zdCBzdHJ1Y3QgcnRlX2Zsb3df YWN0aW9uX3F1ZXVlIGxhY3BfcXVldWVfY29uZiA9IHsNCj4NCj4gKwkJLmluZGV4ID0gMCwNCj4N Cj4gKwl9Ow0KPg0KPiArDQo+DQo+ICsJY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2FjdGlvbiBhY3Rp b25zW10gPSB7DQo+DQo+ICsJCXsNCj4NCj4gKwkJCS50eXBlID0gUlRFX0ZMT1dfQUNUSU9OX1RZ UEVfUVVFVUUsDQo+DQo+ICsJCQkuY29uZiA9ICZsYWNwX3F1ZXVlX2NvbmYNCj4NCj4gKwkJfSwN Cj4NCj4gKwkJew0KPg0KPiArCQkJLnR5cGUgPSBSVEVfRkxPV19BQ1RJT05fVFlQRV9FTkQsDQo+ DQo+ICsJCX0NCj4NCj4gKwl9Ow0KPg0KPiArDQo+DQo+ICsJaW50IHJldCA9IHJ0ZV9mbG93X3Zh bGlkYXRlKHNsYXZlX3BvcnQsICZmbG93X2F0dHJfODAyM2FkLA0KPg0KPiArCQkJZmxvd19pdGVt XzgwMjNhZCwgYWN0aW9ucywgJmVycm9yKTsNCj4NCj4gKwlpZiAocmV0IDwgMCkgew0KPg0KPiAr CQlSVEVfQk9ORF9MT0coRVJSLCAiJXM6ICVzIChzbGF2ZV9wb3J0PSVkIHF1ZXVlX2lkPSVkKSIs DQo+DQo+ICsJCQkJX19mdW5jX18sIGVycm9yLm1lc3NhZ2UsIHNsYXZlX3BvcnQsDQo+DQo+ICsJ CQkJaW50ZXJuYWxzLT5tb2RlNC5kZWRpY2F0ZWRfcXVldWVzLnJ4X3FpZCk7DQo+DQo+ICsJCXJl dHVybiAtMTsNCj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwlyZXQgPSBydGVfZXRoX2Rldl9pbmZv X2dldChzbGF2ZV9wb3J0LCAmc2xhdmVfaW5mbyk7DQo+DQo+ICsJaWYgKHJldCAhPSAwKSB7DQo+ DQo+ICsJCVJURV9CT05EX0xPRyhFUlIsDQo+DQo+ICsJCQkiJXM6IEVycm9yIGR1cmluZyBnZXR0 aW5nIGRldmljZSAocG9ydCAldSkgaW5mbzogJXNcbiIsDQo+DQo+ICsJCQlfX2Z1bmNfXywgc2xh dmVfcG9ydCwgc3RyZXJyb3IoLXJldCkpOw0KPg0KPiArDQo+DQo+ICsJCXJldHVybiByZXQ7DQo+ DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJaWYgKHNsYXZlX2luZm8ubWF4X3J4X3F1ZXVlcyA8IGJv bmRfZGV2LT5kYXRhLT5uYl9yeF9xdWV1ZXMgfHwNCj4NCj4gKwkJCXNsYXZlX2luZm8ubWF4X3R4 X3F1ZXVlcyA8IGJvbmRfZGV2LT5kYXRhLT5uYl90eF9xdWV1ZXMpIHsNCj4NCj4gKwkJUlRFX0JP TkRfTE9HKEVSUiwNCj4NCj4gKwkJCSIlczogU2xhdmUgJWQgY2FwYWJpbGl0aWVzIGRvZXNuJ3Qg YWxsb3cgdG8gYWxsb2NhdGUgYWRkaXRpb25hbCBxdWV1ZXMiLA0KPg0KPiArCQkJX19mdW5jX18s IHNsYXZlX3BvcnQpOw0KPg0KPiArCQlyZXR1cm4gLTE7DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ ICsJcmV0dXJuIDA7DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gK2ludA0KPg0KPiArYm9uZF84MDIz YWRfc2xvd19wa3RfaHdfZmlsdGVyX3N1cHBvcnRlZCh1aW50MTZfdCBwb3J0X2lkKSB7DQo+DQo+ ICsJc3RydWN0IHJ0ZV9ldGhfZGV2ICpib25kX2RldiA9ICZydGVfZXRoX2RldmljZXNbcG9ydF9p ZF07DQo+DQo+ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFscyA9IGJvbmRfZGV2 LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4NCj4gKwlzdHJ1Y3QgcnRlX2V0aF9kZXZfaW5mbyBib25k X2luZm87DQo+DQo+ICsJdWludDE2X3QgaWR4Ow0KPg0KPiArCWludCByZXQ7DQo+DQo+ICsNCj4N Cj4gKwkvKiBWZXJpZnkgaWYgYWxsIHNsYXZlcyBpbiBib25kaW5nIHN1cHBvcnRzIGZsb3cgZGly ZWN0b3IgYW5kICovDQo+DQo+ICsJaWYgKGludGVybmFscy0+c2xhdmVfY291bnQgPiAwKSB7DQo+ DQo+ICsJCXJldCA9IHJ0ZV9ldGhfZGV2X2luZm9fZ2V0KGJvbmRfZGV2LT5kYXRhLT5wb3J0X2lk LCAmYm9uZF9pbmZvKTsNCj4NCj4gKwkJaWYgKHJldCAhPSAwKSB7DQo+DQo+ICsJCQlSVEVfQk9O RF9MT0coRVJSLA0KPg0KPiArCQkJCSIlczogRXJyb3IgZHVyaW5nIGdldHRpbmcgZGV2aWNlIChw b3J0ICV1KSBpbmZvOiAlc1xuIiwNCj4NCj4gKwkJCQlfX2Z1bmNfXywgYm9uZF9kZXYtPmRhdGEt PnBvcnRfaWQsDQo+DQo+ICsJCQkJc3RyZXJyb3IoLXJldCkpOw0KPg0KPiArDQo+DQo+ICsJCQly ZXR1cm4gcmV0Ow0KPg0KPiArCQl9DQo+DQo+ICsNCj4NCj4gKwkJaW50ZXJuYWxzLT5tb2RlNC5k ZWRpY2F0ZWRfcXVldWVzLnJ4X3FpZCA9IGJvbmRfaW5mby5uYl9yeF9xdWV1ZXM7DQo+DQo+ICsJ CWludGVybmFscy0+bW9kZTQuZGVkaWNhdGVkX3F1ZXVlcy50eF9xaWQgPSBib25kX2luZm8ubmJf dHhfcXVldWVzOw0KPg0KPiArDQo+DQo+ICsJCWZvciAoaWR4ID0gMDsgaWR4IDwgaW50ZXJuYWxz LT5zbGF2ZV9jb3VudDsgaWR4KyspIHsNCj4NCj4gKwkJCWlmIChib25kX2V0aGRldl84MDIzYWRf Zmxvd192ZXJpZnkoYm9uZF9kZXYsDQo+DQo+ICsJCQkJCWludGVybmFscy0+c2xhdmVzW2lkeF0u cG9ydF9pZCkgIT0gMCkNCj4NCj4gKwkJCQlyZXR1cm4gLTE7DQo+DQo+ICsJCX0NCj4NCj4gKwl9 DQo+DQo+ICsNCj4NCj4gKwlyZXR1cm4gMDsNCj4NCj4gK30NCj4NCj4gKw0KPg0KPiAraW50DQo+ DQo+ICtib25kX2V0aGRldl84MDIzYWRfZmxvd19zZXQoc3RydWN0IHJ0ZV9ldGhfZGV2ICpib25k X2RldiwgdWludDE2X3Qgc2xhdmVfcG9ydCkgew0KPg0KPiArDQo+DQo+ICsJc3RydWN0IHJ0ZV9m bG93X2Vycm9yIGVycm9yOw0KPg0KPiArCXN0cnVjdCBib25kX2Rldl9wcml2YXRlICppbnRlcm5h bHMgPSBib25kX2Rldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsJc3RydWN0IHJ0ZV9mbG93 X2FjdGlvbl9xdWV1ZSBsYWNwX3F1ZXVlX2NvbmYgPSB7DQo+DQo+ICsJCS5pbmRleCA9IGludGVy bmFscy0+bW9kZTQuZGVkaWNhdGVkX3F1ZXVlcy5yeF9xaWQsDQo+DQo+ICsJfTsNCj4NCj4gKw0K Pg0KPiArCWNvbnN0IHN0cnVjdCBydGVfZmxvd19hY3Rpb24gYWN0aW9uc1tdID0gew0KPg0KPiAr CQl7DQo+DQo+ICsJCQkudHlwZSA9IFJURV9GTE9XX0FDVElPTl9UWVBFX1FVRVVFLA0KPg0KPiAr CQkJLmNvbmYgPSAmbGFjcF9xdWV1ZV9jb25mDQo+DQo+ICsJCX0sDQo+DQo+ICsJCXsNCj4NCj4g KwkJCS50eXBlID0gUlRFX0ZMT1dfQUNUSU9OX1RZUEVfRU5ELA0KPg0KPiArCQl9DQo+DQo+ICsJ fTsNCj4NCj4gKw0KPg0KPiArCWludGVybmFscy0+bW9kZTQuZGVkaWNhdGVkX3F1ZXVlcy5mbG93 W3NsYXZlX3BvcnRdID0gcnRlX2Zsb3dfY3JlYXRlKHNsYXZlX3BvcnQsDQo+DQo+ICsJCQkmZmxv d19hdHRyXzgwMjNhZCwgZmxvd19pdGVtXzgwMjNhZCwgYWN0aW9ucywgJmVycm9yKTsNCj4NCj4g KwlpZiAoaW50ZXJuYWxzLT5tb2RlNC5kZWRpY2F0ZWRfcXVldWVzLmZsb3dbc2xhdmVfcG9ydF0g PT0gTlVMTCkgew0KPg0KPiArCQlSVEVfQk9ORF9MT0coRVJSLCAiYm9uZF9ldGhkZXZfODAyM2Fk X2Zsb3dfc2V0OiAlcyAiDQo+DQo+ICsJCQkJIihzbGF2ZV9wb3J0PSVkIHF1ZXVlX2lkPSVkKSIs DQo+DQo+ICsJCQkJZXJyb3IubWVzc2FnZSwgc2xhdmVfcG9ydCwNCj4NCj4gKwkJCQlpbnRlcm5h bHMtPm1vZGU0LmRlZGljYXRlZF9xdWV1ZXMucnhfcWlkKTsNCj4NCj4gKwkJcmV0dXJuIC0xOw0K Pg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCXJldHVybiAwOw0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ ICtzdGF0aWMgaW5saW5lIHVpbnQxNl90DQo+DQo+ICtyeF9idXJzdF84MDIzYWQodm9pZCAqcXVl dWUsIHN0cnVjdCBydGVfbWJ1ZiAqKmJ1ZnMsIHVpbnQxNl90IG5iX3BrdHMsDQo+DQo+ICsJCWJv b2wgZGVkaWNhdGVkX3J4cSkNCj4NCj4gK3sNCj4NCj4gKwkvKiBDYXN0IHRvIHN0cnVjdHVyZSwg Y29udGFpbmluZyBib25kZWQgZGV2aWNlJ3MgcG9ydCBpZCBhbmQgcXVldWUgaWQgKi8NCj4NCj4g KwlzdHJ1Y3QgYm9uZF9yeF9xdWV1ZSAqYmRfcnhfcSA9IChzdHJ1Y3QgYm9uZF9yeF9xdWV1ZSAq KXF1ZXVlOw0KPg0KPiArCXN0cnVjdCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHMgPSBiZF9y eF9xLT5kZXZfcHJpdmF0ZTsNCj4NCj4gKwlzdHJ1Y3QgcnRlX2V0aF9kZXYgKmJvbmRlZF9ldGhf ZGV2ID0NCj4NCj4gKwkJCQkJJnJ0ZV9ldGhfZGV2aWNlc1tpbnRlcm5hbHMtPnBvcnRfaWRdOw0K Pg0KPiArCXN0cnVjdCBydGVfZXRoZXJfYWRkciAqYm9uZF9tYWMgPSBib25kZWRfZXRoX2Rldi0+ ZGF0YS0+bWFjX2FkZHJzOw0KPg0KPiArCXN0cnVjdCBydGVfZXRoZXJfaGRyICpoZHI7DQo+DQo+ ICsNCj4NCj4gKwljb25zdCB1aW50MTZfdCBldGhlcl90eXBlX3Nsb3dfYmUgPQ0KPg0KPiArCQly dGVfYmVfdG9fY3B1XzE2KFJURV9FVEhFUl9UWVBFX1NMT1cpOw0KPg0KPiArCXVpbnQxNl90IG51 bV9yeF90b3RhbCA9IDA7CS8qIFRvdGFsIG51bWJlciBvZiByZWNlaXZlZCBwYWNrZXRzICovDQo+ DQo+ICsJdWludDE2X3Qgc2xhdmVzW1JURV9NQVhfRVRIUE9SVFNdOw0KPg0KPiArCXVpbnQxNl90 IHNsYXZlX2NvdW50LCBpZHg7DQo+DQo+ICsNCj4NCj4gKwl1aW50OF90IGNvbGxlY3Rpbmc7ICAv KiBjdXJyZW50IHNsYXZlIGNvbGxlY3Rpbmcgc3RhdHVzICovDQo+DQo+ICsJY29uc3QgdWludDhf dCBwcm9taXNjID0gcnRlX2V0aF9wcm9taXNjdW91c19nZXQoaW50ZXJuYWxzLT5wb3J0X2lkKTsN Cj4NCj4gKwljb25zdCB1aW50OF90IGFsbG11bHRpID0gcnRlX2V0aF9hbGxtdWx0aWNhc3RfZ2V0 KGludGVybmFscy0+cG9ydF9pZCk7DQo+DQo+ICsJdWludDhfdCBzdWJ0eXBlOw0KPg0KPiArCXVp bnQxNl90IGk7DQo+DQo+ICsJdWludDE2X3QgajsNCj4NCj4gKwl1aW50MTZfdCBrOw0KPg0KPiAr DQo+DQo+ICsJLyogQ29weSBzbGF2ZSBsaXN0IHRvIHByb3RlY3QgYWdhaW5zdCBzbGF2ZSB1cC9k b3duIGNoYW5nZXMgZHVyaW5nIHR4DQo+DQo+ICsJICogYnVyc3RpbmcgKi8NCj4NCj4gKwlzbGF2 ZV9jb3VudCA9IGludGVybmFscy0+YWN0aXZlX3NsYXZlX2NvdW50Ow0KPg0KPiArCW1lbWNweShz bGF2ZXMsIGludGVybmFscy0+YWN0aXZlX3NsYXZlcywNCj4NCj4gKwkJCXNpemVvZihpbnRlcm5h bHMtPmFjdGl2ZV9zbGF2ZXNbMF0pICogc2xhdmVfY291bnQpOw0KPg0KPiArDQo+DQo+ICsJaWR4 ID0gYmRfcnhfcS0+YWN0aXZlX3NsYXZlOw0KPg0KPiArCWlmIChpZHggPj0gc2xhdmVfY291bnQp IHsNCj4NCj4gKwkJYmRfcnhfcS0+YWN0aXZlX3NsYXZlID0gMDsNCj4NCj4gKwkJaWR4ID0gMDsN Cj4NCj4gKwl9DQo+DQo+ICsJZm9yIChpID0gMDsgaSA8IHNsYXZlX2NvdW50ICYmIG51bV9yeF90 b3RhbCA8IG5iX3BrdHM7IGkrKykgew0KPg0KPiArCQlqID0gbnVtX3J4X3RvdGFsOw0KPg0KPiAr CQljb2xsZWN0aW5nID0gQUNUT1JfU1RBVEUoJmJvbmRfbW9kZV84MDIzYWRfcG9ydHNbc2xhdmVz W2lkeF1dLA0KPg0KPiArCQkJCQkgQ09MTEVDVElORyk7DQo+DQo+ICsNCj4NCj4gKwkJLyogUmVh ZCBwYWNrZXRzIGZyb20gdGhpcyBzbGF2ZSAqLw0KPg0KPiArCQludW1fcnhfdG90YWwgKz0gcnRl X2V0aF9yeF9idXJzdChzbGF2ZXNbaWR4XSwgYmRfcnhfcS0+cXVldWVfaWQsDQo+DQo+ICsJCQkJ JmJ1ZnNbbnVtX3J4X3RvdGFsXSwgbmJfcGt0cyAtIG51bV9yeF90b3RhbCk7DQo+DQo+ICsNCj4N Cj4gKwkJZm9yIChrID0gajsgayA8IDIgJiYgayA8IG51bV9yeF90b3RhbDsgaysrKQ0KPg0KPiAr CQkJcnRlX3ByZWZldGNoMChydGVfcGt0bWJ1Zl9tdG9kKGJ1ZnNba10sIHZvaWQgKikpOw0KPg0K PiArDQo+DQo+ICsJCS8qIEhhbmRsZSBzbG93IHByb3RvY29sIHBhY2tldHMuICovDQo+DQo+ICsJ CXdoaWxlIChqIDwgbnVtX3J4X3RvdGFsKSB7DQo+DQo+ICsJCQlpZiAoaiArIDMgPCBudW1fcnhf dG90YWwpDQo+DQo+ICsJCQkJcnRlX3ByZWZldGNoMChydGVfcGt0bWJ1Zl9tdG9kKGJ1ZnNbaiAr IDNdLCB2b2lkICopKTsNCj4NCj4gKw0KPg0KPiArCQkJaGRyID0gcnRlX3BrdG1idWZfbXRvZChi dWZzW2pdLCBzdHJ1Y3QgcnRlX2V0aGVyX2hkciAqKTsNCj4NCj4gKwkJCXN1YnR5cGUgPSAoKHN0 cnVjdCBzbG93X3Byb3RvY29sX2ZyYW1lICopaGRyKS0+c2xvd19wcm90b2NvbC5zdWJ0eXBlOw0K Pg0KPiArDQo+DQo+ICsJCQkvKiBSZW1vdmUgcGFja2V0IGZyb20gYXJyYXkgaWY6DQo+DQo+ICsJ CQkgKiAtIGl0IGlzIHNsb3cgcGFja2V0IGJ1dCBubyBkZWRpY2F0ZWQgcnhxIGlzIHByZXNlbnQs DQo+DQo+ICsJCQkgKiAtIHNsYXZlIGlzIG5vdCBpbiBjb2xsZWN0aW5nIHN0YXRlLA0KPg0KPiAr CQkJICogLSBib25kaW5nIGludGVyZmFjZSBpcyBub3QgaW4gcHJvbWlzY3VvdXMgbW9kZToNCj4N Cj4gKwkJCSAqICAgLSBwYWNrZXQgaXMgdW5pY2FzdCBhbmQgYWRkcmVzcyBkb2VzIG5vdCBtYXRj aCwNCj4NCj4gKwkJCSAqICAgLSBwYWNrZXQgaXMgbXVsdGljYXN0IGFuZCBib25kaW5nIGludGVy ZmFjZQ0KPg0KPiArCQkJICogICAgIGlzIG5vdCBpbiBhbGxtdWx0aSwNCj4NCj4gKwkJCSAqLw0K Pg0KPiArCQkJaWYgKHVubGlrZWx5KA0KPg0KPiArCQkJCSghZGVkaWNhdGVkX3J4cSAmJg0KPg0K PiArCQkJCSBpc19sYWNwX3BhY2tldHMoaGRyLT5ldGhlcl90eXBlLCBzdWJ0eXBlLA0KPg0KPiAr CQkJCQkJIGJ1ZnNbal0pKSB8fA0KPg0KPiArCQkJCSFjb2xsZWN0aW5nIHx8DQo+DQo+ICsJCQkJ KCFwcm9taXNjICYmDQo+DQo+ICsJCQkJICgocnRlX2lzX3VuaWNhc3RfZXRoZXJfYWRkcigmaGRy LT5kc3RfYWRkcikgJiYNCj4NCj4gKwkJCQkgICAhcnRlX2lzX3NhbWVfZXRoZXJfYWRkcihib25k X21hYywNCj4NCj4gKwkJCQkJCSAgICAgICAmaGRyLT5kc3RfYWRkcikpIHx8DQo+DQo+ICsJCQkJ ICAoIWFsbG11bHRpICYmDQo+DQo+ICsJCQkJICAgcnRlX2lzX211bHRpY2FzdF9ldGhlcl9hZGRy KCZoZHItPmRzdF9hZGRyKSkpKSkpIHsNCj4NCj4gKw0KPg0KPiArCQkJCWlmIChoZHItPmV0aGVy X3R5cGUgPT0gZXRoZXJfdHlwZV9zbG93X2JlKSB7DQo+DQo+ICsJCQkJCWJvbmRfbW9kZV84MDIz YWRfaGFuZGxlX3Nsb3dfcGt0KA0KPg0KPiArCQkJCQkgICAgaW50ZXJuYWxzLCBzbGF2ZXNbaWR4 XSwgYnVmc1tqXSk7DQo+DQo+ICsJCQkJfSBlbHNlDQo+DQo+ICsJCQkJCXJ0ZV9wa3RtYnVmX2Zy ZWUoYnVmc1tqXSk7DQo+DQo+ICsNCj4NCj4gKwkJCQkvKiBQYWNrZXQgaXMgbWFuYWdlZCBieSBt b2RlIDQgb3IgZHJvcHBlZCwgc2hpZnQgdGhlIGFycmF5ICovDQo+DQo+ICsJCQkJbnVtX3J4X3Rv dGFsLS07DQo+DQo+ICsJCQkJaWYgKGogPCBudW1fcnhfdG90YWwpIHsNCj4NCj4gKwkJCQkJbWVt bW92ZSgmYnVmc1tqXSwgJmJ1ZnNbaiArIDFdLCBzaXplb2YoYnVmc1swXSkgKg0KPg0KPiArCQkJ CQkJKG51bV9yeF90b3RhbCAtIGopKTsNCj4NCj4gKwkJCQl9DQo+DQo+ICsJCQl9IGVsc2UNCj4N Cj4gKwkJCQlqKys7DQo+DQo+ICsJCX0NCj4NCj4gKwkJaWYgKHVubGlrZWx5KCsraWR4ID09IHNs YXZlX2NvdW50KSkNCj4NCj4gKwkJCWlkeCA9IDA7DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJ aWYgKCsrYmRfcnhfcS0+YWN0aXZlX3NsYXZlID49IHNsYXZlX2NvdW50KQ0KPg0KPiArCQliZF9y eF9xLT5hY3RpdmVfc2xhdmUgPSAwOw0KPg0KPiArDQo+DQo+ICsJcmV0dXJuIG51bV9yeF90b3Rh bDsNCj4NCj4gK30NCj4NCj4gKw0KPg0KPiArc3RhdGljIHVpbnQxNl90DQo+DQo+ICtib25kX2V0 aGRldl9yeF9idXJzdF84MDIzYWQodm9pZCAqcXVldWUsIHN0cnVjdCBydGVfbWJ1ZiAqKmJ1ZnMs DQo+DQo+ICsJCXVpbnQxNl90IG5iX3BrdHMpDQo+DQo+ICt7DQo+DQo+ICsJcmV0dXJuIHJ4X2J1 cnN0XzgwMjNhZChxdWV1ZSwgYnVmcywgbmJfcGt0cywgZmFsc2UpOw0KPg0KPiArfQ0KPg0KPiAr DQo+DQo+ICtzdGF0aWMgdWludDE2X3QNCj4NCj4gK2JvbmRfZXRoZGV2X3J4X2J1cnN0XzgwMjNh ZF9mYXN0X3F1ZXVlKHZvaWQgKnF1ZXVlLCBzdHJ1Y3QgcnRlX21idWYgKipidWZzLA0KPg0KPiAr CQl1aW50MTZfdCBuYl9wa3RzKQ0KPg0KPiArew0KPg0KPiArCXJldHVybiByeF9idXJzdF84MDIz YWQocXVldWUsIGJ1ZnMsIG5iX3BrdHMsIHRydWUpOw0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICsj aWYgZGVmaW5lZChSVEVfTElCUlRFX0JPTkRfREVCVUdfQUxCKSB8fCBkZWZpbmVkKFJURV9MSUJS VEVfQk9ORF9ERUJVR19BTEJfTDEpDQo+DQo+ICt1aW50MzJfdCBidXJzdG51bWJlclJYOw0KPg0K PiArdWludDMyX3QgYnVyc3RudW1iZXJUWDsNCj4NCj4gKw0KPg0KPiArI2lmZGVmIFJURV9MSUJS VEVfQk9ORF9ERUJVR19BTEINCj4NCj4gKw0KPg0KPiArc3RhdGljIHZvaWQNCj4NCj4gK2FycF9v cF9uYW1lKHVpbnQxNl90IGFycF9vcCwgY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbikNCj4NCj4g K3sNCj4NCj4gKwlzd2l0Y2ggKGFycF9vcCkgew0KPg0KPiArCWNhc2UgUlRFX0FSUF9PUF9SRVFV RVNUOg0KPg0KPiArCQlzdHJsY3B5KGJ1ZiwgIkFSUCBSZXF1ZXN0IiwgYnVmX2xlbik7DQo+DQo+ ICsJCXJldHVybjsNCj4NCj4gKwljYXNlIFJURV9BUlBfT1BfUkVQTFk6DQo+DQo+ICsJCXN0cmxj cHkoYnVmLCAiQVJQIFJlcGx5IiwgYnVmX2xlbik7DQo+DQo+ICsJCXJldHVybjsNCj4NCj4gKwlj YXNlIFJURV9BUlBfT1BfUkVWUkVRVUVTVDoNCj4NCj4gKwkJc3RybGNweShidWYsICJSZXZlcnNl IEFSUCBSZXF1ZXN0IiwgYnVmX2xlbik7DQo+DQo+ICsJCXJldHVybjsNCj4NCj4gKwljYXNlIFJU RV9BUlBfT1BfUkVWUkVQTFk6DQo+DQo+ICsJCXN0cmxjcHkoYnVmLCAiUmV2ZXJzZSBBUlAgUmVw bHkiLCBidWZfbGVuKTsNCj4NCj4gKwkJcmV0dXJuOw0KPg0KPiArCWNhc2UgUlRFX0FSUF9PUF9J TlZSRVFVRVNUOg0KPg0KPiArCQlzdHJsY3B5KGJ1ZiwgIlBlZXIgSWRlbnRpZnkgUmVxdWVzdCIs IGJ1Zl9sZW4pOw0KPg0KPiArCQlyZXR1cm47DQo+DQo+ICsJY2FzZSBSVEVfQVJQX09QX0lOVlJF UExZOg0KPg0KPiArCQlzdHJsY3B5KGJ1ZiwgIlBlZXIgSWRlbnRpZnkgUmVwbHkiLCBidWZfbGVu KTsNCj4NCj4gKwkJcmV0dXJuOw0KPg0KPiArCWRlZmF1bHQ6DQo+DQo+ICsJCWJyZWFrOw0KPg0K PiArCX0NCj4NCj4gKwlzdHJsY3B5KGJ1ZiwgIlVua25vd24iLCBidWZfbGVuKTsNCj4NCj4gKwly ZXR1cm47DQo+DQo+ICt9DQo+DQo+ICsjZW5kaWYNCj4NCj4gKyNkZWZpbmUgTWF4SVB2NFN0cmlu ZwkxNg0KPg0KPiArc3RhdGljIHZvaWQNCj4NCj4gK2lwdjRfYWRkcl90b19kb3QodWludDMyX3Qg YmVfaXB2NF9hZGRyLCBjaGFyICpidWYsIHVpbnQ4X3QgYnVmX3NpemUpDQo+DQo+ICt7DQo+DQo+ ICsJdWludDMyX3QgaXB2NF9hZGRyOw0KPg0KPiArDQo+DQo+ICsJaXB2NF9hZGRyID0gcnRlX2Jl X3RvX2NwdV8zMihiZV9pcHY0X2FkZHIpOw0KPg0KPiArCXNucHJpbnRmKGJ1ZiwgYnVmX3NpemUs ICIlZC4lZC4lZC4lZCIsIChpcHY0X2FkZHIgPj4gMjQpICYgMHhGRiwNCj4NCj4gKwkJKGlwdjRf YWRkciA+PiAxNikgJiAweEZGLCAoaXB2NF9hZGRyID4+IDgpICYgMHhGRiwNCj4NCj4gKwkJaXB2 NF9hZGRyICYgMHhGRik7DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gKyNkZWZpbmUgTUFYX0NMSUVO VFNfTlVNQkVSCTEyOA0KPg0KPiArdWludDhfdCBhY3RpdmVfY2xpZW50czsNCj4NCj4gK3N0cnVj dCBjbGllbnRfc3RhdHNfdCB7DQo+DQo+ICsJdWludDE2X3QgcG9ydDsNCj4NCj4gKwl1aW50MzJf dCBpcHY0X2FkZHI7DQo+DQo+ICsJdWludDMyX3QgaXB2NF9yeF9wYWNrZXRzOw0KPg0KPiArCXVp bnQzMl90IGlwdjRfdHhfcGFja2V0czsNCj4NCj4gK307DQo+DQo+ICtzdHJ1Y3QgY2xpZW50X3N0 YXRzX3QgY2xpZW50X3N0YXRzW01BWF9DTElFTlRTX05VTUJFUl07DQo+DQo+ICsNCj4NCj4gK3N0 YXRpYyB2b2lkDQo+DQo+ICt1cGRhdGVfY2xpZW50X3N0YXRzKHVpbnQzMl90IGFkZHIsIHVpbnQx Nl90IHBvcnQsIHVpbnQzMl90ICpUWG9yUlhpbmRpY2F0b3IpDQo+DQo+ICt7DQo+DQo+ICsJaW50 IGkgPSAwOw0KPg0KPiArDQo+DQo+ICsJZm9yICg7IGkgPCBNQVhfQ0xJRU5UU19OVU1CRVI7IGkr KykJew0KPg0KPiArCQlpZiAoKGNsaWVudF9zdGF0c1tpXS5pcHY0X2FkZHIgPT0gYWRkcikgJiYg KGNsaWVudF9zdGF0c1tpXS5wb3J0ID09IHBvcnQpKQl7DQo+DQo+ICsJCQkvKiBKdXN0IHVwZGF0 ZSBSWCBwYWNrZXRzIG51bWJlciBmb3IgdGhpcyBjbGllbnQgKi8NCj4NCj4gKwkJCWlmIChUWG9y UlhpbmRpY2F0b3IgPT0gJmJ1cnN0bnVtYmVyUlgpDQo+DQo+ICsJCQkJY2xpZW50X3N0YXRzW2ld LmlwdjRfcnhfcGFja2V0cysrOw0KPg0KPiArCQkJZWxzZQ0KPg0KPiArCQkJCWNsaWVudF9zdGF0 c1tpXS5pcHY0X3R4X3BhY2tldHMrKzsNCj4NCj4gKwkJCXJldHVybjsNCj4NCj4gKwkJfQ0KPg0K PiArCX0NCj4NCj4gKwkvKiBXZSBoYXZlIGEgbmV3IGNsaWVudC4gSW5zZXJ0IGhpbSB0byB0aGUg dGFibGUsIGFuZCBpbmNyZW1lbnQgc3RhdHMgKi8NCj4NCj4gKwlpZiAoVFhvclJYaW5kaWNhdG9y ID09ICZidXJzdG51bWJlclJYKQ0KPg0KPiArCQljbGllbnRfc3RhdHNbYWN0aXZlX2NsaWVudHNd LmlwdjRfcnhfcGFja2V0cysrOw0KPg0KPiArCWVsc2UNCj4NCj4gKwkJY2xpZW50X3N0YXRzW2Fj dGl2ZV9jbGllbnRzXS5pcHY0X3R4X3BhY2tldHMrKzsNCj4NCj4gKwljbGllbnRfc3RhdHNbYWN0 aXZlX2NsaWVudHNdLmlwdjRfYWRkciA9IGFkZHI7DQo+DQo+ICsJY2xpZW50X3N0YXRzW2FjdGl2 ZV9jbGllbnRzXS5wb3J0ID0gcG9ydDsNCj4NCj4gKwlhY3RpdmVfY2xpZW50cysrOw0KPg0KPiAr DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gKyNpZmRlZiBSVEVfTElCUlRFX0JPTkRfREVCVUdfQUxC DQo+DQo+ICsjZGVmaW5lIE1PREU2X0RFQlVHKGluZm8sIHNyY19pcCwgZHN0X2lwLCBldGhfaCwg YXJwX29wLCBwb3J0LCBidXJzdG51bWJlcikgXA0KPg0KPiArCXJ0ZV9sb2coUlRFX0xPR19ERUJV RywgYm9uZF9sb2d0eXBlLAkJCQlcDQo+DQo+ICsJCSIlcyBwb3J0OiVkIFNyY01BQzoiIFJURV9F VEhFUl9BRERSX1BSVF9GTVQgIiBTcmNJUDolcyAiIFwNCj4NCj4gKwkJIkRzdE1BQzoiIFJURV9F VEhFUl9BRERSX1BSVF9GTVQgIiBEc3RJUDolcyAlcyAlZFxuIiwgXA0KPg0KPiArCQlpbmZvLAkJ CQkJCQlcDQo+DQo+ICsJCXBvcnQsCQkJCQkJCVwNCj4NCj4gKwkJUlRFX0VUSEVSX0FERFJfQllU RVMoJmV0aF9oLT5zcmNfYWRkciksICAgICAgICAgICAgICAgICAgXA0KPg0KPiArCQlzcmNfaXAs CQkJCQkJCVwNCj4NCj4gKwkJUlRFX0VUSEVSX0FERFJfQllURVMoJmV0aF9oLT5kc3RfYWRkciks ICAgICAgICAgICAgICAgICAgXA0KPg0KPiArCQlkc3RfaXAsCQkJCQkJCVwNCj4NCj4gKwkJYXJw X29wLCArK2J1cnN0bnVtYmVyKQ0KPg0KPiArI2VuZGlmDQo+DQo+ICsNCj4NCj4gK3N0YXRpYyB2 b2lkDQo+DQo+ICttb2RlNl9kZWJ1Zyhjb25zdCBjaGFyIF9fcnRlX3VudXNlZCAqaW5mbywNCj4N Cj4gKwlzdHJ1Y3QgcnRlX2V0aGVyX2hkciAqZXRoX2gsIHVpbnQxNl90IHBvcnQsDQo+DQo+ICsJ dWludDMyX3QgX19ydGVfdW51c2VkICpidXJzdG51bWJlcikNCj4NCj4gK3sNCj4NCj4gKwlzdHJ1 Y3QgcnRlX2lwdjRfaGRyICppcHY0X2g7DQo+DQo+ICsjaWZkZWYgUlRFX0xJQlJURV9CT05EX0RF QlVHX0FMQg0KPg0KPiArCXN0cnVjdCBydGVfYXJwX2hkciAqYXJwX2g7DQo+DQo+ICsJY2hhciBk c3RfaXBbMTZdOw0KPg0KPiArCWNoYXIgQXJwT3BbMjRdOw0KPg0KPiArCWNoYXIgYnVmWzE2XTsN Cj4NCj4gKyNlbmRpZg0KPg0KPiArCWNoYXIgc3JjX2lwWzE2XTsNCj4NCj4gKw0KPg0KPiArCXVp bnQxNl90IGV0aGVyX3R5cGUgPSBldGhfaC0+ZXRoZXJfdHlwZTsNCj4NCj4gKwl1aW50MTZfdCBv ZmZzZXQgPSBnZXRfdmxhbl9vZmZzZXQoZXRoX2gsICZldGhlcl90eXBlKTsNCj4NCj4gKw0KPg0K PiArI2lmZGVmIFJURV9MSUJSVEVfQk9ORF9ERUJVR19BTEINCj4NCj4gKwlzdHJsY3B5KGJ1Ziwg aW5mbywgMTYpOw0KPg0KPiArI2VuZGlmDQo+DQo+ICsNCj4NCj4gKwlpZiAoZXRoZXJfdHlwZSA9 PSBydGVfY3B1X3RvX2JlXzE2KFJURV9FVEhFUl9UWVBFX0lQVjQpKSB7DQo+DQo+ICsJCWlwdjRf aCA9IChzdHJ1Y3QgcnRlX2lwdjRfaGRyICopKChjaGFyICopKGV0aF9oICsgMSkgKyBvZmZzZXQp Ow0KPg0KPiArCQlpcHY0X2FkZHJfdG9fZG90KGlwdjRfaC0+c3JjX2FkZHIsIHNyY19pcCwgTWF4 SVB2NFN0cmluZyk7DQo+DQo+ICsjaWZkZWYgUlRFX0xJQlJURV9CT05EX0RFQlVHX0FMQg0KPg0K PiArCQlpcHY0X2FkZHJfdG9fZG90KGlwdjRfaC0+ZHN0X2FkZHIsIGRzdF9pcCwgTWF4SVB2NFN0 cmluZyk7DQo+DQo+ICsJCU1PREU2X0RFQlVHKGJ1Ziwgc3JjX2lwLCBkc3RfaXAsIGV0aF9oLCAi IiwgcG9ydCwgKmJ1cnN0bnVtYmVyKTsNCj4NCj4gKyNlbmRpZg0KPg0KPiArCQl1cGRhdGVfY2xp ZW50X3N0YXRzKGlwdjRfaC0+c3JjX2FkZHIsIHBvcnQsIGJ1cnN0bnVtYmVyKTsNCj4NCj4gKwl9 DQo+DQo+ICsjaWZkZWYgUlRFX0xJQlJURV9CT05EX0RFQlVHX0FMQg0KPg0KPiArCWVsc2UgaWYg KGV0aGVyX3R5cGUgPT0gcnRlX2NwdV90b19iZV8xNihSVEVfRVRIRVJfVFlQRV9BUlApKSB7DQo+ DQo+ICsJCWFycF9oID0gKHN0cnVjdCBydGVfYXJwX2hkciAqKSgoY2hhciAqKShldGhfaCArIDEp ICsgb2Zmc2V0KTsNCj4NCj4gKwkJaXB2NF9hZGRyX3RvX2RvdChhcnBfaC0+YXJwX2RhdGEuYXJw X3NpcCwgc3JjX2lwLCBNYXhJUHY0U3RyaW5nKTsNCj4NCj4gKwkJaXB2NF9hZGRyX3RvX2RvdChh cnBfaC0+YXJwX2RhdGEuYXJwX3RpcCwgZHN0X2lwLCBNYXhJUHY0U3RyaW5nKTsNCj4NCj4gKwkJ YXJwX29wX25hbWUocnRlX2JlX3RvX2NwdV8xNihhcnBfaC0+YXJwX29wY29kZSksDQo+DQo+ICsJ CQkJQXJwT3AsIHNpemVvZihBcnBPcCkpOw0KPg0KPiArCQlNT0RFNl9ERUJVRyhidWYsIHNyY19p cCwgZHN0X2lwLCBldGhfaCwgQXJwT3AsIHBvcnQsICpidXJzdG51bWJlcik7DQo+DQo+ICsJfQ0K Pg0KPiArI2VuZGlmDQo+DQo+ICt9DQo+DQo+ICsjZW5kaWYNCj4NCj4gKw0KPg0KPiArc3RhdGlj IHVpbnQxNl90DQo+DQo+ICtib25kX2V0aGRldl9yeF9idXJzdF9hbGIodm9pZCAqcXVldWUsIHN0 cnVjdCBydGVfbWJ1ZiAqKmJ1ZnMsIHVpbnQxNl90IG5iX3BrdHMpDQo+DQo+ICt7DQo+DQo+ICsJ c3RydWN0IGJvbmRfcnhfcXVldWUgKmJkX3J4X3EgPSAoc3RydWN0IGJvbmRfcnhfcXVldWUgKilx dWV1ZTsNCj4NCj4gKwlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzID0gYmRfcnhf cS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsJc3RydWN0IHJ0ZV9ldGhlcl9oZHIgKmV0aF9oOw0KPg0K PiArCXVpbnQxNl90IGV0aGVyX3R5cGUsIG9mZnNldDsNCj4NCj4gKwl1aW50MTZfdCBuYl9yZWN2 X3BrdHM7DQo+DQo+ICsJaW50IGk7DQo+DQo+ICsNCj4NCj4gKwluYl9yZWN2X3BrdHMgPSBib25k X2V0aGRldl9yeF9idXJzdChxdWV1ZSwgYnVmcywgbmJfcGt0cyk7DQo+DQo+ICsNCj4NCj4gKwlm b3IgKGkgPSAwOyBpIDwgbmJfcmVjdl9wa3RzOyBpKyspIHsNCj4NCj4gKwkJZXRoX2ggPSBydGVf cGt0bWJ1Zl9tdG9kKGJ1ZnNbaV0sIHN0cnVjdCBydGVfZXRoZXJfaGRyICopOw0KPg0KPiArCQll dGhlcl90eXBlID0gZXRoX2gtPmV0aGVyX3R5cGU7DQo+DQo+ICsJCW9mZnNldCA9IGdldF92bGFu X29mZnNldChldGhfaCwgJmV0aGVyX3R5cGUpOw0KPg0KPiArDQo+DQo+ICsJCWlmIChldGhlcl90 eXBlID09IHJ0ZV9jcHVfdG9fYmVfMTYoUlRFX0VUSEVSX1RZUEVfQVJQKSkgew0KPg0KPiArI2lm IGRlZmluZWQoUlRFX0xJQlJURV9CT05EX0RFQlVHX0FMQikgfHwgZGVmaW5lZChSVEVfTElCUlRF X0JPTkRfREVCVUdfQUxCX0wxKQ0KPg0KPiArCQkJbW9kZTZfZGVidWcoIlJYIEFSUDoiLCBldGhf aCwgYnVmc1tpXS0+cG9ydCwgJmJ1cnN0bnVtYmVyUlgpOw0KPg0KPiArI2VuZGlmDQo+DQo+ICsJ CQlib25kX21vZGVfYWxiX2FycF9yZWN2KGV0aF9oLCBvZmZzZXQsIGludGVybmFscyk7DQo+DQo+ ICsJCX0NCj4NCj4gKyNpZiBkZWZpbmVkKFJURV9MSUJSVEVfQk9ORF9ERUJVR19BTEIpIHx8IGRl ZmluZWQoUlRFX0xJQlJURV9CT05EX0RFQlVHX0FMQl9MMSkNCj4NCj4gKwkJZWxzZSBpZiAoZXRo ZXJfdHlwZSA9PSBydGVfY3B1X3RvX2JlXzE2KFJURV9FVEhFUl9UWVBFX0lQVjQpKQ0KPg0KPiAr CQkJbW9kZTZfZGVidWcoIlJYIElQdjQ6IiwgZXRoX2gsIGJ1ZnNbaV0tPnBvcnQsICZidXJzdG51 bWJlclJYKTsNCj4NCj4gKyNlbmRpZg0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCXJldHVybiBu Yl9yZWN2X3BrdHM7DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyB1aW50MTZfdA0KPg0K PiArYm9uZF9ldGhkZXZfdHhfYnVyc3Rfcm91bmRfcm9iaW4odm9pZCAqcXVldWUsIHN0cnVjdCBy dGVfbWJ1ZiAqKmJ1ZnMsDQo+DQo+ICsJCXVpbnQxNl90IG5iX3BrdHMpDQo+DQo+ICt7DQo+DQo+ ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFsczsNCj4NCj4gKwlzdHJ1Y3QgYm9u ZF90eF9xdWV1ZSAqYmRfdHhfcTsNCj4NCj4gKw0KPg0KPiArCXN0cnVjdCBydGVfbWJ1ZiAqc2xh dmVfYnVmc1tSVEVfTUFYX0VUSFBPUlRTXVtuYl9wa3RzXTsNCj4NCj4gKwl1aW50MTZfdCBzbGF2 ZV9uYl9wa3RzW1JURV9NQVhfRVRIUE9SVFNdID0geyAwIH07DQo+DQo+ICsNCj4NCj4gKwl1aW50 MTZfdCBudW1fb2Zfc2xhdmVzOw0KPg0KPiArCXVpbnQxNl90IHNsYXZlc1tSVEVfTUFYX0VUSFBP UlRTXTsNCj4NCj4gKw0KPg0KPiArCXVpbnQxNl90IG51bV90eF90b3RhbCA9IDAsIG51bV90eF9z bGF2ZTsNCj4NCj4gKw0KPg0KPiArCXN0YXRpYyBpbnQgc2xhdmVfaWR4ID0gMDsNCj4NCj4gKwlp bnQgaSwgY3NsYXZlX2lkeCA9IDAsIHR4X2ZhaWxfdG90YWwgPSAwOw0KPg0KPiArDQo+DQo+ICsJ YmRfdHhfcSA9IChzdHJ1Y3QgYm9uZF90eF9xdWV1ZSAqKXF1ZXVlOw0KPg0KPiArCWludGVybmFs cyA9IGJkX3R4X3EtPmRldl9wcml2YXRlOw0KPg0KPiArDQo+DQo+ICsJLyogQ29weSBzbGF2ZSBs aXN0IHRvIHByb3RlY3QgYWdhaW5zdCBzbGF2ZSB1cC9kb3duIGNoYW5nZXMgZHVyaW5nIHR4DQo+ DQo+ICsJICogYnVyc3RpbmcgKi8NCj4NCj4gKwludW1fb2Zfc2xhdmVzID0gaW50ZXJuYWxzLT5h Y3RpdmVfc2xhdmVfY291bnQ7DQo+DQo+ICsJbWVtY3B5KHNsYXZlcywgaW50ZXJuYWxzLT5hY3Rp dmVfc2xhdmVzLA0KPg0KPiArCQkJc2l6ZW9mKGludGVybmFscy0+YWN0aXZlX3NsYXZlc1swXSkg KiBudW1fb2Zfc2xhdmVzKTsNCj4NCj4gKw0KPg0KPiArCWlmIChudW1fb2Zfc2xhdmVzIDwgMSkN Cj4NCj4gKwkJcmV0dXJuIG51bV90eF90b3RhbDsNCj4NCj4gKw0KPg0KPiArCS8qIFBvcHVsYXRl IHNsYXZlcyBtYnVmIHdpdGggd2hpY2ggcGFja2V0cyBhcmUgdG8gYmUgc2VudCBvbiBpdCAgKi8N Cj4NCj4gKwlmb3IgKGkgPSAwOyBpIDwgbmJfcGt0czsgaSsrKSB7DQo+DQo+ICsJCWNzbGF2ZV9p ZHggPSAoc2xhdmVfaWR4ICsgaSkgJSBudW1fb2Zfc2xhdmVzOw0KPg0KPiArCQlzbGF2ZV9idWZz W2NzbGF2ZV9pZHhdWyhzbGF2ZV9uYl9wa3RzW2NzbGF2ZV9pZHhdKSsrXSA9IGJ1ZnNbaV07DQo+ DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJLyogaW5jcmVtZW50IGN1cnJlbnQgc2xhdmUgaW5kZXgg c28gdGhlIG5leHQgY2FsbCB0byB0eCBidXJzdCBzdGFydHMgb24gdGhlDQo+DQo+ICsJICogbmV4 dCBzbGF2ZSAqLw0KPg0KPiArCXNsYXZlX2lkeCA9ICsrY3NsYXZlX2lkeDsNCj4NCj4gKw0KPg0K PiArCS8qIFNlbmQgcGFja2V0IGJ1cnN0IG9uIGVhY2ggc2xhdmUgZGV2aWNlICovDQo+DQo+ICsJ Zm9yIChpID0gMDsgaSA8IG51bV9vZl9zbGF2ZXM7IGkrKykgew0KPg0KPiArCQlpZiAoc2xhdmVf bmJfcGt0c1tpXSA+IDApIHsNCj4NCj4gKwkJCW51bV90eF9zbGF2ZSA9IHJ0ZV9ldGhfdHhfYnVy c3Qoc2xhdmVzW2ldLCBiZF90eF9xLT5xdWV1ZV9pZCwNCj4NCj4gKwkJCQkJc2xhdmVfYnVmc1tp XSwgc2xhdmVfbmJfcGt0c1tpXSk7DQo+DQo+ICsNCj4NCj4gKwkJCS8qIGlmIHR4IGJ1cnN0IGZh aWxzIG1vdmUgcGFja2V0cyB0byBlbmQgb2YgYnVmcyAqLw0KPg0KPiArCQkJaWYgKHVubGlrZWx5 KG51bV90eF9zbGF2ZSA8IHNsYXZlX25iX3BrdHNbaV0pKSB7DQo+DQo+ICsJCQkJaW50IHR4X2Zh aWxfc2xhdmUgPSBzbGF2ZV9uYl9wa3RzW2ldIC0gbnVtX3R4X3NsYXZlOw0KPg0KPiArDQo+DQo+ ICsJCQkJdHhfZmFpbF90b3RhbCArPSB0eF9mYWlsX3NsYXZlOw0KPg0KPiArDQo+DQo+ICsJCQkJ bWVtY3B5KCZidWZzW25iX3BrdHMgLSB0eF9mYWlsX3RvdGFsXSwNCj4NCj4gKwkJCQkgICAgICAg JnNsYXZlX2J1ZnNbaV1bbnVtX3R4X3NsYXZlXSwNCj4NCj4gKwkJCQkgICAgICAgdHhfZmFpbF9z bGF2ZSAqIHNpemVvZihidWZzWzBdKSk7DQo+DQo+ICsJCQl9DQo+DQo+ICsJCQludW1fdHhfdG90 YWwgKz0gbnVtX3R4X3NsYXZlOw0KPg0KPiArCQl9DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJ cmV0dXJuIG51bV90eF90b3RhbDsNCj4NCj4gK30NCj4NCj4gKw0KPg0KPiArc3RhdGljIHVpbnQx Nl90DQo+DQo+ICtib25kX2V0aGRldl90eF9idXJzdF9hY3RpdmVfYmFja3VwKHZvaWQgKnF1ZXVl LA0KPg0KPiArCQlzdHJ1Y3QgcnRlX21idWYgKipidWZzLCB1aW50MTZfdCBuYl9wa3RzKQ0KPg0K PiArew0KPg0KPiArCXN0cnVjdCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHM7DQo+DQo+ICsJ c3RydWN0IGJvbmRfdHhfcXVldWUgKmJkX3R4X3E7DQo+DQo+ICsNCj4NCj4gKwliZF90eF9xID0g KHN0cnVjdCBib25kX3R4X3F1ZXVlICopcXVldWU7DQo+DQo+ICsJaW50ZXJuYWxzID0gYmRfdHhf cS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsNCj4NCj4gKwlpZiAoaW50ZXJuYWxzLT5hY3RpdmVfc2xh dmVfY291bnQgPCAxKQ0KPg0KPiArCQlyZXR1cm4gMDsNCj4NCj4gKw0KPg0KPiArCXJldHVybiBy dGVfZXRoX3R4X2J1cnN0KGludGVybmFscy0+Y3VycmVudF9wcmltYXJ5X3BvcnQsIGJkX3R4X3Et PnF1ZXVlX2lkLA0KPg0KPiArCQkJYnVmcywgbmJfcGt0cyk7DQo+DQo+ICt9DQo+DQo+ICsNCj4N Cj4gK3N0YXRpYyBpbmxpbmUgdWludDE2X3QNCj4NCj4gK2V0aGVyX2hhc2goc3RydWN0IHJ0ZV9l dGhlcl9oZHIgKmV0aF9oZHIpDQo+DQo+ICt7DQo+DQo+ICsJdW5hbGlnbmVkX3VpbnQxNl90ICp3 b3JkX3NyY19hZGRyID0NCj4NCj4gKwkJKHVuYWxpZ25lZF91aW50MTZfdCAqKWV0aF9oZHItPnNy Y19hZGRyLmFkZHJfYnl0ZXM7DQo+DQo+ICsJdW5hbGlnbmVkX3VpbnQxNl90ICp3b3JkX2RzdF9h ZGRyID0NCj4NCj4gKwkJKHVuYWxpZ25lZF91aW50MTZfdCAqKWV0aF9oZHItPmRzdF9hZGRyLmFk ZHJfYnl0ZXM7DQo+DQo+ICsNCj4NCj4gKwlyZXR1cm4gKHdvcmRfc3JjX2FkZHJbMF0gXiB3b3Jk X2RzdF9hZGRyWzBdKSBeDQo+DQo+ICsJCQkod29yZF9zcmNfYWRkclsxXSBeIHdvcmRfZHN0X2Fk ZHJbMV0pIF4NCj4NCj4gKwkJCSh3b3JkX3NyY19hZGRyWzJdIF4gd29yZF9kc3RfYWRkclsyXSk7 DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyBpbmxpbmUgdWludDMyX3QNCj4NCj4gK2lw djRfaGFzaChzdHJ1Y3QgcnRlX2lwdjRfaGRyICppcHY0X2hkcikNCj4NCj4gK3sNCj4NCj4gKwly ZXR1cm4gaXB2NF9oZHItPnNyY19hZGRyIF4gaXB2NF9oZHItPmRzdF9hZGRyOw0KPg0KPiArfQ0K Pg0KPiArDQo+DQo+ICtzdGF0aWMgaW5saW5lIHVpbnQzMl90DQo+DQo+ICtpcHY2X2hhc2goc3Ry dWN0IHJ0ZV9pcHY2X2hkciAqaXB2Nl9oZHIpDQo+DQo+ICt7DQo+DQo+ICsJdW5hbGlnbmVkX3Vp bnQzMl90ICp3b3JkX3NyY19hZGRyID0NCj4NCj4gKwkJKHVuYWxpZ25lZF91aW50MzJfdCAqKSYo aXB2Nl9oZHItPnNyY19hZGRyWzBdKTsNCj4NCj4gKwl1bmFsaWduZWRfdWludDMyX3QgKndvcmRf ZHN0X2FkZHIgPQ0KPg0KPiArCQkodW5hbGlnbmVkX3VpbnQzMl90ICopJihpcHY2X2hkci0+ZHN0 X2FkZHJbMF0pOw0KPg0KPiArDQo+DQo+ICsJcmV0dXJuICh3b3JkX3NyY19hZGRyWzBdIF4gd29y ZF9kc3RfYWRkclswXSkgXg0KPg0KPiArCQkJKHdvcmRfc3JjX2FkZHJbMV0gXiB3b3JkX2RzdF9h ZGRyWzFdKSBeDQo+DQo+ICsJCQkod29yZF9zcmNfYWRkclsyXSBeIHdvcmRfZHN0X2FkZHJbMl0p IF4NCj4NCj4gKwkJCSh3b3JkX3NyY19hZGRyWzNdIF4gd29yZF9kc3RfYWRkclszXSk7DQo+DQo+ ICt9DQo+DQo+ICsNCj4NCj4gKw0KPg0KPiArdm9pZA0KPg0KPiArYnVyc3RfeG1pdF9sMl9oYXNo KHN0cnVjdCBydGVfbWJ1ZiAqKmJ1ZiwgdWludDE2X3QgbmJfcGt0cywNCj4NCj4gKwkJdWludDE2 X3Qgc2xhdmVfY291bnQsIHVpbnQxNl90ICpzbGF2ZXMpDQo+DQo+ICt7DQo+DQo+ICsJc3RydWN0 IHJ0ZV9ldGhlcl9oZHIgKmV0aF9oZHI7DQo+DQo+ICsJdWludDMyX3QgaGFzaDsNCj4NCj4gKwlp bnQgaTsNCj4NCj4gKw0KPg0KPiArCWZvciAoaSA9IDA7IGkgPCBuYl9wa3RzOyBpKyspIHsNCj4N Cj4gKwkJZXRoX2hkciA9IHJ0ZV9wa3RtYnVmX210b2QoYnVmW2ldLCBzdHJ1Y3QgcnRlX2V0aGVy X2hkciAqKTsNCj4NCj4gKw0KPg0KPiArCQloYXNoID0gZXRoZXJfaGFzaChldGhfaGRyKTsNCj4N Cj4gKw0KPg0KPiArCQlzbGF2ZXNbaV0gPSAoaGFzaCBePSBoYXNoID4+IDgpICUgc2xhdmVfY291 bnQ7DQo+DQo+ICsJfQ0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICt2b2lkDQo+DQo+ICtidXJzdF94 bWl0X2wyM19oYXNoKHN0cnVjdCBydGVfbWJ1ZiAqKmJ1ZiwgdWludDE2X3QgbmJfcGt0cywNCj4N Cj4gKwkJdWludDE2X3Qgc2xhdmVfY291bnQsIHVpbnQxNl90ICpzbGF2ZXMpDQo+DQo+ICt7DQo+ DQo+ICsJdWludDE2X3QgaTsNCj4NCj4gKwlzdHJ1Y3QgcnRlX2V0aGVyX2hkciAqZXRoX2hkcjsN Cj4NCj4gKwl1aW50MTZfdCBwcm90bzsNCj4NCj4gKwlzaXplX3Qgdmxhbl9vZmZzZXQ7DQo+DQo+ ICsJdWludDMyX3QgaGFzaCwgbDNoYXNoOw0KPg0KPiArDQo+DQo+ICsJZm9yIChpID0gMDsgaSA8 IG5iX3BrdHM7IGkrKykgew0KPg0KPiArCQlldGhfaGRyID0gcnRlX3BrdG1idWZfbXRvZChidWZb aV0sIHN0cnVjdCBydGVfZXRoZXJfaGRyICopOw0KPg0KPiArCQlsM2hhc2ggPSAwOw0KPg0KPiAr DQo+DQo+ICsJCXByb3RvID0gZXRoX2hkci0+ZXRoZXJfdHlwZTsNCj4NCj4gKwkJaGFzaCA9IGV0 aGVyX2hhc2goZXRoX2hkcik7DQo+DQo+ICsNCj4NCj4gKwkJdmxhbl9vZmZzZXQgPSBnZXRfdmxh bl9vZmZzZXQoZXRoX2hkciwgJnByb3RvKTsNCj4NCj4gKw0KPg0KPiArCQlpZiAocnRlX2NwdV90 b19iZV8xNihSVEVfRVRIRVJfVFlQRV9JUFY0KSA9PSBwcm90bykgew0KPg0KPiArCQkJc3RydWN0 IHJ0ZV9pcHY0X2hkciAqaXB2NF9oZHIgPSAoc3RydWN0IHJ0ZV9pcHY0X2hkciAqKQ0KPg0KPiAr CQkJCQkoKGNoYXIgKikoZXRoX2hkciArIDEpICsgdmxhbl9vZmZzZXQpOw0KPg0KPiArCQkJbDNo YXNoID0gaXB2NF9oYXNoKGlwdjRfaGRyKTsNCj4NCj4gKw0KPg0KPiArCQl9IGVsc2UgaWYgKHJ0 ZV9jcHVfdG9fYmVfMTYoUlRFX0VUSEVSX1RZUEVfSVBWNikgPT0gcHJvdG8pIHsNCj4NCj4gKwkJ CXN0cnVjdCBydGVfaXB2Nl9oZHIgKmlwdjZfaGRyID0gKHN0cnVjdCBydGVfaXB2Nl9oZHIgKikN Cj4NCj4gKwkJCQkJKChjaGFyICopKGV0aF9oZHIgKyAxKSArIHZsYW5fb2Zmc2V0KTsNCj4NCj4g KwkJCWwzaGFzaCA9IGlwdjZfaGFzaChpcHY2X2hkcik7DQo+DQo+ICsJCX0NCj4NCj4gKw0KPg0K PiArCQloYXNoID0gaGFzaCBeIGwzaGFzaDsNCj4NCj4gKwkJaGFzaCBePSBoYXNoID4+IDE2Ow0K Pg0KPiArCQloYXNoIF49IGhhc2ggPj4gODsNCj4NCj4gKw0KPg0KPiArCQlzbGF2ZXNbaV0gPSBo YXNoICUgc2xhdmVfY291bnQ7DQo+DQo+ICsJfQ0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICt2b2lk DQo+DQo+ICtidXJzdF94bWl0X2wzNF9oYXNoKHN0cnVjdCBydGVfbWJ1ZiAqKmJ1ZiwgdWludDE2 X3QgbmJfcGt0cywNCj4NCj4gKwkJdWludDE2X3Qgc2xhdmVfY291bnQsIHVpbnQxNl90ICpzbGF2 ZXMpDQo+DQo+ICt7DQo+DQo+ICsJc3RydWN0IHJ0ZV9ldGhlcl9oZHIgKmV0aF9oZHI7DQo+DQo+ ICsJdWludDE2X3QgcHJvdG87DQo+DQo+ICsJc2l6ZV90IHZsYW5fb2Zmc2V0Ow0KPg0KPiArCWlu dCBpOw0KPg0KPiArDQo+DQo+ICsJc3RydWN0IHJ0ZV91ZHBfaGRyICp1ZHBfaGRyOw0KPg0KPiAr CXN0cnVjdCBydGVfdGNwX2hkciAqdGNwX2hkcjsNCj4NCj4gKwl1aW50MzJfdCBoYXNoLCBsM2hh c2gsIGw0aGFzaDsNCj4NCj4gKw0KPg0KPiArCWZvciAoaSA9IDA7IGkgPCBuYl9wa3RzOyBpKysp IHsNCj4NCj4gKwkJZXRoX2hkciA9IHJ0ZV9wa3RtYnVmX210b2QoYnVmW2ldLCBzdHJ1Y3QgcnRl X2V0aGVyX2hkciAqKTsNCj4NCj4gKwkJc2l6ZV90IHBrdF9lbmQgPSAoc2l6ZV90KWV0aF9oZHIg KyBydGVfcGt0bWJ1Zl9kYXRhX2xlbihidWZbaV0pOw0KPg0KPiArCQlwcm90byA9IGV0aF9oZHIt PmV0aGVyX3R5cGU7DQo+DQo+ICsJCXZsYW5fb2Zmc2V0ID0gZ2V0X3ZsYW5fb2Zmc2V0KGV0aF9o ZHIsICZwcm90byk7DQo+DQo+ICsJCWwzaGFzaCA9IDA7DQo+DQo+ICsJCWw0aGFzaCA9IDA7DQo+ DQo+ICsNCj4NCj4gKwkJaWYgKHJ0ZV9jcHVfdG9fYmVfMTYoUlRFX0VUSEVSX1RZUEVfSVBWNCkg PT0gcHJvdG8pIHsNCj4NCj4gKwkJCXN0cnVjdCBydGVfaXB2NF9oZHIgKmlwdjRfaGRyID0gKHN0 cnVjdCBydGVfaXB2NF9oZHIgKikNCj4NCj4gKwkJCQkJKChjaGFyICopKGV0aF9oZHIgKyAxKSAr IHZsYW5fb2Zmc2V0KTsNCj4NCj4gKwkJCXNpemVfdCBpcF9oZHJfb2Zmc2V0Ow0KPg0KPiArDQo+ DQo+ICsJCQlsM2hhc2ggPSBpcHY0X2hhc2goaXB2NF9oZHIpOw0KPg0KPiArDQo+DQo+ICsJCQkv KiB0aGVyZSBpcyBubyBMNCBoZWFkZXIgaW4gZnJhZ21lbnRlZCBwYWNrZXQgKi8NCj4NCj4gKwkJ CWlmIChsaWtlbHkocnRlX2lwdjRfZnJhZ19wa3RfaXNfZnJhZ21lbnRlZChpcHY0X2hkcikNCj4N Cj4gKwkJCQkJCQkJPT0gMCkpIHsNCj4NCj4gKwkJCQlpcF9oZHJfb2Zmc2V0ID0gKGlwdjRfaGRy LT52ZXJzaW9uX2lobA0KPg0KPiArCQkJCQkmIFJURV9JUFY0X0hEUl9JSExfTUFTSykgKg0KPg0K PiArCQkJCQlSVEVfSVBWNF9JSExfTVVMVElQTElFUjsNCj4NCj4gKw0KPg0KPiArCQkJCWlmIChp cHY0X2hkci0+bmV4dF9wcm90b19pZCA9PSBJUFBST1RPX1RDUCkgew0KPg0KPiArCQkJCQl0Y3Bf aGRyID0gKHN0cnVjdCBydGVfdGNwX2hkciAqKQ0KPg0KPiArCQkJCQkJKChjaGFyICopaXB2NF9o ZHIgKw0KPg0KPiArCQkJCQkJCWlwX2hkcl9vZmZzZXQpOw0KPg0KPiArCQkJCQlpZiAoKHNpemVf dCl0Y3BfaGRyICsgc2l6ZW9mKCp0Y3BfaGRyKQ0KPg0KPiArCQkJCQkJCTw9IHBrdF9lbmQpDQo+ DQo+ICsJCQkJCQlsNGhhc2ggPSBIQVNIX0w0X1BPUlRTKHRjcF9oZHIpOw0KPg0KPiArCQkJCX0g ZWxzZSBpZiAoaXB2NF9oZHItPm5leHRfcHJvdG9faWQgPT0NCj4NCj4gKwkJCQkJCQkJSVBQUk9U T19VRFApIHsNCj4NCj4gKwkJCQkJdWRwX2hkciA9IChzdHJ1Y3QgcnRlX3VkcF9oZHIgKikNCj4N Cj4gKwkJCQkJCSgoY2hhciAqKWlwdjRfaGRyICsNCj4NCj4gKwkJCQkJCQlpcF9oZHJfb2Zmc2V0 KTsNCj4NCj4gKwkJCQkJaWYgKChzaXplX3QpdWRwX2hkciArIHNpemVvZigqdWRwX2hkcikNCj4N Cj4gKwkJCQkJCQk8IHBrdF9lbmQpDQo+DQo+ICsJCQkJCQlsNGhhc2ggPSBIQVNIX0w0X1BPUlRT KHVkcF9oZHIpOw0KPg0KPiArCQkJCX0NCj4NCj4gKwkJCX0NCj4NCj4gKwkJfSBlbHNlIGlmICAo cnRlX2NwdV90b19iZV8xNihSVEVfRVRIRVJfVFlQRV9JUFY2KSA9PSBwcm90bykgew0KPg0KPiAr CQkJc3RydWN0IHJ0ZV9pcHY2X2hkciAqaXB2Nl9oZHIgPSAoc3RydWN0IHJ0ZV9pcHY2X2hkciAq KQ0KPg0KPiArCQkJCQkoKGNoYXIgKikoZXRoX2hkciArIDEpICsgdmxhbl9vZmZzZXQpOw0KPg0K PiArCQkJbDNoYXNoID0gaXB2Nl9oYXNoKGlwdjZfaGRyKTsNCj4NCj4gKw0KPg0KPiArCQkJaWYg KGlwdjZfaGRyLT5wcm90byA9PSBJUFBST1RPX1RDUCkgew0KPg0KPiArCQkJCXRjcF9oZHIgPSAo c3RydWN0IHJ0ZV90Y3BfaGRyICopKGlwdjZfaGRyICsgMSk7DQo+DQo+ICsJCQkJbDRoYXNoID0g SEFTSF9MNF9QT1JUUyh0Y3BfaGRyKTsNCj4NCj4gKwkJCX0gZWxzZSBpZiAoaXB2Nl9oZHItPnBy b3RvID09IElQUFJPVE9fVURQKSB7DQo+DQo+ICsJCQkJdWRwX2hkciA9IChzdHJ1Y3QgcnRlX3Vk cF9oZHIgKikoaXB2Nl9oZHIgKyAxKTsNCj4NCj4gKwkJCQlsNGhhc2ggPSBIQVNIX0w0X1BPUlRT KHVkcF9oZHIpOw0KPg0KPiArCQkJfQ0KPg0KPiArCQl9DQo+DQo+ICsNCj4NCj4gKwkJaGFzaCA9 IGwzaGFzaCBeIGw0aGFzaDsNCj4NCj4gKwkJaGFzaCBePSBoYXNoID4+IDE2Ow0KPg0KPiArCQlo YXNoIF49IGhhc2ggPj4gODsNCj4NCj4gKw0KPg0KPiArCQlzbGF2ZXNbaV0gPSBoYXNoICUgc2xh dmVfY291bnQ7DQo+DQo+ICsJfQ0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICtzdHJ1Y3QgYndnX3Ns YXZlIHsNCj4NCj4gKwl1aW50NjRfdCBid2dfbGVmdF9pbnQ7DQo+DQo+ICsJdWludDY0X3QgYndn X2xlZnRfcmVtYWluZGVyOw0KPg0KPiArCXVpbnQxNl90IHNsYXZlOw0KPg0KPiArfTsNCj4NCj4g Kw0KPg0KPiArdm9pZA0KPg0KPiArYm9uZF90bGJfYWN0aXZhdGVfc2xhdmUoc3RydWN0IGJvbmRf ZGV2X3ByaXZhdGUgKmludGVybmFscykgew0KPg0KPiArCWludCBpOw0KPg0KPiArDQo+DQo+ICsJ Zm9yIChpID0gMDsgaSA8IGludGVybmFscy0+YWN0aXZlX3NsYXZlX2NvdW50OyBpKyspIHsNCj4N Cj4gKwkJdGxiX2xhc3Rfb2J5dGV0c1tpbnRlcm5hbHMtPmFjdGl2ZV9zbGF2ZXNbaV1dID0gMDsN Cj4NCj4gKwl9DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyBpbnQNCj4NCj4gK2JhbmR3 aWR0aF9jbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikNCj4NCj4gK3sNCj4NCj4gKwlj b25zdCBzdHJ1Y3QgYndnX3NsYXZlICpid2dfYSA9IGE7DQo+DQo+ICsJY29uc3Qgc3RydWN0IGJ3 Z19zbGF2ZSAqYndnX2IgPSBiOw0KPg0KPiArCWludDY0X3QgZGlmZiA9IChpbnQ2NF90KWJ3Z19i LT5id2dfbGVmdF9pbnQgLSAoaW50NjRfdClid2dfYS0+YndnX2xlZnRfaW50Ow0KPg0KPiArCWlu dDY0X3QgZGlmZjIgPSAoaW50NjRfdClid2dfYi0+YndnX2xlZnRfcmVtYWluZGVyIC0NCj4NCj4g KwkJCShpbnQ2NF90KWJ3Z19hLT5id2dfbGVmdF9yZW1haW5kZXI7DQo+DQo+ICsJaWYgKGRpZmYg PiAwKQ0KPg0KPiArCQlyZXR1cm4gMTsNCj4NCj4gKwllbHNlIGlmIChkaWZmIDwgMCkNCj4NCj4g KwkJcmV0dXJuIC0xOw0KPg0KPiArCWVsc2UgaWYgKGRpZmYyID4gMCkNCj4NCj4gKwkJcmV0dXJu IDE7DQo+DQo+ICsJZWxzZSBpZiAoZGlmZjIgPCAwKQ0KPg0KPiArCQlyZXR1cm4gLTE7DQo+DQo+ ICsJZWxzZQ0KPg0KPiArCQlyZXR1cm4gMDsNCj4NCj4gK30NCj4NCj4gKw0KPg0KPiArc3RhdGlj IHZvaWQNCj4NCj4gK2JhbmR3aWR0aF9sZWZ0KHVpbnQxNl90IHBvcnRfaWQsIHVpbnQ2NF90IGxv YWQsIHVpbnQ4X3QgdXBkYXRlX2lkeCwNCj4NCj4gKwkJc3RydWN0IGJ3Z19zbGF2ZSAqYndnX3Ns YXZlKQ0KPg0KPiArew0KPg0KPiArCXN0cnVjdCBydGVfZXRoX2xpbmsgbGlua19zdGF0dXM7DQo+ DQo+ICsJaW50IHJldDsNCj4NCj4gKw0KPg0KPiArCXJldCA9IHJ0ZV9ldGhfbGlua19nZXRfbm93 YWl0KHBvcnRfaWQsICZsaW5rX3N0YXR1cyk7DQo+DQo+ICsJaWYgKHJldCA8IDApIHsNCj4NCj4g KwkJUlRFX0JPTkRfTE9HKEVSUiwgIlNsYXZlIChwb3J0ICV1KSBsaW5rIGdldCBmYWlsZWQ6ICVz IiwNCj4NCj4gKwkJCSAgICAgcG9ydF9pZCwgcnRlX3N0cmVycm9yKC1yZXQpKTsNCj4NCj4gKwkJ cmV0dXJuOw0KPg0KPiArCX0NCj4NCj4gKwl1aW50NjRfdCBsaW5rX2J3ZyA9IGxpbmtfc3RhdHVz Lmxpbmtfc3BlZWQgKiAxMDAwMDAwVUxMIC8gODsNCj4NCj4gKwlpZiAobGlua19id2cgPT0gMCkN Cj4NCj4gKwkJcmV0dXJuOw0KPg0KPiArCWxpbmtfYndnID0gbGlua19id2cgKiAodXBkYXRlX2lk eCsxKSAqIFJFT1JERVJfUEVSSU9EX01TOw0KPg0KPiArCWJ3Z19zbGF2ZS0+YndnX2xlZnRfaW50 ID0gKGxpbmtfYndnIC0gMTAwMCpsb2FkKSAvIGxpbmtfYndnOw0KPg0KPiArCWJ3Z19zbGF2ZS0+ YndnX2xlZnRfcmVtYWluZGVyID0gKGxpbmtfYndnIC0gMTAwMCpsb2FkKSAlIGxpbmtfYndnOw0K Pg0KPiArfQ0KPg0KPiArDQo+DQo+ICtzdGF0aWMgdm9pZA0KPg0KPiArYm9uZF9ldGhkZXZfdXBk YXRlX3RsYl9zbGF2ZV9jYih2b2lkICphcmcpDQo+DQo+ICt7DQo+DQo+ICsJc3RydWN0IGJvbmRf ZGV2X3ByaXZhdGUgKmludGVybmFscyA9IGFyZzsNCj4NCj4gKwlzdHJ1Y3QgcnRlX2V0aF9zdGF0 cyBzbGF2ZV9zdGF0czsNCj4NCj4gKwlzdHJ1Y3QgYndnX3NsYXZlIGJ3Z19hcnJheVtSVEVfTUFY X0VUSFBPUlRTXTsNCj4NCj4gKwl1aW50MTZfdCBzbGF2ZV9jb3VudDsNCj4NCj4gKwl1aW50NjRf dCB0eF9ieXRlczsNCj4NCj4gKw0KPg0KPiArCXVpbnQ4X3QgdXBkYXRlX3N0YXRzID0gMDsNCj4N Cj4gKwl1aW50MTZfdCBzbGF2ZV9pZDsNCj4NCj4gKwl1aW50MTZfdCBpOw0KPg0KPiArDQo+DQo+ ICsJaW50ZXJuYWxzLT5zbGF2ZV91cGRhdGVfaWR4Kys7DQo+DQo+ICsNCj4NCj4gKw0KPg0KPiAr CWlmIChpbnRlcm5hbHMtPnNsYXZlX3VwZGF0ZV9pZHggPj0gUkVPUkRFUl9QRVJJT0RfTVMpDQo+ DQo+ICsJCXVwZGF0ZV9zdGF0cyA9IDE7DQo+DQo+ICsNCj4NCj4gKwlmb3IgKGkgPSAwOyBpIDwg aW50ZXJuYWxzLT5hY3RpdmVfc2xhdmVfY291bnQ7IGkrKykgew0KPg0KPiArCQlzbGF2ZV9pZCA9 IGludGVybmFscy0+YWN0aXZlX3NsYXZlc1tpXTsNCj4NCj4gKwkJcnRlX2V0aF9zdGF0c19nZXQo c2xhdmVfaWQsICZzbGF2ZV9zdGF0cyk7DQo+DQo+ICsJCXR4X2J5dGVzID0gc2xhdmVfc3RhdHMu b2J5dGVzIC0gdGxiX2xhc3Rfb2J5dGV0c1tzbGF2ZV9pZF07DQo+DQo+ICsJCWJhbmR3aWR0aF9s ZWZ0KHNsYXZlX2lkLCB0eF9ieXRlcywNCj4NCj4gKwkJCQlpbnRlcm5hbHMtPnNsYXZlX3VwZGF0 ZV9pZHgsICZid2dfYXJyYXlbaV0pOw0KPg0KPiArCQlid2dfYXJyYXlbaV0uc2xhdmUgPSBzbGF2 ZV9pZDsNCj4NCj4gKw0KPg0KPiArCQlpZiAodXBkYXRlX3N0YXRzKSB7DQo+DQo+ICsJCQl0bGJf bGFzdF9vYnl0ZXRzW3NsYXZlX2lkXSA9IHNsYXZlX3N0YXRzLm9ieXRlczsNCj4NCj4gKwkJfQ0K Pg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCWlmICh1cGRhdGVfc3RhdHMgPT0gMSkNCj4NCj4gKwkJ aW50ZXJuYWxzLT5zbGF2ZV91cGRhdGVfaWR4ID0gMDsNCj4NCj4gKw0KPg0KPiArCXNsYXZlX2Nv dW50ID0gaTsNCj4NCj4gKwlxc29ydChid2dfYXJyYXksIHNsYXZlX2NvdW50LCBzaXplb2YoYndn X2FycmF5WzBdKSwgYmFuZHdpZHRoX2NtcCk7DQo+DQo+ICsJZm9yIChpID0gMDsgaSA8IHNsYXZl X2NvdW50OyBpKyspDQo+DQo+ICsJCWludGVybmFscy0+dGxiX3NsYXZlc19vcmRlcltpXSA9IGJ3 Z19hcnJheVtpXS5zbGF2ZTsNCj4NCj4gKw0KPg0KPiArCXJ0ZV9lYWxfYWxhcm1fc2V0KFJFT1JE RVJfUEVSSU9EX01TICogMTAwMCwgYm9uZF9ldGhkZXZfdXBkYXRlX3RsYl9zbGF2ZV9jYiwNCj4N Cj4gKwkJCShzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqKWludGVybmFscyk7DQo+DQo+ICt9DQo+ DQo+ICsNCj4NCj4gK3N0YXRpYyB1aW50MTZfdA0KPg0KPiArYm9uZF9ldGhkZXZfdHhfYnVyc3Rf dGxiKHZvaWQgKnF1ZXVlLCBzdHJ1Y3QgcnRlX21idWYgKipidWZzLCB1aW50MTZfdCBuYl9wa3Rz KQ0KPg0KPiArew0KPg0KPiArCXN0cnVjdCBib25kX3R4X3F1ZXVlICpiZF90eF9xID0gKHN0cnVj dCBib25kX3R4X3F1ZXVlICopcXVldWU7DQo+DQo+ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUg KmludGVybmFscyA9IGJkX3R4X3EtPmRldl9wcml2YXRlOw0KPg0KPiArDQo+DQo+ICsJc3RydWN0 IHJ0ZV9ldGhfZGV2ICpwcmltYXJ5X3BvcnQgPQ0KPg0KPiArCQkJJnJ0ZV9ldGhfZGV2aWNlc1tp bnRlcm5hbHMtPnByaW1hcnlfcG9ydF07DQo+DQo+ICsJdWludDE2X3QgbnVtX3R4X3RvdGFsID0g MDsNCj4NCj4gKwl1aW50MTZfdCBpLCBqOw0KPg0KPiArDQo+DQo+ICsJdWludDE2X3QgbnVtX29m X3NsYXZlcyA9IGludGVybmFscy0+YWN0aXZlX3NsYXZlX2NvdW50Ow0KPg0KPiArCXVpbnQxNl90 IHNsYXZlc1tSVEVfTUFYX0VUSFBPUlRTXTsNCj4NCj4gKw0KPg0KPiArCXN0cnVjdCBydGVfZXRo ZXJfaGRyICpldGhlcl9oZHI7DQo+DQo+ICsJc3RydWN0IHJ0ZV9ldGhlcl9hZGRyIHByaW1hcnlf c2xhdmVfYWRkcjsNCj4NCj4gKwlzdHJ1Y3QgcnRlX2V0aGVyX2FkZHIgYWN0aXZlX3NsYXZlX2Fk ZHI7DQo+DQo+ICsNCj4NCj4gKwlpZiAobnVtX29mX3NsYXZlcyA8IDEpDQo+DQo+ICsJCXJldHVy biBudW1fdHhfdG90YWw7DQo+DQo+ICsNCj4NCj4gKwltZW1jcHkoc2xhdmVzLCBpbnRlcm5hbHMt PnRsYl9zbGF2ZXNfb3JkZXIsDQo+DQo+ICsJCQkJc2l6ZW9mKGludGVybmFscy0+dGxiX3NsYXZl c19vcmRlclswXSkgKiBudW1fb2Zfc2xhdmVzKTsNCj4NCj4gKw0KPg0KPiArDQo+DQo+ICsJcnRl X2V0aGVyX2FkZHJfY29weShwcmltYXJ5X3BvcnQtPmRhdGEtPm1hY19hZGRycywgJnByaW1hcnlf c2xhdmVfYWRkcik7DQo+DQo+ICsNCj4NCj4gKwlpZiAobmJfcGt0cyA+IDMpIHsNCj4NCj4gKwkJ Zm9yIChpID0gMDsgaSA8IDM7IGkrKykNCj4NCj4gKwkJCXJ0ZV9wcmVmZXRjaDAocnRlX3BrdG1i dWZfbXRvZChidWZzW2ldLCB2b2lkKikpOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCWZvciAo aSA9IDA7IGkgPCBudW1fb2Zfc2xhdmVzOyBpKyspIHsNCj4NCj4gKwkJcnRlX2V0aF9tYWNhZGRy X2dldChzbGF2ZXNbaV0sICZhY3RpdmVfc2xhdmVfYWRkcik7DQo+DQo+ICsJCWZvciAoaiA9IG51 bV90eF90b3RhbDsgaiA8IG5iX3BrdHM7IGorKykgew0KPg0KPiArCQkJaWYgKGogKyAzIDwgbmJf cGt0cykNCj4NCj4gKwkJCQlydGVfcHJlZmV0Y2gwKHJ0ZV9wa3RtYnVmX210b2QoYnVmc1tqKzNd LCB2b2lkKikpOw0KPg0KPiArDQo+DQo+ICsJCQlldGhlcl9oZHIgPSBydGVfcGt0bWJ1Zl9tdG9k KGJ1ZnNbal0sDQo+DQo+ICsJCQkJCQlzdHJ1Y3QgcnRlX2V0aGVyX2hkciAqKTsNCj4NCj4gKwkJ CWlmIChydGVfaXNfc2FtZV9ldGhlcl9hZGRyKCZldGhlcl9oZHItPnNyY19hZGRyLA0KPg0KPiAr CQkJCQkJCSZwcmltYXJ5X3NsYXZlX2FkZHIpKQ0KPg0KPiArCQkJCXJ0ZV9ldGhlcl9hZGRyX2Nv cHkoJmFjdGl2ZV9zbGF2ZV9hZGRyLA0KPg0KPiArCQkJCQkJJmV0aGVyX2hkci0+c3JjX2FkZHIp Ow0KPg0KPiArI2lmIGRlZmluZWQoUlRFX0xJQlJURV9CT05EX0RFQlVHX0FMQikgfHwgZGVmaW5l ZChSVEVfTElCUlRFX0JPTkRfREVCVUdfQUxCX0wxKQ0KPg0KPiArCQkJCQltb2RlNl9kZWJ1Zygi VFggSVB2NDoiLCBldGhlcl9oZHIsIHNsYXZlc1tpXSwgJmJ1cnN0bnVtYmVyVFgpOw0KPg0KPiAr I2VuZGlmDQo+DQo+ICsJCX0NCj4NCj4gKw0KPg0KPiArCQludW1fdHhfdG90YWwgKz0gcnRlX2V0 aF90eF9idXJzdChzbGF2ZXNbaV0sIGJkX3R4X3EtPnF1ZXVlX2lkLA0KPg0KPiArCQkJCWJ1ZnMg KyBudW1fdHhfdG90YWwsIG5iX3BrdHMgLSBudW1fdHhfdG90YWwpOw0KPg0KPiArDQo+DQo+ICsJ CWlmIChudW1fdHhfdG90YWwgPT0gbmJfcGt0cykNCj4NCj4gKwkJCWJyZWFrOw0KPg0KPiArCX0N Cj4NCj4gKw0KPg0KPiArCXJldHVybiBudW1fdHhfdG90YWw7DQo+DQo+ICt9DQo+DQo+ICsNCj4N Cj4gK3ZvaWQNCj4NCj4gK2JvbmRfdGxiX2Rpc2FibGUoc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUg KmludGVybmFscykNCj4NCj4gK3sNCj4NCj4gKwlydGVfZWFsX2FsYXJtX2NhbmNlbChib25kX2V0 aGRldl91cGRhdGVfdGxiX3NsYXZlX2NiLCBpbnRlcm5hbHMpOw0KPg0KPiArfQ0KPg0KPiArDQo+ DQo+ICt2b2lkDQo+DQo+ICtib25kX3RsYl9lbmFibGUoc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUg KmludGVybmFscykNCj4NCj4gK3sNCj4NCj4gKwlib25kX2V0aGRldl91cGRhdGVfdGxiX3NsYXZl X2NiKGludGVybmFscyk7DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyB1aW50MTZfdA0K Pg0KPiArYm9uZF9ldGhkZXZfdHhfYnVyc3RfYWxiKHZvaWQgKnF1ZXVlLCBzdHJ1Y3QgcnRlX21i dWYgKipidWZzLCB1aW50MTZfdCBuYl9wa3RzKQ0KPg0KPiArew0KPg0KPiArCXN0cnVjdCBib25k X3R4X3F1ZXVlICpiZF90eF9xID0gKHN0cnVjdCBib25kX3R4X3F1ZXVlICopcXVldWU7DQo+DQo+ ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFscyA9IGJkX3R4X3EtPmRldl9wcml2 YXRlOw0KPg0KPiArDQo+DQo+ICsJc3RydWN0IHJ0ZV9ldGhlcl9oZHIgKmV0aF9oOw0KPg0KPiAr CXVpbnQxNl90IGV0aGVyX3R5cGUsIG9mZnNldDsNCj4NCj4gKw0KPg0KPiArCXN0cnVjdCBjbGll bnRfZGF0YSAqY2xpZW50X2luZm87DQo+DQo+ICsNCj4NCj4gKwkvKg0KPg0KPiArCSAqIFdlIGNy ZWF0ZSB0cmFuc21pdCBidWZmZXJzIGZvciBldmVyeSBzbGF2ZSBhbmQgb25lIGFkZGl0aW9uYWwg dG8gc2VuZA0KPg0KPiArCSAqIHRocm91Z2ggdGxiLiBJbiB3b3JzdCBjYXNlIGV2ZXJ5IHBhY2tl dCB3aWxsIGJlIHNlbmQgb24gb25lIHBvcnQuDQo+DQo+ICsJICovDQo+DQo+ICsJc3RydWN0IHJ0 ZV9tYnVmICpzbGF2ZV9idWZzW1JURV9NQVhfRVRIUE9SVFMgKyAxXVtuYl9wa3RzXTsNCj4NCj4g Kwl1aW50MTZfdCBzbGF2ZV9idWZzX3BrdHNbUlRFX01BWF9FVEhQT1JUUyArIDFdID0geyAwIH07 DQo+DQo+ICsNCj4NCj4gKwkvKg0KPg0KPiArCSAqIFdlIGNyZWF0ZSBzZXBhcmF0ZSB0cmFuc21p dCBidWZmZXJzIGZvciB1cGRhdGUgcGFja2V0cyBhcyB0aGV5IHdvbid0DQo+DQo+ICsJICogYmUg Y291bnRlZCBpbiBudW1fdHhfdG90YWwuDQo+DQo+ICsJICovDQo+DQo+ICsJc3RydWN0IHJ0ZV9t YnVmICp1cGRhdGVfYnVmc1tSVEVfTUFYX0VUSFBPUlRTXVtBTEJfSEFTSF9UQUJMRV9TSVpFXTsN Cj4NCj4gKwl1aW50MTZfdCB1cGRhdGVfYnVmc19wa3RzW1JURV9NQVhfRVRIUE9SVFNdID0geyAw IH07DQo+DQo+ICsNCj4NCj4gKwlzdHJ1Y3QgcnRlX21idWYgKnVwZF9wa3Q7DQo+DQo+ICsJc2l6 ZV90IHBrdF9zaXplOw0KPg0KPiArDQo+DQo+ICsJdWludDE2X3QgbnVtX3NlbmQsIG51bV9ub3Rf c2VuZCA9IDA7DQo+DQo+ICsJdWludDE2X3QgbnVtX3R4X3RvdGFsID0gMDsNCj4NCj4gKwl1aW50 MTZfdCBzbGF2ZV9pZHg7DQo+DQo+ICsNCj4NCj4gKwlpbnQgaSwgajsNCj4NCj4gKw0KPg0KPiAr CS8qIFNlYXJjaCB0eCBidWZmZXIgZm9yIEFSUCBwYWNrZXRzIGFuZCBmb3J3YXJkIHRoZW0gdG8g YWxiICovDQo+DQo+ICsJZm9yIChpID0gMDsgaSA8IG5iX3BrdHM7IGkrKykgew0KPg0KPiArCQll dGhfaCA9IHJ0ZV9wa3RtYnVmX210b2QoYnVmc1tpXSwgc3RydWN0IHJ0ZV9ldGhlcl9oZHIgKik7 DQo+DQo+ICsJCWV0aGVyX3R5cGUgPSBldGhfaC0+ZXRoZXJfdHlwZTsNCj4NCj4gKwkJb2Zmc2V0 ID0gZ2V0X3ZsYW5fb2Zmc2V0KGV0aF9oLCAmZXRoZXJfdHlwZSk7DQo+DQo+ICsNCj4NCj4gKwkJ aWYgKGV0aGVyX3R5cGUgPT0gcnRlX2NwdV90b19iZV8xNihSVEVfRVRIRVJfVFlQRV9BUlApKSB7 DQo+DQo+ICsJCQlzbGF2ZV9pZHggPSBib25kX21vZGVfYWxiX2FycF94bWl0KGV0aF9oLCBvZmZz ZXQsIGludGVybmFscyk7DQo+DQo+ICsNCj4NCj4gKwkJCS8qIENoYW5nZSBzcmMgbWFjIGluIGV0 aCBoZWFkZXIgKi8NCj4NCj4gKwkJCXJ0ZV9ldGhfbWFjYWRkcl9nZXQoc2xhdmVfaWR4LCAmZXRo X2gtPnNyY19hZGRyKTsNCj4NCj4gKw0KPg0KPiArCQkJLyogQWRkIHBhY2tldCB0byBzbGF2ZSB0 eCBidWZmZXIgKi8NCj4NCj4gKwkJCXNsYXZlX2J1ZnNbc2xhdmVfaWR4XVtzbGF2ZV9idWZzX3Br dHNbc2xhdmVfaWR4XV0gPSBidWZzW2ldOw0KPg0KPiArCQkJc2xhdmVfYnVmc19wa3RzW3NsYXZl X2lkeF0rKzsNCj4NCj4gKwkJfSBlbHNlIHsNCj4NCj4gKwkJCS8qIElmIHBhY2tldCBpcyBub3Qg QVJQLCBzZW5kIGl0IHdpdGggVExCIHBvbGljeSAqLw0KPg0KPiArCQkJc2xhdmVfYnVmc1tSVEVf TUFYX0VUSFBPUlRTXVtzbGF2ZV9idWZzX3BrdHNbUlRFX01BWF9FVEhQT1JUU11dID0NCj4NCj4g KwkJCQkJYnVmc1tpXTsNCj4NCj4gKwkJCXNsYXZlX2J1ZnNfcGt0c1tSVEVfTUFYX0VUSFBPUlRT XSsrOw0KPg0KPiArCQl9DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJLyogVXBkYXRlIGNvbm5l Y3RlZCBjbGllbnQgQVJQIHRhYmxlcyAqLw0KPg0KPiArCWlmIChpbnRlcm5hbHMtPm1vZGU2Lm50 dCkgew0KPg0KPiArCQlmb3IgKGkgPSAwOyBpIDwgQUxCX0hBU0hfVEFCTEVfU0laRTsgaSsrKSB7 DQo+DQo+ICsJCQljbGllbnRfaW5mbyA9ICZpbnRlcm5hbHMtPm1vZGU2LmNsaWVudF90YWJsZVtp XTsNCj4NCj4gKw0KPg0KPiArCQkJaWYgKGNsaWVudF9pbmZvLT5pbl91c2UpIHsNCj4NCj4gKwkJ CQkvKiBBbGxvY2F0ZSBuZXcgcGFja2V0IHRvIHNlbmQgQVJQIHVwZGF0ZSBvbiBjdXJyZW50IHNs YXZlICovDQo+DQo+ICsJCQkJdXBkX3BrdCA9IHJ0ZV9wa3RtYnVmX2FsbG9jKGludGVybmFscy0+ bW9kZTYubWVtcG9vbCk7DQo+DQo+ICsJCQkJaWYgKHVwZF9wa3QgPT0gTlVMTCkgew0KPg0KPiAr CQkJCQlSVEVfQk9ORF9MT0coRVJSLA0KPg0KPiArCQkJCQkJICAgICAiRmFpbGVkIHRvIGFsbG9j YXRlIEFSUCBwYWNrZXQgZnJvbSBwb29sIik7DQo+DQo+ICsJCQkJCWNvbnRpbnVlOw0KPg0KPiAr CQkJCX0NCj4NCj4gKwkJCQlwa3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnRlX2V0aGVyX2hkcikg Kw0KPg0KPiArCQkJCQlzaXplb2Yoc3RydWN0IHJ0ZV9hcnBfaGRyKSArDQo+DQo+ICsJCQkJCWNs aWVudF9pbmZvLT52bGFuX2NvdW50ICoNCj4NCj4gKwkJCQkJc2l6ZW9mKHN0cnVjdCBydGVfdmxh bl9oZHIpOw0KPg0KPiArCQkJCXVwZF9wa3QtPmRhdGFfbGVuID0gcGt0X3NpemU7DQo+DQo+ICsJ CQkJdXBkX3BrdC0+cGt0X2xlbiA9IHBrdF9zaXplOw0KPg0KPiArDQo+DQo+ICsJCQkJc2xhdmVf aWR4ID0gYm9uZF9tb2RlX2FsYl9hcnBfdXBkKGNsaWVudF9pbmZvLCB1cGRfcGt0LA0KPg0KPiAr CQkJCQkJaW50ZXJuYWxzKTsNCj4NCj4gKw0KPg0KPiArCQkJCS8qIEFkZCBwYWNrZXQgdG8gdXBk YXRlIHR4IGJ1ZmZlciAqLw0KPg0KPiArCQkJCXVwZGF0ZV9idWZzW3NsYXZlX2lkeF1bdXBkYXRl X2J1ZnNfcGt0c1tzbGF2ZV9pZHhdXSA9IHVwZF9wa3Q7DQo+DQo+ICsJCQkJdXBkYXRlX2J1ZnNf cGt0c1tzbGF2ZV9pZHhdKys7DQo+DQo+ICsJCQl9DQo+DQo+ICsJCX0NCj4NCj4gKwkJaW50ZXJu YWxzLT5tb2RlNi5udHQgPSAwOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCS8qIFNlbmQgQVJQ IHBhY2tldHMgb24gcHJvcGVyIHNsYXZlcyAqLw0KPg0KPiArCWZvciAoaSA9IDA7IGkgPCBSVEVf TUFYX0VUSFBPUlRTOyBpKyspIHsNCj4NCj4gKwkJaWYgKHNsYXZlX2J1ZnNfcGt0c1tpXSA+IDAp IHsNCj4NCj4gKwkJCW51bV9zZW5kID0gcnRlX2V0aF90eF9idXJzdChpLCBiZF90eF9xLT5xdWV1 ZV9pZCwNCj4NCj4gKwkJCQkJc2xhdmVfYnVmc1tpXSwgc2xhdmVfYnVmc19wa3RzW2ldKTsNCj4N Cj4gKwkJCWZvciAoaiA9IDA7IGogPCBzbGF2ZV9idWZzX3BrdHNbaV0gLSBudW1fc2VuZDsgaisr KSB7DQo+DQo+ICsJCQkJYnVmc1tuYl9wa3RzIC0gMSAtIG51bV9ub3Rfc2VuZCAtIGpdID0NCj4N Cj4gKwkJCQkJCXNsYXZlX2J1ZnNbaV1bbmJfcGt0cyAtIDEgLSBqXTsNCj4NCj4gKwkJCX0NCj4N Cj4gKw0KPg0KPiArCQkJbnVtX3R4X3RvdGFsICs9IG51bV9zZW5kOw0KPg0KPiArCQkJbnVtX25v dF9zZW5kICs9IHNsYXZlX2J1ZnNfcGt0c1tpXSAtIG51bV9zZW5kOw0KPg0KPiArDQo+DQo+ICsj aWYgZGVmaW5lZChSVEVfTElCUlRFX0JPTkRfREVCVUdfQUxCKSB8fCBkZWZpbmVkKFJURV9MSUJS VEVfQk9ORF9ERUJVR19BTEJfTDEpDQo+DQo+ICsJLyogUHJpbnQgVFggc3RhdHMgaW5jbHVkaW5n IHVwZGF0ZSBwYWNrZXRzICovDQo+DQo+ICsJCQlmb3IgKGogPSAwOyBqIDwgc2xhdmVfYnVmc19w a3RzW2ldOyBqKyspIHsNCj4NCj4gKwkJCQlldGhfaCA9IHJ0ZV9wa3RtYnVmX210b2Qoc2xhdmVf YnVmc1tpXVtqXSwNCj4NCj4gKwkJCQkJCQlzdHJ1Y3QgcnRlX2V0aGVyX2hkciAqKTsNCj4NCj4g KwkJCQltb2RlNl9kZWJ1ZygiVFggQVJQOiIsIGV0aF9oLCBpLCAmYnVyc3RudW1iZXJUWCk7DQo+ DQo+ICsJCQl9DQo+DQo+ICsjZW5kaWYNCj4NCj4gKwkJfQ0KPg0KPiArCX0NCj4NCj4gKw0KPg0K PiArCS8qIFNlbmQgdXBkYXRlIHBhY2tldHMgb24gcHJvcGVyIHNsYXZlcyAqLw0KPg0KPiArCWZv ciAoaSA9IDA7IGkgPCBSVEVfTUFYX0VUSFBPUlRTOyBpKyspIHsNCj4NCj4gKwkJaWYgKHVwZGF0 ZV9idWZzX3BrdHNbaV0gPiAwKSB7DQo+DQo+ICsJCQludW1fc2VuZCA9IHJ0ZV9ldGhfdHhfYnVy c3QoaSwgYmRfdHhfcS0+cXVldWVfaWQsIHVwZGF0ZV9idWZzW2ldLA0KPg0KPiArCQkJCQl1cGRh dGVfYnVmc19wa3RzW2ldKTsNCj4NCj4gKwkJCWZvciAoaiA9IG51bV9zZW5kOyBqIDwgdXBkYXRl X2J1ZnNfcGt0c1tpXTsgaisrKSB7DQo+DQo+ICsJCQkJcnRlX3BrdG1idWZfZnJlZSh1cGRhdGVf YnVmc1tpXVtqXSk7DQo+DQo+ICsJCQl9DQo+DQo+ICsjaWYgZGVmaW5lZChSVEVfTElCUlRFX0JP TkRfREVCVUdfQUxCKSB8fCBkZWZpbmVkKFJURV9MSUJSVEVfQk9ORF9ERUJVR19BTEJfTDEpDQo+ DQo+ICsJCQlmb3IgKGogPSAwOyBqIDwgdXBkYXRlX2J1ZnNfcGt0c1tpXTsgaisrKSB7DQo+DQo+ ICsJCQkJZXRoX2ggPSBydGVfcGt0bWJ1Zl9tdG9kKHVwZGF0ZV9idWZzW2ldW2pdLA0KPg0KPiAr CQkJCQkJCXN0cnVjdCBydGVfZXRoZXJfaGRyICopOw0KPg0KPiArCQkJCW1vZGU2X2RlYnVnKCJU WCBBUlB1cGQ6IiwgZXRoX2gsIGksICZidXJzdG51bWJlclRYKTsNCj4NCj4gKwkJCX0NCj4NCj4g KyNlbmRpZg0KPg0KPiArCQl9DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJLyogU2VuZCBub24t QVJQIHBhY2tldHMgdXNpbmcgdGxiIHBvbGljeSAqLw0KPg0KPiArCWlmIChzbGF2ZV9idWZzX3Br dHNbUlRFX01BWF9FVEhQT1JUU10gPiAwKSB7DQo+DQo+ICsJCW51bV9zZW5kID0gYm9uZF9ldGhk ZXZfdHhfYnVyc3RfdGxiKHF1ZXVlLA0KPg0KPiArCQkJCXNsYXZlX2J1ZnNbUlRFX01BWF9FVEhQ T1JUU10sDQo+DQo+ICsJCQkJc2xhdmVfYnVmc19wa3RzW1JURV9NQVhfRVRIUE9SVFNdKTsNCj4N Cj4gKw0KPg0KPiArCQlmb3IgKGogPSAwOyBqIDwgc2xhdmVfYnVmc19wa3RzW1JURV9NQVhfRVRI UE9SVFNdOyBqKyspIHsNCj4NCj4gKwkJCWJ1ZnNbbmJfcGt0cyAtIDEgLSBudW1fbm90X3NlbmQg LSBqXSA9DQo+DQo+ICsJCQkJCXNsYXZlX2J1ZnNbUlRFX01BWF9FVEhQT1JUU11bbmJfcGt0cyAt IDEgLSBqXTsNCj4NCj4gKwkJfQ0KPg0KPiArDQo+DQo+ICsJCW51bV90eF90b3RhbCArPSBudW1f c2VuZDsNCj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwlyZXR1cm4gbnVtX3R4X3RvdGFsOw0KPg0K PiArfQ0KPg0KPiArDQo+DQo+ICtzdGF0aWMgaW5saW5lIHVpbnQxNl90DQo+DQo+ICt0eF9idXJz dF9iYWxhbmNlKHZvaWQgKnF1ZXVlLCBzdHJ1Y3QgcnRlX21idWYgKipidWZzLCB1aW50MTZfdCBu Yl9idWZzLA0KPg0KPiArCQkgdWludDE2X3QgKnNsYXZlX3BvcnRfaWRzLCB1aW50MTZfdCBzbGF2 ZV9jb3VudCkNCj4NCj4gK3sNCj4NCj4gKwlzdHJ1Y3QgYm9uZF90eF9xdWV1ZSAqYmRfdHhfcSA9 IChzdHJ1Y3QgYm9uZF90eF9xdWV1ZSAqKXF1ZXVlOw0KPg0KPiArCXN0cnVjdCBib25kX2Rldl9w cml2YXRlICppbnRlcm5hbHMgPSBiZF90eF9xLT5kZXZfcHJpdmF0ZTsNCj4NCj4gKw0KPg0KPiAr CS8qIEFycmF5IHRvIHNvcnQgbWJ1ZnMgZm9yIHRyYW5zbWlzc2lvbiBvbiBlYWNoIHNsYXZlIGlu dG8gKi8NCj4NCj4gKwlzdHJ1Y3QgcnRlX21idWYgKnNsYXZlX2J1ZnNbUlRFX01BWF9FVEhQT1JU U11bbmJfYnVmc107DQo+DQo+ICsJLyogTnVtYmVyIG9mIG1idWZzIGZvciB0cmFuc21pc3Npb24g b24gZWFjaCBzbGF2ZSAqLw0KPg0KPiArCXVpbnQxNl90IHNsYXZlX25iX2J1ZnNbUlRFX01BWF9F VEhQT1JUU10gPSB7IDAgfTsNCj4NCj4gKwkvKiBNYXBwaW5nIGFycmF5IGdlbmVyYXRlZCBieSBo YXNoIGZ1bmN0aW9uIHRvIG1hcCBtYnVmcyB0byBzbGF2ZXMgKi8NCj4NCj4gKwl1aW50MTZfdCBi dWZzX3NsYXZlX3BvcnRfaWR4c1tuYl9idWZzXTsNCj4NCj4gKw0KPg0KPiArCXVpbnQxNl90IHNs YXZlX3R4X2NvdW50Ow0KPg0KPiArCXVpbnQxNl90IHRvdGFsX3R4X2NvdW50ID0gMCwgdG90YWxf dHhfZmFpbF9jb3VudCA9IDA7DQo+DQo+ICsNCj4NCj4gKwl1aW50MTZfdCBpOw0KPg0KPiArDQo+ DQo+ICsJLyoNCj4NCj4gKwkgKiBQb3B1bGF0ZSBzbGF2ZXMgbWJ1ZiB3aXRoIHRoZSBwYWNrZXRz IHdoaWNoIGFyZSB0byBiZSBzZW50IG9uIGl0DQo+DQo+ICsJICogc2VsZWN0aW5nIG91dHB1dCBz bGF2ZSB1c2luZyBoYXNoIGJhc2VkIG9uIHhtaXQgcG9saWN5DQo+DQo+ICsJICovDQo+DQo+ICsJ aW50ZXJuYWxzLT5idXJzdF94bWl0X2hhc2goYnVmcywgbmJfYnVmcywgc2xhdmVfY291bnQsDQo+ DQo+ICsJCQlidWZzX3NsYXZlX3BvcnRfaWR4cyk7DQo+DQo+ICsNCj4NCj4gKwlmb3IgKGkgPSAw OyBpIDwgbmJfYnVmczsgaSsrKSB7DQo+DQo+ICsJCS8qIFBvcHVsYXRlIHNsYXZlIG1idWYgYXJy YXlzIHdpdGggbWJ1ZnMgZm9yIHRoYXQgc2xhdmUuICovDQo+DQo+ICsJCXVpbnQxNl90IHNsYXZl X2lkeCA9IGJ1ZnNfc2xhdmVfcG9ydF9pZHhzW2ldOw0KPg0KPiArDQo+DQo+ICsJCXNsYXZlX2J1 ZnNbc2xhdmVfaWR4XVtzbGF2ZV9uYl9idWZzW3NsYXZlX2lkeF0rK10gPSBidWZzW2ldOw0KPg0K PiArCX0NCj4NCj4gKw0KPg0KPiArCS8qIFNlbmQgcGFja2V0IGJ1cnN0IG9uIGVhY2ggc2xhdmUg ZGV2aWNlICovDQo+DQo+ICsJZm9yIChpID0gMDsgaSA8IHNsYXZlX2NvdW50OyBpKyspIHsNCj4N Cj4gKwkJaWYgKHNsYXZlX25iX2J1ZnNbaV0gPT0gMCkNCj4NCj4gKwkJCWNvbnRpbnVlOw0KPg0K PiArDQo+DQo+ICsJCXNsYXZlX3R4X2NvdW50ID0gcnRlX2V0aF90eF9idXJzdChzbGF2ZV9wb3J0 X2lkc1tpXSwNCj4NCj4gKwkJCQliZF90eF9xLT5xdWV1ZV9pZCwgc2xhdmVfYnVmc1tpXSwNCj4N Cj4gKwkJCQlzbGF2ZV9uYl9idWZzW2ldKTsNCj4NCj4gKw0KPg0KPiArCQl0b3RhbF90eF9jb3Vu dCArPSBzbGF2ZV90eF9jb3VudDsNCj4NCj4gKw0KPg0KPiArCQkvKiBJZiB0eCBidXJzdCBmYWls cyBtb3ZlIHBhY2tldHMgdG8gZW5kIG9mIGJ1ZnMgKi8NCj4NCj4gKwkJaWYgKHVubGlrZWx5KHNs YXZlX3R4X2NvdW50IDwgc2xhdmVfbmJfYnVmc1tpXSkpIHsNCj4NCj4gKwkJCWludCBzbGF2ZV90 eF9mYWlsX2NvdW50ID0gc2xhdmVfbmJfYnVmc1tpXSAtDQo+DQo+ICsJCQkJCXNsYXZlX3R4X2Nv dW50Ow0KPg0KPiArCQkJdG90YWxfdHhfZmFpbF9jb3VudCArPSBzbGF2ZV90eF9mYWlsX2NvdW50 Ow0KPg0KPiArCQkJbWVtY3B5KCZidWZzW25iX2J1ZnMgLSB0b3RhbF90eF9mYWlsX2NvdW50XSwN Cj4NCj4gKwkJCSAgICAgICAmc2xhdmVfYnVmc1tpXVtzbGF2ZV90eF9jb3VudF0sDQo+DQo+ICsJ CQkgICAgICAgc2xhdmVfdHhfZmFpbF9jb3VudCAqIHNpemVvZihidWZzWzBdKSk7DQo+DQo+ICsJ CX0NCj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwlyZXR1cm4gdG90YWxfdHhfY291bnQ7DQo+DQo+ ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyB1aW50MTZfdA0KPg0KPiArYm9uZF9ldGhkZXZfdHhf YnVyc3RfYmFsYW5jZSh2b2lkICpxdWV1ZSwgc3RydWN0IHJ0ZV9tYnVmICoqYnVmcywNCj4NCj4g KwkJdWludDE2X3QgbmJfYnVmcykNCj4NCj4gK3sNCj4NCj4gKwlzdHJ1Y3QgYm9uZF90eF9xdWV1 ZSAqYmRfdHhfcSA9IChzdHJ1Y3QgYm9uZF90eF9xdWV1ZSAqKXF1ZXVlOw0KPg0KPiArCXN0cnVj dCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHMgPSBiZF90eF9xLT5kZXZfcHJpdmF0ZTsNCj4N Cj4gKw0KPg0KPiArCXVpbnQxNl90IHNsYXZlX3BvcnRfaWRzW1JURV9NQVhfRVRIUE9SVFNdOw0K Pg0KPiArCXVpbnQxNl90IHNsYXZlX2NvdW50Ow0KPg0KPiArDQo+DQo+ICsJaWYgKHVubGlrZWx5 KG5iX2J1ZnMgPT0gMCkpDQo+DQo+ICsJCXJldHVybiAwOw0KPg0KPiArDQo+DQo+ICsJLyogQ29w eSBzbGF2ZSBsaXN0IHRvIHByb3RlY3QgYWdhaW5zdCBzbGF2ZSB1cC9kb3duIGNoYW5nZXMgZHVy aW5nIHR4DQo+DQo+ICsJICogYnVyc3RpbmcNCj4NCj4gKwkgKi8NCj4NCj4gKwlzbGF2ZV9jb3Vu dCA9IGludGVybmFscy0+YWN0aXZlX3NsYXZlX2NvdW50Ow0KPg0KPiArCWlmICh1bmxpa2VseShz bGF2ZV9jb3VudCA8IDEpKQ0KPg0KPiArCQlyZXR1cm4gMDsNCj4NCj4gKw0KPg0KPiArCW1lbWNw eShzbGF2ZV9wb3J0X2lkcywgaW50ZXJuYWxzLT5hY3RpdmVfc2xhdmVzLA0KPg0KPiArCQkJc2l6 ZW9mKHNsYXZlX3BvcnRfaWRzWzBdKSAqIHNsYXZlX2NvdW50KTsNCj4NCj4gKwlyZXR1cm4gdHhf YnVyc3RfYmFsYW5jZShxdWV1ZSwgYnVmcywgbmJfYnVmcywgc2xhdmVfcG9ydF9pZHMsDQo+DQo+ ICsJCQkJc2xhdmVfY291bnQpOw0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICtzdGF0aWMgaW5saW5l IHVpbnQxNl90DQo+DQo+ICt0eF9idXJzdF84MDIzYWQodm9pZCAqcXVldWUsIHN0cnVjdCBydGVf bWJ1ZiAqKmJ1ZnMsIHVpbnQxNl90IG5iX2J1ZnMsDQo+DQo+ICsJCWJvb2wgZGVkaWNhdGVkX3R4 cSkNCj4NCj4gK3sNCj4NCj4gKwlzdHJ1Y3QgYm9uZF90eF9xdWV1ZSAqYmRfdHhfcSA9IChzdHJ1 Y3QgYm9uZF90eF9xdWV1ZSAqKXF1ZXVlOw0KPg0KPiArCXN0cnVjdCBib25kX2Rldl9wcml2YXRl ICppbnRlcm5hbHMgPSBiZF90eF9xLT5kZXZfcHJpdmF0ZTsNCj4NCj4gKw0KPg0KPiArCXVpbnQx Nl90IHNsYXZlX3BvcnRfaWRzW1JURV9NQVhfRVRIUE9SVFNdOw0KPg0KPiArCXVpbnQxNl90IHNs YXZlX2NvdW50Ow0KPg0KPiArDQo+DQo+ICsJdWludDE2X3QgZGlzdF9zbGF2ZV9wb3J0X2lkc1tS VEVfTUFYX0VUSFBPUlRTXTsNCj4NCj4gKwl1aW50MTZfdCBkaXN0X3NsYXZlX2NvdW50Ow0KPg0K PiArDQo+DQo+ICsJdWludDE2X3Qgc2xhdmVfdHhfY291bnQ7DQo+DQo+ICsNCj4NCj4gKwl1aW50 MTZfdCBpOw0KPg0KPiArDQo+DQo+ICsJLyogQ29weSBzbGF2ZSBsaXN0IHRvIHByb3RlY3QgYWdh aW5zdCBzbGF2ZSB1cC9kb3duIGNoYW5nZXMgZHVyaW5nIHR4DQo+DQo+ICsJICogYnVyc3Rpbmcg Ki8NCj4NCj4gKwlzbGF2ZV9jb3VudCA9IGludGVybmFscy0+YWN0aXZlX3NsYXZlX2NvdW50Ow0K Pg0KPiArCWlmICh1bmxpa2VseShzbGF2ZV9jb3VudCA8IDEpKQ0KPg0KPiArCQlyZXR1cm4gMDsN Cj4NCj4gKw0KPg0KPiArCW1lbWNweShzbGF2ZV9wb3J0X2lkcywgaW50ZXJuYWxzLT5hY3RpdmVf c2xhdmVzLA0KPg0KPiArCQkJc2l6ZW9mKHNsYXZlX3BvcnRfaWRzWzBdKSAqIHNsYXZlX2NvdW50 KTsNCj4NCj4gKw0KPg0KPiArCWlmIChkZWRpY2F0ZWRfdHhxKQ0KPg0KPiArCQlnb3RvIHNraXBf dHhfcmluZzsNCj4NCj4gKw0KPg0KPiArCS8qIENoZWNrIGZvciBMQUNQIGNvbnRyb2wgcGFja2V0 cyBhbmQgc2VuZCBpZiBhdmFpbGFibGUgKi8NCj4NCj4gKwlmb3IgKGkgPSAwOyBpIDwgc2xhdmVf Y291bnQ7IGkrKykgew0KPg0KPiArCQlzdHJ1Y3QgcG9ydCAqcG9ydCA9ICZib25kX21vZGVfODAy M2FkX3BvcnRzW3NsYXZlX3BvcnRfaWRzW2ldXTsNCj4NCj4gKwkJc3RydWN0IHJ0ZV9tYnVmICpj dHJsX3BrdCA9IE5VTEw7DQo+DQo+ICsNCj4NCj4gKwkJaWYgKGxpa2VseShydGVfcmluZ19lbXB0 eShwb3J0LT50eF9yaW5nKSkpDQo+DQo+ICsJCQljb250aW51ZTsNCj4NCj4gKw0KPg0KPiArCQlp ZiAocnRlX3JpbmdfZGVxdWV1ZShwb3J0LT50eF9yaW5nLA0KPg0KPiArCQkJCSAgICAgKHZvaWQg KiopJmN0cmxfcGt0KSAhPSAtRU5PRU5UKSB7DQo+DQo+ICsJCQlzbGF2ZV90eF9jb3VudCA9IHJ0 ZV9ldGhfdHhfYnVyc3Qoc2xhdmVfcG9ydF9pZHNbaV0sDQo+DQo+ICsJCQkJCWJkX3R4X3EtPnF1 ZXVlX2lkLCAmY3RybF9wa3QsIDEpOw0KPg0KPiArCQkJLyoNCj4NCj4gKwkJCSAqIHJlLWVucXVl dWUgTEFHIGNvbnRyb2wgcGxhbmUgcGFja2V0cyB0byBidWZmZXJpbmcNCj4NCj4gKwkJCSAqIHJp bmcgaWYgdHJhbnNtaXNzaW9uIGZhaWxzIHNvIHRoZSBwYWNrZXQgaXNuJ3QgbG9zdC4NCj4NCj4g KwkJCSAqLw0KPg0KPiArCQkJaWYgKHNsYXZlX3R4X2NvdW50ICE9IDEpDQo+DQo+ICsJCQkJcnRl X3JpbmdfZW5xdWV1ZShwb3J0LT50eF9yaW5nLAljdHJsX3BrdCk7DQo+DQo+ICsJCX0NCj4NCj4g Kwl9DQo+DQo+ICsNCj4NCj4gK3NraXBfdHhfcmluZzoNCj4NCj4gKwlpZiAodW5saWtlbHkobmJf YnVmcyA9PSAwKSkNCj4NCj4gKwkJcmV0dXJuIDA7DQo+DQo+ICsNCj4NCj4gKwlkaXN0X3NsYXZl X2NvdW50ID0gMDsNCj4NCj4gKwlmb3IgKGkgPSAwOyBpIDwgc2xhdmVfY291bnQ7IGkrKykgew0K Pg0KPiArCQlzdHJ1Y3QgcG9ydCAqcG9ydCA9ICZib25kX21vZGVfODAyM2FkX3BvcnRzW3NsYXZl X3BvcnRfaWRzW2ldXTsNCj4NCj4gKw0KPg0KPiArCQlpZiAoQUNUT1JfU1RBVEUocG9ydCwgRElT VFJJQlVUSU5HKSkNCj4NCj4gKwkJCWRpc3Rfc2xhdmVfcG9ydF9pZHNbZGlzdF9zbGF2ZV9jb3Vu dCsrXSA9DQo+DQo+ICsJCQkJCXNsYXZlX3BvcnRfaWRzW2ldOw0KPg0KPiArCX0NCj4NCj4gKw0K Pg0KPiArCWlmICh1bmxpa2VseShkaXN0X3NsYXZlX2NvdW50IDwgMSkpDQo+DQo+ICsJCXJldHVy biAwOw0KPg0KPiArDQo+DQo+ICsJcmV0dXJuIHR4X2J1cnN0X2JhbGFuY2UocXVldWUsIGJ1ZnMs IG5iX2J1ZnMsIGRpc3Rfc2xhdmVfcG9ydF9pZHMsDQo+DQo+ICsJCQkJZGlzdF9zbGF2ZV9jb3Vu dCk7DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyB1aW50MTZfdA0KPg0KPiArYm9uZF9l dGhkZXZfdHhfYnVyc3RfODAyM2FkKHZvaWQgKnF1ZXVlLCBzdHJ1Y3QgcnRlX21idWYgKipidWZz LA0KPg0KPiArCQl1aW50MTZfdCBuYl9idWZzKQ0KPg0KPiArew0KPg0KPiArCXJldHVybiB0eF9i dXJzdF84MDIzYWQocXVldWUsIGJ1ZnMsIG5iX2J1ZnMsIGZhbHNlKTsNCj4NCj4gK30NCj4NCj4g Kw0KPg0KPiArc3RhdGljIHVpbnQxNl90DQo+DQo+ICtib25kX2V0aGRldl90eF9idXJzdF84MDIz YWRfZmFzdF9xdWV1ZSh2b2lkICpxdWV1ZSwgc3RydWN0IHJ0ZV9tYnVmICoqYnVmcywNCj4NCj4g KwkJdWludDE2X3QgbmJfYnVmcykNCj4NCj4gK3sNCj4NCj4gKwlyZXR1cm4gdHhfYnVyc3RfODAy M2FkKHF1ZXVlLCBidWZzLCBuYl9idWZzLCB0cnVlKTsNCj4NCj4gK30NCj4NCj4gKw0KPg0KPiAr c3RhdGljIHVpbnQxNl90DQo+DQo+ICtib25kX2V0aGRldl90eF9idXJzdF9icm9hZGNhc3Qodm9p ZCAqcXVldWUsIHN0cnVjdCBydGVfbWJ1ZiAqKmJ1ZnMsDQo+DQo+ICsJCXVpbnQxNl90IG5iX3Br dHMpDQo+DQo+ICt7DQo+DQo+ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFsczsN Cj4NCj4gKwlzdHJ1Y3QgYm9uZF90eF9xdWV1ZSAqYmRfdHhfcTsNCj4NCj4gKw0KPg0KPiArCXVp bnQxNl90IHNsYXZlc1tSVEVfTUFYX0VUSFBPUlRTXTsNCj4NCj4gKwl1aW50OF90IHR4X2ZhaWxl ZF9mbGFnID0gMDsNCj4NCj4gKwl1aW50MTZfdCBudW1fb2Zfc2xhdmVzOw0KPg0KPiArDQo+DQo+ ICsJdWludDE2X3QgbWF4X25iX29mX3R4X3BrdHMgPSAwOw0KPg0KPiArDQo+DQo+ICsJaW50IHNs YXZlX3R4X3RvdGFsW1JURV9NQVhfRVRIUE9SVFNdOw0KPg0KPiArCWludCBpLCBtb3N0X3N1Y2Nl c3NmdWxfdHhfc2xhdmUgPSAtMTsNCj4NCj4gKw0KPg0KPiArCWJkX3R4X3EgPSAoc3RydWN0IGJv bmRfdHhfcXVldWUgKilxdWV1ZTsNCj4NCj4gKwlpbnRlcm5hbHMgPSBiZF90eF9xLT5kZXZfcHJp dmF0ZTsNCj4NCj4gKw0KPg0KPiArCS8qIENvcHkgc2xhdmUgbGlzdCB0byBwcm90ZWN0IGFnYWlu c3Qgc2xhdmUgdXAvZG93biBjaGFuZ2VzIGR1cmluZyB0eA0KPg0KPiArCSAqIGJ1cnN0aW5nICov DQo+DQo+ICsJbnVtX29mX3NsYXZlcyA9IGludGVybmFscy0+YWN0aXZlX3NsYXZlX2NvdW50Ow0K Pg0KPiArCW1lbWNweShzbGF2ZXMsIGludGVybmFscy0+YWN0aXZlX3NsYXZlcywNCj4NCj4gKwkJ CXNpemVvZihpbnRlcm5hbHMtPmFjdGl2ZV9zbGF2ZXNbMF0pICogbnVtX29mX3NsYXZlcyk7DQo+ DQo+ICsNCj4NCj4gKwlpZiAobnVtX29mX3NsYXZlcyA8IDEpDQo+DQo+ICsJCXJldHVybiAwOw0K Pg0KPiArDQo+DQo+ICsJLyogSW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudCBvbiBtYnVmcyAqLw0K Pg0KPiArCWZvciAoaSA9IDA7IGkgPCBuYl9wa3RzOyBpKyspDQo+DQo+ICsJCXJ0ZV9wa3RtYnVm X3JlZmNudF91cGRhdGUoYnVmc1tpXSwgbnVtX29mX3NsYXZlcyAtIDEpOw0KPg0KPiArDQo+DQo+ ICsJLyogVHJhbnNtaXQgYnVyc3Qgb24gZWFjaCBhY3RpdmUgc2xhdmUgKi8NCj4NCj4gKwlmb3Ig KGkgPSAwOyBpIDwgbnVtX29mX3NsYXZlczsgaSsrKSB7DQo+DQo+ICsJCXNsYXZlX3R4X3RvdGFs W2ldID0gcnRlX2V0aF90eF9idXJzdChzbGF2ZXNbaV0sIGJkX3R4X3EtPnF1ZXVlX2lkLA0KPg0K PiArCQkJCQlidWZzLCBuYl9wa3RzKTsNCj4NCj4gKw0KPg0KPiArCQlpZiAodW5saWtlbHkoc2xh dmVfdHhfdG90YWxbaV0gPCBuYl9wa3RzKSkNCj4NCj4gKwkJCXR4X2ZhaWxlZF9mbGFnID0gMTsN Cj4NCj4gKw0KPg0KPiArCQkvKiByZWNvcmQgdGhlIHZhbHVlIGFuZCBzbGF2ZSBpbmRleCBmb3Ig dGhlIHNsYXZlIHdoaWNoIHRyYW5zbWl0cyB0aGUNCj4NCj4gKwkJICogbWF4aW11bSBudW1iZXIg b2YgcGFja2V0cyAqLw0KPg0KPiArCQlpZiAoc2xhdmVfdHhfdG90YWxbaV0gPiBtYXhfbmJfb2Zf dHhfcGt0cykgew0KPg0KPiArCQkJbWF4X25iX29mX3R4X3BrdHMgPSBzbGF2ZV90eF90b3RhbFtp XTsNCj4NCj4gKwkJCW1vc3Rfc3VjY2Vzc2Z1bF90eF9zbGF2ZSA9IGk7DQo+DQo+ICsJCX0NCj4N Cj4gKwl9DQo+DQo+ICsNCj4NCj4gKwkvKiBpZiBzbGF2ZXMgZmFpbCB0byB0cmFuc21pdCBwYWNr ZXRzIGZyb20gYnVyc3QsIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uDQo+DQo+ICsJICogaXMgbm90 IGV4cGVjdGVkIHRvIGtub3cgYWJvdXQgbXVsdGlwbGUgcmVmZXJlbmNlcyB0byBwYWNrZXRzIHNv IHdlIG11c3QNCj4NCj4gKwkgKiBoYW5kbGUgZmFpbHVyZXMgb2YgYWxsIHBhY2tldHMgZXhjZXB0 IHRob3NlIG9mIHRoZSBtb3N0IHN1Y2Nlc3NmdWwgc2xhdmUNCj4NCj4gKwkgKi8NCj4NCj4gKwlp ZiAodW5saWtlbHkodHhfZmFpbGVkX2ZsYWcpKQ0KPg0KPiArCQlmb3IgKGkgPSAwOyBpIDwgbnVt X29mX3NsYXZlczsgaSsrKQ0KPg0KPiArCQkJaWYgKGkgIT0gbW9zdF9zdWNjZXNzZnVsX3R4X3Ns YXZlKQ0KPg0KPiArCQkJCXdoaWxlIChzbGF2ZV90eF90b3RhbFtpXSA8IG5iX3BrdHMpDQo+DQo+ ICsJCQkJCXJ0ZV9wa3RtYnVmX2ZyZWUoYnVmc1tzbGF2ZV90eF90b3RhbFtpXSsrXSk7DQo+DQo+ ICsNCj4NCj4gKwlyZXR1cm4gbWF4X25iX29mX3R4X3BrdHM7DQo+DQo+ICt9DQo+DQo+ICsNCj4N Cj4gK3N0YXRpYyB2b2lkDQo+DQo+ICtsaW5rX3Byb3BlcnRpZXNfc2V0KHN0cnVjdCBydGVfZXRo X2RldiAqZXRoZGV2LCBzdHJ1Y3QgcnRlX2V0aF9saW5rICpzbGF2ZV9saW5rKQ0KPg0KPiArew0K Pg0KPiArCXN0cnVjdCBib25kX2Rldl9wcml2YXRlICpib25kX2N0eCA9IGV0aGRldi0+ZGF0YS0+ ZGV2X3ByaXZhdGU7DQo+DQo+ICsNCj4NCj4gKwlpZiAoYm9uZF9jdHgtPm1vZGUgPT0gQk9ORElO R19NT0RFXzgwMjNBRCkgew0KPg0KPiArCQkvKioNCj4NCj4gKwkJICogSWYgaW4gbW9kZSA0IHRo ZW4gc2F2ZSB0aGUgbGluayBwcm9wZXJ0aWVzIG9mIHRoZSBmaXJzdA0KPg0KPiArCQkgKiBzbGF2 ZSwgYWxsIHN1YnNlcXVlbnQgc2xhdmVzIG11c3QgbWF0Y2ggdGhlc2UgcHJvcGVydGllcw0KPg0K PiArCQkgKi8NCj4NCj4gKwkJc3RydWN0IHJ0ZV9ldGhfbGluayAqYm9uZF9saW5rID0gJmJvbmRf Y3R4LT5tb2RlNC5zbGF2ZV9saW5rOw0KPg0KPiArDQo+DQo+ICsJCWJvbmRfbGluay0+bGlua19h dXRvbmVnID0gc2xhdmVfbGluay0+bGlua19hdXRvbmVnOw0KPg0KPiArCQlib25kX2xpbmstPmxp bmtfZHVwbGV4ID0gc2xhdmVfbGluay0+bGlua19kdXBsZXg7DQo+DQo+ICsJCWJvbmRfbGluay0+ bGlua19zcGVlZCA9IHNsYXZlX2xpbmstPmxpbmtfc3BlZWQ7DQo+DQo+ICsJfSBlbHNlIHsNCj4N Cj4gKwkJLyoqDQo+DQo+ICsJCSAqIEluIGFueSBvdGhlciBtb2RlIHRoZSBsaW5rIHByb3BlcnRp ZXMgYXJlIHNldCB0byBkZWZhdWx0DQo+DQo+ICsJCSAqIHZhbHVlcyBvZiBBVVRPTkVHL0RVUExF WA0KPg0KPiArCQkgKi8NCj4NCj4gKwkJZXRoZGV2LT5kYXRhLT5kZXZfbGluay5saW5rX2F1dG9u ZWcgPSBSVEVfRVRIX0xJTktfQVVUT05FRzsNCj4NCj4gKwkJZXRoZGV2LT5kYXRhLT5kZXZfbGlu ay5saW5rX2R1cGxleCA9IFJURV9FVEhfTElOS19GVUxMX0RVUExFWDsNCj4NCj4gKwl9DQo+DQo+ ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyBpbnQNCj4NCj4gK2xpbmtfcHJvcGVydGllc192YWxp ZChzdHJ1Y3QgcnRlX2V0aF9kZXYgKmV0aGRldiwNCj4NCj4gKwkJc3RydWN0IHJ0ZV9ldGhfbGlu ayAqc2xhdmVfbGluaykNCj4NCj4gK3sNCj4NCj4gKwlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAq Ym9uZF9jdHggPSBldGhkZXYtPmRhdGEtPmRldl9wcml2YXRlOw0KPg0KPiArDQo+DQo+ICsJaWYg KGJvbmRfY3R4LT5tb2RlID09IEJPTkRJTkdfTU9ERV84MDIzQUQpIHsNCj4NCj4gKwkJc3RydWN0 IHJ0ZV9ldGhfbGluayAqYm9uZF9saW5rID0gJmJvbmRfY3R4LT5tb2RlNC5zbGF2ZV9saW5rOw0K Pg0KPiArDQo+DQo+ICsJCWlmIChib25kX2xpbmstPmxpbmtfZHVwbGV4ICE9IHNsYXZlX2xpbmst PmxpbmtfZHVwbGV4IHx8DQo+DQo+ICsJCQlib25kX2xpbmstPmxpbmtfYXV0b25lZyAhPSBzbGF2 ZV9saW5rLT5saW5rX2F1dG9uZWcgfHwNCj4NCj4gKwkJCWJvbmRfbGluay0+bGlua19zcGVlZCAh PSBzbGF2ZV9saW5rLT5saW5rX3NwZWVkKQ0KPg0KPiArCQkJcmV0dXJuIC0xOw0KPg0KPiArCX0N Cj4NCj4gKw0KPg0KPiArCXJldHVybiAwOw0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICtpbnQNCj4N Cj4gK21hY19hZGRyZXNzX2dldChzdHJ1Y3QgcnRlX2V0aF9kZXYgKmV0aF9kZXYsDQo+DQo+ICsJ CXN0cnVjdCBydGVfZXRoZXJfYWRkciAqZHN0X21hY19hZGRyKQ0KPg0KPiArew0KPg0KPiArCXN0 cnVjdCBydGVfZXRoZXJfYWRkciAqbWFjX2FkZHI7DQo+DQo+ICsNCj4NCj4gKwlpZiAoZXRoX2Rl diA9PSBOVUxMKSB7DQo+DQo+ICsJCVJURV9CT05EX0xPRyhFUlIsICJOVUxMIHBvaW50ZXIgZXRo X2RldiBzcGVjaWZpZWQiKTsNCj4NCj4gKwkJcmV0dXJuIC0xOw0KPg0KPiArCX0NCj4NCj4gKw0K Pg0KPiArCWlmIChkc3RfbWFjX2FkZHIgPT0gTlVMTCkgew0KPg0KPiArCQlSVEVfQk9ORF9MT0co RVJSLCAiTlVMTCBwb2ludGVyIE1BQyBzcGVjaWZpZWQiKTsNCj4NCj4gKwkJcmV0dXJuIC0xOw0K Pg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCW1hY19hZGRyID0gZXRoX2Rldi0+ZGF0YS0+bWFjX2Fk ZHJzOw0KPg0KPiArDQo+DQo+ICsJcnRlX2V0aGVyX2FkZHJfY29weShtYWNfYWRkciwgZHN0X21h Y19hZGRyKTsNCj4NCj4gKwlyZXR1cm4gMDsNCj4NCj4gK30NCj4NCj4gKw0KPg0KPiAraW50DQo+ DQo+ICttYWNfYWRkcmVzc19zZXQoc3RydWN0IHJ0ZV9ldGhfZGV2ICpldGhfZGV2LA0KPg0KPiAr CQlzdHJ1Y3QgcnRlX2V0aGVyX2FkZHIgKm5ld19tYWNfYWRkcikNCj4NCj4gK3sNCj4NCj4gKwlz dHJ1Y3QgcnRlX2V0aGVyX2FkZHIgKm1hY19hZGRyOw0KPg0KPiArDQo+DQo+ICsJaWYgKGV0aF9k ZXYgPT0gTlVMTCkgew0KPg0KPiArCQlSVEVfQk9ORF9MT0coRVJSLCAiTlVMTCBwb2ludGVyIGV0 aF9kZXYgc3BlY2lmaWVkIik7DQo+DQo+ICsJCXJldHVybiAtMTsNCj4NCj4gKwl9DQo+DQo+ICsN Cj4NCj4gKwlpZiAobmV3X21hY19hZGRyID09IE5VTEwpIHsNCj4NCj4gKwkJUlRFX0JPTkRfTE9H KEVSUiwgIk5VTEwgcG9pbnRlciBNQUMgc3BlY2lmaWVkIik7DQo+DQo+ICsJCXJldHVybiAtMTsN Cj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwltYWNfYWRkciA9IGV0aF9kZXYtPmRhdGEtPm1hY19h ZGRyczsNCj4NCj4gKw0KPg0KPiArCS8qIElmIG5ldyBNQUMgaXMgZGlmZmVyZW50IHRvIGN1cnJl bnQgTUFDIHRoZW4gdXBkYXRlICovDQo+DQo+ICsJaWYgKG1lbWNtcChtYWNfYWRkciwgbmV3X21h Y19hZGRyLCBzaXplb2YoKm1hY19hZGRyKSkgIT0gMCkNCj4NCj4gKwkJbWVtY3B5KG1hY19hZGRy LCBuZXdfbWFjX2FkZHIsIHNpemVvZigqbWFjX2FkZHIpKTsNCj4NCj4gKw0KPg0KPiArCXJldHVy biAwOw0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHJ0ZV9ldGhl cl9hZGRyIG51bGxfbWFjX2FkZHI7DQo+DQo+ICsNCj4NCj4gKy8qDQo+DQo+ICsgKiBBZGQgYWRk aXRpb25hbCBNQUMgYWRkcmVzc2VzIHRvIHRoZSBzbGF2ZQ0KPg0KPiArICovDQo+DQo+ICtpbnQN Cj4NCj4gK3NsYXZlX2FkZF9tYWNfYWRkcmVzc2VzKHN0cnVjdCBydGVfZXRoX2RldiAqYm9uZGVk X2V0aF9kZXYsDQo+DQo+ICsJCXVpbnQxNl90IHNsYXZlX3BvcnRfaWQpDQo+DQo+ICt7DQo+DQo+ ICsJaW50IGksIHJldDsNCj4NCj4gKwlzdHJ1Y3QgcnRlX2V0aGVyX2FkZHIgKm1hY19hZGRyOw0K Pg0KPiArDQo+DQo+ICsJZm9yIChpID0gMTsgaSA8IEJPTkRfTUFYX01BQ19BRERSUzsgaSsrKSB7 DQo+DQo+ICsJCW1hY19hZGRyID0gJmJvbmRlZF9ldGhfZGV2LT5kYXRhLT5tYWNfYWRkcnNbaV07 DQo+DQo+ICsJCWlmIChydGVfaXNfc2FtZV9ldGhlcl9hZGRyKG1hY19hZGRyLCAmbnVsbF9tYWNf YWRkcikpDQo+DQo+ICsJCQlicmVhazsNCj4NCj4gKw0KPg0KPiArCQlyZXQgPSBydGVfZXRoX2Rl dl9tYWNfYWRkcl9hZGQoc2xhdmVfcG9ydF9pZCwgbWFjX2FkZHIsIDApOw0KPg0KPiArCQlpZiAo cmV0IDwgMCkgew0KPg0KPiArCQkJLyogcm9sbGJhY2sgKi8NCj4NCj4gKwkJCWZvciAoaS0tOyBp ID4gMDsgaS0tKQ0KPg0KPiArCQkJCXJ0ZV9ldGhfZGV2X21hY19hZGRyX3JlbW92ZShzbGF2ZV9w b3J0X2lkLA0KPg0KPiArCQkJCQkmYm9uZGVkX2V0aF9kZXYtPmRhdGEtPm1hY19hZGRyc1tpXSk7 DQo+DQo+ICsJCQlyZXR1cm4gcmV0Ow0KPg0KPiArCQl9DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ ICsJcmV0dXJuIDA7DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gKy8qDQo+DQo+ICsgKiBSZW1vdmUg YWRkaXRpb25hbCBNQUMgYWRkcmVzc2VzIGZyb20gdGhlIHNsYXZlDQo+DQo+ICsgKi8NCj4NCj4g K2ludA0KPg0KPiArc2xhdmVfcmVtb3ZlX21hY19hZGRyZXNzZXMoc3RydWN0IHJ0ZV9ldGhfZGV2 ICpib25kZWRfZXRoX2RldiwNCj4NCj4gKwkJdWludDE2X3Qgc2xhdmVfcG9ydF9pZCkNCj4NCj4g K3sNCj4NCj4gKwlpbnQgaSwgcmMsIHJldDsNCj4NCj4gKwlzdHJ1Y3QgcnRlX2V0aGVyX2FkZHIg Km1hY19hZGRyOw0KPg0KPiArDQo+DQo+ICsJcmMgPSAwOw0KPg0KPiArCWZvciAoaSA9IDE7IGkg PCBCT05EX01BWF9NQUNfQUREUlM7IGkrKykgew0KPg0KPiArCQltYWNfYWRkciA9ICZib25kZWRf ZXRoX2Rldi0+ZGF0YS0+bWFjX2FkZHJzW2ldOw0KPg0KPiArCQlpZiAocnRlX2lzX3NhbWVfZXRo ZXJfYWRkcihtYWNfYWRkciwgJm51bGxfbWFjX2FkZHIpKQ0KPg0KPiArCQkJYnJlYWs7DQo+DQo+ ICsNCj4NCj4gKwkJcmV0ID0gcnRlX2V0aF9kZXZfbWFjX2FkZHJfcmVtb3ZlKHNsYXZlX3BvcnRf aWQsIG1hY19hZGRyKTsNCj4NCj4gKwkJLyogc2F2ZSBvbmx5IHRoZSBmaXJzdCBlcnJvciAqLw0K Pg0KPiArCQlpZiAocmV0IDwgMCAmJiByYyA9PSAwKQ0KPg0KPiArCQkJcmMgPSByZXQ7DQo+DQo+ ICsJfQ0KPg0KPiArDQo+DQo+ICsJcmV0dXJuIHJjOw0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICtp bnQNCj4NCj4gK21hY19hZGRyZXNzX3NsYXZlc191cGRhdGUoc3RydWN0IHJ0ZV9ldGhfZGV2ICpi b25kZWRfZXRoX2RldikNCj4NCj4gK3sNCj4NCj4gKwlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAq aW50ZXJuYWxzID0gYm9uZGVkX2V0aF9kZXYtPmRhdGEtPmRldl9wcml2YXRlOw0KPg0KPiArCWJv b2wgc2V0Ow0KPg0KPiArCWludCBpOw0KPg0KPiArDQo+DQo+ICsJLyogVXBkYXRlIHNsYXZlIGRl dmljZXMgTUFDIGFkZHJlc3NlcyAqLw0KPg0KPiArCWlmIChpbnRlcm5hbHMtPnNsYXZlX2NvdW50 IDwgMSkNCj4NCj4gKwkJcmV0dXJuIC0xOw0KPg0KPiArDQo+DQo+ICsJc3dpdGNoIChpbnRlcm5h bHMtPm1vZGUpIHsNCj4NCj4gKwljYXNlIEJPTkRJTkdfTU9ERV9ST1VORF9ST0JJTjoNCj4NCj4g KwljYXNlIEJPTkRJTkdfTU9ERV9CQUxBTkNFOg0KPg0KPiArCWNhc2UgQk9ORElOR19NT0RFX0JS T0FEQ0FTVDoNCj4NCj4gKwkJZm9yIChpID0gMDsgaSA8IGludGVybmFscy0+c2xhdmVfY291bnQ7 IGkrKykgew0KPg0KPiArCQkJaWYgKHJ0ZV9ldGhfZGV2X2RlZmF1bHRfbWFjX2FkZHJfc2V0KA0K Pg0KPiArCQkJCQlpbnRlcm5hbHMtPnNsYXZlc1tpXS5wb3J0X2lkLA0KPg0KPiArCQkJCQlib25k ZWRfZXRoX2Rldi0+ZGF0YS0+bWFjX2FkZHJzKSkgew0KPg0KPiArCQkJCVJURV9CT05EX0xPRyhF UlIsICJGYWlsZWQgdG8gdXBkYXRlIHBvcnQgSWQgJWQgTUFDIGFkZHJlc3MiLA0KPg0KPiArCQkJ CQkJaW50ZXJuYWxzLT5zbGF2ZXNbaV0ucG9ydF9pZCk7DQo+DQo+ICsJCQkJcmV0dXJuIC0xOw0K Pg0KPiArCQkJfQ0KPg0KPiArCQl9DQo+DQo+ICsJCWJyZWFrOw0KPg0KPiArCWNhc2UgQk9ORElO R19NT0RFXzgwMjNBRDoNCj4NCj4gKwkJYm9uZF9tb2RlXzgwMjNhZF9tYWNfYWRkcmVzc191cGRh dGUoYm9uZGVkX2V0aF9kZXYpOw0KPg0KPiArCQlicmVhazsNCj4NCj4gKwljYXNlIEJPTkRJTkdf TU9ERV9BQ1RJVkVfQkFDS1VQOg0KPg0KPiArCWNhc2UgQk9ORElOR19NT0RFX1RMQjoNCj4NCj4g KwljYXNlIEJPTkRJTkdfTU9ERV9BTEI6DQo+DQo+ICsJZGVmYXVsdDoNCj4NCj4gKwkJc2V0ID0g dHJ1ZTsNCj4NCj4gKwkJZm9yIChpID0gMDsgaSA8IGludGVybmFscy0+c2xhdmVfY291bnQ7IGkr Kykgew0KPg0KPiArCQkJaWYgKGludGVybmFscy0+c2xhdmVzW2ldLnBvcnRfaWQgPT0NCj4NCj4g KwkJCQkJaW50ZXJuYWxzLT5jdXJyZW50X3ByaW1hcnlfcG9ydCkgew0KPg0KPiArCQkJCWlmIChy dGVfZXRoX2Rldl9kZWZhdWx0X21hY19hZGRyX3NldCgNCj4NCj4gKwkJCQkJCWludGVybmFscy0+ Y3VycmVudF9wcmltYXJ5X3BvcnQsDQo+DQo+ICsJCQkJCQlib25kZWRfZXRoX2Rldi0+ZGF0YS0+ bWFjX2FkZHJzKSkgew0KPg0KPiArCQkJCQlSVEVfQk9ORF9MT0coRVJSLCAiRmFpbGVkIHRvIHVw ZGF0ZSBwb3J0IElkICVkIE1BQyBhZGRyZXNzIiwNCj4NCj4gKwkJCQkJCQlpbnRlcm5hbHMtPmN1 cnJlbnRfcHJpbWFyeV9wb3J0KTsNCj4NCj4gKwkJCQkJc2V0ID0gZmFsc2U7DQo+DQo+ICsJCQkJ fQ0KPg0KPiArCQkJfSBlbHNlIHsNCj4NCj4gKwkJCQlpZiAocnRlX2V0aF9kZXZfZGVmYXVsdF9t YWNfYWRkcl9zZXQoDQo+DQo+ICsJCQkJCQlpbnRlcm5hbHMtPnNsYXZlc1tpXS5wb3J0X2lkLA0K Pg0KPiArCQkJCQkJJmludGVybmFscy0+c2xhdmVzW2ldLnBlcnNpc3RlZF9tYWNfYWRkcikpIHsN Cj4NCj4gKwkJCQkJUlRFX0JPTkRfTE9HKEVSUiwgIkZhaWxlZCB0byB1cGRhdGUgcG9ydCBJZCAl ZCBNQUMgYWRkcmVzcyIsDQo+DQo+ICsJCQkJCQkJaW50ZXJuYWxzLT5zbGF2ZXNbaV0ucG9ydF9p ZCk7DQo+DQo+ICsJCQkJfQ0KPg0KPiArCQkJfQ0KPg0KPiArCQl9DQo+DQo+ICsJCWlmICghc2V0 KQ0KPg0KPiArCQkJcmV0dXJuIC0xOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCXJldHVybiAw Ow0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICtpbnQNCj4NCj4gK2JvbmRfZXRoZGV2X21vZGVfc2V0 KHN0cnVjdCBydGVfZXRoX2RldiAqZXRoX2RldiwgdWludDhfdCBtb2RlKQ0KPg0KPiArew0KPg0K PiArCXN0cnVjdCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHM7DQo+DQo+ICsNCj4NCj4gKwlp bnRlcm5hbHMgPSBldGhfZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4NCj4gKw0KPg0KPiArCXN3 aXRjaCAobW9kZSkgew0KPg0KPiArCWNhc2UgQk9ORElOR19NT0RFX1JPVU5EX1JPQklOOg0KPg0K PiArCQlldGhfZGV2LT50eF9wa3RfYnVyc3QgPSBib25kX2V0aGRldl90eF9idXJzdF9yb3VuZF9y b2JpbjsNCj4NCj4gKwkJZXRoX2Rldi0+cnhfcGt0X2J1cnN0ID0gYm9uZF9ldGhkZXZfcnhfYnVy c3Q7DQo+DQo+ICsJCWJyZWFrOw0KPg0KPiArCWNhc2UgQk9ORElOR19NT0RFX0FDVElWRV9CQUNL VVA6DQo+DQo+ICsJCWV0aF9kZXYtPnR4X3BrdF9idXJzdCA9IGJvbmRfZXRoZGV2X3R4X2J1cnN0 X2FjdGl2ZV9iYWNrdXA7DQo+DQo+ICsJCWV0aF9kZXYtPnJ4X3BrdF9idXJzdCA9IGJvbmRfZXRo ZGV2X3J4X2J1cnN0X2FjdGl2ZV9iYWNrdXA7DQo+DQo+ICsJCWJyZWFrOw0KPg0KPiArCWNhc2Ug Qk9ORElOR19NT0RFX0JBTEFOQ0U6DQo+DQo+ICsJCWV0aF9kZXYtPnR4X3BrdF9idXJzdCA9IGJv bmRfZXRoZGV2X3R4X2J1cnN0X2JhbGFuY2U7DQo+DQo+ICsJCWV0aF9kZXYtPnJ4X3BrdF9idXJz dCA9IGJvbmRfZXRoZGV2X3J4X2J1cnN0Ow0KPg0KPiArCQlicmVhazsNCj4NCj4gKwljYXNlIEJP TkRJTkdfTU9ERV9CUk9BRENBU1Q6DQo+DQo+ICsJCWV0aF9kZXYtPnR4X3BrdF9idXJzdCA9IGJv bmRfZXRoZGV2X3R4X2J1cnN0X2Jyb2FkY2FzdDsNCj4NCj4gKwkJZXRoX2Rldi0+cnhfcGt0X2J1 cnN0ID0gYm9uZF9ldGhkZXZfcnhfYnVyc3Q7DQo+DQo+ICsJCWJyZWFrOw0KPg0KPiArCWNhc2Ug Qk9ORElOR19NT0RFXzgwMjNBRDoNCj4NCj4gKwkJaWYgKGJvbmRfbW9kZV84MDIzYWRfZW5hYmxl KGV0aF9kZXYpICE9IDApDQo+DQo+ICsJCQlyZXR1cm4gLTE7DQo+DQo+ICsNCj4NCj4gKwkJaWYg KGludGVybmFscy0+bW9kZTQuZGVkaWNhdGVkX3F1ZXVlcy5lbmFibGVkID09IDApIHsNCj4NCj4g KwkJCWV0aF9kZXYtPnJ4X3BrdF9idXJzdCA9IGJvbmRfZXRoZGV2X3J4X2J1cnN0XzgwMjNhZDsN Cj4NCj4gKwkJCWV0aF9kZXYtPnR4X3BrdF9idXJzdCA9IGJvbmRfZXRoZGV2X3R4X2J1cnN0Xzgw MjNhZDsNCj4NCj4gKwkJCVJURV9CT05EX0xPRyhXQVJOSU5HLA0KPg0KPiArCQkJCSJVc2luZyBt b2RlIDQsIGl0IGlzIG5lY2Vzc2FyeSB0byBkbyBUWCBidXJzdCAiDQo+DQo+ICsJCQkJImFuZCBS WCBidXJzdCBhdCBsZWFzdCBldmVyeSAxMDBtcy4iKTsNCj4NCj4gKwkJfSBlbHNlIHsNCj4NCj4g KwkJCS8qIFVzZSBmbG93IGRpcmVjdG9yJ3Mgb3B0aW1pemF0aW9uICovDQo+DQo+ICsJCQlldGhf ZGV2LT5yeF9wa3RfYnVyc3QgPQ0KPg0KPiArCQkJCQlib25kX2V0aGRldl9yeF9idXJzdF84MDIz YWRfZmFzdF9xdWV1ZTsNCj4NCj4gKwkJCWV0aF9kZXYtPnR4X3BrdF9idXJzdCA9DQo+DQo+ICsJ CQkJCWJvbmRfZXRoZGV2X3R4X2J1cnN0XzgwMjNhZF9mYXN0X3F1ZXVlOw0KPg0KPiArCQl9DQo+ DQo+ICsJCWJyZWFrOw0KPg0KPiArCWNhc2UgQk9ORElOR19NT0RFX1RMQjoNCj4NCj4gKwkJZXRo X2Rldi0+dHhfcGt0X2J1cnN0ID0gYm9uZF9ldGhkZXZfdHhfYnVyc3RfdGxiOw0KPg0KPiArCQll dGhfZGV2LT5yeF9wa3RfYnVyc3QgPSBib25kX2V0aGRldl9yeF9idXJzdF9hY3RpdmVfYmFja3Vw Ow0KPg0KPiArCQlicmVhazsNCj4NCj4gKwljYXNlIEJPTkRJTkdfTU9ERV9BTEI6DQo+DQo+ICsJ CWlmIChib25kX21vZGVfYWxiX2VuYWJsZShldGhfZGV2KSAhPSAwKQ0KPg0KPiArCQkJcmV0dXJu IC0xOw0KPg0KPiArDQo+DQo+ICsJCWV0aF9kZXYtPnR4X3BrdF9idXJzdCA9IGJvbmRfZXRoZGV2 X3R4X2J1cnN0X2FsYjsNCj4NCj4gKwkJZXRoX2Rldi0+cnhfcGt0X2J1cnN0ID0gYm9uZF9ldGhk ZXZfcnhfYnVyc3RfYWxiOw0KPg0KPiArCQlicmVhazsNCj4NCj4gKwlkZWZhdWx0Og0KPg0KPiAr CQlyZXR1cm4gLTE7DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJaW50ZXJuYWxzLT5tb2RlID0g bW9kZTsNCj4NCj4gKw0KPg0KPiArCXJldHVybiAwOw0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICsN Cj4NCj4gK3N0YXRpYyBpbnQNCj4NCj4gK3NsYXZlX2NvbmZpZ3VyZV9zbG93X3F1ZXVlKHN0cnVj dCBydGVfZXRoX2RldiAqYm9uZGVkX2V0aF9kZXYsDQo+DQo+ICsJCXN0cnVjdCBydGVfZXRoX2Rl diAqc2xhdmVfZXRoX2RldikNCj4NCj4gK3sNCj4NCj4gKwlpbnQgZXJydmFsID0gMDsNCj4NCj4g KwlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzID0gYm9uZGVkX2V0aF9kZXYtPmRh dGEtPmRldl9wcml2YXRlOw0KPg0KPiArCXN0cnVjdCBwb3J0ICpwb3J0ID0gJmJvbmRfbW9kZV84 MDIzYWRfcG9ydHNbc2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZF07DQo+DQo+ICsNCj4NCj4g KwlpZiAocG9ydC0+c2xvd19wb29sID09IE5VTEwpIHsNCj4NCj4gKwkJY2hhciBtZW1fbmFtZVsy NTZdOw0KPg0KPiArCQlpbnQgc2xhdmVfaWQgPSBzbGF2ZV9ldGhfZGV2LT5kYXRhLT5wb3J0X2lk Ow0KPg0KPiArDQo+DQo+ICsJCXNucHJpbnRmKG1lbV9uYW1lLCBSVEVfRElNKG1lbV9uYW1lKSwg InNsYXZlX3BvcnQldV9zbG93X3Bvb2wiLA0KPg0KPiArCQkJCXNsYXZlX2lkKTsNCj4NCj4gKwkJ cG9ydC0+c2xvd19wb29sID0gcnRlX3BrdG1idWZfcG9vbF9jcmVhdGUobWVtX25hbWUsIDgxOTEs DQo+DQo+ICsJCQkyNTAsIDAsIFJURV9NQlVGX0RFRkFVTFRfQlVGX1NJWkUsDQo+DQo+ICsJCQlz bGF2ZV9ldGhfZGV2LT5kYXRhLT5udW1hX25vZGUpOw0KPg0KPiArDQo+DQo+ICsJCS8qIEFueSBt ZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIGluIGluaXRpYWxpemF0aW9uIGlzIGNyaXRpY2FsIGJl Y2F1c2UNCj4NCj4gKwkJICogcmVzb3VyY2VzIGNhbid0IGJlIGZyZWUsIHNvIHJlaW5pdGlhbGl6 YXRpb24gaXMgaW1wb3NzaWJsZS4gKi8NCj4NCj4gKwkJaWYgKHBvcnQtPnNsb3dfcG9vbCA9PSBO VUxMKSB7DQo+DQo+ICsJCQlydGVfcGFuaWMoIlNsYXZlICV1OiBGYWlsZWQgdG8gY3JlYXRlIG1l bW9yeSBwb29sICclcyc6ICVzXG4iLA0KPg0KPiArCQkJCXNsYXZlX2lkLCBtZW1fbmFtZSwgcnRl X3N0cmVycm9yKHJ0ZV9lcnJubykpOw0KPg0KPiArCQl9DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ ICsJaWYgKGludGVybmFscy0+bW9kZTQuZGVkaWNhdGVkX3F1ZXVlcy5lbmFibGVkID09IDEpIHsN Cj4NCj4gKwkJLyogQ29uZmlndXJlIHNsb3cgUnggcXVldWUgKi8NCj4NCj4gKw0KPg0KPiArCQll cnJ2YWwgPSBydGVfZXRoX3J4X3F1ZXVlX3NldHVwKHNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRf aWQsDQo+DQo+ICsJCQkJaW50ZXJuYWxzLT5tb2RlNC5kZWRpY2F0ZWRfcXVldWVzLnJ4X3FpZCwg MTI4LA0KPg0KPiArCQkJCXJ0ZV9ldGhfZGV2X3NvY2tldF9pZChzbGF2ZV9ldGhfZGV2LT5kYXRh LT5wb3J0X2lkKSwNCj4NCj4gKwkJCQlOVUxMLCBwb3J0LT5zbG93X3Bvb2wpOw0KPg0KPiArCQlp ZiAoZXJydmFsICE9IDApIHsNCj4NCj4gKwkJCVJURV9CT05EX0xPRyhFUlIsDQo+DQo+ICsJCQkJ CSJydGVfZXRoX3J4X3F1ZXVlX3NldHVwOiBwb3J0PSVkIHF1ZXVlX2lkICVkLCBlcnIgKCVkKSIs DQo+DQo+ICsJCQkJCXNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQsDQo+DQo+ICsJCQkJCWlu dGVybmFscy0+bW9kZTQuZGVkaWNhdGVkX3F1ZXVlcy5yeF9xaWQsDQo+DQo+ICsJCQkJCWVycnZh bCk7DQo+DQo+ICsJCQlyZXR1cm4gZXJydmFsOw0KPg0KPiArCQl9DQo+DQo+ICsNCj4NCj4gKwkJ ZXJydmFsID0gcnRlX2V0aF90eF9xdWV1ZV9zZXR1cChzbGF2ZV9ldGhfZGV2LT5kYXRhLT5wb3J0 X2lkLA0KPg0KPiArCQkJCWludGVybmFscy0+bW9kZTQuZGVkaWNhdGVkX3F1ZXVlcy50eF9xaWQs IDUxMiwNCj4NCj4gKwkJCQlydGVfZXRoX2Rldl9zb2NrZXRfaWQoc2xhdmVfZXRoX2Rldi0+ZGF0 YS0+cG9ydF9pZCksDQo+DQo+ICsJCQkJTlVMTCk7DQo+DQo+ICsJCWlmIChlcnJ2YWwgIT0gMCkg ew0KPg0KPiArCQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4NCj4gKwkJCQkicnRlX2V0aF90eF9xdWV1 ZV9zZXR1cDogcG9ydD0lZCBxdWV1ZV9pZCAlZCwgZXJyICglZCkiLA0KPg0KPiArCQkJCXNsYXZl X2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQsDQo+DQo+ICsJCQkJaW50ZXJuYWxzLT5tb2RlNC5kZWRp Y2F0ZWRfcXVldWVzLnR4X3FpZCwNCj4NCj4gKwkJCQllcnJ2YWwpOw0KPg0KPiArCQkJcmV0dXJu IGVycnZhbDsNCj4NCj4gKwkJfQ0KPg0KPiArCX0NCj4NCj4gKwlyZXR1cm4gMDsNCj4NCj4gK30N Cj4NCj4gKw0KPg0KPiAraW50DQo+DQo+ICtzbGF2ZV9jb25maWd1cmUoc3RydWN0IHJ0ZV9ldGhf ZGV2ICpib25kZWRfZXRoX2RldiwNCj4NCj4gKwkJc3RydWN0IHJ0ZV9ldGhfZGV2ICpzbGF2ZV9l dGhfZGV2KQ0KPg0KPiArew0KPg0KPiArCXVpbnQxNl90IG5iX3J4X3F1ZXVlczsNCj4NCj4gKwl1 aW50MTZfdCBuYl90eF9xdWV1ZXM7DQo+DQo+ICsNCj4NCj4gKwlpbnQgZXJydmFsOw0KPg0KPiAr DQo+DQo+ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFscyA9IGJvbmRlZF9ldGhf ZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4NCj4gKw0KPg0KPiArCS8qIFN0b3Agc2xhdmUgKi8N Cj4NCj4gKwllcnJ2YWwgPSBydGVfZXRoX2Rldl9zdG9wKHNsYXZlX2V0aF9kZXYtPmRhdGEtPnBv cnRfaWQpOw0KPg0KPiArCWlmIChlcnJ2YWwgIT0gMCkNCj4NCj4gKwkJUlRFX0JPTkRfTE9HKEVS UiwgInJ0ZV9ldGhfZGV2X3N0b3A6IHBvcnQgJXUsIGVyciAoJWQpIiwNCj4NCj4gKwkJCSAgICAg c2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCwgZXJydmFsKTsNCj4NCj4gKw0KPg0KPiArCS8q IEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHNsYXZlIGRldmljZSBpZiBzdXBwb3J0ZWQgKi8NCj4NCj4g KwlpZiAoc2xhdmVfZXRoX2Rldi0+ZGF0YS0+ZGV2X2ZsYWdzICYgUlRFX0VUSF9ERVZfSU5UUl9M U0MpDQo+DQo+ICsJCXNsYXZlX2V0aF9kZXYtPmRhdGEtPmRldl9jb25mLmludHJfY29uZi5sc2Mg PSAxOw0KPg0KPiArDQo+DQo+ICsJLyogSWYgUlNTIGlzIGVuYWJsZWQgZm9yIGJvbmRpbmcsIHRy eSB0byBlbmFibGUgaXQgZm9yIHNsYXZlcyAgKi8NCj4NCj4gKwlpZiAoYm9uZGVkX2V0aF9kZXYt PmRhdGEtPmRldl9jb25mLnJ4bW9kZS5tcV9tb2RlICYgUlRFX0VUSF9NUV9SWF9SU1NfRkxBRykg ew0KPg0KPiArCQkvKiByc3Nfa2V5IHdvbid0IGJlIGVtcHR5IGlmIFJTUyBpcyBjb25maWd1cmVk IGluIGJvbmRlZCBkZXYgKi8NCj4NCj4gKwkJc2xhdmVfZXRoX2Rldi0+ZGF0YS0+ZGV2X2NvbmYu cnhfYWR2X2NvbmYucnNzX2NvbmYucnNzX2tleV9sZW4gPQ0KPg0KPiArCQkJCQlpbnRlcm5hbHMt PnJzc19rZXlfbGVuOw0KPg0KPiArCQlzbGF2ZV9ldGhfZGV2LT5kYXRhLT5kZXZfY29uZi5yeF9h ZHZfY29uZi5yc3NfY29uZi5yc3Nfa2V5ID0NCj4NCj4gKwkJCQkJaW50ZXJuYWxzLT5yc3Nfa2V5 Ow0KPg0KPiArDQo+DQo+ICsJCXNsYXZlX2V0aF9kZXYtPmRhdGEtPmRldl9jb25mLnJ4X2Fkdl9j b25mLnJzc19jb25mLnJzc19oZiA9DQo+DQo+ICsJCQkJYm9uZGVkX2V0aF9kZXYtPmRhdGEtPmRl dl9jb25mLnJ4X2Fkdl9jb25mLnJzc19jb25mLnJzc19oZjsNCj4NCj4gKwkJc2xhdmVfZXRoX2Rl di0+ZGF0YS0+ZGV2X2NvbmYucnhtb2RlLm1xX21vZGUgPQ0KPg0KPiArCQkJCWJvbmRlZF9ldGhf ZGV2LT5kYXRhLT5kZXZfY29uZi5yeG1vZGUubXFfbW9kZTsNCj4NCj4gKwl9IGVsc2Ugew0KPg0K PiArCQlzbGF2ZV9ldGhfZGV2LT5kYXRhLT5kZXZfY29uZi5yeF9hZHZfY29uZi5yc3NfY29uZi5y c3Nfa2V5X2xlbiA9IDA7DQo+DQo+ICsJCXNsYXZlX2V0aF9kZXYtPmRhdGEtPmRldl9jb25mLnJ4 X2Fkdl9jb25mLnJzc19jb25mLnJzc19rZXkgPSBOVUxMOw0KPg0KPiArCQlzbGF2ZV9ldGhfZGV2 LT5kYXRhLT5kZXZfY29uZi5yeF9hZHZfY29uZi5yc3NfY29uZi5yc3NfaGYgPSAwOw0KPg0KPiAr CQlzbGF2ZV9ldGhfZGV2LT5kYXRhLT5kZXZfY29uZi5yeG1vZGUubXFfbW9kZSA9DQo+DQo+ICsJ CQkJYm9uZGVkX2V0aF9kZXYtPmRhdGEtPmRldl9jb25mLnJ4bW9kZS5tcV9tb2RlOw0KPg0KPiAr CX0NCj4NCj4gKw0KPg0KPiArCXNsYXZlX2V0aF9kZXYtPmRhdGEtPmRldl9jb25mLnJ4bW9kZS5t dHUgPQ0KPg0KPiArCQkJYm9uZGVkX2V0aF9kZXYtPmRhdGEtPmRldl9jb25mLnJ4bW9kZS5tdHU7 DQo+DQo+ICsNCj4NCj4gKwlzbGF2ZV9ldGhfZGV2LT5kYXRhLT5kZXZfY29uZi50eG1vZGUub2Zm bG9hZHMgfD0NCj4NCj4gKwkJYm9uZGVkX2V0aF9kZXYtPmRhdGEtPmRldl9jb25mLnR4bW9kZS5v ZmZsb2FkczsNCj4NCj4gKw0KPg0KPiArCXNsYXZlX2V0aF9kZXYtPmRhdGEtPmRldl9jb25mLnR4 bW9kZS5vZmZsb2FkcyAmPQ0KPg0KPiArCQkoYm9uZGVkX2V0aF9kZXYtPmRhdGEtPmRldl9jb25m LnR4bW9kZS5vZmZsb2FkcyB8DQo+DQo+ICsJCX5pbnRlcm5hbHMtPnR4X29mZmxvYWRfY2FwYSk7 DQo+DQo+ICsNCj4NCj4gKwlzbGF2ZV9ldGhfZGV2LT5kYXRhLT5kZXZfY29uZi5yeG1vZGUub2Zm bG9hZHMgfD0NCj4NCj4gKwkJYm9uZGVkX2V0aF9kZXYtPmRhdGEtPmRldl9jb25mLnJ4bW9kZS5v ZmZsb2FkczsNCj4NCj4gKw0KPg0KPiArCXNsYXZlX2V0aF9kZXYtPmRhdGEtPmRldl9jb25mLnJ4 bW9kZS5vZmZsb2FkcyAmPQ0KPg0KPiArCQkoYm9uZGVkX2V0aF9kZXYtPmRhdGEtPmRldl9jb25m LnJ4bW9kZS5vZmZsb2FkcyB8DQo+DQo+ICsJCX5pbnRlcm5hbHMtPnJ4X29mZmxvYWRfY2FwYSk7 DQo+DQo+ICsNCj4NCj4gKw0KPg0KPiArCW5iX3J4X3F1ZXVlcyA9IGJvbmRlZF9ldGhfZGV2LT5k YXRhLT5uYl9yeF9xdWV1ZXM7DQo+DQo+ICsJbmJfdHhfcXVldWVzID0gYm9uZGVkX2V0aF9kZXYt PmRhdGEtPm5iX3R4X3F1ZXVlczsNCj4NCj4gKw0KPg0KPiArCWlmIChpbnRlcm5hbHMtPm1vZGUg PT0gQk9ORElOR19NT0RFXzgwMjNBRCkgew0KPg0KPiArCQlpZiAoaW50ZXJuYWxzLT5tb2RlNC5k ZWRpY2F0ZWRfcXVldWVzLmVuYWJsZWQgPT0gMSkgew0KPg0KPiArCQkJbmJfcnhfcXVldWVzKys7 DQo+DQo+ICsJCQluYl90eF9xdWV1ZXMrKzsNCj4NCj4gKwkJfQ0KPg0KPiArCX0NCj4NCj4gKw0K Pg0KPiArCS8qIENvbmZpZ3VyZSBkZXZpY2UgKi8NCj4NCj4gKwllcnJ2YWwgPSBydGVfZXRoX2Rl dl9jb25maWd1cmUoc2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCwNCj4NCj4gKwkJCW5iX3J4 X3F1ZXVlcywgbmJfdHhfcXVldWVzLA0KPg0KPiArCQkJJihzbGF2ZV9ldGhfZGV2LT5kYXRhLT5k ZXZfY29uZikpOw0KPg0KPiArCWlmIChlcnJ2YWwgIT0gMCkgew0KPg0KPiArCQlSVEVfQk9ORF9M T0coRVJSLCAiQ2Fubm90IGNvbmZpZ3VyZSBzbGF2ZSBkZXZpY2U6IHBvcnQgJXUsIGVyciAoJWQp IiwNCj4NCj4gKwkJCQlzbGF2ZV9ldGhfZGV2LT5kYXRhLT5wb3J0X2lkLCBlcnJ2YWwpOw0KPg0K PiArCQlyZXR1cm4gZXJydmFsOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCWVycnZhbCA9IHJ0 ZV9ldGhfZGV2X3NldF9tdHUoc2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCwNCj4NCj4gKwkJ CQkgICAgIGJvbmRlZF9ldGhfZGV2LT5kYXRhLT5tdHUpOw0KPg0KPiArCWlmIChlcnJ2YWwgIT0g MCAmJiBlcnJ2YWwgIT0gLUVOT1RTVVApIHsNCj4NCj4gKwkJUlRFX0JPTkRfTE9HKEVSUiwgInJ0 ZV9ldGhfZGV2X3NldF9tdHU6IHBvcnQgJXUsIGVyciAoJWQpIiwNCj4NCj4gKwkJCQlzbGF2ZV9l dGhfZGV2LT5kYXRhLT5wb3J0X2lkLCBlcnJ2YWwpOw0KPg0KPiArCQlyZXR1cm4gZXJydmFsOw0K Pg0KPiArCX0NCj4NCj4gKwlyZXR1cm4gMDsNCj4NCj4gK30NCj4NCj4gKw0KPg0KPiAraW50DQo+ DQo+ICtzbGF2ZV9zdGFydChzdHJ1Y3QgcnRlX2V0aF9kZXYgKmJvbmRlZF9ldGhfZGV2LA0KPg0K PiArCQlzdHJ1Y3QgcnRlX2V0aF9kZXYgKnNsYXZlX2V0aF9kZXYpDQo+DQo+ICt7DQo+DQo+ICsJ aW50IGVycnZhbCA9IDA7DQo+DQo+ICsJc3RydWN0IGJvbmRfcnhfcXVldWUgKmJkX3J4X3E7DQo+ DQo+ICsJc3RydWN0IGJvbmRfdHhfcXVldWUgKmJkX3R4X3E7DQo+DQo+ICsJdWludDE2X3QgcV9p ZDsNCj4NCj4gKwlzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgZmxvd19lcnJvcjsNCj4NCj4gKwlzdHJ1 Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzID0gYm9uZGVkX2V0aF9kZXYtPmRhdGEtPmRl dl9wcml2YXRlOw0KPg0KPiArDQo+DQo+ICsJLyogU2V0dXAgUnggUXVldWVzICovDQo+DQo+ICsJ Zm9yIChxX2lkID0gMDsgcV9pZCA8IGJvbmRlZF9ldGhfZGV2LT5kYXRhLT5uYl9yeF9xdWV1ZXM7 IHFfaWQrKykgew0KPg0KPiArCQliZF9yeF9xID0gKHN0cnVjdCBib25kX3J4X3F1ZXVlICopYm9u ZGVkX2V0aF9kZXYtPmRhdGEtPnJ4X3F1ZXVlc1txX2lkXTsNCj4NCj4gKw0KPg0KPiArCQllcnJ2 YWwgPSBydGVfZXRoX3J4X3F1ZXVlX3NldHVwKHNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQs IHFfaWQsDQo+DQo+ICsJCQkJYmRfcnhfcS0+bmJfcnhfZGVzYywNCj4NCj4gKwkJCQlydGVfZXRo X2Rldl9zb2NrZXRfaWQoc2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCksDQo+DQo+ICsJCQkJ JihiZF9yeF9xLT5yeF9jb25mKSwgYmRfcnhfcS0+bWJfcG9vbCk7DQo+DQo+ICsJCWlmIChlcnJ2 YWwgIT0gMCkgew0KPg0KPiArCQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4NCj4gKwkJCQkJInJ0ZV9l dGhfcnhfcXVldWVfc2V0dXA6IHBvcnQ9JWQgcXVldWVfaWQgJWQsIGVyciAoJWQpIiwNCj4NCj4g KwkJCQkJc2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCwgcV9pZCwgZXJydmFsKTsNCj4NCj4g KwkJCXJldHVybiBlcnJ2YWw7DQo+DQo+ICsJCX0NCj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwkv KiBTZXR1cCBUeCBRdWV1ZXMgKi8NCj4NCj4gKwlmb3IgKHFfaWQgPSAwOyBxX2lkIDwgYm9uZGVk X2V0aF9kZXYtPmRhdGEtPm5iX3R4X3F1ZXVlczsgcV9pZCsrKSB7DQo+DQo+ICsJCWJkX3R4X3Eg PSAoc3RydWN0IGJvbmRfdHhfcXVldWUgKilib25kZWRfZXRoX2Rldi0+ZGF0YS0+dHhfcXVldWVz W3FfaWRdOw0KPg0KPiArDQo+DQo+ICsJCWVycnZhbCA9IHJ0ZV9ldGhfdHhfcXVldWVfc2V0dXAo c2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCwgcV9pZCwNCj4NCj4gKwkJCQliZF90eF9xLT5u Yl90eF9kZXNjLA0KPg0KPiArCQkJCXJ0ZV9ldGhfZGV2X3NvY2tldF9pZChzbGF2ZV9ldGhfZGV2 LT5kYXRhLT5wb3J0X2lkKSwNCj4NCj4gKwkJCQkmYmRfdHhfcS0+dHhfY29uZik7DQo+DQo+ICsJ CWlmIChlcnJ2YWwgIT0gMCkgew0KPg0KPiArCQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4NCj4gKwkJ CQkicnRlX2V0aF90eF9xdWV1ZV9zZXR1cDogcG9ydD0lZCBxdWV1ZV9pZCAlZCwgZXJyICglZCki LA0KPg0KPiArCQkJCXNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQsIHFfaWQsIGVycnZhbCk7 DQo+DQo+ICsJCQlyZXR1cm4gZXJydmFsOw0KPg0KPiArCQl9DQo+DQo+ICsJfQ0KPg0KPiArDQo+ DQo+ICsJaWYgKGludGVybmFscy0+bW9kZSA9PSBCT05ESU5HX01PREVfODAyM0FEICYmDQo+DQo+ ICsJCQlpbnRlcm5hbHMtPm1vZGU0LmRlZGljYXRlZF9xdWV1ZXMuZW5hYmxlZCA9PSAxKSB7DQo+ DQo+ICsJCWlmIChzbGF2ZV9jb25maWd1cmVfc2xvd19xdWV1ZShib25kZWRfZXRoX2Rldiwgc2xh dmVfZXRoX2RldikNCj4NCj4gKwkJCQkhPSAwKQ0KPg0KPiArCQkJcmV0dXJuIGVycnZhbDsNCj4N Cj4gKw0KPg0KPiArCQllcnJ2YWwgPSBib25kX2V0aGRldl84MDIzYWRfZmxvd192ZXJpZnkoYm9u ZGVkX2V0aF9kZXYsDQo+DQo+ICsJCQkJc2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCk7DQo+ DQo+ICsJCWlmIChlcnJ2YWwgIT0gMCkgew0KPg0KPiArCQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4N Cj4gKwkJCQkiYm9uZF9ldGhkZXZfODAyM2FkX2Zsb3dfdmVyaWZ5OiBwb3J0PSVkLCBlcnIgKCVk KSIsDQo+DQo+ICsJCQkJc2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCwgZXJydmFsKTsNCj4N Cj4gKwkJCXJldHVybiBlcnJ2YWw7DQo+DQo+ICsJCX0NCj4NCj4gKw0KPg0KPiArCQlpZiAoaW50 ZXJuYWxzLT5tb2RlNC5kZWRpY2F0ZWRfcXVldWVzLmZsb3dbc2xhdmVfZXRoX2Rldi0+ZGF0YS0+ cG9ydF9pZF0gIT0gTlVMTCkgew0KPg0KPiArCQkJZXJydmFsID0gcnRlX2Zsb3dfZGVzdHJveShz bGF2ZV9ldGhfZGV2LT5kYXRhLT5wb3J0X2lkLA0KPg0KPiArCQkJCQlpbnRlcm5hbHMtPm1vZGU0 LmRlZGljYXRlZF9xdWV1ZXMuZmxvd1tzbGF2ZV9ldGhfZGV2LT5kYXRhLT5wb3J0X2lkXSwNCj4N Cj4gKwkJCQkJJmZsb3dfZXJyb3IpOw0KPg0KPiArCQkJUlRFX0JPTkRfTE9HKEVSUiwgImJvbmRf ZXRoZGV2XzgwMjNhZF9mbG93X2Rlc3Ryb3k6IHBvcnQ9JWQsIGVyciAoJWQpIiwNCj4NCj4gKwkJ CQlzbGF2ZV9ldGhfZGV2LT5kYXRhLT5wb3J0X2lkLCBlcnJ2YWwpOw0KPg0KPiArCQl9DQo+DQo+ ICsNCj4NCj4gKwkJZXJydmFsID0gYm9uZF9ldGhkZXZfODAyM2FkX2Zsb3dfc2V0KGJvbmRlZF9l dGhfZGV2LA0KPg0KPiArCQkJCXNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQpOw0KPg0KPiAr CQlpZiAoZXJydmFsICE9IDApIHsNCj4NCj4gKwkJCVJURV9CT05EX0xPRyhFUlIsDQo+DQo+ICsJ CQkJImJvbmRfZXRoZGV2XzgwMjNhZF9mbG93X3NldDogcG9ydD0lZCwgZXJyICglZCkiLA0KPg0K PiArCQkJCXNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQsIGVycnZhbCk7DQo+DQo+ICsJCQly ZXR1cm4gZXJydmFsOw0KPg0KPiArCQl9DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJLyogU3Rh cnQgZGV2aWNlICovDQo+DQo+ICsJZXJydmFsID0gcnRlX2V0aF9kZXZfc3RhcnQoc2xhdmVfZXRo X2Rldi0+ZGF0YS0+cG9ydF9pZCk7DQo+DQo+ICsJaWYgKGVycnZhbCAhPSAwKSB7DQo+DQo+ICsJ CVJURV9CT05EX0xPRyhFUlIsICJydGVfZXRoX2Rldl9zdGFydDogcG9ydD0ldSwgZXJyICglZCki LA0KPg0KPiArCQkJCXNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQsIGVycnZhbCk7DQo+DQo+ ICsJCXJldHVybiAtMTsNCj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwkvKiBJZiBSU1MgaXMgZW5h YmxlZCBmb3IgYm9uZGluZywgc3luY2hyb25pemUgUkVUQSAqLw0KPg0KPiArCWlmIChib25kZWRf ZXRoX2Rldi0+ZGF0YS0+ZGV2X2NvbmYucnhtb2RlLm1xX21vZGUgJiBSVEVfRVRIX01RX1JYX1JT Uykgew0KPg0KPiArCQlpbnQgaTsNCj4NCj4gKwkJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmlu dGVybmFsczsNCj4NCj4gKw0KPg0KPiArCQlpbnRlcm5hbHMgPSBib25kZWRfZXRoX2Rldi0+ZGF0 YS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsNCj4NCj4gKwkJZm9yIChpID0gMDsgaSA8IGludGVybmFs cy0+c2xhdmVfY291bnQ7IGkrKykgew0KPg0KPiArCQkJaWYgKGludGVybmFscy0+c2xhdmVzW2ld LnBvcnRfaWQgPT0gc2xhdmVfZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCkgew0KPg0KPiArCQkJCWVy cnZhbCA9IHJ0ZV9ldGhfZGV2X3Jzc19yZXRhX3VwZGF0ZSgNCj4NCj4gKwkJCQkJCXNsYXZlX2V0 aF9kZXYtPmRhdGEtPnBvcnRfaWQsDQo+DQo+ICsJCQkJCQkmaW50ZXJuYWxzLT5yZXRhX2NvbmZb MF0sDQo+DQo+ICsJCQkJCQlpbnRlcm5hbHMtPnNsYXZlc1tpXS5yZXRhX3NpemUpOw0KPg0KPiAr CQkJCWlmIChlcnJ2YWwgIT0gMCkgew0KPg0KPiArCQkJCQlSVEVfQk9ORF9MT0coV0FSTklORywN Cj4NCj4gKwkJCQkJCSAgICAgInJ0ZV9ldGhfZGV2X3Jzc19yZXRhX3VwZGF0ZSBvbiBzbGF2ZSBw b3J0ICVkIGZhaWxzIChlcnIgJWQpLiINCj4NCj4gKwkJCQkJCSAgICAgIiBSU1MgQ29uZmlndXJh dGlvbiBmb3IgYm9uZGluZyBtYXkgYmUgaW5jb25zaXN0ZW50LiIsDQo+DQo+ICsJCQkJCQkgICAg IHNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQsIGVycnZhbCk7DQo+DQo+ICsJCQkJfQ0KPg0K PiArCQkJCWJyZWFrOw0KPg0KPiArCQkJfQ0KPg0KPiArCQl9DQo+DQo+ICsJfQ0KPg0KPiArDQo+ DQo+ICsJLyogSWYgbHNjIGludGVycnVwdCBpcyBzZXQsIGNoZWNrIGluaXRpYWwgc2xhdmUncyBs aW5rIHN0YXR1cyAqLw0KPg0KPiArCWlmIChzbGF2ZV9ldGhfZGV2LT5kYXRhLT5kZXZfZmxhZ3Mg JiBSVEVfRVRIX0RFVl9JTlRSX0xTQykgew0KPg0KPiArCQlzbGF2ZV9ldGhfZGV2LT5kZXZfb3Bz LT5saW5rX3VwZGF0ZShzbGF2ZV9ldGhfZGV2LCAwKTsNCj4NCj4gKwkJYm9uZF9ldGhkZXZfbHNj X2V2ZW50X2NhbGxiYWNrKHNsYXZlX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQsDQo+DQo+ICsJCQlS VEVfRVRIX0VWRU5UX0lOVFJfTFNDLCAmYm9uZGVkX2V0aF9kZXYtPmRhdGEtPnBvcnRfaWQsDQo+ DQo+ICsJCQlOVUxMKTsNCj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwlyZXR1cm4gMDsNCj4NCj4g K30NCj4NCj4gKw0KPg0KPiArdm9pZA0KPg0KPiArc2xhdmVfcmVtb3ZlKHN0cnVjdCBib25kX2Rl dl9wcml2YXRlICppbnRlcm5hbHMsDQo+DQo+ICsJCXN0cnVjdCBydGVfZXRoX2RldiAqc2xhdmVf ZXRoX2RldikNCj4NCj4gK3sNCj4NCj4gKwl1aW50MTZfdCBpOw0KPg0KPiArDQo+DQo+ICsJZm9y IChpID0gMDsgaSA8IGludGVybmFscy0+c2xhdmVfY291bnQ7IGkrKykNCj4NCj4gKwkJaWYgKGlu dGVybmFscy0+c2xhdmVzW2ldLnBvcnRfaWQgPT0NCj4NCj4gKwkJCQlzbGF2ZV9ldGhfZGV2LT5k YXRhLT5wb3J0X2lkKQ0KPg0KPiArCQkJYnJlYWs7DQo+DQo+ICsNCj4NCj4gKwlpZiAoaSA8IChp bnRlcm5hbHMtPnNsYXZlX2NvdW50IC0gMSkpIHsNCj4NCj4gKwkJc3RydWN0IHJ0ZV9mbG93ICpm bG93Ow0KPg0KPiArDQo+DQo+ICsJCW1lbW1vdmUoJmludGVybmFscy0+c2xhdmVzW2ldLCAmaW50 ZXJuYWxzLT5zbGF2ZXNbaSArIDFdLA0KPg0KPiArCQkJCXNpemVvZihpbnRlcm5hbHMtPnNsYXZl c1swXSkgKg0KPg0KPiArCQkJCShpbnRlcm5hbHMtPnNsYXZlX2NvdW50IC0gaSAtIDEpKTsNCj4N Cj4gKwkJVEFJTFFfRk9SRUFDSChmbG93LCAmaW50ZXJuYWxzLT5mbG93X2xpc3QsIG5leHQpIHsN Cj4NCj4gKwkJCW1lbW1vdmUoJmZsb3ctPmZsb3dzW2ldLCAmZmxvdy0+Zmxvd3NbaSArIDFdLA0K Pg0KPiArCQkJCXNpemVvZihmbG93LT5mbG93c1swXSkgKg0KPg0KPiArCQkJCShpbnRlcm5hbHMt PnNsYXZlX2NvdW50IC0gaSAtIDEpKTsNCj4NCj4gKwkJCWZsb3ctPmZsb3dzW2ludGVybmFscy0+ c2xhdmVfY291bnQgLSAxXSA9IE5VTEw7DQo+DQo+ICsJCX0NCj4NCj4gKwl9DQo+DQo+ICsNCj4N Cj4gKwlpbnRlcm5hbHMtPnNsYXZlX2NvdW50LS07DQo+DQo+ICsNCj4NCj4gKwkvKiBmb3JjZSBy ZWNvbmZpZ3VyYXRpb24gb2Ygc2xhdmUgaW50ZXJmYWNlcyAqLw0KPg0KPiArCXJ0ZV9ldGhfZGV2 X2ludGVybmFsX3Jlc2V0KHNsYXZlX2V0aF9kZXYpOw0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICtz dGF0aWMgdm9pZA0KPg0KPiArYm9uZF9ldGhkZXZfc2xhdmVfbGlua19zdGF0dXNfY2hhbmdlX21v bml0b3Iodm9pZCAqY2JfYXJnKTsNCj4NCj4gKw0KPg0KPiArdm9pZA0KPg0KPiArc2xhdmVfYWRk KHN0cnVjdCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHMsDQo+DQo+ICsJCXN0cnVjdCBydGVf ZXRoX2RldiAqc2xhdmVfZXRoX2RldikNCj4NCj4gK3sNCj4NCj4gKwlzdHJ1Y3QgYm9uZF9zbGF2 ZV9kZXRhaWxzICpzbGF2ZV9kZXRhaWxzID0NCj4NCj4gKwkJCSZpbnRlcm5hbHMtPnNsYXZlc1tp bnRlcm5hbHMtPnNsYXZlX2NvdW50XTsNCj4NCj4gKw0KPg0KPiArCXNsYXZlX2RldGFpbHMtPnBv cnRfaWQgPSBzbGF2ZV9ldGhfZGV2LT5kYXRhLT5wb3J0X2lkOw0KPg0KPiArCXNsYXZlX2RldGFp bHMtPmxhc3RfbGlua19zdGF0dXMgPSAwOw0KPg0KPiArDQo+DQo+ICsJLyogTWFyayBzbGF2ZSBk ZXZpY2VzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpbnRlcnJ1cHRzIHNvIHdlIGNhbg0KPg0KPiArCSAq IGNvbXBlbnNhdGUgd2hlbiB3ZSBzdGFydCB0aGUgYm9uZA0KPg0KPiArCSAqLw0KPg0KPiArCWlm ICghKHNsYXZlX2V0aF9kZXYtPmRhdGEtPmRldl9mbGFncyAmIFJURV9FVEhfREVWX0lOVFJfTFND KSkgew0KPg0KPiArCQlzbGF2ZV9kZXRhaWxzLT5saW5rX3N0YXR1c19wb2xsX2VuYWJsZWQgPSAx Ow0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCXNsYXZlX2RldGFpbHMtPmxpbmtfc3RhdHVzX3dh aXRfdG9fY29tcGxldGUgPSAwOw0KPg0KPiArCS8qIGNsZWFuIHRsYl9sYXN0X29ieXRlcyB3aGVu IGFkZGluZyBwb3J0IGZvciBib25kaW5nIGRldmljZSAqLw0KPg0KPiArCW1lbWNweSgmKHNsYXZl X2RldGFpbHMtPnBlcnNpc3RlZF9tYWNfYWRkciksIHNsYXZlX2V0aF9kZXYtPmRhdGEtPm1hY19h ZGRycywNCj4NCj4gKwkJCXNpemVvZihzdHJ1Y3QgcnRlX2V0aGVyX2FkZHIpKTsNCj4NCj4gK30N Cj4NCj4gKw0KPg0KPiArdm9pZA0KPg0KPiArYm9uZF9ldGhkZXZfcHJpbWFyeV9zZXQoc3RydWN0 IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFscywNCj4NCj4gKwkJdWludDE2X3Qgc2xhdmVfcG9y dF9pZCkNCj4NCj4gK3sNCj4NCj4gKwlpbnQgaTsNCj4NCj4gKw0KPg0KPiArCWlmIChpbnRlcm5h bHMtPmFjdGl2ZV9zbGF2ZV9jb3VudCA8IDEpDQo+DQo+ICsJCWludGVybmFscy0+Y3VycmVudF9w cmltYXJ5X3BvcnQgPSBzbGF2ZV9wb3J0X2lkOw0KPg0KPiArCWVsc2UNCj4NCj4gKwkJLyogU2Vh cmNoIGJvbmRlZCBkZXZpY2Ugc2xhdmUgcG9ydHMgZm9yIG5ldyBwcm9wb3NlZCBwcmltYXJ5IHBv cnQgKi8NCj4NCj4gKwkJZm9yIChpID0gMDsgaSA8IGludGVybmFscy0+YWN0aXZlX3NsYXZlX2Nv dW50OyBpKyspIHsNCj4NCj4gKwkJCWlmIChpbnRlcm5hbHMtPmFjdGl2ZV9zbGF2ZXNbaV0gPT0g c2xhdmVfcG9ydF9pZCkNCj4NCj4gKwkJCQlpbnRlcm5hbHMtPmN1cnJlbnRfcHJpbWFyeV9wb3J0 ID0gc2xhdmVfcG9ydF9pZDsNCj4NCj4gKwkJfQ0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICtzdGF0 aWMgaW50DQo+DQo+ICtib25kX2V0aGRldl9wcm9taXNjdW91c19lbmFibGUoc3RydWN0IHJ0ZV9l dGhfZGV2ICpldGhfZGV2KTsNCj4NCj4gKw0KPg0KPiArc3RhdGljIGludA0KPg0KPiArYm9uZF9l dGhkZXZfc3RhcnQoc3RydWN0IHJ0ZV9ldGhfZGV2ICpldGhfZGV2KQ0KPg0KPiArew0KPg0KPiAr CXN0cnVjdCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHM7DQo+DQo+ICsJaW50IGk7DQo+DQo+ ICsNCj4NCj4gKwkvKiBzbGF2ZSBldGggZGV2IHdpbGwgYmUgc3RhcnRlZCBieSBib25kZWQgZGV2 aWNlICovDQo+DQo+ICsJaWYgKGNoZWNrX2Zvcl9ib25kZWRfZXRoZGV2KGV0aF9kZXYpKSB7DQo+ DQo+ICsJCVJURV9CT05EX0xPRyhFUlIsICJVc2VyIHRyaWVkIHRvIGV4cGxpY2l0bHkgc3RhcnQg YSBzbGF2ZSBldGhfZGV2ICglZCkiLA0KPg0KPiArCQkJCWV0aF9kZXYtPmRhdGEtPnBvcnRfaWQp Ow0KPg0KPiArCQlyZXR1cm4gLTE7DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJZXRoX2Rldi0+ ZGF0YS0+ZGV2X2xpbmsubGlua19zdGF0dXMgPSBSVEVfRVRIX0xJTktfRE9XTjsNCj4NCj4gKwll dGhfZGV2LT5kYXRhLT5kZXZfc3RhcnRlZCA9IDE7DQo+DQo+ICsNCj4NCj4gKwlpbnRlcm5hbHMg PSBldGhfZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4NCj4gKw0KPg0KPiArCWlmIChpbnRlcm5h bHMtPnNsYXZlX2NvdW50ID09IDApIHsNCj4NCj4gKwkJUlRFX0JPTkRfTE9HKEVSUiwgIkNhbm5v dCBzdGFydCBwb3J0IHNpbmNlIHRoZXJlIGFyZSBubyBzbGF2ZSBkZXZpY2VzIik7DQo+DQo+ICsJ CWdvdG8gb3V0X2VycjsNCj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwlpZiAoaW50ZXJuYWxzLT51 c2VyX2RlZmluZWRfbWFjID09IDApIHsNCj4NCj4gKwkJc3RydWN0IHJ0ZV9ldGhlcl9hZGRyICpu ZXdfbWFjX2FkZHIgPSBOVUxMOw0KPg0KPiArDQo+DQo+ICsJCWZvciAoaSA9IDA7IGkgPCBpbnRl cm5hbHMtPnNsYXZlX2NvdW50OyBpKyspDQo+DQo+ICsJCQlpZiAoaW50ZXJuYWxzLT5zbGF2ZXNb aV0ucG9ydF9pZCA9PSBpbnRlcm5hbHMtPnByaW1hcnlfcG9ydCkNCj4NCj4gKwkJCQluZXdfbWFj X2FkZHIgPSAmaW50ZXJuYWxzLT5zbGF2ZXNbaV0ucGVyc2lzdGVkX21hY19hZGRyOw0KPg0KPiAr DQo+DQo+ICsJCWlmIChuZXdfbWFjX2FkZHIgPT0gTlVMTCkNCj4NCj4gKwkJCWdvdG8gb3V0X2Vy cjsNCj4NCj4gKw0KPg0KPiArCQlpZiAobWFjX2FkZHJlc3Nfc2V0KGV0aF9kZXYsIG5ld19tYWNf YWRkcikgIT0gMCkgew0KPg0KPiArCQkJUlRFX0JPTkRfTE9HKEVSUiwgImJvbmRlZCBwb3J0ICgl ZCkgZmFpbGVkIHRvIHVwZGF0ZSBNQUMgYWRkcmVzcyIsDQo+DQo+ICsJCQkJCWV0aF9kZXYtPmRh dGEtPnBvcnRfaWQpOw0KPg0KPiArCQkJZ290byBvdXRfZXJyOw0KPg0KPiArCQl9DQo+DQo+ICsJ fQ0KPg0KPiArDQo+DQo+ICsJaWYgKGludGVybmFscy0+bW9kZSA9PSBCT05ESU5HX01PREVfODAy M0FEKSB7DQo+DQo+ICsJCWlmIChpbnRlcm5hbHMtPm1vZGU0LmRlZGljYXRlZF9xdWV1ZXMuZW5h YmxlZCA9PSAxKSB7DQo+DQo+ICsJCQlpbnRlcm5hbHMtPm1vZGU0LmRlZGljYXRlZF9xdWV1ZXMu cnhfcWlkID0NCj4NCj4gKwkJCQkJZXRoX2Rldi0+ZGF0YS0+bmJfcnhfcXVldWVzOw0KPg0KPiAr CQkJaW50ZXJuYWxzLT5tb2RlNC5kZWRpY2F0ZWRfcXVldWVzLnR4X3FpZCA9DQo+DQo+ICsJCQkJ CWV0aF9kZXYtPmRhdGEtPm5iX3R4X3F1ZXVlczsNCj4NCj4gKwkJfQ0KPg0KPiArCX0NCj4NCj4g Kw0KPg0KPiArDQo+DQo+ICsJLyogUmVjb25maWd1cmUgZWFjaCBzbGF2ZSBkZXZpY2UgaWYgc3Rh cnRpbmcgYm9uZGVkIGRldmljZSAqLw0KPg0KPiArCWZvciAoaSA9IDA7IGkgPCBpbnRlcm5hbHMt PnNsYXZlX2NvdW50OyBpKyspIHsNCj4NCj4gKwkJc3RydWN0IHJ0ZV9ldGhfZGV2ICpzbGF2ZV9l dGhkZXYgPQ0KPg0KPiArCQkJCSYocnRlX2V0aF9kZXZpY2VzW2ludGVybmFscy0+c2xhdmVzW2ld LnBvcnRfaWRdKTsNCj4NCj4gKwkJaWYgKHNsYXZlX2NvbmZpZ3VyZShldGhfZGV2LCBzbGF2ZV9l dGhkZXYpICE9IDApIHsNCj4NCj4gKwkJCVJURV9CT05EX0xPRyhFUlIsDQo+DQo+ICsJCQkJImJv bmRlZCBwb3J0ICglZCkgZmFpbGVkIHRvIHJlY29uZmlndXJlIHNsYXZlIGRldmljZSAoJWQpIiwN Cj4NCj4gKwkJCQlldGhfZGV2LT5kYXRhLT5wb3J0X2lkLA0KPg0KPiArCQkJCWludGVybmFscy0+ c2xhdmVzW2ldLnBvcnRfaWQpOw0KPg0KPiArCQkJZ290byBvdXRfZXJyOw0KPg0KPiArCQl9DQo+ DQo+ICsJCWlmIChzbGF2ZV9zdGFydChldGhfZGV2LCBzbGF2ZV9ldGhkZXYpICE9IDApIHsNCj4N Cj4gKwkJCVJURV9CT05EX0xPRyhFUlIsDQo+DQo+ICsJCQkJImJvbmRlZCBwb3J0ICglZCkgZmFp bGVkIHRvIHN0YXJ0IHNsYXZlIGRldmljZSAoJWQpIiwNCj4NCj4gKwkJCQlldGhfZGV2LT5kYXRh LT5wb3J0X2lkLA0KPg0KPiArCQkJCWludGVybmFscy0+c2xhdmVzW2ldLnBvcnRfaWQpOw0KPg0K PiArCQkJZ290byBvdXRfZXJyOw0KPg0KPiArCQl9DQo+DQo+ICsJCS8qIFdlIHdpbGwgbmVlZCB0 byBwb2xsIGZvciBsaW5rIHN0YXR1cyBpZiBhbnkgc2xhdmUgZG9lc24ndA0KPg0KPiArCQkgKiBz dXBwb3J0IGludGVycnVwdHMNCj4NCj4gKwkJICovDQo+DQo+ICsJCWlmIChpbnRlcm5hbHMtPnNs YXZlc1tpXS5saW5rX3N0YXR1c19wb2xsX2VuYWJsZWQpDQo+DQo+ICsJCQlpbnRlcm5hbHMtPmxp bmtfc3RhdHVzX3BvbGxpbmdfZW5hYmxlZCA9IDE7DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJ Lyogc3RhcnQgcG9sbGluZyBpZiBuZWVkZWQgKi8NCj4NCj4gKwlpZiAoaW50ZXJuYWxzLT5saW5r X3N0YXR1c19wb2xsaW5nX2VuYWJsZWQpIHsNCj4NCj4gKwkJcnRlX2VhbF9hbGFybV9zZXQoDQo+ DQo+ICsJCQlpbnRlcm5hbHMtPmxpbmtfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMgKiAxMDAw LA0KPg0KPiArCQkJYm9uZF9ldGhkZXZfc2xhdmVfbGlua19zdGF0dXNfY2hhbmdlX21vbml0b3Is DQo+DQo+ICsJCQkodm9pZCAqKSZydGVfZXRoX2RldmljZXNbaW50ZXJuYWxzLT5wb3J0X2lkXSk7 DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJLyogVXBkYXRlIGFsbCBzbGF2ZSBkZXZpY2VzIE1B Q3MqLw0KPg0KPiArCWlmIChtYWNfYWRkcmVzc19zbGF2ZXNfdXBkYXRlKGV0aF9kZXYpICE9IDAp DQo+DQo+ICsJCWdvdG8gb3V0X2VycjsNCj4NCj4gKw0KPg0KPiArCWlmIChpbnRlcm5hbHMtPnVz ZXJfZGVmaW5lZF9wcmltYXJ5X3BvcnQpDQo+DQo+ICsJCWJvbmRfZXRoZGV2X3ByaW1hcnlfc2V0 KGludGVybmFscywgaW50ZXJuYWxzLT5wcmltYXJ5X3BvcnQpOw0KPg0KPiArDQo+DQo+ICsJaWYg KGludGVybmFscy0+bW9kZSA9PSBCT05ESU5HX01PREVfODAyM0FEKQ0KPg0KPiArCQlib25kX21v ZGVfODAyM2FkX3N0YXJ0KGV0aF9kZXYpOw0KPg0KPiArDQo+DQo+ICsJaWYgKGludGVybmFscy0+ bW9kZSA9PSBCT05ESU5HX01PREVfVExCIHx8DQo+DQo+ICsJCQlpbnRlcm5hbHMtPm1vZGUgPT0g Qk9ORElOR19NT0RFX0FMQikNCj4NCj4gKwkJYm9uZF90bGJfZW5hYmxlKGludGVybmFscyk7DQo+ DQo+ICsNCj4NCj4gKwlyZXR1cm4gMDsNCj4NCj4gKw0KPg0KPiArb3V0X2VycjoNCj4NCj4gKwll dGhfZGV2LT5kYXRhLT5kZXZfc3RhcnRlZCA9IDA7DQo+DQo+ICsJcmV0dXJuIC0xOw0KPg0KPiAr fQ0KPg0KPiArDQo+DQo+ICtzdGF0aWMgdm9pZA0KPg0KPiArYm9uZF9ldGhkZXZfZnJlZV9xdWV1 ZXMoc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYpDQo+DQo+ICt7DQo+DQo+ICsJdWludDE2X3QgaTsN Cj4NCj4gKw0KPg0KPiArCWlmIChkZXYtPmRhdGEtPnJ4X3F1ZXVlcyAhPSBOVUxMKSB7DQo+DQo+ ICsJCWZvciAoaSA9IDA7IGkgPCBkZXYtPmRhdGEtPm5iX3J4X3F1ZXVlczsgaSsrKSB7DQo+DQo+ ICsJCQlydGVfZnJlZShkZXYtPmRhdGEtPnJ4X3F1ZXVlc1tpXSk7DQo+DQo+ICsJCQlkZXYtPmRh dGEtPnJ4X3F1ZXVlc1tpXSA9IE5VTEw7DQo+DQo+ICsJCX0NCj4NCj4gKwkJZGV2LT5kYXRhLT5u Yl9yeF9xdWV1ZXMgPSAwOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCWlmIChkZXYtPmRhdGEt PnR4X3F1ZXVlcyAhPSBOVUxMKSB7DQo+DQo+ICsJCWZvciAoaSA9IDA7IGkgPCBkZXYtPmRhdGEt Pm5iX3R4X3F1ZXVlczsgaSsrKSB7DQo+DQo+ICsJCQlydGVfZnJlZShkZXYtPmRhdGEtPnR4X3F1 ZXVlc1tpXSk7DQo+DQo+ICsJCQlkZXYtPmRhdGEtPnR4X3F1ZXVlc1tpXSA9IE5VTEw7DQo+DQo+ ICsJCX0NCj4NCj4gKwkJZGV2LT5kYXRhLT5uYl90eF9xdWV1ZXMgPSAwOw0KPg0KPiArCX0NCj4N Cj4gK30NCj4NCj4gKw0KPg0KPiAraW50DQo+DQo+ICtib25kX2V0aGRldl9zdG9wKHN0cnVjdCBy dGVfZXRoX2RldiAqZXRoX2RldikNCj4NCj4gK3sNCj4NCj4gKwlzdHJ1Y3QgYm9uZF9kZXZfcHJp dmF0ZSAqaW50ZXJuYWxzID0gZXRoX2Rldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsJdWlu dDE2X3QgaTsNCj4NCj4gKwlpbnQgcmV0Ow0KPg0KPiArDQo+DQo+ICsJaWYgKGludGVybmFscy0+ bW9kZSA9PSBCT05ESU5HX01PREVfODAyM0FEKSB7DQo+DQo+ICsJCXN0cnVjdCBwb3J0ICpwb3J0 Ow0KPg0KPiArCQl2b2lkICpwa3QgPSBOVUxMOw0KPg0KPiArDQo+DQo+ICsJCWJvbmRfbW9kZV84 MDIzYWRfc3RvcChldGhfZGV2KTsNCj4NCj4gKw0KPg0KPiArCQkvKiBEaXNjYXJkIGFsbCBtZXNz YWdlcyB0by9mcm9tIG1vZGUgNCBzdGF0ZSBtYWNoaW5lcyAqLw0KPg0KPiArCQlmb3IgKGkgPSAw OyBpIDwgaW50ZXJuYWxzLT5hY3RpdmVfc2xhdmVfY291bnQ7IGkrKykgew0KPg0KPiArCQkJcG9y dCA9ICZib25kX21vZGVfODAyM2FkX3BvcnRzW2ludGVybmFscy0+YWN0aXZlX3NsYXZlc1tpXV07 DQo+DQo+ICsNCj4NCj4gKwkJCVJURV9BU1NFUlQocG9ydC0+cnhfcmluZyAhPSBOVUxMKTsNCj4N Cj4gKwkJCXdoaWxlIChydGVfcmluZ19kZXF1ZXVlKHBvcnQtPnJ4X3JpbmcsICZwa3QpICE9IC1F Tk9FTlQpDQo+DQo+ICsJCQkJcnRlX3BrdG1idWZfZnJlZShwa3QpOw0KPg0KPiArDQo+DQo+ICsJ CQlSVEVfQVNTRVJUKHBvcnQtPnR4X3JpbmcgIT0gTlVMTCk7DQo+DQo+ICsJCQl3aGlsZSAocnRl X3JpbmdfZGVxdWV1ZShwb3J0LT50eF9yaW5nLCAmcGt0KSAhPSAtRU5PRU5UKQ0KPg0KPiArCQkJ CXJ0ZV9wa3RtYnVmX2ZyZWUocGt0KTsNCj4NCj4gKwkJfQ0KPg0KPiArCX0NCj4NCj4gKw0KPg0K PiArCWlmIChpbnRlcm5hbHMtPm1vZGUgPT0gQk9ORElOR19NT0RFX1RMQiB8fA0KPg0KPiArCQkJ aW50ZXJuYWxzLT5tb2RlID09IEJPTkRJTkdfTU9ERV9BTEIpIHsNCj4NCj4gKwkJYm9uZF90bGJf ZGlzYWJsZShpbnRlcm5hbHMpOw0KPg0KPiArCQlmb3IgKGkgPSAwOyBpIDwgaW50ZXJuYWxzLT5h Y3RpdmVfc2xhdmVfY291bnQ7IGkrKykNCj4NCj4gKwkJCXRsYl9sYXN0X29ieXRldHNbaW50ZXJu YWxzLT5hY3RpdmVfc2xhdmVzW2ldXSA9IDA7DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJZXRo X2Rldi0+ZGF0YS0+ZGV2X2xpbmsubGlua19zdGF0dXMgPSBSVEVfRVRIX0xJTktfRE9XTjsNCj4N Cj4gKwlldGhfZGV2LT5kYXRhLT5kZXZfc3RhcnRlZCA9IDA7DQo+DQo+ICsNCj4NCj4gKwlpbnRl cm5hbHMtPmxpbmtfc3RhdHVzX3BvbGxpbmdfZW5hYmxlZCA9IDA7DQo+DQo+ICsJZm9yIChpID0g MDsgaSA8IGludGVybmFscy0+c2xhdmVfY291bnQ7IGkrKykgew0KPg0KPiArCQl1aW50MTZfdCBz bGF2ZV9pZCA9IGludGVybmFscy0+c2xhdmVzW2ldLnBvcnRfaWQ7DQo+DQo+ICsNCj4NCj4gKwkJ aW50ZXJuYWxzLT5zbGF2ZXNbaV0ubGFzdF9saW5rX3N0YXR1cyA9IDA7DQo+DQo+ICsJCXJldCA9 IHJ0ZV9ldGhfZGV2X3N0b3Aoc2xhdmVfaWQpOw0KPg0KPiArCQlpZiAocmV0ICE9IDApIHsNCj4N Cj4gKwkJCVJURV9CT05EX0xPRyhFUlIsICJGYWlsZWQgdG8gc3RvcCBkZXZpY2Ugb24gcG9ydCAl dSIsDQo+DQo+ICsJCQkJICAgICBzbGF2ZV9pZCk7DQo+DQo+ICsJCQlyZXR1cm4gcmV0Ow0KPg0K PiArCQl9DQo+DQo+ICsNCj4NCj4gKwkJLyogYWN0aXZlIHNsYXZlcyBuZWVkIHRvIGJlIGRlYWN0 aXZhdGVkLiAqLw0KPg0KPiArCQlpZiAoZmluZF9zbGF2ZV9ieV9pZChpbnRlcm5hbHMtPmFjdGl2 ZV9zbGF2ZXMsDQo+DQo+ICsJCQkJaW50ZXJuYWxzLT5hY3RpdmVfc2xhdmVfY291bnQsIHNsYXZl X2lkKSAhPQ0KPg0KPiArCQkJCQlpbnRlcm5hbHMtPmFjdGl2ZV9zbGF2ZV9jb3VudCkNCj4NCj4g KwkJCWRlYWN0aXZhdGVfc2xhdmUoZXRoX2Rldiwgc2xhdmVfaWQpOw0KPg0KPiArCX0NCj4NCj4g Kw0KPg0KPiArCXJldHVybiAwOw0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICtpbnQNCj4NCj4gK2Jv bmRfZXRoZGV2X2Nsb3NlKHN0cnVjdCBydGVfZXRoX2RldiAqZGV2KQ0KPg0KPiArew0KPg0KPiAr CXN0cnVjdCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHMgPSBkZXYtPmRhdGEtPmRldl9wcml2 YXRlOw0KPg0KPiArCXVpbnQxNl90IGJvbmRfcG9ydF9pZCA9IGludGVybmFscy0+cG9ydF9pZDsN Cj4NCj4gKwlpbnQgc2tpcHBlZCA9IDA7DQo+DQo+ICsJc3RydWN0IHJ0ZV9mbG93X2Vycm9yIGZl cnJvcjsNCj4NCj4gKw0KPg0KPiArCWlmIChydGVfZWFsX3Byb2Nlc3NfdHlwZSgpICE9IFJURV9Q Uk9DX1BSSU1BUlkpDQo+DQo+ICsJCXJldHVybiAwOw0KPg0KPiArDQo+DQo+ICsJUlRFX0JPTkRf TE9HKElORk8sICJDbG9zaW5nIGJvbmRlZCBkZXZpY2UgJXMiLCBkZXYtPmRldmljZS0+bmFtZSk7 DQo+DQo+ICsJd2hpbGUgKGludGVybmFscy0+c2xhdmVfY291bnQgIT0gc2tpcHBlZCkgew0KPg0K PiArCQl1aW50MTZfdCBwb3J0X2lkID0gaW50ZXJuYWxzLT5zbGF2ZXNbc2tpcHBlZF0ucG9ydF9p ZDsNCj4NCj4gKw0KPg0KPiArCQlpZiAocnRlX2V0aF9kZXZfc3RvcChwb3J0X2lkKSAhPSAwKSB7 DQo+DQo+ICsJCQlSVEVfQk9ORF9MT0coRVJSLCAiRmFpbGVkIHRvIHN0b3AgZGV2aWNlIG9uIHBv cnQgJXUiLA0KPg0KPiArCQkJCSAgICAgcG9ydF9pZCk7DQo+DQo+ICsJCQlza2lwcGVkKys7DQo+ DQo+ICsJCQljb250aW51ZTsNCj4NCj4gKwkJfQ0KPg0KPiArDQo+DQo+ICsJCWlmIChydGVfZXRo X2JvbmRfc2xhdmVfcmVtb3ZlKGJvbmRfcG9ydF9pZCwgcG9ydF9pZCkgIT0gMCkgew0KPg0KPiAr CQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4NCj4gKwkJCQkgICAgICJGYWlsZWQgdG8gcmVtb3ZlIHBv cnQgJWQgZnJvbSBib25kZWQgZGV2aWNlICVzIiwNCj4NCj4gKwkJCQkgICAgIHBvcnRfaWQsIGRl di0+ZGV2aWNlLT5uYW1lKTsNCj4NCj4gKwkJCXNraXBwZWQrKzsNCj4NCj4gKwkJfQ0KPg0KPiAr CX0NCj4NCj4gKwlib25kX2Zsb3dfb3BzLmZsdXNoKGRldiwgJmZlcnJvcik7DQo+DQo+ICsJYm9u ZF9ldGhkZXZfZnJlZV9xdWV1ZXMoZGV2KTsNCj4NCj4gKwlydGVfYml0bWFwX3Jlc2V0KGludGVy bmFscy0+dmxhbl9maWx0ZXJfYm1wKTsNCj4NCj4gKwlydGVfYml0bWFwX2ZyZWUoaW50ZXJuYWxz LT52bGFuX2ZpbHRlcl9ibXApOw0KPg0KPiArCXJ0ZV9mcmVlKGludGVybmFscy0+dmxhbl9maWx0 ZXJfYm1wbWVtKTsNCj4NCj4gKw0KPg0KPiArCS8qIFRyeSB0byByZWxlYXNlIG1lbXBvb2wgdXNl ZCBpbiBtb2RlNi4gSWYgdGhlIGJvbmQNCj4NCj4gKwkgKiBkZXZpY2UgaXMgbm90IG1vZGU2LCBm cmVlIHRoZSBOVUxMIGlzIG5vdCBwcm9ibGVtLg0KPg0KPiArCSAqLw0KPg0KPiArCXJ0ZV9tZW1w b29sX2ZyZWUoaW50ZXJuYWxzLT5tb2RlNi5tZW1wb29sKTsNCj4NCj4gKw0KPg0KPiArCXJ0ZV9r dmFyZ3NfZnJlZShpbnRlcm5hbHMtPmt2bGlzdCk7DQo+DQo+ICsNCj4NCj4gKwlyZXR1cm4gMDsN Cj4NCj4gK30NCj4NCj4gKw0KPg0KPiArLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLw0KPg0KPiAr c3RhdGljIGludCBib25kX2V0aGRldl9jb25maWd1cmUoc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYp Ow0KPg0KPiArDQo+DQo+ICtzdGF0aWMgaW50DQo+DQo+ICtib25kX2V0aGRldl9pbmZvKHN0cnVj dCBydGVfZXRoX2RldiAqZGV2LCBzdHJ1Y3QgcnRlX2V0aF9kZXZfaW5mbyAqZGV2X2luZm8pDQo+ DQo+ICt7DQo+DQo+ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFscyA9IGRldi0+ ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsJc3RydWN0IGJvbmRfc2xhdmVfZGV0YWlscyBzbGF2 ZTsNCj4NCj4gKwlpbnQgcmV0Ow0KPg0KPiArDQo+DQo+ICsJdWludDE2X3QgbWF4X25iX3J4X3F1 ZXVlcyA9IFVJTlQxNl9NQVg7DQo+DQo+ICsJdWludDE2X3QgbWF4X25iX3R4X3F1ZXVlcyA9IFVJ TlQxNl9NQVg7DQo+DQo+ICsJdWludDE2X3QgbWF4X3J4X2Rlc2NfbGltID0gVUlOVDE2X01BWDsN Cj4NCj4gKwl1aW50MTZfdCBtYXhfdHhfZGVzY19saW0gPSBVSU5UMTZfTUFYOw0KPg0KPiArDQo+ DQo+ICsJZGV2X2luZm8tPm1heF9tYWNfYWRkcnMgPSBCT05EX01BWF9NQUNfQUREUlM7DQo+DQo+ ICsNCj4NCj4gKwlkZXZfaW5mby0+bWF4X3J4X3BrdGxlbiA9IGludGVybmFscy0+Y2FuZGlkYXRl X21heF9yeF9wa3RsZW4gPw0KPg0KPiArCQkJaW50ZXJuYWxzLT5jYW5kaWRhdGVfbWF4X3J4X3Br dGxlbiA6DQo+DQo+ICsJCQlSVEVfRVRIRVJfTUFYX0pVTUJPX0ZSQU1FX0xFTjsNCj4NCj4gKw0K Pg0KPiArCS8qIE1heCBudW1iZXIgb2YgdHgvcnggcXVldWVzIHRoYXQgdGhlIGJvbmRlZCBkZXZp Y2UgY2FuIHN1cHBvcnQgaXMgdGhlDQo+DQo+ICsJICogbWluaW11bSB2YWx1ZXMgb2YgdGhlIGJv bmRlZCBzbGF2ZXMsIGFzIGFsbCBzbGF2ZXMgbXVzdCBiZSBjYXBhYmxlDQo+DQo+ICsJICogb2Yg c3VwcG9ydGluZyB0aGUgc2FtZSBudW1iZXIgb2YgdHgvcnggcXVldWVzLg0KPg0KPiArCSAqLw0K Pg0KPiArCWlmIChpbnRlcm5hbHMtPnNsYXZlX2NvdW50ID4gMCkgew0KPg0KPiArCQlzdHJ1Y3Qg cnRlX2V0aF9kZXZfaW5mbyBzbGF2ZV9pbmZvOw0KPg0KPiArCQl1aW50MTZfdCBpZHg7DQo+DQo+ ICsNCj4NCj4gKwkJZm9yIChpZHggPSAwOyBpZHggPCBpbnRlcm5hbHMtPnNsYXZlX2NvdW50OyBp ZHgrKykgew0KPg0KPiArCQkJc2xhdmUgPSBpbnRlcm5hbHMtPnNsYXZlc1tpZHhdOw0KPg0KPiAr CQkJcmV0ID0gcnRlX2V0aF9kZXZfaW5mb19nZXQoc2xhdmUucG9ydF9pZCwgJnNsYXZlX2luZm8p Ow0KPg0KPiArCQkJaWYgKHJldCAhPSAwKSB7DQo+DQo+ICsJCQkJUlRFX0JPTkRfTE9HKEVSUiwN Cj4NCj4gKwkJCQkJIiVzOiBFcnJvciBkdXJpbmcgZ2V0dGluZyBkZXZpY2UgKHBvcnQgJXUpIGlu Zm86ICVzXG4iLA0KPg0KPiArCQkJCQlfX2Z1bmNfXywNCj4NCj4gKwkJCQkJc2xhdmUucG9ydF9p ZCwNCj4NCj4gKwkJCQkJc3RyZXJyb3IoLXJldCkpOw0KPg0KPiArDQo+DQo+ICsJCQkJcmV0dXJu IHJldDsNCj4NCj4gKwkJCX0NCj4NCj4gKw0KPg0KPiArCQkJaWYgKHNsYXZlX2luZm8ubWF4X3J4 X3F1ZXVlcyA8IG1heF9uYl9yeF9xdWV1ZXMpDQo+DQo+ICsJCQkJbWF4X25iX3J4X3F1ZXVlcyA9 IHNsYXZlX2luZm8ubWF4X3J4X3F1ZXVlczsNCj4NCj4gKw0KPg0KPiArCQkJaWYgKHNsYXZlX2lu Zm8ubWF4X3R4X3F1ZXVlcyA8IG1heF9uYl90eF9xdWV1ZXMpDQo+DQo+ICsJCQkJbWF4X25iX3R4 X3F1ZXVlcyA9IHNsYXZlX2luZm8ubWF4X3R4X3F1ZXVlczsNCj4NCj4gKw0KPg0KPiArCQkJaWYg KHNsYXZlX2luZm8ucnhfZGVzY19saW0ubmJfbWF4IDwgbWF4X3J4X2Rlc2NfbGltKQ0KPg0KPiAr CQkJCW1heF9yeF9kZXNjX2xpbSA9IHNsYXZlX2luZm8ucnhfZGVzY19saW0ubmJfbWF4Ow0KPg0K PiArDQo+DQo+ICsJCQlpZiAoc2xhdmVfaW5mby50eF9kZXNjX2xpbS5uYl9tYXggPCBtYXhfdHhf ZGVzY19saW0pDQo+DQo+ICsJCQkJbWF4X3R4X2Rlc2NfbGltID0gc2xhdmVfaW5mby50eF9kZXNj X2xpbS5uYl9tYXg7DQo+DQo+ICsJCX0NCj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwlkZXZfaW5m by0+bWF4X3J4X3F1ZXVlcyA9IG1heF9uYl9yeF9xdWV1ZXM7DQo+DQo+ICsJZGV2X2luZm8tPm1h eF90eF9xdWV1ZXMgPSBtYXhfbmJfdHhfcXVldWVzOw0KPg0KPiArDQo+DQo+ICsJbWVtY3B5KCZk ZXZfaW5mby0+ZGVmYXVsdF9yeGNvbmYsICZpbnRlcm5hbHMtPmRlZmF1bHRfcnhjb25mLA0KPg0K PiArCSAgICAgICBzaXplb2YoZGV2X2luZm8tPmRlZmF1bHRfcnhjb25mKSk7DQo+DQo+ICsJbWVt Y3B5KCZkZXZfaW5mby0+ZGVmYXVsdF90eGNvbmYsICZpbnRlcm5hbHMtPmRlZmF1bHRfdHhjb25m LA0KPg0KPiArCSAgICAgICBzaXplb2YoZGV2X2luZm8tPmRlZmF1bHRfdHhjb25mKSk7DQo+DQo+ ICsNCj4NCj4gKwlkZXZfaW5mby0+cnhfZGVzY19saW0ubmJfbWF4ID0gbWF4X3J4X2Rlc2NfbGlt Ow0KPg0KPiArCWRldl9pbmZvLT50eF9kZXNjX2xpbS5uYl9tYXggPSBtYXhfdHhfZGVzY19saW07 DQo+DQo+ICsNCj4NCj4gKwkvKioNCj4NCj4gKwkgKiBJZiBkZWRpY2F0ZWQgaHcgcXVldWVzIGVu YWJsZWQgZm9yIGxpbmsgYm9uZGluZyBkZXZpY2UgaW4gTEFDUCBtb2RlDQo+DQo+ICsJICogdGhl biB3ZSBuZWVkIHRvIHJlZHVjZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGF0YSBwYXRoIHF1ZXVl cyBieSAxLg0KPg0KPiArCSAqLw0KPg0KPiArCWlmIChpbnRlcm5hbHMtPm1vZGUgPT0gQk9ORElO R19NT0RFXzgwMjNBRCAmJg0KPg0KPiArCQlpbnRlcm5hbHMtPm1vZGU0LmRlZGljYXRlZF9xdWV1 ZXMuZW5hYmxlZCA9PSAxKSB7DQo+DQo+ICsJCWRldl9pbmZvLT5tYXhfcnhfcXVldWVzLS07DQo+ DQo+ICsJCWRldl9pbmZvLT5tYXhfdHhfcXVldWVzLS07DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ ICsJZGV2X2luZm8tPm1pbl9yeF9idWZzaXplID0gMDsNCj4NCj4gKw0KPg0KPiArCWRldl9pbmZv LT5yeF9vZmZsb2FkX2NhcGEgPSBpbnRlcm5hbHMtPnJ4X29mZmxvYWRfY2FwYTsNCj4NCj4gKwlk ZXZfaW5mby0+dHhfb2ZmbG9hZF9jYXBhID0gaW50ZXJuYWxzLT50eF9vZmZsb2FkX2NhcGE7DQo+ DQo+ICsJZGV2X2luZm8tPnJ4X3F1ZXVlX29mZmxvYWRfY2FwYSA9IGludGVybmFscy0+cnhfcXVl dWVfb2ZmbG9hZF9jYXBhOw0KPg0KPiArCWRldl9pbmZvLT50eF9xdWV1ZV9vZmZsb2FkX2NhcGEg PSBpbnRlcm5hbHMtPnR4X3F1ZXVlX29mZmxvYWRfY2FwYTsNCj4NCj4gKwlkZXZfaW5mby0+Zmxv d190eXBlX3Jzc19vZmZsb2FkcyA9IGludGVybmFscy0+Zmxvd190eXBlX3Jzc19vZmZsb2FkczsN Cj4NCj4gKw0KPg0KPiArCWRldl9pbmZvLT5yZXRhX3NpemUgPSBpbnRlcm5hbHMtPnJldGFfc2l6 ZTsNCj4NCj4gKwlkZXZfaW5mby0+aGFzaF9rZXlfc2l6ZSA9IGludGVybmFscy0+cnNzX2tleV9s ZW47DQo+DQo+ICsNCj4NCj4gKwlyZXR1cm4gMDsNCj4NCj4gK30NCj4NCj4gKw0KPg0KPiArc3Rh dGljIGludA0KPg0KPiArYm9uZF9ldGhkZXZfdmxhbl9maWx0ZXJfc2V0KHN0cnVjdCBydGVfZXRo X2RldiAqZGV2LCB1aW50MTZfdCB2bGFuX2lkLCBpbnQgb24pDQo+DQo+ICt7DQo+DQo+ICsJaW50 IHJlczsNCj4NCj4gKwl1aW50MTZfdCBpOw0KPg0KPiArCXN0cnVjdCBib25kX2Rldl9wcml2YXRl ICppbnRlcm5hbHMgPSBkZXYtPmRhdGEtPmRldl9wcml2YXRlOw0KPg0KPiArDQo+DQo+ICsJLyog ZG9uJ3QgZG8gdGhpcyB3aGlsZSBhIHNsYXZlIGlzIGJlaW5nIGFkZGVkICovDQo+DQo+ICsJcnRl X3NwaW5sb2NrX2xvY2soJmludGVybmFscy0+bG9jayk7DQo+DQo+ICsNCj4NCj4gKwlpZiAob24p DQo+DQo+ICsJCXJ0ZV9iaXRtYXBfc2V0KGludGVybmFscy0+dmxhbl9maWx0ZXJfYm1wLCB2bGFu X2lkKTsNCj4NCj4gKwllbHNlDQo+DQo+ICsJCXJ0ZV9iaXRtYXBfY2xlYXIoaW50ZXJuYWxzLT52 bGFuX2ZpbHRlcl9ibXAsIHZsYW5faWQpOw0KPg0KPiArDQo+DQo+ICsJZm9yIChpID0gMDsgaSA8 IGludGVybmFscy0+c2xhdmVfY291bnQ7IGkrKykgew0KPg0KPiArCQl1aW50MTZfdCBwb3J0X2lk ID0gaW50ZXJuYWxzLT5zbGF2ZXNbaV0ucG9ydF9pZDsNCj4NCj4gKw0KPg0KPiArCQlyZXMgPSBy dGVfZXRoX2Rldl92bGFuX2ZpbHRlcihwb3J0X2lkLCB2bGFuX2lkLCBvbik7DQo+DQo+ICsJCWlm IChyZXMgPT0gRU5PVFNVUCkNCj4NCj4gKwkJCVJURV9CT05EX0xPRyhXQVJOSU5HLA0KPg0KPiAr CQkJCSAgICAgIlNldHRpbmcgVkxBTiBmaWx0ZXIgb24gc2xhdmUgcG9ydCAldSBub3Qgc3VwcG9y dGVkLiIsDQo+DQo+ICsJCQkJICAgICBwb3J0X2lkKTsNCj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4g KwlydGVfc3BpbmxvY2tfdW5sb2NrKCZpbnRlcm5hbHMtPmxvY2spOw0KPg0KPiArCXJldHVybiAw Ow0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICtzdGF0aWMgaW50DQo+DQo+ICtib25kX2V0aGRldl9y eF9xdWV1ZV9zZXR1cChzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwgdWludDE2X3QgcnhfcXVldWVf aWQsDQo+DQo+ICsJCXVpbnQxNl90IG5iX3J4X2Rlc2MsIHVuc2lnbmVkIGludCBzb2NrZXRfaWQg X19ydGVfdW51c2VkLA0KPg0KPiArCQljb25zdCBzdHJ1Y3QgcnRlX2V0aF9yeGNvbmYgKnJ4X2Nv bmYsIHN0cnVjdCBydGVfbWVtcG9vbCAqbWJfcG9vbCkNCj4NCj4gK3sNCj4NCj4gKwlzdHJ1Y3Qg Ym9uZF9yeF9xdWV1ZSAqYmRfcnhfcSA9IChzdHJ1Y3QgYm9uZF9yeF9xdWV1ZSAqKQ0KPg0KPiAr CQkJcnRlX3ptYWxsb2Nfc29ja2V0KE5VTEwsIHNpemVvZihzdHJ1Y3QgYm9uZF9yeF9xdWV1ZSks DQo+DQo+ICsJCQkJCTAsIGRldi0+ZGF0YS0+bnVtYV9ub2RlKTsNCj4NCj4gKwlpZiAoYmRfcnhf cSA9PSBOVUxMKQ0KPg0KPiArCQlyZXR1cm4gLTE7DQo+DQo+ICsNCj4NCj4gKwliZF9yeF9xLT5x dWV1ZV9pZCA9IHJ4X3F1ZXVlX2lkOw0KPg0KPiArCWJkX3J4X3EtPmRldl9wcml2YXRlID0gZGV2 LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4NCj4gKw0KPg0KPiArCWJkX3J4X3EtPm5iX3J4X2Rlc2Mg PSBuYl9yeF9kZXNjOw0KPg0KPiArDQo+DQo+ICsJbWVtY3B5KCYoYmRfcnhfcS0+cnhfY29uZiks IHJ4X2NvbmYsIHNpemVvZihzdHJ1Y3QgcnRlX2V0aF9yeGNvbmYpKTsNCj4NCj4gKwliZF9yeF9x LT5tYl9wb29sID0gbWJfcG9vbDsNCj4NCj4gKw0KPg0KPiArCWRldi0+ZGF0YS0+cnhfcXVldWVz W3J4X3F1ZXVlX2lkXSA9IGJkX3J4X3E7DQo+DQo+ICsNCj4NCj4gKwlyZXR1cm4gMDsNCj4NCj4g K30NCj4NCj4gKw0KPg0KPiArc3RhdGljIGludA0KPg0KPiArYm9uZF9ldGhkZXZfdHhfcXVldWVf c2V0dXAoc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYsIHVpbnQxNl90IHR4X3F1ZXVlX2lkLA0KPg0K PiArCQl1aW50MTZfdCBuYl90eF9kZXNjLCB1bnNpZ25lZCBpbnQgc29ja2V0X2lkIF9fcnRlX3Vu dXNlZCwNCj4NCj4gKwkJY29uc3Qgc3RydWN0IHJ0ZV9ldGhfdHhjb25mICp0eF9jb25mKQ0KPg0K PiArew0KPg0KPiArCXN0cnVjdCBib25kX3R4X3F1ZXVlICpiZF90eF9xICA9IChzdHJ1Y3QgYm9u ZF90eF9xdWV1ZSAqKQ0KPg0KPiArCQkJcnRlX3ptYWxsb2Nfc29ja2V0KE5VTEwsIHNpemVvZihz dHJ1Y3QgYm9uZF90eF9xdWV1ZSksDQo+DQo+ICsJCQkJCTAsIGRldi0+ZGF0YS0+bnVtYV9ub2Rl KTsNCj4NCj4gKw0KPg0KPiArCWlmIChiZF90eF9xID09IE5VTEwpDQo+DQo+ICsJCXJldHVybiAt MTsNCj4NCj4gKw0KPg0KPiArCWJkX3R4X3EtPnF1ZXVlX2lkID0gdHhfcXVldWVfaWQ7DQo+DQo+ ICsJYmRfdHhfcS0+ZGV2X3ByaXZhdGUgPSBkZXYtPmRhdGEtPmRldl9wcml2YXRlOw0KPg0KPiAr DQo+DQo+ICsJYmRfdHhfcS0+bmJfdHhfZGVzYyA9IG5iX3R4X2Rlc2M7DQo+DQo+ICsJbWVtY3B5 KCYoYmRfdHhfcS0+dHhfY29uZiksIHR4X2NvbmYsIHNpemVvZihiZF90eF9xLT50eF9jb25mKSk7 DQo+DQo+ICsNCj4NCj4gKwlkZXYtPmRhdGEtPnR4X3F1ZXVlc1t0eF9xdWV1ZV9pZF0gPSBiZF90 eF9xOw0KPg0KPiArDQo+DQo+ICsJcmV0dXJuIDA7DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gK3N0 YXRpYyB2b2lkDQo+DQo+ICtib25kX2V0aGRldl9yeF9xdWV1ZV9yZWxlYXNlKHN0cnVjdCBydGVf ZXRoX2RldiAqZGV2LCB1aW50MTZfdCBxdWV1ZV9pZCkNCj4NCj4gK3sNCj4NCj4gKwl2b2lkICpx dWV1ZSA9IGRldi0+ZGF0YS0+cnhfcXVldWVzW3F1ZXVlX2lkXTsNCj4NCj4gKw0KPg0KPiArCWlm IChxdWV1ZSA9PSBOVUxMKQ0KPg0KPiArCQlyZXR1cm47DQo+DQo+ICsNCj4NCj4gKwlydGVfZnJl ZShxdWV1ZSk7DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyB2b2lkDQo+DQo+ICtib25k X2V0aGRldl90eF9xdWV1ZV9yZWxlYXNlKHN0cnVjdCBydGVfZXRoX2RldiAqZGV2LCB1aW50MTZf dCBxdWV1ZV9pZCkNCj4NCj4gK3sNCj4NCj4gKwl2b2lkICpxdWV1ZSA9IGRldi0+ZGF0YS0+dHhf cXVldWVzW3F1ZXVlX2lkXTsNCj4NCj4gKw0KPg0KPiArCWlmIChxdWV1ZSA9PSBOVUxMKQ0KPg0K PiArCQlyZXR1cm47DQo+DQo+ICsNCj4NCj4gKwlydGVfZnJlZShxdWV1ZSk7DQo+DQo+ICt9DQo+ DQo+ICsNCj4NCj4gK3N0YXRpYyB2b2lkDQo+DQo+ICtib25kX2V0aGRldl9zbGF2ZV9saW5rX3N0 YXR1c19jaGFuZ2VfbW9uaXRvcih2b2lkICpjYl9hcmcpDQo+DQo+ICt7DQo+DQo+ICsJc3RydWN0 IHJ0ZV9ldGhfZGV2ICpib25kZWRfZXRoZGV2LCAqc2xhdmVfZXRoZGV2Ow0KPg0KPiArCXN0cnVj dCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHM7DQo+DQo+ICsNCj4NCj4gKwkvKiBEZWZhdWx0 IHZhbHVlIGZvciBwb2xsaW5nIHNsYXZlIGZvdW5kIGlzIHRydWUgYXMgd2UgZG9uJ3Qgd2FudCB0 bw0KPg0KPiArCSAqIGRpc2FibGUgdGhlIHBvbGxpbmcgdGhyZWFkIGlmIHdlIGNhbm5vdCBnZXQg dGhlIGxvY2sgKi8NCj4NCj4gKwlpbnQgaSwgcG9sbGluZ19zbGF2ZV9mb3VuZCA9IDE7DQo+DQo+ ICsNCj4NCj4gKwlpZiAoY2JfYXJnID09IE5VTEwpDQo+DQo+ICsJCXJldHVybjsNCj4NCj4gKw0K Pg0KPiArCWJvbmRlZF9ldGhkZXYgPSBjYl9hcmc7DQo+DQo+ICsJaW50ZXJuYWxzID0gYm9uZGVk X2V0aGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsNCj4NCj4gKwlpZiAoIWJvbmRlZF9l dGhkZXYtPmRhdGEtPmRldl9zdGFydGVkIHx8DQo+DQo+ICsJCSFpbnRlcm5hbHMtPmxpbmtfc3Rh dHVzX3BvbGxpbmdfZW5hYmxlZCkNCj4NCj4gKwkJcmV0dXJuOw0KPg0KPiArDQo+DQo+ICsJLyog SWYgZGV2aWNlIGlzIGN1cnJlbnRseSBiZWluZyBjb25maWd1cmVkIHRoZW4gZG9uJ3QgY2hlY2sg c2xhdmVzIGxpbmsNCj4NCj4gKwkgKiBzdGF0dXMsIHdhaXQgdW50aWwgbmV4dCBwZXJpb2QgKi8N Cj4NCj4gKwlpZiAocnRlX3NwaW5sb2NrX3RyeWxvY2soJmludGVybmFscy0+bG9jaykpIHsNCj4N Cj4gKwkJaWYgKGludGVybmFscy0+c2xhdmVfY291bnQgPiAwKQ0KPg0KPiArCQkJcG9sbGluZ19z bGF2ZV9mb3VuZCA9IDA7DQo+DQo+ICsNCj4NCj4gKwkJZm9yIChpID0gMDsgaSA8IGludGVybmFs cy0+c2xhdmVfY291bnQ7IGkrKykgew0KPg0KPiArCQkJaWYgKCFpbnRlcm5hbHMtPnNsYXZlc1tp XS5saW5rX3N0YXR1c19wb2xsX2VuYWJsZWQpDQo+DQo+ICsJCQkJY29udGludWU7DQo+DQo+ICsN Cj4NCj4gKwkJCXNsYXZlX2V0aGRldiA9ICZydGVfZXRoX2RldmljZXNbaW50ZXJuYWxzLT5zbGF2 ZXNbaV0ucG9ydF9pZF07DQo+DQo+ICsJCQlwb2xsaW5nX3NsYXZlX2ZvdW5kID0gMTsNCj4NCj4g Kw0KPg0KPiArCQkJLyogVXBkYXRlIHNsYXZlIGxpbmsgc3RhdHVzICovDQo+DQo+ICsJCQkoKnNs YXZlX2V0aGRldi0+ZGV2X29wcy0+bGlua191cGRhdGUpKHNsYXZlX2V0aGRldiwNCj4NCj4gKwkJ CQkJaW50ZXJuYWxzLT5zbGF2ZXNbaV0ubGlua19zdGF0dXNfd2FpdF90b19jb21wbGV0ZSk7DQo+ DQo+ICsNCj4NCj4gKwkJCS8qIGlmIGxpbmsgc3RhdHVzIGhhcyBjaGFuZ2VkIHNpbmNlIGxhc3Qg Y2hlY2tlZCB0aGVuIGNhbGwgbHNjDQo+DQo+ICsJCQkgKiBldmVudCBjYWxsYmFjayAqLw0KPg0K PiArCQkJaWYgKHNsYXZlX2V0aGRldi0+ZGF0YS0+ZGV2X2xpbmsubGlua19zdGF0dXMgIT0NCj4N Cj4gKwkJCQkJaW50ZXJuYWxzLT5zbGF2ZXNbaV0ubGFzdF9saW5rX3N0YXR1cykgew0KPg0KPiAr CQkJCWludGVybmFscy0+c2xhdmVzW2ldLmxhc3RfbGlua19zdGF0dXMgPQ0KPg0KPiArCQkJCQkJ c2xhdmVfZXRoZGV2LT5kYXRhLT5kZXZfbGluay5saW5rX3N0YXR1czsNCj4NCj4gKw0KPg0KPiAr CQkJCWJvbmRfZXRoZGV2X2xzY19ldmVudF9jYWxsYmFjayhpbnRlcm5hbHMtPnNsYXZlc1tpXS5w b3J0X2lkLA0KPg0KPiArCQkJCQkJUlRFX0VUSF9FVkVOVF9JTlRSX0xTQywNCj4NCj4gKwkJCQkJ CSZib25kZWRfZXRoZGV2LT5kYXRhLT5wb3J0X2lkLA0KPg0KPiArCQkJCQkJTlVMTCk7DQo+DQo+ ICsJCQl9DQo+DQo+ICsJCX0NCj4NCj4gKwkJcnRlX3NwaW5sb2NrX3VubG9jaygmaW50ZXJuYWxz LT5sb2NrKTsNCj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwlpZiAocG9sbGluZ19zbGF2ZV9mb3Vu ZCkNCj4NCj4gKwkJLyogU2V0IGFsYXJtIHRvIGNvbnRpbnVlIG1vbml0b3JpbmcgbGluayBzdGF0 dXMgb2Ygc2xhdmUgZXRoZGV2J3MgKi8NCj4NCj4gKwkJcnRlX2VhbF9hbGFybV9zZXQoaW50ZXJu YWxzLT5saW5rX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zICogMTAwMCwNCj4NCj4gKwkJCQli b25kX2V0aGRldl9zbGF2ZV9saW5rX3N0YXR1c19jaGFuZ2VfbW9uaXRvciwgY2JfYXJnKTsNCj4N Cj4gK30NCj4NCj4gKw0KPg0KPiArc3RhdGljIGludA0KPg0KPiArYm9uZF9ldGhkZXZfbGlua191 cGRhdGUoc3RydWN0IHJ0ZV9ldGhfZGV2ICpldGhkZXYsIGludCB3YWl0X3RvX2NvbXBsZXRlKQ0K Pg0KPiArew0KPg0KPiArCWludCAoKmxpbmtfdXBkYXRlKSh1aW50MTZfdCBwb3J0X2lkLCBzdHJ1 Y3QgcnRlX2V0aF9saW5rICpldGhfbGluayk7DQo+DQo+ICsNCj4NCj4gKwlzdHJ1Y3QgYm9uZF9k ZXZfcHJpdmF0ZSAqYm9uZF9jdHg7DQo+DQo+ICsJc3RydWN0IHJ0ZV9ldGhfbGluayBzbGF2ZV9s aW5rOw0KPg0KPiArDQo+DQo+ICsJYm9vbCBvbmVfbGlua191cGRhdGVfc3VjY2VlZGVkOw0KPg0K PiArCXVpbnQzMl90IGlkeDsNCj4NCj4gKwlpbnQgcmV0Ow0KPg0KPiArDQo+DQo+ICsJYm9uZF9j dHggPSBldGhkZXYtPmRhdGEtPmRldl9wcml2YXRlOw0KPg0KPiArDQo+DQo+ICsJZXRoZGV2LT5k YXRhLT5kZXZfbGluay5saW5rX3NwZWVkID0gUlRFX0VUSF9TUEVFRF9OVU1fTk9ORTsNCj4NCj4g Kw0KPg0KPiArCWlmIChldGhkZXYtPmRhdGEtPmRldl9zdGFydGVkID09IDAgfHwNCj4NCj4gKwkJ CWJvbmRfY3R4LT5hY3RpdmVfc2xhdmVfY291bnQgPT0gMCkgew0KPg0KPiArCQlldGhkZXYtPmRh dGEtPmRldl9saW5rLmxpbmtfc3RhdHVzID0gUlRFX0VUSF9MSU5LX0RPV047DQo+DQo+ICsJCXJl dHVybiAwOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCWV0aGRldi0+ZGF0YS0+ZGV2X2xpbmsu bGlua19zdGF0dXMgPSBSVEVfRVRIX0xJTktfVVA7DQo+DQo+ICsNCj4NCj4gKwlpZiAod2FpdF90 b19jb21wbGV0ZSkNCj4NCj4gKwkJbGlua191cGRhdGUgPSBydGVfZXRoX2xpbmtfZ2V0Ow0KPg0K PiArCWVsc2UNCj4NCj4gKwkJbGlua191cGRhdGUgPSBydGVfZXRoX2xpbmtfZ2V0X25vd2FpdDsN Cj4NCj4gKw0KPg0KPiArCXN3aXRjaCAoYm9uZF9jdHgtPm1vZGUpIHsNCj4NCj4gKwljYXNlIEJP TkRJTkdfTU9ERV9CUk9BRENBU1Q6DQo+DQo+ICsJCS8qKg0KPg0KPiArCQkgKiBTZXR0aW5nIGxp bmsgc3BlZWQgdG8gVUlOVDMyX01BWCB0byBlbnN1cmUgd2UgcGljayB1cCB0aGUNCj4NCj4gKwkJ ICogdmFsdWUgb2YgdGhlIGZpcnN0IGFjdGl2ZSBzbGF2ZQ0KPg0KPiArCQkgKi8NCj4NCj4gKwkJ ZXRoZGV2LT5kYXRhLT5kZXZfbGluay5saW5rX3NwZWVkID0gVUlOVDMyX01BWDsNCj4NCj4gKw0K Pg0KPiArCQkvKioNCj4NCj4gKwkJICogbGluayBzcGVlZCBpcyBtaW5pbXVtIHZhbHVlIG9mIGFs bCB0aGUgc2xhdmVzIGxpbmsgc3BlZWQgYXMNCj4NCj4gKwkJICogcGFja2V0IGxvc3Mgd2lsbCBv Y2N1ciBvbiB0aGlzIHNsYXZlIGlmIHRyYW5zbWlzc2lvbiBhdCByYXRlcw0KPg0KPiArCQkgKiBn cmVhdGVyIHRoYW4gdGhpcyBhcmUgYXR0ZW1wdGVkDQo+DQo+ICsJCSAqLw0KPg0KPiArCQlmb3Ig KGlkeCA9IDA7IGlkeCA8IGJvbmRfY3R4LT5hY3RpdmVfc2xhdmVfY291bnQ7IGlkeCsrKSB7DQo+ DQo+ICsJCQlyZXQgPSBsaW5rX3VwZGF0ZShib25kX2N0eC0+YWN0aXZlX3NsYXZlc1tpZHhdLA0K Pg0KPiArCQkJCQkgICZzbGF2ZV9saW5rKTsNCj4NCj4gKwkJCWlmIChyZXQgPCAwKSB7DQo+DQo+ ICsJCQkJZXRoZGV2LT5kYXRhLT5kZXZfbGluay5saW5rX3NwZWVkID0NCj4NCj4gKwkJCQkJUlRF X0VUSF9TUEVFRF9OVU1fTk9ORTsNCj4NCj4gKwkJCQlSVEVfQk9ORF9MT0coRVJSLA0KPg0KPiAr CQkJCQkiU2xhdmUgKHBvcnQgJXUpIGxpbmsgZ2V0IGZhaWxlZDogJXMiLA0KPg0KPiArCQkJCQli b25kX2N0eC0+YWN0aXZlX3NsYXZlc1tpZHhdLA0KPg0KPiArCQkJCQlydGVfc3RyZXJyb3IoLXJl dCkpOw0KPg0KPiArCQkJCXJldHVybiAwOw0KPg0KPiArCQkJfQ0KPg0KPiArDQo+DQo+ICsJCQlp ZiAoc2xhdmVfbGluay5saW5rX3NwZWVkIDwNCj4NCj4gKwkJCQkJZXRoZGV2LT5kYXRhLT5kZXZf bGluay5saW5rX3NwZWVkKQ0KPg0KPiArCQkJCWV0aGRldi0+ZGF0YS0+ZGV2X2xpbmsubGlua19z cGVlZCA9DQo+DQo+ICsJCQkJCQlzbGF2ZV9saW5rLmxpbmtfc3BlZWQ7DQo+DQo+ICsJCX0NCj4N Cj4gKwkJYnJlYWs7DQo+DQo+ICsJY2FzZSBCT05ESU5HX01PREVfQUNUSVZFX0JBQ0tVUDoNCj4N Cj4gKwkJLyogQ3VycmVudCBwcmltYXJ5IHNsYXZlICovDQo+DQo+ICsJCXJldCA9IGxpbmtfdXBk YXRlKGJvbmRfY3R4LT5jdXJyZW50X3ByaW1hcnlfcG9ydCwgJnNsYXZlX2xpbmspOw0KPg0KPiAr CQlpZiAocmV0IDwgMCkgew0KPg0KPiArCQkJUlRFX0JPTkRfTE9HKEVSUiwgIlNsYXZlIChwb3J0 ICV1KSBsaW5rIGdldCBmYWlsZWQ6ICVzIiwNCj4NCj4gKwkJCQlib25kX2N0eC0+Y3VycmVudF9w cmltYXJ5X3BvcnQsDQo+DQo+ICsJCQkJcnRlX3N0cmVycm9yKC1yZXQpKTsNCj4NCj4gKwkJCXJl dHVybiAwOw0KPg0KPiArCQl9DQo+DQo+ICsNCj4NCj4gKwkJZXRoZGV2LT5kYXRhLT5kZXZfbGlu ay5saW5rX3NwZWVkID0gc2xhdmVfbGluay5saW5rX3NwZWVkOw0KPg0KPiArCQlicmVhazsNCj4N Cj4gKwljYXNlIEJPTkRJTkdfTU9ERV84MDIzQUQ6DQo+DQo+ICsJCWV0aGRldi0+ZGF0YS0+ZGV2 X2xpbmsubGlua19hdXRvbmVnID0NCj4NCj4gKwkJCQlib25kX2N0eC0+bW9kZTQuc2xhdmVfbGlu ay5saW5rX2F1dG9uZWc7DQo+DQo+ICsJCWV0aGRldi0+ZGF0YS0+ZGV2X2xpbmsubGlua19kdXBs ZXggPQ0KPg0KPiArCQkJCWJvbmRfY3R4LT5tb2RlNC5zbGF2ZV9saW5rLmxpbmtfZHVwbGV4Ow0K Pg0KPiArCQkvKiBmYWxsIHRocm91Z2ggKi8NCj4NCj4gKwkJLyogdG8gdXBkYXRlIGxpbmsgc3Bl ZWQgKi8NCj4NCj4gKwljYXNlIEJPTkRJTkdfTU9ERV9ST1VORF9ST0JJTjoNCj4NCj4gKwljYXNl IEJPTkRJTkdfTU9ERV9CQUxBTkNFOg0KPg0KPiArCWNhc2UgQk9ORElOR19NT0RFX1RMQjoNCj4N Cj4gKwljYXNlIEJPTkRJTkdfTU9ERV9BTEI6DQo+DQo+ICsJZGVmYXVsdDoNCj4NCj4gKwkJLyoq DQo+DQo+ICsJCSAqIEluIHRoZXNlcyBtb2RlIHRoZSBtYXhpbXVtIHRoZW9yZXRpY2FsIGxpbmsg c3BlZWQgaXMgdGhlIHN1bQ0KPg0KPiArCQkgKiBvZiBhbGwgdGhlIHNsYXZlcw0KPg0KPiArCQkg Ki8NCj4NCj4gKwkJZXRoZGV2LT5kYXRhLT5kZXZfbGluay5saW5rX3NwZWVkID0gUlRFX0VUSF9T UEVFRF9OVU1fTk9ORTsNCj4NCj4gKwkJb25lX2xpbmtfdXBkYXRlX3N1Y2NlZWRlZCA9IGZhbHNl Ow0KPg0KPiArDQo+DQo+ICsJCWZvciAoaWR4ID0gMDsgaWR4IDwgYm9uZF9jdHgtPmFjdGl2ZV9z bGF2ZV9jb3VudDsgaWR4KyspIHsNCj4NCj4gKwkJCXJldCA9IGxpbmtfdXBkYXRlKGJvbmRfY3R4 LT5hY3RpdmVfc2xhdmVzW2lkeF0sDQo+DQo+ICsJCQkJCSZzbGF2ZV9saW5rKTsNCj4NCj4gKwkJ CWlmIChyZXQgPCAwKSB7DQo+DQo+ICsJCQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4NCj4gKwkJCQkJ IlNsYXZlIChwb3J0ICV1KSBsaW5rIGdldCBmYWlsZWQ6ICVzIiwNCj4NCj4gKwkJCQkJYm9uZF9j dHgtPmFjdGl2ZV9zbGF2ZXNbaWR4XSwNCj4NCj4gKwkJCQkJcnRlX3N0cmVycm9yKC1yZXQpKTsN Cj4NCj4gKwkJCQljb250aW51ZTsNCj4NCj4gKwkJCX0NCj4NCj4gKw0KPg0KPiArCQkJb25lX2xp bmtfdXBkYXRlX3N1Y2NlZWRlZCA9IHRydWU7DQo+DQo+ICsJCQlldGhkZXYtPmRhdGEtPmRldl9s aW5rLmxpbmtfc3BlZWQgKz0NCj4NCj4gKwkJCQkJc2xhdmVfbGluay5saW5rX3NwZWVkOw0KPg0K PiArCQl9DQo+DQo+ICsNCj4NCj4gKwkJaWYgKCFvbmVfbGlua191cGRhdGVfc3VjY2VlZGVkKSB7 DQo+DQo+ICsJCQlSVEVfQk9ORF9MT0coRVJSLCAiQWxsIHNsYXZlcyBsaW5rIGdldCBmYWlsZWQi KTsNCj4NCj4gKwkJCXJldHVybiAwOw0KPg0KPiArCQl9DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ ICsNCj4NCj4gKwlyZXR1cm4gMDsNCj4NCj4gK30NCj4NCj4gKw0KPg0KPiArDQo+DQo+ICtzdGF0 aWMgaW50DQo+DQo+ICtib25kX2V0aGRldl9zdGF0c19nZXQoc3RydWN0IHJ0ZV9ldGhfZGV2ICpk ZXYsIHN0cnVjdCBydGVfZXRoX3N0YXRzICpzdGF0cykNCj4NCj4gK3sNCj4NCj4gKwlzdHJ1Y3Qg Ym9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4N Cj4gKwlzdHJ1Y3QgcnRlX2V0aF9zdGF0cyBzbGF2ZV9zdGF0czsNCj4NCj4gKwlpbnQgaSwgajsN Cj4NCj4gKw0KPg0KPiArCWZvciAoaSA9IDA7IGkgPCBpbnRlcm5hbHMtPnNsYXZlX2NvdW50OyBp KyspIHsNCj4NCj4gKwkJcnRlX2V0aF9zdGF0c19nZXQoaW50ZXJuYWxzLT5zbGF2ZXNbaV0ucG9y dF9pZCwgJnNsYXZlX3N0YXRzKTsNCj4NCj4gKw0KPg0KPiArCQlzdGF0cy0+aXBhY2tldHMgKz0g c2xhdmVfc3RhdHMuaXBhY2tldHM7DQo+DQo+ICsJCXN0YXRzLT5vcGFja2V0cyArPSBzbGF2ZV9z dGF0cy5vcGFja2V0czsNCj4NCj4gKwkJc3RhdHMtPmlieXRlcyArPSBzbGF2ZV9zdGF0cy5pYnl0 ZXM7DQo+DQo+ICsJCXN0YXRzLT5vYnl0ZXMgKz0gc2xhdmVfc3RhdHMub2J5dGVzOw0KPg0KPiAr CQlzdGF0cy0+aW1pc3NlZCArPSBzbGF2ZV9zdGF0cy5pbWlzc2VkOw0KPg0KPiArCQlzdGF0cy0+ aWVycm9ycyArPSBzbGF2ZV9zdGF0cy5pZXJyb3JzOw0KPg0KPiArCQlzdGF0cy0+b2Vycm9ycyAr PSBzbGF2ZV9zdGF0cy5vZXJyb3JzOw0KPg0KPiArCQlzdGF0cy0+cnhfbm9tYnVmICs9IHNsYXZl X3N0YXRzLnJ4X25vbWJ1ZjsNCj4NCj4gKw0KPg0KPiArCQlmb3IgKGogPSAwOyBqIDwgUlRFX0VU SERFVl9RVUVVRV9TVEFUX0NOVFJTOyBqKyspIHsNCj4NCj4gKwkJCXN0YXRzLT5xX2lwYWNrZXRz W2pdICs9IHNsYXZlX3N0YXRzLnFfaXBhY2tldHNbal07DQo+DQo+ICsJCQlzdGF0cy0+cV9vcGFj a2V0c1tqXSArPSBzbGF2ZV9zdGF0cy5xX29wYWNrZXRzW2pdOw0KPg0KPiArCQkJc3RhdHMtPnFf aWJ5dGVzW2pdICs9IHNsYXZlX3N0YXRzLnFfaWJ5dGVzW2pdOw0KPg0KPiArCQkJc3RhdHMtPnFf b2J5dGVzW2pdICs9IHNsYXZlX3N0YXRzLnFfb2J5dGVzW2pdOw0KPg0KPiArCQkJc3RhdHMtPnFf ZXJyb3JzW2pdICs9IHNsYXZlX3N0YXRzLnFfZXJyb3JzW2pdOw0KPg0KPiArCQl9DQo+DQo+ICsN Cj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwlyZXR1cm4gMDsNCj4NCj4gK30NCj4NCj4gKw0KPg0K PiArc3RhdGljIGludA0KPg0KPiArYm9uZF9ldGhkZXZfc3RhdHNfcmVzZXQoc3RydWN0IHJ0ZV9l dGhfZGV2ICpkZXYpDQo+DQo+ICt7DQo+DQo+ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmlu dGVybmFscyA9IGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsJaW50IGk7DQo+DQo+ICsJ aW50IGVycjsNCj4NCj4gKwlpbnQgcmV0Ow0KPg0KPiArDQo+DQo+ICsJZm9yIChpID0gMCwgZXJy ID0gMDsgaSA8IGludGVybmFscy0+c2xhdmVfY291bnQ7IGkrKykgew0KPg0KPiArCQlyZXQgPSBy dGVfZXRoX3N0YXRzX3Jlc2V0KGludGVybmFscy0+c2xhdmVzW2ldLnBvcnRfaWQpOw0KPg0KPiAr CQlpZiAocmV0ICE9IDApDQo+DQo+ICsJCQllcnIgPSByZXQ7DQo+DQo+ICsJfQ0KPg0KPiArDQo+ DQo+ICsJcmV0dXJuIGVycjsNCj4NCj4gK30NCj4NCj4gKw0KPg0KPiArc3RhdGljIGludA0KPg0K PiArYm9uZF9ldGhkZXZfcHJvbWlzY3VvdXNfZW5hYmxlKHN0cnVjdCBydGVfZXRoX2RldiAqZXRo X2RldikNCj4NCj4gK3sNCj4NCj4gKwlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxz ID0gZXRoX2Rldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsJaW50IGk7DQo+DQo+ICsJaW50 IHJldCA9IDA7DQo+DQo+ICsJdWludDE2X3QgcG9ydF9pZDsNCj4NCj4gKw0KPg0KPiArCXN3aXRj aCAoaW50ZXJuYWxzLT5tb2RlKSB7DQo+DQo+ICsJLyogUHJvbWlzY3VvdXMgbW9kZSBpcyBwcm9w YWdhdGVkIHRvIGFsbCBzbGF2ZXMgKi8NCj4NCj4gKwljYXNlIEJPTkRJTkdfTU9ERV9ST1VORF9S T0JJTjoNCj4NCj4gKwljYXNlIEJPTkRJTkdfTU9ERV9CQUxBTkNFOg0KPg0KPiArCWNhc2UgQk9O RElOR19NT0RFX0JST0FEQ0FTVDoNCj4NCj4gKwljYXNlIEJPTkRJTkdfTU9ERV84MDIzQUQ6IHsN Cj4NCj4gKwkJdW5zaWduZWQgaW50IHNsYXZlX29rID0gMDsNCj4NCj4gKw0KPg0KPiArCQlmb3Ig KGkgPSAwOyBpIDwgaW50ZXJuYWxzLT5zbGF2ZV9jb3VudDsgaSsrKSB7DQo+DQo+ICsJCQlwb3J0 X2lkID0gaW50ZXJuYWxzLT5zbGF2ZXNbaV0ucG9ydF9pZDsNCj4NCj4gKw0KPg0KPiArCQkJcmV0 ID0gcnRlX2V0aF9wcm9taXNjdW91c19lbmFibGUocG9ydF9pZCk7DQo+DQo+ICsJCQlpZiAocmV0 ICE9IDApDQo+DQo+ICsJCQkJUlRFX0JPTkRfTE9HKEVSUiwNCj4NCj4gKwkJCQkJIkZhaWxlZCB0 byBlbmFibGUgcHJvbWlzY3VvdXMgbW9kZSBmb3IgcG9ydCAldTogJXMiLA0KPg0KPiArCQkJCQlw b3J0X2lkLCBydGVfc3RyZXJyb3IoLXJldCkpOw0KPg0KPiArCQkJZWxzZQ0KPg0KPiArCQkJCXNs YXZlX29rKys7DQo+DQo+ICsJCX0NCj4NCj4gKwkJLyoNCj4NCj4gKwkJICogUmVwb3J0IHN1Y2Nl c3MgaWYgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwgb24gYXQgbGVhc3QNCj4NCj4gKwkJICogb24g b25lIHNsYXZlLiBPdGhlcndpc2UgcmV0dXJuIGxhc3QgZXJyb3IgY29kZS4NCj4NCj4gKwkJICov DQo+DQo+ICsJCWlmIChzbGF2ZV9vayA+IDApDQo+DQo+ICsJCQlyZXQgPSAwOw0KPg0KPiArCQli cmVhazsNCj4NCj4gKwl9DQo+DQo+ICsJLyogUHJvbWlzY3VvdXMgbW9kZSBpcyBwcm9wYWdhdGVk IG9ubHkgdG8gcHJpbWFyeSBzbGF2ZSAqLw0KPg0KPiArCWNhc2UgQk9ORElOR19NT0RFX0FDVElW RV9CQUNLVVA6DQo+DQo+ICsJY2FzZSBCT05ESU5HX01PREVfVExCOg0KPg0KPiArCWNhc2UgQk9O RElOR19NT0RFX0FMQjoNCj4NCj4gKwlkZWZhdWx0Og0KPg0KPiArCQkvKiBEbyBub3QgdG91Y2gg cHJvbWlzYyB3aGVuIHRoZXJlIGNhbm5vdCBiZSBwcmltYXJ5IHBvcnRzICovDQo+DQo+ICsJCWlm IChpbnRlcm5hbHMtPnNsYXZlX2NvdW50ID09IDApDQo+DQo+ICsJCQlicmVhazsNCj4NCj4gKwkJ cG9ydF9pZCA9IGludGVybmFscy0+Y3VycmVudF9wcmltYXJ5X3BvcnQ7DQo+DQo+ICsJCXJldCA9 IHJ0ZV9ldGhfcHJvbWlzY3VvdXNfZW5hYmxlKHBvcnRfaWQpOw0KPg0KPiArCQlpZiAocmV0ICE9 IDApDQo+DQo+ICsJCQlSVEVfQk9ORF9MT0coRVJSLA0KPg0KPiArCQkJCSJGYWlsZWQgdG8gZW5h YmxlIHByb21pc2N1b3VzIG1vZGUgZm9yIHBvcnQgJXU6ICVzIiwNCj4NCj4gKwkJCQlwb3J0X2lk LCBydGVfc3RyZXJyb3IoLXJldCkpOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCXJldHVybiBy ZXQ7DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyBpbnQNCj4NCj4gK2JvbmRfZXRoZGV2 X3Byb21pc2N1b3VzX2Rpc2FibGUoc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYpDQo+DQo+ICt7DQo+ DQo+ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFscyA9IGRldi0+ZGF0YS0+ZGV2 X3ByaXZhdGU7DQo+DQo+ICsJaW50IGk7DQo+DQo+ICsJaW50IHJldCA9IDA7DQo+DQo+ICsJdWlu dDE2X3QgcG9ydF9pZDsNCj4NCj4gKw0KPg0KPiArCXN3aXRjaCAoaW50ZXJuYWxzLT5tb2RlKSB7 DQo+DQo+ICsJLyogUHJvbWlzY3VvdXMgbW9kZSBpcyBwcm9wYWdhdGVkIHRvIGFsbCBzbGF2ZXMg Ki8NCj4NCj4gKwljYXNlIEJPTkRJTkdfTU9ERV9ST1VORF9ST0JJTjoNCj4NCj4gKwljYXNlIEJP TkRJTkdfTU9ERV9CQUxBTkNFOg0KPg0KPiArCWNhc2UgQk9ORElOR19NT0RFX0JST0FEQ0FTVDoN Cj4NCj4gKwljYXNlIEJPTkRJTkdfTU9ERV84MDIzQUQ6IHsNCj4NCj4gKwkJdW5zaWduZWQgaW50 IHNsYXZlX29rID0gMDsNCj4NCj4gKw0KPg0KPiArCQlmb3IgKGkgPSAwOyBpIDwgaW50ZXJuYWxz LT5zbGF2ZV9jb3VudDsgaSsrKSB7DQo+DQo+ICsJCQlwb3J0X2lkID0gaW50ZXJuYWxzLT5zbGF2 ZXNbaV0ucG9ydF9pZDsNCj4NCj4gKw0KPg0KPiArCQkJaWYgKGludGVybmFscy0+bW9kZSA9PSBC T05ESU5HX01PREVfODAyM0FEICYmDQo+DQo+ICsJCQkgICAgYm9uZF9tb2RlXzgwMjNhZF9wb3J0 c1twb3J0X2lkXS5mb3JjZWRfcnhfZmxhZ3MgPT0NCj4NCj4gKwkJCQkJQk9ORF84MDIzQURfRk9S Q0VEX1BST01JU0MpIHsNCj4NCj4gKwkJCQlzbGF2ZV9vaysrOw0KPg0KPiArCQkJCWNvbnRpbnVl Ow0KPg0KPiArCQkJfQ0KPg0KPiArCQkJcmV0ID0gcnRlX2V0aF9wcm9taXNjdW91c19kaXNhYmxl KHBvcnRfaWQpOw0KPg0KPiArCQkJaWYgKHJldCAhPSAwKQ0KPg0KPiArCQkJCVJURV9CT05EX0xP RyhFUlIsDQo+DQo+ICsJCQkJCSJGYWlsZWQgdG8gZGlzYWJsZSBwcm9taXNjdW91cyBtb2RlIGZv ciBwb3J0ICV1OiAlcyIsDQo+DQo+ICsJCQkJCXBvcnRfaWQsIHJ0ZV9zdHJlcnJvcigtcmV0KSk7 DQo+DQo+ICsJCQllbHNlDQo+DQo+ICsJCQkJc2xhdmVfb2srKzsNCj4NCj4gKwkJfQ0KPg0KPiAr CQkvKg0KPg0KPiArCQkgKiBSZXBvcnQgc3VjY2VzcyBpZiBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1 bCBvbiBhdCBsZWFzdA0KPg0KPiArCQkgKiBvbiBvbmUgc2xhdmUuIE90aGVyd2lzZSByZXR1cm4g bGFzdCBlcnJvciBjb2RlLg0KPg0KPiArCQkgKi8NCj4NCj4gKwkJaWYgKHNsYXZlX29rID4gMCkN Cj4NCj4gKwkJCXJldCA9IDA7DQo+DQo+ICsJCWJyZWFrOw0KPg0KPiArCX0NCj4NCj4gKwkvKiBQ cm9taXNjdW91cyBtb2RlIGlzIHByb3BhZ2F0ZWQgb25seSB0byBwcmltYXJ5IHNsYXZlICovDQo+ DQo+ICsJY2FzZSBCT05ESU5HX01PREVfQUNUSVZFX0JBQ0tVUDoNCj4NCj4gKwljYXNlIEJPTkRJ TkdfTU9ERV9UTEI6DQo+DQo+ICsJY2FzZSBCT05ESU5HX01PREVfQUxCOg0KPg0KPiArCWRlZmF1 bHQ6DQo+DQo+ICsJCS8qIERvIG5vdCB0b3VjaCBwcm9taXNjIHdoZW4gdGhlcmUgY2Fubm90IGJl IHByaW1hcnkgcG9ydHMgKi8NCj4NCj4gKwkJaWYgKGludGVybmFscy0+c2xhdmVfY291bnQgPT0g MCkNCj4NCj4gKwkJCWJyZWFrOw0KPg0KPiArCQlwb3J0X2lkID0gaW50ZXJuYWxzLT5jdXJyZW50 X3ByaW1hcnlfcG9ydDsNCj4NCj4gKwkJcmV0ID0gcnRlX2V0aF9wcm9taXNjdW91c19kaXNhYmxl KHBvcnRfaWQpOw0KPg0KPiArCQlpZiAocmV0ICE9IDApDQo+DQo+ICsJCQlSVEVfQk9ORF9MT0co RVJSLA0KPg0KPiArCQkJCSJGYWlsZWQgdG8gZGlzYWJsZSBwcm9taXNjdW91cyBtb2RlIGZvciBw b3J0ICV1OiAlcyIsDQo+DQo+ICsJCQkJcG9ydF9pZCwgcnRlX3N0cmVycm9yKC1yZXQpKTsNCj4N Cj4gKwl9DQo+DQo+ICsNCj4NCj4gKwlyZXR1cm4gcmV0Ow0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ ICtzdGF0aWMgaW50DQo+DQo+ICtib25kX2V0aGRldl9wcm9taXNjdW91c191cGRhdGUoc3RydWN0 IHJ0ZV9ldGhfZGV2ICpkZXYpDQo+DQo+ICt7DQo+DQo+ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZh dGUgKmludGVybmFscyA9IGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsJdWludDE2X3Qg cG9ydF9pZCA9IGludGVybmFscy0+Y3VycmVudF9wcmltYXJ5X3BvcnQ7DQo+DQo+ICsNCj4NCj4g Kwlzd2l0Y2ggKGludGVybmFscy0+bW9kZSkgew0KPg0KPiArCWNhc2UgQk9ORElOR19NT0RFX1JP VU5EX1JPQklOOg0KPg0KPiArCWNhc2UgQk9ORElOR19NT0RFX0JBTEFOQ0U6DQo+DQo+ICsJY2Fz ZSBCT05ESU5HX01PREVfQlJPQURDQVNUOg0KPg0KPiArCWNhc2UgQk9ORElOR19NT0RFXzgwMjNB RDoNCj4NCj4gKwkJLyogQXMgcHJvbWlzY3VvdXMgbW9kZSBpcyBwcm9wYWdhdGVkIHRvIGFsbCBz bGF2ZXMgZm9yIHRoZXNlDQo+DQo+ICsJCSAqIG1vZGUsIG5vIG5lZWQgdG8gdXBkYXRlIGZvciBi b25kaW5nIGRldmljZS4NCj4NCj4gKwkJICovDQo+DQo+ICsJCWJyZWFrOw0KPg0KPiArCWNhc2Ug Qk9ORElOR19NT0RFX0FDVElWRV9CQUNLVVA6DQo+DQo+ICsJY2FzZSBCT05ESU5HX01PREVfVExC Og0KPg0KPiArCWNhc2UgQk9ORElOR19NT0RFX0FMQjoNCj4NCj4gKwlkZWZhdWx0Og0KPg0KPiAr CQkvKiBBcyBwcm9taXNjdW91cyBtb2RlIGlzIHByb3BhZ2F0ZWQgb25seSB0byBwcmltYXJ5IHNs YXZlDQo+DQo+ICsJCSAqIGZvciB0aGVzZSBtb2RlLiBXaGVuIGFjdGl2ZS9zdGFuZGJ5IHN3aXRj aG92ZXIsIHByb21pc2N1b3VzDQo+DQo+ICsJCSAqIG1vZGUgc2hvdWxkIGJlIHNldCB0byBuZXcg cHJpbWFyeSBzbGF2ZSBhY2NvcmRpbmcgdG8gYm9uZGluZw0KPg0KPiArCQkgKiBkZXZpY2UuDQo+ DQo+ICsJCSAqLw0KPg0KPiArCQlpZiAocnRlX2V0aF9wcm9taXNjdW91c19nZXQoaW50ZXJuYWxz LT5wb3J0X2lkKSA9PSAxKQ0KPg0KPiArCQkJcnRlX2V0aF9wcm9taXNjdW91c19lbmFibGUocG9y dF9pZCk7DQo+DQo+ICsJCWVsc2UNCj4NCj4gKwkJCXJ0ZV9ldGhfcHJvbWlzY3VvdXNfZGlzYWJs ZShwb3J0X2lkKTsNCj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwlyZXR1cm4gMDsNCj4NCj4gK30N Cj4NCj4gKw0KPg0KPiArc3RhdGljIGludA0KPg0KPiArYm9uZF9ldGhkZXZfYWxsbXVsdGljYXN0 X2VuYWJsZShzdHJ1Y3QgcnRlX2V0aF9kZXYgKmV0aF9kZXYpDQo+DQo+ICt7DQo+DQo+ICsJc3Ry dWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFscyA9IGV0aF9kZXYtPmRhdGEtPmRldl9wcml2 YXRlOw0KPg0KPiArCWludCBpOw0KPg0KPiArCWludCByZXQgPSAwOw0KPg0KPiArCXVpbnQxNl90 IHBvcnRfaWQ7DQo+DQo+ICsNCj4NCj4gKwlzd2l0Y2ggKGludGVybmFscy0+bW9kZSkgew0KPg0K PiArCS8qIGFsbG11bHRpIG1vZGUgaXMgcHJvcGFnYXRlZCB0byBhbGwgc2xhdmVzICovDQo+DQo+ ICsJY2FzZSBCT05ESU5HX01PREVfUk9VTkRfUk9CSU46DQo+DQo+ICsJY2FzZSBCT05ESU5HX01P REVfQkFMQU5DRToNCj4NCj4gKwljYXNlIEJPTkRJTkdfTU9ERV9CUk9BRENBU1Q6DQo+DQo+ICsJ Y2FzZSBCT05ESU5HX01PREVfODAyM0FEOiB7DQo+DQo+ICsJCXVuc2lnbmVkIGludCBzbGF2ZV9v ayA9IDA7DQo+DQo+ICsNCj4NCj4gKwkJZm9yIChpID0gMDsgaSA8IGludGVybmFscy0+c2xhdmVf Y291bnQ7IGkrKykgew0KPg0KPiArCQkJcG9ydF9pZCA9IGludGVybmFscy0+c2xhdmVzW2ldLnBv cnRfaWQ7DQo+DQo+ICsNCj4NCj4gKwkJCXJldCA9IHJ0ZV9ldGhfYWxsbXVsdGljYXN0X2VuYWJs ZShwb3J0X2lkKTsNCj4NCj4gKwkJCWlmIChyZXQgIT0gMCkNCj4NCj4gKwkJCQlSVEVfQk9ORF9M T0coRVJSLA0KPg0KPiArCQkJCQkiRmFpbGVkIHRvIGVuYWJsZSBhbGxtdWx0aSBtb2RlIGZvciBw b3J0ICV1OiAlcyIsDQo+DQo+ICsJCQkJCXBvcnRfaWQsIHJ0ZV9zdHJlcnJvcigtcmV0KSk7DQo+ DQo+ICsJCQllbHNlDQo+DQo+ICsJCQkJc2xhdmVfb2srKzsNCj4NCj4gKwkJfQ0KPg0KPiArCQkv Kg0KPg0KPiArCQkgKiBSZXBvcnQgc3VjY2VzcyBpZiBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCBv biBhdCBsZWFzdA0KPg0KPiArCQkgKiBvbiBvbmUgc2xhdmUuIE90aGVyd2lzZSByZXR1cm4gbGFz dCBlcnJvciBjb2RlLg0KPg0KPiArCQkgKi8NCj4NCj4gKwkJaWYgKHNsYXZlX29rID4gMCkNCj4N Cj4gKwkJCXJldCA9IDA7DQo+DQo+ICsJCWJyZWFrOw0KPg0KPiArCX0NCj4NCj4gKwkvKiBhbGxt dWx0aSBtb2RlIGlzIHByb3BhZ2F0ZWQgb25seSB0byBwcmltYXJ5IHNsYXZlICovDQo+DQo+ICsJ Y2FzZSBCT05ESU5HX01PREVfQUNUSVZFX0JBQ0tVUDoNCj4NCj4gKwljYXNlIEJPTkRJTkdfTU9E RV9UTEI6DQo+DQo+ICsJY2FzZSBCT05ESU5HX01PREVfQUxCOg0KPg0KPiArCWRlZmF1bHQ6DQo+ DQo+ICsJCS8qIERvIG5vdCB0b3VjaCBhbGxtdWx0aSB3aGVuIHRoZXJlIGNhbm5vdCBiZSBwcmlt YXJ5IHBvcnRzICovDQo+DQo+ICsJCWlmIChpbnRlcm5hbHMtPnNsYXZlX2NvdW50ID09IDApDQo+ DQo+ICsJCQlicmVhazsNCj4NCj4gKwkJcG9ydF9pZCA9IGludGVybmFscy0+Y3VycmVudF9wcmlt YXJ5X3BvcnQ7DQo+DQo+ICsJCXJldCA9IHJ0ZV9ldGhfYWxsbXVsdGljYXN0X2VuYWJsZShwb3J0 X2lkKTsNCj4NCj4gKwkJaWYgKHJldCAhPSAwKQ0KPg0KPiArCQkJUlRFX0JPTkRfTE9HKEVSUiwN Cj4NCj4gKwkJCQkiRmFpbGVkIHRvIGVuYWJsZSBhbGxtdWx0aSBtb2RlIGZvciBwb3J0ICV1OiAl cyIsDQo+DQo+ICsJCQkJcG9ydF9pZCwgcnRlX3N0cmVycm9yKC1yZXQpKTsNCj4NCj4gKwl9DQo+ DQo+ICsNCj4NCj4gKwlyZXR1cm4gcmV0Ow0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICtzdGF0aWMg aW50DQo+DQo+ICtib25kX2V0aGRldl9hbGxtdWx0aWNhc3RfZGlzYWJsZShzdHJ1Y3QgcnRlX2V0 aF9kZXYgKmV0aF9kZXYpDQo+DQo+ICt7DQo+DQo+ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUg KmludGVybmFscyA9IGV0aF9kZXYtPmRhdGEtPmRldl9wcml2YXRlOw0KPg0KPiArCWludCBpOw0K Pg0KPiArCWludCByZXQgPSAwOw0KPg0KPiArCXVpbnQxNl90IHBvcnRfaWQ7DQo+DQo+ICsNCj4N Cj4gKwlzd2l0Y2ggKGludGVybmFscy0+bW9kZSkgew0KPg0KPiArCS8qIGFsbG11bHRpIG1vZGUg aXMgcHJvcGFnYXRlZCB0byBhbGwgc2xhdmVzICovDQo+DQo+ICsJY2FzZSBCT05ESU5HX01PREVf Uk9VTkRfUk9CSU46DQo+DQo+ICsJY2FzZSBCT05ESU5HX01PREVfQkFMQU5DRToNCj4NCj4gKwlj YXNlIEJPTkRJTkdfTU9ERV9CUk9BRENBU1Q6DQo+DQo+ICsJY2FzZSBCT05ESU5HX01PREVfODAy M0FEOiB7DQo+DQo+ICsJCXVuc2lnbmVkIGludCBzbGF2ZV9vayA9IDA7DQo+DQo+ICsNCj4NCj4g KwkJZm9yIChpID0gMDsgaSA8IGludGVybmFscy0+c2xhdmVfY291bnQ7IGkrKykgew0KPg0KPiAr CQkJdWludDE2X3QgcG9ydF9pZCA9IGludGVybmFscy0+c2xhdmVzW2ldLnBvcnRfaWQ7DQo+DQo+ ICsNCj4NCj4gKwkJCWlmIChpbnRlcm5hbHMtPm1vZGUgPT0gQk9ORElOR19NT0RFXzgwMjNBRCAm Jg0KPg0KPiArCQkJICAgIGJvbmRfbW9kZV84MDIzYWRfcG9ydHNbcG9ydF9pZF0uZm9yY2VkX3J4 X2ZsYWdzID09DQo+DQo+ICsJCQkJCUJPTkRfODAyM0FEX0ZPUkNFRF9BTExNVUxUSSkNCj4NCj4g KwkJCQljb250aW51ZTsNCj4NCj4gKw0KPg0KPiArCQkJcmV0ID0gcnRlX2V0aF9hbGxtdWx0aWNh c3RfZGlzYWJsZShwb3J0X2lkKTsNCj4NCj4gKwkJCWlmIChyZXQgIT0gMCkNCj4NCj4gKwkJCQlS VEVfQk9ORF9MT0coRVJSLA0KPg0KPiArCQkJCQkiRmFpbGVkIHRvIGRpc2FibGUgYWxsbXVsdGkg bW9kZSBmb3IgcG9ydCAldTogJXMiLA0KPg0KPiArCQkJCQlwb3J0X2lkLCBydGVfc3RyZXJyb3Io LXJldCkpOw0KPg0KPiArCQkJZWxzZQ0KPg0KPiArCQkJCXNsYXZlX29rKys7DQo+DQo+ICsJCX0N Cj4NCj4gKwkJLyoNCj4NCj4gKwkJICogUmVwb3J0IHN1Y2Nlc3MgaWYgb3BlcmF0aW9uIGlzIHN1 Y2Nlc3NmdWwgb24gYXQgbGVhc3QNCj4NCj4gKwkJICogb24gb25lIHNsYXZlLiBPdGhlcndpc2Ug cmV0dXJuIGxhc3QgZXJyb3IgY29kZS4NCj4NCj4gKwkJICovDQo+DQo+ICsJCWlmIChzbGF2ZV9v ayA+IDApDQo+DQo+ICsJCQlyZXQgPSAwOw0KPg0KPiArCQlicmVhazsNCj4NCj4gKwl9DQo+DQo+ ICsJLyogYWxsbXVsdGkgbW9kZSBpcyBwcm9wYWdhdGVkIG9ubHkgdG8gcHJpbWFyeSBzbGF2ZSAq Lw0KPg0KPiArCWNhc2UgQk9ORElOR19NT0RFX0FDVElWRV9CQUNLVVA6DQo+DQo+ICsJY2FzZSBC T05ESU5HX01PREVfVExCOg0KPg0KPiArCWNhc2UgQk9ORElOR19NT0RFX0FMQjoNCj4NCj4gKwlk ZWZhdWx0Og0KPg0KPiArCQkvKiBEbyBub3QgdG91Y2ggYWxsbXVsdGkgd2hlbiB0aGVyZSBjYW5u b3QgYmUgcHJpbWFyeSBwb3J0cyAqLw0KPg0KPiArCQlpZiAoaW50ZXJuYWxzLT5zbGF2ZV9jb3Vu dCA9PSAwKQ0KPg0KPiArCQkJYnJlYWs7DQo+DQo+ICsJCXBvcnRfaWQgPSBpbnRlcm5hbHMtPmN1 cnJlbnRfcHJpbWFyeV9wb3J0Ow0KPg0KPiArCQlyZXQgPSBydGVfZXRoX2FsbG11bHRpY2FzdF9k aXNhYmxlKHBvcnRfaWQpOw0KPg0KPiArCQlpZiAocmV0ICE9IDApDQo+DQo+ICsJCQlSVEVfQk9O RF9MT0coRVJSLA0KPg0KPiArCQkJCSJGYWlsZWQgdG8gZGlzYWJsZSBhbGxtdWx0aSBtb2RlIGZv ciBwb3J0ICV1OiAlcyIsDQo+DQo+ICsJCQkJcG9ydF9pZCwgcnRlX3N0cmVycm9yKC1yZXQpKTsN Cj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwlyZXR1cm4gcmV0Ow0KPg0KPiArfQ0KPg0KPiArDQo+ DQo+ICtzdGF0aWMgaW50DQo+DQo+ICtib25kX2V0aGRldl9hbGxtdWx0aWNhc3RfdXBkYXRlKHN0 cnVjdCBydGVfZXRoX2RldiAqZGV2KQ0KPg0KPiArew0KPg0KPiArCXN0cnVjdCBib25kX2Rldl9w cml2YXRlICppbnRlcm5hbHMgPSBkZXYtPmRhdGEtPmRldl9wcml2YXRlOw0KPg0KPiArCXVpbnQx Nl90IHBvcnRfaWQgPSBpbnRlcm5hbHMtPmN1cnJlbnRfcHJpbWFyeV9wb3J0Ow0KPg0KPiArDQo+ DQo+ICsJc3dpdGNoIChpbnRlcm5hbHMtPm1vZGUpIHsNCj4NCj4gKwljYXNlIEJPTkRJTkdfTU9E RV9ST1VORF9ST0JJTjoNCj4NCj4gKwljYXNlIEJPTkRJTkdfTU9ERV9CQUxBTkNFOg0KPg0KPiAr CWNhc2UgQk9ORElOR19NT0RFX0JST0FEQ0FTVDoNCj4NCj4gKwljYXNlIEJPTkRJTkdfTU9ERV84 MDIzQUQ6DQo+DQo+ICsJCS8qIEFzIGFsbG11bHRpY2FzdCBtb2RlIGlzIHByb3BhZ2F0ZWQgdG8g YWxsIHNsYXZlcyBmb3IgdGhlc2UNCj4NCj4gKwkJICogbW9kZSwgbm8gbmVlZCB0byB1cGRhdGUg Zm9yIGJvbmRpbmcgZGV2aWNlLg0KPg0KPiArCQkgKi8NCj4NCj4gKwkJYnJlYWs7DQo+DQo+ICsJ Y2FzZSBCT05ESU5HX01PREVfQUNUSVZFX0JBQ0tVUDoNCj4NCj4gKwljYXNlIEJPTkRJTkdfTU9E RV9UTEI6DQo+DQo+ICsJY2FzZSBCT05ESU5HX01PREVfQUxCOg0KPg0KPiArCWRlZmF1bHQ6DQo+ DQo+ICsJCS8qIEFzIGFsbG11bHRpY2FzdCBtb2RlIGlzIHByb3BhZ2F0ZWQgb25seSB0byBwcmlt YXJ5IHNsYXZlDQo+DQo+ICsJCSAqIGZvciB0aGVzZSBtb2RlLiBXaGVuIGFjdGl2ZS9zdGFuZGJ5 IHN3aXRjaG92ZXIsIGFsbG11bHRpY2FzdA0KPg0KPiArCQkgKiBtb2RlIHNob3VsZCBiZSBzZXQg dG8gbmV3IHByaW1hcnkgc2xhdmUgYWNjb3JkaW5nIHRvIGJvbmRpbmcNCj4NCj4gKwkJICogZGV2 aWNlLg0KPg0KPiArCQkgKi8NCj4NCj4gKwkJaWYgKHJ0ZV9ldGhfYWxsbXVsdGljYXN0X2dldChp bnRlcm5hbHMtPnBvcnRfaWQpID09IDEpDQo+DQo+ICsJCQlydGVfZXRoX2FsbG11bHRpY2FzdF9l bmFibGUocG9ydF9pZCk7DQo+DQo+ICsJCWVsc2UNCj4NCj4gKwkJCXJ0ZV9ldGhfYWxsbXVsdGlj YXN0X2Rpc2FibGUocG9ydF9pZCk7DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJcmV0dXJuIDA7 DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyB2b2lkDQo+DQo+ICtib25kX2V0aGRldl9k ZWxheWVkX2xzY19wcm9wYWdhdGlvbih2b2lkICphcmcpDQo+DQo+ICt7DQo+DQo+ICsJaWYgKGFy ZyA9PSBOVUxMKQ0KPg0KPiArCQlyZXR1cm47DQo+DQo+ICsNCj4NCj4gKwlydGVfZXRoX2Rldl9j YWxsYmFja19wcm9jZXNzKChzdHJ1Y3QgcnRlX2V0aF9kZXYgKilhcmcsDQo+DQo+ICsJCQlSVEVf RVRIX0VWRU5UX0lOVFJfTFNDLCBOVUxMKTsNCj4NCj4gK30NCj4NCj4gKw0KPg0KPiAraW50DQo+ DQo+ICtib25kX2V0aGRldl9sc2NfZXZlbnRfY2FsbGJhY2sodWludDE2X3QgcG9ydF9pZCwgZW51 bSBydGVfZXRoX2V2ZW50X3R5cGUgdHlwZSwNCj4NCj4gKwkJdm9pZCAqcGFyYW0sIHZvaWQgKnJl dF9wYXJhbSBfX3J0ZV91bnVzZWQpDQo+DQo+ICt7DQo+DQo+ICsJc3RydWN0IHJ0ZV9ldGhfZGV2 ICpib25kZWRfZXRoX2RldjsNCj4NCj4gKwlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJu YWxzOw0KPg0KPiArCXN0cnVjdCBydGVfZXRoX2xpbmsgbGluazsNCj4NCj4gKwlpbnQgcmMgPSAt MTsNCj4NCj4gKwlpbnQgcmV0Ow0KPg0KPiArDQo+DQo+ICsJdWludDhfdCBsc2NfZmxhZyA9IDA7 DQo+DQo+ICsJaW50IHZhbGlkX3NsYXZlID0gMDsNCj4NCj4gKwl1aW50MTZfdCBhY3RpdmVfcG9z Ow0KPg0KPiArCXVpbnQxNl90IGk7DQo+DQo+ICsNCj4NCj4gKwlpZiAodHlwZSAhPSBSVEVfRVRI X0VWRU5UX0lOVFJfTFNDIHx8IHBhcmFtID09IE5VTEwpDQo+DQo+ICsJCXJldHVybiByYzsNCj4N Cj4gKw0KPg0KPiArCWJvbmRlZF9ldGhfZGV2ID0gJnJ0ZV9ldGhfZGV2aWNlc1sqKHVpbnQxNl90 ICopcGFyYW1dOw0KPg0KPiArDQo+DQo+ICsJaWYgKGNoZWNrX2Zvcl9ib25kZWRfZXRoZGV2KGJv bmRlZF9ldGhfZGV2KSkNCj4NCj4gKwkJcmV0dXJuIHJjOw0KPg0KPiArDQo+DQo+ICsJaW50ZXJu YWxzID0gYm9uZGVkX2V0aF9kZXYtPmRhdGEtPmRldl9wcml2YXRlOw0KPg0KPiArDQo+DQo+ICsJ LyogSWYgdGhlIGRldmljZSBpc24ndCBzdGFydGVkIGRvbid0IGhhbmRsZSBpbnRlcnJ1cHRzICov DQo+DQo+ICsJaWYgKCFib25kZWRfZXRoX2Rldi0+ZGF0YS0+ZGV2X3N0YXJ0ZWQpDQo+DQo+ICsJ CXJldHVybiByYzsNCj4NCj4gKw0KPg0KPiArCS8qIHZlcmlmeSB0aGF0IHBvcnRfaWQgaXMgYSB2 YWxpZCBzbGF2ZSBvZiBib25kZWQgcG9ydCAqLw0KPg0KPiArCWZvciAoaSA9IDA7IGkgPCBpbnRl cm5hbHMtPnNsYXZlX2NvdW50OyBpKyspIHsNCj4NCj4gKwkJaWYgKGludGVybmFscy0+c2xhdmVz W2ldLnBvcnRfaWQgPT0gcG9ydF9pZCkgew0KPg0KPiArCQkJdmFsaWRfc2xhdmUgPSAxOw0KPg0K PiArCQkJYnJlYWs7DQo+DQo+ICsJCX0NCj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwlpZiAoIXZh bGlkX3NsYXZlKQ0KPg0KPiArCQlyZXR1cm4gcmM7DQo+DQo+ICsNCj4NCj4gKwkvKiBTeW5jaHJv bml6ZSBsc2MgY2FsbGJhY2sgcGFyYWxsZWwgY2FsbHMgZWl0aGVyIGJ5IHJlYWwgbGluayBldmVu dA0KPg0KPiArCSAqIGZyb20gdGhlIHNsYXZlcyBQTURzIG9yIGJ5IHRoZSBib25kaW5nIFBNRCBp dHNlbGYuDQo+DQo+ICsJICovDQo+DQo+ICsJcnRlX3NwaW5sb2NrX2xvY2soJmludGVybmFscy0+ bHNjX2xvY2spOw0KPg0KPiArDQo+DQo+ICsJLyogU2VhcmNoIGZvciBwb3J0IGluIGFjdGl2ZSBw b3J0IGxpc3QgKi8NCj4NCj4gKwlhY3RpdmVfcG9zID0gZmluZF9zbGF2ZV9ieV9pZChpbnRlcm5h bHMtPmFjdGl2ZV9zbGF2ZXMsDQo+DQo+ICsJCQlpbnRlcm5hbHMtPmFjdGl2ZV9zbGF2ZV9jb3Vu dCwgcG9ydF9pZCk7DQo+DQo+ICsNCj4NCj4gKwlyZXQgPSBydGVfZXRoX2xpbmtfZ2V0X25vd2Fp dChwb3J0X2lkLCAmbGluayk7DQo+DQo+ICsJaWYgKHJldCA8IDApDQo+DQo+ICsJCVJURV9CT05E X0xPRyhFUlIsICJTbGF2ZSAocG9ydCAldSkgbGluayBnZXQgZmFpbGVkIiwgcG9ydF9pZCk7DQo+ DQo+ICsNCj4NCj4gKwlpZiAocmV0ID09IDAgJiYgbGluay5saW5rX3N0YXR1cykgew0KPg0KPiAr CQlpZiAoYWN0aXZlX3BvcyA8IGludGVybmFscy0+YWN0aXZlX3NsYXZlX2NvdW50KQ0KPg0KPiAr CQkJZ290byBsaW5rX3VwZGF0ZTsNCj4NCj4gKw0KPg0KPiArCQkvKiBjaGVjayBsaW5rIHN0YXRl IHByb3BlcnRpZXMgaWYgYm9uZGVkIGxpbmsgaXMgdXAqLw0KPg0KPiArCQlpZiAoYm9uZGVkX2V0 aF9kZXYtPmRhdGEtPmRldl9saW5rLmxpbmtfc3RhdHVzID09IFJURV9FVEhfTElOS19VUCkgew0K Pg0KPiArCQkJaWYgKGxpbmtfcHJvcGVydGllc192YWxpZChib25kZWRfZXRoX2RldiwgJmxpbmsp ICE9IDApDQo+DQo+ICsJCQkJUlRFX0JPTkRfTE9HKEVSUiwgIkludmFsaWQgbGluayBwcm9wZXJ0 aWVzICINCj4NCj4gKwkJCQkJICAgICAiZm9yIHNsYXZlICVkIGluIGJvbmRpbmcgbW9kZSAlZCIs DQo+DQo+ICsJCQkJCSAgICAgcG9ydF9pZCwgaW50ZXJuYWxzLT5tb2RlKTsNCj4NCj4gKwkJfSBl bHNlIHsNCj4NCj4gKwkJCS8qIGluaGVyaXQgc2xhdmUgbGluayBwcm9wZXJ0aWVzICovDQo+DQo+ ICsJCQlsaW5rX3Byb3BlcnRpZXNfc2V0KGJvbmRlZF9ldGhfZGV2LCAmbGluayk7DQo+DQo+ICsJ CX0NCj4NCj4gKw0KPg0KPiArCQkvKiBJZiBubyBhY3RpdmUgc2xhdmUgcG9ydHMgdGhlbiBzZXQg dGhpcyBwb3J0IHRvIGJlDQo+DQo+ICsJCSAqIHRoZSBwcmltYXJ5IHBvcnQuDQo+DQo+ICsJCSAq Lw0KPg0KPiArCQlpZiAoaW50ZXJuYWxzLT5hY3RpdmVfc2xhdmVfY291bnQgPCAxKSB7DQo+DQo+ ICsJCQkvKiBJZiBmaXJzdCBhY3RpdmUgc2xhdmUsIHRoZW4gY2hhbmdlIGxpbmsgc3RhdHVzICov DQo+DQo+ICsJCQlib25kZWRfZXRoX2Rldi0+ZGF0YS0+ZGV2X2xpbmsubGlua19zdGF0dXMgPQ0K Pg0KPiArCQkJCQkJCQlSVEVfRVRIX0xJTktfVVA7DQo+DQo+ICsJCQlpbnRlcm5hbHMtPmN1cnJl bnRfcHJpbWFyeV9wb3J0ID0gcG9ydF9pZDsNCj4NCj4gKwkJCWxzY19mbGFnID0gMTsNCj4NCj4g Kw0KPg0KPiArCQkJbWFjX2FkZHJlc3Nfc2xhdmVzX3VwZGF0ZShib25kZWRfZXRoX2Rldik7DQo+ DQo+ICsJCQlib25kX2V0aGRldl9wcm9taXNjdW91c191cGRhdGUoYm9uZGVkX2V0aF9kZXYpOw0K Pg0KPiArCQkJYm9uZF9ldGhkZXZfYWxsbXVsdGljYXN0X3VwZGF0ZShib25kZWRfZXRoX2Rldik7 DQo+DQo+ICsJCX0NCj4NCj4gKw0KPg0KPiArCQlhY3RpdmF0ZV9zbGF2ZShib25kZWRfZXRoX2Rl diwgcG9ydF9pZCk7DQo+DQo+ICsNCj4NCj4gKwkJLyogSWYgdGhlIHVzZXIgaGFzIGRlZmluZWQg dGhlIHByaW1hcnkgcG9ydCB0aGVuIGRlZmF1bHQgdG8NCj4NCj4gKwkJICogdXNpbmcgaXQuDQo+ DQo+ICsJCSAqLw0KPg0KPiArCQlpZiAoaW50ZXJuYWxzLT51c2VyX2RlZmluZWRfcHJpbWFyeV9w b3J0ICYmDQo+DQo+ICsJCQkJaW50ZXJuYWxzLT5wcmltYXJ5X3BvcnQgPT0gcG9ydF9pZCkNCj4N Cj4gKwkJCWJvbmRfZXRoZGV2X3ByaW1hcnlfc2V0KGludGVybmFscywgcG9ydF9pZCk7DQo+DQo+ ICsJfSBlbHNlIHsNCj4NCj4gKwkJaWYgKGFjdGl2ZV9wb3MgPT0gaW50ZXJuYWxzLT5hY3RpdmVf c2xhdmVfY291bnQpDQo+DQo+ICsJCQlnb3RvIGxpbmtfdXBkYXRlOw0KPg0KPiArDQo+DQo+ICsJ CS8qIFJlbW92ZSBmcm9tIGFjdGl2ZSBzbGF2ZSBsaXN0ICovDQo+DQo+ICsJCWRlYWN0aXZhdGVf c2xhdmUoYm9uZGVkX2V0aF9kZXYsIHBvcnRfaWQpOw0KPg0KPiArDQo+DQo+ICsJCWlmIChpbnRl cm5hbHMtPmFjdGl2ZV9zbGF2ZV9jb3VudCA8IDEpDQo+DQo+ICsJCQlsc2NfZmxhZyA9IDE7DQo+ DQo+ICsNCj4NCj4gKwkJLyogVXBkYXRlIHByaW1hcnkgaWQsIHRha2UgZmlyc3QgYWN0aXZlIHNs YXZlIGZyb20gbGlzdCBvciBpZiBub25lDQo+DQo+ICsJCSAqIGF2YWlsYWJsZSBzZXQgdG8gLTEg Ki8NCj4NCj4gKwkJaWYgKHBvcnRfaWQgPT0gaW50ZXJuYWxzLT5jdXJyZW50X3ByaW1hcnlfcG9y dCkgew0KPg0KPiArCQkJaWYgKGludGVybmFscy0+YWN0aXZlX3NsYXZlX2NvdW50ID4gMCkNCj4N Cj4gKwkJCQlib25kX2V0aGRldl9wcmltYXJ5X3NldChpbnRlcm5hbHMsDQo+DQo+ICsJCQkJCQlp bnRlcm5hbHMtPmFjdGl2ZV9zbGF2ZXNbMF0pOw0KPg0KPiArCQkJZWxzZQ0KPg0KPiArCQkJCWlu dGVybmFscy0+Y3VycmVudF9wcmltYXJ5X3BvcnQgPSBpbnRlcm5hbHMtPnByaW1hcnlfcG9ydDsN Cj4NCj4gKwkJCW1hY19hZGRyZXNzX3NsYXZlc191cGRhdGUoYm9uZGVkX2V0aF9kZXYpOw0KPg0K PiArCQkJYm9uZF9ldGhkZXZfcHJvbWlzY3VvdXNfdXBkYXRlKGJvbmRlZF9ldGhfZGV2KTsNCj4N Cj4gKwkJCWJvbmRfZXRoZGV2X2FsbG11bHRpY2FzdF91cGRhdGUoYm9uZGVkX2V0aF9kZXYpOw0K Pg0KPiArCQl9DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICtsaW5rX3VwZGF0ZToNCj4NCj4gKwkv KioNCj4NCj4gKwkgKiBVcGRhdGUgYm9uZGVkIGRldmljZSBsaW5rIHByb3BlcnRpZXMgYWZ0ZXIg YW55IGNoYW5nZSB0byBhY3RpdmUNCj4NCj4gKwkgKiBzbGF2ZXMNCj4NCj4gKwkgKi8NCj4NCj4g Kwlib25kX2V0aGRldl9saW5rX3VwZGF0ZShib25kZWRfZXRoX2RldiwgMCk7DQo+DQo+ICsNCj4N Cj4gKwlpZiAobHNjX2ZsYWcpIHsNCj4NCj4gKwkJLyogQ2FuY2VsIGFueSBwb3NzaWJsZSBvdXRz dGFuZGluZyBpbnRlcnJ1cHRzIGlmIGRlbGF5cyBhcmUgZW5hYmxlZCAqLw0KPg0KPiArCQlpZiAo aW50ZXJuYWxzLT5saW5rX3VwX2RlbGF5X21zID4gMCB8fA0KPg0KPiArCQkJaW50ZXJuYWxzLT5s aW5rX2Rvd25fZGVsYXlfbXMgPiAwKQ0KPg0KPiArCQkJcnRlX2VhbF9hbGFybV9jYW5jZWwoYm9u ZF9ldGhkZXZfZGVsYXllZF9sc2NfcHJvcGFnYXRpb24sDQo+DQo+ICsJCQkJCWJvbmRlZF9ldGhf ZGV2KTsNCj4NCj4gKw0KPg0KPiArCQlpZiAoYm9uZGVkX2V0aF9kZXYtPmRhdGEtPmRldl9saW5r Lmxpbmtfc3RhdHVzKSB7DQo+DQo+ICsJCQlpZiAoaW50ZXJuYWxzLT5saW5rX3VwX2RlbGF5X21z ID4gMCkNCj4NCj4gKwkJCQlydGVfZWFsX2FsYXJtX3NldChpbnRlcm5hbHMtPmxpbmtfdXBfZGVs YXlfbXMgKiAxMDAwLA0KPg0KPiArCQkJCQkJYm9uZF9ldGhkZXZfZGVsYXllZF9sc2NfcHJvcGFn YXRpb24sDQo+DQo+ICsJCQkJCQkodm9pZCAqKWJvbmRlZF9ldGhfZGV2KTsNCj4NCj4gKwkJCWVs c2UNCj4NCj4gKwkJCQlydGVfZXRoX2Rldl9jYWxsYmFja19wcm9jZXNzKGJvbmRlZF9ldGhfZGV2 LA0KPg0KPiArCQkJCQkJUlRFX0VUSF9FVkVOVF9JTlRSX0xTQywNCj4NCj4gKwkJCQkJCU5VTEwp Ow0KPg0KPiArDQo+DQo+ICsJCX0gZWxzZSB7DQo+DQo+ICsJCQlpZiAoaW50ZXJuYWxzLT5saW5r X2Rvd25fZGVsYXlfbXMgPiAwKQ0KPg0KPiArCQkJCXJ0ZV9lYWxfYWxhcm1fc2V0KGludGVybmFs cy0+bGlua19kb3duX2RlbGF5X21zICogMTAwMCwNCj4NCj4gKwkJCQkJCWJvbmRfZXRoZGV2X2Rl bGF5ZWRfbHNjX3Byb3BhZ2F0aW9uLA0KPg0KPiArCQkJCQkJKHZvaWQgKilib25kZWRfZXRoX2Rl dik7DQo+DQo+ICsJCQllbHNlDQo+DQo+ICsJCQkJcnRlX2V0aF9kZXZfY2FsbGJhY2tfcHJvY2Vz cyhib25kZWRfZXRoX2RldiwNCj4NCj4gKwkJCQkJCVJURV9FVEhfRVZFTlRfSU5UUl9MU0MsDQo+ DQo+ICsJCQkJCQlOVUxMKTsNCj4NCj4gKwkJfQ0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCXJ0 ZV9zcGlubG9ja191bmxvY2soJmludGVybmFscy0+bHNjX2xvY2spOw0KPg0KPiArDQo+DQo+ICsJ cmV0dXJuIHJjOw0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICtzdGF0aWMgaW50DQo+DQo+ICtib25k X2V0aGRldl9yc3NfcmV0YV91cGRhdGUoc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYsDQo+DQo+ICsJ CXN0cnVjdCBydGVfZXRoX3Jzc19yZXRhX2VudHJ5NjQgKnJldGFfY29uZiwgdWludDE2X3QgcmV0 YV9zaXplKQ0KPg0KPiArew0KPg0KPiArCXVuc2lnbmVkIGksIGo7DQo+DQo+ICsJaW50IHJlc3Vs dCA9IDA7DQo+DQo+ICsJaW50IHNsYXZlX3JldGFfc2l6ZTsNCj4NCj4gKwl1bnNpZ25lZCByZXRh X2NvdW50Ow0KPg0KPiArCXN0cnVjdCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHMgPSBkZXYt PmRhdGEtPmRldl9wcml2YXRlOw0KPg0KPiArDQo+DQo+ICsJaWYgKHJldGFfc2l6ZSAhPSBpbnRl cm5hbHMtPnJldGFfc2l6ZSkNCj4NCj4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+DQo+ICsNCj4NCj4g KwkgLyogQ29weSBSRVRBIHRhYmxlICovDQo+DQo+ICsJcmV0YV9jb3VudCA9IChyZXRhX3NpemUg KyBSVEVfRVRIX1JFVEFfR1JPVVBfU0laRSAtIDEpIC8NCj4NCj4gKwkJCVJURV9FVEhfUkVUQV9H Uk9VUF9TSVpFOw0KPg0KPiArDQo+DQo+ICsJZm9yIChpID0gMDsgaSA8IHJldGFfY291bnQ7IGkr Kykgew0KPg0KPiArCQlpbnRlcm5hbHMtPnJldGFfY29uZltpXS5tYXNrID0gcmV0YV9jb25mW2ld Lm1hc2s7DQo+DQo+ICsJCWZvciAoaiA9IDA7IGogPCBSVEVfRVRIX1JFVEFfR1JPVVBfU0laRTsg aisrKQ0KPg0KPiArCQkJaWYgKChyZXRhX2NvbmZbaV0ubWFzayA+PiBqKSAmIDB4MDEpDQo+DQo+ ICsJCQkJaW50ZXJuYWxzLT5yZXRhX2NvbmZbaV0ucmV0YVtqXSA9IHJldGFfY29uZltpXS5yZXRh W2pdOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCS8qIEZpbGwgcmVzdCBvZiBhcnJheSAqLw0K Pg0KPiArCWZvciAoOyBpIDwgUlRFX0RJTShpbnRlcm5hbHMtPnJldGFfY29uZik7IGkgKz0gcmV0 YV9jb3VudCkNCj4NCj4gKwkJbWVtY3B5KCZpbnRlcm5hbHMtPnJldGFfY29uZltpXSwgJmludGVy bmFscy0+cmV0YV9jb25mWzBdLA0KPg0KPiArCQkJCXNpemVvZihpbnRlcm5hbHMtPnJldGFfY29u ZlswXSkgKiByZXRhX2NvdW50KTsNCj4NCj4gKw0KPg0KPiArCS8qIFByb3BhZ2F0ZSBSRVRBIG92 ZXIgc2xhdmVzICovDQo+DQo+ICsJZm9yIChpID0gMDsgaSA8IGludGVybmFscy0+c2xhdmVfY291 bnQ7IGkrKykgew0KPg0KPiArCQlzbGF2ZV9yZXRhX3NpemUgPSBpbnRlcm5hbHMtPnNsYXZlc1tp XS5yZXRhX3NpemU7DQo+DQo+ICsJCXJlc3VsdCA9IHJ0ZV9ldGhfZGV2X3Jzc19yZXRhX3VwZGF0 ZShpbnRlcm5hbHMtPnNsYXZlc1tpXS5wb3J0X2lkLA0KPg0KPiArCQkJCSZpbnRlcm5hbHMtPnJl dGFfY29uZlswXSwgc2xhdmVfcmV0YV9zaXplKTsNCj4NCj4gKwkJaWYgKHJlc3VsdCA8IDApDQo+ DQo+ICsJCQlyZXR1cm4gcmVzdWx0Ow0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCXJldHVybiAw Ow0KPg0KPiArfQ0KPg0KPiArDQo+DQo+ICtzdGF0aWMgaW50DQo+DQo+ICtib25kX2V0aGRldl9y c3NfcmV0YV9xdWVyeShzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwNCj4NCj4gKwkJc3RydWN0IHJ0 ZV9ldGhfcnNzX3JldGFfZW50cnk2NCAqcmV0YV9jb25mLCB1aW50MTZfdCByZXRhX3NpemUpDQo+ DQo+ICt7DQo+DQo+ICsJaW50IGksIGo7DQo+DQo+ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUg KmludGVybmFscyA9IGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsNCj4NCj4gKwlpZiAo cmV0YV9zaXplICE9IGludGVybmFscy0+cmV0YV9zaXplKQ0KPg0KPiArCQlyZXR1cm4gLUVJTlZB TDsNCj4NCj4gKw0KPg0KPiArCSAvKiBDb3B5IFJFVEEgdGFibGUgKi8NCj4NCj4gKwlmb3IgKGkg PSAwOyBpIDwgcmV0YV9zaXplIC8gUlRFX0VUSF9SRVRBX0dST1VQX1NJWkU7IGkrKykNCj4NCj4g KwkJZm9yIChqID0gMDsgaiA8IFJURV9FVEhfUkVUQV9HUk9VUF9TSVpFOyBqKyspDQo+DQo+ICsJ CQlpZiAoKHJldGFfY29uZltpXS5tYXNrID4+IGopICYgMHgwMSkNCj4NCj4gKwkJCQlyZXRhX2Nv bmZbaV0ucmV0YVtqXSA9IGludGVybmFscy0+cmV0YV9jb25mW2ldLnJldGFbal07DQo+DQo+ICsN Cj4NCj4gKwlyZXR1cm4gMDsNCj4NCj4gK30NCj4NCj4gKw0KPg0KPiArc3RhdGljIGludA0KPg0K PiArYm9uZF9ldGhkZXZfcnNzX2hhc2hfdXBkYXRlKHN0cnVjdCBydGVfZXRoX2RldiAqZGV2LA0K Pg0KPiArCQlzdHJ1Y3QgcnRlX2V0aF9yc3NfY29uZiAqcnNzX2NvbmYpDQo+DQo+ICt7DQo+DQo+ ICsJaW50IGksIHJlc3VsdCA9IDA7DQo+DQo+ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmlu dGVybmFscyA9IGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsJc3RydWN0IHJ0ZV9ldGhf cnNzX2NvbmYgYm9uZF9yc3NfY29uZjsNCj4NCj4gKw0KPg0KPiArCW1lbWNweSgmYm9uZF9yc3Nf Y29uZiwgcnNzX2NvbmYsIHNpemVvZihzdHJ1Y3QgcnRlX2V0aF9yc3NfY29uZikpOw0KPg0KPiAr DQo+DQo+ICsJYm9uZF9yc3NfY29uZi5yc3NfaGYgJj0gaW50ZXJuYWxzLT5mbG93X3R5cGVfcnNz X29mZmxvYWRzOw0KPg0KPiArDQo+DQo+ICsJaWYgKGJvbmRfcnNzX2NvbmYucnNzX2hmICE9IDAp DQo+DQo+ICsJCWRldi0+ZGF0YS0+ZGV2X2NvbmYucnhfYWR2X2NvbmYucnNzX2NvbmYucnNzX2hm ID0gYm9uZF9yc3NfY29uZi5yc3NfaGY7DQo+DQo+ICsNCj4NCj4gKwlpZiAoYm9uZF9yc3NfY29u Zi5yc3Nfa2V5KSB7DQo+DQo+ICsJCWlmIChib25kX3Jzc19jb25mLnJzc19rZXlfbGVuIDwgaW50 ZXJuYWxzLT5yc3Nfa2V5X2xlbikNCj4NCj4gKwkJCXJldHVybiAtRUlOVkFMOw0KPg0KPiArCQll bHNlIGlmIChib25kX3Jzc19jb25mLnJzc19rZXlfbGVuID4gaW50ZXJuYWxzLT5yc3Nfa2V5X2xl bikNCj4NCj4gKwkJCVJURV9CT05EX0xPRyhXQVJOSU5HLCAicnNzX2tleSB3aWxsIGJlIHRydW5j YXRlZCIpOw0KPg0KPiArDQo+DQo+ICsJCW1lbWNweShpbnRlcm5hbHMtPnJzc19rZXksIGJvbmRf cnNzX2NvbmYucnNzX2tleSwNCj4NCj4gKwkJCQlpbnRlcm5hbHMtPnJzc19rZXlfbGVuKTsNCj4N Cj4gKwkJYm9uZF9yc3NfY29uZi5yc3Nfa2V5X2xlbiA9IGludGVybmFscy0+cnNzX2tleV9sZW47 DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJZm9yIChpID0gMDsgaSA8IGludGVybmFscy0+c2xh dmVfY291bnQ7IGkrKykgew0KPg0KPiArCQlyZXN1bHQgPSBydGVfZXRoX2Rldl9yc3NfaGFzaF91 cGRhdGUoaW50ZXJuYWxzLT5zbGF2ZXNbaV0ucG9ydF9pZCwNCj4NCj4gKwkJCQkmYm9uZF9yc3Nf Y29uZik7DQo+DQo+ICsJCWlmIChyZXN1bHQgPCAwKQ0KPg0KPiArCQkJcmV0dXJuIHJlc3VsdDsN Cj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwlyZXR1cm4gMDsNCj4NCj4gK30NCj4NCj4gKw0KPg0K PiArc3RhdGljIGludA0KPg0KPiArYm9uZF9ldGhkZXZfcnNzX2hhc2hfY29uZl9nZXQoc3RydWN0 IHJ0ZV9ldGhfZGV2ICpkZXYsDQo+DQo+ICsJCXN0cnVjdCBydGVfZXRoX3Jzc19jb25mICpyc3Nf Y29uZikNCj4NCj4gK3sNCj4NCj4gKwlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxz ID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsNCj4NCj4gKw0KPg0KPiArCXJzc19jb25mLT5yc3Nf aGYgPSBkZXYtPmRhdGEtPmRldl9jb25mLnJ4X2Fkdl9jb25mLnJzc19jb25mLnJzc19oZjsNCj4N Cj4gKwlyc3NfY29uZi0+cnNzX2tleV9sZW4gPSBpbnRlcm5hbHMtPnJzc19rZXlfbGVuOw0KPg0K PiArCWlmIChyc3NfY29uZi0+cnNzX2tleSkNCj4NCj4gKwkJbWVtY3B5KHJzc19jb25mLT5yc3Nf a2V5LCBpbnRlcm5hbHMtPnJzc19rZXksIGludGVybmFscy0+cnNzX2tleV9sZW4pOw0KPg0KPiAr DQo+DQo+ICsJcmV0dXJuIDA7DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyBpbnQNCj4N Cj4gK2JvbmRfZXRoZGV2X210dV9zZXQoc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYsIHVpbnQxNl90 IG10dSkNCj4NCj4gK3sNCj4NCj4gKwlzdHJ1Y3QgcnRlX2V0aF9kZXYgKnNsYXZlX2V0aF9kZXY7 DQo+DQo+ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFscyA9IGRldi0+ZGF0YS0+ ZGV2X3ByaXZhdGU7DQo+DQo+ICsJaW50IHJldCwgaTsNCj4NCj4gKw0KPg0KPiArCXJ0ZV9zcGlu bG9ja19sb2NrKCZpbnRlcm5hbHMtPmxvY2spOw0KPg0KPiArDQo+DQo+ICsJZm9yIChpID0gMDsg aSA8IGludGVybmFscy0+c2xhdmVfY291bnQ7IGkrKykgew0KPg0KPiArCQlzbGF2ZV9ldGhfZGV2 ID0gJnJ0ZV9ldGhfZGV2aWNlc1tpbnRlcm5hbHMtPnNsYXZlc1tpXS5wb3J0X2lkXTsNCj4NCj4g KwkJaWYgKCpzbGF2ZV9ldGhfZGV2LT5kZXZfb3BzLT5tdHVfc2V0ID09IE5VTEwpIHsNCj4NCj4g KwkJCXJ0ZV9zcGlubG9ja191bmxvY2soJmludGVybmFscy0+bG9jayk7DQo+DQo+ICsJCQlyZXR1 cm4gLUVOT1RTVVA7DQo+DQo+ICsJCX0NCj4NCj4gKwl9DQo+DQo+ICsJZm9yIChpID0gMDsgaSA8 IGludGVybmFscy0+c2xhdmVfY291bnQ7IGkrKykgew0KPg0KPiArCQlyZXQgPSBydGVfZXRoX2Rl dl9zZXRfbXR1KGludGVybmFscy0+c2xhdmVzW2ldLnBvcnRfaWQsIG10dSk7DQo+DQo+ICsJCWlm IChyZXQgPCAwKSB7DQo+DQo+ICsJCQlydGVfc3BpbmxvY2tfdW5sb2NrKCZpbnRlcm5hbHMtPmxv Y2spOw0KPg0KPiArCQkJcmV0dXJuIHJldDsNCj4NCj4gKwkJfQ0KPg0KPiArCX0NCj4NCj4gKw0K Pg0KPiArCXJ0ZV9zcGlubG9ja191bmxvY2soJmludGVybmFscy0+bG9jayk7DQo+DQo+ICsJcmV0 dXJuIDA7DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyBpbnQNCj4NCj4gK2JvbmRfZXRo ZGV2X21hY19hZGRyZXNzX3NldChzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwNCj4NCj4gKwkJCXN0 cnVjdCBydGVfZXRoZXJfYWRkciAqYWRkcikNCj4NCj4gK3sNCj4NCj4gKwlpZiAobWFjX2FkZHJl c3Nfc2V0KGRldiwgYWRkcikpIHsNCj4NCj4gKwkJUlRFX0JPTkRfTE9HKEVSUiwgIkZhaWxlZCB0 byB1cGRhdGUgTUFDIGFkZHJlc3MiKTsNCj4NCj4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+DQo+ICsJ fQ0KPg0KPiArDQo+DQo+ICsJcmV0dXJuIDA7DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRp YyBpbnQNCj4NCj4gK2JvbmRfZmxvd19vcHNfZ2V0KHN0cnVjdCBydGVfZXRoX2RldiAqZGV2IF9f cnRlX3VudXNlZCwNCj4NCj4gKwkJICBjb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfb3BzICoqb3BzKQ0K Pg0KPiArew0KPg0KPiArCSpvcHMgPSAmYm9uZF9mbG93X29wczsNCj4NCj4gKwlyZXR1cm4gMDsN Cj4NCj4gK30NCj4NCj4gKw0KPg0KPiArc3RhdGljIGludA0KPg0KPiArYm9uZF9ldGhkZXZfbWFj X2FkZHJfYWRkKHN0cnVjdCBydGVfZXRoX2RldiAqZGV2LA0KPg0KPiArCQkJc3RydWN0IHJ0ZV9l dGhlcl9hZGRyICptYWNfYWRkciwNCj4NCj4gKwkJCV9fcnRlX3VudXNlZCB1aW50MzJfdCBpbmRl eCwgdWludDMyX3Qgdm1kcSkNCj4NCj4gK3sNCj4NCj4gKwlzdHJ1Y3QgcnRlX2V0aF9kZXYgKnNs YXZlX2V0aF9kZXY7DQo+DQo+ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmludGVybmFscyA9 IGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsJaW50IHJldCwgaTsNCj4NCj4gKw0KPg0K PiArCXJ0ZV9zcGlubG9ja19sb2NrKCZpbnRlcm5hbHMtPmxvY2spOw0KPg0KPiArDQo+DQo+ICsJ Zm9yIChpID0gMDsgaSA8IGludGVybmFscy0+c2xhdmVfY291bnQ7IGkrKykgew0KPg0KPiArCQlz bGF2ZV9ldGhfZGV2ID0gJnJ0ZV9ldGhfZGV2aWNlc1tpbnRlcm5hbHMtPnNsYXZlc1tpXS5wb3J0 X2lkXTsNCj4NCj4gKwkJaWYgKCpzbGF2ZV9ldGhfZGV2LT5kZXZfb3BzLT5tYWNfYWRkcl9hZGQg PT0gTlVMTCB8fA0KPg0KPiArCQkJICpzbGF2ZV9ldGhfZGV2LT5kZXZfb3BzLT5tYWNfYWRkcl9y ZW1vdmUgPT0gTlVMTCkgew0KPg0KPiArCQkJcmV0ID0gLUVOT1RTVVA7DQo+DQo+ICsJCQlnb3Rv IGVuZDsNCj4NCj4gKwkJfQ0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCWZvciAoaSA9IDA7IGkg PCBpbnRlcm5hbHMtPnNsYXZlX2NvdW50OyBpKyspIHsNCj4NCj4gKwkJcmV0ID0gcnRlX2V0aF9k ZXZfbWFjX2FkZHJfYWRkKGludGVybmFscy0+c2xhdmVzW2ldLnBvcnRfaWQsDQo+DQo+ICsJCQkJ bWFjX2FkZHIsIHZtZHEpOw0KPg0KPiArCQlpZiAocmV0IDwgMCkgew0KPg0KPiArCQkJLyogcm9s bGJhY2sgKi8NCj4NCj4gKwkJCWZvciAoaS0tOyBpID49IDA7IGktLSkNCj4NCj4gKwkJCQlydGVf ZXRoX2Rldl9tYWNfYWRkcl9yZW1vdmUoDQo+DQo+ICsJCQkJCWludGVybmFscy0+c2xhdmVzW2ld LnBvcnRfaWQsIG1hY19hZGRyKTsNCj4NCj4gKwkJCWdvdG8gZW5kOw0KPg0KPiArCQl9DQo+DQo+ ICsJfQ0KPg0KPiArDQo+DQo+ICsJcmV0ID0gMDsNCj4NCj4gK2VuZDoNCj4NCj4gKwlydGVfc3Bp bmxvY2tfdW5sb2NrKCZpbnRlcm5hbHMtPmxvY2spOw0KPg0KPiArCXJldHVybiByZXQ7DQo+DQo+ ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyB2b2lkDQo+DQo+ICtib25kX2V0aGRldl9tYWNfYWRk cl9yZW1vdmUoc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYsIHVpbnQzMl90IGluZGV4KQ0KPg0KPiAr ew0KPg0KPiArCXN0cnVjdCBydGVfZXRoX2RldiAqc2xhdmVfZXRoX2RldjsNCj4NCj4gKwlzdHJ1 Y3QgYm9uZF9kZXZfcHJpdmF0ZSAqaW50ZXJuYWxzID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsN Cj4NCj4gKwlpbnQgaTsNCj4NCj4gKw0KPg0KPiArCXJ0ZV9zcGlubG9ja19sb2NrKCZpbnRlcm5h bHMtPmxvY2spOw0KPg0KPiArDQo+DQo+ICsJZm9yIChpID0gMDsgaSA8IGludGVybmFscy0+c2xh dmVfY291bnQ7IGkrKykgew0KPg0KPiArCQlzbGF2ZV9ldGhfZGV2ID0gJnJ0ZV9ldGhfZGV2aWNl c1tpbnRlcm5hbHMtPnNsYXZlc1tpXS5wb3J0X2lkXTsNCj4NCj4gKwkJaWYgKCpzbGF2ZV9ldGhf ZGV2LT5kZXZfb3BzLT5tYWNfYWRkcl9yZW1vdmUgPT0gTlVMTCkNCj4NCj4gKwkJCWdvdG8gZW5k Ow0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCXN0cnVjdCBydGVfZXRoZXJfYWRkciAqbWFjX2Fk ZHIgPSAmZGV2LT5kYXRhLT5tYWNfYWRkcnNbaW5kZXhdOw0KPg0KPiArDQo+DQo+ICsJZm9yIChp ID0gMDsgaSA8IGludGVybmFscy0+c2xhdmVfY291bnQ7IGkrKykNCj4NCj4gKwkJcnRlX2V0aF9k ZXZfbWFjX2FkZHJfcmVtb3ZlKGludGVybmFscy0+c2xhdmVzW2ldLnBvcnRfaWQsDQo+DQo+ICsJ CQkJbWFjX2FkZHIpOw0KPg0KPiArDQo+DQo+ICtlbmQ6DQo+DQo+ICsJcnRlX3NwaW5sb2NrX3Vu bG9jaygmaW50ZXJuYWxzLT5sb2NrKTsNCj4NCj4gK30NCj4NCj4gKw0KPg0KPiArY29uc3Qgc3Ry dWN0IGV0aF9kZXZfb3BzIGRlZmF1bHRfZGV2X29wcyA9IHsNCj4NCj4gKwkuZGV2X3N0YXJ0ICAg ICAgICAgICAgPSBib25kX2V0aGRldl9zdGFydCwNCj4NCj4gKwkuZGV2X3N0b3AgICAgICAgICAg ICAgPSBib25kX2V0aGRldl9zdG9wLA0KPg0KPiArCS5kZXZfY2xvc2UgICAgICAgICAgICA9IGJv bmRfZXRoZGV2X2Nsb3NlLA0KPg0KPiArCS5kZXZfY29uZmlndXJlICAgICAgICA9IGJvbmRfZXRo ZGV2X2NvbmZpZ3VyZSwNCj4NCj4gKwkuZGV2X2luZm9zX2dldCAgICAgICAgPSBib25kX2V0aGRl dl9pbmZvLA0KPg0KPiArCS52bGFuX2ZpbHRlcl9zZXQgICAgICA9IGJvbmRfZXRoZGV2X3ZsYW5f ZmlsdGVyX3NldCwNCj4NCj4gKwkucnhfcXVldWVfc2V0dXAgICAgICAgPSBib25kX2V0aGRldl9y eF9xdWV1ZV9zZXR1cCwNCj4NCj4gKwkudHhfcXVldWVfc2V0dXAgICAgICAgPSBib25kX2V0aGRl dl90eF9xdWV1ZV9zZXR1cCwNCj4NCj4gKwkucnhfcXVldWVfcmVsZWFzZSAgICAgPSBib25kX2V0 aGRldl9yeF9xdWV1ZV9yZWxlYXNlLA0KPg0KPiArCS50eF9xdWV1ZV9yZWxlYXNlICAgICA9IGJv bmRfZXRoZGV2X3R4X3F1ZXVlX3JlbGVhc2UsDQo+DQo+ICsJLmxpbmtfdXBkYXRlICAgICAgICAg ID0gYm9uZF9ldGhkZXZfbGlua191cGRhdGUsDQo+DQo+ICsJLnN0YXRzX2dldCAgICAgICAgICAg ID0gYm9uZF9ldGhkZXZfc3RhdHNfZ2V0LA0KPg0KPiArCS5zdGF0c19yZXNldCAgICAgICAgICA9 IGJvbmRfZXRoZGV2X3N0YXRzX3Jlc2V0LA0KPg0KPiArCS5wcm9taXNjdW91c19lbmFibGUgICA9 IGJvbmRfZXRoZGV2X3Byb21pc2N1b3VzX2VuYWJsZSwNCj4NCj4gKwkucHJvbWlzY3VvdXNfZGlz YWJsZSAgPSBib25kX2V0aGRldl9wcm9taXNjdW91c19kaXNhYmxlLA0KPg0KPiArCS5hbGxtdWx0 aWNhc3RfZW5hYmxlICA9IGJvbmRfZXRoZGV2X2FsbG11bHRpY2FzdF9lbmFibGUsDQo+DQo+ICsJ LmFsbG11bHRpY2FzdF9kaXNhYmxlID0gYm9uZF9ldGhkZXZfYWxsbXVsdGljYXN0X2Rpc2FibGUs DQo+DQo+ICsJLnJldGFfdXBkYXRlICAgICAgICAgID0gYm9uZF9ldGhkZXZfcnNzX3JldGFfdXBk YXRlLA0KPg0KPiArCS5yZXRhX3F1ZXJ5ICAgICAgICAgICA9IGJvbmRfZXRoZGV2X3Jzc19yZXRh X3F1ZXJ5LA0KPg0KPiArCS5yc3NfaGFzaF91cGRhdGUgICAgICA9IGJvbmRfZXRoZGV2X3Jzc19o YXNoX3VwZGF0ZSwNCj4NCj4gKwkucnNzX2hhc2hfY29uZl9nZXQgICAgPSBib25kX2V0aGRldl9y c3NfaGFzaF9jb25mX2dldCwNCj4NCj4gKwkubXR1X3NldCAgICAgICAgICAgICAgPSBib25kX2V0 aGRldl9tdHVfc2V0LA0KPg0KPiArCS5tYWNfYWRkcl9zZXQgICAgICAgICA9IGJvbmRfZXRoZGV2 X21hY19hZGRyZXNzX3NldCwNCj4NCj4gKwkubWFjX2FkZHJfYWRkICAgICAgICAgPSBib25kX2V0 aGRldl9tYWNfYWRkcl9hZGQsDQo+DQo+ICsJLm1hY19hZGRyX3JlbW92ZSAgICAgID0gYm9uZF9l dGhkZXZfbWFjX2FkZHJfcmVtb3ZlLA0KPg0KPiArCS5mbG93X29wc19nZXQgICAgICAgICA9IGJv bmRfZmxvd19vcHNfZ2V0DQo+DQo+ICt9Ow0KPg0KPiArDQo+DQo+ICtzdGF0aWMgaW50DQo+DQo+ ICtib25kX2FsbG9jKHN0cnVjdCBydGVfdmRldl9kZXZpY2UgKmRldiwgdWludDhfdCBtb2RlKQ0K Pg0KPiArew0KPg0KPiArCWNvbnN0IGNoYXIgKm5hbWUgPSBydGVfdmRldl9kZXZpY2VfbmFtZShk ZXYpOw0KPg0KPiArCXVpbnQ4X3Qgc29ja2V0X2lkID0gZGV2LT5kZXZpY2UubnVtYV9ub2RlOw0K Pg0KPiArCXN0cnVjdCBib25kX2Rldl9wcml2YXRlICppbnRlcm5hbHMgPSBOVUxMOw0KPg0KPiAr CXN0cnVjdCBydGVfZXRoX2RldiAqZXRoX2RldiA9IE5VTEw7DQo+DQo+ICsJdWludDMyX3Qgdmxh bl9maWx0ZXJfYm1wX3NpemU7DQo+DQo+ICsNCj4NCj4gKwkvKiBub3cgZG8gYWxsIGRhdGEgYWxs b2NhdGlvbiAtIGZvciBldGhfZGV2IHN0cnVjdHVyZSwgZHVtbXkgcGNpIGRyaXZlcg0KPg0KPiAr CSAqIGFuZCBpbnRlcm5hbCAocHJpdmF0ZSkgZGF0YQ0KPg0KPiArCSAqLw0KPg0KPiArDQo+DQo+ ICsJLyogcmVzZXJ2ZSBhbiBldGhkZXYgZW50cnkgKi8NCj4NCj4gKwlldGhfZGV2ID0gcnRlX2V0 aF92ZGV2X2FsbG9jYXRlKGRldiwgc2l6ZW9mKCppbnRlcm5hbHMpKTsNCj4NCj4gKwlpZiAoZXRo X2RldiA9PSBOVUxMKSB7DQo+DQo+ICsJCVJURV9CT05EX0xPRyhFUlIsICJVbmFibGUgdG8gYWxs b2NhdGUgcnRlX2V0aF9kZXYiKTsNCj4NCj4gKwkJZ290byBlcnI7DQo+DQo+ICsJfQ0KPg0KPiAr DQo+DQo+ICsJaW50ZXJuYWxzID0gZXRoX2Rldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsJ ZXRoX2Rldi0+ZGF0YS0+bmJfcnhfcXVldWVzID0gKHVpbnQxNl90KTE7DQo+DQo+ICsJZXRoX2Rl di0+ZGF0YS0+bmJfdHhfcXVldWVzID0gKHVpbnQxNl90KTE7DQo+DQo+ICsNCj4NCj4gKwkvKiBB bGxvY2F0ZSBtZW1vcnkgZm9yIHN0b3JpbmcgTUFDIGFkZHJlc3NlcyAqLw0KPg0KPiArCWV0aF9k ZXYtPmRhdGEtPm1hY19hZGRycyA9IHJ0ZV96bWFsbG9jX3NvY2tldChuYW1lLCBSVEVfRVRIRVJf QUREUl9MRU4gKg0KPg0KPiArCQkJQk9ORF9NQVhfTUFDX0FERFJTLCAwLCBzb2NrZXRfaWQpOw0K Pg0KPiArCWlmIChldGhfZGV2LT5kYXRhLT5tYWNfYWRkcnMgPT0gTlVMTCkgew0KPg0KPiArCQlS VEVfQk9ORF9MT0coRVJSLA0KPg0KPiArCQkJICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlICV1IGJ5 dGVzIG5lZWRlZCB0byBzdG9yZSBNQUMgYWRkcmVzc2VzIiwNCj4NCj4gKwkJCSAgICAgUlRFX0VU SEVSX0FERFJfTEVOICogQk9ORF9NQVhfTUFDX0FERFJTKTsNCj4NCj4gKwkJZ290byBlcnI7DQo+ DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJZXRoX2Rldi0+ZGV2X29wcyA9ICZkZWZhdWx0X2Rldl9v cHM7DQo+DQo+ICsJZXRoX2Rldi0+ZGF0YS0+ZGV2X2ZsYWdzID0gUlRFX0VUSF9ERVZfSU5UUl9M U0MgfA0KPg0KPiArCQkJCQlSVEVfRVRIX0RFVl9BVVRPRklMTF9RVUVVRV9YU1RBVFM7DQo+DQo+ ICsNCj4NCj4gKwlydGVfc3BpbmxvY2tfaW5pdCgmaW50ZXJuYWxzLT5sb2NrKTsNCj4NCj4gKwly dGVfc3BpbmxvY2tfaW5pdCgmaW50ZXJuYWxzLT5sc2NfbG9jayk7DQo+DQo+ICsNCj4NCj4gKwlp bnRlcm5hbHMtPnBvcnRfaWQgPSBldGhfZGV2LT5kYXRhLT5wb3J0X2lkOw0KPg0KPiArCWludGVy bmFscy0+bW9kZSA9IEJPTkRJTkdfTU9ERV9JTlZBTElEOw0KPg0KPiArCWludGVybmFscy0+Y3Vy cmVudF9wcmltYXJ5X3BvcnQgPSBSVEVfTUFYX0VUSFBPUlRTICsgMTsNCj4NCj4gKwlpbnRlcm5h bHMtPmJhbGFuY2VfeG1pdF9wb2xpY3kgPSBCQUxBTkNFX1hNSVRfUE9MSUNZX0xBWUVSMjsNCj4N Cj4gKwlpbnRlcm5hbHMtPmJ1cnN0X3htaXRfaGFzaCA9IGJ1cnN0X3htaXRfbDJfaGFzaDsNCj4N Cj4gKwlpbnRlcm5hbHMtPnVzZXJfZGVmaW5lZF9tYWMgPSAwOw0KPg0KPiArDQo+DQo+ICsJaW50 ZXJuYWxzLT5saW5rX3N0YXR1c19wb2xsaW5nX2VuYWJsZWQgPSAwOw0KPg0KPiArDQo+DQo+ICsJ aW50ZXJuYWxzLT5saW5rX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zID0NCj4NCj4gKwkJREVG QVVMVF9QT0xMSU5HX0lOVEVSVkFMXzEwX01TOw0KPg0KPiArCWludGVybmFscy0+bGlua19kb3du X2RlbGF5X21zID0gMDsNCj4NCj4gKwlpbnRlcm5hbHMtPmxpbmtfdXBfZGVsYXlfbXMgPSAwOw0K Pg0KPiArDQo+DQo+ICsJaW50ZXJuYWxzLT5zbGF2ZV9jb3VudCA9IDA7DQo+DQo+ICsJaW50ZXJu YWxzLT5hY3RpdmVfc2xhdmVfY291bnQgPSAwOw0KPg0KPiArCWludGVybmFscy0+cnhfb2ZmbG9h ZF9jYXBhID0gMDsNCj4NCj4gKwlpbnRlcm5hbHMtPnR4X29mZmxvYWRfY2FwYSA9IDA7DQo+DQo+ ICsJaW50ZXJuYWxzLT5yeF9xdWV1ZV9vZmZsb2FkX2NhcGEgPSAwOw0KPg0KPiArCWludGVybmFs cy0+dHhfcXVldWVfb2ZmbG9hZF9jYXBhID0gMDsNCj4NCj4gKwlpbnRlcm5hbHMtPmNhbmRpZGF0 ZV9tYXhfcnhfcGt0bGVuID0gMDsNCj4NCj4gKwlpbnRlcm5hbHMtPm1heF9yeF9wa3RsZW4gPSAw Ow0KPg0KPiArDQo+DQo+ICsJLyogSW5pdGlhbGx5IGFsbG93IHRvIGNob29zZSBhbnkgb2ZmbG9h ZCB0eXBlICovDQo+DQo+ICsJaW50ZXJuYWxzLT5mbG93X3R5cGVfcnNzX29mZmxvYWRzID0gUlRF X0VUSF9SU1NfUFJPVE9fTUFTSzsNCj4NCj4gKw0KPg0KPiArCW1lbXNldCgmaW50ZXJuYWxzLT5k ZWZhdWx0X3J4Y29uZiwgMCwNCj4NCj4gKwkgICAgICAgc2l6ZW9mKGludGVybmFscy0+ZGVmYXVs dF9yeGNvbmYpKTsNCj4NCj4gKwltZW1zZXQoJmludGVybmFscy0+ZGVmYXVsdF90eGNvbmYsIDAs DQo+DQo+ICsJICAgICAgIHNpemVvZihpbnRlcm5hbHMtPmRlZmF1bHRfdHhjb25mKSk7DQo+DQo+ ICsNCj4NCj4gKwltZW1zZXQoJmludGVybmFscy0+cnhfZGVzY19saW0sIDAsIHNpemVvZihpbnRl cm5hbHMtPnJ4X2Rlc2NfbGltKSk7DQo+DQo+ICsJbWVtc2V0KCZpbnRlcm5hbHMtPnR4X2Rlc2Nf bGltLCAwLCBzaXplb2YoaW50ZXJuYWxzLT50eF9kZXNjX2xpbSkpOw0KPg0KPiArDQo+DQo+ICsJ bWVtc2V0KGludGVybmFscy0+YWN0aXZlX3NsYXZlcywgMCwgc2l6ZW9mKGludGVybmFscy0+YWN0 aXZlX3NsYXZlcykpOw0KPg0KPiArCW1lbXNldChpbnRlcm5hbHMtPnNsYXZlcywgMCwgc2l6ZW9m KGludGVybmFscy0+c2xhdmVzKSk7DQo+DQo+ICsNCj4NCj4gKwlUQUlMUV9JTklUKCZpbnRlcm5h bHMtPmZsb3dfbGlzdCk7DQo+DQo+ICsJaW50ZXJuYWxzLT5mbG93X2lzb2xhdGVkX3ZhbGlkID0g MDsNCj4NCj4gKw0KPg0KPiArCS8qIFNldCBtb2RlIDQgZGVmYXVsdCBjb25maWd1cmF0aW9uICov DQo+DQo+ICsJYm9uZF9tb2RlXzgwMjNhZF9zZXR1cChldGhfZGV2LCBOVUxMKTsNCj4NCj4gKwlp ZiAoYm9uZF9ldGhkZXZfbW9kZV9zZXQoZXRoX2RldiwgbW9kZSkpIHsNCj4NCj4gKwkJUlRFX0JP TkRfTE9HKEVSUiwgIkZhaWxlZCB0byBzZXQgYm9uZGVkIGRldmljZSAldSBtb2RlIHRvICV1IiwN Cj4NCj4gKwkJCQkgZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCwgbW9kZSk7DQo+DQo+ICsJCWdvdG8g ZXJyOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCXZsYW5fZmlsdGVyX2JtcF9zaXplID0NCj4N Cj4gKwkJcnRlX2JpdG1hcF9nZXRfbWVtb3J5X2Zvb3RwcmludChSVEVfRVRIRVJfTUFYX1ZMQU5f SUQgKyAxKTsNCj4NCj4gKwlpbnRlcm5hbHMtPnZsYW5fZmlsdGVyX2JtcG1lbSA9IHJ0ZV9tYWxs b2MobmFtZSwgdmxhbl9maWx0ZXJfYm1wX3NpemUsDQo+DQo+ICsJCQkJCQkgICBSVEVfQ0FDSEVf TElORV9TSVpFKTsNCj4NCj4gKwlpZiAoaW50ZXJuYWxzLT52bGFuX2ZpbHRlcl9ibXBtZW0gPT0g TlVMTCkgew0KPg0KPiArCQlSVEVfQk9ORF9MT0coRVJSLA0KPg0KPiArCQkJICAgICAiRmFpbGVk IHRvIGFsbG9jYXRlIHZsYW4gYml0bWFwIGZvciBib25kZWQgZGV2aWNlICV1IiwNCj4NCj4gKwkJ CSAgICAgZXRoX2Rldi0+ZGF0YS0+cG9ydF9pZCk7DQo+DQo+ICsJCWdvdG8gZXJyOw0KPg0KPiAr CX0NCj4NCj4gKw0KPg0KPiArCWludGVybmFscy0+dmxhbl9maWx0ZXJfYm1wID0gcnRlX2JpdG1h cF9pbml0KFJURV9FVEhFUl9NQVhfVkxBTl9JRCArIDEsDQo+DQo+ICsJCQlpbnRlcm5hbHMtPnZs YW5fZmlsdGVyX2JtcG1lbSwgdmxhbl9maWx0ZXJfYm1wX3NpemUpOw0KPg0KPiArCWlmIChpbnRl cm5hbHMtPnZsYW5fZmlsdGVyX2JtcCA9PSBOVUxMKSB7DQo+DQo+ICsJCVJURV9CT05EX0xPRyhF UlIsDQo+DQo+ICsJCQkgICAgICJGYWlsZWQgdG8gaW5pdCB2bGFuIGJpdG1hcCBmb3IgYm9uZGVk IGRldmljZSAldSIsDQo+DQo+ICsJCQkgICAgIGV0aF9kZXYtPmRhdGEtPnBvcnRfaWQpOw0KPg0K PiArCQlydGVfZnJlZShpbnRlcm5hbHMtPnZsYW5fZmlsdGVyX2JtcG1lbSk7DQo+DQo+ICsJCWdv dG8gZXJyOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCXJldHVybiBldGhfZGV2LT5kYXRhLT5w b3J0X2lkOw0KPg0KPiArDQo+DQo+ICtlcnI6DQo+DQo+ICsJcnRlX2ZyZWUoaW50ZXJuYWxzKTsN Cj4NCj4gKwlpZiAoZXRoX2RldiAhPSBOVUxMKQ0KPg0KPiArCQlldGhfZGV2LT5kYXRhLT5kZXZf cHJpdmF0ZSA9IE5VTEw7DQo+DQo+ICsJcnRlX2V0aF9kZXZfcmVsZWFzZV9wb3J0KGV0aF9kZXYp Ow0KPg0KPiArCXJldHVybiAtMTsNCj4NCj4gK30NCj4NCj4gKw0KPg0KPiArc3RhdGljIGludA0K Pg0KPiArYm9uZF9wcm9iZShzdHJ1Y3QgcnRlX3ZkZXZfZGV2aWNlICpkZXYpDQo+DQo+ICt7DQo+ DQo+ICsJY29uc3QgY2hhciAqbmFtZTsNCj4NCj4gKwlzdHJ1Y3QgYm9uZF9kZXZfcHJpdmF0ZSAq aW50ZXJuYWxzOw0KPg0KPiArCXN0cnVjdCBydGVfa3ZhcmdzICprdmxpc3Q7DQo+DQo+ICsJdWlu dDhfdCBib25kaW5nX21vZGU7DQo+DQo+ICsJaW50IGFyZ19jb3VudCwgcG9ydF9pZDsNCj4NCj4g KwlpbnQgc29ja2V0X2lkOw0KPg0KPiArCXVpbnQ4X3QgYWdnX21vZGU7DQo+DQo+ICsJc3RydWN0 IHJ0ZV9ldGhfZGV2ICpldGhfZGV2Ow0KPg0KPiArDQo+DQo+ICsJaWYgKCFkZXYpDQo+DQo+ICsJ CXJldHVybiAtRUlOVkFMOw0KPg0KPiArDQo+DQo+ICsJbmFtZSA9IHJ0ZV92ZGV2X2RldmljZV9u YW1lKGRldik7DQo+DQo+ICsJUlRFX0JPTkRfTE9HKElORk8sICJJbml0aWFsaXppbmcgcG1kX2Jv bmQgZm9yICVzIiwgbmFtZSk7DQo+DQo+ICsNCj4NCj4gKwlpZiAocnRlX2VhbF9wcm9jZXNzX3R5 cGUoKSA9PSBSVEVfUFJPQ19TRUNPTkRBUlkpIHsNCj4NCj4gKwkJZXRoX2RldiA9IHJ0ZV9ldGhf ZGV2X2F0dGFjaF9zZWNvbmRhcnkobmFtZSk7DQo+DQo+ICsJCWlmICghZXRoX2Rldikgew0KPg0K PiArCQkJUlRFX0JPTkRfTE9HKEVSUiwgIkZhaWxlZCB0byBwcm9iZSAlcyIsIG5hbWUpOw0KPg0K PiArCQkJcmV0dXJuIC0xOw0KPg0KPiArCQl9DQo+DQo+ICsJCS8qIFRPRE86IHJlcXVlc3QgaW5m byBmcm9tIHByaW1hcnkgdG8gc2V0IHVwIFJ4IGFuZCBUeCAqLw0KPg0KPiArCQlldGhfZGV2LT5k ZXZfb3BzID0gJmRlZmF1bHRfZGV2X29wczsNCj4NCj4gKwkJZXRoX2Rldi0+ZGV2aWNlID0gJmRl di0+ZGV2aWNlOw0KPg0KPiArCQlydGVfZXRoX2Rldl9wcm9iaW5nX2ZpbmlzaChldGhfZGV2KTsN Cj4NCj4gKwkJcmV0dXJuIDA7DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJa3ZsaXN0ID0gcnRl X2t2YXJnc19wYXJzZShydGVfdmRldl9kZXZpY2VfYXJncyhkZXYpLA0KPg0KPiArCQlwbWRfYm9u ZF9pbml0X3ZhbGlkX2FyZ3VtZW50cyk7DQo+DQo+ICsJaWYgKGt2bGlzdCA9PSBOVUxMKSB7DQo+ DQo+ICsJCVJURV9CT05EX0xPRyhFUlIsICJJbnZhbGlkIGFyZ3MgaW4gJXMiLCBydGVfdmRldl9k ZXZpY2VfYXJncyhkZXYpKTsNCj4NCj4gKwkJcmV0dXJuIC0xOw0KPg0KPiArCX0NCj4NCj4gKw0K Pg0KPiArCS8qIFBhcnNlIGxpbmsgYm9uZGluZyBtb2RlICovDQo+DQo+ICsJaWYgKHJ0ZV9rdmFy Z3NfY291bnQoa3ZsaXN0LCBQTURfQk9ORF9NT0RFX0tWQVJHKSA9PSAxKSB7DQo+DQo+ICsJCWlm IChydGVfa3ZhcmdzX3Byb2Nlc3Moa3ZsaXN0LCBQTURfQk9ORF9NT0RFX0tWQVJHLA0KPg0KPiAr CQkJCSZib25kX2V0aGRldl9wYXJzZV9zbGF2ZV9tb2RlX2t2YXJnLA0KPg0KPiArCQkJCSZib25k aW5nX21vZGUpICE9IDApIHsNCj4NCj4gKwkJCVJURV9CT05EX0xPRyhFUlIsICJJbnZhbGlkIG1v ZGUgZm9yIGJvbmRlZCBkZXZpY2UgJXMiLA0KPg0KPiArCQkJCQluYW1lKTsNCj4NCj4gKwkJCWdv dG8gcGFyc2VfZXJyb3I7DQo+DQo+ICsJCX0NCj4NCj4gKwl9IGVsc2Ugew0KPg0KPiArCQlSVEVf Qk9ORF9MT0coRVJSLCAiTW9kZSBtdXN0IGJlIHNwZWNpZmllZCBvbmx5IG9uY2UgZm9yIGJvbmRl ZCAiDQo+DQo+ICsJCQkJImRldmljZSAlcyIsIG5hbWUpOw0KPg0KPiArCQlnb3RvIHBhcnNlX2Vy cm9yOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCS8qIFBhcnNlIHNvY2tldCBpZCB0byBjcmVh dGUgYm9uZGluZyBkZXZpY2Ugb24gKi8NCj4NCj4gKwlhcmdfY291bnQgPSBydGVfa3ZhcmdzX2Nv dW50KGt2bGlzdCwgUE1EX0JPTkRfU09DS0VUX0lEX0tWQVJHKTsNCj4NCj4gKwlpZiAoYXJnX2Nv dW50ID09IDEpIHsNCj4NCj4gKwkJaWYgKHJ0ZV9rdmFyZ3NfcHJvY2Vzcyhrdmxpc3QsIFBNRF9C T05EX1NPQ0tFVF9JRF9LVkFSRywNCj4NCj4gKwkJCQkmYm9uZF9ldGhkZXZfcGFyc2Vfc29ja2V0 X2lkX2t2YXJnLCAmc29ja2V0X2lkKQ0KPg0KPiArCQkJCSE9IDApIHsNCj4NCj4gKwkJCVJURV9C T05EX0xPRyhFUlIsICJJbnZhbGlkIHNvY2tldCBJZCBzcGVjaWZpZWQgZm9yICINCj4NCj4gKwkJ CQkJImJvbmRlZCBkZXZpY2UgJXMiLCBuYW1lKTsNCj4NCj4gKwkJCWdvdG8gcGFyc2VfZXJyb3I7 DQo+DQo+ICsJCX0NCj4NCj4gKwl9IGVsc2UgaWYgKGFyZ19jb3VudCA+IDEpIHsNCj4NCj4gKwkJ UlRFX0JPTkRfTE9HKEVSUiwgIlNvY2tldCBJZCBjYW4gYmUgc3BlY2lmaWVkIG9ubHkgb25jZSBm b3IgIg0KPg0KPiArCQkJCSJib25kZWQgZGV2aWNlICVzIiwgbmFtZSk7DQo+DQo+ICsJCWdvdG8g cGFyc2VfZXJyb3I7DQo+DQo+ICsJfSBlbHNlIHsNCj4NCj4gKwkJc29ja2V0X2lkID0gcnRlX3Nv Y2tldF9pZCgpOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCWRldi0+ZGV2aWNlLm51bWFfbm9k ZSA9IHNvY2tldF9pZDsNCj4NCj4gKw0KPg0KPiArCS8qIENyZWF0ZSBsaW5rIGJvbmRpbmcgZXRo IGRldmljZSAqLw0KPg0KPiArCXBvcnRfaWQgPSBib25kX2FsbG9jKGRldiwgYm9uZGluZ19tb2Rl KTsNCj4NCj4gKwlpZiAocG9ydF9pZCA8IDApIHsNCj4NCj4gKwkJUlRFX0JPTkRfTE9HKEVSUiwg IkZhaWxlZCB0byBjcmVhdGUgc29ja2V0ICVzIGluIG1vZGUgJXUgb24gIg0KPg0KPiArCQkJCSJz b2NrZXQgJXUuIiwJbmFtZSwgYm9uZGluZ19tb2RlLCBzb2NrZXRfaWQpOw0KPg0KPiArCQlnb3Rv IHBhcnNlX2Vycm9yOw0KPg0KPiArCX0NCj4NCj4gKwlpbnRlcm5hbHMgPSBydGVfZXRoX2Rldmlj ZXNbcG9ydF9pZF0uZGF0YS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsJaW50ZXJuYWxzLT5rdmxpc3Qg PSBrdmxpc3Q7DQo+DQo+ICsNCj4NCj4gKwlpZiAocnRlX2t2YXJnc19jb3VudChrdmxpc3QsIFBN RF9CT05EX0FHR19NT0RFX0tWQVJHKSA9PSAxKSB7DQo+DQo+ICsJCWlmIChydGVfa3ZhcmdzX3By b2Nlc3Moa3ZsaXN0LA0KPg0KPiArCQkJCVBNRF9CT05EX0FHR19NT0RFX0tWQVJHLA0KPg0KPiAr CQkJCSZib25kX2V0aGRldl9wYXJzZV9zbGF2ZV9hZ2dfbW9kZV9rdmFyZywNCj4NCj4gKwkJCQkm YWdnX21vZGUpICE9IDApIHsNCj4NCj4gKwkJCVJURV9CT05EX0xPRyhFUlIsDQo+DQo+ICsJCQkJ CSJGYWlsZWQgdG8gcGFyc2UgYWdnIHNlbGVjdGlvbiBtb2RlIGZvciBib25kZWQgZGV2aWNlICVz IiwNCj4NCj4gKwkJCQkJbmFtZSk7DQo+DQo+ICsJCQlnb3RvIHBhcnNlX2Vycm9yOw0KPg0KPiAr CQl9DQo+DQo+ICsNCj4NCj4gKwkJaWYgKGludGVybmFscy0+bW9kZSA9PSBCT05ESU5HX01PREVf ODAyM0FEKQ0KPg0KPiArCQkJaW50ZXJuYWxzLT5tb2RlNC5hZ2dfc2VsZWN0aW9uID0gYWdnX21v ZGU7DQo+DQo+ICsJfSBlbHNlIHsNCj4NCj4gKwkJaW50ZXJuYWxzLT5tb2RlNC5hZ2dfc2VsZWN0 aW9uID0gQUdHX1NUQUJMRTsNCj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwlydGVfZXRoX2Rldl9w cm9iaW5nX2ZpbmlzaCgmcnRlX2V0aF9kZXZpY2VzW3BvcnRfaWRdKTsNCj4NCj4gKwlSVEVfQk9O RF9MT0coSU5GTywgIkNyZWF0ZSBib25kZWQgZGV2aWNlICVzIG9uIHBvcnQgJWQgaW4gbW9kZSAl dSBvbiAiDQo+DQo+ICsJCQkic29ja2V0ICV1LiIsCW5hbWUsIHBvcnRfaWQsIGJvbmRpbmdfbW9k ZSwgc29ja2V0X2lkKTsNCj4NCj4gKwlyZXR1cm4gMDsNCj4NCj4gKw0KPg0KPiArcGFyc2VfZXJy b3I6DQo+DQo+ICsJcnRlX2t2YXJnc19mcmVlKGt2bGlzdCk7DQo+DQo+ICsNCj4NCj4gKwlyZXR1 cm4gLTE7DQo+DQo+ICt9DQo+DQo+ICsNCj4NCj4gK3N0YXRpYyBpbnQNCj4NCj4gK2JvbmRfcmVt b3ZlKHN0cnVjdCBydGVfdmRldl9kZXZpY2UgKmRldikNCj4NCj4gK3sNCj4NCj4gKwlzdHJ1Y3Qg cnRlX2V0aF9kZXYgKmV0aF9kZXY7DQo+DQo+ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUgKmlu dGVybmFsczsNCj4NCj4gKwljb25zdCBjaGFyICpuYW1lOw0KPg0KPiArCWludCByZXQgPSAwOw0K Pg0KPiArDQo+DQo+ICsJaWYgKCFkZXYpDQo+DQo+ICsJCXJldHVybiAtRUlOVkFMOw0KPg0KPiAr DQo+DQo+ICsJbmFtZSA9IHJ0ZV92ZGV2X2RldmljZV9uYW1lKGRldik7DQo+DQo+ICsJUlRFX0JP TkRfTE9HKElORk8sICJVbmluaXRpYWxpemluZyBwbWRfYm9uZCBmb3IgJXMiLCBuYW1lKTsNCj4N Cj4gKw0KPg0KPiArCS8qIGZpbmQgYW4gZXRoZGV2IGVudHJ5ICovDQo+DQo+ICsJZXRoX2RldiA9 IHJ0ZV9ldGhfZGV2X2FsbG9jYXRlZChuYW1lKTsNCj4NCj4gKwlpZiAoZXRoX2RldiA9PSBOVUxM KQ0KPg0KPiArCQlyZXR1cm4gMDsgLyogcG9ydCBhbHJlYWR5IHJlbGVhc2VkICovDQo+DQo+ICsN Cj4NCj4gKwlpZiAocnRlX2VhbF9wcm9jZXNzX3R5cGUoKSAhPSBSVEVfUFJPQ19QUklNQVJZKQ0K Pg0KPiArCQlyZXR1cm4gcnRlX2V0aF9kZXZfcmVsZWFzZV9wb3J0KGV0aF9kZXYpOw0KPg0KPiAr DQo+DQo+ICsJUlRFX0FTU0VSVChldGhfZGV2LT5kZXZpY2UgPT0gJmRldi0+ZGV2aWNlKTsNCj4N Cj4gKw0KPg0KPiArCWludGVybmFscyA9IGV0aF9kZXYtPmRhdGEtPmRldl9wcml2YXRlOw0KPg0K PiArCWlmIChpbnRlcm5hbHMtPnNsYXZlX2NvdW50ICE9IDApDQo+DQo+ICsJCXJldHVybiAtRUJV U1k7DQo+DQo+ICsNCj4NCj4gKwlpZiAoZXRoX2Rldi0+ZGF0YS0+ZGV2X3N0YXJ0ZWQgPT0gMSkg ew0KPg0KPiArCQlyZXQgPSBib25kX2V0aGRldl9zdG9wKGV0aF9kZXYpOw0KPg0KPiArCQlib25k X2V0aGRldl9jbG9zZShldGhfZGV2KTsNCj4NCj4gKwl9DQo+DQo+ICsJcnRlX2V0aF9kZXZfcmVs ZWFzZV9wb3J0KGV0aF9kZXYpOw0KPg0KPiArDQo+DQo+ICsJcmV0dXJuIHJldDsNCj4NCj4gK30N Cj4NCj4gKw0KPg0KPiArLyogdGhpcyBwYXJ0IHdpbGwgcmVzb2x2ZSB0aGUgc2xhdmUgcG9ydGlk cyBhZnRlciBhbGwgdGhlIG90aGVyIHBkZXYgYW5kIHZkZXYNCj4NCj4gKyAqIGhhdmUgYmVlbiBh bGxvY2F0ZWQgKi8NCj4NCj4gK3N0YXRpYyBpbnQNCj4NCj4gK2JvbmRfZXRoZGV2X2NvbmZpZ3Vy ZShzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldikNCj4NCj4gK3sNCj4NCj4gKwljb25zdCBjaGFyICpu YW1lID0gZGV2LT5kZXZpY2UtPm5hbWU7DQo+DQo+ICsJc3RydWN0IGJvbmRfZGV2X3ByaXZhdGUg KmludGVybmFscyA9IGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQo+DQo+ICsJc3RydWN0IHJ0ZV9r dmFyZ3MgKmt2bGlzdCA9IGludGVybmFscy0+a3ZsaXN0Ow0KPg0KPiArCXVpbnQ2NF90IG9mZmxv YWRzOw0KPg0KPiArCWludCBhcmdfY291bnQ7DQo+DQo+ICsJdWludDE2X3QgcG9ydF9pZCA9IGRl diAtIHJ0ZV9ldGhfZGV2aWNlczsNCj4NCj4gKwl1aW50OF90IGFnZ19tb2RlOw0KPg0KPiArDQo+ DQo+ICsJc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGVmYXVsdF9yc3Nfa2V5WzQwXSA9IHsNCj4NCj4g KwkJMHg2RCwgMHg1QSwgMHg1NiwgMHhEQSwgMHgyNSwgMHg1QiwgMHgwRSwgMHhDMiwgMHg0MSwg MHg2NywgMHgyNSwgMHgzRCwNCj4NCj4gKwkJMHg0MywgMHhBMywgMHg4RiwgMHhCMCwgMHhEMCwg MHhDQSwgMHgyQiwgMHhDQiwgMHhBRSwgMHg3QiwgMHgzMCwgMHhCNCwNCj4NCj4gKwkJMHg3Nywg MHhDQiwgMHgyRCwgMHhBMywgMHg4MCwgMHgzMCwgMHhGMiwgMHgwQywgMHg2QSwgMHg0MiwgMHhC NywgMHgzQiwNCj4NCj4gKwkJMHhCRSwgMHhBQywgMHgwMSwgMHhGQQ0KPg0KPiArCX07DQo+DQo+ ICsNCj4NCj4gKwl1bnNpZ25lZCBpLCBqOw0KPg0KPiArDQo+DQo+ICsJLyoNCj4NCj4gKwkgKiBJ ZiBSU1MgaXMgZW5hYmxlZCwgZmlsbCB0YWJsZSB3aXRoIGRlZmF1bHQgdmFsdWVzIGFuZA0KPg0K PiArCSAqIHNldCBrZXkgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBpbiBwb3J0IFJTUyBjb25maWd1 cmF0aW9uLg0KPg0KPiArCSAqIEZhbGwgYmFjayB0byBkZWZhdWx0IFJTUyBrZXkgaWYgdGhlIGtl eSBpcyBub3Qgc3BlY2lmaWVkDQo+DQo+ICsJICovDQo+DQo+ICsJaWYgKGRldi0+ZGF0YS0+ZGV2 X2NvbmYucnhtb2RlLm1xX21vZGUgJiBSVEVfRVRIX01RX1JYX1JTUykgew0KPg0KPiArCQlzdHJ1 Y3QgcnRlX2V0aF9yc3NfY29uZiAqcnNzX2NvbmYgPQ0KPg0KPiArCQkJJmRldi0+ZGF0YS0+ZGV2 X2NvbmYucnhfYWR2X2NvbmYucnNzX2NvbmY7DQo+DQo+ICsNCj4NCj4gKwkJaWYgKGludGVybmFs cy0+cnNzX2tleV9sZW4gPT0gMCkgew0KPg0KPiArCQkJaW50ZXJuYWxzLT5yc3Nfa2V5X2xlbiA9 IHNpemVvZihkZWZhdWx0X3Jzc19rZXkpOw0KPg0KPiArCQl9DQo+DQo+ICsNCj4NCj4gKwkJaWYg KHJzc19jb25mLT5yc3Nfa2V5ICE9IE5VTEwpIHsNCj4NCj4gKwkJCWlmIChpbnRlcm5hbHMtPnJz c19rZXlfbGVuID4gcnNzX2NvbmYtPnJzc19rZXlfbGVuKSB7DQo+DQo+ICsJCQkJUlRFX0JPTkRf TE9HKEVSUiwgIkludmFsaWQgcnNzIGtleSBsZW5ndGgoJXUpIiwNCj4NCj4gKwkJCQkJCXJzc19j b25mLT5yc3Nfa2V5X2xlbik7DQo+DQo+ICsJCQkJcmV0dXJuIC1FSU5WQUw7DQo+DQo+ICsJCQl9 DQo+DQo+ICsNCj4NCj4gKwkJCW1lbWNweShpbnRlcm5hbHMtPnJzc19rZXksIHJzc19jb25mLT5y c3Nfa2V5LA0KPg0KPiArCQkJICAgICAgIGludGVybmFscy0+cnNzX2tleV9sZW4pOw0KPg0KPiAr CQl9IGVsc2Ugew0KPg0KPiArCQkJaWYgKGludGVybmFscy0+cnNzX2tleV9sZW4gPiBzaXplb2Yo ZGVmYXVsdF9yc3Nfa2V5KSkgew0KPg0KPiArCQkJCS8qDQo+DQo+ICsJCQkJICogSWYgdGhlIHJz c19rZXkgaW5jbHVkZXMgc3RhbmRhcmRfcnNzX2tleSBhbmQNCj4NCj4gKwkJCQkgKiBleHRlbmRl ZF9oYXNoX2tleSwgdGhlIHJzcyBrZXkgbGVuZ3RoIHdpbGwgYmUNCj4NCj4gKwkJCQkgKiBsYXJn ZXIgdGhhbiBkZWZhdWx0IHJzcyBrZXkgbGVuZ3RoLCBzbyBpdCBzaG91bGQNCj4NCj4gKwkJCQkg KiByZS1jYWxjdWxhdGUgdGhlIGhhc2gga2V5Lg0KPg0KPiArCQkJCSAqLw0KPg0KPiArCQkJCWZv ciAoaSA9IDA7IGkgPCBpbnRlcm5hbHMtPnJzc19rZXlfbGVuOyBpKyspDQo+DQo+ICsJCQkJCWlu dGVybmFscy0+cnNzX2tleVtpXSA9ICh1aW50OF90KXJ0ZV9yYW5kKCk7DQo+DQo+ICsJCQl9IGVs c2Ugew0KPg0KPiArCQkJCW1lbWNweShpbnRlcm5hbHMtPnJzc19rZXksIGRlZmF1bHRfcnNzX2tl eSwNCj4NCj4gKwkJCQkJaW50ZXJuYWxzLT5yc3Nfa2V5X2xlbik7DQo+DQo+ICsJCQl9DQo+DQo+ ICsJCX0NCj4NCj4gKw0KPg0KPiArCQlmb3IgKGkgPSAwOyBpIDwgUlRFX0RJTShpbnRlcm5hbHMt PnJldGFfY29uZik7IGkrKykgew0KPg0KPiArCQkJaW50ZXJuYWxzLT5yZXRhX2NvbmZbaV0ubWFz ayA9IH4wTEw7DQo+DQo+ICsJCQlmb3IgKGogPSAwOyBqIDwgUlRFX0VUSF9SRVRBX0dST1VQX1NJ WkU7IGorKykNCj4NCj4gKwkJCQlpbnRlcm5hbHMtPnJldGFfY29uZltpXS5yZXRhW2pdID0NCj4N Cj4gKwkJCQkJCShpICogUlRFX0VUSF9SRVRBX0dST1VQX1NJWkUgKyBqKSAlDQo+DQo+ICsJCQkJ CQlkZXYtPmRhdGEtPm5iX3J4X3F1ZXVlczsNCj4NCj4gKwkJfQ0KPg0KPiArCX0NCj4NCj4gKw0K Pg0KPiArCW9mZmxvYWRzID0gZGV2LT5kYXRhLT5kZXZfY29uZi50eG1vZGUub2ZmbG9hZHM7DQo+ DQo+ICsJaWYgKChvZmZsb2FkcyAmIFJURV9FVEhfVFhfT0ZGTE9BRF9NQlVGX0ZBU1RfRlJFRSkg JiYNCj4NCj4gKwkJCShpbnRlcm5hbHMtPm1vZGUgPT0gQk9ORElOR19NT0RFXzgwMjNBRCB8fA0K Pg0KPiArCQkJaW50ZXJuYWxzLT5tb2RlID09IEJPTkRJTkdfTU9ERV9CUk9BRENBU1QpKSB7DQo+ DQo+ICsJCVJURV9CT05EX0xPRyhXQVJOSU5HLA0KPg0KPiArCQkJImJvbmQgbW9kZSBicm9hZGNh c3QgJiA4MDIzQUQgZG9uJ3Qgc3VwcG9ydCBNQlVGX0ZBU1RfRlJFRSBvZmZsb2FkLCBmb3JjZSBk aXNhYmxlIGl0LiIpOw0KPg0KPiArCQlvZmZsb2FkcyAmPSB+UlRFX0VUSF9UWF9PRkZMT0FEX01C VUZfRkFTVF9GUkVFOw0KPg0KPiArCQlkZXYtPmRhdGEtPmRldl9jb25mLnR4bW9kZS5vZmZsb2Fk cyA9IG9mZmxvYWRzOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCS8qIHNldCB0aGUgbWF4X3J4 X3BrdGxlbiAqLw0KPg0KPiArCWludGVybmFscy0+bWF4X3J4X3BrdGxlbiA9IGludGVybmFscy0+ Y2FuZGlkYXRlX21heF9yeF9wa3RsZW47DQo+DQo+ICsNCj4NCj4gKwkvKg0KPg0KPiArCSAqIGlm IG5vIGt2bGlzdCwgaXQgbWVhbnMgdGhhdCB0aGlzIGJvbmRlZCBkZXZpY2UgaGFzIGJlZW4gY3Jl YXRlZA0KPg0KPiArCSAqIHRocm91Z2ggdGhlIGJvbmRpbmcgYXBpLg0KPg0KPiArCSAqLw0KPg0K PiArCWlmICgha3ZsaXN0KQ0KPg0KPiArCQlyZXR1cm4gMDsNCj4NCj4gKw0KPg0KPiArCS8qIFBh cnNlIE1BQyBhZGRyZXNzIGZvciBib25kZWQgZGV2aWNlICovDQo+DQo+ICsJYXJnX2NvdW50ID0g cnRlX2t2YXJnc19jb3VudChrdmxpc3QsIFBNRF9CT05EX01BQ19BRERSX0tWQVJHKTsNCj4NCj4g KwlpZiAoYXJnX2NvdW50ID09IDEpIHsNCj4NCj4gKwkJc3RydWN0IHJ0ZV9ldGhlcl9hZGRyIGJv bmRfbWFjOw0KPg0KPiArDQo+DQo+ICsJCWlmIChydGVfa3ZhcmdzX3Byb2Nlc3Moa3ZsaXN0LCBQ TURfQk9ORF9NQUNfQUREUl9LVkFSRywNCj4NCj4gKwkJCQkgICAgICAgJmJvbmRfZXRoZGV2X3Bh cnNlX2JvbmRfbWFjX2FkZHJfa3ZhcmcsICZib25kX21hYykgPCAwKSB7DQo+DQo+ICsJCQlSVEVf Qk9ORF9MT0coSU5GTywgIkludmFsaWQgbWFjIGFkZHJlc3MgZm9yIGJvbmRlZCBkZXZpY2UgJXMi LA0KPg0KPiArCQkJCSAgICAgbmFtZSk7DQo+DQo+ICsJCQlyZXR1cm4gLTE7DQo+DQo+ICsJCX0N Cj4NCj4gKw0KPg0KPiArCQkvKiBTZXQgTUFDIGFkZHJlc3MgKi8NCj4NCj4gKwkJaWYgKHJ0ZV9l dGhfYm9uZF9tYWNfYWRkcmVzc19zZXQocG9ydF9pZCwgJmJvbmRfbWFjKSAhPSAwKSB7DQo+DQo+ ICsJCQlSVEVfQk9ORF9MT0coRVJSLA0KPg0KPiArCQkJCSAgICAgIkZhaWxlZCB0byBzZXQgbWFj IGFkZHJlc3Mgb24gYm9uZGVkIGRldmljZSAlcyIsDQo+DQo+ICsJCQkJICAgICBuYW1lKTsNCj4N Cj4gKwkJCXJldHVybiAtMTsNCj4NCj4gKwkJfQ0KPg0KPiArCX0gZWxzZSBpZiAoYXJnX2NvdW50 ID4gMSkgew0KPg0KPiArCQlSVEVfQk9ORF9MT0coRVJSLA0KPg0KPiArCQkJICAgICAiTUFDIGFk ZHJlc3MgY2FuIGJlIHNwZWNpZmllZCBvbmx5IG9uY2UgZm9yIGJvbmRlZCBkZXZpY2UgJXMiLA0K Pg0KPiArCQkJICAgICBuYW1lKTsNCj4NCj4gKwkJcmV0dXJuIC0xOw0KPg0KPiArCX0NCj4NCj4g Kw0KPg0KPiArCS8qIFBhcnNlL3NldCBiYWxhbmNlIG1vZGUgdHJhbnNtaXQgcG9saWN5ICovDQo+ DQo+ICsJYXJnX2NvdW50ID0gcnRlX2t2YXJnc19jb3VudChrdmxpc3QsIFBNRF9CT05EX1hNSVRf UE9MSUNZX0tWQVJHKTsNCj4NCj4gKwlpZiAoYXJnX2NvdW50ID09IDEpIHsNCj4NCj4gKwkJdWlu dDhfdCB4bWl0X3BvbGljeTsNCj4NCj4gKw0KPg0KPiArCQlpZiAocnRlX2t2YXJnc19wcm9jZXNz KGt2bGlzdCwgUE1EX0JPTkRfWE1JVF9QT0xJQ1lfS1ZBUkcsDQo+DQo+ICsJCQkJICAgICAgICZi b25kX2V0aGRldl9wYXJzZV9iYWxhbmNlX3htaXRfcG9saWN5X2t2YXJnLCAmeG1pdF9wb2xpY3kp ICE9DQo+DQo+ICsJCSAgICAwKSB7DQo+DQo+ICsJCQlSVEVfQk9ORF9MT0coSU5GTywNCj4NCj4g KwkJCQkgICAgICJJbnZhbGlkIHhtaXQgcG9saWN5IHNwZWNpZmllZCBmb3IgYm9uZGVkIGRldmlj ZSAlcyIsDQo+DQo+ICsJCQkJICAgICBuYW1lKTsNCj4NCj4gKwkJCXJldHVybiAtMTsNCj4NCj4g KwkJfQ0KPg0KPiArDQo+DQo+ICsJCS8qIFNldCBiYWxhbmNlIG1vZGUgdHJhbnNtaXQgcG9saWN5 Ki8NCj4NCj4gKwkJaWYgKHJ0ZV9ldGhfYm9uZF94bWl0X3BvbGljeV9zZXQocG9ydF9pZCwgeG1p dF9wb2xpY3kpICE9IDApIHsNCj4NCj4gKwkJCVJURV9CT05EX0xPRyhFUlIsDQo+DQo+ICsJCQkJ ICAgICAiRmFpbGVkIHRvIHNldCBiYWxhbmNlIHhtaXQgcG9saWN5IG9uIGJvbmRlZCBkZXZpY2Ug JXMiLA0KPg0KPiArCQkJCSAgICAgbmFtZSk7DQo+DQo+ICsJCQlyZXR1cm4gLTE7DQo+DQo+ICsJ CX0NCj4NCj4gKwl9IGVsc2UgaWYgKGFyZ19jb3VudCA+IDEpIHsNCj4NCj4gKwkJUlRFX0JPTkRf TE9HKEVSUiwNCj4NCj4gKwkJCSAgICAgIlRyYW5zbWl0IHBvbGljeSBjYW4gYmUgc3BlY2lmaWVk IG9ubHkgb25jZSBmb3IgYm9uZGVkIGRldmljZSAlcyIsDQo+DQo+ICsJCQkgICAgIG5hbWUpOw0K Pg0KPiArCQlyZXR1cm4gLTE7DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJaWYgKHJ0ZV9rdmFy Z3NfY291bnQoa3ZsaXN0LCBQTURfQk9ORF9BR0dfTU9ERV9LVkFSRykgPT0gMSkgew0KPg0KPiAr CQlpZiAocnRlX2t2YXJnc19wcm9jZXNzKGt2bGlzdCwNCj4NCj4gKwkJCQkgICAgICAgUE1EX0JP TkRfQUdHX01PREVfS1ZBUkcsDQo+DQo+ICsJCQkJICAgICAgICZib25kX2V0aGRldl9wYXJzZV9z bGF2ZV9hZ2dfbW9kZV9rdmFyZywNCj4NCj4gKwkJCQkgICAgICAgJmFnZ19tb2RlKSAhPSAwKSB7 DQo+DQo+ICsJCQlSVEVfQk9ORF9MT0coRVJSLA0KPg0KPiArCQkJCSAgICAgIkZhaWxlZCB0byBw YXJzZSBhZ2cgc2VsZWN0aW9uIG1vZGUgZm9yIGJvbmRlZCBkZXZpY2UgJXMiLA0KPg0KPiArCQkJ CSAgICAgbmFtZSk7DQo+DQo+ICsJCX0NCj4NCj4gKwkJaWYgKGludGVybmFscy0+bW9kZSA9PSBC T05ESU5HX01PREVfODAyM0FEKSB7DQo+DQo+ICsJCQlpbnQgcmV0ID0gcnRlX2V0aF9ib25kXzgw MjNhZF9hZ2dfc2VsZWN0aW9uX3NldChwb3J0X2lkLA0KPg0KPiArCQkJCQlhZ2dfbW9kZSk7DQo+ DQo+ICsJCQlpZiAocmV0IDwgMCkgew0KPg0KPiArCQkJCVJURV9CT05EX0xPRyhFUlIsDQo+DQo+ ICsJCQkJCSJJbnZhbGlkIGFyZ3MgZm9yIGFnZyBzZWxlY3Rpb24gc2V0IGZvciBib25kZWQgZGV2 aWNlICVzIiwNCj4NCj4gKwkJCQkJbmFtZSk7DQo+DQo+ICsJCQkJcmV0dXJuIC0xOw0KPg0KPiAr CQkJfQ0KPg0KPiArCQl9DQo+DQo+ICsJfQ0KPg0KPiArDQo+DQo+ICsJLyogUGFyc2UvYWRkIHNs YXZlIHBvcnRzIHRvIGJvbmRlZCBkZXZpY2UgKi8NCj4NCj4gKwlpZiAocnRlX2t2YXJnc19jb3Vu dChrdmxpc3QsIFBNRF9CT05EX1NMQVZFX1BPUlRfS1ZBUkcpID4gMCkgew0KPg0KPiArCQlzdHJ1 Y3QgYm9uZF9ldGhkZXZfc2xhdmVfcG9ydHMgc2xhdmVfcG9ydHM7DQo+DQo+ICsJCXVuc2lnbmVk IGk7DQo+DQo+ICsNCj4NCj4gKwkJbWVtc2V0KCZzbGF2ZV9wb3J0cywgMCwgc2l6ZW9mKHNsYXZl X3BvcnRzKSk7DQo+DQo+ICsNCj4NCj4gKwkJaWYgKHJ0ZV9rdmFyZ3NfcHJvY2Vzcyhrdmxpc3Qs IFBNRF9CT05EX1NMQVZFX1BPUlRfS1ZBUkcsDQo+DQo+ICsJCQkJICAgICAgICZib25kX2V0aGRl dl9wYXJzZV9zbGF2ZV9wb3J0X2t2YXJnLCAmc2xhdmVfcG9ydHMpICE9IDApIHsNCj4NCj4gKwkJ CVJURV9CT05EX0xPRyhFUlIsDQo+DQo+ICsJCQkJICAgICAiRmFpbGVkIHRvIHBhcnNlIHNsYXZl IHBvcnRzIGZvciBib25kZWQgZGV2aWNlICVzIiwNCj4NCj4gKwkJCQkgICAgIG5hbWUpOw0KPg0K PiArCQkJcmV0dXJuIC0xOw0KPg0KPiArCQl9DQo+DQo+ICsNCj4NCj4gKwkJZm9yIChpID0gMDsg aSA8IHNsYXZlX3BvcnRzLnNsYXZlX2NvdW50OyBpKyspIHsNCj4NCj4gKwkJCWlmIChydGVfZXRo X2JvbmRfc2xhdmVfYWRkKHBvcnRfaWQsIHNsYXZlX3BvcnRzLnNsYXZlc1tpXSkgIT0gMCkgew0K Pg0KPiArCQkJCVJURV9CT05EX0xPRyhFUlIsDQo+DQo+ICsJCQkJCSAgICAgIkZhaWxlZCB0byBh ZGQgcG9ydCAlZCBhcyBzbGF2ZSB0byBib25kZWQgZGV2aWNlICVzIiwNCj4NCj4gKwkJCQkJICAg ICBzbGF2ZV9wb3J0cy5zbGF2ZXNbaV0sIG5hbWUpOw0KPg0KPiArCQkJfQ0KPg0KPiArCQl9DQo+ DQo+ICsNCj4NCj4gKwl9IGVsc2Ugew0KPg0KPiArCQlSVEVfQk9ORF9MT0coSU5GTywgIk5vIHNs YXZlcyBzcGVjaWZpZWQgZm9yIGJvbmRlZCBkZXZpY2UgJXMiLCBuYW1lKTsNCj4NCj4gKwkJcmV0 dXJuIC0xOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCS8qIFBhcnNlL3NldCBwcmltYXJ5IHNs YXZlIHBvcnQgaWQqLw0KPg0KPiArCWFyZ19jb3VudCA9IHJ0ZV9rdmFyZ3NfY291bnQoa3ZsaXN0 LCBQTURfQk9ORF9QUklNQVJZX1NMQVZFX0tWQVJHKTsNCj4NCj4gKwlpZiAoYXJnX2NvdW50ID09 IDEpIHsNCj4NCj4gKwkJdWludDE2X3QgcHJpbWFyeV9zbGF2ZV9wb3J0X2lkOw0KPg0KPiArDQo+ DQo+ICsJCWlmIChydGVfa3ZhcmdzX3Byb2Nlc3Moa3ZsaXN0LA0KPg0KPiArCQkJCSAgICAgICBQ TURfQk9ORF9QUklNQVJZX1NMQVZFX0tWQVJHLA0KPg0KPiArCQkJCSAgICAgICAmYm9uZF9ldGhk ZXZfcGFyc2VfcHJpbWFyeV9zbGF2ZV9wb3J0X2lkX2t2YXJnLA0KPg0KPiArCQkJCSAgICAgICAm cHJpbWFyeV9zbGF2ZV9wb3J0X2lkKSA8IDApIHsNCj4NCj4gKwkJCVJURV9CT05EX0xPRyhJTkZP LA0KPg0KPiArCQkJCSAgICAgIkludmFsaWQgcHJpbWFyeSBzbGF2ZSBwb3J0IGlkIHNwZWNpZmll ZCBmb3IgYm9uZGVkIGRldmljZSAlcyIsDQo+DQo+ICsJCQkJICAgICBuYW1lKTsNCj4NCj4gKwkJ CXJldHVybiAtMTsNCj4NCj4gKwkJfQ0KPg0KPiArDQo+DQo+ICsJCS8qIFNldCBiYWxhbmNlIG1v ZGUgdHJhbnNtaXQgcG9saWN5Ki8NCj4NCj4gKwkJaWYgKHJ0ZV9ldGhfYm9uZF9wcmltYXJ5X3Nl dChwb3J0X2lkLCBwcmltYXJ5X3NsYXZlX3BvcnRfaWQpDQo+DQo+ICsJCSAgICAhPSAwKSB7DQo+ DQo+ICsJCQlSVEVfQk9ORF9MT0coRVJSLA0KPg0KPiArCQkJCSAgICAgIkZhaWxlZCB0byBzZXQg cHJpbWFyeSBzbGF2ZSBwb3J0ICVkIG9uIGJvbmRlZCBkZXZpY2UgJXMiLA0KPg0KPiArCQkJCSAg ICAgcHJpbWFyeV9zbGF2ZV9wb3J0X2lkLCBuYW1lKTsNCj4NCj4gKwkJCXJldHVybiAtMTsNCj4N Cj4gKwkJfQ0KPg0KPiArCX0gZWxzZSBpZiAoYXJnX2NvdW50ID4gMSkgew0KPg0KPiArCQlSVEVf Qk9ORF9MT0coSU5GTywNCj4NCj4gKwkJCSAgICAgIlByaW1hcnkgc2xhdmUgY2FuIGJlIHNwZWNp ZmllZCBvbmx5IG9uY2UgZm9yIGJvbmRlZCBkZXZpY2UgJXMiLA0KPg0KPiArCQkJICAgICBuYW1l KTsNCj4NCj4gKwkJcmV0dXJuIC0xOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCS8qIFBhcnNl IGxpbmsgc3RhdHVzIG1vbml0b3IgcG9sbGluZyBpbnRlcnZhbCAqLw0KPg0KPiArCWFyZ19jb3Vu dCA9IHJ0ZV9rdmFyZ3NfY291bnQoa3ZsaXN0LCBQTURfQk9ORF9MU0NfUE9MTF9QRVJJT0RfS1ZB UkcpOw0KPg0KPiArCWlmIChhcmdfY291bnQgPT0gMSkgew0KPg0KPiArCQl1aW50MzJfdCBsc2Nf cG9sbF9pbnRlcnZhbF9tczsNCj4NCj4gKw0KPg0KPiArCQlpZiAocnRlX2t2YXJnc19wcm9jZXNz KGt2bGlzdCwNCj4NCj4gKwkJCQkgICAgICAgUE1EX0JPTkRfTFNDX1BPTExfUEVSSU9EX0tWQVJH LA0KPg0KPiArCQkJCSAgICAgICAmYm9uZF9ldGhkZXZfcGFyc2VfdGltZV9tc19rdmFyZywNCj4N Cj4gKwkJCQkgICAgICAgJmxzY19wb2xsX2ludGVydmFsX21zKSA8IDApIHsNCj4NCj4gKwkJCVJU RV9CT05EX0xPRyhJTkZPLA0KPg0KPiArCQkJCSAgICAgIkludmFsaWQgbHNjIHBvbGxpbmcgaW50 ZXJ2YWwgdmFsdWUgc3BlY2lmaWVkIGZvciBib25kZWQiDQo+DQo+ICsJCQkJICAgICAiIGRldmlj ZSAlcyIsIG5hbWUpOw0KPg0KPiArCQkJcmV0dXJuIC0xOw0KPg0KPiArCQl9DQo+DQo+ICsNCj4N Cj4gKwkJaWYgKHJ0ZV9ldGhfYm9uZF9saW5rX21vbml0b3Jpbmdfc2V0KHBvcnRfaWQsIGxzY19w b2xsX2ludGVydmFsX21zKQ0KPg0KPiArCQkgICAgIT0gMCkgew0KPg0KPiArCQkJUlRFX0JPTkRf TE9HKEVSUiwNCj4NCj4gKwkJCQkgICAgICJGYWlsZWQgdG8gc2V0IGxzYyBtb25pdG9yIHBvbGxp bmcgaW50ZXJ2YWwgKCV1IG1zKSBvbiBib25kZWQgZGV2aWNlICVzIiwNCj4NCj4gKwkJCQkgICAg IGxzY19wb2xsX2ludGVydmFsX21zLCBuYW1lKTsNCj4NCj4gKwkJCXJldHVybiAtMTsNCj4NCj4g KwkJfQ0KPg0KPiArCX0gZWxzZSBpZiAoYXJnX2NvdW50ID4gMSkgew0KPg0KPiArCQlSVEVfQk9O RF9MT0coSU5GTywNCj4NCj4gKwkJCSAgICAgIkxTQyBwb2xsaW5nIGludGVydmFsIGNhbiBiZSBz cGVjaWZpZWQgb25seSBvbmNlIGZvciBib25kZWQiDQo+DQo+ICsJCQkgICAgICIgZGV2aWNlICVz IiwgbmFtZSk7DQo+DQo+ICsJCXJldHVybiAtMTsNCj4NCj4gKwl9DQo+DQo+ICsNCj4NCj4gKwkv KiBQYXJzZSBsaW5rIHVwIGludGVycnVwdCBwcm9wYWdhdGlvbiBkZWxheSAqLw0KPg0KPiArCWFy Z19jb3VudCA9IHJ0ZV9rdmFyZ3NfY291bnQoa3ZsaXN0LCBQTURfQk9ORF9MSU5LX1VQX1BST1Bf REVMQVlfS1ZBUkcpOw0KPg0KPiArCWlmIChhcmdfY291bnQgPT0gMSkgew0KPg0KPiArCQl1aW50 MzJfdCBsaW5rX3VwX2RlbGF5X21zOw0KPg0KPiArDQo+DQo+ICsJCWlmIChydGVfa3ZhcmdzX3By b2Nlc3Moa3ZsaXN0LA0KPg0KPiArCQkJCSAgICAgICBQTURfQk9ORF9MSU5LX1VQX1BST1BfREVM QVlfS1ZBUkcsDQo+DQo+ICsJCQkJICAgICAgICZib25kX2V0aGRldl9wYXJzZV90aW1lX21zX2t2 YXJnLA0KPg0KPiArCQkJCSAgICAgICAmbGlua191cF9kZWxheV9tcykgPCAwKSB7DQo+DQo+ICsJ CQlSVEVfQk9ORF9MT0coSU5GTywNCj4NCj4gKwkJCQkgICAgICJJbnZhbGlkIGxpbmsgdXAgcHJv cGFnYXRpb24gZGVsYXkgdmFsdWUgc3BlY2lmaWVkIGZvciINCj4NCj4gKwkJCQkgICAgICIgYm9u ZGVkIGRldmljZSAlcyIsIG5hbWUpOw0KPg0KPiArCQkJcmV0dXJuIC0xOw0KPg0KPiArCQl9DQo+ DQo+ICsNCj4NCj4gKwkJLyogU2V0IGJhbGFuY2UgbW9kZSB0cmFuc21pdCBwb2xpY3kqLw0KPg0K PiArCQlpZiAocnRlX2V0aF9ib25kX2xpbmtfdXBfcHJvcF9kZWxheV9zZXQocG9ydF9pZCwgbGlu a191cF9kZWxheV9tcykNCj4NCj4gKwkJICAgICE9IDApIHsNCj4NCj4gKwkJCVJURV9CT05EX0xP RyhFUlIsDQo+DQo+ICsJCQkJICAgICAiRmFpbGVkIHRvIHNldCBsaW5rIHVwIHByb3BhZ2F0aW9u IGRlbGF5ICgldSBtcykgb24gYm9uZGVkIg0KPg0KPiArCQkJCSAgICAgIiBkZXZpY2UgJXMiLCBs aW5rX3VwX2RlbGF5X21zLCBuYW1lKTsNCj4NCj4gKwkJCXJldHVybiAtMTsNCj4NCj4gKwkJfQ0K Pg0KPiArCX0gZWxzZSBpZiAoYXJnX2NvdW50ID4gMSkgew0KPg0KPiArCQlSVEVfQk9ORF9MT0co SU5GTywNCj4NCj4gKwkJCSAgICAgIkxpbmsgdXAgcHJvcGFnYXRpb24gZGVsYXkgY2FuIGJlIHNw ZWNpZmllZCBvbmx5IG9uY2UgZm9yIg0KPg0KPiArCQkJICAgICAiIGJvbmRlZCBkZXZpY2UgJXMi LCBuYW1lKTsNCj4NCj4gKwkJcmV0dXJuIC0xOw0KPg0KPiArCX0NCj4NCj4gKw0KPg0KPiArCS8q IFBhcnNlIGxpbmsgZG93biBpbnRlcnJ1cHQgcHJvcGFnYXRpb24gZGVsYXkgKi8NCj4NCj4gKwlh cmdfY291bnQgPSBydGVfa3ZhcmdzX2NvdW50KGt2bGlzdCwgUE1EX0JPTkRfTElOS19ET1dOX1BS T1BfREVMQVlfS1ZBUkcpOw0KPg0KPiArCWlmIChhcmdfY291bnQgPT0gMSkgew0KPg0KPiArCQl1 aW50MzJfdCBsaW5rX2Rvd25fZGVsYXlfbXM7DQo+DQo+ICsNCj4NCj4gKwkJaWYgKHJ0ZV9rdmFy Z3NfcHJvY2Vzcyhrdmxpc3QsDQo+DQo+ICsJCQkJICAgICAgIFBNRF9CT05EX0xJTktfRE9XTl9Q Uk9QX0RFTEFZX0tWQVJHLA0KPg0KPiArCQkJCSAgICAgICAmYm9uZF9ldGhkZXZfcGFyc2VfdGlt ZV9tc19rdmFyZywNCj4NCj4gKwkJCQkgICAgICAgJmxpbmtfZG93bl9kZWxheV9tcykgPCAwKSB7 DQo+DQo+ICsJCQlSVEVfQk9ORF9MT0coSU5GTywNCj4NCj4gKwkJCQkgICAgICJJbnZhbGlkIGxp bmsgZG93biBwcm9wYWdhdGlvbiBkZWxheSB2YWx1ZSBzcGVjaWZpZWQgZm9yIg0KPg0KPiArCQkJ CSAgICAgIiBib25kZWQgZGV2aWNlICVzIiwgbmFtZSk7DQo+DQo+ICsJCQlyZXR1cm4gLTE7DQo+ DQo+ICsJCX0NCj4NCj4gKw0KPg0KPiArCQkvKiBTZXQgYmFsYW5jZSBtb2RlIHRyYW5zbWl0IHBv bGljeSovDQo+DQo+ICsJCWlmIChydGVfZXRoX2JvbmRfbGlua19kb3duX3Byb3BfZGVsYXlfc2V0 KHBvcnRfaWQsIGxpbmtfZG93bl9kZWxheV9tcykNCj4NCj4gKwkJICAgICE9IDApIHsNCj4NCj4g KwkJCVJURV9CT05EX0xPRyhFUlIsDQo+DQo+ICsJCQkJICAgICAiRmFpbGVkIHRvIHNldCBsaW5r IGRvd24gcHJvcGFnYXRpb24gZGVsYXkgKCV1IG1zKSBvbiBib25kZWQgZGV2aWNlICVzIiwNCj4N Cj4gKwkJCQkgICAgIGxpbmtfZG93bl9kZWxheV9tcywgbmFtZSk7DQo+DQo+ICsJCQlyZXR1cm4g LTE7DQo+DQo+ICsJCX0NCj4NCj4gKwl9IGVsc2UgaWYgKGFyZ19jb3VudCA+IDEpIHsNCj4NCj4g KwkJUlRFX0JPTkRfTE9HKElORk8sDQo+DQo+ICsJCQkgICAgICJMaW5rIGRvd24gcHJvcGFnYXRp b24gZGVsYXkgY2FuIGJlIHNwZWNpZmllZCBvbmx5IG9uY2UgZm9yICBib25kZWQgZGV2aWNlICVz IiwNCj4NCj4gKwkJCSAgICAgbmFtZSk7DQo+DQo+ICsJCXJldHVybiAtMTsNCj4NCj4gKwl9DQo+ DQo+ICsNCj4NCj4gKwkvKiBjb25maWd1cmUgc2xhdmVzIHNvIHdlIGNhbiBwYXNzIG10dSBzZXR0 aW5nICovDQo+DQo+ICsJZm9yIChpID0gMDsgaSA8IGludGVybmFscy0+c2xhdmVfY291bnQ7IGkr Kykgew0KPg0KPiArCQlzdHJ1Y3QgcnRlX2V0aF9kZXYgKnNsYXZlX2V0aGRldiA9DQo+DQo+ICsJ CQkJJihydGVfZXRoX2RldmljZXNbaW50ZXJuYWxzLT5zbGF2ZXNbaV0ucG9ydF9pZF0pOw0KPg0K PiArCQlpZiAoc2xhdmVfY29uZmlndXJlKGRldiwgc2xhdmVfZXRoZGV2KSAhPSAwKSB7DQo+DQo+ ICsJCQlSVEVfQk9ORF9MT0coRVJSLA0KPg0KPiArCQkJCSJib25kZWQgcG9ydCAoJWQpIGZhaWxl ZCB0byBjb25maWd1cmUgc2xhdmUgZGV2aWNlICglZCkiLA0KPg0KPiArCQkJCWRldi0+ZGF0YS0+ cG9ydF9pZCwNCj4NCj4gKwkJCQlpbnRlcm5hbHMtPnNsYXZlc1tpXS5wb3J0X2lkKTsNCj4NCj4g KwkJCXJldHVybiAtMTsNCj4NCj4gKwkJfQ0KPg0KPiArCX0NCj4NCj4gKwlyZXR1cm4gMDsNCj4N Cj4gK30NCj4NCj4gKw0KPg0KPiArc3RydWN0IHJ0ZV92ZGV2X2RyaXZlciBwbWRfYm9uZF9kcnYg PSB7DQo+DQo+ICsJLnByb2JlID0gYm9uZF9wcm9iZSwNCj4NCj4gKwkucmVtb3ZlID0gYm9uZF9y ZW1vdmUsDQo+DQo+ICt9Ow0KPg0KPiArDQo+DQo+ICtSVEVfUE1EX1JFR0lTVEVSX1ZERVYobmV0 X2JvbmRpbmcsIHBtZF9ib25kX2Rydik7DQo+DQo+ICtSVEVfUE1EX1JFR0lTVEVSX0FMSUFTKG5l dF9ib25kaW5nLCBldGhfYm9uZCk7DQo+DQo+ICsNCj4NCj4gK1JURV9QTURfUkVHSVNURVJfUEFS QU1fU1RSSU5HKG5ldF9ib25kaW5nLA0KPg0KPiArCSJzbGF2ZT08aWZjPiAiDQo+DQo+ICsJInBy aW1hcnk9PGlmYz4gIg0KPg0KPiArCSJtb2RlPVswLTZdICINCj4NCj4gKwkieG1pdF9wb2xpY3k9 W2wyIHwgbDIzIHwgbDM0XSAiDQo+DQo+ICsJImFnZ19tb2RlPVtjb3VudCB8IHN0YWJsZSB8IGJh bmR3aWR0aF0gIg0KPg0KPiArCSJzb2NrZXRfaWQ9PGludD4gIg0KPg0KPiArCSJtYWM9PG1hYyBh ZGRyPiAiDQo+DQo+ICsJImxzY19wb2xsX3BlcmlvZF9tcz08aW50PiAiDQo+DQo+ICsJInVwX2Rl bGF5PTxpbnQ+ICINCj4NCj4gKwkiZG93bl9kZWxheT08aW50PiIpOw0KPg0KPiArDQo+DQo+ICsv KiBXZSBjYW4ndCB1c2UgUlRFX0xPR19SRUdJU1RFUl9ERUZBVUxUIGJlY2F1c2Ugb2YgdGhlIGZv cmNlZCBuYW1lIGZvcg0KPg0KPiArICogdGhpcyBsaWJyYXJ5LCBzZWUgbWVzb24uYnVpbGQuDQo+ DQo+ICsgKi8NCj4NCj4gK1JURV9MT0dfUkVHSVNURVIoYm9uZF9sb2d0eXBlLCBwbWQubmV0LmJv bmRpbmcsIE5PVElDRSk7DQo+DQo=