From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1K6A9W-0007FW-O3 for mharc-grub-devel@gnu.org; Tue, 10 Jun 2008 16:09:10 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1K6A9U-0007FE-Mc for grub-devel@gnu.org; Tue, 10 Jun 2008 16:09:08 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1K6A9T-0007F2-Mc for grub-devel@gnu.org; Tue, 10 Jun 2008 16:09:08 -0400 Received: from [199.232.76.173] (port=60694 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1K6A9T-0007Ez-Id for grub-devel@gnu.org; Tue, 10 Jun 2008 16:09:07 -0400 Received: from fg-out-1718.google.com ([72.14.220.155]:54137) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1K6A9S-0007Bk-L4 for grub-devel@gnu.org; Tue, 10 Jun 2008 16:09:07 -0400 Received: by fg-out-1718.google.com with SMTP id l26so2401823fgb.30 for ; Tue, 10 Jun 2008 13:09:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:subject:from:to:content-type :date:message-id:mime-version:x-mailer; bh=VDp2LAIEiWgd52F2U3HWqEm2AkabEFMnpKmyyWA3W8s=; b=S2i60Q6QfKrzQjVtngCRtCfoUyxQ0RfYg/hJUiDvf/zx3aowxTwab0d9/M3gYX6bOT UKXVoBpOxyOKOVOtmn8r/HCpwfwli2E9I4MBK0YG1UMhUjFBNEqf/U2FlTqG4K+NeO6k cM6ed8c+ZvRoCcAsNzDRagzp3pEBpQLHYzSLE= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=subject:from:to:content-type:date:message-id:mime-version:x-mailer; b=kQGGeQk+tXrx9k9sffCPBQW3vvqGWnp0/6rPssBEQFEGHpdDIjA/I0n0N64W+VqlP4 FSy14xx2zVkFH8h2fdblu5uPJlaqy+Cj3zbz3py+AAVuVgpYVVHgoTiMZ2/KNi/T+cOa 7wSS2ZGTLuyjzh1SJ4jTXDix3m6QpbwkqKCQU= Received: by 10.86.80.17 with SMTP id d17mr6218054fgb.24.1213128544503; Tue, 10 Jun 2008 13:09:04 -0700 (PDT) Received: from ?192.168.1.101? ( [213.37.137.93]) by mx.google.com with ESMTPS id 12sm14787240fgg.0.2008.06.10.13.09.00 (version=SSLv3 cipher=RC4-MD5); Tue, 10 Jun 2008 13:09:03 -0700 (PDT) From: Javier =?ISO-8859-1?Q?Mart=EDn?= To: grub-devel@gnu.org Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=-cF7/JLhKgknQMw7GddBc" Date: Tue, 10 Jun 2008 22:09:11 +0200 Message-Id: <1213128551.1287.17.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.22.2 X-detected-kernel: by monty-python.gnu.org: Linux 2.6 (newer, 2) Subject: [PATCH] Drivemap module X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 10 Jun 2008 20:09:08 -0000 --=-cF7/JLhKgknQMw7GddBc Content-Type: multipart/mixed; boundary="=-4zITQUI9eMWlg/wku6+S" --=-4zITQUI9eMWlg/wku6+S Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Since the last posts in the "reimplementing the legacy map command" thread seemingly died silently, I'm sending the improved version of the patch here. If the death of the thread was intentional, please just tell me (either nicely or rudely) and I'll be off. Recapitulating the other thread, this is a new module for x86-pc that provides functionality similar to the legacy "map" command, i.e. allows BIOS drives to be remapped and have the second HD appear as 0x80 (the first), which is necessary because some OSes refuse to boot otherwise, ignoring the "boot drive" passed to their loaders in DL (Windows XP and other NTs); or can only boot with limited functionality (FreeDOS). The syntax of this new command is similar to the old "map", though the second argument must be the target BIOS drive number instead of a GRUB device, though a hack-patch parsing them would be simple. Regarding the objections raised by Vesa, I followed most of the advices, removing chatter in the source and completely separating drivemap from the kernel. However, I've left the "abort_on_error" part of the new preboot-hook interface intact, mostly because I don't know how to replace it. As drivemap is the only module using it, the problem should be harmless for now, but a solution should be devised - not by me, though, finals are here (literally, I had one today). I hope I didn't leave anything out this time. This code has been tested on the following situations: * Emulators: Bochs & QEMU, booting FreeDOS in (hd1) with another fat partition in (hd0) - works wonderfully, and even allows access to both drives if they are crossmapped and a faux root=3D(hd0) is set. * Real hardware: an Athlon64 (939) CPU on a Gigabyte motherboard, booting Windows XP Pro x64 in (hd1) with Ubuntu in (hd0) - works too, with no hacks required at all (by the way, booting XP was my reason to do this). Well, here it is. Have a nice day! Habbit --=-4zITQUI9eMWlg/wku6+S Content-Disposition: attachment; filename=drivemap.patch Content-Type: text/x-patch; name=drivemap.patch; charset=UTF-8 Content-Transfer-Encoding: base64 SW5kZXg6IGNvbW1hbmRzL2kzODYvcGMvZHJpdmVtYXAuYw0KPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6 IGNvbW1hbmRzL2kzODYvcGMvZHJpdmVtYXAuYw0KZGlmZiAtTiBjb21tYW5kcy9pMzg2L3BjL2Ry aXZlbWFwLmMNCi0tLSAvZGV2L251bGwJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMA0KKysrIGNv bW1hbmRzL2kzODYvcGMvZHJpdmVtYXAuYwkxMCBKdW4gMjAwOCAyMDowMjoxOSAtMDAwMA0KQEAg LTAsMCArMSwzNDggQEANCisvKiBkcml2ZW1hcC5jIC0gY29tbWFuZCB0byBtYW5hZ2UgdGhlIEJJ T1MgZHJpdmUgbWFwcGluZ3MuICAqLw0KKy8qDQorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVk IEJvb3Rsb2FkZXINCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb24sIEluYy4NCisgKg0KKyAqICBHUlVCIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCisgKiAgdGhlIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwg b3INCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisgKg0KKyAqICBH UlVCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQor ICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh cnJhbnR5IG9mDQorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y IG1vcmUgZGV0YWlscy4NCisgKg0KKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5 IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKyAqICBhbG9uZyB3aXRoIEdSVUIu ICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uDQorICovDQorDQor I2luY2x1ZGUgPGdydWIvbm9ybWFsLmg+DQorI2luY2x1ZGUgPGdydWIvZGwuaD4NCisjaW5jbHVk ZSA8Z3J1Yi9tbS5oPg0KKyNpbmNsdWRlIDxncnViL21pc2MuaD4NCisjaW5jbHVkZSA8Z3J1Yi9k aXNrLmg+DQorI2luY2x1ZGUgPGdydWIvbG9hZGVyLmg+DQorI2luY2x1ZGUgPGdydWIvbWFjaGlu ZS9sb2FkZXIuaD4NCisjaW5jbHVkZSA8Z3J1Yi9tYWNoaW5lL2Jpb3NkaXNrLmg+DQorDQorLyog VW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byBlbmFibGUgZGVidWdnaW5nIG91dHB1dCAq Lw0KKy8qICNkZWZpbmUgRFJJVkVNQVBfREVCVUcgKi8NCisNCisjaWZkZWYgRFJJVkVNQVBfREVC VUcNCisjIGRlZmluZSBEQkdfUFJJTlRGKC4uLikgZ3J1Yl9wcmludGYoX19WQV9BUkdTX18pDQor I2Vsc2UNCisjIGRlZmluZSBEQkdfUFJJTlRGKC4uLikNCisjZW5kaWYNCisNCitzdGF0aWMgY29u c3Qgc3RydWN0IGdydWJfYXJnX29wdGlvbiBvcHRpb25zW10gPQ0KKyAgew0KKyAgICB7Imxpc3Qi LCAnbCcsIDAsICJzaG93IHRoZSBjdXJyZW50IG1hcHBpbmdzIiwgMCwgMH0sDQorICAgIHsicmVz ZXQiLCAncicsIDAsICJyZXNldCBhbGwgbWFwcGluZ3MgdG8gdGhlIGRlZmF1bHQgdmFsdWVzIiwg MCwgMH0sDQorICAgIHswLCAwLCAwLCAwLCAwLCAwfQ0KKyAgfTsNCisNCisvKiBBU1NFTUJMWSBT WU1CT0xTL1ZBUlMvRlVOQ1MgLSBzdGFydCAqLw0KKw0KKy8qIHJlYWxtb2RlIGZhciBwdHIgPSAy ICogMTZiICovDQorZXh0ZXJuIGdydWJfdWludDMyX3QgRVhQT1JUX1ZBUihncnViX2RyaXZlbWFw X2ludDEzX29sZGhhbmRsZXIpOw0KKy8qIFNpemUgb2YgdGhlIHNlY3Rpb24gdG8gYmUgY29waWVk ICovDQorZXh0ZXJuIGdydWJfdWludDE2X3QgRVhQT1JUX1ZBUihncnViX2RyaXZlbWFwX2ludDEz X3NpemUpOw0KKw0KKy8qIE5PVCBhIHR5cG8gLSBqdXN0IG5lZWQgdGhlIHN5bWJvbCdzIGFkZHJl c3Mgd2l0aCAmc3ltYm9sICovDQordHlwZWRlZiB2b2lkIGdydWJfc3ltYm9sX3Q7DQorZXh0ZXJu IGdydWJfc3ltYm9sX3QgRVhQT1JUX1ZBUihncnViX2RyaXZlbWFwX2ludDEzX2hhbmRsZXJfYmFz ZSk7DQorZXh0ZXJuIGdydWJfc3ltYm9sX3QgRVhQT1JUX1ZBUihncnViX2RyaXZlbWFwX2ludDEz X21hcHN0YXJ0KTsNCisNCit2b2lkIEVYUE9SVF9GVU5DKGdydWJfZHJpdmVtYXBfaW50MTNfaGFu ZGxlcikodm9pZCk7DQorDQorLyogQVNTRU1CTFkgU1lNQk9MUy9WQVJTL0ZVTkNTIC0gZW5kICov DQorDQorc3RhdGljIGdydWJfcHJlYm9vdF9ob29raWQgaW5zdGhhbmRsZXJfaG9vayA9IDA7DQor DQordHlwZWRlZiBzdHJ1Y3QgZHJpdmVtYXBfbm9kZQ0KK3sNCisgIGdydWJfdWludDhfdCBuZXdk cml2ZTsNCisgIGdydWJfdWludDhfdCByZWRpcnRvOw0KKyAgc3RydWN0IGRyaXZlbWFwX25vZGUg Km5leHQ7DQorfSBkcml2ZW1hcF9ub2RlX3Q7DQorDQorc3RhdGljIGRyaXZlbWFwX25vZGVfdCAq ZHJpdmVtYXAgPSAwOw0KK3N0YXRpYyBncnViX2Vycl90IGRyaXZlbWFwX2luc3RhbGxfaW50MTNf aGFuZGxlcih2b2lkKTsNCisNCitzdGF0aWMgZ3J1Yl9lcnJfdA0KK2RyaXZlbWFwX3NldCAoZ3J1 Yl91aW50OF90IG5ld2RyaXZlLCBncnViX3VpbnQ4X3QgcmVkaXJ0bykNCisgIC8qIFB1dHMgdGhl IHNwZWNpZmllZCBtYXBwaW5nIGludG8gdGhlIHRhYmxlLCByZXBsYWNpbmcgYW4gZXhpc3Rpbmcg bWFwcGluZw0KKyAgICogZm9yIG5ld2RyaXZlIG9yIGFkZGluZyBhIG5ldyBvbmUgaWYgcmVxdWly ZWQuICovDQorew0KKyAgZHJpdmVtYXBfbm9kZV90ICptYXBwaW5nID0gMCwgKnNlYXJjaCA9IGRy aXZlbWFwOw0KKyAgd2hpbGUgKHNlYXJjaCkNCisgICAgew0KKyAgICAgIGlmIChzZWFyY2gtPm5l d2RyaXZlID09IG5ld2RyaXZlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBtYXBwaW5nID0gc2Vh cmNoOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICBzZWFyY2ggPSBzZWFy Y2gtPm5leHQ7DQorICAgIH0NCisNCisgIGlmIChtYXBwaW5nKSAgLyogVGhlcmUgd2FzIGEgbWFw cGluZyBhbHJlYWR5IGluIHBsYWNlLCBtb2RpZnkgaXQgKi8NCisgICAgbWFwcGluZy0+cmVkaXJ0 byA9IHJlZGlydG87DQorICBlbHNlICAvKiBDcmVhdGUgYSBuZXcgbWFwcGluZyBhbmQgYWRkIGl0 IHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0ICovDQorICAgIHsNCisgICAgICBtYXBwaW5nID0gZ3J1 Yl9tYWxsb2MgKHNpemVvZiAoZHJpdmVtYXBfbm9kZV90KSk7DQorICAgICAgaWYgKCFtYXBwaW5n KQ0KKyAgICAgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX09VVF9PRl9NRU1PUlksICJj YW5ub3QgYWxsb2NhdGUgbWFwIGVudHJ5Iik7DQorICAgICAgbWFwcGluZy0+bmV3ZHJpdmUgPSBu ZXdkcml2ZTsNCisgICAgICBtYXBwaW5nLT5yZWRpcnRvID0gcmVkaXJ0bzsNCisgICAgICBtYXBw aW5nLT5uZXh0ID0gZHJpdmVtYXA7DQorICAgICAgZHJpdmVtYXAgPSBtYXBwaW5nOw0KKyAgICB9 DQorICByZXR1cm4gR1JVQl9FUlJfTk9ORTsNCit9DQorDQorc3RhdGljIHZvaWQNCitkcml2ZW1h cF9yZW1vdmUgKGdydWJfdWludDhfdCBuZXdkcml2ZSkNCisgIC8qIFJlbW92ZXMgdGhlIG1hcHBp bmcgZm9yIG5ld2RyaXZlIGZyb20gdGhlIHRhYmxlLiBJZiB0aGVyZSBpcyBubyBtYXBwaW5nLA0K KyAgICogdGhlbiB0aGlzIGZ1bmN0aW9uIGJlaGF2ZXMgbGlrZSBhIG5vLW9wIG9uIHRoZSBtYXAu ICovDQorew0KKyAgZHJpdmVtYXBfbm9kZV90ICptYXBwaW5nID0gMCwgKnNlYXJjaCA9IGRyaXZl bWFwLCAqcHJldmlvdXMgPSAwOw0KKyAgd2hpbGUgKHNlYXJjaCkNCisgICAgew0KKyAgICAgIGlm IChzZWFyY2gtPm5ld2RyaXZlID09IG5ld2RyaXZlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBt YXBwaW5nID0gc2VhcmNoOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICBw cmV2aW91cyA9IHNlYXJjaDsNCisgICAgICBzZWFyY2ggPSBzZWFyY2gtPm5leHQ7DQorICAgIH0N CisgIGlmIChtYXBwaW5nKSAvKiBGb3VuZCAqLw0KKyAgICB7DQorICAgICAgaWYgKHByZXZpb3Vz KQ0KKyAgICAgICAgcHJldmlvdXMtPm5leHQgPSBtYXBwaW5nLT5uZXh0Ow0KKyAgICAgIGVsc2Ug ZHJpdmVtYXAgPSBtYXBwaW5nLT5uZXh0OyAvKiBFbnRyeSB3YXMgaGVhZCBvZiBsaXN0ICovDQor ICAgICAgZ3J1Yl9mcmVlIChtYXBwaW5nKTsNCisgICAgfQ0KK30NCisNCitzdGF0aWMgZ3J1Yl9l cnJfdCBwYXJzZV9iaW9zZGlzayAoY29uc3QgY2hhciAqbmFtZSwgZ3J1Yl91aW50OF90ICpkaXNr bnVtKQ0KK3sNCisgIGlmICghbmFtZSkgcmV0dXJuIEdSVUJfRVJSX0JBRF9BUkdVTUVOVDsNCisg IGlmIChuYW1lWzBdID09ICcoJykNCisgICAgbmFtZSsrOyAvKiBTa2lwIHRoZSBmaXJzdCAoIGlu IChoZDApIC0gZGlza19vcGVuIHdhbnRzIGp1c3QgdGhlIG5hbWUhICovDQorICBncnViX2Rpc2tf dCBkaXNrID0gZ3J1Yl9kaXNrX29wZW4gKG5hbWUpOw0KKyAgaWYgKCFkaXNrKQ0KKyAgICByZXR1 cm4gR1JVQl9FUlJfVU5LTk9XTl9ERVZJQ0U7DQorICBlbHNlDQorICAgIHsNCisgICAgICBlbnVt IGdydWJfZGlza19kZXZfaWQgaWQgPSBkaXNrLT5kZXYtPmlkOw0KKyAgICAgIGlmIChkaXNrbnVt KQ0KKyAgICAgICAgKmRpc2tudW0gPSBkaXNrLT5pZDsgICAvKiBPbmx5IHZhbGlkLCBvZiBjb3Vy c2UgaWYgaXQncyBhIGJpb3NkaXNrICovDQorICAgICAgZ3J1Yl9kaXNrX2Nsb3NlIChkaXNrKTsN CisgICAgICByZXR1cm4gKEdSVUJfRElTS19ERVZJQ0VfQklPU0RJU0tfSUQgIT0gaWQpID8NCisg ICAgICAgICAgR1JVQl9FUlJfQkFEX0RFVklDRSA6IEdSVUJfRVJSX05PTkU7DQorICAgIH0NCit9 DQorDQorc3RhdGljIGdydWJfZXJyX3QgcmV2cGFyc2VfYmlvc2Rpc2soY29uc3QgZ3J1Yl91aW50 OF90IGRudW0sIGNvbnN0IGNoYXIgKipvdXRwdXQpDQorew0KKyAgZ3J1Yl9lcnJfdCByZXR2YWwg PSBHUlVCX0VSUl9VTktOT1dOX0RFVklDRTsNCisgIGF1dG8gaW50IGZpbmQgKGNvbnN0IGNoYXIg Km5hbWUpOw0KKyAgaW50IGZpbmQgKGNvbnN0IGNoYXIgKm5hbWUpDQorICB7DQorICAgIGdydWJf ZGlza190IGRpc2sgPSBncnViX2Rpc2tfb3BlbiAobmFtZSk7DQorICAgIGlmICghZGlzaykNCisg ICAgICByZXR1cm4gMDsNCisgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgIGludCBmb3VuZCA9 IDA7DQorICAgICAgICBpZiAoZG51bSA9PSBkaXNrLT5pZCAmJiBHUlVCX0RJU0tfREVWSUNFX0JJ T1NESVNLX0lEID09IGRpc2stPmRldi0+aWQpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBm b3VuZCA9IDE7DQorICAgICAgICAgICAgKm91dHB1dCA9IG5hbWU7DQorICAgICAgICAgICAgcmV0 dmFsID0gR1JVQl9FUlJfTk9ORTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgZ3J1Yl9kaXNrX2Ns b3NlIChkaXNrKTsNCisgICAgICAgIHJldHVybiBmb3VuZDsNCisgICAgICB9DQorICB9DQorDQor ICBncnViX2Rpc2tfZGV2X2l0ZXJhdGUgKCZmaW5kKTsNCisgIHJldHVybiByZXR2YWw7DQorfQ0K Kw0KK3N0YXRpYyBncnViX2Vycl90DQorZ3J1Yl9jbWRfZHJpdmVtYXAgKHN0cnVjdCBncnViX2Fy Z19saXN0ICpzdGF0ZSwgaW50IGFyZ2MsIGNoYXIgKiphcmdzKQ0KK3sNCisgIGlmIChzdGF0ZVsw XS5zZXQpIC8qIFNob3c6IGxpc3QgbWFwcGluZ3MgKi8NCisgICAgew0KKyAgICAgIGlmICghZHJp dmVtYXApDQorICAgICAgICBncnViX3ByaW50ZiAoIk5vIGRyaXZlcyBoYXZlIGJlZW4gcmVtYXBw ZWQiKTsNCisgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgIGdydWJfcHJpbnRmICgi U2hvd2luZyBvbmx5IHJlbWFwcGVkIGRyaXZlcy4gRHJpdmVzIHRoYXQgaGF2ZSBoYWQgIg0KKyAg ICAgICAgICAgICAgICAgICAgICAgInRoZWlyIHNsb3QgYXNzaWduZWQgdG8gYW5vdGhlciBvbmUg YW5kIGhhdmUgbm90IGJlZW4gIg0KKyAgICAgICAgICAgICAgICAgICAgICAgInRoZW1zZWx2ZXMg cmVtYXBwZWQgd2lsbCBiZWNvbWUgaW5hY2Nlc3NpYmxlIHRocm91Z2ggIg0KKyAgICAgICAgICAg ICAgICAgICAgICAgInRoZSBCSU9TIHJvdXRpbmVzIHRvIHRoZSBib290ZWQgT1MuXG5cbiIpOw0K KyAgICAgICAgICBncnViX3ByaW50ZiAoIk1hcHBlZFx0R1JVQlxuIik7DQorICAgICAgICAgIGRy aXZlbWFwX25vZGVfdCAqY3Vybm9kZSA9IGRyaXZlbWFwOw0KKyAgICAgICAgICB3aGlsZSAoY3Vy bm9kZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICBjb25zdCBjaGFyICpkbmFtZSA9 IDA7DQorICAgICAgICAgICAgICBncnViX2Vycl90IGVyciA9IHJldnBhcnNlX2Jpb3NkaXNrIChj dXJub2RlLT5yZWRpcnRvLCAmZG5hbWUpOw0KKyAgICAgICAgICAgICAgaWYgKGVyciAhPSBHUlVC X0VSUl9OT05FKQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gZ3J1Yl9lcnJvciAoZXJyLCAiaW52 YWxpZCBtYXBwaW5nOiBub24tZXhpc3RlbnQgZGlzayBvciINCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIm5vdCBtYW5hZ2VkIGJ5IHRoZSBCSU9TIik7DQorICAgICAg ICAgICAgICBncnViX3ByaW50ZigiMHglMDJ4XHQlNHNcbiIsIGN1cm5vZGUtPm5ld2RyaXZlLCBk bmFtZSk7DQorICAgICAgICAgICAgICBjdXJub2RlID0gY3Vybm9kZS0+bmV4dDsNCisgICAgICAg ICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgIGVsc2UgaWYgKHN0YXRlWzFdLnNldCkgLyog UmVzZXQ6IGp1c3QgZGVsZXRlIGFsbCBtYXBwaW5ncyAqLw0KKyAgICB7DQorICAgICAgaWYgKGRy aXZlbWFwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBkcml2ZW1hcF9ub2RlX3QgKmN1cm5vZGUg PSBkcml2ZW1hcCwgKnByZXZub2RlID0gMDsNCisgICAgICAgICAgd2hpbGUgKGN1cm5vZGUpDQor ICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgcHJldm5vZGUgPSBjdXJub2RlOw0KKyAgICAg ICAgICAgICAgY3Vybm9kZSA9IGN1cm5vZGUtPm5leHQ7DQorICAgICAgICAgICAgICBncnViX2Zy ZWUgKHByZXZub2RlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIGRyaXZlbWFwID0gMDsN CisgICAgICAgIH0NCisgICAgfQ0KKyAgZWxzZQ0KKyAgICB7DQorICAgICAgaWYgKGFyZ2MgIT0g MikNCisgICAgICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfQVJHVU1FTlQsICJ0 d28gYXJndW1lbnRzIHJlcXVpcmVkIik7DQorICAgICAgZ3J1Yl91aW50OF90IG1hcGZyb20gPSAw Ow0KKyAgICAgIGdydWJfZXJyX3QgZXJyID0gcGFyc2VfYmlvc2Rpc2sgKGFyZ3NbMF0sICZtYXBm cm9tKTsNCisgICAgICBpZiAoZXJyICE9IEdSVUJfRVJSX05PTkUpDQorICAgICAgICByZXR1cm4g Z3J1Yl9lcnJvciAoZXJyLCAiaW52YWxpZCBkaXNrIG9yIG5vdCBtYW5hZ2VkIGJ5IHRoZSBCSU9T Iik7DQorDQorICAgICAgZ3J1Yl9lcnJubyA9IEdSVUJfRVJSX05PTkU7DQorICAgICAgdW5zaWdu ZWQgbG9uZyBtYXB0byA9IGdydWJfc3RydG91bCAoYXJnc1sxXSwgMCwgMCk7DQorICAgICAgaWYg KGdydWJfZXJybm8gIT0gR1JVQl9FUlJfTk9ORSkNCisgICAgICAgIHJldHVybiBncnViX2Vycm9y IChncnViX2Vycm5vLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkJJT1MgZGlzayBudW1i ZXIgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NSIpOw0KKyAgICAgIGVsc2UgaWYgKG1hcHRvID09 IG1hcGZyb20pICAvKiBSZXNldCB0byBkZWZhdWx0ICovICAgICAgDQorICAgICAgICB7DQorICAg ICAgICAgIERCR19QUklOVEYgKCJSZW1vdmluZyB0aGUgbWFwcGluZyBmb3IgJXMgKCUwMngpIiwg YXJnc1swXSwgbWFwZnJvbSk7DQorICAgICAgICAgIGRyaXZlbWFwX3JlbW92ZSAobWFwZnJvbSk7 DQorICAgICAgICB9DQorICAgICAgZWxzZSAgLyogTWFwICovDQorICAgICAgICB7DQorICAgICAg ICAgIERCR19QUklOVEYgKCJNYXBwaW5nICVzICglMDJ4KSB0byAlMDJ4XG4iLCBhcmdzWzBdLCBt YXBmcm9tLCBtYXB0byk7DQorICAgICAgICAgIHJldHVybiBkcml2ZW1hcF9zZXQgKChncnViX3Vp bnQ4X3QpbWFwdG8sIG1hcGZyb20pOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICByZXR1cm4g R1JVQl9FUlJfTk9ORTsNCit9DQorDQordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXyAoKHBh Y2tlZCkpIGludDEzbWFwX25vZGUNCit7DQorICBncnViX3VpbnQ4X3QgZGlza251bTsNCisgIGdy dWJfdWludDhfdCBtYXB0bzsNCit9IGludDEzbWFwX25vZGVfdDsNCisNCisvKiBUaGUgbWluIGFt b3VudCBvZiBtZW0gdGhhdCBtdXN0IHJlbWFpbiBmcmVlIGFmdGVyIGluc3RhbGxpbmcgdGhlIGhh bmRsZXIuDQorICogMzIgS2lCIGlzIGp1c3QgYWJvdmUgMHg3QzAwLTB4N0UwMCwgd2hlcmUgdGhl IGJvb3RzZWN0b3IgaXMgbG9hZGVkLiAgKi8NCisjZGVmaW5lIE1JTl9GUkVFX01FTV9LQiAzMg0K KyNkZWZpbmUgSU5UMTNIX09GRlNFVCh4KSAoICgoZ3J1Yl91aW50OF90KikoeCkpIC0gKChncnVi X3VpbnQ4X3QqKSZncnViX2RyaXZlbWFwX2ludDEzX2hhbmRsZXJfYmFzZSkgKQ0KKyNkZWZpbmUg SU5UMTNIX1JFQkFTRSh4KSAoICh2b2lkKikgKCgoZ3J1Yl91aW50OF90KiloYW5kbGVyX2Jhc2Up ICsgKHgpKSApDQorI2RlZmluZSBJTlQxM0hfVE9ORVdBRERSKHgpIElOVDEzSF9SRUJBU0UoIElO VDEzSF9PRkZTRVQoIHggKSApDQorLyogSW50MTNoIGhhbmRsZXIgaW5zdGFsbGVyIC0gcmVzZXJ2 ZXMgY29udmVudGlvbmFsIG1lbW9yeSBmb3IgdGhlIGhhbmRsZXIsDQorICogY29waWVzIGl0IG92 ZXIgYW5kIHNldHMgdGhlIElWVCBlbnRyeSBmb3IgaW50MTNoLg0KKyAqIFRoaXMgY29kZSByZXN0 cyBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IEdSVUIgZG9lcyBub3QgYWN0aXZhdGUgYW55IGtpbmQg b2YNCisgKiBtZW1vcnkgbWFwcGluZywgc2luY2UgaXQgYWNjZXNzZXMgcmVhbG1vZGUgc3RydWN0 dXJlcyBieSB0aGVpciBhYnNvbHV0ZQ0KKyAqIGFkZHJlc3NlcywgbGlrZSB0aGUgSVZUIGF0IDAg b3IgdGhlIEJEQSBhdCAweDQwMCAqLw0KK3N0YXRpYyBncnViX2Vycl90IGRyaXZlbWFwX2luc3Rh bGxfaW50MTNfaGFuZGxlcih2b2lkKQ0KK3sNCisgIGdydWJfc2l6ZV90IGVudHJpZXMgPSAwOw0K KyAgZHJpdmVtYXBfbm9kZV90ICpjdXJlbnRyeSA9IGRyaXZlbWFwOw0KKyAgd2hpbGUgKGN1cmVu dHJ5KSAgLyogQ291bnQgZW50cmllcyB0byBwcmVwYXJlIGEgY29udGlndW91cyBtYXAgYmxvY2sg Ki8NCisgICAgew0KKyAgICAgIGVudHJpZXMrKzsNCisgICAgICBjdXJlbnRyeSA9IGN1cmVudHJ5 LT5uZXh0Ow0KKyAgICB9DQorICBpZiAoMCA9PSBlbnRyaWVzKQ0KKyAgICB7DQorICAgICAgREJH X1BSSU5URiAoImRyaXZlbWFwOiBObyBkcml2ZXMgcmVtYXBwZWQsIGludDEzaCBoYW5kbGVyIG5v dCBpbnN0YWxsZWQiKTsNCisgICAgICByZXR1cm4gR1JVQl9FUlJfTk9ORTsgIC8qIE5vIG5lZWQg dG8gaW5zdGFsbCB0aGUgaW50MTNoIGhhbmRsZXIgKi8NCisgICAgfQ0KKyAgZWxzZQ0KKyAgICB7 DQorICAgICAgREJHX1BSSU5URiAoImRyaXZlbWFwOiBJbnN0YWxsaW5nIGludDEzaCBoYW5kbGVy Li4uXG4iKTsNCisgICAgICBncnViX3VpbnQzMl90ICppdnRzbG90ID0gKGdydWJfdWludDMyX3Qq KTB4MDAwMDAwNGM7DQorICAgICAgDQorICAgICAgLyogU2F2ZSB0aGUgcG9pbnRlciB0byB0aGUg b2xkIGludDEzaCBoYW5kbGVyICovICAgIA0KKyAgICAgIGdydWJfZHJpdmVtYXBfaW50MTNfb2xk aGFuZGxlciA9ICppdnRzbG90Ow0KKyAgICAgIERCR19QUklOVEYgKCJPbGQgaW50MTMgaGFuZGxl ciBhdCAlMDR4OiUwNHhcbiIsDQorICAgICAgICAgICAgICAgICAgKGdydWJfZHJpdmVtYXBfaW50 MTNfb2xkaGFuZGxlciA+PiAxNikgJiAweDBmZmZmLA0KKyAgICAgICAgICAgICAgICAgIGdydWJf ZHJpdmVtYXBfaW50MTNfb2xkaGFuZGxlciAmIDB4MGZmZmYpOw0KKw0KKyAgICAgIC8qIFJlc2Vy dmUgYSBzZWN0aW9uIG9mIGNvbnZlbnRpb25hbCBtZW1vcnkgYXMgIkJJT1MgbWVtb3J5IiBmb3Ig aGFuZGxlcjoNCisgICAgICAgKiBCREEgb2Zmc2V0IDB4MTMgY29udGFpbnMgdGhlIHRvcCBvZiBz dWNoIG1lbW9yeSAqLw0KKyAgICAgIGdydWJfdWludDE2X3QgKmJwYU1lbUluS2IgPSAoZ3J1Yl91 aW50MTZfdCopMHgwMDAwMDQxMzsNCisgICAgICBEQkdfUFJJTlRGICgiVG9wIG9mIGNvbnZlbnRp b25hbCBtZW1vcnk6ICV1IEtpQlxuIiwgKmJwYU1lbUluS2IpOw0KKyAgICAgIGdydWJfc2l6ZV90 IHRvdGFsU2l6ZSA9IGdydWJfZHJpdmVtYXBfaW50MTNfc2l6ZQ0KKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICArIChlbnRyaWVzICsgMSkgKiBzaXplb2YoaW50MTNtYXBfbm9kZV90KTsNCisg ICAgICBncnViX3VpbnQxNl90IHBheWxvYWRTaXplS2IgPSAodG90YWxTaXplID4+IDEwKSArDQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodG90YWxTaXplICUgMTAyNCkg PT0gMCkgPyAwIDogMSk7DQorICAgICAgaWYgKCgqYnBhTWVtSW5LYiAtIHBheWxvYWRTaXplS2Ip IDwgTUlOX0ZSRUVfTUVNX0tCKQ0KKyAgICAgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJS X09VVF9PRl9NRU1PUlksICJyZWZ1c2luZyB0byBpbnN0YWxsIGludDEzIGhhbmRsZXIsIG5vdCBl bm91Z2ggZnJlZSBtZW1vcnkgYWZ0ZXIiKTsNCisgICAgICBEQkdfUFJJTlRGICgiUGF5bG9hZCBp cyAldSBiIGxvbmcsIHJlc2VydmluZyAldSBLYlxuIiwgdG90YWxTaXplLCBwYXlsb2FkU2l6ZUti KTsNCisgICAgICAqYnBhTWVtSW5LYiAtPSBwYXlsb2FkU2l6ZUtiOw0KKw0KKyAgICAgIC8qIENv cHkgaW50MTNoIGhhbmRsZXIgY2h1bmsgdG8gcmVzZXJ2ZWQgYXJlYSAqLw0KKyAgICAgIGdydWJf dWludDhfdCAqaGFuZGxlcl9iYXNlID0gKGdydWJfdWludDhfdCopKCpicGFNZW1JbktiIDw8IDEw KTsNCisgICAgICBEQkdfUFJJTlRGICgiQ29weWluZyBpbnQxMyBoYW5kbGVyIHRvOiAlcFxuIiwg aGFuZGxlcl9iYXNlKTsNCisgICAgICBncnViX21lbWNweSAoaGFuZGxlcl9iYXNlLCAmZ3J1Yl9k cml2ZW1hcF9pbnQxM19oYW5kbGVyX2Jhc2UsIGdydWJfZHJpdmVtYXBfaW50MTNfc2l6ZSk7DQor DQorICAgICAgLyogQ29weSB0aGUgbWFwcGluZ3MgdG8gdGhlIHJlc2VydmVkIGFyZWEgKi8NCisg ICAgICBjdXJlbnRyeSA9IGRyaXZlbWFwOw0KKyAgICAgIGdydWJfc2l6ZV90IGk7DQorICAgICAg aW50MTNtYXBfbm9kZV90ICpoYW5kbGVyX21hcCA9IChpbnQxM21hcF9ub2RlX3QqKSBJTlQxM0hf VE9ORVdBRERSKCZncnViX2RyaXZlbWFwX2ludDEzX21hcHN0YXJ0KTsNCisgICAgICBEQkdfUFJJ TlRGICgiVGFyZ2V0IG1hcCBhdCAlcCwgY29weWluZyBtYXBwaW5ncy4uLlxuIiwgaGFuZGxlcl9t YXApOw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzICYmIGN1cmVudHJ5OyBpKyssIGN1 cmVudHJ5ID0gY3VyZW50cnktPm5leHQpDQorICAgICAgICB7DQorICAgICAgICAgIGhhbmRsZXJf bWFwW2ldLmRpc2tudW0gPSBjdXJlbnRyeS0+bmV3ZHJpdmU7DQorICAgICAgICAgIGhhbmRsZXJf bWFwW2ldLm1hcHRvID0gY3VyZW50cnktPnJlZGlydG87DQorICAgICAgICAgIERCR19QUklOVEYg KCJcdCMlZDogMHglMDJ4IDwtIDB4JTAyeFxuIiwgaSwgaGFuZGxlcl9tYXBbaV0uZGlza251bSwg aGFuZGxlcl9tYXBbaV0ubWFwdG8pOw0KKyAgICAgICAgfQ0KKyAgICAgIC8qIFNpZ25hbCBlbmQt b2YtbWFwICovDQorICAgICAgaGFuZGxlcl9tYXBbaV0uZGlza251bSA9IDA7DQorICAgICAgaGFu ZGxlcl9tYXBbaV0ubWFwdG8gPSAwOw0KKyAgICAgIERCR19QUklOVEYgKCJcdCMlZDogMHglMDJ4 IDwtIDB4JTAyeCAoZW5kKVxuIiwgaSwgaGFuZGxlcl9tYXBbaV0uZGlza251bSwgaGFuZGxlcl9t YXBbaV0ubWFwdG8pOw0KKw0KKyAgICAgIC8qIEluc3RhbGwgb3VyIGZ1bmN0aW9uIGFzIHRoZSBp bnQxM2ggaGFuZGxlciBpbiB0aGUgSVZUICovDQorICAgICAgZ3J1Yl91aW50MzJfdCBpdnRlbnRy eSA9ICgoZ3J1Yl91aW50MzJfdCloYW5kbGVyX2Jhc2UpIDw8IDEyOyAvKiBTZWdtZW50IGFkZHJl c3MgKi8NCisgICAgICBpdnRlbnRyeSB8PSAoZ3J1Yl91aW50MTZfdCkgSU5UMTNIX09GRlNFVChn cnViX2RyaXZlbWFwX2ludDEzX2hhbmRsZXIpOw0KKyAgICAgIERCR19QUklOVEYgKCJOZXcgaW50 MTMgaGFuZGxlciBJVlQgcG9pbnRlcjogJTA0eDolMDR4XG4iLA0KKyAgICAgICAgICAgICAgICAg IChpdnRlbnRyeSA+PiAxNikgJiAweDBmZmZmLCBpdnRlbnRyeSAmIDB4MGZmZmYpOw0KKyAgICAg ICppdnRzbG90ID0gaXZ0ZW50cnk7DQorICAgICAgDQorICAgICAgcmV0dXJuIEdSVUJfRVJSX05P TkU7DQorICAgIH0NCit9DQorI3VuZGVmIElOVDEzSF9UT05FV0FERFINCisjdW5kZWYgSU5UMTNI X1JFQkFTRQ0KKyN1bmRlZiBJTlQxM0hfT0ZGU0VUDQorDQorR1JVQl9NT0RfSU5JVChkcml2ZW1h cCkNCit7DQorICAodm9pZCltb2Q7CQkJLyogVG8gc3RvcCB3YXJuaW5nLiAqLw0KKyAgZ3J1Yl9y ZWdpc3Rlcl9jb21tYW5kICgiZHJpdmVtYXAiLCBncnViX2NtZF9kcml2ZW1hcCwgR1JVQl9DT01N QU5EX0ZMQUdfQk9USCwNCisJCQkgImRyaXZlbWFwIC1zIHwgLXIgfCAoaGRYKSBuZXdkcml2ZW51 bSIsICJNYW5hZ2UgdGhlIEJJT1MgZHJpdmUgbWFwcGluZ3MiLCBvcHRpb25zKTsNCisgIGluc3Ro YW5kbGVyX2hvb2sgPSBncnViX2xvYWRlcl9yZWdpc3Rlcl9wcmVib290ICgmZHJpdmVtYXBfaW5z dGFsbF9pbnQxM19oYW5kbGVyLCAxKTsNCit9DQorDQorR1JVQl9NT0RfRklOSShkcml2ZW1hcCkN Cit7DQorICBncnViX2xvYWRlcl91bnJlZ2lzdGVyX3ByZWJvb3QgKGluc3RoYW5kbGVyX2hvb2sp Ow0KKyAgaW5zdGhhbmRsZXJfaG9vayA9IDA7DQorICBncnViX3VucmVnaXN0ZXJfY29tbWFuZCAo ImRyaXZlbWFwIik7DQorfQ0KSW5kZXg6IGNvbW1hbmRzL2kzODYvcGMvZHJpdmVtYXBfaW50MTNo LlMNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0NClJDUyBmaWxlOiBjb21tYW5kcy9pMzg2L3BjL2RyaXZlbWFwX2ludDEz aC5TDQpkaWZmIC1OIGNvbW1hbmRzL2kzODYvcGMvZHJpdmVtYXBfaW50MTNoLlMNCi0tLSAvZGV2 L251bGwJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMA0KKysrIGNvbW1hbmRzL2kzODYvcGMvZHJp dmVtYXBfaW50MTNoLlMJMTAgSnVuIDIwMDggMjA6MDI6MTkgLTAwMDANCkBAIC0wLDAgKzEsMTI4 IEBADQorLyoNCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcg0KKyAqICBD b3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMywyMDA1LDIwMDYsMjAwNywyMDA4 IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KKyAqDQorICogIEdSVUIgaXMgZnJlZSBz b2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KKyAqICBpdCB1 bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxp c2hlZCBieQ0KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lv biAzIG9mIHRoZSBMaWNlbnNlLCBvcg0KKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 ZXJzaW9uLg0KKyAqDQorICogIEdSVUIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHVzZWZ1bCwNCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqICBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqDQorICogIFlvdSBzaG91bGQg aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQor ICogIGFsb25nIHdpdGggR1JVQi4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGlj ZW5zZXMvPi4NCisgKi8NCisNCisNCisvKg0KKyAqIE5vdGU6IFRoZXNlIGZ1bmN0aW9ucyBkZWZp bmVkIGluIHRoaXMgZmlsZSBtYXkgYmUgY2FsbGVkIGZyb20gQy4NCisgKiAgICAgICBCZSBjYXJl ZnVsIG9mIHRoYXQgeW91IG11c3Qgbm90IG1vZGlmeSBzb21lIHJlZ2lzdGVycy4gUXVvdGUNCisg KiAgICAgICBmcm9tIGdjYy0yLjk1LjIvZ2NjL2NvbmZpZy9pMzg2L2kzODYuaDoNCisNCisgICAx IGZvciByZWdpc3RlcnMgbm90IGF2YWlsYWJsZSBhY3Jvc3MgZnVuY3Rpb24gY2FsbHMuDQorICAg VGhlc2UgbXVzdCBpbmNsdWRlIHRoZSBGSVhFRF9SRUdJU1RFUlMgYW5kIGFsc28gYW55DQorICAg cmVnaXN0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aG91dCBiZWluZyBzYXZlZC4NCisgICBUaGUg bGF0dGVyIG11c3QgaW5jbHVkZSB0aGUgcmVnaXN0ZXJzIHdoZXJlIHZhbHVlcyBhcmUgcmV0dXJu ZWQNCisgICBhbmQgdGhlIHJlZ2lzdGVyIHdoZXJlIHN0cnVjdHVyZS12YWx1ZSBhZGRyZXNzZXMg YXJlIHBhc3NlZC4NCisgICBBc2lkZSBmcm9tIHRoYXQsIHlvdSBjYW4gaW5jbHVkZSBhcyBtYW55 IG90aGVyIHJlZ2lzdGVycyBhcyB5b3UgbGlrZS4NCisNCisgIGF4LGR4LGN4LGJ4LHNpLGRpLGJw LHNwLHN0LHN0MSxzdDIsc3QzLHN0NCxzdDUsc3Q2LHN0NyxhcmcNCit7ICAxLCAxLCAxLCAwLCAw LCAwLCAwLCAxLCAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEgfQ0KKyAqLw0KKw0K Ky8qDQorICogTm90ZTogR1JVQiBpcyBjb21waWxlZCB3aXRoIHRoZSBvcHRpb25zIC1tcnRkIGFu ZCAtbXJlZ3Bhcm09My4NCisgKiAgICAgICBTbyB0aGUgZmlyc3QgdGhyZWUgYXJndW1lbnRzIGFy ZSBwYXNzZWQgaW4gJWVheCwgJWVkeCwgYW5kICVlY3gsDQorICogICAgICAgcmVzcGVjdGl2ZWx5 LCBhbmQgaWYgYSBmdW5jdGlvbiBoYXMgYSBmaXhlZCBudW1iZXIgb2YgYXJndW1lbnRzDQorICog ICAgICAgYW5kIHRoZSBudW1iZXIgaWYgZ3JlYXRlciB0aGFuIHRocmVlLCB0aGUgZnVuY3Rpb24g bXVzdCByZXR1cm4NCisgKiAgICAgICB3aXRoICJyZXQgJE4iIHdoZXJlIE4gaXMgKCh0aGUgbnVt YmVyIG9mIGFyZ3VtZW50cykgLSAzKSAqIDQuDQorICovDQorDQorLyoNCisgKiAgVGhpcyBpcyB0 aGUgYXJlYSBmb3IgYWxsIG9mIHRoZSBzcGVjaWFsIHZhcmlhYmxlcy4NCisgKi8NCisNCisjaW5j bHVkZSA8Z3J1Yi9zeW1ib2wuaD4NCisNCisjZGVmaW5lIEdSVUJfRFJJVkVNQVBfSU5UMTNIX09G RlNFVCh4KSAoKHgpIC0gZ3J1Yl9kcml2ZW1hcF9pbnQxM19oYW5kbGVyX2Jhc2UpDQorDQorLyog Q29weSBzdGFydHMgaGVyZS4gV2hlbiBkZXBsb3llZCwgdGhpcyBsYWJlbCBtdXN0IGJlIHNlZ21l bnQtYWxpZ25lZCAqLw0KK1ZBUklBQkxFKGdydWJfZHJpdmVtYXBfaW50MTNfaGFuZGxlcl9iYXNl KSAgDQorDQorVkFSSUFCTEUoZ3J1Yl9kcml2ZW1hcF9pbnQxM19vbGRoYW5kbGVyKQ0KKyAgLndv cmQgMHhkZWFkLCAweGJlZWYNCisvKiBEcml2ZW1hcCBtb2R1bGUgLSBJTlQgMTNoIGhhbmRsZXIg LSBCSU9TIEhEIG1hcCAqLw0KKy8qIFdlIG5lZWQgdG8gdXNlIHJlbGF0aXZlIGFkZHJlc3Npbmcs IGFuZCB3aXRoIENTIHRvIHRvcCBpdCBhbGwsIHNpbmNlIHdlDQorICogbXVzdCBtYWtlIGFzIGZl dyBjaGFuZ2VzIHRvIHRoZSByZWdpc3RlcnMgYXMgcG9zc2libGUuIFBpdHkgd2UncmUgbm90IG9u DQorICogYW1kNjQ6IHJJUC1yZWxhdGl2ZSBhZGRyZXNzaW5nIHdvdWxkIG1ha2UgbGlmZSBlYXNp ZXIgaGVyZS4NCisgKi8NCisuY29kZTE2DQorRlVOQ1RJT04oZ3J1Yl9kcml2ZW1hcF9pbnQxM19o YW5kbGVyKQ0KKyAgcHVzaCAlYnANCisgIG1vdiAlc3AsICVicA0KKyAgcHVzaCAlYXggIC8qIFdl J2xsIG5lZWQgaXQgbGF0ZXIgdG8gZGV0ZXJtaW5lIHRoZSB1c2VkIEJJT1MgZnVuY3Rpb24gKi8N CisNCisgIC8qIE1hcCB0aGUgZHJpdmUgbnVtYmVyIChhbHdheXMgaW4gREw/KSAqLw0KKyAgcHVz aCAlYXgNCisgIHB1c2ggJWJ4DQorICBwdXNoICVzaQ0KKyAgbW92ICRHUlVCX0RSSVZFTUFQX0lO VDEzSF9PRkZTRVQoZ3J1Yl9kcml2ZW1hcF9pbnQxM19tYXBzdGFydCksICVieA0KKyAgeG9yICVz aSwgJXNpDQorMTptb3Z3ICVjczooJWJ4LCVzaSksICVheA0KKyAgY21wICVhaCwgJWFsDQorICBq eiAzZiAvKiBEUlY9RFNUID0+IG1hcCBlbmQgLSBkcml2ZSBub3QgcmVtYXBwZWQsIGxlYXZlIERM IGFzLWlzICovDQorICBjbXAgJWRsLCAlYWwNCisgIGp6IDJmIC8qIEZvdW5kIC0gZHJpdmUgcmVt YXBwZWQsIG1vZGlmeSBETCAqLw0KKyAgYWRkICQyLCAlc2kNCisgIGptcCAxYiAvKiBOb3QgZm91 bmQsIGJ1dCBtb3JlIHJlbWFpbmluZywgbG9vcCAgKi8NCisyOm1vdiAlYWgsICVkbA0KKzM6cG9w ICVzaQ0KKyAgcG9wICVieA0KKyAgeGNoZ3cgJWF4LCAtNCglYnApIC8qIFJlY292ZXIgdGhlIG9s ZCBBWCBhbmQgc2F2ZSB0aGUgbWFwIGVudHJ5IGZvciBsYXRlciAqLw0KKyAgDQorICBwdXNoICVi cCAgDQorICAvKiBTaW11bGF0ZSBpbnRlcnJ1cHQgY2FsbDogcHVzaCBmbGFncyBhbmQgZG8gYSBm YXIgY2FsbCBpbiBvcmRlciB0byBzZXQNCisgICAqIHRoZSBzdGFjayB0aGUgd2F5IHRoZSBvbGQg aGFuZGxlciBleHBlY3RzIGl0IHNvIHRoYXQgaXRzIGlyZXQgd29ya3MgKi8NCisgIHB1c2ggNigl YnApDQorICBtb3Z3ICglYnApLCAlYnAgIC8qIFJlc3RvcmUgdGhlIGNhbGxlciBCUCAoaXMgdGhp cyBuZWVkZWQgYW5kL29yIHNlbnNpYmxlPykgKi8NCisgIGxjYWxsIColY3M6R1JVQl9EUklWRU1B UF9JTlQxM0hfT0ZGU0VUKGdydWJfZHJpdmVtYXBfaW50MTNfb2xkaGFuZGxlcikNCisgIHBvcCAl YnAgLyogVGhlIHB1c2hlZCBmbGFncyB3ZXJlIHJlbW92ZWQgYnkgaXJldCAqLw0KKyAgLyogU2V0 IHRoZSBzYXZlZCBmbGFncyB0byB3aGF0IHRoZSBpbnQxM2ggaGFuZGxlciByZXR1cm5lZCAqLw0K KyAgcHVzaCAlYXgNCisgIHB1c2hmDQorICBwb3AgJWF4DQorICBtb3Z3ICVheCwgNiglYnApDQor ICBwb3AgJWF4DQorDQorICAvKiBSZXZlcnNlIG1hcCBhbnkgcmV0dXJuZWQgZHJpdmUgbnVtYmVy IGlmIHRoZSBkYXRhIHJldHVybmVkIGluY2x1ZGVzIGl0Lg0KKyAgICogVGhlIG9ubHkgZnVuYyB0 aGF0IGRvZXMgdGhpcyBzZWVtcyB0byBiZSBvcmlnQUggPSAweDA4LCBidXQgbWFueSBCSU9TDQor ICAgKiByZWZzIHNheSByZXRETCA9ICMgb2YgZHJpdmVzIGNvbm5lY3RlZC4gSG93ZXZlciwgdGhl IEdSVUIgTGVnYWN5IGNvZGUNCisgICAqIHRyZWF0cyB0aGlzIGFzIHRoZSBfZHJpdmUgbnVtYmVy XyBhbmQgInVuZG9lcyIgdGhlIHJlbWFwcGluZy4gVGh1cywNCisgICAqIHRoaXMgc2VjdGlvbiBo YXMgYmVlbiBkaXNhYmxlZCBmb3IgdGVzdGluZyBpZiBpdCdzIHJlcXVpcmVkICovDQorIyAgY21w YiAkMHgwOCwgLTEoJWJwKSAvKiBDYWxsZXIncyBBSCAqLw0KKyMgIGpuZSA0Zg0KKyMgIHB1c2gg JWVzDQorIyAgcHVzaGFsDQorIyAgbW92ICQwLCAlZGkNCisjICBtb3YgJDB4YjgwMCwgJWJ4DQor IyAgbW92ICVieCwgJWVzDQorIyAgeGNoZ3cgJWF4LCAtNCglYnApIC8qIE1hcCBlbnRyeSB1c2Vk ICovDQorIyAgY21wICVhaCwgJWFsICAvKiBEUlY9RFNUID0+IGRyaXZlIG5vdCByZW1hcHBlZCAq Lw0KKyMgIGplIDRmDQorIyAgbW92ICVhaCwgJWRsICAvKiBVbmRvIHJlbWFwICovDQorDQorNDpt b3YgJWJwLCAlc3ANCisgIHBvcCAlYnANCisgIGlyZXQNCisvKiBUaGlzIGxhYmVsIE1VU1QgYmUg YXQgdGhlIGVuZCBvZiB0aGUgY29waWVkIGJsb2NrLCBzaW5jZSB0aGUgaW5zdGFsbGVyIGNvZGUN CisgKiByZXNlcnZlcyBhZGRpdGlvbmFsIHNwYWNlIGZvciBtYXBwaW5ncyBhdCBydW50aW1lIGFu ZCBjb3BpZXMgdGhlbSBvdmVyIGl0ICovDQorLmFsaWduIDINCitWQVJJQUJMRShncnViX2RyaXZl bWFwX2ludDEzX21hcHN0YXJ0KQ0KKyAgLnNwYWNlIDANCisuY29kZTMyIC8qIENvcHkgc3RvcHMg aGVyZSAqLw0KK1ZBUklBQkxFKGdydWJfZHJpdmVtYXBfaW50MTNfc2l6ZSkNCisgIC53b3JkIEdS VUJfRFJJVkVNQVBfSU5UMTNIX09GRlNFVChncnViX2RyaXZlbWFwX2ludDEzX3NpemUpDQorI3Vu ZGVmIEdSVUJfRFJJVkVNQVBfSU5UMTNIX09GRlNFVA0KSW5kZXg6IGNvbmYvaTM4Ni1wYy5ybWsN Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0NClJDUyBmaWxlOiAvc291cmNlcy9ncnViL2dydWIyL2NvbmYvaTM4Ni1wYy5y bWssdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjExOQ0KZGlmZiAtdSAtcCAtcjEuMTE5IGkzODYt cGMucm1rDQotLS0gY29uZi9pMzg2LXBjLnJtawkzMCBNYXkgMjAwOCAwNDoyMDo0NyAtMDAwMAkx LjExOQ0KKysrIGNvbmYvaTM4Ni1wYy5ybWsJMTAgSnVuIDIwMDggMjA6MDI6MjYgLTAwMDANCkBA IC0xNTIsNyArMTUyLDcgQEAgcGtnbGliX01PRFVMRVMgPSBiaW9zZGlzay5tb2QgX2NoYWluLm1v ZA0KIAl2YmUubW9kIHZiZXRlc3QubW9kIHZiZWluZm8ubW9kIHZpZGVvLm1vZCBnZnh0ZXJtLm1v ZCBcDQogCXZpZGVvdGVzdC5tb2QgcGxheS5tb2QgYml0bWFwLm1vZCB0Z2EubW9kIGNwdWlkLm1v ZCBzZXJpYWwubW9kCVwNCiAJYXRhLm1vZCB2Z2EubW9kIG1lbWRpc2subW9kIGpwZWcubW9kIHBu Zy5tb2QgcGNpLm1vZCBsc3BjaS5tb2QgXA0KLQlhb3V0Lm1vZCBfYnNkLm1vZCBic2QubW9kDQor CWFvdXQubW9kIF9ic2QubW9kIGJzZC5tb2QgZHJpdmVtYXAubW9kDQogDQogIyBGb3IgYmlvc2Rp c2subW9kLg0KIGJpb3NkaXNrX21vZF9TT1VSQ0VTID0gZGlzay9pMzg2L3BjL2Jpb3NkaXNrLmMN CkBAIC0zMTksNCArMzE5LDExIEBAIGJzZF9tb2RfU09VUkNFUyA9IGxvYWRlci9pMzg2L2JzZF9u b3JtYWwNCiBic2RfbW9kX0NGTEFHUyA9ICQoQ09NTU9OX0NGTEFHUykNCiBic2RfbW9kX0xERkxB R1MgPSAkKENPTU1PTl9MREZMQUdTKQ0KIA0KKyMgRm9yIGRyaXZlbWFwLm1vZC4NCitkcml2ZW1h cF9tb2RfU09VUkNFUyA9IGNvbW1hbmRzL2kzODYvcGMvZHJpdmVtYXAuYyBcDQorICAgICAgICAg ICAgICAgICAgICAgICBjb21tYW5kcy9pMzg2L3BjL2RyaXZlbWFwX2ludDEzaC5TDQorZHJpdmVt YXBfbW9kX0FTRkxBR1MgPSAkKENPTU1PTl9BU0ZMQUdTKQ0KK2RyaXZlbWFwX21vZF9DRkxBR1Mg PSAkKENPTU1PTl9DRkxBR1MpDQorZHJpdmVtYXBfbW9kX0xERkxBR1MgPSAkKENPTU1PTl9MREZM QUdTKQ0KKw0KIGluY2x1ZGUgJChzcmNkaXIpL2NvbmYvY29tbW9uLm1rDQpJbmRleDogaW5jbHVk ZS9ncnViL2xvYWRlci5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL3NvdXJjZXMvZ3J1Yi9ncnVi Mi9pbmNsdWRlL2dydWIvbG9hZGVyLmgsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjkNCmRpZmYg LXUgLXAgLXIxLjkgbG9hZGVyLmgNCi0tLSBpbmNsdWRlL2dydWIvbG9hZGVyLmgJMjEgSnVsIDIw MDcgMjM6MzI6MjIgLTAwMDAJMS45DQorKysgaW5jbHVkZS9ncnViL2xvYWRlci5oCTEwIEp1biAy MDA4IDIwOjAyOjI2IC0wMDAwDQpAQCAtMzcsNiArMzcsMTkgQEAgdm9pZCBFWFBPUlRfRlVOQyhn cnViX2xvYWRlcl9zZXQpIChncnViXw0KIC8qIFVuc2V0IGN1cnJlbnQgbG9hZGVyLCBpZiBhbnku ICAqLw0KIHZvaWQgRVhQT1JUX0ZVTkMoZ3J1Yl9sb2FkZXJfdW5zZXQpICh2b2lkKTsNCiANCit0 eXBlZGVmIHN0cnVjdCBob29rbGlzdF9ub2RlICpncnViX3ByZWJvb3RfaG9va2lkOw0KKw0KKy8q IFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgYm9vdCBob29rLiBS ZXR1cm5zIGFuIGlkIHRoYXQNCisgICBjYW4gYmUgbGF0ZXIgdXNlZCB0byB1bnJlZ2lzdGVyIHRo ZSBwcmVib290IChpLmUuIGlmIG1vZHVsZSB1bmxvYWRlZCkuIElmDQorICAgYWJvcnRfb25fZXJy b3IgaXMgc2V0LCB0aGUgYm9vdCBzZXF1ZW5jZSB3aWxsIGFib3J0IGlmIGFueSBvZiB0aGUgcmVn aXN0ZXJlZA0KKyAgIGZ1bmN0aW9ucyByZXR1cm4gYW55dGhpbmcgZWxzZSB0aGFuIEdSVUJfRVJS X05PTkUgKi8NCitncnViX3ByZWJvb3RfaG9va2lkIEVYUE9SVF9GVU5DKGdydWJfbG9hZGVyX3Jl Z2lzdGVyX3ByZWJvb3QpDQorICAgICAgICAgICAoZ3J1Yl9lcnJfdCAoKmhvb2spICh2b2lkKSwg aW50IGFib3J0X29uX2Vycm9yKTsgDQorDQorLyogVW5yZWdpc3RlciBhIHByZWJvb3QgaG9vayBi eSB0aGUgaWQgcmV0dXJuZWQgYnkgbG9hZGVyX3JlZ2lzdGVyX3ByZWJvb3QuDQorICAgVGhpcyBm dW5jdGlvbnMgYmVjb21lcyBhIG5vLW9wIGlmIG5vIHN1Y2ggZnVuY3Rpb24gaXMgcmVnaXN0ZXJl ZCAqLw0KK3ZvaWQgRVhQT1JUX0ZVTkMoZ3J1Yl9sb2FkZXJfdW5yZWdpc3Rlcl9wcmVib290KSAo Z3J1Yl9wcmVib290X2hvb2tpZCBpZCk7DQorDQogLyogQ2FsbCB0aGUgYm9vdCBob29rIGluIGN1 cnJlbnQgbG9hZGVyLiBUaGlzIG1heSBvciBtYXkgbm90IHJldHVybiwNCiAgICBkZXBlbmRpbmcg b24gdGhlIHNldHRpbmcgYnkgZ3J1Yl9sb2FkZXJfc2V0LiAgKi8NCiBncnViX2Vycl90IEVYUE9S VF9GVU5DKGdydWJfbG9hZGVyX2Jvb3QpICh2b2lkKTsNCkluZGV4OiBrZXJuL2xvYWRlci5jDQo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09DQpSQ1MgZmlsZTogL3NvdXJjZXMvZ3J1Yi9ncnViMi9rZXJuL2xvYWRlci5jLHYN CnJldHJpZXZpbmcgcmV2aXNpb24gMS45DQpkaWZmIC11IC1wIC1yMS45IGxvYWRlci5jDQotLS0g a2Vybi9sb2FkZXIuYwkyMSBKdWwgMjAwNyAyMzozMjoyNiAtMDAwMAkxLjkNCisrKyBrZXJuL2xv YWRlci5jCTEwIEp1biAyMDA4IDIwOjAyOjI3IC0wMDAwDQpAQCAtNjEsMTEgKzYxLDc4IEBAIGdy dWJfbG9hZGVyX3Vuc2V0KHZvaWQpDQogICBncnViX2xvYWRlcl9sb2FkZWQgPSAwOw0KIH0NCiAN CitzdHJ1Y3QgaG9va2xpc3Rfbm9kZQ0KK3sNCisgIGdydWJfZXJyX3QgKCpob29rKSAodm9pZCk7 DQorICBpbnQgYWJvcnRfb25fZXJyb3I7DQorICBzdHJ1Y3QgaG9va2xpc3Rfbm9kZSAqbmV4dDsN Cit9Ow0KKw0KK3N0YXRpYyBzdHJ1Y3QgaG9va2xpc3Rfbm9kZSAqcHJlYm9vdF9ob29rcyA9IDA7 DQorDQorZ3J1Yl9wcmVib290X2hvb2tpZA0KK2dydWJfbG9hZGVyX3JlZ2lzdGVyX3ByZWJvb3Qo Z3J1Yl9lcnJfdCAoKmhvb2spICh2b2lkKSwgaW50IGFib3J0X29uX2Vycm9yKQ0KK3sNCisgIGlm ICgwID09IGhvb2spDQorICAgIHsNCisgICAgICBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfQVJH VU1FTlQsICJwcmVib290IGhvb29rIG11c3Qgbm90IGJlIG51bGwiKTsNCisgICAgICByZXR1cm4g MDsNCisgICAgfQ0KKyAgZ3J1Yl9wcmVib290X2hvb2tpZCBuZXdlbnRyeSA9IGdydWJfbWFsbG9j IChzaXplb2YgKHN0cnVjdCBob29rbGlzdF9ub2RlKSk7DQorICBpZiAoIW5ld2VudHJ5KQ0KKyAg ICB7DQorICAgICAgZ3J1Yl9lcnJvciAoR1JVQl9FUlJfT1VUX09GX01FTU9SWSwgImNhbm5vdCBh bGxvYyBhIGhvb2tpbmZvIHN0cnVjdHVyZSIpOw0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQor ICBlbHNlDQorICAgIHsNCisgICAgICBuZXdlbnRyeS0+aG9vayA9IGhvb2s7DQorICAgICAgbmV3 ZW50cnktPmFib3J0X29uX2Vycm9yID0gYWJvcnRfb25fZXJyb3I7DQorICAgICAgbmV3ZW50cnkt Pm5leHQgPSBwcmVib290X2hvb2tzOw0KKyAgICAgIHByZWJvb3RfaG9va3MgPSBuZXdlbnRyeTsN CisgICAgICByZXR1cm4gbmV3ZW50cnk7DQorICAgIH0NCit9DQorDQordm9pZA0KK2dydWJfbG9h ZGVyX3VucmVnaXN0ZXJfcHJlYm9vdChncnViX3ByZWJvb3RfaG9va2lkIGlkKQ0KK3sNCisgIGlm ICgwID09IGlkKQ0KKyAgICByZXR1cm47DQorICBncnViX3ByZWJvb3RfaG9va2lkIGVudHJ5ID0g MCwgc2VhcmNoID0gcHJlYm9vdF9ob29rcywgcHJldmlvdXMgPSAwOw0KKyAgd2hpbGUgKHNlYXJj aCkNCisgICAgew0KKyAgICAgIGlmIChzZWFyY2ggPT0gaWQpDQorICAgICAgICB7DQorICAgICAg ICAgIGVudHJ5ID0gc2VhcmNoOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAg ICBwcmV2aW91cyA9IHNlYXJjaDsNCisgICAgICBzZWFyY2ggPSBzZWFyY2gtPm5leHQ7DQorICAg IH0NCisgIGlmIChlbnRyeSkgLyogRm91bmQgKi8NCisgICAgew0KKyAgICAgIGlmIChwcmV2aW91 cykNCisgICAgICAgIHByZXZpb3VzLT5uZXh0ID0gZW50cnktPm5leHQ7DQorICAgICAgZWxzZSBw cmVib290X2hvb2tzID0gZW50cnktPm5leHQ7IC8qIEVudHJ5IHdhcyBoZWFkIG9mIGxpc3QgKi8N CisgICAgICBncnViX2ZyZWUgKGVudHJ5KTsNCisgICAgfQ0KK30NCisNCiBncnViX2Vycl90DQog Z3J1Yl9sb2FkZXJfYm9vdCAodm9pZCkNCiB7DQogICBpZiAoISBncnViX2xvYWRlcl9sb2FkZWQp DQogICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9OT19LRVJORUwsICJubyBsb2FkZWQg a2VybmVsIik7DQorICANCisgIGdydWJfcHJlYm9vdF9ob29raWQgZW50cnkgPSBwcmVib290X2hv b2tzOw0KKyAgd2hpbGUgKGVudHJ5KQ0KKyAgICB7DQorICAgICAgZ3J1Yl9lcnJfdCByZXRWYWwg PSBlbnRyeS0+aG9vaygpOw0KKyAgICAgIGlmIChyZXRWYWwgIT0gR1JVQl9FUlJfTk9ORSAmJiBl bnRyeS0+YWJvcnRfb25fZXJyb3IpDQorICAgICAgICByZXR1cm4gcmV0VmFsOw0KKyAgICAgIGVu dHJ5ID0gZW50cnktPm5leHQ7DQorICAgIH0NCiANCiAgIGlmIChncnViX2xvYWRlcl9ub3JldHVy bikNCiAgICAgZ3J1Yl9tYWNoaW5lX2ZpbmkgKCk7DQo= --=-4zITQUI9eMWlg/wku6+S-- --=-cF7/JLhKgknQMw7GddBc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Esta parte del mensaje =?ISO-8859-1?Q?est=E1?= firmada digitalmente -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iQIVAwUASE7fZqSl+Fbdeo72AQKHPg/+L+MUjh/hfpgTRoinn9rBHeiykMG1UqJc goBUlvR9BPw79utQSonxWfskHlJqm7OL/NkEwot26TFx+paJo14csqCTCtU7jRsd p9PIsZlf1Jc0GB1SRfble+0DrtbP1ez/oL39ElNmJsdpPJp3GDbd/1+S6PNI6gVD qbCOX6ENigzmeMj5HHTMr9mdgURiOnXB8H3FJNco+g0KbO6aY71bdgTMG3ENcCBh bv7MSzUjdnwQkzJKl2bjmqmC7ze1B4EpIJpZM+QT0laiFbpXZmb8Jl7wfBsHqzcl ZoJa2gxwybplu+XhWEdI+hVTsagyEmtfyCFKHvLtyFHx7C4lSczauvO0xJGVZClz EaVkDyFq96fqsSYqfHN8u7sdu8MUTGjI6TZEiKRjW2itiIFxoEbr+1RaYCn/yAak CgyBEjxKMfEkwmLNXRtRRQXYIxKOPvfZAPBU5vvG2GOK2dC7+zCwC9w3eQN0vP23 phkFHQy8upzUL7i6xkdFaH+XeolkpU1iZQoc2XYdTmISS3zeftA9XsNaSOsjdtCJ 4A5QhUGwhCwh/CTwdAHvi9zrgldKzb444yPfBovVXI+lBwNQvcsvJHkF6zbI5Dyr 0YXvuu90czxHmTjJQ26YIeEb/ldb6i8Lez8OeZ20aX8Y2axpp3frZO+0qkYwwuA8 fkNUPJDmTng= =kK31 -----END PGP SIGNATURE----- --=-cF7/JLhKgknQMw7GddBc--