From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 42138C43331 for ; Wed, 25 Mar 2020 12:20:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id ED4052077D for ; Wed, 25 Mar 2020 12:20:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727444AbgCYMU2 (ORCPT ); Wed, 25 Mar 2020 08:20:28 -0400 Received: from mga14.intel.com ([192.55.52.115]:23428 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726969AbgCYMU1 (ORCPT ); Wed, 25 Mar 2020 08:20:27 -0400 IronPort-SDR: OCgZ4qyX5fUUIkO/GkkfQbcPXFV8o9KFQtqR1pl3Vw9EfyiRBmW7UVgRkTpFQGaot1DuAQPpUn qK9F/IjDHuww== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Mar 2020 05:20:26 -0700 IronPort-SDR: +Ev+Qh8dc1HFvU6DXX0/fPoWtVMow9OtuWyyabubaJg1PGeKGDqlak+7rFgvH0PNDywPVI3XVK Hry9AKR2FuUg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,304,1580803200"; d="scan'208";a="270783283" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by fmsmga004.fm.intel.com with ESMTP; 25 Mar 2020 05:20:26 -0700 Received: from fmsmsx125.amr.corp.intel.com (10.18.125.40) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.439.0; Wed, 25 Mar 2020 05:20:26 -0700 Received: from shsmsx154.ccr.corp.intel.com (10.239.6.54) by FMSMSX125.amr.corp.intel.com (10.18.125.40) with Microsoft SMTP Server (TLS) id 14.3.439.0; Wed, 25 Mar 2020 05:20:26 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.206]) by SHSMSX154.ccr.corp.intel.com ([169.254.7.145]) with mapi id 14.03.0439.000; Wed, 25 Mar 2020 20:20:22 +0800 From: "Liu, Yi L" To: Peter Xu CC: "qemu-devel@nongnu.org" , "alex.williamson@redhat.com" , "eric.auger@redhat.com" , "pbonzini@redhat.com" , "mst@redhat.com" , "david@gibson.dropbear.id.au" , "Tian, Kevin" , "Tian, Jun J" , "Sun, Yi Y" , "kvm@vger.kernel.org" , "Wu, Hao" , "jean-philippe@linaro.org" , Jacob Pan , Yi Sun , Richard Henderson , Eduardo Habkost Subject: RE: [PATCH v1 12/22] intel_iommu: add PASID cache management infrastructure Thread-Topic: [PATCH v1 12/22] intel_iommu: add PASID cache management infrastructure Thread-Index: AQHWAEW2aRFWWYnjH0GPsoJBjbzVK6hXfaKAgAGT69A= Date: Wed, 25 Mar 2020 12:20:21 +0000 Message-ID: References: <1584880579-12178-1-git-send-email-yi.l.liu@intel.com> <1584880579-12178-13-git-send-email-yi.l.liu@intel.com> <20200324173209.GW127076@xz-x1> In-Reply-To: <20200324173209.GW127076@xz-x1> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org PiBGcm9tOiBQZXRlciBYdSA8cGV0ZXJ4QHJlZGhhdC5jb20+DQo+IFNlbnQ6IFdlZG5lc2RheSwg TWFyY2ggMjUsIDIwMjAgMTozMiBBTQ0KPiBUbzogTGl1LCBZaSBMIDx5aS5sLmxpdUBpbnRlbC5j b20+DQo+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggdjEgMTIvMjJdIGludGVsX2lvbW11OiBhZGQgUEFT SUQgY2FjaGUgbWFuYWdlbWVudA0KPiBpbmZyYXN0cnVjdHVyZQ0KPiANCj4gT24gU3VuLCBNYXIg MjIsIDIwMjAgYXQgMDU6MzY6MDlBTSAtMDcwMCwgTGl1IFlpIEwgd3JvdGU6DQo+ID4gVGhpcyBw YXRjaCBhZGRzIGEgUEFTSUQgY2FjaGUgbWFuYWdlbWVudCBpbmZyYXN0cnVjdHVyZSBiYXNlZCBv biBuZXcNCj4gPiBhZGRlZCBzdHJ1Y3R1cmUgVlREUEFTSURBZGRyZXNzU3BhY2UsIHdoaWNoIGlz IHVzZWQgdG8gdHJhY2sgdGhlIFBBU0lEDQo+ID4gdXNhZ2UgYW5kIGZ1dHVyZSBQQVNJRCB0YWdn ZWQgRE1BIGFkZHJlc3MgdHJhbnNsYXRpb24gc3VwcG9ydCBpbg0KPiA+IHZJT01NVS4NCj4gPg0K PiA+ICAgICBzdHJ1Y3QgVlREUEFTSURBZGRyZXNzU3BhY2Ugew0KPiA+ICAgICAgICAgVlREQnVz ICp2dGRfYnVzOw0KPiA+ICAgICAgICAgdWludDhfdCBkZXZmbjsNCj4gPiAgICAgICAgIEFkZHJl c3NTcGFjZSBhczsNCj4gPiAgICAgICAgIHVpbnQzMl90IHBhc2lkOw0KPiA+ICAgICAgICAgSW50 ZWxJT01NVVN0YXRlICppb21tdV9zdGF0ZTsNCj4gPiAgICAgICAgIFZURENvbnRleHRDYWNoZUVu dHJ5IGNvbnRleHRfY2FjaGVfZW50cnk7DQo+ID4gICAgICAgICBRTElTVF9FTlRSWShWVERQQVNJ REFkZHJlc3NTcGFjZSkgbmV4dDsNCj4gPiAgICAgICAgIFZURFBBU0lEQ2FjaGVFbnRyeSBwYXNp ZF9jYWNoZV9lbnRyeTsNCj4gPiAgICAgfTsNCj4gPg0KPiA+IElkZWFsbHksIGEgVlREUEFTSURB ZGRyZXNzU3BhY2UgaW5zdGFuY2UgaXMgY3JlYXRlZCB3aGVuIGEgUEFTSUQgaXMNCj4gPiBib3Vu ZCB3aXRoIGEgRE1BIEFkZHJlc3NTcGFjZS4gSW50ZWwgVlQtZCBzcGVjIHJlcXVpcmVzIGd1ZXN0 IHNvZnR3YXJlDQo+ID4gdG8gaXNzdWUgcGFzaWQgY2FjaGUgaW52YWxpZGF0aW9uIHdoZW4gYmlu ZCBvciB1bmJpbmQgYSBwYXNpZCB3aXRoIGFuDQo+ID4gYWRkcmVzcyBzcGFjZSB1bmRlciBjYWNo aW5nLW1vZGUuIEhvd2V2ZXIsIGFzIFZURFBBU0lEQWRkcmVzc1NwYWNlDQo+ID4gaW5zdGFuY2Vz IGFsc28gYWN0IGFzIHBhc2lkIGNhY2hlIGluIHRoaXMgaW1wbGVtZW50YXRpb24sIGl0cyBjcmVh dGlvbg0KPiA+IGFsc28gaGFwcGVucyBkdXJpbmcgdklPTU1VIFBBU0lEIHRhZ2dlZCBETUEgdHJh bnNsYXRpb24uIFRoZSBjcmVhdGlvbg0KPiA+IGluIHRoaXMgcGF0aCB3aWxsIG5vdCBiZSBhZGRl ZCBpbiB0aGlzIHBhdGNoIHNpbmNlIG5vIFBBU0lELWNhcGFibGUNCj4gPiBlbXVsYXRlZCBkZXZp Y2VzIGZvciBub3cuDQo+ID4NCj4gPiBUaGUgaW1wbGVtZW50YXRpb24gaW4gdGhpcyBwYXRjaCBt YW5hZ2VzIFZURFBBU0lEQWRkcmVzc1NwYWNlDQo+ID4gaW5zdGFuY2VzIHBlciBQQVNJRCtCREYg KGxvb2t1cCBhbmQgaW5zZXJ0IHdpbGwgdXNlIFBBU0lEIGFuZA0KPiA+IEJERikgc2luY2UgSW50 ZWwgVlQtZCBzcGVjIGFsbG93cyBwZXItQkRGIFBBU0lEIFRhYmxlLiBXaGVuIGEgZ3Vlc3QNCj4g PiBiaW5kIGEgUEFTSUQgd2l0aCBhbiBBZGRyZXNzU3BhY2UsIFFFTVUgd2lsbCBjYXB0dXJlIHRo ZSBndWVzdCBwYXNpZA0KPiA+IHNlbGVjdGl2ZSBwYXNpZCBjYWNoZSBpbnZhbGlkYXRpb24sIGFu ZCBhbGxvY2F0ZSByZW1vdmUgYQ0KPiA+IFZURFBBU0lEQWRkcmVzc1NwYWNlIGluc3RhbmNlIHBl ciB0aGUgaW52YWxpZGF0aW9uDQo+ID4gcmVhc29uczoNCj4gPg0KPiA+ICAgICAqKSBhIHByZXNl bnQgcGFzaWQgZW50cnkgbW92ZWQgdG8gbm9uLXByZXNlbnQNCj4gPiAgICAgKikgYSBwcmVzZW50 IHBhc2lkIGVudHJ5IHRvIGJlIGEgcHJlc2VudCBlbnRyeQ0KPiA+ICAgICAqKSBhIG5vbi1wcmVz ZW50IHBhc2lkIGVudHJ5IG1vdmVkIHRvIHByZXNlbnQNCj4gPg0KPiA+IHZJT01NVSBlbXVsYXRv ciBjb3VsZCBmaWd1cmUgb3V0IHRoZSByZWFzb24gYnkgZmV0Y2hpbmcgbGF0ZXN0IGd1ZXN0DQo+ ID4gcGFzaWQgZW50cnkuDQo+ID4NCj4gPiBDYzogS2V2aW4gVGlhbiA8a2V2aW4udGlhbkBpbnRl bC5jb20+DQo+ID4gQ2M6IEphY29iIFBhbiA8amFjb2IuanVuLnBhbkBsaW51eC5pbnRlbC5jb20+ DQo+ID4gQ2M6IFBldGVyIFh1IDxwZXRlcnhAcmVkaGF0LmNvbT4NCj4gPiBDYzogWWkgU3VuIDx5 aS55LnN1bkBsaW51eC5pbnRlbC5jb20+DQo+ID4gQ2M6IFBhb2xvIEJvbnppbmkgPHBib256aW5p QHJlZGhhdC5jb20+DQo+ID4gQ2M6IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdHdpZGRsZS5uZXQ+ DQo+ID4gQ2M6IEVkdWFyZG8gSGFia29zdCA8ZWhhYmtvc3RAcmVkaGF0LmNvbT4NCj4gPiBTaWdu ZWQtb2ZmLWJ5OiBMaXUgWWkgTCA8eWkubC5saXVAaW50ZWwuY29tPg0KPiA+IC0tLQ0KPiA+ICBo dy9pMzg2L2ludGVsX2lvbW11LmMgICAgICAgICAgfCAzOTQNCj4gKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysNCj4gPiAgaHcvaTM4Ni9pbnRlbF9pb21tdV9pbnRlcm5h bC5oIHwgIDE0ICsrDQo+ID4gIGh3L2kzODYvdHJhY2UtZXZlbnRzICAgICAgICAgICB8ICAgMSAr DQo+ID4gIGluY2x1ZGUvaHcvaTM4Ni9pbnRlbF9pb21tdS5oICB8ICAzMyArKystDQo+ID4gIDQg ZmlsZXMgY2hhbmdlZCwgNDQxIGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkNCj4gPg0KPiA+ IGRpZmYgLS1naXQgYS9ody9pMzg2L2ludGVsX2lvbW11LmMgYi9ody9pMzg2L2ludGVsX2lvbW11 LmMgaW5kZXgNCj4gPiAxZGFlYWIyLi5jOTg1Y2FlIDEwMDY0NA0KPiA+IC0tLSBhL2h3L2kzODYv aW50ZWxfaW9tbXUuYw0KPiA+ICsrKyBiL2h3L2kzODYvaW50ZWxfaW9tbXUuYw0KPiA+IEBAIC00 MCw2ICs0MCw3IEBADQo+ID4gICNpbmNsdWRlICJrdm1faTM4Ni5oIg0KPiA+ICAjaW5jbHVkZSAi bWlncmF0aW9uL3Ztc3RhdGUuaCINCj4gPiAgI2luY2x1ZGUgInRyYWNlLmgiDQo+ID4gKyNpbmNs dWRlICJxZW11L2poYXNoLmgiDQo+ID4NCj4gPiAgLyogY29udGV4dCBlbnRyeSBvcGVyYXRpb25z ICovDQo+ID4gICNkZWZpbmUgVlREX0NFX0dFVF9SSUQyUEFTSUQoY2UpIFwNCj4gPiBAQCAtNjUs NiArNjYsOCBAQA0KPiA+ICBzdGF0aWMgdm9pZCB2dGRfYWRkcmVzc19zcGFjZV9yZWZyZXNoX2Fs bChJbnRlbElPTU1VU3RhdGUgKnMpOw0KPiA+IHN0YXRpYyB2b2lkIHZ0ZF9hZGRyZXNzX3NwYWNl X3VubWFwKFZUREFkZHJlc3NTcGFjZSAqYXMsIElPTU1VTm90aWZpZXINCj4gPiAqbik7DQo+ID4N Cj4gPiArc3RhdGljIHZvaWQgdnRkX3Bhc2lkX2NhY2hlX3Jlc2V0KEludGVsSU9NTVVTdGF0ZSAq cyk7DQo+ID4gKw0KPiA+ICBzdGF0aWMgdm9pZCB2dGRfcGFuaWNfcmVxdWlyZV9jYWNoaW5nX21v ZGUodm9pZCkNCj4gPiAgew0KPiA+ICAgICAgZXJyb3JfcmVwb3J0KCJXZSBuZWVkIHRvIHNldCBj YWNoaW5nLW1vZGU9b24gZm9yIGludGVsLWlvbW11IHRvIGVuYWJsZSAiDQo+ID4gQEAgLTI3Niw2 ICsyNzksNyBAQCBzdGF0aWMgdm9pZCB2dGRfcmVzZXRfY2FjaGVzKEludGVsSU9NTVVTdGF0ZSAq cykNCj4gPiAgICAgIHZ0ZF9pb21tdV9sb2NrKHMpOw0KPiA+ICAgICAgdnRkX3Jlc2V0X2lvdGxi X2xvY2tlZChzKTsNCj4gPiAgICAgIHZ0ZF9yZXNldF9jb250ZXh0X2NhY2hlX2xvY2tlZChzKTsN Cj4gPiArICAgIHZ0ZF9wYXNpZF9jYWNoZV9yZXNldChzKTsNCj4gPiAgICAgIHZ0ZF9pb21tdV91 bmxvY2socyk7DQo+ID4gIH0NCj4gPg0KPiA+IEBAIC02ODYsNiArNjkwLDExIEBAIHN0YXRpYyBp bmxpbmUgYm9vbCB2dGRfcGVfdHlwZV9jaGVjayhYODZJT01NVVN0YXRlDQo+ICp4ODZfaW9tbXUs DQo+ID4gICAgICByZXR1cm4gdHJ1ZTsNCj4gPiAgfQ0KPiA+DQo+ID4gK3N0YXRpYyBpbmxpbmUg dWludDE2X3QgdnRkX3BlX2dldF9kb21haW5faWQoVlREUEFTSURFbnRyeSAqcGUpIHsNCj4gPiAr ICAgIHJldHVybiBWVERfU01fUEFTSURfRU5UUllfRElEKChwZSktPnZhbFsxXSk7DQo+ID4gK30N Cj4gPiArDQo+ID4gIHN0YXRpYyBpbmxpbmUgYm9vbCB2dGRfcGRpcmVfcHJlc2VudChWVERQQVNJ RERpckVudHJ5ICpwZGlyZSkgIHsNCj4gPiAgICAgIHJldHVybiBwZGlyZS0+dmFsICYgMTsNCj4g PiBAQCAtMjM5NSwxOSArMjQwNCw0MDIgQEAgc3RhdGljIGJvb2wNCj4gdnRkX3Byb2Nlc3NfaW90 bGJfZGVzYyhJbnRlbElPTU1VU3RhdGUgKnMsIFZUREludkRlc2MgKmludl9kZXNjKQ0KPiA+ICAg ICAgcmV0dXJuIHRydWU7DQo+ID4gIH0NCj4gPg0KPiA+ICtzdGF0aWMgaW5saW5lIHZvaWQgdnRk X2luaXRfcGFzaWRfa2V5KHVpbnQzMl90IHBhc2lkLA0KPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2lkLA0KPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgc3RydWN0IHBhc2lkX2tleSAqa2V5KSB7DQo+ID4gKyAgICBrZXkt PnBhc2lkID0gcGFzaWQ7DQo+ID4gKyAgICBrZXktPnNpZCA9IHNpZDsNCj4gPiArfQ0KPiA+ICsN Cj4gPiArc3RhdGljIGd1aW50IHZ0ZF9wYXNpZF9hc19rZXlfaGFzaChnY29uc3Rwb2ludGVyIHYp IHsNCj4gPiArICAgIHN0cnVjdCBwYXNpZF9rZXkgKmtleSA9IChzdHJ1Y3QgcGFzaWRfa2V5ICop djsNCj4gPiArICAgIHVpbnQzMl90IGEsIGIsIGM7DQo+ID4gKw0KPiA+ICsgICAgLyogSmVua2lu cyBoYXNoICovDQo+ID4gKyAgICBhID0gYiA9IGMgPSBKSEFTSF9JTklUVkFMICsgc2l6ZW9mKCpr ZXkpOw0KPiA+ICsgICAgYSArPSBrZXktPnNpZDsNCj4gPiArICAgIGIgKz0gZXh0cmFjdDMyKGtl eS0+cGFzaWQsIDAsIDE2KTsNCj4gPiArICAgIGMgKz0gZXh0cmFjdDMyKGtleS0+cGFzaWQsIDE2 LCAxNik7DQo+ID4gKw0KPiA+ICsgICAgX19qaGFzaF9taXgoYSwgYiwgYyk7DQo+ID4gKyAgICBf X2poYXNoX2ZpbmFsKGEsIGIsIGMpOw0KPiA+ICsNCj4gPiArICAgIHJldHVybiBjOw0KPiA+ICt9 DQo+ID4gKw0KPiA+ICtzdGF0aWMgZ2Jvb2xlYW4gdnRkX3Bhc2lkX2FzX2tleV9lcXVhbChnY29u c3Rwb2ludGVyIHYxLA0KPiA+ICtnY29uc3Rwb2ludGVyIHYyKSB7DQo+ID4gKyAgICBjb25zdCBz dHJ1Y3QgcGFzaWRfa2V5ICprMSA9IHYxOw0KPiA+ICsgICAgY29uc3Qgc3RydWN0IHBhc2lkX2tl eSAqazIgPSB2MjsNCj4gPiArDQo+ID4gKyAgICByZXR1cm4gKGsxLT5wYXNpZCA9PSBrMi0+cGFz aWQpICYmIChrMS0+c2lkID09IGsyLT5zaWQpOyB9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW5saW5l IGludCB2dGRfZGV2X2dldF9wZV9mcm9tX3Bhc2lkKEludGVsSU9NTVVTdGF0ZSAqcywNCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJ1c19u dW0sDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlu dDhfdCBkZXZmbiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB1aW50MzJfdCBwYXNpZCwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBWVERQQVNJREVudHJ5ICpwZSkgew0KPiA+ICsgICAgVlREQ29udGV4dEVu dHJ5IGNlOw0KPiA+ICsgICAgaW50IHJldDsNCj4gPiArICAgIGRtYV9hZGRyX3QgcGFzaWRfZGly X2Jhc2U7DQo+ID4gKw0KPiA+ICsgICAgaWYgKCFzLT5yb290X3NjYWxhYmxlKSB7DQo+ID4gKyAg ICAgICAgcmV0dXJuIC1WVERfRlJfUEFTSURfVEFCTEVfSU5WOw0KPiA+ICsgICAgfQ0KPiA+ICsN Cj4gPiArICAgIHJldCA9IHZ0ZF9kZXZfdG9fY29udGV4dF9lbnRyeShzLCBidXNfbnVtLCBkZXZm biwgJmNlKTsNCj4gPiArICAgIGlmIChyZXQpIHsNCj4gPiArICAgICAgICByZXR1cm4gcmV0Ow0K PiA+ICsgICAgfQ0KPiA+ICsNCj4gPiArICAgIHBhc2lkX2Rpcl9iYXNlID0gVlREX0NFX0dFVF9Q QVNJRF9ESVJfVEFCTEUoJmNlKTsNCj4gPiArICAgIHJldCA9IHZ0ZF9nZXRfcGVfZnJvbV9wYXNp ZF90YWJsZShzLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzaWRf ZGlyX2Jhc2UsIHBhc2lkLCBwZSk7DQo+IA0KPiBUaGUgaW5kZW50cyBhY3Jvc3MgdGhlIHNlcmll cyBhcmUgc3RpbGwgc3RyYW5nZS4uLiAgVGFrZSB0aGlzIG9uZSBhcyBleGFtcGxlLCBub3JuYWxs eQ0KPiBJJ2xsIGluZGVudCBhdCB0aGUgbGVmdCBicmFja2V0IGlmIEkgd2FudCB0byB1c2UgYW5v dGhlciBuZXdsaW5lOg0KPiANCj4gICAgICAgIHJldCA9IHZ0ZF9nZXRfcGVfZnJvbV9wYXNpZF90 YWJsZShzLCBwYXNpZF9kaXJfYmFzZSwNCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwYXNpZCwgcGUpOw0KPiANCj4gQW5kIGhlcmUgYWN0dWFsbHkgeW91IGRvbid0 IG5lZWQgYSBuZXcgbGluZSBhdCBhbGwgYmVjYXVzZSBpdCdzIG9ubHkNCj4gNzAgY2hhcnMuLi4N Cj4gDQo+IEkgZG9uJ3QgdGhpbmsgaXQncyBhIG11c3QgKEkgYW0gYWx3YXlzIG5vdCBzdXJlIHdo ZXRoZXIgd2Ugc2hvdWxkIGJlIHRoYXQgc3RyaWN0IG9uIGFsbA0KPiB0aGVzZSksIGJ1dCBpdCBz aG91bGQgYmUgcHJlZmVycmVkIGlmIHlvdSBjaGFuZ2UgYWxsIHRoZSBzaW1pbGFyIHBsYWNlcyB3 aXRoIHRoZSBzYW1lDQo+IGluZGVudGF0aW9uIGFzIHRoZSBleGlzdGluZyBjb2RlLg0KDQpTdXJl LCBJJ2xsIGhhdmUgYSBkb3VibGUgY2hlY2sgb24gaXQuDQoNCj4gPiArDQo+ID4gKyAgICByZXR1 cm4gcmV0Ow0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgYm9vbCB2dGRfcGFzaWRfZW50cnlf Y29tcGFyZShWVERQQVNJREVudHJ5ICpwMSwgVlREUEFTSURFbnRyeQ0KPiA+ICsqcDIpIHsNCj4g PiArICAgIHJldHVybiAhbWVtY21wKHAxLCBwMiwgc2l6ZW9mKCpwMSkpOyB9DQo+ID4gKw0KPiA+ ICsvKioNCj4gPiArICogVGhpcyBmdW5jdGlvbiBjYWNoZWQgdGhlIHBhc2lkIGVudHJ5IGluICZ2 dGRfcGFzaWRfYXMuIEFsc28NCj4gPiArICogbm90aWZpZXMgaG9zdCBhYm91dCB0aGUgbmV3IHBh c2lkIGJpbmRpbmcuIENhbGxlciBvZiB0aGlzDQo+ID4gKyAqIGZ1bmN0aW9uIHNob3VsZCBob2xk IGlvbW11X2xvY2suDQo+ID4gKyAqLw0KPiA+ICtzdGF0aWMgaW5saW5lIHZvaWQgdnRkX2ZpbGxf aW5fcGVfaW5fY2FjaGUoSW50ZWxJT01NVVN0YXRlICpzLA0KPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgVlREUEFTSURBZGRyZXNzU3BhY2UgKnZ0ZF9wYXNp ZF9hcywNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZU RFBBU0lERW50cnkgKnBlKSB7DQo+ID4gKyAgICBWVERQQVNJRENhY2hlRW50cnkgKnBjX2VudHJ5 ID0gJnZ0ZF9wYXNpZF9hcy0+cGFzaWRfY2FjaGVfZW50cnk7DQo+ID4gKw0KPiA+ICsgICAgcGNf ZW50cnktPnBhc2lkX2VudHJ5ID0gKnBlOw0KPiA+ICsgICAgcGNfZW50cnktPnBhc2lkX2NhY2hl X2dlbiA9IHMtPnBhc2lkX2NhY2hlX2dlbjsNCj4gPiArICAgIC8qDQo+ID4gKyAgICAgKiBUT0RP Og0KPiA+ICsgICAgICogLSBzZW5kIHBhc2lkIGJpbmQgdG8gaG9zdCBmb3IgcGFzc3RocnUgZGV2 aWNlcw0KPiA+ICsgICAgICovDQo+ID4gK30NCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsgKiBUaGlz IGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHBhc2lkIGVudHJ5IGNhY2hlZCBpbiAmdnRkX3Bhc2lkX2Fz Lg0KPiA+ICsgKiBDYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiBzaG91bGQgaG9sZCBpb21tdV9sb2Nr Lg0KPiA+ICsgKi8NCj4gPiArc3RhdGljIHZvaWQgdnRkX3VwZGF0ZV9wZV9pbl9jYWNoZShJbnRl bElPTU1VU3RhdGUgKnMsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg VlREUEFTSURBZGRyZXNzU3BhY2UgKnZ0ZF9wYXNpZF9hcywNCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBWVERQQVNJREVudHJ5ICpwZSkgew0KPiA+ICsgICAgVlREUEFT SURDYWNoZUVudHJ5ICpwY19lbnRyeSA9ICZ2dGRfcGFzaWRfYXMtPnBhc2lkX2NhY2hlX2VudHJ5 Ow0KPiA+ICsNCj4gPiArICAgIGlmICh2dGRfcGFzaWRfZW50cnlfY29tcGFyZShwZSwgJnBjX2Vu dHJ5LT5wYXNpZF9lbnRyeSkpIHsNCj4gPiArICAgICAgICAvKiBObyBuZWVkIHRvIGdvIGZ1cnRo ZXIgYXMgY2FjaGVkIHBhc2lkIGVudHJ5IGlzIGxhdGVzdCAqLw0KPiA+ICsgICAgICAgIHJldHVy bjsNCj4gPiArICAgIH0NCj4gPiArDQo+ID4gKyAgICB2dGRfZmlsbF9pbl9wZV9pbl9jYWNoZShz LCB2dGRfcGFzaWRfYXMsIHBlKTsgfQ0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAqIFRoaXMgZnVu Y3Rpb24gaXMgdXNlZCB0byBjbGVhciBwYXNpZF9jYWNoZV9nZW4gb2YgY2FjaGVkIHBhc2lkDQo+ ID4gKyAqIGVudHJ5IGluIHZ0ZF9wYXNpZF9hcyBpbnN0YW5jZXMuIENhbGxlciBvZiB0aGlzIGZ1 bmN0aW9uIHNob3VsZA0KPiA+ICsgKiBob2xkIGlvbW11X2xvY2suDQo+ID4gKyAqLw0KPiA+ICtz dGF0aWMgZ2Jvb2xlYW4gdnRkX2ZsdXNoX3Bhc2lkKGdwb2ludGVyIGtleSwgZ3BvaW50ZXIgdmFs dWUsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9k YXRhKSB7DQo+ID4gKyAgICBWVERQQVNJRENhY2hlSW5mbyAqcGNfaW5mbyA9IHVzZXJfZGF0YTsN Cj4gPiArICAgIFZURFBBU0lEQWRkcmVzc1NwYWNlICp2dGRfcGFzaWRfYXMgPSB2YWx1ZTsNCj4g PiArICAgIEludGVsSU9NTVVTdGF0ZSAqcyA9IHZ0ZF9wYXNpZF9hcy0+aW9tbXVfc3RhdGU7DQo+ ID4gKyAgICBWVERQQVNJRENhY2hlRW50cnkgKnBjX2VudHJ5ID0gJnZ0ZF9wYXNpZF9hcy0+cGFz aWRfY2FjaGVfZW50cnk7DQo+ID4gKyAgICBWVERCdXMgKnZ0ZF9idXMgPSB2dGRfcGFzaWRfYXMt PnZ0ZF9idXM7DQo+ID4gKyAgICBWVERQQVNJREVudHJ5IHBlOw0KPiA+ICsgICAgdWludDE2X3Qg ZGlkOw0KPiA+ICsgICAgdWludDMyX3QgcGFzaWQ7DQo+ID4gKyAgICB1aW50MTZfdCBkZXZmbjsN Cj4gPiArICAgIGludCByZXQ7DQo+ID4gKw0KPiA+ICsgICAgZGlkID0gdnRkX3BlX2dldF9kb21h aW5faWQoJnBjX2VudHJ5LT5wYXNpZF9lbnRyeSk7DQo+ID4gKyAgICBwYXNpZCA9IHZ0ZF9wYXNp ZF9hcy0+cGFzaWQ7DQo+ID4gKyAgICBkZXZmbiA9IHZ0ZF9wYXNpZF9hcy0+ZGV2Zm47DQo+ID4g Kw0KPiA+ICsgICAgaWYgKCEocGNfZW50cnktPnBhc2lkX2NhY2hlX2dlbiA9PSBzLT5wYXNpZF9j YWNoZV9nZW4pKSB7DQo+ID4gKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KPiA+ICsgICAgfQ0KPiA+ ICsNCj4gPiArICAgIHN3aXRjaCAocGNfaW5mby0+ZmxhZ3MgJiBWVERfUEFTSURfQ0FDSEVfSU5G T19NQVNLKSB7DQo+ID4gKyAgICBjYXNlIFZURF9QQVNJRF9DQUNIRV9QQVNJRFNJOg0KPiA+ICsg ICAgICAgIGlmIChwY19pbmZvLT5wYXNpZCAhPSBwYXNpZCkgew0KPiA+ICsgICAgICAgICAgICBy ZXR1cm4gZmFsc2U7DQo+ID4gKyAgICAgICAgfQ0KPiA+ICsgICAgICAgIC8qIEZhbGwgdGhyb3Vn aCAqLw0KPiA+ICsgICAgY2FzZSBWVERfUEFTSURfQ0FDSEVfRE9NU0k6DQo+ID4gKyAgICAgICAg aWYgKHBjX2luZm8tPmRvbWFpbl9pZCAhPSBkaWQpIHsNCj4gPiArICAgICAgICAgICAgcmV0dXJu IGZhbHNlOw0KPiA+ICsgICAgICAgIH0NCj4gPiArICAgICAgICAvKiBGYWxsIHRocm91Z2ggKi8N Cj4gPiArICAgIGNhc2UgVlREX1BBU0lEX0NBQ0hFX0dMT0JBTDoNCj4gPiArICAgICAgICBicmVh azsNCj4gPiArICAgIGRlZmF1bHQ6DQo+ID4gKyAgICAgICAgZXJyb3JfcmVwb3J0KCJpbnZhbGlk IHBjX2luZm8tPmZsYWdzIik7DQo+ID4gKyAgICAgICAgYWJvcnQoKTsNCj4gPiArICAgIH0NCj4g PiArDQo+ID4gKyAgICAvKg0KPiA+ICsgICAgICogcGFzaWQgY2FjaGUgaW52YWxpZGF0aW9uIG1h eSBpbmRpY2F0ZSBhIHByZXNlbnQgcGFzaWQNCj4gPiArICAgICAqIGVudHJ5IHRvIHByZXNlbnQg cGFzaWQgZW50cnkgbW9kaWZpY2F0aW9uLiBUbyBjb3ZlciBzdWNoDQo+ID4gKyAgICAgKiBjYXNl LCB2SU9NTVUgZW11bGF0b3IgbmVlZHMgdG8gZmV0Y2ggbGF0ZXN0IGd1ZXN0IHBhc2lkDQo+ID4g KyAgICAgKiBlbnRyeSBhbmQgY2hlY2sgY2FjaGVkIHBhc2lkIGVudHJ5LCB0aGVuIHVwZGF0ZSBw YXNpZA0KPiA+ICsgICAgICogY2FjaGUgYW5kIHNlbmQgcGFzaWQgYmluZC91bmJpbmQgdG8gaG9z dCBwcm9wZXJseS4NCj4gPiArICAgICAqLw0KPiA+ICsgICAgcmV0ID0gdnRkX2Rldl9nZXRfcGVf ZnJvbV9wYXNpZChzLA0KPiA+ICsgICAgICAgICAgICAgICAgICBwY2lfYnVzX251bSh2dGRfYnVz LT5idXMpLCBkZXZmbiwgcGFzaWQsICZwZSk7DQo+ID4gKyAgICBpZiAocmV0KSB7DQo+ID4gKyAg ICAgICAgLyoNCj4gPiArICAgICAgICAgKiBObyB2YWxpZCBwYXNpZCBlbnRyeSBpbiBndWVzdCBt ZW1vcnkuIGUuZy4gcGFzaWQgZW50cnkNCj4gPiArICAgICAgICAgKiB3YXMgbW9kaWZpZWQgdG8g YmUgZWl0aGVyIGFsbC16ZXJvIG9yIG5vbi1wcmVzZW50LiBFaXRoZXINCj4gPiArICAgICAgICAg KiBjYXNlIG1lYW5zIGV4aXN0aW5nIHBhc2lkIGNhY2hlIHNob3VsZCBiZSByZW1vdmVkLg0KPiA+ ICsgICAgICAgICAqLw0KPiA+ICsgICAgICAgIGdvdG8gcmVtb3ZlOw0KPiA+ICsgICAgfQ0KPiA+ ICsNCj4gPiArICAgIHZ0ZF91cGRhdGVfcGVfaW5fY2FjaGUocywgdnRkX3Bhc2lkX2FzLCAmcGUp Ow0KPiA+ICsgICAgLyoNCj4gPiArICAgICAqIFRPRE86DQo+ID4gKyAgICAgKiAtIHdoZW4gcGFz aWQtYmFzZS1pb3RsYihwaW90bGIpIGluZnJhc3RydWN0dXJlIGlzIHJlYWR5LA0KPiA+ICsgICAg ICogICBzaG91bGQgaW52YWxpZGF0ZSBRRU1VIHBpb3RsYiB0b2dlaHRlciB3aXRoIHRoaXMgY2hh bmdlLg0KPiA+ICsgICAgICovDQo+ID4gKyAgICByZXR1cm4gZmFsc2U7DQo+ID4gK3JlbW92ZToN Cj4gPiArICAgIC8qDQo+ID4gKyAgICAgKiBUT0RPOg0KPiA+ICsgICAgICogLSBzZW5kIHBhc2lk IGJpbmQgdG8gaG9zdCBmb3IgcGFzc3RocnUgZGV2aWNlcw0KPiA+ICsgICAgICogLSB3aGVuIHBh c2lkLWJhc2UtaW90bGIocGlvdGxiKSBpbmZyYXN0cnVjdHVyZSBpcyByZWFkeSwNCj4gPiArICAg ICAqICAgc2hvdWxkIGludmFsaWRhdGUgUUVNVSBwaW90bGIgdG9nZWh0ZXIgd2l0aCB0aGlzIGNo YW5nZS4NCj4gPiArICAgICAqLw0KPiA+ICsgICAgcmV0dXJuIHRydWU7DQo+ID4gK30NCj4gPiAr DQo+ID4gKy8qKg0KPiA+ICsgKiBUaGlzIGZ1bmN0aW9uIGZpbmRzIG9yIGFkZHMgYSBWVERQQVNJ REFkZHJlc3NTcGFjZSBmb3IgYSBkZXZpY2UNCj4gPiArICogd2hlbiBpdCBpcyBib3VuZCB0byBh IHBhc2lkLiBDYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiBzaG91bGQgaG9sZA0KPiA+ICsgKiBpb21t dV9sb2NrLg0KPiA+ICsgKi8NCj4gPiArc3RhdGljIFZURFBBU0lEQWRkcmVzc1NwYWNlICp2dGRf YWRkX2ZpbmRfcGFzaWRfYXMoSW50ZWxJT01NVVN0YXRlICpzLA0KPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVERCdXMgKnZ0ZF9idXMsDQo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu dCBkZXZmbiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdWludDMyX3QgcGFzaWQpIHsNCj4gPiArICAgIHN0cnVjdCBwYXNpZF9rZXkga2V5 Ow0KPiA+ICsgICAgc3RydWN0IHBhc2lkX2tleSAqbmV3X2tleTsNCj4gPiArICAgIFZURFBBU0lE QWRkcmVzc1NwYWNlICp2dGRfcGFzaWRfYXM7DQo+ID4gKyAgICB1aW50MTZfdCBzaWQ7DQo+ID4g Kw0KPiA+ICsgICAgc2lkID0gdnRkX21ha2Vfc291cmNlX2lkKHBjaV9idXNfbnVtKHZ0ZF9idXMt PmJ1cyksIGRldmZuKTsNCj4gPiArICAgIHZ0ZF9pbml0X3Bhc2lkX2tleShwYXNpZCwgc2lkLCAm a2V5KTsNCj4gPiArICAgIHZ0ZF9wYXNpZF9hcyA9IGdfaGFzaF90YWJsZV9sb29rdXAocy0+dnRk X3Bhc2lkX2FzLCAma2V5KTsNCj4gPiArDQo+ID4gKyAgICBpZiAoIXZ0ZF9wYXNpZF9hcykgew0K PiA+ICsgICAgICAgIG5ld19rZXkgPSBnX21hbGxvYzAoc2l6ZW9mKCpuZXdfa2V5KSk7DQo+ID4g KyAgICAgICAgdnRkX2luaXRfcGFzaWRfa2V5KHBhc2lkLCBzaWQsIG5ld19rZXkpOw0KPiA+ICsg ICAgICAgIC8qDQo+ID4gKyAgICAgICAgICogSW5pdGlhdGUgdGhlIHZ0ZF9wYXNpZF9hcyBzdHJ1 Y3R1cmUuDQo+ID4gKyAgICAgICAgICoNCj4gPiArICAgICAgICAgKiBUaGlzIHN0cnVjdHVyZSBo ZXJlIGlzIHVzZWQgdG8gdHJhY2sgdGhlIGd1ZXN0IHBhc2lkDQo+ID4gKyAgICAgICAgICogYmlu ZGluZyBhbmQgYWxzbyBzZXJ2ZXMgYXMgcGFzaWQtY2FjaGUgbWFuZ2VtZW50IGVudHJ5Lg0KPiA+ ICsgICAgICAgICAqDQo+ID4gKyAgICAgICAgICogVE9ETzogaW4gZnV0dXJlLCBpZiB3YW50cyB0 byBzdXBwb3J0IHRoZSBTVkEtYXdhcmUgRE1BDQo+ID4gKyAgICAgICAgICogICAgICAgZW11bGF0 aW9uLCB0aGUgdnRkX3Bhc2lkX2FzIHNob3VsZCBoYXZlIGluY2x1ZGUNCj4gPiArICAgICAgICAg KiAgICAgICBBZGRyZXNzU3BhY2UgdG8gc3VwcG9ydCBETUEgZW11bGF0aW9uLg0KPiA+ICsgICAg ICAgICAqLw0KPiA+ICsgICAgICAgIHZ0ZF9wYXNpZF9hcyA9IGdfbWFsbG9jMChzaXplb2YoVlRE UEFTSURBZGRyZXNzU3BhY2UpKTsNCj4gPiArICAgICAgICB2dGRfcGFzaWRfYXMtPmlvbW11X3N0 YXRlID0gczsNCj4gPiArICAgICAgICB2dGRfcGFzaWRfYXMtPnZ0ZF9idXMgPSB2dGRfYnVzOw0K PiA+ICsgICAgICAgIHZ0ZF9wYXNpZF9hcy0+ZGV2Zm4gPSBkZXZmbjsNCj4gPiArICAgICAgICB2 dGRfcGFzaWRfYXMtPmNvbnRleHRfY2FjaGVfZW50cnkuY29udGV4dF9jYWNoZV9nZW4gPSAwOw0K PiA+ICsgICAgICAgIHZ0ZF9wYXNpZF9hcy0+cGFzaWQgPSBwYXNpZDsNCj4gPiArICAgICAgICB2 dGRfcGFzaWRfYXMtPnBhc2lkX2NhY2hlX2VudHJ5LnBhc2lkX2NhY2hlX2dlbiA9IDA7DQo+ID4g KyAgICAgICAgZ19oYXNoX3RhYmxlX2luc2VydChzLT52dGRfcGFzaWRfYXMsIG5ld19rZXksIHZ0 ZF9wYXNpZF9hcyk7DQo+ID4gKyAgICB9DQo+ID4gKyAgICByZXR1cm4gdnRkX3Bhc2lkX2FzOw0K PiA+ICt9DQo+ID4gKw0KPiA+ICBzdGF0aWMgaW50IHZ0ZF9wYXNpZF9jYWNoZV9kc2koSW50ZWxJ T01NVVN0YXRlICpzLCB1aW50MTZfdA0KPiA+IGRvbWFpbl9pZCkgIHsNCj4gPiArICAgIFZURFBB U0lEQ2FjaGVJbmZvIHBjX2luZm87DQo+ID4gKw0KPiA+ICsgICAgdHJhY2VfdnRkX3Bhc2lkX2Nh Y2hlX2RzaShkb21haW5faWQpOw0KPiA+ICsNCj4gPiArICAgIHBjX2luZm8uZmxhZ3MgPSBWVERf UEFTSURfQ0FDSEVfRE9NU0k7DQo+ID4gKyAgICBwY19pbmZvLmRvbWFpbl9pZCA9IGRvbWFpbl9p ZDsNCj4gPiArDQo+ID4gKyAgICAvKg0KPiA+ICsgICAgICogTG9vcCBhbGwgZXhpc3RpbmcgcGFz aWQgY2FjaGVzIGFuZCB1cGRhdGUgdGhlbS4NCj4gPiArICAgICAqLw0KPiA+ICsgICAgdnRkX2lv bW11X2xvY2socyk7DQo+ID4gKyAgICBnX2hhc2hfdGFibGVfZm9yZWFjaF9yZW1vdmUocy0+dnRk X3Bhc2lkX2FzLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dGRfZmx1 c2hfcGFzaWQsICZwY19pbmZvKTsNCj4gPiArICAgIHZ0ZF9pb21tdV91bmxvY2socyk7DQo+ID4g Kw0KPiA+ICsgICAgLyoNCj4gPiArICAgICAqIFRPRE86DQo+ID4gKyAgICAgKiBEb21haW4gc2Vs ZWN0aXZlIFBBU0lEIGNhY2hlIGludmFsaWRhdGlvbiBmbHVzaGVzDQo+ID4gKyAgICAgKiBhbGwg dGhlIHBhc2lkIGNhY2hlcyB3aXRoaW4gYSBkb21haW4uIFRvIGJlIHNhZmUsDQo+ID4gKyAgICAg KiBhZnRlciBpbnZhbGlkYXRpbmcgdGhlIHBhc2lkIGNhY2hlcywgZW11bGF0b3IgbmVlZHMNCj4g PiArICAgICAqIHRvIHJlcGxheSB0aGUgcGFzaWQgYmluZGluZ3MgYnkgd2Fsa2luZyBndWVzdCBw YXNpZA0KPiA+ICsgICAgICogZGlyIGFuZCBwYXNpZCB0YWJsZS4gZS5nLiBXaGVuIHRoZSBndWVz dCBzZXR1cCBhIG5ldw0KPiA+ICsgICAgICogUEFTSUQgZW50cnkgdGhlbiBzZW5kIGEgUEFTSUQg RFNJLg0KPiA+ICsgICAgICovDQo+ID4gICAgICByZXR1cm4gMDsNCj4gPiAgfQ0KPiA+DQo+ID4g IHN0YXRpYyBpbnQgdnRkX3Bhc2lkX2NhY2hlX3BzaShJbnRlbElPTU1VU3RhdGUgKnMsDQo+ID4g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkb21haW5faWQsIHVpbnQz Ml90IHBhc2lkKSAgew0KPiA+ICsgICAgVlREUEFTSURDYWNoZUluZm8gcGNfaW5mbzsNCj4gPiAr ICAgIFZUREhvc3RJT01NVUNvbnRleHQgKnZ0ZF9kZXZfaWN4Ow0KPiA+ICsNCj4gPiArICAgIC8q IFBBU0lEIHNlbGVjdGl2ZSBpbXBsaWVzIGEgRElEIHNlbGVjdGl2ZSAqLw0KPiA+ICsgICAgcGNf aW5mby5mbGFncyA9IFZURF9QQVNJRF9DQUNIRV9QQVNJRFNJOw0KPiA+ICsgICAgcGNfaW5mby5k b21haW5faWQgPSBkb21haW5faWQ7DQo+ID4gKyAgICBwY19pbmZvLnBhc2lkID0gcGFzaWQ7DQo+ ID4gKw0KPiA+ICsgICAgLyoNCj4gPiArICAgICAqIFJlZ2FyZHMgdG8gYSBwYXNpZCBzZWxlY3Rp dmUgcGFzaWQgY2FjaGUgaW52YWxpZGF0aW9uIChQU0kpLA0KPiA+ICsgICAgICogaXQgY291bGQg YmUgZWl0aGVyIGNhc2VzIG9mIGJlbG93Og0KPiA+ICsgICAgICogYSkgYSBwcmVzZW50IHBhc2lk IGVudHJ5IG1vdmVkIHRvIG5vbi1wcmVzZW50DQo+ID4gKyAgICAgKiBiKSBhIHByZXNlbnQgcGFz aWQgZW50cnkgdG8gYmUgYSBwcmVzZW50IGVudHJ5DQo+ID4gKyAgICAgKiBjKSBhIG5vbi1wcmVz ZW50IHBhc2lkIGVudHJ5IG1vdmVkIHRvIHByZXNlbnQNCj4gPiArICAgICAqDQo+ID4gKyAgICAg KiBIZXJlIHRoZSBoYW5kbGluZyBvZiBhIFBTSSBmb2xsb3dzIGJlbG93IHN0ZXBzOg0KPiA+ICsg ICAgICogMSkgbG9vcCBhbGwgdGhlIGV4aXNpdG5nIHZ0ZF9wYXNpZF9hcyBpbnN0YW5jZXMgdG8g dXBkYXRlIHRoZW0NCj4gPiArICAgICAqICAgIGFjY29yZGluZyB0byB0aGUgbGF0ZXN0IGd1ZXN0 IHBhc2lkIGVudHJ5IGluIHBhc2lkIHRhYmxlLg0KPiA+ICsgICAgICogICAgdGhpcyB3aWxsIG1h a2Ugc3VyZSBhZmZlY3RlZCBleGlzdGluZyB2dGRfcGFzaWRfYXMgaW5zdGFuY2VzDQo+ID4gKyAg ICAgKiAgICBjYWNoZWQgdGhlIGxhdGVzdCBwYXNpZCBlbnRyaWVzLiBBbHNvLCBkdXJpbmcgdGhl IGxvb3AsIHRoZQ0KPiA+ICsgICAgICogICAgaG9zdCBzaG91bGQgYmUgbm90aWZpZWQgaWYgbmVl ZGVkLiBlLmcuIHBhc2lkIHVuYmluZCBvciBwYXNpZA0KPiA+ICsgICAgICogICAgdXBkYXRlLiBT aG91bGQgYmUgYWJsZSB0byBjb3ZlciBjYXNlIGEpIGFuZCBjYXNlIGIpLg0KPiA+ICsgICAgICoN Cj4gPiArICAgICAqIDIpIGxvb3AgYWxsIGRldmljZXMgdG8gY292ZXIgY2FzZSBjKQ0KPiA+ICsg ICAgICogICAgLSBGb3IgZGV2aWNlcyB3aGljaCBoYXZlIEhvc3RJT01NVUNvbnRleHQgaW5zdGFu Y2VzLA0KPiA+ICsgICAgICogICAgICB3ZSBsb29wIHRoZW0gYW5kIGNoZWNrIGlmIGd1ZXN0IHBh c2lkIGVudHJ5IGV4aXN0cy4gSWYgeWVzLA0KPiA+ICsgICAgICogICAgICBpdCBpcyBjYXNlIGMp LCB3ZSB1cGRhdGUgdGhlIHBhc2lkIGNhY2hlIGFuZCBhbHNvIG5vdGlmeQ0KPiA+ICsgICAgICog ICAgICBob3N0Lg0KPiA+ICsgICAgICogICAgLSBGb3IgZGV2aWNlcyB3aGljaCBoYXZlIG5vIEhv c3RJT01NVUNvbnRleHQsIGl0IGlzIG5vdA0KPiA+ICsgICAgICogICAgICBuZWNlc3NhcnkgdG8g Y3JlYXRlIHBhc2lkIGNhY2hlIGF0IHRoaXMgcGhhc2Ugc2luY2UgaXQNCj4gPiArICAgICAqICAg ICAgY291bGQgYmUgY3JlYXRlZCB3aGVuIHZJT01NVSBkb2VzIERNQSBhZGRyZXNzIHRyYW5zbGF0 aW9uLg0KPiA+ICsgICAgICogICAgICBUaGlzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgc2luY2Ug dGhlcmUgaXMgbm8gZW11bGF0ZWQNCj4gPiArICAgICAqICAgICAgcGFzaWQtY2FwYWJsZSBkZXZp Y2VzIHRvZGF5LiBJZiB3ZSBoYXZlIHN1Y2ggZGV2aWNlcyBpbg0KPiA+ICsgICAgICogICAgICBm dXR1cmUsIHRoZSBwYXNpZCBjYWNoZSBzaGFsbCBiZSBjcmVhdGVkIHRoZXJlLg0KPiA+ICsgICAg ICovDQo+ID4gKw0KPiA+ICsgICAgdnRkX2lvbW11X2xvY2socyk7DQo+ID4gKyAgICAvKiBTdGVw IDE6IGxvb3AgYWxsIHRoZSBleGlzaXRuZyB2dGRfcGFzaWRfYXMgaW5zdGFuY2VzICovDQo+ID4g KyAgICBnX2hhc2hfdGFibGVfZm9yZWFjaF9yZW1vdmUocy0+dnRkX3Bhc2lkX2FzLA0KPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0ZF9mbHVzaF9wYXNpZCwgJnBjX2luZm8p Ow0KPiA+ICsNCj4gDQo+IDxTVEFSVD4NCj4gDQo+ID4gKyAgICAvKg0KPiA+ICsgICAgICogU3Rl cCAyOiBsb29wIGFsbCB0aGUgZXhpc2l0bmcgdnRkX2Rldl9pY3ggaW5zdGFuY2VzLg0KPiA+ICsg ICAgICogSWRlYWxseSwgbmVlZHMgdG8gbG9vcCBhbGwgZGV2aWNlcyB0byBmaW5kIGlmIHRoZXJl IGlzIGFueSBuZXcNCj4gPiArICAgICAqIFBBU0lEIGJpbmRpbmcgcmVnYXJkcyB0byB0aGUgUEFT SUQgY2FjaGUgaW52YWxpZGF0aW9uIHJlcXVlc3QuDQo+ID4gKyAgICAgKiBCdXQgaXQgaXMgZW5v dWdoIHRvIGxvb3AgdGhlIGRldmljZXMgd2hpY2ggYXJlIGJhY2tlZCBieSBob3N0DQo+ID4gKyAg ICAgKiBJT01NVS4gRm9yIGRldmljZXMgYmFja2VkIGJ5IHZJT01NVSAoYS5rLmEgZW11bGF0ZWQg ZGV2aWNlcyksDQo+ID4gKyAgICAgKiBpZiBuZXcgUEFTSUQgaGFwcGVuZWQgb24gdGhlbSwgdGhl aXIgdnRkX3Bhc2lkX2FzIGluc3RhbmNlIGNvdWxkDQo+ID4gKyAgICAgKiBiZSBjcmVhdGVkIGR1 cmluZyBmdXR1cmUgdklPTU1VIERNQSB0cmFuc2xhdGlvbi4NCj4gPiArICAgICAqLw0KPiA+ICsg ICAgUUxJU1RfRk9SRUFDSCh2dGRfZGV2X2ljeCwgJnMtPnZ0ZF9kZXZfaWN4X2xpc3QsIG5leHQp IHsNCj4gPiArICAgICAgICBWVERQQVNJREFkZHJlc3NTcGFjZSAqdnRkX3Bhc2lkX2FzOw0KPiA+ ICsgICAgICAgIFZURFBBU0lEQ2FjaGVFbnRyeSAqcGNfZW50cnk7DQo+ID4gKyAgICAgICAgVlRE UEFTSURFbnRyeSBwZTsNCj4gPiArICAgICAgICBWVERCdXMgKnZ0ZF9idXMgPSB2dGRfZGV2X2lj eC0+dnRkX2J1czsNCj4gPiArICAgICAgICB1aW50MTZfdCBkZXZmbiA9IHZ0ZF9kZXZfaWN4LT5k ZXZmbjsNCj4gPiArICAgICAgICBpbnQgYnVzX24gPSBwY2lfYnVzX251bSh2dGRfYnVzLT5idXMp Ow0KPiA+ICsNCj4gPiArICAgICAgICAvKiBpKSBmZXRjaCB2dGRfcGFzaWRfYXMgYW5kIGNoZWNr IGlmIGl0IGlzIHZhbGlkICovDQo+ID4gKyAgICAgICAgdnRkX3Bhc2lkX2FzID0gdnRkX2FkZF9m aW5kX3Bhc2lkX2FzKHMsIHZ0ZF9idXMsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGRldmZuLCBwYXNpZCk7DQo+IA0KPiBJIGRvbid0IGZlZWwgbGlr ZSBpdCdzIGNvcnJlY3QgaGVyZS4uLg0KPiANCj4gQXNzdW1pbmcgd2UgaGF2ZSB0d28gZGV2aWNl cyBhc3NpZ25lZCBEMSwgRDIuICBEMSB1c2VzIFBBU0lEPTEsIEQyIHVzZXMgUEFTSUQ9Mi4NCj4g V2hlbiBpbnZhbGlkYXRpbmcgYWdhaW5zdCBQQVNJRD0xLCBhcmUgeW91IGFsc28gZ29pbmcgdG8g Y3JlYXRlIGENCj4gVlREUEFTSURBZGRyZXNzU3BhY2UgYWxzbyBmb3IgRDIgd2l0aCBQQVNJRD0x Pw0KDQpBbnN3ZXIgaXMgbm8uIEJlZm9yZSBnb2luZyBmb3J3YXJkLCBsZXQncyBzZWUgaWYgdGhl IGJlbG93IGZsb3cgbG9va3MgZ29vZCB0byB5b3UuDQoNCkxldCBtZSBhZGQgb25lIG1vcmUgZGV2 aWNlIGJlc2lkZXMgRDEgYW5kIEQyLiBTYXkgZGV2aWNlIEQzIHdoaWNoIGFsc28NCnVzZXMgUEFT SUQ9MS4gQW5kIGFzc3VtZSBpdCBiZWdpbnMgd2l0aCBubyBQQVNJRCB1c2FnZSBpbiBndWVzdC4N Cg0KVGhlbiB0aGUgZmxvdyBmcm9tIHNjcmF0Y2ggaXM6DQoNCmEpIGd1ZXN0IElPTU1VIGRyaXZl ciBzZXR1cCBQQVNJRCBlbnRyeSBmb3IgRDEgd2l0aCBQQVNJRD0xLA0KICAgdGhlbiBpbnZhbGlk YXRlcyBhZ2FpbnN0IFBBU0lEICMxDQpiKSB0cmFwIHRvIFFFTVUsIGFuZCBjb21lcyB0byB0aGlz IGZ1bmN0aW9uLiBTaW5jZSB0aGVyZSBpcw0KICAgbm8gcHJldmlvdXMgcGFzaWQgY2FjaGUgaW52 YWxpZGF0aW9uLCBzbyB0aGUgU3RlcCAxIG9mIHRoaXMNCiAgIGZ1bmN0aW9uIGhhcyBub3RoaW5n IHRvIGRvLCB0aGVuIGdvZXMgdG8gU3RlcCAyIHdoaWNoIGlzIHRvDQogICBsb29wIGFsbCBhc3Np Z25lZCBkZXZpY2VzIGFuZCBjaGVjayBpZiB0aGUgZ3Vlc3QgcGFzaWQgZW50cnkNCiAgIGlzIHBy ZXNlbnQuIEluIHRoaXMgbG9vcCwgc2hvdWxkIGZpbmQgRDEncyBwYXNpZCBlbnRyeSBmb3INCiAg IFBBU0lEIzEgaXMgcHJlc2VudC4gU28gY3JlYXRlIHRoZSBWVERQQVNJREFkZHJlc3NTcGFjZSBh bmQNCiAgIGluaXRpYWxpemUgaXRzIHBhc2lkX2NhY2hlX2VudHJ5IGFuZCBwYXNpZF9jYWNoZV9n ZW4gZmllbGRzLg0KYykgZ3Vlc3QgSU9NTVUgZHJpdmVyIHNldHVwIFBBU0lEIGVudHJ5IGZvciBE MiB3aXRoIFBBU0lEPTIsDQogICB0aGVuIGludmFsaWRhdGVzIGFnYWluc3QgUEFTSUQgIzINCmQp IHNhbWUgd2l0aCBiKSwgb25seSBkaWZmZXJlbmNlIGlzIHRoZSBTdGVwIDEgb2YgdGhpcyBmdW5j dGlvbg0KICAgd2lsbCBsb29wIHRoZSBWVERQQVNJREFkZHJlc3NTcGFjZSBjcmVhdGVkIGluIGIp LCBidXQgaXRzDQogICBwYXNpZCBpcyAxIHdoaWNoIGlzIG5vdCB0aGUgdGFyZ2V0IG9mIGN1cnJl bnQgcGFzaWQgY2FjaGUNCiAgIGludmFsaWRhdGlvbi4gU2FtZSB3aXRoIGIpLCBpbiBTdGVwIDIs IGl0IHdpbGwgY3JlYXRlIGENCiAgIFZURFBBU0lEQWRkcmVzc1NwYWNlIGZvciBEMitQQVNJRCMy DQplKSBndWVzdCBJT01NVSBkcml2ZXIgc2V0dXAgUEFTSUQgZW50cnkgZm9yIEQzIHdpdGggUEFT SUQ9MSwNCiAgIHRoZW4gaW52YWxpZGF0ZXMgYWdhaW5zdCBQQVNJRCAjMQ0KZikgdHJhcCB0byBR RU1VIGFuZCBjb21lcyB0byB0aGlzIGZ1bmN0aW9uLiBTdGVwIDEgbG9vcHMgdHdvDQogICBWVERQ QVNJREFkZHJlc3NTcGFjZSBjcmVhdGVkIGluIGIpIGFuZCBkKSwgYW5kIGl0IGZpbmRzIHRoZXJl DQogICBpcyBhIFZURFBBU0lEQWRkcmVzc1NwYWNlIHdob3NlIHBhc2lkIGlzIDEuIHZ0ZF9mbHVz aF9wYXNpZCgpDQogICB3aWxsIGNoZWNrIGlmIHRoZSBjYWNoZWQgcGFzaWQgZW50cnkgaXMgdGhl IHNhbWUgd2l0aCB0aGUgb25lDQogICBpbiBndWVzdCBtZW1vcnkuIEluIHRoaXMgZmxvdywgaXQg c2hvdWxkIGJlIHRoZSBzYW1lLCBzbw0KICAgdnRkX2ZsdXNoX3Bhc2lkKCkgd2lsbCBkbyBub3Ro aW5nIGZvciBpdC4gVGhlbiBjb21lcyB0byBTdGVwIDIsDQogICBpdCBsb29wcyBEMSwgRDIsIEQz Lg0KICAgLSBGb3IgRDEsIG5vIG5lZWQgdG8gZG8gbW9yZSBzaW5jZSB0aGVyZSBpcyBhbHJlYWR5 IGENCiAgICAgVlREUEFTSURBZGRyZXNzU3BhY2UgY3JlYXRlZCBmb3IgRDErUEFTSUQjMS4NCiAg IC0gRm9yIEQyLCBpdHMgZ3Vlc3QgcGFzaWQgZW50cnkgZm9yIFBBU0lEIzEgaXMgbm90IHByZXNl bnQsIHNvDQogICAgIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgZm9yIGl0Lg0KICAgLSBGb3IgRDMs IGl0cyBndWVzdCBwYXNpZCBlbnRyeSBmb3IgUEFTSUQjMSBpcyBwcmVzZW50IGFuZCBpdA0KICAg ICBpcyBleGFjdGx5IHRoZSByZWFzb24gZm9yIHRoaXMgaW52YWxpZGF0aW9uLiBTbyBjcmVhdGUg YQ0KICAgICBWVERQQVNJREFkZHJlc3NTcGFjZSBmb3IgYW5kIGluaXQgdGhlIHBhc2lkX2NhY2hl X2VudHJ5IGFuZA0KICAgICBwYXNpZF9jYWNoZV9nZW4gZmllbGRzLg0KDQo+IEkgZmVlbCBsaWtl IHdlIHNob3VsZG4ndCBjcmVhdGUgVlREUEFTSURBZGRyZXNzU3BhY2Ugb25seSBpZiBpdCBleGlz dGVkLCBzYXksIHVudGlsDQo+IHdoZW4gd2UgcmVhY2ggdnRkX2Rldl9nZXRfcGVfZnJvbV9wYXNp ZCgpIGJlbG93IHdpdGggcmV0Y29kZT09MC4NCg0KWW91IGFyZSByaWdodC4gSSB0aGluayBJIGZh aWxlZCB0byBkZXN0cm95IHRoZSBWVERBZGRyZXNzU3BhY2Ugd2hlbg0KdnRkX2Rldl9nZXRfcGVf ZnJvbV9wYXNpZCgpIHJldHVybnMgZXJyb3IuIFRodXMgdGhlIGNvZGUgd29uJ3QgY3JlYXRlDQph IFZURFBBU0lEQWRkcmVzc1NwYWNlIGZvciBEMitQQVNJRCMxLg0KDQo+IEJlc2lkZXMgdGhpcy4u Lg0KPiANCj4gPiArICAgICAgICBwY19lbnRyeSA9ICZ2dGRfcGFzaWRfYXMtPnBhc2lkX2NhY2hl X2VudHJ5Ow0KPiA+ICsgICAgICAgIGlmIChzLT5wYXNpZF9jYWNoZV9nZW4gPT0gcGNfZW50cnkt PnBhc2lkX2NhY2hlX2dlbikgew0KPiA+ICsgICAgICAgICAgICAvKg0KPiA+ICsgICAgICAgICAg ICAgKiBwYXNpZF9jYWNoZV9nZW4gZXF1YWxzIHRvIHMtPnBhc2lkX2NhY2hlX2dlbiBtZWFucw0K PiA+ICsgICAgICAgICAgICAgKiB2dGRfcGFzaWRfYXMgaXMgdmFsaWQgYWZ0ZXIgdGhlIGFib3Zl IHMtPnZ0ZF9wYXNpZF9hcw0KPiA+ICsgICAgICAgICAgICAgKiB1cGRhdGVzIGluIFN0ZXAgMS4g VGh1cyBubyBuZWVkIGZvciB0aGUgYmVsb3cgc3RlcHMuDQo+ID4gKyAgICAgICAgICAgICAqLw0K PiA+ICsgICAgICAgICAgICBjb250aW51ZTsNCj4gPiArICAgICAgICB9DQo+ID4gKw0KPiA+ICsg ICAgICAgIC8qDQo+ID4gKyAgICAgICAgICogaWkpIHZ0ZF9wYXNpZF9hcyBpcyBub3QgdmFsaWQs IGl0J3MgcG90ZW50YWlsbHkgYSBuZXcNCj4gPiArICAgICAgICAgKiAgICBwYXNpZCBiaW5kLiBG ZXRjaCBndWVzdCBwYXNpZCBlbnRyeS4NCj4gPiArICAgICAgICAgKi8NCj4gPiArICAgICAgICBp ZiAodnRkX2Rldl9nZXRfcGVfZnJvbV9wYXNpZChzLCBidXNfbiwgZGV2Zm4sIHBhc2lkLCAmcGUp KSB7DQoNCllpOiBzaG91bGQgZGVzdHJveSBwYXNpZF9hcyBhcyB0aGVyZSBpcyBubyB2YWxpZCBw YXNpZCBlbnRyeS4gVGh1cyB0bw0KZW5zdXJlIGFsbCB0aGUgcGFzaWRfYXMgaW4gaGFzaCB0YWJs ZSBhcmUgdmFsaWQuDQoNCj4gPiArICAgICAgICAgICAgY29udGludWU7DQo+ID4gKyAgICAgICAg fQ0KPiA+ICsNCj4gPiArICAgICAgICAvKg0KPiA+ICsgICAgICAgICAqIGlpaSkgcGFzaWQgZW50 cnkgZXhpc3RzLCB1cGRhdGUgcGFzaWQgY2FjaGUNCj4gPiArICAgICAgICAgKg0KPiA+ICsgICAg ICAgICAqIEhlcmUgbmVlZCB0byBjaGVjayBkb21haW4gSUQgc2luY2UgZ3Vlc3QgcGFzaWQgZW50 cnkNCj4gPiArICAgICAgICAgKiBleGlzdHMuIFdoYXQgbmVlZHMgdG8gZG8gYXJlOg0KPiA+ICsg ICAgICAgICAqICAgLSB1cGRhdGUgdGhlIHBjX2VudHJ5IGluIHRoZSB2dGRfcGFzaWRfYXMNCj4g PiArICAgICAgICAgKiAgIC0gc2V0IHByb3BlciBwY19lbnRyeS5wYXNpZF9jYWNoZV9nZW4NCj4g PiArICAgICAgICAgKiAgIC0gcGFzcyBkb3duIHRoZSBsYXRlc3QgZ3Vlc3QgcGFzaWQgZW50cnkg Y29uZmlnIHRvIGhvc3QNCj4gPiArICAgICAgICAgKiAgICAgKHdpbGwgYmUgYWRkZWQgaW4gbGF0 ZXIgcGF0Y2gpDQo+ID4gKyAgICAgICAgICovDQo+ID4gKyAgICAgICAgaWYgKGRvbWFpbl9pZCA9 PSB2dGRfcGVfZ2V0X2RvbWFpbl9pZCgmcGUpKSB7DQo+ID4gKyAgICAgICAgICAgIHZ0ZF9maWxs X2luX3BlX2luX2NhY2hlKHMsIHZ0ZF9wYXNpZF9hcywgJnBlKTsNCj4gPiArICAgICAgICB9DQo+ ID4gKyAgICB9DQo+IA0KPiA8RU5EPg0KPiANCj4gLi4uIEknbSBhIGJpdCBjb25mdXNlZCBvbiB0 aGUgd2hvbGUgcmFuZ2UgYmV0d2VlbiA8U1RBUlQ+IGFuZCA8RU5EPiBvbiBob3cgaXQNCj4gZGlm ZmVycyBmcm9tIHRoZSB2dGRfcmVwbGF5X2d1ZXN0X3Bhc2lkX2JpbmRpbmdzKCkgeW91J3JlIGdv aW5nIHRvIGludHJvZHVjZS4NCj4gU2hvdWxkbid0IHRoZSByZXBsYXkgY29kZSBkbyBzaW1pbGFy IHRoaW5nPyAgQ2FuIHdlIG1lcmdlIHRoZW0/DQoNClllcywgdGhlcmUgaXMgc2ltaWxhciB0aGlu ZyB3aGljaCBpcyB0byBjcmVhdGUgVlREUEFTSURBZGRyZXNzU3BhY2UNCnBlciB0aGUgZ3Vlc3Qg cGFzaWQgZW50cnkgcHJlc2VuY2UuDQoNCkJ1dCB0aGVyZSBhcmUgZGlmZmVyZW5jZXMuIEZvciBv bmUsIHRoZSBjb2RlIGhlcmUgaXMgdG8gbG9vcCBhbGwNCmFzc2lnbmVkIGRldmljZXMgZm9yIGEg c3BlY2lmaWMgUEFTSUQuIFdoaWxlIHRoZSBsb2dpYyBpbg0KdnRkX3JlcGxheV9ndWVzdF9wYXNp ZF9iaW5kaW5ncygpIGlzIHRvIGxvb3AgYWxsIGFzc2lnbmVkIGRldmljZXMNCmFuZCB0aGUgUEFT SUQgdGFibGVzIGJlaGluZCB0aGVtLiBGb3IgdHdvLCB0aGUgY29kZSBoZXJlIG9ubHkgY2FyZXMN CmFib3V0IHRoZSBjYXNlIHdoaWNoIGd1ZXN0IHBhc2lkIGVudHJ5IGZyb20gSU5WQUxJRC0+VkFM SUQuDQpUaGUgcmVhc29uIGlzIGluIFN0ZXAgMSBvZiB0aGlzIGZ1bmN0aW9uLCBWQUxJRC0+SU5W QUxJRCBhbmQNClZBTElELT5WQUxJRCBjYXNlcyBhcmUgYWxyZWFkeSBjb3ZlcmVkLiBXaGlsZSB0 aGUgbG9naWMgaW4NCnZ0ZF9yZXBsYXlfZ3Vlc3RfcGFzaWRfYmluZGluZ3MoKSBuZWVkcyB0byBj b3ZlciBhbGwgdGhlIHRocmVlIGNhc2VzLg0KVGhlIGxhc3QgcmVhc29uIEkgZGlkbid0IG1lcmdl IHRoZW0gaXMgaW4gdnRkX3JlcGxheV9ndWVzdF9wYXNpZF9iaW5kaW5ncygpDQppdCBuZWVkcyB0 byBkaXZpZGUgdGhlIHBhc2lkIGVudHJ5IGZldGNoIGludG8gdHdvIHN0ZXBzIGFuZCBjaGVjaw0K dGhlIHJlc3VsdCAoaWYgZmV0Y2ggcGFzaWQgZGlyZWN0b3J5IGVudHJ5IGZhaWxlZCwgaXQgY291 bGQgc2tpcCBhDQpyYW5nZSBvZiBQQVNJRHMpLiBXaGlsZSB0aGUgY29kZSBpbiB0aGlzIGZ1bmN0 aW9uLCBpdCBkb2Vzbid0IGNhcmUNCmFib3V0IGl0LCBpdCBvbmx5IGNhcmVzIGlmIHRoZXJlIGlz IGEgdmFsaWQgcGFzaWQgZW50cnkgZm9yIHRoaXMNCnNwZWNpZmljIHBhc2lkLg0KDQo+IA0KPiBN eSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgd2UgY2FuIGp1c3QgbWFrZSBzdXJlIHRvIGRvIGl0IHJp Z2h0IG9uY2UgaW4gdGhlIHJlcGxheQ0KPiBjb2RlICh0aGUgdGhyZWUgY2FzZXM6IElOVkFMSUQt PlZBTElELCBWQUxJRC0+SU5WQUxJRCwNCj4gVkFMSUQtPlZBTElEKSwgdGhlbiBubyBtYXR0ZXIg d2hldGhlciBpdCdzIERTSS9QU0kvR1NJLCB3ZSBjYWxsIHRoZQ0KPiByZXBsYXkgY29kZSBwcm9i YWJseSB3aXRoIFZURFBBU0lEQ2FjaGVJbmZvKiBwYXNzZWQgaW4sIHRoZW4gdGhlIHJlcGxheSBj b2RlIHdpbGwNCj4ga25vdyB3aGF0IHRvIGxvb2sgYWZ0ZXIuDQoNCkhtbW0sIGxldCBtZSB0aGlu ayBtb3JlIHRvIGFic3RyYWN0IHRoZSBjb2RlIGJldHdlZW4gdGhlDQo8U1RBUlQ+IGFuZCA8RU5E PiB0byBiZSBhIGhlbHBlciBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYnkNCnZ0ZF9yZXBsYXlfZ3Vl c3RfcGFzaWRfYmluZGluZ3MoKS4gQWxzbywgaW4gdGhhdCBjYXNlLCBJDQpuZWVkIHRvIGFwcGx5 IHRoZSB0d28gc3RlcCBjb25jZXB0IGluIHRoZSByZXBsYXkgZnVuY3Rpb24uDQoNCj4gPiArDQo+ ID4gKyAgICB2dGRfaW9tbXVfdW5sb2NrKHMpOw0KPiA+ICAgICAgcmV0dXJuIDA7DQo+ID4gIH0N Cj4gPg0KPiA+ICsvKioNCj4gPiArICogQ2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGhv bGQgaW9tbXVfbG9jayAgKi8gc3RhdGljIHZvaWQNCj4gPiArdnRkX3Bhc2lkX2NhY2hlX3Jlc2V0 KEludGVsSU9NTVVTdGF0ZSAqcykgew0KPiA+ICsgICAgVlREUEFTSURDYWNoZUluZm8gcGNfaW5m bzsNCj4gPiArDQo+ID4gKyAgICB0cmFjZV92dGRfcGFzaWRfY2FjaGVfcmVzZXQoKTsNCj4gPiAr DQo+ID4gKyAgICBwY19pbmZvLmZsYWdzID0gVlREX1BBU0lEX0NBQ0hFX0dMT0JBTDsNCj4gPiAr DQo+ID4gKyAgICAvKg0KPiA+ICsgICAgICogUmVzZXQgcGFzaWQgY2FjaGUgaXMgYSBiaWcgaGFt bWVyLCBzbyB1c2UNCj4gPiArICAgICAqIGdfaGFzaF90YWJsZV9mb3JlYWNoX3JlbW92ZSB3aGlj aCB3aWxsIGZyZWUNCj4gPiArICAgICAqIHRoZSB2dGRfcGFzaWRfYXMgaW5zdGFuY2VzLCBpbmRp Y2F0ZXMgdGhlDQo+ID4gKyAgICAgKiBjYWNoZWQgcGFzaWRfY2FjaGVfZ2VuIHdvdWxkIGJlIHNl dCB0byAwLg0KPiA+ICsgICAgICovDQo+ID4gKyAgICBnX2hhc2hfdGFibGVfZm9yZWFjaF9yZW1v dmUocy0+dnRkX3Bhc2lkX2FzLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICB2dGRf Zmx1c2hfcGFzaWQsICZwY19pbmZvKTsNCj4gDQo+IFdvdWxkIHRoaXMgbWFrZSBzdXJlIHRoZSBw ZXIgcGFzaWRfYXMgcGFzaWRfY2FjaGVfZ2VuIHdpbGwgYmUgcmVzZXQgdG8gemVybz8gIEknbQ0K PiBub3QgdmVyeSBzdXJlLCBzYXksIHdoYXQgaWYgdGhlIG1lbW9yeSBpcyBzdGFsbCBkdXJpbmcg YSByZXNldCBhbmQgc3RpbGwgaGF2ZSB0aGUgb2xkDQo+IGRhdGE/DQo+IA0KPiBJJ20gbm90IHN1 cmUsIGJ1dCBJIGZlZWwgbGlrZSB3ZSBzaG91bGQgc2ltcGx5IGRyb3AgYWxsIHBhc2lkX2FzIGhl cmUsIHJhdGhlciB0aGFuDQo+IHVzaW5nIHRoZSBzYW1lIGNvZGUgZm9yIGEgZ2xvYmFsIHBhc2lk IGludmFsaWRhdGlvbi4NCg0KSSBzZWUuIE1heWJlIEkgY2FuIGdldCBhbm90aGVyIGhlbHBlciBm dW5jdGlvbiB3aGljaCBhbHdheXMgcmV0dXJucw0KdHJ1ZSwgYW5kIHJlcGxhY2UgdnRkX2ZsdXNo X3Bhc2lkIHdpdGggdGhlIG5ldyBmdW5jdGlvbi4gVGhpcyBzaG91bGQNCmVuc3VyZSBhbGwgcGFz aWRfYXMgYXJlIGRyb3BwZWQuIEhvdyBkbyB5b3UgdGhpbms/DQoNClJlZ2FyZHMsDQpZaSBMaXUN Cg==