From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (NAM11-BN8-obe.outbound.protection.outlook.com [40.107.236.100]) by mx.groups.io with SMTP id smtpd.web12.9687.1607585676446271703 for ; Wed, 09 Dec 2020 23:34:37 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@microsoft.com header.s=selector2 header.b=TerfCHQ6; spf=pass (domain: microsoft.com, ip: 40.107.236.100, mailfrom: bret.barkelew@microsoft.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=TRPpTXna73ob7jLa/TOw1jggsjucACgvUcU45+3neHryQTSpI/BTbSWyKMDl4f6xDRzyj1PQi+s1vVp3TCGfpLFIbKX8p7SmqpE7UGA3ztVh6XyieZPbWFVTpIFgtxMLVVGyDV9mKjcvWCH1m1STmZ6yNXWwlgS9V+6tVc+TyHsZrGtkKEoa1jVC4pnU5tOBE3sHFeeqfTsa2uiU6tOdMVmRHZ/JZmpdTONI0nSFXOsu94FH/Em6w8yGEbxs51v4UZo3By80PEl4PH45kKaXaAfgYpwsnOuuAHX5UeNRepJ3hWD9W7mIRxosrYV+MYCbrYxKiglwTop8b1kxAsdeRQ== 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-SenderADCheck; bh=aP9xc3fX6cf/ZZbranj82ZXMQhmmYj1Lbhf4yO9YgC8=; b=d8Gs7iljOgCurCpttGKGzaoGjSqqfcO2TCROiQeb1+lNdtLDD32x2AYqTdoRxRYRjrY/PAlK7QP8e8qxGPGFIwqBUFnPhudbT+9dG17iEhpyMJwld+8Dt1B2vUAYV2SBS17JRg02g7LVPlzR2lAcqInZaHpIDZsG2QdR3ui95Ilz+XukVv9XZpycwvDs1Di6XPnDsWBPdN/IyDcInsjI+z0BprR3A1V+zM/inf1Ohdijehlei57aI6fGYnvGkucqbILrULQJ2ntMaNSy1uIySmKwjLrAZDoSGAHRAKcKrXrtIJJHOMSjGB//EGoHGmKA4LzB9V0ejDQULMeql+UgYg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microsoft.com; dmarc=pass action=none header.from=microsoft.com; dkim=pass header.d=microsoft.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=aP9xc3fX6cf/ZZbranj82ZXMQhmmYj1Lbhf4yO9YgC8=; b=TerfCHQ6A4SnS2ykaLVjbvgYA6O+xSIGDCZ94F/MbD0jIl4E2Atbckjz2iF992j639Ls8MFK/8TOr2y9Ok1sD8onW2IxEjDBy++lcUdICFa6Tw71YCioE3w9XfO+ijYp9ndH56nu1JoF2niXUMzV9Dn2oSIS53kjQJYY7WbQ6ik= Received: from (2603:10b6:903:b2::21) by CY4PR2101MB0801.namprd21.prod.outlook.com (2603:10b6:910:8d::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3654.10; Thu, 10 Dec 2020 07:34:33 +0000 Received: from CY4PR21MB0151.namprd21.prod.outlook.com ([fe80::9ceb:f035:53d0:12e]) by CY4PR21MB0151.namprd21.prod.outlook.com ([fe80::9ceb:f035:53d0:12e%3]) with mapi id 15.20.3654.012; Thu, 10 Dec 2020 07:34:33 +0000 From: "Bret Barkelew" To: gaoliming , "'Wu, Hao A'" , "devel@edk2.groups.io" , "Kinney, Michael D" Subject: =?UTF-8?B?UmU6IFtFWFRFUk5BTF0g5Zue5aSNOiBbZWRrMi1kZXZlbF0gW1BhdGNoIHYyIDEvMV0gTWRlTW9kdWxlUGtnL1ZhcmlhYmxlL1J1bnRpbWVEeGU6IFJlc3RvcmUgVmFyaWFibGUgTG9jayBQcm90b2NvbCBiZWhhdmlvcg==?= Thread-Topic: =?gb2312?B?W0VYVEVSTkFMXSC72Li0OiBbZWRrMi1kZXZlbF0gW1BhdGNoIHYyIDEvMV0g?= =?gb2312?B?TWRlTW9kdWxlUGtnL1ZhcmlhYmxlL1J1bnRpbWVEeGU6IFJlc3RvcmUgVmFy?= =?gb2312?Q?iable_Lock_Protocol_behavior?= Thread-Index: AQHWzpugwyarpTLeHkCPesuTLTmiCKnvqHsAgABHHqE= Date: Thu, 10 Dec 2020 07:34:33 +0000 Message-ID: References: <20201209180605.1409-1-michael.d.kinney@intel.com> ,<004d01d6cea2$d9b15670$8d140350$@byosoft.com.cn> In-Reply-To: <004d01d6cea2$d9b15670$8d140350$@byosoft.com.cn> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Enabled=True;MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_SiteId=72f988bf-86f1-41af-91ab-2d7cd011db47;MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_SetDate=2020-12-10T07:30:59.7851022Z;MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_ContentBits=0;MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Method=Privileged authentication-results: byosoft.com.cn; dkim=none (message not signed) header.d=none;byosoft.com.cn; dmarc=none action=none header.from=microsoft.com; x-originating-ip: [71.212.128.71] x-ms-publictraffictype: Email x-ms-office365-filtering-ht: Tenant x-ms-office365-filtering-correlation-id: ec511094-3da7-43c5-d426-08d89cde09c7 x-ms-traffictypediagnostic: CY4PR2101MB0801: x-ld-processed: 72f988bf-86f1-41af-91ab-2d7cd011db47,ExtAddr x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:10000; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: He7Ad2w3Z5IsbB70OJnEcO9FFmeMkuN4af9XBHb3/FQvdoqUyfe+EQlfGWWu1e3A6cT3bMIXsIoy1JkiDs63l3wCTZL5v1fHpUwmmddbZbofej25bEVFjoHkthzGdeId0h9Liul8PxtzuJ3fuG6X3J48XiGf7JQwvtfmnVR81y8Mu5Jzlo00dtbic3Na8BS7WGlsJjeSQzjuU0CCY38wwIleOVxf0UMve15SO7gKMu2lJ9dqH739DKd2tPDUlBSbQGdJuGB2EDEjw/hjtL4QKQgTsCNiUp/iwgaLvetAPw02K3mmIwSfsNqCibPNomDjaOLxRTy+XszP2f5wIiPFEM717H/9lxlVvxUl94ylUS+C3KUxP6ZPnArHm+pQemoaEG2pxodAzIc/3gSvbH1Mdg== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CY4PR21MB0151.namprd21.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(376002)(136003)(346002)(366004)(966005)(10290500003)(26005)(52536014)(8990500004)(33656002)(82960400001)(8936002)(82950400001)(166002)(53546011)(9686003)(55016002)(86362001)(76116006)(66476007)(71200400001)(66446008)(91956017)(110136005)(508600001)(7696005)(2906002)(6506007)(30864003)(5660300002)(83380400001)(64756008)(186003)(66946007)(66556008)(224303003)(559001)(579004);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata: =?gb2312?B?ZDlhMnhPU2xkWkgyeUt6S0U3anJmZWZpa3NhS0hibHJDcFA4YnZDWEM3M2t2?= =?gb2312?B?c0o5TmxmYmdxUTFudmZ6cldDdEp0ZU9aeW9DcGVvNHZxRzM1cm52V3hjRlJ1?= =?gb2312?B?aEdITGxZNTJGNS96WlJ3Q2lYWTFKa3Z3MzBnR042aGptclh1eUR6dEJOZWhM?= =?gb2312?B?b2FJcEdGdGtoeEZ4MElLaWV0NFZPRXRRSTJmbTBlRnBETlBRYXlZdldMNFpF?= =?gb2312?B?d3BjQWhmcDRITG9EREZPSzJ0cWl1bFhjSmcyeC9JT1hXaDNzTmFxaGgwR1pQ?= =?gb2312?B?MkljWTZRZmlYNUNmTk9GT1NMNEpsYzNGYk1QY0JjQ3kvN24xN1ZjbCsxN2Za?= =?gb2312?B?VUoyRjhzUUl0eFluc2JaTWRIMzJqUUR6Mjk5QzRMQU50eHZpOHAvSGpjb0Yv?= =?gb2312?B?WkZwZS9neHVoUytPRi8zU1lDN3d3U3RaUmx2ZHpxOUFYZXUyMW01NVNFSWlU?= =?gb2312?B?L2dGcVVvRC9ONUg3dEt1ZlF1VEZZT0hMenJIWkRiMFcvb3dFNFIxZ0ZRSmNM?= =?gb2312?B?cEYzZ2p1UDI3RmlpVy94d1BGcUI5S3YxbnY5Y0l2dW12WEZaUlN1VnRLU3F5?= =?gb2312?B?MFVXTStBcEw1OWc2VVFVanBCTDZxU0pOenZJUXFYWWVNNi9wVW8vNy9WeFl0?= =?gb2312?B?MjA2bnBCZTRyUTgrV2IyeEpNYnd5Qjd6L3gvcnBDNDFsczhZWFRKUXU0S2JY?= =?gb2312?B?Uk1GdDhCcUUya1RDWHllVWRYSGFBSzFrQkRxT3BrM2VhWHhBRVZNcWROQU9o?= =?gb2312?B?ME5Xd0l2WkJIYnBZSXRvdWcxc2Z1bkFCa2EwU2MzdFRsL0xjK0N4K0ZReGlI?= =?gb2312?B?QkxvbFFvM2xUTk56Zkl5UGlpTS9jMWZEQjkrTmMrbzBram1rK2NuS2svamFG?= =?gb2312?B?Q1I1V0J4bWQzQjB5MjlHQmE0VkI1YTA5cTdjSWVTUmgvWDBHSWJLZENUelhy?= =?gb2312?B?TExJV2RPb1N6c0JMdjlwSDM5eTZoM2MwTGw5dituaDZjMlhqNnJCL2xKbExM?= =?gb2312?B?NXJ2QnZNb2E1UXhlcmFIYThla0RIUjJEc0daeko1TFprZXlkUk1ia2ZCeGdZ?= =?gb2312?B?c3lHQ2c4bWJ4aUlHK2RvaTFBUjVlcG5FamU5VW9GSm0yRmRjakdIQkR1SjAy?= =?gb2312?B?VXZXcWNlUUd1ODFLMW5BSUpRNldPd2hNUEtsbURpWVliSUh3MDNCYldtcFU4?= =?gb2312?B?S0xCZ1BWdWpnTitTTjgxVklxRlF5ak05RGN2cGN1eVBhcCtCdWxvSUNHWVhZ?= =?gb2312?B?bEdpaDN5ZENIUHVKWGMrbHByOVAzVHBNV1pmaDNjOTc5cGdGTC9zd3BXakNE?= =?gb2312?B?b2tzTlJ2TkJ0aW5SUkRKU0hDMzl5SHc3RmhnbGpNcEdtS3c5V2RLWTNwWFBL?= =?gb2312?B?ZXIyT0tzZ3g4VkE9PQ==?= x-ms-exchange-transport-forked: True MIME-Version: 1.0 X-OriginatorOrg: microsoft.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: CY4PR21MB0151.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: ec511094-3da7-43c5-d426-08d89cde09c7 X-MS-Exchange-CrossTenant-originalarrivaltime: 10 Dec 2020 07:34:33.2009 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 72f988bf-86f1-41af-91ab-2d7cd011db47 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: lRY0qNWP93QMnYCFx174indQhJvfLeZZzl9wqJFw7MQQaETr545mwCpGgq1qC0eCACOo+kpp3uwGCrXIOqiVIw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR2101MB0801 Content-Language: en-US Content-Type: multipart/alternative; boundary="_000_CY4PR21MB0151DAA16A0E0F30F33E1BA5EFCB1CY4PR21MB0151namp_" --_000_CY4PR21MB0151DAA16A0E0F30F33E1BA5EFCB1CY4PR21MB0151namp_ Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 SSB3b3VsZCBwcmVmZXIgdG8gbm90IHJldXNlIHRoZSBjb2RlIGZyb20gdGhlIGxpYnJhcnkuIFRo ZXkgYXJlIFNVUFBPU0VEIHRvIGJlIGludGVybmFsIGZ1bmN0aW9ucyBhbmQgYXJlIG5vdCBwYXJ0 IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLiBJoa92ZSBkdXBsaWNhdGVkIHRoZW0gaGVyZSBiZWNh dXNlIHRoaXMgc2hpbSBpcyBzdXBwb3NlZCB0byBiZSB0ZW1wb3JhcnkgYW5kIHNob3VsZCBnbyBh d2F5IHdpdGhpbiB0aGUgbmV4dCBmZXcgc3RhYmlsaXphdGlvbnMuDQoNCkkgd291bGQgYWxzbyBw cmVmZXIgdG8ga2VlcCB0aGUgdGVzdHMgYW5kIHRoZSBjb2RlIHRvZ2V0aGVyLiBUaGVzZSBhcmUg cHVyZSB1bml0IHRlc3RzIHJhdGhlciB0aGFuIGRyaXZlciB0ZXN0cyBhbmQgc2VydmUgdG8gZG9j dW1lbnQgYW5kIHByb3ZlIHRoZSBjb2RlIHRoYXQgaXMgYmVpbmcgc3VibWl0dGVkLiBIb3dldmVy LCBJoa9tIHdpbGxpbmcgdG8gYmUgZmxleGlibGUgb24gdGhpcy4NCg0KLSBCcmV0DQpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXw0KRnJvbTogZ2FvbGltaW5nIDxnYW9saW1pbmdAYnlv c29mdC5jb20uY24+DQpTZW50OiBXZWRuZXNkYXksIERlY2VtYmVyIDksIDIwMjAgNzoxNjoyOCBQ TQ0KVG86ICdXdSwgSGFvIEEnIDxoYW8uYS53dUBpbnRlbC5jb20+OyBkZXZlbEBlZGsyLmdyb3Vw cy5pbyA8ZGV2ZWxAZWRrMi5ncm91cHMuaW8+OyBLaW5uZXksIE1pY2hhZWwgRCA8bWljaGFlbC5k Lmtpbm5leUBpbnRlbC5jb20+DQpDYzogQnJldCBCYXJrZWxldyA8QnJldC5CYXJrZWxld0BtaWNy b3NvZnQuY29tPg0KU3ViamVjdDogW0VYVEVSTkFMXSC72Li0OiBbZWRrMi1kZXZlbF0gW1BhdGNo IHYyIDEvMV0gTWRlTW9kdWxlUGtnL1ZhcmlhYmxlL1J1bnRpbWVEeGU6IFJlc3RvcmUgVmFyaWFi bGUgTG9jayBQcm90b2NvbCBiZWhhdmlvcg0KDQpNaWtlOg0KICBJIGFncmVlIEhhbyBjb21tZW50 LiBUaGVyZSBpcyB0aGUgc2ltaWxhciBjb2RlIGxvZ2ljIGluIFZhcmlhYmxlUG9saWN5TGliDQps aWJyYXJ5LiBUaGV5IGNhbiBiZSBzaGFyZWQuDQoNCiAgQmVzaWRlcywgSSBzdWdnZXN0IHRvIHNw bGl0IHRoaXMgcGF0Y2guIE9uZSBpcyB0aGUgYnVnIGZpeCB0byByZXN0b3JlDQpWYXJpYWJsZSBM b2NrIFByb3RvY29sIGJlaGF2aW9yLCBhbm90aGVyIGlzIHRvIGFkZCBWYXJpYWJsZSBkcml2ZXIg dW5pdA0KdGVzdC4NCg0KVGhhbmtzDQpMaW1pbmcNCj4gLS0tLS3Tyrz+1K28/i0tLS0tDQo+ILei vP7IyzogV3UsIEhhbyBBIDxoYW8uYS53dUBpbnRlbC5jb20+DQo+ILeiy83KsbzkOiAyMDIwxOox MtTCMTDI1SAxMDoyNQ0KPiDK1bz+yMs6IGRldmVsQGVkazIuZ3JvdXBzLmlvOyBLaW5uZXksIE1p Y2hhZWwgRA0KPiA8bWljaGFlbC5kLmtpbm5leUBpbnRlbC5jb20+DQo+ILOty806IEJyZXQgQmFy a2VsZXcgPGJyZXQuYmFya2VsZXdAbWljcm9zb2Z0LmNvbT47IExpbWluZyBHYW8NCj4gPGdhb2xp bWluZ0BieW9zb2Z0LmNvbS5jbj4NCj4g1vfM4jogUkU6IFtlZGsyLWRldmVsXSBbUGF0Y2ggdjIg MS8xXSBNZGVNb2R1bGVQa2cvVmFyaWFibGUvUnVudGltZUR4ZToNCj4gUmVzdG9yZSBWYXJpYWJs ZSBMb2NrIFByb3RvY29sIGJlaGF2aW9yDQo+DQo+ID4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0t LS0NCj4gPiBGcm9tOiBkZXZlbEBlZGsyLmdyb3Vwcy5pbyA8ZGV2ZWxAZWRrMi5ncm91cHMuaW8+ IE9uIEJlaGFsZiBPZiBNaWNoYWVsDQo+ID4gRCBLaW5uZXkNCj4gPiBTZW50OiBUaHVyc2RheSwg RGVjZW1iZXIgMTAsIDIwMjAgMjowNiBBTQ0KPiA+IFRvOiBkZXZlbEBlZGsyLmdyb3Vwcy5pbw0K PiA+IENjOiBCcmV0IEJhcmtlbGV3IDxicmV0LmJhcmtlbGV3QG1pY3Jvc29mdC5jb20+OyBXdSwg SGFvIEENCj4gPiA8aGFvLmEud3VAaW50ZWwuY29tPjsgTGltaW5nIEdhbyA8Z2FvbGltaW5nQGJ5 b3NvZnQuY29tLmNuPjsgQnJldA0KPiA+IEJhcmtlbGV3IDxCcmV0LkJhcmtlbGV3QG1pY3Jvc29m dC5jb20+DQo+ID4gU3ViamVjdDogW2VkazItZGV2ZWxdIFtQYXRjaCB2MiAxLzFdIE1kZU1vZHVs ZVBrZy9WYXJpYWJsZS9SdW50aW1lRHhlOg0KPiA+IFJlc3RvcmUgVmFyaWFibGUgTG9jayBQcm90 b2NvbCBiZWhhdmlvcg0KPiA+DQo+ID4gRnJvbTogQnJldCBCYXJrZWxldyA8YnJldC5iYXJrZWxl d0BtaWNyb3NvZnQuY29tPg0KPiA+DQo+ID4gaHR0cHM6Ly9uYW0wNi5zYWZlbGlua3MucHJvdGVj dGlvbi5vdXRsb29rLmNvbS8/dXJsPWh0dHBzJTNBJTJGJTJGYnVnemlsbGEudGlhbm9jb3JlLm9y ZyUyRnNob3dfYnVnLmNnaSUzRmlkJTNEMzExMSZhbXA7ZGF0YT0wNCU3QzAxJTdDYnJldC5iYXJr ZWxldyU0MG1pY3Jvc29mdC5jb20lN0M0MTE1ZmFhYTE2YzY0NzViOGUzNTA4ZDg5Y2JhMDE4OSU3 QzcyZjk4OGJmODZmMTQxYWY5MWFiMmQ3Y2QwMTFkYjQ3JTdDMSU3QzAlN0M2Mzc0MzE2Njk5OTk5 NDM2MTYlN0NVbmtub3duJTdDVFdGcGJHWnNiM2Q4ZXlKV0lqb2lNQzR3TGpBd01EQWlMQ0pRSWpv aVYybHVNeklpTENKQlRpSTZJazFoYVd3aUxDSlhWQ0k2TW4wJTNEJTdDMTAwMCZhbXA7c2RhdGE9 RFU4RVl0YXllcFpwc3l4YWpLSzl3MG1RNWtFeFdYRzJBSnZDY3ZWVnkxQSUzRCZhbXA7cmVzZXJ2 ZWQ9MA0KPiA+DQo+ID4gVGhlIFZhcmlhYmxlTG9jayBzaGltIGN1cnJlbnRseSBmYWlscyBpZiBj YWxsZWQgdHdpY2UgYmVjYXVzZSB0aGUNCnVuZGVybHlpbmcNCj4gPiBWYXJpYWJsZSBQb2xpY3kg ZW5naW5lIHJldHVybnMgYW4gZXJyb3IgaWYgYSBwb2xpY3kgaXMgc2V0IG9uIGFuDQpleGlzdGlu Zw0KPiB2YXJpYWJsZS4NCj4gPg0KPiA+IFRoaXMgYnJlYWtzIGV4aXN0aW5nIGNvZGUgd2hpY2gg ZXhwZWN0IGl0IHRvIHNpbGVudGx5IHBhc3MgaWYgYSB2YXJpYWJsZQ0KaXMNCj4gbG9ja2VkDQo+ ID4gbXVsdGlwbGUgdGltZXMgKGJlY2F1c2UgaXQgc2hvdWxkICJiZSBsb2NrZWQiKS4NCj4gPg0K PiA+IFJlZmFjdG9yIHRoZSBzaGltIHRvIGNvbmZpcm0gdGhhdCB0aGUgdmFyaWFibGUgaXMgaW5k ZWVkIGxvY2tlZCBhbmQgdGhlbg0KPiA+IGNoYW5nZSB0aGUgZXJyb3IgdG8gRUZJX1NVQ0NFU1Mg YW5kIGdlbmVyYXRlIGEgREVCVUdfRVJST1IgbWVzc2FnZQ0KPiBzbw0KPiA+IHRoZSBkdXBsaWNh dGUgbG9jayBjYW4gYmUgcmVwb3J0ZWQgaW4gYSBkZWJ1ZyBsb2cgYW5kIHJlbW92ZWQuDQo+DQo+ DQo+IEhlbGxvLA0KPg0KPiBJcyBpdCBwb3NzaWJsZSB0byByZXVzZToNCj4gICAgIGEpIEV2YWx1 YXRlUG9saWN5TWF0Y2goKSBhbmQgR2V0QmVzdFBvbGljeU1hdGNoKCkgZnVuY3Rpb25zDQo+ICAg ICBiKSBNYWNyb3MgbGlrZSBHRVRfTkVYVF9QT0xJQ1ksIEdFVF9QT0xJQ1lfTkFNRSBhbmQgZXRj Lg0KPiB1bmRlciBNZGVNb2R1bGVQa2dcTGlicmFyeVxWYXJpYWJsZVBvbGljeUxpYiB0byByZWR1 Y2UgZHVwbGljYXRlIGNvZGVzPw0KPg0KPiBBIGNvdXBsZSBvZiBtaW5vciBpbmxpbmUgY29tbWVu dHMgYmVsb3c6DQo+DQo+DQo+ID4NCj4gPiBBZGQgaG9zdCBiYXNlZCB1bml0IHRlc3RzIGZvciB0 aGUgbXVsdGlwbGUgbG9jayBjYXNlIHVzaW5nIFZhcmlhYmxlIExvY2sNCj4gPiBQcm90b2NvbCwg VmFyaWFibGUgUG9saWN5IFByb3RvY29sLCBhbmQgbWl4ZXMgb2YgVmFyaWFibGUgTG9jayBQcm90 b2NvbA0KYW5kDQo+ID4gVmFyaWFibGUgUG9saWN5IFByb3RvY29sLg0KPiA+DQo+ID4gQ2M6IE1p Y2hhZWwgRCBLaW5uZXkgPG1pY2hhZWwuZC5raW5uZXlAaW50ZWwuY29tPg0KPiA+IENjOiBIYW8g QSBXdSA8aGFvLmEud3VAaW50ZWwuY29tPg0KPiA+IENjOiBMaW1pbmcgR2FvIDxnYW9saW1pbmdA Ynlvc29mdC5jb20uY24+DQo+ID4gU2lnbmVkLW9mZi1ieTogQnJldCBCYXJrZWxldyA8QnJldC5C YXJrZWxld0BtaWNyb3NvZnQuY29tPg0KPiA+IC0tLQ0KPiA+ICBNZGVNb2R1bGVQa2cvVGVzdC9N ZGVNb2R1bGVQa2dIb3N0VGVzdC5kc2MgICAgfCAgMTEgKw0KPiA+ICAuLi4vVmFyaWFibGVMb2Nr UmVxdWVzdFRvTG9ja1VuaXRUZXN0LmMgICAgICAgfCA0MzQNCj4gKysrKysrKysrKysrKysrKysr DQo+ID4gIC4uLi9WYXJpYWJsZUxvY2tSZXF1ZXN0VG9Mb2NrVW5pdFRlc3QuaW5mICAgICB8ICAz NiArKw0KPiA+ICAuLi4vUnVudGltZUR4ZS9WYXJpYWJsZUxvY2tSZXF1ZXN0VG9Mb2NrLmMgICAg fCAzNjMNCj4gKysrKysrKysrKysrKy0tDQo+ID4gIDQgZmlsZXMgY2hhbmdlZCwgODA5IGluc2Vy dGlvbnMoKyksIDM1IGRlbGV0aW9ucygtKSAgY3JlYXRlIG1vZGUgMTAwNjQ0DQo+ID4gTWRlTW9k dWxlUGtnL1VuaXZlcnNhbC9WYXJpYWJsZS9SdW50aW1lRHhlL1J1bnRpbWVEeGVVbml0VGVzdC9W YXJpDQo+ID4gYWJsZUxvY2tSZXF1ZXN0VG9Mb2NrVW5pdFRlc3QuYw0KPiA+ICBjcmVhdGUgbW9k ZSAxMDA2NDQNCj4gPiBNZGVNb2R1bGVQa2cvVW5pdmVyc2FsL1ZhcmlhYmxlL1J1bnRpbWVEeGUv UnVudGltZUR4ZVVuaXRUZXN0L1ZhcmkNCj4gPiBhYmxlTG9ja1JlcXVlc3RUb0xvY2tVbml0VGVz dC5pbmYNCj4gPg0KPiA+IGRpZmYgLS1naXQgYS9NZGVNb2R1bGVQa2cvVGVzdC9NZGVNb2R1bGVQ a2dIb3N0VGVzdC5kc2MNCj4gPiBiL01kZU1vZHVsZVBrZy9UZXN0L01kZU1vZHVsZVBrZ0hvc3RU ZXN0LmRzYw0KPiA+IGluZGV4IDcyYTExOWRiNDU2OC4uNGRhNDY5MmM4NDUxIDEwMDY0NA0KPiA+ IC0tLSBhL01kZU1vZHVsZVBrZy9UZXN0L01kZU1vZHVsZVBrZ0hvc3RUZXN0LmRzYw0KPiA+ICsr KyBiL01kZU1vZHVsZVBrZy9UZXN0L01kZU1vZHVsZVBrZ0hvc3RUZXN0LmRzYw0KPiA+IEBAIC0x OSw2ICsxOSw5IEBAIFtEZWZpbmVzXQ0KPiA+DQo+ID4gICFpbmNsdWRlIFVuaXRUZXN0RnJhbWV3 b3JrUGtnL1VuaXRUZXN0RnJhbWV3b3JrUGtnSG9zdC5kc2MuaW5jDQo+ID4NCj4gPiArW0xpYnJh cnlDbGFzc2VzXQ0KPiA+ICsgIFNhZmVJbnRMaWJ8TWRlUGtnL0xpYnJhcnkvQmFzZVNhZmVJbnRM aWIvQmFzZVNhZmVJbnRMaWIuaW5mDQo+ID4gKw0KPiA+ICBbQ29tcG9uZW50c10NCj4gPg0KPiA+ IE1kZU1vZHVsZVBrZy9MaWJyYXJ5L0R4ZVJlc2V0U3lzdGVtTGliL1VuaXRUZXN0L01vY2tVZWZp UnVudGltZVNlcg0KPiA+IHZpY2VzVGFibGVMaWIuaW5mDQo+ID4NCj4gPiBAQCAtMzAsMyArMzMs MTEgQEAgW0NvbXBvbmVudHNdDQo+ID4NCj4gPiBSZXNldFN5c3RlbUxpYnxNZGVNb2R1bGVQa2cv TGlicmFyeS9EeGVSZXNldFN5c3RlbUxpYi9EeGVSZXNldFN5c3QNCj4gPiBlbUxpYi5pbmYNCj4g Pg0KPiA+IFVlZmlSdW50aW1lU2VydmljZXNUYWJsZUxpYnxNZGVNb2R1bGVQa2cvTGlicmFyeS9E eGVSZXNldFN5c3RlbUxpYi8NCj4gPiBVbml0VGVzdC9Nb2NrVWVmaVJ1bnRpbWVTZXJ2aWNlc1Rh YmxlTGliLmluZg0KPiA+ICAgIH0NCj4gPiArDQo+ID4gKw0KPiA+IE1kZU1vZHVsZVBrZy9Vbml2 ZXJzYWwvVmFyaWFibGUvUnVudGltZUR4ZS9SdW50aW1lRHhlVW5pdFRlc3QvVmFyaQ0KPiA+IGFi bGVMb2NrUmVxdWVzdFRvTG9ja1VuaXRUZXN0LmluZiB7DQo+ID4gKyAgICA8TGlicmFyeUNsYXNz ZXM+DQo+ID4gKw0KPiA+DQo+IFZhcmlhYmxlUG9saWN5TGlifE1kZU1vZHVsZVBrZy9MaWJyYXJ5 L1ZhcmlhYmxlUG9saWN5TGliL1ZhcmlhYmxlUG9saWN5TGkNCj4gPiBiLmluZg0KPiA+ICsNCj4g Pg0KPiBWYXJpYWJsZVBvbGljeUhlbHBlckxpYnxNZGVNb2R1bGVQa2cvTGlicmFyeS9WYXJpYWJs ZVBvbGljeUhlbHBlckxpYi9WYQ0KPiA+IHJpYWJsZVBvbGljeUhlbHBlckxpYi5pbmYNCj4gPiAr ICAgIDxQY2RzRml4ZWRBdEJ1aWxkPg0KPiA+ICsNCj4gPiArDQo+ID4gZ0VmaU1kZU1vZHVsZVBr Z1Rva2VuU3BhY2VHdWlkLlBjZEFsbG93VmFyaWFibGVQb2xpY3lFbmZvcmNlbWVudERpcw0KPiA+ IGFibA0KPiA+ICsgZXxUUlVFDQo+ID4gKyAgfQ0KPiA+IGRpZmYgLS1naXQNCj4gPiBhL01kZU1v ZHVsZVBrZy9Vbml2ZXJzYWwvVmFyaWFibGUvUnVudGltZUR4ZS9SdW50aW1lRHhlVW5pdFRlc3Qv VmENCj4gPiByaWFibGVMb2NrUmVxdWVzdFRvTG9ja1VuaXRUZXN0LmMNCj4gPiBiL01kZU1vZHVs ZVBrZy9Vbml2ZXJzYWwvVmFyaWFibGUvUnVudGltZUR4ZS9SdW50aW1lRHhlVW5pdFRlc3QvVmEN Cj4gPiByaWFibGVMb2NrUmVxdWVzdFRvTG9ja1VuaXRUZXN0LmMNCj4gPiBuZXcgZmlsZSBtb2Rl IDEwMDY0NA0KPiA+IGluZGV4IDAwMDAwMDAwMDAwMC4uMmY0YzRkMmY3OWY0DQo+ID4gLS0tIC9k ZXYvbnVsbA0KPiA+ICsrKw0KPiA+IGIvTWRlTW9kdWxlUGtnL1VuaXZlcnNhbC9WYXJpYWJsZS9S dW50aW1lRHhlL1J1bnRpbWVEeGVVbml0VGVzdC9WYQ0KPiA+IHJpDQo+ID4gKysrIGFibGVMb2Nr UmVxdWVzdFRvTG9ja1VuaXRUZXN0LmMNCj4gPiBAQCAtMCwwICsxLDQzNCBAQA0KPiA+ICsvKiog QGZpbGUNCj4gPiArICBUaGlzIGlzIGEgaG9zdC1iYXNlZCB1bml0IHRlc3QgZm9yIHRoZSBWYXJp YWJsZUxvY2tSZXF1ZXN0VG9Mb2NrDQpzaGltLg0KPiA+ICsNCj4gPiArICBDb3B5cmlnaHQgKGMp IE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4NCj4gPiArICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjog QlNELTItQ2xhdXNlLVBhdGVudA0KPiA+ICsNCj4gPiArKiovDQo+ID4gKw0KPiA+ICsjaW5jbHVk ZSA8c3RkaW8uaD4NCj4gPiArI2luY2x1ZGUgPHN0cmluZy5oPg0KPiA+ICsjaW5jbHVkZSA8c3Rk YXJnLmg+DQo+ID4gKyNpbmNsdWRlIDxzdGRkZWYuaD4NCj4gPiArI2luY2x1ZGUgPHNldGptcC5o Pg0KPiA+ICsjaW5jbHVkZSA8Y21vY2thLmg+DQo+ID4gKw0KPiA+ICsjaW5jbHVkZSA8VWVmaS5o Pg0KPiA+ICsjaW5jbHVkZSA8TGlicmFyeS9EZWJ1Z0xpYi5oPg0KPiA+ICsjaW5jbHVkZSA8TGli cmFyeS9CYXNlTWVtb3J5TGliLmg+DQo+ID4gKyNpbmNsdWRlIDxMaWJyYXJ5L01lbW9yeUFsbG9j YXRpb25MaWIuaD4gI2luY2x1ZGUNCj4gPiArPExpYnJhcnkvVW5pdFRlc3RMaWIuaD4gI2luY2x1 ZGUgPExpYnJhcnkvVmFyaWFibGVQb2xpY3lMaWIuaD4gI2luY2x1ZGUNCj4gPiArPExpYnJhcnkv VmFyaWFibGVQb2xpY3lIZWxwZXJMaWIuaD4NCj4gPiArDQo+ID4gKyNpbmNsdWRlIDxQcm90b2Nv bC9WYXJpYWJsZUxvY2suaD4NCj4gPiArDQo+ID4gKyNkZWZpbmUgVU5JVF9URVNUX05BTUUgICAg ICAgICJWYXJQb2wvVmFyTG9jayBTaGltIFVuaXQgVGVzdCINCj4gPiArI2RlZmluZSBVTklUX1RF U1RfVkVSU0lPTiAgICAgIjEuMCINCj4gPiArDQo+ID4gKy8vLz09PSBDT0RFIFVOREVSIFRFU1QN Cj4gPiArPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09DQo+ID4gPT09PT09PT09PT09PT0NCj4gPiArPT09PQ0KPiA+ICsNCj4gPiArRUZJX1NU QVRVUw0KPiA+ICtFRklBUEkNCj4gPiArVmFyaWFibGVMb2NrUmVxdWVzdFRvTG9jayAoDQo+ID4g KyAgSU4gQ09OU1QgRURLSUlfVkFSSUFCTEVfTE9DS19QUk9UT0NPTCAgKlRoaXMsDQo+ID4gKyAg SU4gICAgICAgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgKlZhcmlhYmxlTmFtZSwNCj4g PiArICBJTiAgICAgICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgICAqVmVuZG9yR3VpZA0K PiA+ICsgICk7DQo+ID4gKw0KPiA+ICsvLy89PT0gVEVTVCBEQVRBDQo+ID4gKz09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KPiA+ID09PT09 PT09PT09PT09DQo+ID4gKz09PT09PT09PT09DQo+ID4gKw0KPiA+ICsvLw0KPiA+ICsvLyBUZXN0 IEdVSUQgMSB7Rjk1NUJBMkQtNEEyQy00ODBDLUJGRDEtM0NDNTIyNjEwNTkyfQ0KPiA+ICsvLw0K PiA+ICtFRklfR1VJRCAgbVRlc3RHdWlkMSA9IHsNCj4gPiArICAweGY5NTViYTJkLCAweDRhMmMs IDB4NDgwYywgezB4YmYsIDB4ZDEsIDB4M2MsIDB4YzUsIDB4MjIsIDB4NjEsIDB4NSwNCj4gPiAr MHg5Mn0gfTsNCj4gPiArDQo+ID4gKy8vDQo+ID4gKy8vIFRlc3QgR1VJRCAyIHsyREVBNzk5RS01 RTczLTQzQjktODcwRS1DOTQ1Q0U4MkFGM0F9DQo+ID4gKy8vDQo+ID4gK0VGSV9HVUlEICBtVGVz dEd1aWQyID0gew0KPiA+ICsgIDB4MmRlYTc5OWUsIDB4NWU3MywgMHg0M2I5LCB7MHg4NywgMHhl LCAweGM5LCAweDQ1LCAweGNlLCAweDgyLCAweGFmLA0KPiA+ICsweDNhfSB9Ow0KPiA+ICsNCj4g PiArLy8NCj4gPiArLy8gVGVzdCBHVUlEIDMgezY5OEEyQkZELUE2MTYtNDgyRC1CODhDLTcxMDBC RDY2ODJBOX0NCj4gPiArLy8NCj4gPiArRUZJX0dVSUQgIG1UZXN0R3VpZDMgPSB7DQo+ID4gKyAg MHg2OThhMmJmZCwgMHhhNjE2LCAweDQ4MmQsIHsweGI4LCAweDhjLCAweDcxLCAweDAsIDB4YmQs IDB4NjYsIDB4ODIsDQo+ID4gKzB4YTl9IH07DQo+ID4gKw0KPiA+ICsjZGVmaW5lIFRFU1RfVkFS XzFfTkFNRSAgICAgICAgICAgICAgTCJUZXN0VmFyMSINCj4gPiArI2RlZmluZSBURVNUX1ZBUl8y X05BTUUgICAgICAgICAgICAgIEwiVGVzdFZhcjIiDQo+ID4gKyNkZWZpbmUgVEVTVF9WQVJfM19O QU1FICAgICAgICAgICAgICBMIlRlc3RWYXIzIg0KPiA+ICsNCj4gPiArI2RlZmluZSBURVNUX1BP TElDWV9BVFRSSUJVVEVTX05VTEwgIDANCj4gPiArI2RlZmluZSBURVNUX1BPTElDWV9NSU5fU0la RV9OVUxMICAgIDANCj4gPiArI2RlZmluZSBURVNUX1BPTElDWV9NQVhfU0laRV9OVUxMICAgIE1B WF9VSU5UMzINCj4gPiArDQo+ID4gKyNkZWZpbmUgVEVTVF9QT0xJQ1lfTUlOX1NJWkVfMTAgICAg ICAxMA0KPiA+ICsjZGVmaW5lIFRFU1RfUE9MSUNZX01BWF9TSVpFXzIwMCAgICAgMjAwDQo+ID4g Kw0KPiA+ICsvLy89PT0gSEVMUEVSIEZVTkNUSU9OUw0KPiA+ICs9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCj4gPiA9PT09PT09PT09PT09 PQ0KPiA+ICs9PT09DQo+ID4gKw0KPiA+ICsvKioNCj4gPiArICBNb2NrZWQgdmVyc2lvbiBvZiBH ZXRWYXJpYWJsZSwgZm9yIHRlc3RpbmcuDQo+ID4gKw0KPiA+ICsgIEBwYXJhbSAgVmFyaWFibGVO YW1lDQo+ID4gKyAgQHBhcmFtICBWZW5kb3JHdWlkDQo+ID4gKyAgQHBhcmFtICBBdHRyaWJ1dGVz DQo+ID4gKyAgQHBhcmFtICBEYXRhU2l6ZQ0KPiA+ICsgIEBwYXJhbSAgRGF0YQ0KPiA+ICsqKi8N Cj4gPiArRUZJX1NUQVRVUw0KPiA+ICtFRklBUEkNCj4gPiArU3R1YkdldFZhcmlhYmxlTnVsbCAo DQo+ID4gKyAgSU4gICAgIENIQVIxNiAgICAqVmFyaWFibGVOYW1lLA0KPiA+ICsgIElOICAgICBF RklfR1VJRCAgKlZlbmRvckd1aWQsDQo+ID4gKyAgT1VUICAgIFVJTlQzMiAgICAqQXR0cmlidXRl cywgIE9QVElPTkFMDQo+ID4gKyAgSU4gT1VUIFVJTlROICAgICAqRGF0YVNpemUsDQo+ID4gKyAg T1VUICAgIFZPSUQgICAgICAqRGF0YSAgICAgICAgIE9QVElPTkFMDQo+ID4gKyAgKQ0KPiA+ICt7 DQo+ID4gKyAgVUlOVDMyICAgICAgTW9ja2VkQXR0cjsNCj4gPiArICBVSU5UTiAgICAgICBNb2Nr ZWREYXRhU2l6ZTsNCj4gPiArICBWT0lEICAgICAgICAqTW9ja2VkRGF0YTsNCj4gPiArICBFRklf U1RBVFVTICBNb2NrZWRSZXR1cm47DQo+ID4gKw0KPiA+ICsgIGNoZWNrX2V4cGVjdGVkX3B0ciAo VmFyaWFibGVOYW1lKTsNCj4gPiArICBjaGVja19leHBlY3RlZF9wdHIgKFZlbmRvckd1aWQpOw0K PiA+ICsgIGNoZWNrX2V4cGVjdGVkX3B0ciAoRGF0YVNpemUpOw0KPiA+ICsNCj4gPiArICBNb2Nr ZWRBdHRyICAgICA9IChVSU5UMzIpbW9jaygpOw0KPiA+ICsgIE1vY2tlZERhdGFTaXplID0gKFVJ TlROKW1vY2soKTsNCj4gPiArICBNb2NrZWREYXRhICAgICA9IChWT0lEKikoVUlOVE4pbW9jaygp Ow0KPiA+ICsgIE1vY2tlZFJldHVybiAgID0gKEVGSV9TVEFUVVMpbW9jaygpOw0KPiA+ICsNCj4g PiArICBpZiAoQXR0cmlidXRlcyAhPSBOVUxMKSB7DQo+ID4gKyAgICAqQXR0cmlidXRlcyA9IE1v Y2tlZEF0dHI7DQo+ID4gKyAgfQ0KPiA+ICsgIGlmIChEYXRhICE9IE5VTEwgJiYgIUVGSV9FUlJP UiAoTW9ja2VkUmV0dXJuKSkgew0KPiA+ICsgICAgQ29weU1lbSAoRGF0YSwgTW9ja2VkRGF0YSwg TW9ja2VkRGF0YVNpemUpOyAgfQ0KPiA+ICsNCj4gPiArICAqRGF0YVNpemUgPSBNb2NrZWREYXRh U2l6ZTsNCj4gPiArDQo+ID4gKyAgcmV0dXJuIE1vY2tlZFJldHVybjsNCj4gPiArfQ0KPiA+ICsN Cj4gPiArLy8NCj4gPiArLy8gQW55dGhpbmcgeW91IHRoaW5rIG1pZ2h0IGJlIGhlbHBmdWwgdGhh dCBpc24ndCBhIHRlc3QgaXRzZWxmLg0KPiA+ICsvLw0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAg VGhpcyBpcyBhIGNvbW1vbiBzZXR1cCBmdW5jdGlvbiB0aGF0IHdpbGwgZW5zdXJlIHRoZSBsaWJy YXJ5IGlzDQo+ID4gK2Fsd2F5cw0KPiA+ICsgIGluaXRpYWxpemVkIHdpdGggdGhlIHN0dWJiZWQg R2V0VmFyaWFibGUuDQo+ID4gKw0KPiA+ICsgIE5vdCB1c2VkIGJ5IGFsbCB0ZXN0IGNhc2VzLCBi dXQgYnkgbW9zdC4NCj4gPiArDQo+ID4gKyAgQHBhcmFtW2luXSAgQ29udGV4dCAgVW5pdCB0ZXN0 IGNhc2UgY29udGV4dCAqKi8gU1RBVElDDQo+ID4gK1VOSVRfVEVTVF9TVEFUVVMgRUZJQVBJIExp YkluaXRNb2NrZWQgKA0KPiA+ICsgIElOIFVOSVRfVEVTVF9DT05URVhUICBDb250ZXh0DQo+ID4g KyAgKQ0KPiA+ICt7DQo+ID4gKyAgcmV0dXJuIEVGSV9FUlJPUiAoSW5pdFZhcmlhYmxlUG9saWN5 TGliIChTdHViR2V0VmFyaWFibGVOdWxsKSkgPw0KPiA+ICtVTklUX1RFU1RfRVJST1JfUFJFUkVR VUlTSVRFX05PVF9NRVQgOiBVTklUX1RFU1RfUEFTU0VEOyB9DQo+ID4gKw0KPiA+ICsvKioNCj4g PiArICBDb21tb24gY2xlYW51cCBmdW5jdGlvbiB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbGlicmFy eSBpcyBhbHdheXMNCj4gPiArZGUtaW5pdGlhbGl6ZWQNCj4gPiArICBwcmlvciB0byB0aGUgbmV4 dCB0ZXN0IGNhc2UuDQo+ID4gKw0KPiA+ICsgIEBwYXJhbVtpbl0gIENvbnRleHQgIFVuaXQgdGVz dCBjYXNlIGNvbnRleHQgKiovIFNUQVRJQyBWT0lEIEVGSUFQSQ0KPiA+ICtMaWJDbGVhbnVwICgN Cj4gPiArICBJTiBVTklUX1RFU1RfQ09OVEVYVCAgQ29udGV4dA0KPiA+ICsgICkNCj4gPiArew0K PiA+ICsgIERlaW5pdFZhcmlhYmxlUG9saWN5TGliKCk7DQo+ID4gK30NCj4gPiArDQo+ID4gKy8v Lz09PSBURVNUIENBU0VTDQo+ID4gKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQ0KPiA+ID09PT09PT09PT09PT09DQo+ID4gKz09PT09PT09 PT0NCj4gPiArDQo+ID4gKy8vLz09PT09IFNISU0gU1VJVEUNCj4gPiArPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQo+ID4gPT0NCj4gPiAr DQo+ID4gKy8qKg0KPiA+ICsgIFRlc3QgQ2FzZSB0aGF0IGxvY2tzIGEgc2luZ2xlIHZhcmlhYmxl IHVzaW5nIHRoZSBWYXJpYWJsZSBMb2NrDQpQcm90b2NvbC4NCj4gPiArICBUaGUgY2FsbCBpcyBl eHBlY3RlZCB0byBzdWNjZWVkLg0KPiA+ICsNCj4gPiArICBAcGFyYW1baW5dICBDb250ZXh0ICBV bml0IHRlc3QgY2FzZSBjb250ZXh0ICoqLyBVTklUX1RFU1RfU1RBVFVTDQo+ID4gK0VGSUFQSSBM b2NraW5nV2l0aG91dEFueVBvbGljaWVzU2hvdWxkU3VjY2VlZCAoDQo+ID4gKyAgSU4gVU5JVF9U RVNUX0NPTlRFWFQgIENvbnRleHQNCj4gPiArICApDQo+ID4gK3sNCj4gPiArICBFRklfU1RBVFVT ICBTdGF0dXM7DQo+ID4gKw0KPiA+ICsgIFN0YXR1cyA9IFZhcmlhYmxlTG9ja1JlcXVlc3RUb0xv Y2sgKE5VTEwsIFRFU1RfVkFSXzFfTkFNRSwNCj4gPiArICZtVGVzdEd1aWQxKTsgIFVUX0FTU0VS VF9OT1RfRUZJX0VSUk9SIChTdGF0dXMpOw0KPiA+ICsNCj4gPiArICByZXR1cm4gVU5JVF9URVNU X1BBU1NFRDsNCj4gPiArfQ0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAgVGVzdCBDYXNlIHRoYXQg bG9ja3MgdGhlIHNhbWUgdmFyaWFibGUgdHdpY2UgdXNpbmcgdGhlIFZhcmlhYmxlIExvY2sNCj4g UHJvY29sLg0KPg0KPg0KPiBNaW5vciBjb21tZW50LCB0eXBvIGZvciAnUHJvY29sJyAtPiAnUHJv dG9jb2wnDQo+DQo+DQo+ID4gKyAgQm90aCBjYWxscyBhcmUgZXhwZWN0ZWQgdG8gc3VjY2VlZC4N Cj4gPiArDQo+ID4gKyAgQHBhcmFtW2luXSAgQ29udGV4dCAgVW5pdCB0ZXN0IGNhc2UgY29udGV4 dA0KPiA+ICsgICoqLw0KPiA+ICtVTklUX1RFU1RfU1RBVFVTDQo+ID4gK0VGSUFQSQ0KPiA+ICtM b2NraW5nVHdpY2VTaG91bGRTdWNjZWVkICgNCj4gPiArICBJTiBVTklUX1RFU1RfQ09OVEVYVCAg Q29udGV4dA0KPiA+ICsgICkNCj4gPiArew0KPiA+ICsgIEVGSV9TVEFUVVMgIFN0YXR1czsNCj4g PiArDQo+ID4gKyAgU3RhdHVzID0gVmFyaWFibGVMb2NrUmVxdWVzdFRvTG9jayAoTlVMTCwgVEVT VF9WQVJfMV9OQU1FLA0KPiA+ICsgJm1UZXN0R3VpZDEpOyAgVVRfQVNTRVJUX05PVF9FRklfRVJS T1IgKFN0YXR1cyk7DQo+ID4gKw0KPiA+ICsgIFN0YXR1cyA9IFZhcmlhYmxlTG9ja1JlcXVlc3RU b0xvY2sgKE5VTEwsIFRFU1RfVkFSXzFfTkFNRSwNCj4gPiArICZtVGVzdEd1aWQxKTsgIFVUX0FT U0VSVF9OT1RfRUZJX0VSUk9SIChTdGF0dXMpOw0KPiA+ICsNCj4gPiArICByZXR1cm4gVU5JVF9U RVNUX1BBU1NFRDsNCj4gPiArfQ0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAgVGVzdCBDYXNlIHRo YXQgbG9ja3MgYSB2YXJpYWJsZSB1c2luZyB0aGUgVmFyaWFibGUgUG9saWN5IFByb3RvY29sDQo+ ID4gK3RoZW4gbG9ja3MNCj4gPiArICB0aGUgc2FtZSB2YXJpYWJsZSB1c2luZyB0aGUgVmFyaWFi bGUgTG9jayBQcm90b2NvbC4NCj4gPiArICBCb3RoIGNhbGxzIGFyZSBleHBlY3RlZCB0byBzdWNj ZWVkLg0KPiA+ICsNCj4gPiArICBAcGFyYW1baW5dICBDb250ZXh0ICBVbml0IHRlc3QgY2FzZSBj b250ZXh0DQo+ID4gKyAgKiovDQo+ID4gK1VOSVRfVEVTVF9TVEFUVVMNCj4gPiArRUZJQVBJDQo+ ID4gK0xvY2tpbmdBTG9ja2VkVmFyaWFibGVTaG91bGRTdWNjZWVkICgNCj4gPiArICBJTiBVTklU X1RFU1RfQ09OVEVYVCAgQ29udGV4dA0KPiA+ICsgICkNCj4gPiArew0KPiA+ICsgIEVGSV9TVEFU VVMgICAgICAgICAgICAgU3RhdHVzOw0KPiA+ICsgIFZBUklBQkxFX1BPTElDWV9FTlRSWSAgKk5l d0VudHJ5Ow0KPiA+ICsNCj4gPiArICAvLw0KPiA+ICsgIC8vIENyZWF0ZSBhIHZhcmlhYmxlIHBv bGljeSB0aGF0IGxvY2tzIHRoZSB2YXJpYWJsZS4NCj4gPiArICAvLw0KPiA+ICsgIFN0YXR1cyA9 IENyZWF0ZUJhc2ljVmFyaWFibGVQb2xpY3kgKA0KPiA+ICsgICAgICAgICAgICAgJm1UZXN0R3Vp ZDEsDQo+ID4gKyAgICAgICAgICAgICBURVNUX1ZBUl8xX05BTUUsDQo+ID4gKyAgICAgICAgICAg ICBURVNUX1BPTElDWV9NSU5fU0laRV9OVUxMLA0KPiA+ICsgICAgICAgICAgICAgVEVTVF9QT0xJ Q1lfTUFYX1NJWkVfMjAwLA0KPiA+ICsgICAgICAgICAgICAgVEVTVF9QT0xJQ1lfQVRUUklCVVRF U19OVUxMLA0KPiA+ICsgICAgICAgICAgICAgVEVTVF9QT0xJQ1lfQVRUUklCVVRFU19OVUxMLA0K PiA+ICsgICAgICAgICAgICAgVkFSSUFCTEVfUE9MSUNZX1RZUEVfTE9DS19OT1csDQo+ID4gKyAg ICAgICAgICAgICAmTmV3RW50cnkNCj4gPiArICAgICAgICAgICAgICk7DQo+ID4gKyAgVVRfQVNT RVJUX05PVF9FRklfRVJST1IgKFN0YXR1cyk7DQo+ID4gKw0KPiA+ICsgIC8vDQo+ID4gKyAgLy8g UmVnaXN0ZXIgdGhlIG5ldyBwb2xpY3kuDQo+ID4gKyAgLy8NCj4gPiArICBTdGF0dXMgPSBSZWdp c3RlclZhcmlhYmxlUG9saWN5IChOZXdFbnRyeSk7DQo+ID4gKw0KPiA+ICsgIFN0YXR1cyA9IFZh cmlhYmxlTG9ja1JlcXVlc3RUb0xvY2sgKE5VTEwsIFRFU1RfVkFSXzFfTkFNRSwNCj4gPiArICZt VGVzdEd1aWQxKTsgIFVUX0FTU0VSVF9OT1RfRUZJX0VSUk9SIChTdGF0dXMpOw0KPiA+ICsNCj4g PiArICBGcmVlUG9vbCAoTmV3RW50cnkpOw0KPiA+ICsNCj4gPiArICByZXR1cm4gVU5JVF9URVNU X1BBU1NFRDsNCj4gPiArfQ0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAgVGVzdCBDYXNlIHRoYXQg bG9ja3MgYSB2YXJpYWJsZSB1c2luZyB0aGUgVmFyaWFibGUgUG9saWN5IFByb3RvY29sDQo+ID4g K3dpdGggYQ0KPiA+ICsgIHBvbGljeSBvdGhlciB0aGFuIExPQ0tfTk9XIHRoZW4gYXR0ZW1wdHMg dG8gbG9jayB0aGUgc2FtZSB2YXJpYWJsZQ0KPiA+ICt1c2luZyB0aGUNCj4gPiArICBWYXJpYWJs ZSBMb2NrIFByb3RvY29sLiAgVGhlIGNhbGwgdG8gVmFyaWFibGUgUG9saWN5IGlzIGV4cGVjdGVk IHRvDQo+ID4gK3N1Y2NjZWQNCj4NCj4NCj4gJ3N1Y2NjZWQnIC0+ICdzdWNjZWVkJw0KPg0KPg0K PiA+ICsgIGFuZCB0aGUgY2FsbCB0byBWYXJpYWJsZSBMb2NrIGlzIGV4cGVjdGVkIHRvIGZhaWwu DQo+ID4gKw0KPiA+ICsgIEBwYXJhbVtpbl0gIENvbnRleHQgIFVuaXQgdGVzdCBjYXNlIGNvbnRl eHQNCj4gPiArICAqKi8NCj4gPiArVU5JVF9URVNUX1NUQVRVUw0KPiA+ICtFRklBUEkNCj4gPiAr TG9ja2luZ0FuVW5sb2NrZWRWYXJpYWJsZVNob3VsZEZhaWwgKA0KPiA+ICsgIElOIFVOSVRfVEVT VF9DT05URVhUICAgICAgQ29udGV4dA0KPiA+ICsgICkNCj4gPiArew0KPiA+ICsgIEVGSV9TVEFU VVMgICAgICAgICAgICAgICAgU3RhdHVzOw0KPiA+ICsgIFZBUklBQkxFX1BPTElDWV9FTlRSWSAg ICAgKk5ld0VudHJ5Ow0KPiA+ICsNCj4gPiArICAvLyBDcmVhdGUgYSB2YXJpYWJsZSBwb2xpY3kg dGhhdCBsb2NrcyB0aGUgdmFyaWFibGUuDQo+ID4gKyAgU3RhdHVzID0gQ3JlYXRlVmFyU3RhdGVW YXJpYWJsZVBvbGljeSAoJm1UZXN0R3VpZDEsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgVEVTVF9WQVJfMV9OQU1FLA0KPiA+ICsNCj4gVEVTVF9QT0xJQ1lf TUlOX1NJWkVfTlVMTCwNCj4gPiArDQo+IFRFU1RfUE9MSUNZX01BWF9TSVpFXzIwMCwNCj4gPiAr DQo+IFRFU1RfUE9MSUNZX0FUVFJJQlVURVNfTlVMTCwNCj4gPiArDQo+IFRFU1RfUE9MSUNZX0FU VFJJQlVURVNfTlVMTCwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAmbVRlc3RHdWlkMiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAxLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFRFU1RfVkFSXzJfTkFNRSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAmTmV3RW50cnkpOw0KPiA+ICsgVVRfQVNTRVJUX05PVF9FRklfRVJST1IgKFN0YXR1 cyk7DQo+ID4gKw0KPiA+ICsgIC8vIFJlZ2lzdGVyIHRoZSBuZXcgcG9saWN5Lg0KPiA+ICsgIFN0 YXR1cyA9IFJlZ2lzdGVyVmFyaWFibGVQb2xpY3kgKE5ld0VudHJ5KTsNCj4gPiArDQo+ID4gKyAg U3RhdHVzID0gVmFyaWFibGVMb2NrUmVxdWVzdFRvTG9jayAoTlVMTCwgVEVTVF9WQVJfMV9OQU1F LA0KPiA+ICsgJm1UZXN0R3VpZDEpOyAgVVRfQVNTRVJUX1RSVUUgKEVGSV9FUlJPUiAoU3RhdHVz KSk7DQo+ID4gKw0KPiA+ICsgIEZyZWVQb29sIChOZXdFbnRyeSk7DQo+ID4gKw0KPiA+ICsgIHJl dHVybiBVTklUX1RFU1RfUEFTU0VEOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKioNCj4gPiArICBU ZXN0IENhc2UgdGhhdCBsb2NrcyBhIHZhcmlhYmxlIHVzaW5nIFZhcmlhYmxlIExvY2sgUHJvdG9j b2wgUG9saWN5DQo+ID4gK1Byb3RvY29sDQo+ID4gKyAgdGhlbiBhbmQgdGhlbiBhdHRlbXB0cyB0 byBsb2NrIHRoZSBzYW1lIHZhcmlhYmxlIHVzaW5nIHRoZSBWYXJpYWJsZQ0KPiA+ICtQb2xpY3kN Cj4gPiArICBQcm90b2NvbC4gIFRoZSBjYWxsIHRvIFZhcmlhYmxlIExvY2sgaXMgZXhwZWN0ZWQg dG8gc3VjY2NlZCBhbmQgdGhlDQo+DQo+DQo+ICdzdWNjY2VkJyAtPiAnc3VjY2VlZCcNCj4NCj4g QmVzdCBSZWdhcmRzLA0KPiBIYW8gV3UNCj4NCj4NCj4gPiArY2FsbCB0bw0KPiA+ICsgIFZhcmlh YmxlIFBvbGljeSBpcyBleHBlY3RlZCB0byBmYWlsLg0KPiA+ICsNCj4gPiArICBAcGFyYW1baW5d ICBDb250ZXh0ICBVbml0IHRlc3QgY2FzZSBjb250ZXh0DQo+ID4gKyAgKiovDQo+ID4gK1VOSVRf VEVTVF9TVEFUVVMNCj4gPiArRUZJQVBJDQo+ID4gK1NldHRpbmdQb2xpY3lGb3JBTG9ja2VkVmFy aWFibGVTaG91bGRGYWlsICgNCj4gPiArICBJTiBVTklUX1RFU1RfQ09OVEVYVCAgICAgIENvbnRl eHQNCj4gPiArICApDQo+ID4gK3sNCj4gPiArICBFRklfU1RBVFVTICAgICAgICAgICAgICAgIFN0 YXR1czsNCj4gPiArICBWQVJJQUJMRV9QT0xJQ1lfRU5UUlkgICAgICpOZXdFbnRyeTsNCj4gPiAr DQo+ID4gKyAgLy8gTG9jayB0aGUgdmFyaWFibGUuDQo+ID4gKyAgU3RhdHVzID0gVmFyaWFibGVM b2NrUmVxdWVzdFRvTG9jayAoTlVMTCwgVEVTVF9WQVJfMV9OQU1FLA0KPiA+ICsgJm1UZXN0R3Vp ZDEpOyAgVVRfQVNTRVJUX05PVF9FRklfRVJST1IgKFN0YXR1cyk7DQo+ID4gKw0KPiA+ICsgIC8v IENyZWF0ZSBhIHZhcmlhYmxlIHBvbGljeSB0aGF0IGxvY2tzIHRoZSB2YXJpYWJsZS4NCj4gPiAr ICBTdGF0dXMgPSBDcmVhdGVWYXJTdGF0ZVZhcmlhYmxlUG9saWN5ICgmbVRlc3RHdWlkMSwNCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX1ZBUl8xX05B TUUsDQo+ID4gKw0KPiBURVNUX1BPTElDWV9NSU5fU0laRV9OVUxMLA0KPiA+ICsNCj4gVEVTVF9Q T0xJQ1lfTUFYX1NJWkVfMjAwLA0KPiA+ICsNCj4gVEVTVF9QT0xJQ1lfQVRUUklCVVRFU19OVUxM LA0KPiA+ICsNCj4gVEVTVF9QT0xJQ1lfQVRUUklCVVRFU19OVUxMLA0KPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtVGVzdEd1aWQyLA0KPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsDQo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9WQVJfMl9OQU1FLA0KPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZOZXdFbnRyeSk7DQo+ID4gKyBVVF9B U1NFUlRfTk9UX0VGSV9FUlJPUiAoU3RhdHVzKTsNCj4gPiArDQo+ID4gKyAgLy8gUmVnaXN0ZXIg dGhlIG5ldyBwb2xpY3kuDQo+ID4gKyAgU3RhdHVzID0gUmVnaXN0ZXJWYXJpYWJsZVBvbGljeSAo TmV3RW50cnkpOyAgVVRfQVNTRVJUX1RSVUUNCj4gPiArIChFRklfRVJST1IgKFN0YXR1cykpOw0K PiA+ICsNCj4gPiArICBGcmVlUG9vbCAoTmV3RW50cnkpOw0KPiA+ICsNCj4gPiArICByZXR1cm4g VU5JVF9URVNUX1BBU1NFRDsNCj4gPiArfQ0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAgTWFpbiBl bnRyeSBwb2ludCB0byB0aGlzIHVuaXQgdGVzdCBhcHBsaWNhdGlvbi4NCj4gPiArDQo+ID4gKyAg U2V0cyB1cCBhbmQgcnVucyB0aGUgdGVzdCBzdWl0ZXMuDQo+ID4gKyoqLw0KPiA+ICtWT0lEDQo+ ID4gK0VGSUFQSQ0KPiA+ICtVbml0VGVzdE1haW4gKA0KPiA+ICsgIFZPSUQNCj4gPiArICApDQo+ ID4gK3sNCj4gPiArICBFRklfU1RBVFVTICAgICAgICAgICAgICAgICAgU3RhdHVzOw0KPiA+ICsg IFVOSVRfVEVTVF9GUkFNRVdPUktfSEFORExFICBGcmFtZXdvcms7DQo+ID4gKyAgVU5JVF9URVNU X1NVSVRFX0hBTkRMRSAgICAgIFNoaW1UZXN0czsNCj4gPiArDQo+ID4gKyAgRnJhbWV3b3JrID0g TlVMTDsNCj4gPiArDQo+ID4gKyAgREVCVUcgKChERUJVR19JTkZPLCAiJWEgdiVhXG4iLCBVTklU X1RFU1RfTkFNRSwNCj4gPiBVTklUX1RFU1RfVkVSU0lPTikpOw0KPiA+ICsNCj4gPiArICAvLw0K PiA+ICsgIC8vIFN0YXJ0IHNldHRpbmcgdXAgdGhlIHRlc3QgZnJhbWV3b3JrIGZvciBydW5uaW5n IHRoZSB0ZXN0cy4NCj4gPiArICAvLw0KPiA+ICsgIFN0YXR1cyA9IEluaXRVbml0VGVzdEZyYW1l d29yayAoJkZyYW1ld29yaywgVU5JVF9URVNUX05BTUUsDQo+ID4gKyBnRWZpQ2FsbGVyQmFzZU5h bWUsIFVOSVRfVEVTVF9WRVJTSU9OKTsgIGlmIChFRklfRVJST1IgKFN0YXR1cykpIHsNCj4gPiAr ICAgIERFQlVHICgoREVCVUdfRVJST1IsICJGYWlsZWQgaW4gSW5pdFVuaXRUZXN0RnJhbWV3b3Jr LiBTdGF0dXMNCj4gPiA9ICVyXG4iLCBTdGF0dXMpKTsNCj4gPiArICAgIGdvdG8gRVhJVDsNCj4g PiArICB9DQo+ID4gKw0KPiA+ICsgIC8vDQo+ID4gKyAgLy8gQWRkIGFsbCB0ZXN0IHN1aXRlcyBh bmQgdGVzdHMuDQo+ID4gKyAgLy8NCj4gPiArICBTdGF0dXMgPSBDcmVhdGVVbml0VGVzdFN1aXRl ICgNCj4gPiArICAgICAgICAgICAgICZTaGltVGVzdHMsIEZyYW1ld29yaywNCj4gPiArICAgICAg ICAgICAgICJWYXJpYWJsZSBMb2NrIFNoaW0gVGVzdHMiLCAiVmFyUG9saWN5LlZhckxvY2tTaGlt IiwgTlVMTCwNCj4gTlVMTA0KPiA+ICsgICAgICAgICAgICAgKTsNCj4gPiArICBpZiAoRUZJX0VS Uk9SIChTdGF0dXMpKSB7DQo+ID4gKyAgICBERUJVRyAoKERFQlVHX0VSUk9SLCAiRmFpbGVkIGlu IENyZWF0ZVVuaXRUZXN0U3VpdGUgZm9yDQo+ID4gU2hpbVRlc3RzXG4iKSk7DQo+ID4gKyAgICBT dGF0dXMgPSBFRklfT1VUX09GX1JFU09VUkNFUzsNCj4gPiArICAgIGdvdG8gRVhJVDsNCj4gPiAr ICB9DQo+ID4gKyAgQWRkVGVzdENhc2UgKA0KPiA+ICsgICAgU2hpbVRlc3RzLA0KPiA+ICsgICAg IkxvY2tpbmcgYSB2YXJpYWJsZSB3aXRoIG5vIG1hdGNoaW5nIHBvbGljaWVzIHNob3VsZCBhbHdh eXMgd29yayIsDQo+ID4gIkVtcHR5UG9saWNpZXMiLA0KPiA+ICsgICAgTG9ja2luZ1dpdGhvdXRB bnlQb2xpY2llc1Nob3VsZFN1Y2NlZWQsIExpYkluaXRNb2NrZWQsDQo+IExpYkNsZWFudXAsDQo+ ID4gTlVMTA0KPiA+ICsgICAgKTsNCj4gPiArICBBZGRUZXN0Q2FzZSAoDQo+ID4gKyAgICBTaGlt VGVzdHMsDQo+ID4gKyAgICAiTG9ja2luZyBhIHZhcmlhYmxlIHR3aWNlIHNob3VsZCBhbHdheXMg d29yayIsICJEb3VibGVMb2NrIiwNCj4gPiArICAgIExvY2tpbmdUd2ljZVNob3VsZFN1Y2NlZWQs IExpYkluaXRNb2NrZWQsIExpYkNsZWFudXAsIE5VTEwNCj4gPiArICAgICk7DQo+ID4gKyAgQWRk VGVzdENhc2UgKA0KPiA+ICsgICAgU2hpbVRlc3RzLA0KPiA+ICsgICAgIkxvY2tpbmcgYSB2YXJp YWJsZSB0aGF0J3MgYWxyZWFkeSBsb2NrZWQgYnkgYW5vdGhlciBwb2xpY3kgc2hvdWxkDQo+IHdv cmsiLA0KPiA+ICJMb2NrQWZ0ZXJQb2xpY3kiLA0KPiA+ICsgICAgTG9ja2luZ0FMb2NrZWRWYXJp YWJsZVNob3VsZFN1Y2NlZWQsIExpYkluaXRNb2NrZWQsIExpYkNsZWFudXAsDQo+IE5VTEwNCj4g PiArICAgICk7DQo+ID4gKyAgQWRkVGVzdENhc2UgKA0KPiA+ICsgICAgU2hpbVRlc3RzLA0KPiA+ ICsgICAgIkxvY2tpbmcgYSB2YXJpYWJsZSB0aGF0IGFscmVhZHkgaGFzIGFuIHVubG9ja2VkIHBv bGljeSBzaG91bGQNCmZhaWwiLA0KPiA+ICJMb2NrQWZ0ZXJVbmxvY2tlZFBvbGljeSIsDQo+ID4g KyAgICBMb2NraW5nQW5VbmxvY2tlZFZhcmlhYmxlU2hvdWxkRmFpbCwgTGliSW5pdE1vY2tlZCwg TGliQ2xlYW51cCwNCj4gTlVMTA0KPiA+ICsgICAgKTsNCj4gPiArICBBZGRUZXN0Q2FzZSAoDQo+ ID4gKyAgICBTaGltVGVzdHMsDQo+ID4gKyAgICAiQWRkaW5nIGEgcG9saWN5IGZvciBhIHZhcmlh YmxlIHRoYXQgaGFzIHByZXZpb3VzbHkgYmVlbiBsb2NrZWQNCnNob3VsZA0KPiA+IGFsd2F5cyBm YWlsIiwgIlNldFBvbGljeUFmdGVyTG9jayIsDQo+ID4gKyAgICBTZXR0aW5nUG9saWN5Rm9yQUxv Y2tlZFZhcmlhYmxlU2hvdWxkRmFpbCwgTGliSW5pdE1vY2tlZCwNCj4gTGliQ2xlYW51cCwNCj4g PiBOVUxMDQo+ID4gKyAgICApOw0KPiA+ICsNCj4gPiArICAvLw0KPiA+ICsgIC8vIEV4ZWN1dGUg dGhlIHRlc3RzLg0KPiA+ICsgIC8vDQo+ID4gKyAgU3RhdHVzID0gUnVuQWxsVGVzdFN1aXRlcyAo RnJhbWV3b3JrKTsNCj4gPiArDQo+ID4gK0VYSVQ6DQo+ID4gKyAgaWYgKEZyYW1ld29yayAhPSBO VUxMKSB7DQo+ID4gKyAgICBGcmVlVW5pdFRlc3RGcmFtZXdvcmsgKEZyYW1ld29yayk7DQo+ID4g KyAgfQ0KPiA+ICsNCj4gPiArICByZXR1cm47DQo+ID4gK30NCj4gPiArDQo+ID4gKy8vLw0KPiA+ ICsvLy8gQXZvaWQgRUNDIGVycm9yIGZvciBmdW5jdGlvbiBuYW1lIHRoYXQgc3RhcnRzIHdpdGgg bG93ZXIgY2FzZQ0KPiA+ICtsZXR0ZXIgLy8vICNkZWZpbmUgTWFpbiBtYWluDQo+ID4gKw0KPiA+ ICsvKioNCj4gPiArICBTdGFuZGFyZCBQT1NJWCBDIGVudHJ5IHBvaW50IGZvciBob3N0IGJhc2Vk IHVuaXQgdGVzdCBleGVjdXRpb24uDQo+ID4gKw0KPiA+ICsgIEBwYXJhbVtpbl0gQXJnYyAgTnVt YmVyIG9mIGFyZ3VtZW50cw0KPiA+ICsgIEBwYXJhbVtpbl0gQXJndiAgQXJyYXkgb2YgcG9pbnRl cnMgdG8gYXJndW1lbnRzDQo+ID4gKw0KPiA+ICsgIEByZXR2YWwgMCAgICAgIFN1Y2Nlc3MNCj4g PiArICBAcmV0dmFsIG90aGVyICBFcnJvcg0KPiA+ICsqKi8NCj4gPiArSU5UMzINCj4gPiArTWFp biAoDQo+ID4gKyAgSU4gSU5UMzIgIEFyZ2MsDQo+ID4gKyAgSU4gQ0hBUjggICpBcmd2W10NCj4g PiArICApDQo+ID4gK3sNCj4gPiArICBVbml0VGVzdE1haW4gKCk7DQo+ID4gKyAgcmV0dXJuIDA7 DQo+ID4gK30NCj4gPiBkaWZmIC0tZ2l0DQo+ID4gYS9NZGVNb2R1bGVQa2cvVW5pdmVyc2FsL1Zh cmlhYmxlL1J1bnRpbWVEeGUvUnVudGltZUR4ZVVuaXRUZXN0L1ZhDQo+ID4gcmlhYmxlTG9ja1Jl cXVlc3RUb0xvY2tVbml0VGVzdC5pbmYNCj4gPiBiL01kZU1vZHVsZVBrZy9Vbml2ZXJzYWwvVmFy aWFibGUvUnVudGltZUR4ZS9SdW50aW1lRHhlVW5pdFRlc3QvVmENCj4gPiByaWFibGVMb2NrUmVx dWVzdFRvTG9ja1VuaXRUZXN0LmluZg0KPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ID4gaW5k ZXggMDAwMDAwMDAwMDAwLi4yYTY1OWQ3ZTEzNzANCj4gPiAtLS0gL2Rldi9udWxsDQo+ID4gKysr DQo+ID4gYi9NZGVNb2R1bGVQa2cvVW5pdmVyc2FsL1ZhcmlhYmxlL1J1bnRpbWVEeGUvUnVudGlt ZUR4ZVVuaXRUZXN0L1ZhDQo+ID4gcmkNCj4gPiArKysgYWJsZUxvY2tSZXF1ZXN0VG9Mb2NrVW5p dFRlc3QuaW5mDQo+ID4gQEAgLTAsMCArMSwzNiBAQA0KPiA+ICsjIyBAZmlsZQ0KPiA+ICsjIFRo aXMgaXMgYSBob3N0LWJhc2VkIHVuaXQgdGVzdCBmb3IgdGhlIFZhcmlhYmxlTG9ja1JlcXVlc3RU b0xvY2sNCnNoaW0uDQo+ID4gKyMNCj4gPiArIyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jw b3JhdGlvbi4NCj4gPiArIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTItQ2xhdXNlLVBh dGVudCAjIw0KPiA+ICsNCj4gPiArW0RlZmluZXNdDQo+ID4gKyAgSU5GX1ZFUlNJT04gICAgICAg ICA9IDB4MDAwMTAwMTcNCj4gPiArICBCQVNFX05BTUUgICAgICAgICAgID0gVmFyaWFibGVMb2Nr UmVxdWVzdFRvTG9ja1VuaXRUZXN0DQo+ID4gKyAgRklMRV9HVUlEICAgICAgICAgICA9IEE3Mzg4 QjZDLTcyNzQtNDcxNy05NjQ5LUJEQzVERkQxRkNCRQ0KPiA+ICsgIFZFUlNJT05fU1RSSU5HICAg ICAgPSAxLjANCj4gPiArICBNT0RVTEVfVFlQRSAgICAgICAgID0gSE9TVF9BUFBMSUNBVElPTg0K PiA+ICsNCj4gPiArIw0KPiA+ICsjIFRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaXMgZm9yIHJl ZmVyZW5jZSBvbmx5IGFuZCBub3QgcmVxdWlyZWQgYnkNCnRoZQ0KPiA+IGJ1aWxkIHRvb2xzLg0K PiA+ICsjDQo+ID4gKyMgIFZBTElEX0FSQ0hJVEVDVFVSRVMgICAgICAgICAgID0gSUEzMiBYNjQg QVJNIEFBUkNINjQNCj4gPiArIw0KPiA+ICsNCj4gPiArW1NvdXJjZXNdDQo+ID4gKyAgVmFyaWFi bGVMb2NrUmVxdWVzdFRvTG9ja1VuaXRUZXN0LmMNCj4gPiArICAuLi9WYXJpYWJsZUxvY2tSZXF1 ZXN0VG9Mb2NrLmMNCj4gPiArDQo+ID4gK1tQYWNrYWdlc10NCj4gPiArICBNZGVQa2cvTWRlUGtn LmRlYw0KPiA+ICsgIE1kZU1vZHVsZVBrZy9NZGVNb2R1bGVQa2cuZGVjDQo+ID4gKyAgVW5pdFRl c3RGcmFtZXdvcmtQa2cvVW5pdFRlc3RGcmFtZXdvcmtQa2cuZGVjDQo+ID4gKw0KPiA+ICtbTGli cmFyeUNsYXNzZXNdDQo+ID4gKyAgVW5pdFRlc3RMaWINCj4gPiArICBEZWJ1Z0xpYg0KPiA+ICsg IFZhcmlhYmxlUG9saWN5TGliDQo+ID4gKyAgVmFyaWFibGVQb2xpY3lIZWxwZXJMaWINCj4gPiAr ICBCYXNlTWVtb3J5TGliDQo+ID4gKyAgTWVtb3J5QWxsb2NhdGlvbkxpYg0KPiA+IGRpZmYgLS1n aXQNCj4gPiBhL01kZU1vZHVsZVBrZy9Vbml2ZXJzYWwvVmFyaWFibGUvUnVudGltZUR4ZS9WYXJp YWJsZUxvY2tSZXF1ZXN0VG9MDQo+ID4gb2NrLmMNCj4gPiBiL01kZU1vZHVsZVBrZy9Vbml2ZXJz YWwvVmFyaWFibGUvUnVudGltZUR4ZS9WYXJpYWJsZUxvY2tSZXF1ZXN0VG9MDQo+ID4gb2NrLmMN Cj4gPiBpbmRleCA0YWE4NTRhYWYyNjAuLjE5MWRlNmI5MDdjNSAxMDA2NDQNCj4gPiAtLS0NCj4g PiBhL01kZU1vZHVsZVBrZy9Vbml2ZXJzYWwvVmFyaWFibGUvUnVudGltZUR4ZS9WYXJpYWJsZUxv Y2tSZXF1ZXN0VG9MDQo+ID4gb2NrLmMNCj4gPiArKysNCj4gPiBiL01kZU1vZHVsZVBrZy9Vbml2 ZXJzYWwvVmFyaWFibGUvUnVudGltZUR4ZS9WYXJpYWJsZUxvY2tSZXF1ZXN0VG9MDQo+ID4gbw0K PiA+ICsrKyBjay5jDQo+ID4gQEAgLTEsNjcgKzEsMzYwIEBADQo+ID4gLS8qKiBAZmlsZSAtLSBW YXJpYWJsZUxvY2tSZXF1ZXN0VG9Mb2NrLmMgLVRlbXBvcmFyeSBsb2NhdGlvbiBvZiB0aGUNCj4g PiBSZXF1ZXN0VG9Mb2NrIHNoaW0gY29kZSB3aGlsZSAtcHJvamVjdHMgYXJlIG1vdmVkIHRvIFZh cmlhYmxlUG9saWN5Lg0KPiA+IFNob3VsZCBiZSByZW1vdmVkIHdoZW4gZGVwcmVjYXRlZC4NCj4g PiArLyoqIEBmaWxlDQo+ID4gKyAgVGVtcG9yYXJ5IGxvY2F0aW9uIG9mIHRoZSBSZXF1ZXN0VG9M b2NrIHNoaW0gY29kZSB3aGlsZSBwcm9qZWN0cw0KPiA+ICsgIGFyZSBtb3ZlZCB0byBWYXJpYWJs ZVBvbGljeS4gU2hvdWxkIGJlIHJlbW92ZWQgd2hlbiBkZXByZWNhdGVkLg0KPiA+DQo+ID4gLUNv cHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KPiA+IC1TUERYLUxpY2Vuc2UtSWRl bnRpZmllcjogQlNELTItQ2xhdXNlLVBhdGVudA0KPiA+ICsgIENvcHlyaWdodCAoYykgTWljcm9z b2Z0IENvcnBvcmF0aW9uLg0KPiA+ICsgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMi1D bGF1c2UtUGF0ZW50DQo+ID4NCj4gPiAgKiovDQo+ID4NCj4gPiAgI2luY2x1ZGUgPFVlZmkuaD4N Cj4gPiAtDQo+ID4gICNpbmNsdWRlIDxMaWJyYXJ5L0RlYnVnTGliLmg+DQo+ID4gKyNpbmNsdWRl IDxMaWJyYXJ5L0Jhc2VNZW1vcnlMaWIuaD4NCj4gPiAgI2luY2x1ZGUgPExpYnJhcnkvTWVtb3J5 QWxsb2NhdGlvbkxpYi5oPg0KPiA+IC0NCj4gPiAtI2luY2x1ZGUgPFByb3RvY29sL1ZhcmlhYmxl TG9jay5oPg0KPiA+IC0NCj4gPiAtI2luY2x1ZGUgPFByb3RvY29sL1ZhcmlhYmxlUG9saWN5Lmg+ DQo+ID4gICNpbmNsdWRlIDxMaWJyYXJ5L1ZhcmlhYmxlUG9saWN5TGliLmg+DQo+ID4gICNpbmNs dWRlIDxMaWJyYXJ5L1ZhcmlhYmxlUG9saWN5SGVscGVyTGliLmg+DQo+ID4gKyNpbmNsdWRlIDxQ cm90b2NvbC9WYXJpYWJsZUxvY2suaD4NCj4gPg0KPiA+ICsvLw0KPiA+ICsvLyBOT1RFOiBETyBO T1QgVVNFIFRIRVNFIE1BQ1JPUyBvbiBhbnkgc3RydWN0dXJlIHRoYXQgaGFzIG5vdCBiZWVuDQo+ ID4gdmFsaWRhdGVkLg0KPiA+ICsvLyAgICAgICBDdXJyZW50IHRhYmxlIGRhdGEgaGFzIGFscmVh ZHkgYmVlbiBzYW5pdGl6ZWQuDQo+ID4gKy8vDQo+ID4gKyNkZWZpbmUgR0VUX05FWFRfUE9MSUNZ KEN1clBvbGljeSkNCj4gPiArKFZBUklBQkxFX1BPTElDWV9FTlRSWSopKChVSU5UOCopQ3VyUG9s aWN5ICsgQ3VyUG9saWN5LT5TaXplKSAjZGVmaW5lDQo+ID4gK0dFVF9QT0xJQ1lfTkFNRShDdXJQ b2xpY3kpICAoQ0hBUjE2KikoKFVJTlROKUN1clBvbGljeSArDQo+ID4gK0N1clBvbGljeS0+T2Zm c2V0VG9OYW1lKQ0KPiA+ICsNCj4gPiArI2RlZmluZSBNQVRDSF9QUklPUklUWV9FWEFDVCAgMA0K PiA+ICsjZGVmaW5lIE1BVENIX1BSSU9SSVRZX01JTiAgICBNQVhfVUlOVDgNCj4gPiArDQo+ID4g Ky8qKg0KPiA+ICsgIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGV2YWx1YXRlcyBhIHBvbGljeSBhbmQg ZGV0ZXJtaW5lcyB3aGV0aGVyIGl0DQo+ID4gK21hdGNoZXMgdGhlDQo+ID4gKyAgdGFyZ2V0IHZh cmlhYmxlLiBJZiBtYXRjaGVkLCB3aWxsIGFsc28gcmV0dXJuIGEgdmFsdWUgY29ycmVzcG9uZGlu Zw0KPiA+ICt0byB0aGUNCj4gPiArICBwcmlvcml0eSBvZiB0aGUgbWF0Y2guDQo+ID4gKw0KPiA+ ICsgIFRoZSBydWxlcyBmb3IgImJlc3QgbWF0Y2giIGFyZSBsaXN0ZWQgaW4gdGhlIFZhcmlhYmxl IFBvbGljeSBTcGVjLg0KPiA+ICsgIFBlcmZlY3QgbmFtZSBtYXRjaGVzIHdpbGwgcmV0dXJuIDAu DQo+ID4gKyAgU2luZ2xlIHdpbGRjYXJkIGNoYXJhY3RlcnMgd2lsbCByZXR1cm4gdGhlIG51bWJl ciBvZiB3aWxkY2FyZA0KPiBjaGFyYWN0ZXJzLg0KPiA+ICsgIEZ1bGwgbmFtZXNwYWNlcyB3aWxs IHJldHVybiBNQVhfVUlOVDguDQo+ID4gKw0KPiA+ICsgIEBwYXJhbVtpbl0gIEV2YWxFbnRyeSAg ICAgIFBvaW50ZXIgdG8gdGhlIHBvbGljeSBlbnRyeSBiZWluZw0KPiBldmFsdWF0ZWQuDQo+ID4g KyAgQHBhcmFtW2luXSAgVmFyaWFibGVOYW1lICAgU2FtZSBhcyBFRklfU0VUX1ZBUklBQkxFLg0K PiA+ICsgIEBwYXJhbVtpbl0gIFZlbmRvckd1aWQgICAgIFNhbWUgYXMgRUZJX1NFVF9WQVJJQUJM RS4NCj4gPiArICBAcGFyYW1bb3V0XSBNYXRjaFByaW9yaXR5ICBbT3B0aW9uYWxdIE9uIGZpbmRp bmcgYSBtYXRjaCwgdGhpcyB2YWx1ZQ0KPiA+IGNvbnRhaW5zDQo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgdGhlIHByaW9yaXR5IG9mIHRoZSBtYXRjaC4gTG93ZXINCj4gbnVtYmVy ID09IGhpZ2hlcg0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LiBP bmx5IHZhbGlkIGlmIGEgbWF0Y2ggZm91bmQuDQo+ID4gKw0KPiA+ICsgIEByZXR2YWwgIFRSVUUg ICBDdXJyZW50IGVudHJ5IG1hdGNoZXMgdGhlIHRhcmdldCB2YXJpYWJsZS4NCj4gPiArICBAcmV0 dmFsICBGQUxTRSAgQ3VycmVudCBlbnRyeSBkb2VzIG5vdCBtYXRjaCBhdCBhbGwuDQo+ID4gKw0K PiA+ICsqKi8NCj4gPiArU1RBVElDDQo+ID4gK0JPT0xFQU4NCj4gPiArRXZhbHVhdGVQb2xpY3lN YXRjaCAoDQo+ID4gKyAgSU4gQ09OU1QgVkFSSUFCTEVfUE9MSUNZX0VOVFJZICAqRXZhbEVudHJ5 LA0KPiA+ICsgIElOIENPTlNUIENIQVIxNiAgICAgICAgICAgICAgICAgKlZhcmlhYmxlTmFtZSwN Cj4gPiArICBJTiBDT05TVCBFRklfR1VJRCAgICAgICAgICAgICAgICpWZW5kb3JHdWlkLA0KPiA+ ICsgIE9VVCBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgKk1hdGNoUHJpb3JpdHkgIE9QVElP TkFMDQo+ID4gKyAgKQ0KPiA+ICt7DQo+ID4gKyAgQk9PTEVBTiAgUmVzdWx0Ow0KPiA+ICsgIENI QVIxNiAgICpQb2xpY3lOYW1lOw0KPiA+ICsgIFVJTlQ4ICAgIENhbGN1bGF0ZWRQcmlvcml0eTsN Cj4gPiArICBVSU5UTiAgICBJbmRleDsNCj4gPiArDQo+ID4gKyAgUmVzdWx0ID0gRkFMU0U7DQo+ ID4gKyAgQ2FsY3VsYXRlZFByaW9yaXR5ID0gTUFUQ0hfUFJJT1JJVFlfRVhBQ1Q7DQo+ID4gKw0K PiA+ICsgIC8vDQo+ID4gKyAgLy8gU3RlcCAxOiBJZiB0aGUgR1VJRCBkb2Vzbid0IG1hdGNoLCB3 ZSdyZSBkb25lLiBObyBuZWVkIHRvIGV2YWx1YXRlDQo+ID4gYW55dGhpbmcgZWxzZS4NCj4gPiAr ICAvLw0KPiA+ICsgIGlmICghQ29tcGFyZUd1aWQgKCZFdmFsRW50cnktPk5hbWVzcGFjZSwgVmVu ZG9yR3VpZCkpIHsNCj4gPiArICAgIGdvdG8gRXhpdDsNCj4gPiArICB9DQo+ID4gKw0KPiA+ICsg IC8vDQo+ID4gKyAgLy8gSWYgdGhlIEdVSUQgbWF0Y2hlcywgY2hlY2sgdG8gc2VlIHdoZXRoZXIg dGhlcmUgaXMgYSBOYW1lDQo+ID4gKyBhc3NvY2lhdGVkICAvLyB3aXRoIHRoZSBwb2xpY3kuIElm IG5vdCwgdGhpcyBwb2xpY3kgbWF0Y2hlcyB0aGUgZW50aXJlDQo+ID4gbmFtZXNwYWNlLg0KPiA+ ICsgIC8vIE1pc3NpbmcgTmFtZSBpcyBpbmRpY2F0ZWQgYnkgc2l6ZSBiZWluZyBlcXVhbCB0byBu YW1lLg0KPiA+ICsgIC8vDQo+ID4gKyAgaWYgKEV2YWxFbnRyeS0+U2l6ZSA9PSBFdmFsRW50cnkt Pk9mZnNldFRvTmFtZSkgew0KPiA+ICsgICAgQ2FsY3VsYXRlZFByaW9yaXR5ID0gTUFUQ0hfUFJJ T1JJVFlfTUlOOw0KPiA+ICsgICAgUmVzdWx0ID0gVFJVRTsNCj4gPiArICAgIGdvdG8gRXhpdDsN Cj4gPiArICB9DQo+ID4gKw0KPiA+ICsgIC8vDQo+ID4gKyAgLy8gTm93IHRoYXQgd2Uga25vdyB0 aGUgbmFtZSBleGlzdHMsIGdldCBpdC4NCj4gPiArICAvLw0KPiA+ICsgIFBvbGljeU5hbWUgPSBH RVRfUE9MSUNZX05BTUUgKEV2YWxFbnRyeSk7DQo+ID4gKw0KPiA+ICsgIC8vDQo+ID4gKyAgLy8g RXZhbHVhdGUgdGhlIG5hbWUgYWdhaW5zdCB0aGUgcG9saWN5IG5hbWUgYW5kIGNoZWNrIGZvciBh IG1hdGNoLg0KPiA+ICsgIC8vIEFjY291bnQgZm9yIGFueSB3aWxkY2FyZHMuDQo+ID4gKyAgLy8N Cj4gPiArICBJbmRleCA9IDA7DQo+ID4gKyAgUmVzdWx0ID0gVFJVRTsNCj4gPiArICAvLw0KPiA+ ICsgIC8vIEtlZXAgZ29pbmcgdW50aWwgdGhlIGVuZCBvZiBib3RoIHN0cmluZ3MuDQo+ID4gKyAg Ly8NCj4gPiArICB3aGlsZSAoUG9saWN5TmFtZVtJbmRleF0gIT0gQ0hBUl9OVUxMIHx8IFZhcmlh YmxlTmFtZVtJbmRleF0gIT0NCj4gPiBDSEFSX05VTEwpIHsNCj4gPiArICAgIC8vDQo+ID4gKyAg ICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgbWF0Y2guLi4NCj4gPiArICAgIC8vDQo+ID4gKyAgICBp ZiAoUG9saWN5TmFtZVtJbmRleF0gIT0gVmFyaWFibGVOYW1lW0luZGV4XSB8fCBQb2xpY3lOYW1l W0luZGV4XQ0KPiA9PQ0KPiA+ICcjJykgew0KPiA+ICsgICAgICAvLw0KPiA+ICsgICAgICAvLyBJ ZiB0aGlzIGlzIGEgbnVtZXJpY2FsIHdpbGRjYXJkLCB3ZSBjYW4gY29uc2lkZXIgaXQgYSBtYXRj aCBpZg0Kd2UNCj4gYWx0ZXINCj4gPiArICAgICAgLy8gdGhlIHByaW9yaXR5Lg0KPiA+ICsgICAg ICAvLw0KPiA+ICsgICAgICBpZiAoUG9saWN5TmFtZVtJbmRleF0gPT0gTCcjJyAmJg0KPiA+ICsg ICAgICAgICAgICAoKEwnMCcgPD0gVmFyaWFibGVOYW1lW0luZGV4XSAmJiBWYXJpYWJsZU5hbWVb SW5kZXhdIDw9DQo+IEwnOScpIHx8DQo+ID4gKyAgICAgICAgICAgICAoTCdBJyA8PSBWYXJpYWJs ZU5hbWVbSW5kZXhdICYmIFZhcmlhYmxlTmFtZVtJbmRleF0gPD0NCj4gTCdGJykgfHwNCj4gPiAr ICAgICAgICAgICAgIChMJ2EnIDw9IFZhcmlhYmxlTmFtZVtJbmRleF0gJiYgVmFyaWFibGVOYW1l W0luZGV4XSA8PQ0KPiBMJ2YnKSkpIHsNCj4gPiArICAgICAgICBpZiAoQ2FsY3VsYXRlZFByaW9y aXR5IDwgTUFUQ0hfUFJJT1JJVFlfTUlOKSB7DQo+ID4gKyAgICAgICAgICBDYWxjdWxhdGVkUHJp b3JpdHkrKzsNCj4gPiArICAgICAgICB9DQo+ID4gKyAgICAgIC8vDQo+ID4gKyAgICAgIC8vIE90 aGVyd2lzZSwgbm90IGEgbWF0Y2guDQo+ID4gKyAgICAgIC8vDQo+ID4gKyAgICAgIH0gZWxzZSB7 DQo+ID4gKyAgICAgICAgUmVzdWx0ID0gRkFMU0U7DQo+ID4gKyAgICAgICAgZ290byBFeGl0Ow0K PiA+ICsgICAgICB9DQo+ID4gKyAgICB9DQo+ID4gKyAgICBJbmRleCsrOw0KPiA+ICsgIH0NCj4g PiArDQo+ID4gK0V4aXQ6DQo+ID4gKyAgaWYgKFJlc3VsdCAmJiBNYXRjaFByaW9yaXR5ICE9IE5V TEwpIHsNCj4gPiArICAgICpNYXRjaFByaW9yaXR5ID0gQ2FsY3VsYXRlZFByaW9yaXR5Ow0KPiA+ ICsgIH0NCj4gPiArICByZXR1cm4gUmVzdWx0Ow0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKioNCj4g PiArICBUaGlzIGhlbHBlciBmdW5jdGlvbiB3YWxrcyB0aGUgY3VycmVudCBwb2xpY3kgdGFibGUg YW5kIHJldHVybnMgYQ0KPiA+ICtwb2ludGVyDQo+ID4gKyAgdG8gdGhlIGJlc3QgbWF0Y2gsIGlm IGFueSBhcmUgZm91bmQuIExldmVyYWdlcyBFdmFsdWF0ZVBvbGljeU1hdGNoKCkNCj4gPiArdG8N Cj4gPiArICBkZXRlcm1pbmUgImJlc3QiLg0KPiA+ICsNCj4gPiArICBAcGFyYW1baW5dICBQb2xp Y3lUYWJsZSAgICAgIFBvaW50ZXIgdG8gY3VycmVudCBwb2xpY3kgdGFibGUuDQo+ID4gKyAgQHBh cmFtW2luXSAgUG9saWN5VGFibGVTaXplICBTaXplIG9mIGN1cnJlbnQgcG9saWN5IHRhYmxlLg0K PiA+ICsgIEBwYXJhbVtpbl0gIFZhcmlhYmxlTmFtZSAgICAgU2FtZSBhcyBFRklfU0VUX1ZBUklB QkxFLg0KPiA+ICsgIEBwYXJhbVtpbl0gIFZlbmRvckd1aWQgICAgICAgU2FtZSBhcyBFRklfU0VU X1ZBUklBQkxFLg0KPiA+ICsgIEBwYXJhbVtvdXRdIFJldHVyblByaW9yaXR5ICAgW09wdGlvbmFs XSBJZiBwb2ludGVyIGlzIHByb3ZpZGVkLA0KcmV0dXJuDQo+IHRoZQ0KPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgb2YgdGhlIG1hdGNoLiBTYW1lIGFzDQo+IEV2 YWx1YXRlUG9saWN5TWF0Y2goKS4NCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IE9ubHkgdmFsaWQgaWYgYSBtYXRjaCBpcyByZXR1cm5lZC4NCj4gPiArDQo+ID4gKyAgQHJldHZh bCAgICAgVkFSSUFCTEVfUE9MSUNZX0VOVFJZKiAgICBCZXN0IG1hdGNoIHRoYXQgd2FzDQo+IGZv dW5kLg0KPiA+ICsgIEByZXR2YWwgICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgTm8gbWF0 Y2ggd2FzIGZvdW5kLg0KPiA+ICsNCj4gPiArKiovDQo+ID4gK1NUQVRJQw0KPiA+ICtWQVJJQUJM RV9QT0xJQ1lfRU5UUlkqDQo+ID4gK0dldEJlc3RQb2xpY3lNYXRjaCAoDQo+ID4gKyAgSU4gVUlO VDggICAgICAgICAgICpQb2xpY3lUYWJsZSwNCj4gPiArICBJTiBVSU5UMzIgICAgICAgICAgUG9s aWN5VGFibGVTaXplLA0KPiA+ICsgIElOIENPTlNUIENIQVIxNiAgICAqVmFyaWFibGVOYW1lLA0K PiA+ICsgIElOIENPTlNUIEVGSV9HVUlEICAqVmVuZG9yR3VpZCwNCj4gPiArICBPVVQgVUlOVDgg ICAgICAgICAgKlJldHVyblByaW9yaXR5ICBPUFRJT05BTA0KPiA+ICsgICkNCj4gPiArew0KPiA+ ICsgIFZBUklBQkxFX1BPTElDWV9FTlRSWSAgKkJlc3RSZXN1bHQ7DQo+ID4gKyAgVkFSSUFCTEVf UE9MSUNZX0VOVFJZICAqQ3VycmVudEVudHJ5Ow0KPiA+ICsgIFVJTlQ4ICAgICAgICAgICAgICAg ICAgTWF0Y2hQcmlvcml0eTsNCj4gPiArICBVSU5UOCAgICAgICAgICAgICAgICAgIEN1cnJlbnRQ cmlvcml0eTsNCj4gPiArDQo+ID4gKyAgQmVzdFJlc3VsdCA9IE5VTEw7DQo+ID4gKyAgTWF0Y2hQ cmlvcml0eSA9IE1BVENIX1BSSU9SSVRZX0VYQUNUOw0KPiA+ICsNCj4gPiArICAvLw0KPiA+ICsg IC8vIFdhbGsgYWxsIGVudHJpZXMgaW4gdGhlIHRhYmxlLCBsb29raW5nIGZvciBtYXRjaGVzLg0K PiA+ICsgIC8vDQo+ID4gKyAgQ3VycmVudEVudHJ5ID0gKFZBUklBQkxFX1BPTElDWV9FTlRSWSop UG9saWN5VGFibGU7DQo+ID4gKyAgd2hpbGUgKChVSU5UTilDdXJyZW50RW50cnkgPCAoVUlOVE4p KChVSU5UOCopUG9saWN5VGFibGUgKw0KPiA+IFBvbGljeVRhYmxlU2l6ZSkpIHsNCj4gPiArICAg IC8vDQo+ID4gKyAgICAvLyBDaGVjayBmb3IgYSBtYXRjaC4NCj4gPiArICAgIC8vDQo+ID4gKyAg ICBpZiAoRXZhbHVhdGVQb2xpY3lNYXRjaCAoQ3VycmVudEVudHJ5LCBWYXJpYWJsZU5hbWUsIFZl bmRvckd1aWQsDQo+ID4gJkN1cnJlbnRQcmlvcml0eSkpIHsNCj4gPiArICAgICAgLy8NCj4gPiAr ICAgICAgLy8gSWYgbWF0Y2ggaXMgYmV0dGVyLCB0YWtlIGl0Lg0KPiA+ICsgICAgICAvLw0KPiA+ ICsgICAgICBpZiAoQmVzdFJlc3VsdCA9PSBOVUxMIHx8IEN1cnJlbnRQcmlvcml0eSA8IE1hdGNo UHJpb3JpdHkpIHsNCj4gPiArICAgICAgICBCZXN0UmVzdWx0ID0gQ3VycmVudEVudHJ5Ow0KPiA+ ICsgICAgICAgIE1hdGNoUHJpb3JpdHkgPSBDdXJyZW50UHJpb3JpdHk7DQo+ID4gKyAgICAgIH0N Cj4gPiArDQo+ID4gKyAgICAgIC8vDQo+ID4gKyAgICAgIC8vIElmIHlvdSd2ZSBoaXQgdGhlIGhp Z2hlc3QtcHJpb3JpdHkgbWF0Y2gsIGNhbiBleGl0IG5vdy4NCj4gPiArICAgICAgLy8NCj4gPiAr ICAgICAgaWYgKE1hdGNoUHJpb3JpdHkgPT0gMCkgew0KPiA+ICsgICAgICAgIGJyZWFrOw0KPiA+ ICsgICAgICB9DQo+ID4gKyAgICB9DQo+ID4gKw0KPiA+ICsgICAgLy8NCj4gPiArICAgIC8vIElm IHdlJ3JlIHN0aWxsIGluIHRoZSBsb29wLCBtb3ZlIHRvIHRoZSBuZXh0IGVudHJ5Lg0KPiA+ICsg ICAgLy8NCj4gPiArICAgIEN1cnJlbnRFbnRyeSA9IEdFVF9ORVhUX1BPTElDWSAoQ3VycmVudEVu dHJ5KTsgIH0NCj4gPiArDQo+ID4gKyAgLy8NCj4gPiArICAvLyBJZiBhIHJldHVybiBwcmlvcml0 eSB3YXMgcmVxdWVzdGVkLCByZXR1cm4gaXQuDQo+ID4gKyAgLy8NCj4gPiArICBpZiAoUmV0dXJu UHJpb3JpdHkgIT0gTlVMTCkgew0KPiA+ICsgICAgKlJldHVyblByaW9yaXR5ID0gTWF0Y2hQcmlv cml0eTsNCj4gPiArICB9DQo+ID4gKw0KPiA+ICsgIHJldHVybiBCZXN0UmVzdWx0Ow0KPiA+ICt9 DQo+ID4gKw0KPiA+ICsvKioNCj4gPiArICBUaGlzIGhlbHBlciBmdW5jdGlvbiB3aWxsIGR1bXAg YW5kIHdhbGsgdGhlIGN1cnJlbnQgcG9saWN5IHRhYmxlcyB0bw0KPiA+ICtkZXRlcm1pbmUNCj4g PiArICB3aGV0aGVyIGEgbWF0Y2hpbmcgcG9saWN5IGFscmVhZHkgZXhpc3RzIHRoYXQgc2F0aXNm aWVzIHRoZSBsb2NrDQpyZXF1ZXN0Lg0KPiA+ICsNCj4gPiArICBAcGFyYW1baW5dIFZhcmlhYmxl TmFtZSAgQSBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSBuYW1lIHRoYXQgaXMNCj4gYmVpbmcNCj4g PiBzZWFyY2hlZC4NCj4gPiArICBAcGFyYW1baW5dIFZlbmRvckd1aWQgICAgQSBwb2ludGVyIHRv IHRoZSB2ZW5kb3IgR1VJRCB0aGF0IGlzIGJlaW5nDQo+ID4gc2VhcmNoZWQuDQo+ID4gKw0KPiA+ ICsgIEByZXR2YWwgIFRSVUUgICBXZSBjYW4gc2FmZWx5IGFzc3VtZSB0aGlzIHZhcmlhYmxlIGlz IGxvY2tlZC4NCj4gPiArICBAcmV0dmFsICBGQUxTRSAgQW4gZXJyb3IgaGFzIG9jY3VycmVkIG9y IHdlIGNhbm5vdCBwcm92ZSB0aGF0IHRoZQ0KPiB2YXJpYWJsZQ0KPiA+IGlzDQo+ID4gKyAgICAg ICAgICAgICAgICAgIGxvY2tlZC4NCj4gPiArDQo+ID4gKyoqLw0KPiA+ICtTVEFUSUMNCj4gPiAr Qk9PTEVBTg0KPiA+ICtJc1ZhcmlhYmxlQWxyZWFkeUxvY2tlZCAoDQo+ID4gKyAgSU4gQ0hBUjE2 ICAgICpWYXJpYWJsZU5hbWUsDQo+ID4gKyAgSU4gRUZJX0dVSUQgICpWZW5kb3JHdWlkDQo+ID4g KyAgKQ0KPiA+ICt7DQo+ID4gKyAgRUZJX1NUQVRVUyAgICAgICAgICAgICBTdGF0dXM7DQo+ID4g KyAgVUlOVDggICAgICAgICAgICAgICAgICAqUG9saWN5VGFibGU7DQo+ID4gKyAgVUlOVDMyICAg ICAgICAgICAgICAgICBQb2xpY3lUYWJsZVNpemU7DQo+ID4gKyAgQk9PTEVBTiAgICAgICAgICAg ICAgICBSZXN1bHQ7DQo+ID4gKyAgVkFSSUFCTEVfUE9MSUNZX0VOVFJZICAqTWF0Y2hQb2xpY3k7 DQo+ID4gKyAgVUlOVDggICAgICAgICAgICAgICAgICBNYXRjaFByaW9yaXR5Ow0KPiA+ICsNCj4g PiArICBSZXN1bHQgPSBUUlVFOw0KPiA+ICsNCj4gPiArICAvLw0KPiA+ICsgIC8vIEZpcnN0LCB3 ZSBuZWVkIHRvIGR1bXAgdGhlIGV4aXN0aW5nIHBvbGljeSB0YWJsZS4NCj4gPiArICAvLw0KPiA+ ICsgIFBvbGljeVRhYmxlU2l6ZSA9IDA7DQo+ID4gKyAgUG9saWN5VGFibGUgPSBOVUxMOw0KPiA+ ICsgIFN0YXR1cyA9IER1bXBWYXJpYWJsZVBvbGljeSAoUG9saWN5VGFibGUsICZQb2xpY3lUYWJs ZVNpemUpOyAgaWYNCj4gPiArIChTdGF0dXMgIT0gRUZJX0JVRkZFUl9UT09fU01BTEwpIHsNCj4g PiArICAgIERFQlVHICgoREVCVUdfRVJST1IsICIlYSAtIEZhaWxlZCB0byBkZXRlcm1pbmUgcG9s aWN5IHRhYmxlDQo+ID4gc2l6ZSEgJXJcbiIsIF9fRlVOQ1RJT05fXywgU3RhdHVzKSk7DQo+ID4g KyAgICByZXR1cm4gRkFMU0U7DQo+ID4gKyAgfQ0KPiA+ICsgIFBvbGljeVRhYmxlID0gQWxsb2Nh dGVaZXJvUG9vbCAoUG9saWN5VGFibGVTaXplKTsgIGlmIChQb2xpY3lUYWJsZSA9PQ0KPiA+ICsg TlVMTCkgew0KPiA+ICsgICAgREVCVUcgKChERUJVR19FUlJPUiwgIiVhIC0gRmFpbGVkIHRvIGFs bG9jYXRlZCBzcGFjZSBmb3IgcG9saWN5DQo+IHRhYmxlIQ0KPiA+IDB4JVhcbiIsIF9fRlVOQ1RJ T05fXywgUG9saWN5VGFibGVTaXplKSk7DQo+ID4gKyAgICByZXR1cm4gRkFMU0U7DQo+ID4gKyAg fQ0KPiA+ICsgIFN0YXR1cyA9IER1bXBWYXJpYWJsZVBvbGljeSAoUG9saWN5VGFibGUsICZQb2xp Y3lUYWJsZVNpemUpOyAgaWYNCj4gPiArIChFRklfRVJST1IgKFN0YXR1cykpIHsNCj4gPiArICAg IERFQlVHICgoREVCVUdfRVJST1IsICIlYSAtIEZhaWxlZCB0byBkdW1wIHBvbGljeSB0YWJsZSEg JXJcbiIsDQo+ID4gX19GVU5DVElPTl9fLCBTdGF0dXMpKTsNCj4gPiArICAgIFJlc3VsdCA9IEZB TFNFOw0KPiA+ICsgICAgZ290byBFeGl0Ow0KPiA+ICsgIH0NCj4gPiArDQo+ID4gKyAgLy8NCj4g PiArICAvLyBOb3cgd2UgbmVlZCB0byB3YWxrIHRoZSB0YWJsZSBsb29raW5nIGZvciBhIG1hdGNo Lg0KPiA+ICsgIC8vDQo+ID4gKyAgTWF0Y2hQb2xpY3kgPSBHZXRCZXN0UG9saWN5TWF0Y2ggKA0K PiA+ICsgICAgICAgICAgICAgICAgICBQb2xpY3lUYWJsZSwNCj4gPiArICAgICAgICAgICAgICAg ICAgUG9saWN5VGFibGVTaXplLA0KPiA+ICsgICAgICAgICAgICAgICAgICBWYXJpYWJsZU5hbWUs DQo+ID4gKyAgICAgICAgICAgICAgICAgIFZlbmRvckd1aWQsDQo+ID4gKyAgICAgICAgICAgICAg ICAgICZNYXRjaFByaW9yaXR5DQo+ID4gKyAgICAgICAgICAgICAgICAgICk7DQo+ID4gKyAgaWYg KE1hdGNoUG9saWN5ICE9IE5VTEwgJiYgTWF0Y2hQcmlvcml0eSAhPSBNQVRDSF9QUklPUklUWV9F WEFDVCkNCj4gew0KPiA+ICsgICAgREVCVUcgKChERUJVR19FUlJPUiwgIiVhIC0gV2Ugd291bGQg bm90IGhhdmUgZXhwZWN0ZWQgYQ0KPiBub24tZXhhY3QNCj4gPiBtYXRjaCEgJWRcbiIsIF9fRlVO Q1RJT05fXywgTWF0Y2hQcmlvcml0eSkpOw0KPiA+ICsgICAgUmVzdWx0ID0gRkFMU0U7DQo+ID4g KyAgICBnb3RvIEV4aXQ7DQo+ID4gKyAgfQ0KPiA+ICsNCj4gPiArICAvLw0KPiA+ICsgIC8vIE5v dyB3ZSBjYW4gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhpcyB2YXJpYWJsZSBpcyBjdXJyZW50bHkg bG9ja2VkLg0KPiA+ICsgIC8vDQo+ID4gKyAgaWYgKE1hdGNoUG9saWN5LT5Mb2NrUG9saWN5VHlw ZSAhPQ0KPiBWQVJJQUJMRV9QT0xJQ1lfVFlQRV9MT0NLX05PVykgew0KPiA+ICsgICAgREVCVUcg KChERUJVR19JTkZPLCAiJWEgLSBQb2xpY3kgbWF5IG5vdCBsb2NrIHZhcmlhYmxlISAlZFxuIiwN Cj4gPiBfX0ZVTkNUSU9OX18sIE1hdGNoUG9saWN5LT5Mb2NrUG9saWN5VHlwZSkpOw0KPiA+ICsg ICAgUmVzdWx0ID0gRkFMU0U7DQo+ID4gKyAgICBnb3RvIEV4aXQ7DQo+ID4gKyAgfQ0KPiA+ICsN Cj4gPiArRXhpdDoNCj4gPiArICBpZiAoUG9saWN5VGFibGUgIT0gTlVMTCkgew0KPiA+ICsgICAg RnJlZVBvb2wgKFBvbGljeVRhYmxlKTsNCj4gPiArICB9DQo+ID4gKw0KPiA+ICsgIHJldHVybiBS ZXN1bHQ7DQo+ID4gK30NCj4gPg0KPiA+ICAvKioNCj4gPiAgICBERVBSRUNBVEVELiBUSElTIElT IE9OTFkgSEVSRSBBUyBBIENPTlZFTklFTkNFIFdISUxFDQo+IFBPUlRJTkcuDQo+ID4gLSAgTWFy ayBhIHZhcmlhYmxlIHRoYXQgd2lsbCBiZWNvbWUgcmVhZC1vbmx5IGFmdGVyIGxlYXZpbmcgdGhl IERYRQ0KcGhhc2UNCj4gb2YNCj4gPiBleGVjdXRpb24uDQo+ID4gLSAgV3JpdGUgcmVxdWVzdCBj b21pbmcgZnJvbSBTTU0gZW52aXJvbm1lbnQgdGhyb3VnaA0KPiA+IEVGSV9TTU1fVkFSSUFCTEVf UFJPVE9DT0wgaXMgYWxsb3dlZC4NCj4gPiArICBNYXJrIGEgdmFyaWFibGUgdGhhdCB3aWxsIGJl Y29tZSByZWFkLW9ubHkgYWZ0ZXIgbGVhdmluZyB0aGUgRFhFDQo+ID4gKyBwaGFzZSBvZiAgZXhl Y3V0aW9uLiBXcml0ZSByZXF1ZXN0IGNvbWluZyBmcm9tIFNNTSBlbnZpcm9ubWVudA0KPiA+IHRo cm91Z2gNCj4gPiArIEVGSV9TTU1fVkFSSUFCTEVfUFJPVE9DT0wgaXMgYWxsb3dlZC4NCj4gPg0K PiA+ICAgIEBwYXJhbVtpbl0gVGhpcyAgICAgICAgICBUaGUgVkFSSUFCTEVfTE9DS19QUk9UT0NP TA0KPiBpbnN0YW5jZS4NCj4gPiAtICBAcGFyYW1baW5dIFZhcmlhYmxlTmFtZSAgQSBwb2ludGVy IHRvIHRoZSB2YXJpYWJsZSBuYW1lIHRoYXQgd2lsbCBiZQ0KPiA+IG1hZGUgcmVhZC1vbmx5IHN1 YnNlcXVlbnRseS4NCj4gPiAtICBAcGFyYW1baW5dIFZlbmRvckd1aWQgICAgQSBwb2ludGVyIHRv IHRoZSB2ZW5kb3IgR1VJRCB0aGF0IHdpbGwgYmUNCj4gbWFkZQ0KPiA+IHJlYWQtb25seSBzdWJz ZXF1ZW50bHkuDQo+ID4gKyAgQHBhcmFtW2luXSBWYXJpYWJsZU5hbWUgIEEgcG9pbnRlciB0byB0 aGUgdmFyaWFibGUgbmFtZSB0aGF0IHdpbGwgYmUNCj4gPiBtYWRlDQo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgIHJlYWQtb25seSBzdWJzZXF1ZW50bHkuDQo+ID4gKyAgQHBhcmFtW2lu XSBWZW5kb3JHdWlkICAgIEEgcG9pbnRlciB0byB0aGUgdmVuZG9yIEdVSUQgdGhhdCB3aWxsIGJl DQo+IG1hZGUNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZC1vbmx5IHN1YnNl cXVlbnRseS4NCj4gPg0KPiA+IC0gIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSB2 YXJpYWJsZSBzcGVjaWZpZWQgYnkgdGhlDQo+IFZhcmlhYmxlTmFtZSBhbmQNCj4gPiB0aGUgVmVu ZG9yR3VpZCB3YXMgbWFya2VkDQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg YXMgcGVuZGluZyB0byBiZSByZWFkLW9ubHkuDQo+ID4gKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAg ICAgICAgICAgVGhlIHZhcmlhYmxlIHNwZWNpZmllZCBieSB0aGUNCj4gVmFyaWFibGVOYW1lIGFu ZA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBWZW5kb3JHdWlkIHdh cyBtYXJrZWQgYXMNCj4gcGVuZGluZyB0byBiZQ0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHJlYWQtb25seS4NCj4gPiAgICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRF UiBWYXJpYWJsZU5hbWUgb3IgVmVuZG9yR3VpZCBpcw0KPiBOVUxMLg0KPiA+ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIE9yIFZhcmlhYmxlTmFtZSBpcyBhbiBlbXB0eQ0KPiBzdHJp bmcuDQo+ID4gLSAgQHJldHZhbCBFRklfQUNDRVNTX0RFTklFRA0KPiBFRklfRU5EX09GX0RYRV9F VkVOVF9HUk9VUF9HVUlEDQo+ID4gb3IgRUZJX0VWRU5UX0dST1VQX1JFQURZX1RPX0JPT1QgaGFz DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIHNpZ25h bGVkLg0KPiA+IC0gIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZXJlIGlzIG5vdCBl bm91Z2ggcmVzb3VyY2UgdG8NCj4gaG9sZA0KPiA+IHRoZSBsb2NrIHJlcXVlc3QuDQo+ID4gKyAg QHJldHZhbCBFRklfQUNDRVNTX0RFTklFRA0KPiBFRklfRU5EX09GX0RYRV9FVkVOVF9HUk9VUF9H VUlEDQo+ID4gb3INCj4gPiArDQo+IEVGSV9FVkVOVF9HUk9VUF9SRUFEWV9UT19CT09UIGhhcyBh bHJlYWR5IGJlZW4NCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxl ZC4NCj4gPiArICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGVyZSBpcyBub3QgZW5v dWdoIHJlc291cmNlIHRvDQo+IGhvbGQNCj4gPiB0aGUgbG9jaw0KPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuDQo+ID4gICoqLw0KPiA+ICBFRklfU1RBVFVTDQo+ ID4gIEVGSUFQSQ0KPiA+ICBWYXJpYWJsZUxvY2tSZXF1ZXN0VG9Mb2NrICgNCj4gPiAtICBJTiBD T05TVCBFREtJSV9WQVJJQUJMRV9MT0NLX1BST1RPQ09MICpUaGlzLA0KPiA+IC0gIElOICAgICAg IENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgKlZhcmlhYmxlTmFtZSwNCj4gPiAtICBJTiAg ICAgICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgICpWZW5kb3JHdWlkDQo+ID4gKyAgSU4g Q09OU1QgRURLSUlfVkFSSUFCTEVfTE9DS19QUk9UT0NPTCAgKlRoaXMsDQo+ID4gKyAgSU4gQ0hB UjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlZhcmlhYmxlTmFtZSwNCj4gPiArICBJ TiBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVmVuZG9yR3VpZA0KPiA+ICAg ICkNCj4gPiAgew0KPiA+IC0gIEVGSV9TVEFUVVMgICAgICAgICAgICAgIFN0YXR1czsNCj4gPiAt ICBWQVJJQUJMRV9QT0xJQ1lfRU5UUlkgICAqTmV3UG9saWN5Ow0KPiA+ICsgIEVGSV9TVEFUVVMg ICAgICAgICAgICAgU3RhdHVzOw0KPiA+ICsgIFZBUklBQkxFX1BPTElDWV9FTlRSWSAgKk5ld1Bv bGljeTsNCj4gPiArDQo+ID4gKyAgREVCVUcgKChERUJVR19FUlJPUiwgIiEhISBERVBSRUNBVEVE IElOVEVSRkFDRSAhISEgJWEoKSB3aWxsIGdvDQo+IGF3YXkNCj4gPiArIHNvb24hXG4iLCBfX0ZV TkNUSU9OX18pKTsgIERFQlVHICgoREVCVUdfRVJST1IsICIhISEgREVQUkVDQVRFRA0KPiA+ICsg SU5URVJGQUNFICEhISBQbGVhc2UgbW92ZSB0byB1c2UgVmFyaWFibGUgUG9saWN5IVxuIikpOyAg REVCVUcNCj4gPiArICgoREVCVUdfRVJST1IsICIhISEgREVQUkVDQVRFRCBJTlRFUkZBQ0UgISEh IFZhcmlhYmxlOiAlZyAlc1xuIiwNCj4gPiArIFZlbmRvckd1aWQsIFZhcmlhYmxlTmFtZSkpOw0K PiA+DQo+ID4gICAgTmV3UG9saWN5ID0gTlVMTDsNCj4gPiAtICBTdGF0dXMgPSBDcmVhdGVCYXNp Y1ZhcmlhYmxlUG9saWN5KCBWZW5kb3JHdWlkLA0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFZhcmlhYmxlTmFtZSwNCj4gPiAtDQo+IFZBUklBQkxFX1BPTElDWV9O T19NSU5fU0laRSwNCj4gPiAtDQo+IFZBUklBQkxFX1BPTElDWV9OT19NQVhfU0laRSwNCj4gPiAt DQo+IFZBUklBQkxFX1BPTElDWV9OT19NVVNUX0FUVFIsDQo+ID4gLQ0KPiBWQVJJQUJMRV9QT0xJ Q1lfTk9fQ0FOVF9BVFRSLA0KPiA+IC0NCj4gVkFSSUFCTEVfUE9MSUNZX1RZUEVfTE9DS19OT1cs DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld1BvbGljeSAp Ow0KPiA+ICsgIFN0YXR1cyA9IENyZWF0ZUJhc2ljVmFyaWFibGVQb2xpY3koDQo+ID4gKyAgICAg ICAgICAgICBWZW5kb3JHdWlkLA0KPiA+ICsgICAgICAgICAgICAgVmFyaWFibGVOYW1lLA0KPiA+ ICsgICAgICAgICAgICAgVkFSSUFCTEVfUE9MSUNZX05PX01JTl9TSVpFLA0KPiA+ICsgICAgICAg ICAgICAgVkFSSUFCTEVfUE9MSUNZX05PX01BWF9TSVpFLA0KPiA+ICsgICAgICAgICAgICAgVkFS SUFCTEVfUE9MSUNZX05PX01VU1RfQVRUUiwNCj4gPiArICAgICAgICAgICAgIFZBUklBQkxFX1BP TElDWV9OT19DQU5UX0FUVFIsDQo+ID4gKyAgICAgICAgICAgICBWQVJJQUJMRV9QT0xJQ1lfVFlQ RV9MT0NLX05PVywNCj4gPiArICAgICAgICAgICAgICZOZXdQb2xpY3kNCj4gPiArICAgICAgICAg ICAgICk7DQo+ID4gICAgaWYgKCFFRklfRVJST1IoIFN0YXR1cyApKSB7DQo+ID4gLSAgICBTdGF0 dXMgPSBSZWdpc3RlclZhcmlhYmxlUG9saWN5KCBOZXdQb2xpY3kgKTsNCj4gPiArICAgIFN0YXR1 cyA9IFJlZ2lzdGVyVmFyaWFibGVQb2xpY3kgKE5ld1BvbGljeSk7DQo+ID4gKw0KPiA+ICsgICAg Ly8NCj4gPiArICAgIC8vIElmIHRoZSBlcnJvciByZXR1cm5lZCBpcyBFRklfQUxSRUFEWV9TVEFS VEVELCB3ZSBuZWVkIHRvIGNoZWNrDQo+IHRoZQ0KPiA+ICsgICAgLy8gY3VycmVudCBkYXRhYmFz ZSBmb3IgdGhlIHZhcmlhYmxlIGFuZCBzZWUgd2hldGhlciBpdCdzIGxvY2tlZC4NCklmIGl0J3MN Cj4gPiArICAgIC8vIGxvY2tlZCwgd2UncmUgc3RpbGwgZmluZSwgYnV0IGFsc28gZ2VuZXJhdGUg YSBERUJVR19FUlJPUg0KPiBtZXNzYWdlIHNvDQo+ID4gdGhlDQo+ID4gKyAgICAvLyBkdXBsaWNh dGUgbG9jayBjYW4gYmUgcmVtb3ZlZC4NCj4gPiArICAgIC8vDQo+ID4gKyAgICBpZiAoU3RhdHVz ID09IEVGSV9BTFJFQURZX1NUQVJURUQpIHsNCj4gPiArICAgICAgaWYgKElzVmFyaWFibGVBbHJl YWR5TG9ja2VkIChWYXJpYWJsZU5hbWUsIFZlbmRvckd1aWQpKSB7DQo+ID4gKyAgICAgICAgREVC VUcgKChERUJVR19FUlJPUiwgIiAgVmFyaWFibGU6ICVnICVzIGlzIGFscmVhZHkNCj4gbG9ja2Vk IVxuIiwNCj4gPiBWZW5kb3JHdWlkLCBWYXJpYWJsZU5hbWUpKTsNCj4gPiArICAgICAgICBTdGF0 dXMgPSBFRklfU1VDQ0VTUzsNCj4gPiArICAgICAgfQ0KPiA+ICsgICAgfQ0KPiA+ICAgIH0NCj4g PiAtICBpZiAoRUZJX0VSUk9SKCBTdGF0dXMgKSkgew0KPiA+ICsgIGlmIChFRklfRVJST1IgKFN0 YXR1cykpIHsNCj4gPiAgICAgIERFQlVHKCggREVCVUdfRVJST1IsICIlYSAtIEZhaWxlZCB0byBs b2NrIHZhcmlhYmxlICVzISAlclxuIiwNCj4gPiBfX0ZVTkNUSU9OX18sIFZhcmlhYmxlTmFtZSwg U3RhdHVzICkpOw0KPiA+IC0gICAgQVNTRVJUX0VGSV9FUlJPUiggU3RhdHVzICk7DQo+ID4gICAg fQ0KPiA+ICAgIGlmIChOZXdQb2xpY3kgIT0gTlVMTCkgew0KPiA+ICAgICAgRnJlZVBvb2woIE5l d1BvbGljeSApOw0KPiA+IC0tDQo+ID4gMi4yOS4yLndpbmRvd3MuMg0KPiA+DQo+ID4NCj4gPg0K PiA+IA0KPiA+DQoNCg0KDQo= --_000_CY4PR21MB0151DAA16A0E0F30F33E1BA5EFCB1CY4PR21MB0151namp_ Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: quoted-printable
I would prefer to not reuse the code from t= he library. They are SUPPOSED to be internal functions and are not part of = the public interface. I=A1=AFve duplicated them here because this shim is s= upposed to be temporary and should go away within the next few stabilizations.

I would also prefer to keep the tests and t= he code together. These are pure unit tests rather than driver tests and se= rve to document and prove the code that is being submitted. However, I=A1= =AFm willing to be flexible on this.

- Bret

From: gaoliming <gaolim= ing@byosoft.com.cn>
Sent: Wednesday, December 9, 2020 7:16:28 PM
To: 'Wu, Hao A' <hao.a.wu@intel.com>; devel@edk2.groups.io &l= t;devel@edk2.groups.io>; Kinney, Michael D <michael.d.kinney@intel.co= m>
Cc: Bret Barkelew <Bret.Barkelew@microsoft.com>
Subject: [EXTERNAL] =BB=D8=B8=B4: [edk2-devel] [Patch v2 1/1] MdeMo= dulePkg/Variable/RuntimeDxe: Restore Variable Lock Protocol behavior
 
Mike:
  I agree Hao comment. There is the similar code logic in VariablePol= icyLib
library. They can be shared.

  Besides, I suggest to split this patch. One is the bug fix to resto= re
Variable Lock Protocol behavior, another is to add Variable driver unit test.

Thanks
Liming
> -----=D3=CA=BC=FE=D4=AD=BC=FE-----
> =B7=A2=BC=FE=C8=CB: Wu, Hao A <hao.a.wu@intel.com>
> =B7=A2=CB=CD=CA=B1=BC=E4: 2020=C4=EA12=D4=C210=C8=D5 10:25
> =CA=D5=BC=FE=C8=CB: devel@edk2.groups.io; Kinney, Michael D
> <michael.d.kinney@intel.com>
> =B3=AD=CB=CD: Bret Barkelew <bret.barkelew@microsoft.com>; Limi= ng Gao
> <gaoliming@byosoft.com.cn>
> =D6=F7=CC=E2: RE: [edk2-devel] [Patch v2 1/1] MdeModulePkg/Variable/R= untimeDxe:
> Restore Variable Lock Protocol behavior
>
> > -----Original Message-----
> > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behal= f Of Michael
> > D Kinney
> > Sent: Thursday, December 10, 2020 2:06 AM
> > To: devel@edk2.groups.io
> > Cc: Bret Barkelew <bret.barkelew@microsoft.com>; Wu, Hao A=
> > <hao.a.wu@intel.com>; Liming Gao <gaoliming@byosoft.com= .cn>; Bret
> > Barkelew <Bret.Barkelew@microsoft.com>
> > Subject: [edk2-devel] [Patch v2 1/1] MdeModulePkg/Variable/Runti= meDxe:
> > Restore Variable Lock Protocol behavior
> >
> > From: Bret Barkelew <bret.barkelew@microsoft.com>
> >
> > https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fbugzil= la.tianocore.org%2Fshow_bug.cgi%3Fid%3D3111&amp;data=3D04%7C01%7Cbret.b= arkelew%40microsoft.com%7C4115faaa16c6475b8e3508d89cba0189%7C72f988bf86f141= af91ab2d7cd011db47%7C1%7C0%7C637431669999943616%7CUnknown%7CTWFpbGZsb3d8eyJ= WIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&= amp;sdata=3DDU8EYtayepZpsyxajKK9w0mQ5kExWXG2AJvCcvVVy1A%3D&amp;reserved= = =3D0
> >
> > The VariableLock shim currently fails if called twice because th= e
underlying
> > Variable Policy engine returns an error if a policy is set on an=
existing
> variable.
> >
> > This breaks existing code which expect it to silently pass if a = variable
is
> locked
> > multiple times (because it should "be locked").
> >
> > Refactor the shim to confirm that the variable is indeed locked = and then
> > change the error to EFI_SUCCESS and generate a DEBUG_ERROR messa= ge
> so
> > the duplicate lock can be reported in a debug log and removed. >
>
> Hello,
>
> Is it possible to reuse:
>     a) EvaluatePolicyMatch() and GetBestPolicyMat= ch() functions
>     b) Macros like GET_NEXT_POLICY, GET_POLICY_NA= ME and etc.
> under MdeModulePkg\Library\VariablePolicyLib to reduce duplicate code= s?
>
> A couple of minor inline comments below:
>
>
> >
> > Add host based unit tests for the multiple lock case using Varia= ble Lock
> > Protocol, Variable Policy Protocol, and mixes of Variable Lock P= rotocol
and
> > Variable Policy Protocol.
> >
> > Cc: Michael D Kinney <michael.d.kinney@intel.com>
> > Cc: Hao A Wu <hao.a.wu@intel.com>
> > Cc: Liming Gao <gaoliming@byosoft.com.cn>
> > Signed-off-by: Bret Barkelew <Bret.Barkelew@microsoft.com>=
> > ---
> >  MdeModulePkg/Test/MdeModulePkgHostTest.dsc  &nbs= p; |  11 +
> >  .../VariableLockRequestToLockUnitTest.c   &= nbsp;   | 434
> ++++++++++++++++++
> >  .../VariableLockRequestToLockUnitTest.inf   = ;  |  36 ++
> >  .../RuntimeDxe/VariableLockRequestToLock.c  &nbs= p; | 363
> +++++++++++++--
> >  4 files changed, 809 insertions(+), 35 deletions(-)  = create mode 100644
> > MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/Va= ri
> > ableLockRequestToLockUnitTest.c
> >  create mode 100644
> > MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/Va= ri
> > ableLockRequestToLockUnitTest.inf
> >
> > diff --git a/MdeModulePkg/Test/MdeModulePkgHostTest.dsc
> > b/MdeModulePkg/Test/MdeModulePkgHostTest.dsc
> > index 72a119db4568..4da4692c8451 100644
> > --- a/MdeModulePkg/Test/MdeModulePkgHostTest.dsc
> > +++ b/MdeModulePkg/Test/MdeModulePkgHostTest.dsc
> > @@ -19,6 +19,9 @@ [Defines]
> >
> >  !include UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc= .inc
> >
> > +[LibraryClasses]
> > +  SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.= inf
> > +
> >  [Components]
> >
> > MdeModulePkg/Library/DxeResetSystemLib/UnitTest/MockUefiRuntimeS= er
> > vicesTableLib.inf
> >
> > @@ -30,3 +33,11 @@ [Components]
> >
> > ResetSystemLib|MdeModulePkg/Library/DxeResetSystemLib/DxeResetSy= st
> > emLib.inf
> >
> > UefiRuntimeServicesTableLib|MdeModulePkg/Library/DxeResetSystemL= ib/
> > UnitTest/MockUefiRuntimeServicesTableLib.inf
> >    }
> > +
> > +
> > MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/Va= ri
> > ableLockRequestToLockUnitTest.inf {
> > +    <LibraryClasses>
> > +
> >
> VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePoli= cyLi
> > b.inf
> > +
> >
> VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/= Va
> > riablePolicyHelperLib.inf
> > +    <PcdsFixedAtBuild>
> > +
> > +
> > gEfiMdeModulePkgTokenSpaceGuid.PcdAllowVariablePolicyEnforcement= Dis
> > abl
> > + e|TRUE
> > +  }
> > diff --git
> > a/MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/= Va
> > riableLockRequestToLockUnitTest.c
> > b/MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/= Va
> > riableLockRequestToLockUnitTest.c
> > new file mode 100644
> > index 000000000000..2f4c4d2f79f4
> > --- /dev/null
> > +++
> > b/MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/= Va
> > ri
> > +++ ableLockRequestToLockUnitTest.c
> > @@ -0,0 +1,434 @@
> > +/** @file
> > +  This is a host-based unit test for the VariableLockReque= stToLock
shim.
> > +
> > +  Copyright (c) Microsoft Corporation.
> > +  SPDX-License-Identifier: BSD-2-Clause-Patent
> > +
> > +**/
> > +
> > +#include <stdio.h>
> > +#include <string.h>
> > +#include <stdarg.h>
> > +#include <stddef.h>
> > +#include <setjmp.h>
> > +#include <cmocka.h>
> > +
> > +#include <Uefi.h>
> > +#include <Library/DebugLib.h>
> > +#include <Library/BaseMemoryLib.h>
> > +#include <Library/MemoryAllocationLib.h> #include
> > +<Library/UnitTestLib.h> #include <Library/VariablePoli= cyLib.h> #include
> > +<Library/VariablePolicyHelperLib.h>
> > +
> > +#include <Protocol/VariableLock.h>
> > +
> > +#define UNIT_TEST_NAME       = ; "VarPol/VarLock Shim Unit Test"
> > +#define UNIT_TEST_VERSION     "1.0&quo= t;
> > +
> > +///=3D=3D=3D CODE UNDER TEST
> > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> > +=3D=3D=3D=3D
> > +
> > +EFI_STATUS
> > +EFIAPI
> > +VariableLockRequestToLock (
> > +  IN CONST EDKII_VARIABLE_LOCK_PROTOCOL  *This,
> > +  IN       CHAR16  = ;            &n= bsp;         *VariableName,
> > +  IN       EFI_GUID &nb= sp;            =         *VendorGuid
> > +  );
> > +
> > +///=3D=3D=3D TEST DATA
> > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> > +
> > +//
> > +// Test GUID 1 {F955BA2D-4A2C-480C-BFD1-3CC522610592}
> > +//
> > +EFI_GUID  mTestGuid1 =3D {
> > +  0xf955ba2d, 0x4a2c, 0x480c, {0xbf, 0xd1, 0x3c, 0xc5, 0x2= 2, 0x61, 0x5,
> > +0x92} };
> > +
> > +//
> > +// Test GUID 2 {2DEA799E-5E73-43B9-870E-C945CE82AF3A}
> > +//
> > +EFI_GUID  mTestGuid2 =3D {
> > +  0x2dea799e, 0x5e73, 0x43b9, {0x87, 0xe, 0xc9, 0x45, 0xce= , 0x82, 0xaf,
> > +0x3a} };
> > +
> > +//
> > +// Test GUID 3 {698A2BFD-A616-482D-B88C-7100BD6682A9}
> > +//
> > +EFI_GUID  mTestGuid3 =3D {
> > +  0x698a2bfd, 0xa616, 0x482d, {0xb8, 0x8c, 0x71, 0x0, 0xbd= , 0x66, 0x82,
> > +0xa9} };
> > +
> > +#define TEST_VAR_1_NAME      &nbs= p;       L"TestVar1"
> > +#define TEST_VAR_2_NAME      &nbs= p;       L"TestVar2"
> > +#define TEST_VAR_3_NAME      &nbs= p;       L"TestVar3"
> > +
> > +#define TEST_POLICY_ATTRIBUTES_NULL  0
> > +#define TEST_POLICY_MIN_SIZE_NULL    0
> > +#define TEST_POLICY_MAX_SIZE_NULL    MAX_UINT32<= br> > > +
> > +#define TEST_POLICY_MIN_SIZE_10      1= 0
> > +#define TEST_POLICY_MAX_SIZE_200     200 > > +
> > +///=3D=3D=3D HELPER FUNCTIONS
> > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> > +=3D=3D=3D=3D
> > +
> > +/**
> > +  Mocked version of GetVariable, for testing.
> > +
> > +  @param  VariableName
> > +  @param  VendorGuid
> > +  @param  Attributes
> > +  @param  DataSize
> > +  @param  Data
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +StubGetVariableNull (
> > +  IN     CHAR16    *Var= iableName,
> > +  IN     EFI_GUID  *VendorGuid, > > +  OUT    UINT32    *Attribut= es,  OPTIONAL
> > +  IN OUT UINTN     *DataSize,
> > +  OUT    VOID     = *Data         OPTIONAL
> > +  )
> > +{
> > +  UINT32      MockedAttr;
> > +  UINTN       MockedDataSize= ;
> > +  VOID        *MockedDa= ta;
> > +  EFI_STATUS  MockedReturn;
> > +
> > +  check_expected_ptr (VariableName);
> > +  check_expected_ptr (VendorGuid);
> > +  check_expected_ptr (DataSize);
> > +
> > +  MockedAttr     =3D (UINT32)mock(); > > +  MockedDataSize =3D (UINTN)mock();
> > +  MockedData     =3D (VOID*)(UINTN)moc= k();
> > +  MockedReturn   =3D (EFI_STATUS)mock();
> > +
> > +  if (Attributes !=3D NULL) {
> > +    *Attributes =3D MockedAttr;
> > +  }
> > +  if (Data !=3D NULL && !EFI_ERROR (MockedReturn))= {
> > +    CopyMem (Data, MockedData, MockedDataSize);&= nbsp; }
> > +
> > +  *DataSize =3D MockedDataSize;
> > +
> > +  return MockedReturn;
> > +}
> > +
> > +//
> > +// Anything you think might be helpful that isn't a test itself= .
> > +//
> > +
> > +/**
> > +  This is a common setup function that will ensure the lib= rary is
> > +always
> > +  initialized with the stubbed GetVariable.
> > +
> > +  Not used by all test cases, but by most.
> > +
> > +  @param[in]  Context  Unit test case context **= / STATIC
> > +UNIT_TEST_STATUS EFIAPI LibInitMocked (
> > +  IN UNIT_TEST_CONTEXT  Context
> > +  )
> > +{
> > +  return EFI_ERROR (InitVariablePolicyLib (StubGetVariable= Null)) ?
> > +UNIT_TEST_ERROR_PREREQUISITE_NOT_MET : UNIT_TEST_PASSED; }
> > +
> > +/**
> > +  Common cleanup function to make sure that the library is= always
> > +de-initialized
> > +  prior to the next test case.
> > +
> > +  @param[in]  Context  Unit test case context **= / STATIC VOID EFIAPI
> > +LibCleanup (
> > +  IN UNIT_TEST_CONTEXT  Context
> > +  )
> > +{
> > +  DeinitVariablePolicyLib();
> > +}
> > +
> > +///=3D=3D=3D TEST CASES
> > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> > +
> > +///=3D=3D=3D=3D=3D SHIM SUITE
> > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> > =3D=3D
> > +
> > +/**
> > +  Test Case that locks a single variable using the Variabl= e Lock
Protocol.
> > +  The call is expected to succeed.
> > +
> > +  @param[in]  Context  Unit test case context **= / UNIT_TEST_STATUS
> > +EFIAPI LockingWithoutAnyPoliciesShouldSucceed (
> > +  IN UNIT_TEST_CONTEXT  Context
> > +  )
> > +{
> > +  EFI_STATUS  Status;
> > +
> > +  Status =3D VariableLockRequestToLock (NULL, TEST_VAR_1_N= AME,
> > + &mTestGuid1);  UT_ASSERT_NOT_EFI_ERROR (Status);
> > +
> > +  return UNIT_TEST_PASSED;
> > +}
> > +
> > +/**
> > +  Test Case that locks the same variable twice using the V= ariable Lock
> Procol.
>
>
> Minor comment, typo for 'Procol' -> 'Protocol'
>
>
> > +  Both calls are expected to succeed.
> > +
> > +  @param[in]  Context  Unit test case context > > +  **/
> > +UNIT_TEST_STATUS
> > +EFIAPI
> > +LockingTwiceShouldSucceed (
> > +  IN UNIT_TEST_CONTEXT  Context
> > +  )
> > +{
> > +  EFI_STATUS  Status;
> > +
> > +  Status =3D VariableLockRequestToLock (NULL, TEST_VAR_1_N= AME,
> > + &mTestGuid1);  UT_ASSERT_NOT_EFI_ERROR (Status);
> > +
> > +  Status =3D VariableLockRequestToLock (NULL, TEST_VAR_1_N= AME,
> > + &mTestGuid1);  UT_ASSERT_NOT_EFI_ERROR (Status);
> > +
> > +  return UNIT_TEST_PASSED;
> > +}
> > +
> > +/**
> > +  Test Case that locks a variable using the Variable Polic= y Protocol
> > +then locks
> > +  the same variable using the Variable Lock Protocol.
> > +  Both calls are expected to succeed.
> > +
> > +  @param[in]  Context  Unit test case context > > +  **/
> > +UNIT_TEST_STATUS
> > +EFIAPI
> > +LockingALockedVariableShouldSucceed (
> > +  IN UNIT_TEST_CONTEXT  Context
> > +  )
> > +{
> > +  EFI_STATUS       &nbs= p;     Status;
> > +  VARIABLE_POLICY_ENTRY  *NewEntry;
> > +
> > +  //
> > +  // Create a variable policy that locks the variable.
> > +  //
> > +  Status =3D CreateBasicVariablePolicy (
> > +          &nb= sp;  &mTestGuid1,
> > +          &nb= sp;  TEST_VAR_1_NAME,
> > +          &nb= sp;  TEST_POLICY_MIN_SIZE_NULL,
> > +          &nb= sp;  TEST_POLICY_MAX_SIZE_200,
> > +          &nb= sp;  TEST_POLICY_ATTRIBUTES_NULL,
> > +          &nb= sp;  TEST_POLICY_ATTRIBUTES_NULL,
> > +          &nb= sp;  VARIABLE_POLICY_TYPE_LOCK_NOW,
> > +          &nb= sp;  &NewEntry
> > +          &nb= sp;  );
> > +  UT_ASSERT_NOT_EFI_ERROR (Status);
> > +
> > +  //
> > +  // Register the new policy.
> > +  //
> > +  Status =3D RegisterVariablePolicy (NewEntry);
> > +
> > +  Status =3D VariableLockRequestToLock (NULL, TEST_VAR_1_N= AME,
> > + &mTestGuid1);  UT_ASSERT_NOT_EFI_ERROR (Status);
> > +
> > +  FreePool (NewEntry);
> > +
> > +  return UNIT_TEST_PASSED;
> > +}
> > +
> > +/**
> > +  Test Case that locks a variable using the Variable Polic= y Protocol
> > +with a
> > +  policy other than LOCK_NOW then attempts to lock the sam= e variable
> > +using the
> > +  Variable Lock Protocol.  The call to Variable Polic= y is expected to
> > +succced
>
>
> 'succced' -> 'succeed'
>
>
> > +  and the call to Variable Lock is expected to fail.
> > +
> > +  @param[in]  Context  Unit test case context > > +  **/
> > +UNIT_TEST_STATUS
> > +EFIAPI
> > +LockingAnUnlockedVariableShouldFail (
> > +  IN UNIT_TEST_CONTEXT      Conte= xt
> > +  )
> > +{
> > +  EFI_STATUS       &nbs= p;        Status;
> > +  VARIABLE_POLICY_ENTRY     *NewEntry;=
> > +
> > +  // Create a variable policy that locks the variable.
> > +  Status =3D CreateVarStateVariablePolicy (&mTestGuid1= ,
> > +          &nb= sp;            =             &nb= sp;     TEST_VAR_1_NAME,
> > +
> TEST_POLICY_MIN_SIZE_NULL,
> > +
> TEST_POLICY_MAX_SIZE_200,
> > +
> TEST_POLICY_ATTRIBUTES_NULL,
> > +
> TEST_POLICY_ATTRIBUTES_NULL,
> > +          &nb= sp;            =             &nb= sp;     &mTestGuid2,
> > +          &nb= sp;            =             &nb= sp;     1,
> > +          &nb= sp;            =             &nb= sp;     TEST_VAR_2_NAME,
> > +          &nb= sp;            =             &nb= sp;     &NewEntry);
> > + UT_ASSERT_NOT_EFI_ERROR (Status);
> > +
> > +  // Register the new policy.
> > +  Status =3D RegisterVariablePolicy (NewEntry);
> > +
> > +  Status =3D VariableLockRequestToLock (NULL, TEST_VAR_1_N= AME,
> > + &mTestGuid1);  UT_ASSERT_TRUE (EFI_ERROR (Status)); > > +
> > +  FreePool (NewEntry);
> > +
> > +  return UNIT_TEST_PASSED;
> > +}
> > +
> > +/**
> > +  Test Case that locks a variable using Variable Lock Prot= ocol Policy
> > +Protocol
> > +  then and then attempts to lock the same variable using t= he Variable
> > +Policy
> > +  Protocol.  The call to Variable Lock is expected to= succced and the
>
>
> 'succced' -> 'succeed'
>
> Best Regards,
> Hao Wu
>
>
> > +call to
> > +  Variable Policy is expected to fail.
> > +
> > +  @param[in]  Context  Unit test case context > > +  **/
> > +UNIT_TEST_STATUS
> > +EFIAPI
> > +SettingPolicyForALockedVariableShouldFail (
> > +  IN UNIT_TEST_CONTEXT      Conte= xt
> > +  )
> > +{
> > +  EFI_STATUS       &nbs= p;        Status;
> > +  VARIABLE_POLICY_ENTRY     *NewEntry;=
> > +
> > +  // Lock the variable.
> > +  Status =3D VariableLockRequestToLock (NULL, TEST_VAR_1_N= AME,
> > + &mTestGuid1);  UT_ASSERT_NOT_EFI_ERROR (Status);
> > +
> > +  // Create a variable policy that locks the variable.
> > +  Status =3D CreateVarStateVariablePolicy (&mTestGuid1= ,
> > +          &nb= sp;            =             &nb= sp;     TEST_VAR_1_NAME,
> > +
> TEST_POLICY_MIN_SIZE_NULL,
> > +
> TEST_POLICY_MAX_SIZE_200,
> > +
> TEST_POLICY_ATTRIBUTES_NULL,
> > +
> TEST_POLICY_ATTRIBUTES_NULL,
> > +          &nb= sp;            =             &nb= sp;     &mTestGuid2,
> > +          &nb= sp;            =             &nb= sp;     1,
> > +          &nb= sp;            =             &nb= sp;     TEST_VAR_2_NAME,
> > +          &nb= sp;            =             &nb= sp;     &NewEntry);
> > + UT_ASSERT_NOT_EFI_ERROR (Status);
> > +
> > +  // Register the new policy.
> > +  Status =3D RegisterVariablePolicy (NewEntry);  UT_A= SSERT_TRUE
> > + (EFI_ERROR (Status));
> > +
> > +  FreePool (NewEntry);
> > +
> > +  return UNIT_TEST_PASSED;
> > +}
> > +
> > +/**
> > +  Main entry point to this unit test application.
> > +
> > +  Sets up and runs the test suites.
> > +**/
> > +VOID
> > +EFIAPI
> > +UnitTestMain (
> > +  VOID
> > +  )
> > +{
> > +  EFI_STATUS       &nbs= p;          Status;
> > +  UNIT_TEST_FRAMEWORK_HANDLE  Framework;
> > +  UNIT_TEST_SUITE_HANDLE      Shi= mTests;
> > +
> > +  Framework =3D NULL;
> > +
> > +  DEBUG ((DEBUG_INFO, "%a v%a\n", UNIT_TEST_NAME= ,
> > UNIT_TEST_VERSION));
> > +
> > +  //
> > +  // Start setting up the test framework for running the t= ests.
> > +  //
> > +  Status =3D InitUnitTestFramework (&Framework, UNIT_T= EST_NAME,
> > + gEfiCallerBaseName, UNIT_TEST_VERSION);  if (EFI_ERROR (S= tatus)) {
> > +    DEBUG ((DEBUG_ERROR, "Failed in InitUni= tTestFramework. Status
> > =3D %r\n", Status));
> > +    goto EXIT;
> > +  }
> > +
> > +  //
> > +  // Add all test suites and tests.
> > +  //
> > +  Status =3D CreateUnitTestSuite (
> > +          &nb= sp;  &ShimTests, Framework,
> > +          &nb= sp;  "Variable Lock Shim Tests", "VarPolicy.VarLockShim= ", NULL,
> NULL
> > +          &nb= sp;  );
> > +  if (EFI_ERROR (Status)) {
> > +    DEBUG ((DEBUG_ERROR, "Failed in CreateU= nitTestSuite for
> > ShimTests\n"));
> > +    Status =3D EFI_OUT_OF_RESOURCES;
> > +    goto EXIT;
> > +  }
> > +  AddTestCase (
> > +    ShimTests,
> > +    "Locking a variable with no matching po= licies should always work",
> > "EmptyPolicies",
> > +    LockingWithoutAnyPoliciesShouldSucceed, LibI= nitMocked,
> LibCleanup,
> > NULL
> > +    );
> > +  AddTestCase (
> > +    ShimTests,
> > +    "Locking a variable twice should always= work", "DoubleLock",
> > +    LockingTwiceShouldSucceed, LibInitMocked, Li= bCleanup, NULL
> > +    );
> > +  AddTestCase (
> > +    ShimTests,
> > +    "Locking a variable that's already lock= ed by another policy should
> work",
> > "LockAfterPolicy",
> > +    LockingALockedVariableShouldSucceed, LibInit= Mocked, LibCleanup,
> NULL
> > +    );
> > +  AddTestCase (
> > +    ShimTests,
> > +    "Locking a variable that already has an= unlocked policy should
fail",
> > "LockAfterUnlockedPolicy",
> > +    LockingAnUnlockedVariableShouldFail, LibInit= Mocked, LibCleanup,
> NULL
> > +    );
> > +  AddTestCase (
> > +    ShimTests,
> > +    "Adding a policy for a variable that ha= s previously been locked
should
> > always fail", "SetPolicyAfterLock",
> > +    SettingPolicyForALockedVariableShouldFail, L= ibInitMocked,
> LibCleanup,
> > NULL
> > +    );
> > +
> > +  //
> > +  // Execute the tests.
> > +  //
> > +  Status =3D RunAllTestSuites (Framework);
> > +
> > +EXIT:
> > +  if (Framework !=3D NULL) {
> > +    FreeUnitTestFramework (Framework);
> > +  }
> > +
> > +  return;
> > +}
> > +
> > +///
> > +/// Avoid ECC error for function name that starts with lower ca= se
> > +letter /// #define Main main
> > +
> > +/**
> > +  Standard POSIX C entry point for host based unit test ex= ecution.
> > +
> > +  @param[in] Argc  Number of arguments
> > +  @param[in] Argv  Array of pointers to arguments
> > +
> > +  @retval 0      Success
> > +  @retval other  Error
> > +**/
> > +INT32
> > +Main (
> > +  IN INT32  Argc,
> > +  IN CHAR8  *Argv[]
> > +  )
> > +{
> > +  UnitTestMain ();
> > +  return 0;
> > +}
> > diff --git
> > a/MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/= Va
> > riableLockRequestToLockUnitTest.inf
> > b/MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/= Va
> > riableLockRequestToLockUnitTest.inf
> > new file mode 100644
> > index 000000000000..2a659d7e1370
> > --- /dev/null
> > +++
> > b/MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/= Va
> > ri
> > +++ ableLockRequestToLockUnitTest.inf
> > @@ -0,0 +1,36 @@
> > +## @file
> > +# This is a host-based unit test for the VariableLockRequestToL= ock
shim.
> > +#
> > +# Copyright (c) Microsoft Corporation.
> > +# SPDX-License-Identifier: BSD-2-Clause-Patent ##
> > +
> > +[Defines]
> > +  INF_VERSION       &nb= sp; =3D 0x00010017
> > +  BASE_NAME        = ;   =3D VariableLockRequestToLockUnitTest
> > +  FILE_GUID        = ;   =3D A7388B6C-7274-4717-9649-BDC5DFD1FCBE
> > +  VERSION_STRING      =3D 1.0
> > +  MODULE_TYPE       &nb= sp; =3D HOST_APPLICATION
> > +
> > +#
> > +# The following information is for reference only and not requi= red by
the
> > build tools.
> > +#
> > +#  VALID_ARCHITECTURES      =      =3D IA32 X64 ARM AARCH64
> > +#
> > +
> > +[Sources]
> > +  VariableLockRequestToLockUnitTest.c
> > +  ../VariableLockRequestToLock.c
> > +
> > +[Packages]
> > +  MdePkg/MdePkg.dec
> > +  MdeModulePkg/MdeModulePkg.dec
> > +  UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec
> > +
> > +[LibraryClasses]
> > +  UnitTestLib
> > +  DebugLib
> > +  VariablePolicyLib
> > +  VariablePolicyHelperLib
> > +  BaseMemoryLib
> > +  MemoryAllocationLib
> > diff --git
> > a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableLockRequest= ToL
> > ock.c
> > b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableLockRequest= ToL
> > ock.c
> > index 4aa854aaf260..191de6b907c5 100644
> > ---
> > a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableLockRequest= ToL
> > ock.c
> > +++
> > b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableLockRequest= ToL
> > o
> > +++ ck.c
> > @@ -1,67 +1,360 @@
> > -/** @file -- VariableLockRequestToLock.c -Temporary location of= the
> > RequestToLock shim code while -projects are moved to VariablePol= icy.
> > Should be removed when deprecated.
> > +/** @file
> > +  Temporary location of the RequestToLock shim code while = projects
> > +  are moved to VariablePolicy. Should be removed when depr= ecated.
> >
> > -Copyright (c) Microsoft Corporation.
> > -SPDX-License-Identifier: BSD-2-Clause-Patent
> > +  Copyright (c) Microsoft Corporation.
> > +  SPDX-License-Identifier: BSD-2-Clause-Patent
> >
> >  **/
> >
> >  #include <Uefi.h>
> > -
> >  #include <Library/DebugLib.h>
> > +#include <Library/BaseMemoryLib.h>
> >  #include <Library/MemoryAllocationLib.h>
> > -
> > -#include <Protocol/VariableLock.h>
> > -
> > -#include <Protocol/VariablePolicy.h>
> >  #include <Library/VariablePolicyLib.h>
> >  #include <Library/VariablePolicyHelperLib.h>
> > +#include <Protocol/VariableLock.h>
> >
> > +//
> > +// NOTE: DO NOT USE THESE MACROS on any structure that has not = been
> > validated.
> > +//       Current table data has a= lready been sanitized.
> > +//
> > +#define GET_NEXT_POLICY(CurPolicy)
> > +(VARIABLE_POLICY_ENTRY*)((UINT8*)CurPolicy + CurPolicy->Size= ) #define
> > +GET_POLICY_NAME(CurPolicy)  (CHAR16*)((UINTN)CurPolicy + > > +CurPolicy->OffsetToName)
> > +
> > +#define MATCH_PRIORITY_EXACT  0
> > +#define MATCH_PRIORITY_MIN    MAX_UINT8
> > +
> > +/**
> > +  This helper function evaluates a policy and determines w= hether it
> > +matches the
> > +  target variable. If matched, will also return a value co= rresponding
> > +to the
> > +  priority of the match.
> > +
> > +  The rules for "best match" are listed in the V= ariable Policy Spec.
> > +  Perfect name matches will return 0.
> > +  Single wildcard characters will return the number of wil= dcard
> characters.
> > +  Full namespaces will return MAX_UINT8.
> > +
> > +  @param[in]  EvalEntry     = Pointer to the policy entry being
> evaluated.
> > +  @param[in]  VariableName   Same as EFI_SE= T_VARIABLE.
> > +  @param[in]  VendorGuid     Same= as EFI_SET_VARIABLE.
> > +  @param[out] MatchPriority  [Optional] On finding a = match, this value
> > contains
> > +          &nb= sp;            =       the priority of the match. Lower
> number =3D=3D higher
> > +          &nb= sp;            =       priority. Only valid if a match found.
> > +
> > +  @retval  TRUE   Current entry matches the= target variable.
> > +  @retval  FALSE  Current entry does not match a= t all.
> > +
> > +**/
> > +STATIC
> > +BOOLEAN
> > +EvaluatePolicyMatch (
> > +  IN CONST VARIABLE_POLICY_ENTRY  *EvalEntry,
> > +  IN CONST CHAR16       = ;          *VariableName,
> > +  IN CONST EFI_GUID      &nb= sp;        *VendorGuid,
> > +  OUT UINT8        = ;            &n= bsp;  *MatchPriority  OPTIONAL
> > +  )
> > +{
> > +  BOOLEAN  Result;
> > +  CHAR16   *PolicyName;
> > +  UINT8    CalculatedPriority;
> > +  UINTN    Index;
> > +
> > +  Result =3D FALSE;
> > +  CalculatedPriority =3D MATCH_PRIORITY_EXACT;
> > +
> > +  //
> > +  // Step 1: If the GUID doesn't match, we're done. No nee= d to evaluate
> > anything else.
> > +  //
> > +  if (!CompareGuid (&EvalEntry->Namespace, VendorGu= id)) {
> > +    goto Exit;
> > +  }
> > +
> > +  //
> > +  // If the GUID matches, check to see whether there is a = Name
> > + associated  // with the policy. If not, this policy match= es the entire
> > namespace.
> > +  // Missing Name is indicated by size being equal to name= .
> > +  //
> > +  if (EvalEntry->Size =3D=3D EvalEntry->OffsetToName= ) {
> > +    CalculatedPriority =3D MATCH_PRIORITY_MIN; > > +    Result =3D TRUE;
> > +    goto Exit;
> > +  }
> > +
> > +  //
> > +  // Now that we know the name exists, get it.
> > +  //
> > +  PolicyName =3D GET_POLICY_NAME (EvalEntry);
> > +
> > +  //
> > +  // Evaluate the name against the policy name and check f= or a match.
> > +  // Account for any wildcards.
> > +  //
> > +  Index =3D 0;
> > +  Result =3D TRUE;
> > +  //
> > +  // Keep going until the end of both strings.
> > +  //
> > +  while (PolicyName[Index] !=3D CHAR_NULL || VariableName[= Index] !=3D
> > CHAR_NULL) {
> > +    //
> > +    // If we don't have a match...
> > +    //
> > +    if (PolicyName[Index] !=3D VariableName[Inde= x] || PolicyName[Index]
> =3D=3D
> > '#') {
> > +      //
> > +      // If this is a numerical wildca= rd, we can consider it a match if
we
> alter
> > +      // the priority.
> > +      //
> > +      if (PolicyName[Index] =3D=3D L'#= ' &&
> > +          &nb= sp; ((L'0' <=3D VariableName[Index] && VariableName[Index] <= =3D
> L'9') ||
> > +          &nb= sp;  (L'A' <=3D VariableName[Index] && VariableName[Index] = <=3D
> L'F') ||
> > +          &nb= sp;  (L'a' <=3D VariableName[Index] && VariableName[Index] = <=3D
> L'f'))) {
> > +        if (CalculatedPriori= ty < MATCH_PRIORITY_MIN) {
> > +          Calculat= edPriority++;
> > +        }
> > +      //
> > +      // Otherwise, not a match.
> > +      //
> > +      } else {
> > +        Result =3D FALSE; > > +        goto Exit;
> > +      }
> > +    }
> > +    Index++;
> > +  }
> > +
> > +Exit:
> > +  if (Result && MatchPriority !=3D NULL) {
> > +    *MatchPriority =3D CalculatedPriority;
> > +  }
> > +  return Result;
> > +}
> > +
> > +/**
> > +  This helper function walks the current policy table and = returns a
> > +pointer
> > +  to the best match, if any are found. Leverages EvaluateP= olicyMatch()
> > +to
> > +  determine "best".
> > +
> > +  @param[in]  PolicyTable    &nbs= p; Pointer to current policy table.
> > +  @param[in]  PolicyTableSize  Size of current p= olicy table.
> > +  @param[in]  VariableName     Sa= me as EFI_SET_VARIABLE.
> > +  @param[in]  VendorGuid     = ;  Same as EFI_SET_VARIABLE.
> > +  @param[out] ReturnPriority   [Optional] If poi= nter is provided,
return
> the
> > +          &nb= sp;            =         priority of the match. Same as > EvaluatePolicyMatch().
> > +          &nb= sp;            =         Only valid if a match is returne= d.
> > +
> > +  @retval     VARIABLE_POLICY_ENTRY*&n= bsp;   Best match that was
> found.
> > +  @retval     NULL   &n= bsp;            = ;      No match was found.
> > +
> > +**/
> > +STATIC
> > +VARIABLE_POLICY_ENTRY*
> > +GetBestPolicyMatch (
> > +  IN UINT8        =    *PolicyTable,
> > +  IN UINT32        = ;  PolicyTableSize,
> > +  IN CONST CHAR16    *VariableName,
> > +  IN CONST EFI_GUID  *VendorGuid,
> > +  OUT UINT8        = ;  *ReturnPriority  OPTIONAL
> > +  )
> > +{
> > +  VARIABLE_POLICY_ENTRY  *BestResult;
> > +  VARIABLE_POLICY_ENTRY  *CurrentEntry;
> > +  UINT8        &nb= sp;         MatchPriority;
> > +  UINT8        &nb= sp;         CurrentPriority;
> > +
> > +  BestResult =3D NULL;
> > +  MatchPriority =3D MATCH_PRIORITY_EXACT;
> > +
> > +  //
> > +  // Walk all entries in the table, looking for matches. > > +  //
> > +  CurrentEntry =3D (VARIABLE_POLICY_ENTRY*)PolicyTable; > > +  while ((UINTN)CurrentEntry < (UINTN)((UINT8*)PolicyTa= ble +
> > PolicyTableSize)) {
> > +    //
> > +    // Check for a match.
> > +    //
> > +    if (EvaluatePolicyMatch (CurrentEntry, Varia= bleName, VendorGuid,
> > &CurrentPriority)) {
> > +      //
> > +      // If match is better, take it.<= br> > > +      //
> > +      if (BestResult =3D=3D NULL || Cu= rrentPriority < MatchPriority) {
> > +        BestResult =3D Curre= ntEntry;
> > +        MatchPriority =3D Cu= rrentPriority;
> > +      }
> > +
> > +      //
> > +      // If you've hit the highest-pri= ority match, can exit now.
> > +      //
> > +      if (MatchPriority =3D=3D 0) { > > +        break;
> > +      }
> > +    }
> > +
> > +    //
> > +    // If we're still in the loop, move to the n= ext entry.
> > +    //
> > +    CurrentEntry =3D GET_NEXT_POLICY (CurrentEnt= ry);  }
> > +
> > +  //
> > +  // If a return priority was requested, return it.
> > +  //
> > +  if (ReturnPriority !=3D NULL) {
> > +    *ReturnPriority =3D MatchPriority;
> > +  }
> > +
> > +  return BestResult;
> > +}
> > +
> > +/**
> > +  This helper function will dump and walk the current poli= cy tables to
> > +determine
> > +  whether a matching policy already exists that satisfies = the lock
request.
> > +
> > +  @param[in] VariableName  A pointer to the variable = name that is
> being
> > searched.
> > +  @param[in] VendorGuid    A pointer to the= vendor GUID that is being
> > searched.
> > +
> > +  @retval  TRUE   We can safely assume this= variable is locked.
> > +  @retval  FALSE  An error has occurred or we ca= nnot prove that the
> variable
> > is
> > +          &nb= sp;       locked.
> > +
> > +**/
> > +STATIC
> > +BOOLEAN
> > +IsVariableAlreadyLocked (
> > +  IN CHAR16    *VariableName,
> > +  IN EFI_GUID  *VendorGuid
> > +  )
> > +{
> > +  EFI_STATUS       &nbs= p;     Status;
> > +  UINT8        &nb= sp;         *PolicyTable;
> > +  UINT32        &n= bsp;        PolicyTableSize;
> > +  BOOLEAN        &= nbsp;       Result;
> > +  VARIABLE_POLICY_ENTRY  *MatchPolicy;
> > +  UINT8        &nb= sp;         MatchPriority;
> > +
> > +  Result =3D TRUE;
> > +
> > +  //
> > +  // First, we need to dump the existing policy table.
> > +  //
> > +  PolicyTableSize =3D 0;
> > +  PolicyTable =3D NULL;
> > +  Status =3D DumpVariablePolicy (PolicyTable, &PolicyT= ableSize);  if
> > + (Status !=3D EFI_BUFFER_TOO_SMALL) {
> > +    DEBUG ((DEBUG_ERROR, "%a - Failed to de= termine policy table
> > size! %r\n", __FUNCTION__, Status));
> > +    return FALSE;
> > +  }
> > +  PolicyTable =3D AllocateZeroPool (PolicyTableSize); = ; if (PolicyTable =3D=3D
> > + NULL) {
> > +    DEBUG ((DEBUG_ERROR, "%a - Failed to al= located space for policy
> table!
> > 0x%X\n", __FUNCTION__, PolicyTableSize));
> > +    return FALSE;
> > +  }
> > +  Status =3D DumpVariablePolicy (PolicyTable, &PolicyT= ableSize);  if
> > + (EFI_ERROR (Status)) {
> > +    DEBUG ((DEBUG_ERROR, "%a - Failed to du= mp policy table! %r\n",
> > __FUNCTION__, Status));
> > +    Result =3D FALSE;
> > +    goto Exit;
> > +  }
> > +
> > +  //
> > +  // Now we need to walk the table looking for a match. > > +  //
> > +  MatchPolicy =3D GetBestPolicyMatch (
> > +          &nb= sp;       PolicyTable,
> > +          &nb= sp;       PolicyTableSize,
> > +          &nb= sp;       VariableName,
> > +          &nb= sp;       VendorGuid,
> > +          &nb= sp;       &MatchPriority
> > +          &nb= sp;       );
> > +  if (MatchPolicy !=3D NULL && MatchPriority !=3D = MATCH_PRIORITY_EXACT)
> {
> > +    DEBUG ((DEBUG_ERROR, "%a - We would not= have expected a
> non-exact
> > match! %d\n", __FUNCTION__, MatchPriority));
> > +    Result =3D FALSE;
> > +    goto Exit;
> > +  }
> > +
> > +  //
> > +  // Now we can check to see whether this variable is curr= ently locked.
> > +  //
> > +  if (MatchPolicy->LockPolicyType !=3D
> VARIABLE_POLICY_TYPE_LOCK_NOW) {
> > +    DEBUG ((DEBUG_INFO, "%a - Policy may no= t lock variable! %d\n",
> > __FUNCTION__, MatchPolicy->LockPolicyType));
> > +    Result =3D FALSE;
> > +    goto Exit;
> > +  }
> > +
> > +Exit:
> > +  if (PolicyTable !=3D NULL) {
> > +    FreePool (PolicyTable);
> > +  }
> > +
> > +  return Result;
> > +}
> >
> >  /**
> >    DEPRECATED. THIS IS ONLY HERE AS A CONVENIENCE= WHILE
> PORTING.
> > -  Mark a variable that will become read-only after leaving= the DXE
phase
> of
> > execution.
> > -  Write request coming from SMM environment through
> > EFI_SMM_VARIABLE_PROTOCOL is allowed.
> > +  Mark a variable that will become read-only after leaving= the DXE
> > + phase of  execution. Write request coming from SMM enviro= nment
> > through
> > + EFI_SMM_VARIABLE_PROTOCOL is allowed.
> >
> >    @param[in] This     &= nbsp;    The VARIABLE_LOCK_PROTOCOL
> instance.
> > -  @param[in] VariableName  A pointer to the variable = name that will be
> > made read-only subsequently.
> > -  @param[in] VendorGuid    A pointer to the= vendor GUID that will be
> made
> > read-only subsequently.
> > +  @param[in] VariableName  A pointer to the variable = name that will be
> > made
> > +          &nb= sp;            =     read-only subsequently.
> > +  @param[in] VendorGuid    A pointer to the= vendor GUID that will be
> made
> > +          &nb= sp;            =     read-only subsequently.
> >
> > -  @retval EFI_SUCCESS      &= nbsp;    The variable specified by the
> VariableName and
> > the VendorGuid was marked
> > -          &nb= sp;            =          as pending to be read-only= .
> > +  @retval EFI_SUCCESS      &= nbsp;    The variable specified by the
> VariableName and
> > +          &nb= sp;            =          the VendorGuid was marked = as
> pending to be
> > +          &nb= sp;            =          read-only.
> >    @retval EFI_INVALID_PARAMETER VariableName or = VendorGuid is
> NULL.
> >           = ;            &n= bsp;          Or VariableName = is an empty
> string.
> > -  @retval EFI_ACCESS_DENIED
> EFI_END_OF_DXE_EVENT_GROUP_GUID
> > or EFI_EVENT_GROUP_READY_TO_BOOT has
> > -          &nb= sp;            =          already been signaled.
> > -  @retval EFI_OUT_OF_RESOURCES  There is not enough r= esource to
> hold
> > the lock request.
> > +  @retval EFI_ACCESS_DENIED
> EFI_END_OF_DXE_EVENT_GROUP_GUID
> > or
> > +
> EFI_EVENT_GROUP_READY_TO_BOOT has already been
> > +          &nb= sp;            =          signaled.
> > +  @retval EFI_OUT_OF_RESOURCES  There is not enough r= esource to
> hold
> > the lock
> > +          &nb= sp;            =          request.
> >  **/
> >  EFI_STATUS
> >  EFIAPI
> >  VariableLockRequestToLock (
> > -  IN CONST EDKII_VARIABLE_LOCK_PROTOCOL *This,
> > -  IN       CHAR16  = ;            &n= bsp;        *VariableName,
> > -  IN       EFI_GUID &nb= sp;            =        *VendorGuid
> > +  IN CONST EDKII_VARIABLE_LOCK_PROTOCOL  *This,
> > +  IN CHAR16        = ;            &n= bsp;         *VariableName,
> > +  IN EFI_GUID       &nb= sp;            =         *VendorGuid
> >    )
> >  {
> > -  EFI_STATUS       &nbs= p;      Status;
> > -  VARIABLE_POLICY_ENTRY   *NewPolicy;
> > +  EFI_STATUS       &nbs= p;     Status;
> > +  VARIABLE_POLICY_ENTRY  *NewPolicy;
> > +
> > +  DEBUG ((DEBUG_ERROR, "!!! DEPRECATED INTERFACE !!! = %a() will go
> away
> > + soon!\n", __FUNCTION__));  DEBUG ((DEBUG_ERROR, &quo= t;!!! DEPRECATED
> > + INTERFACE !!! Please move to use Variable Policy!\n"));&n= bsp; DEBUG
> > + ((DEBUG_ERROR, "!!! DEPRECATED INTERFACE !!! Variable: %g= %s\n",
> > + VendorGuid, VariableName));
> >
> >    NewPolicy =3D NULL;
> > -  Status =3D CreateBasicVariablePolicy( VendorGuid,
> > -          &nb= sp;            =             &nb= sp;  VariableName,
> > -
> VARIABLE_POLICY_NO_MIN_SIZE,
> > -
> VARIABLE_POLICY_NO_MAX_SIZE,
> > -
> VARIABLE_POLICY_NO_MUST_ATTR,
> > -
> VARIABLE_POLICY_NO_CANT_ATTR,
> > -
> VARIABLE_POLICY_TYPE_LOCK_NOW,
> > -          &nb= sp;            =             &nb= sp;  &NewPolicy );
> > +  Status =3D CreateBasicVariablePolicy(
> > +          &nb= sp;  VendorGuid,
> > +          &nb= sp;  VariableName,
> > +          &nb= sp;  VARIABLE_POLICY_NO_MIN_SIZE,
> > +          &nb= sp;  VARIABLE_POLICY_NO_MAX_SIZE,
> > +          &nb= sp;  VARIABLE_POLICY_NO_MUST_ATTR,
> > +          &nb= sp;  VARIABLE_POLICY_NO_CANT_ATTR,
> > +          &nb= sp;  VARIABLE_POLICY_TYPE_LOCK_NOW,
> > +          &nb= sp;  &NewPolicy
> > +          &nb= sp;  );
> >    if (!EFI_ERROR( Status )) {
> > -    Status =3D RegisterVariablePolicy( NewPolicy= );
> > +    Status =3D RegisterVariablePolicy (NewPolicy= );
> > +
> > +    //
> > +    // If the error returned is EFI_ALREADY_STAR= TED, we need to check
> the
> > +    // current database for the variable and see= whether it's locked.
If it's
> > +    // locked, we're still fine, but also genera= te a DEBUG_ERROR
> message so
> > the
> > +    // duplicate lock can be removed.
> > +    //
> > +    if (Status =3D=3D EFI_ALREADY_STARTED) {
> > +      if (IsVariableAlreadyLocked (Var= iableName, VendorGuid)) {
> > +        DEBUG ((DEBUG_ERROR,= "  Variable: %g %s is already
> locked!\n",
> > VendorGuid, VariableName));
> > +        Status =3D EFI_SUCCE= SS;
> > +      }
> > +    }
> >    }
> > -  if (EFI_ERROR( Status )) {
> > +  if (EFI_ERROR (Status)) {
> >      DEBUG(( DEBUG_ERROR, "%a - Fa= iled to lock variable %s! %r\n",
> > __FUNCTION__, VariableName, Status ));
> > -    ASSERT_EFI_ERROR( Status );
> >    }
> >    if (NewPolicy !=3D NULL) {
> >      FreePool( NewPolicy );
> > --
> > 2.29.2.windows.2
> >
> >
> >
> >
> >



--_000_CY4PR21MB0151DAA16A0E0F30F33E1BA5EFCB1CY4PR21MB0151namp_--