From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Paul Eggert Newsgroups: gmane.emacs.devel Subject: Re: oops? read/write vs type of length parameter Date: Tue, 12 Apr 2011 22:14:48 -0700 Organization: UCLA Computer Science Department Message-ID: <4DA53148.5000903@cs.ucla.edu> References: <87wrj1jhfc.fsf@rho.meyering.net> <87hba5yq0p.fsf@uwakimon.sk.tsukuba.ac.jp> <834o64sxd7.fsf@gnu.org> <4DA3A7F8.1020503@cs.ucla.edu> <83k4f0qijz.fsf@gnu.org> <4DA3DDCD.10700@cs.ucla.edu> <4DA40AFE.8050406@cs.ucla.edu> <4DA47581.9010509@cs.ucla.edu> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------090206070904030202070406" X-Trace: dough.gmane.org 1302671731 4615 80.91.229.12 (13 Apr 2011 05:15:31 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Wed, 13 Apr 2011 05:15:31 +0000 (UTC) Cc: jim@meyering.net, emacs-devel@gnu.org To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Apr 13 07:15:24 2011 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([140.186.70.17]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Q9sQE-00065E-HN for ged-emacs-devel@m.gmane.org; Wed, 13 Apr 2011 07:15:22 +0200 Original-Received: from localhost ([::1]:54900 helo=lists2.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Q9sQD-00046o-Op for ged-emacs-devel@m.gmane.org; Wed, 13 Apr 2011 01:15:21 -0400 Original-Received: from eggs.gnu.org ([140.186.70.92]:46083) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Q9sQ9-00046j-JH for emacs-devel@gnu.org; Wed, 13 Apr 2011 01:15:19 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Q9sQ7-0004Jn-U6 for emacs-devel@gnu.org; Wed, 13 Apr 2011 01:15:17 -0400 Original-Received: from smtp.cs.ucla.edu ([131.179.128.62]:58868) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Q9sQ4-0004Gx-Fe; Wed, 13 Apr 2011 01:15:13 -0400 Original-Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp.cs.ucla.edu (Postfix) with ESMTP id 7AC7E39E80DB; Tue, 12 Apr 2011 22:15:02 -0700 (PDT) X-Virus-Scanned: amavisd-new at smtp.cs.ucla.edu Original-Received: from smtp.cs.ucla.edu ([127.0.0.1]) by localhost (smtp.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id dmBRITLVrzgG; Tue, 12 Apr 2011 22:15:00 -0700 (PDT) Original-Received: from [192.168.1.10] (pool-71-189-109-235.lsanca.fios.verizon.net [71.189.109.235]) by smtp.cs.ucla.edu (Postfix) with ESMTPSA id 596D439E8083; Tue, 12 Apr 2011 22:15:00 -0700 (PDT) User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.14) Gecko/20110223 Thunderbird/3.1.8 In-Reply-To: <4DA47581.9010509@cs.ucla.edu> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 131.179.128.62 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:138452 Archived-At: This is a multi-part message in MIME format. --------------090206070904030202070406 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit On 04/12/2011 08:53 AM, Paul Eggert wrote: > I can do it, in the next day or two. OK, I did it, by auditing all uses of emacs_read and emacs_write to find and fix all negative buffer sizes. However, instead of negative sizes I found overflows and some other issues, described below; and I therefore now agree with Eli that emacs_write shouldn't use the same signature as POSIX 'write'. However, I also agree with Jim that emacs_write's API need not artificially limit buffer sizes to SSIZE_MAX. Here's the key idea of the attached patch. Since "N = emacs_write (FD, BUF, SIZE)" returns N if successful, and some value less than N if it fails, the caller can easily determine whether it succeeded by testing N == SIZE. So on failure there's no need for emacs_write to return a special value like -1. With this in mind, emacs_write can simply return the number of bytes written, which will always be a size_t value. Jim, this idea is already used by gnulib's full_write function, so there's good precedent for departing from the POSIX signature here. And Eli, this avoids the problem where the size is so large that a signed return value would overflow and become negative. Here are some other bugs in Emacs that I found as part of this audit: * Several places in sound.c attempt to stuff a size into an 'int', which doesn't work. This problem is independent of the above, and its fix is independent of the above too, so it's split into a separate patch in the attached bundle. * send_process attempts to stuff a size into an 'int' as well. This can be fixed by changing one of its local variables from int to size_t. * emacs_gnutls_write has the same issues as emacs_write, and should be fixed the same way. Attached is a bzr bundle of two proposed patches to fix the problem as described above. Comments are welcome. --------------090206070904030202070406 Content-Type: text/plain; name="patch-emacs-write.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="patch-emacs-write.txt" IyBCYXphYXIgbWVyZ2UgZGlyZWN0aXZlIGZvcm1hdCAyIChCYXphYXIgMC45MCkKIyByZXZp c2lvbl9pZDogZWdnZXJ0QGNzLnVjbGEuZWR1LTIwMTEwNDEzMDUwMjU0LWQycHJ2dzNzNXM0 aHVhMWIKIyB0YXJnZXRfYnJhbmNoOiBienIrc3NoOi8vZWdnZXJ0QGJ6ci5zYXZhbm5haC5n bnUub3JnL2VtYWNzL3RydW5rCiMgdGVzdGFtZW50X3NoYTE6IDNlZWI2MGY1OTUwZDgyNjUw ZTNiNzU5MDAxYWZhZWQ1MGYwMmYwNWQKIyB0aW1lc3RhbXA6IDIwMTEtMDQtMTIgMjI6MDI6 NTkgLTA3MDAKIyBiYXNlX3JldmlzaW9uX2lkOiBsZWtrdHVAZ21haWwuY29tLTIwMTEwNDEz MDIxNjQyLTBuMTJvd2IwMml6Mnh3aXEKIyAKIyBCZWdpbiBwYXRjaAo9PT0gbW9kaWZpZWQg ZmlsZSAnc3JjL0NoYW5nZUxvZycKLS0tIHNyYy9DaGFuZ2VMb2cJMjAxMS0wNC0xMiAxMDoy MDozMiArMDAwMAorKysgc3JjL0NoYW5nZUxvZwkyMDExLTA0LTEzIDA1OjAyOjU0ICswMDAw CkBAIC0xLDMgKzEsMjcgQEAKKzIwMTEtMDQtMTMgIFBhdWwgRWdnZXJ0ICA8ZWdnZXJ0QGNz LnVjbGEuZWR1PgorCisJZW1hY3Nfd3JpdGU6IFJldHVybiBzaXplX3QsIG5vdCBzc2l6ZV90 LCB0byBhdm9pZCBvdmVyZmxvdyBpc3N1ZXMuCisJKiBnbnV0bHMuYywgZ251dGxzLmggKGVt YWNzX2dudXRsc193cml0ZSk6IFJldHVybiBzaXplX3QsIG5vdCBzc2l6ZV90LgorCSogc3lz ZGVwLmMsIGxpc3AuaCAoZW1hY3Nfd3JpdGUpOiBMaWtld2lzZS4KKwlXaXRob3V0IHRoZSBh Ym92ZSBjaGFuZ2UsIGVtYWNzX2dudXRsc193cml0ZSBhbmQgZW1hY3Nfd3JpdGUgaGFkCisJ dW5kZWZpbmVkIGJlaGF2aW9yIGFuZCB3b3VsZCB0eXBpY2FsbHkgbWlzdGFrZW5seSByZXBv cnQgYW4gZXJyb3IKKwl3aGVuIHdyaXRpbmcgYSBidWZmZXIgd2hvc2Ugc2l6ZSBleGNlZWRz IFNTSVpFX01BWC4KKwkoZW1hY3NfcmVhZCwgZW1hY3Nfd3JpdGUpOiBSZW1vdmUgY2hlY2sg Zm9yIG5lZ2F0aXZlIHNpemUsIGFzIHRoZQorCUVtYWNzIHNvdXJjZSBjb2RlIGhhcyBiZWVu IGF1ZGl0ZWQgbm93LgorCShlbWFjc193cml0ZSk6IEFkanVzdCB0byBuZXcgc2lnbmF0dXJl LCBtYWtpbmcgdGhlIGNvZGUgbG9vayBtb3JlCisJbGlrZSB0aGF0IG9mIGVtYWNzX2dudXRs c193cml0ZS4KKwkqIHByb2Nlc3MuYyAoc2VuZF9wcm9jZXNzKTogQWRqdXN0IHRvIHRoZSBu ZXcgc2lnbmF0dXJlcyBvZgorCWVtYWNzX3dyaXRlIGFuZCBlbWFjc19nbnV0bHNfd3JpdGUu ICBEbyBub3QgYXR0ZW1wdCB0byBzdG9yZQorCWEgYnl0ZSBvZmZzZXQgaW50byBhbiAnaW50 JzsgaXQgbWlnaHQgb3ZlcmZsb3cuCisKKwkqIHNvdW5kLmM6IERvbid0IGFzc3VtZSBzaXpl cyBmaXQgaW4gJ2ludCcuCisJKHN0cnVjdCBzb3VuZF9kZXZpY2UucGVyaW9kX3NpemUsIGFs c2FfcGVyaW9kX3NpemUpOgorCVJldHVybiBzaXplX3QsIG5vdCBpbnQuCisJKHN0cnVjdCBz b3VuZF9kZXZpY2Uud3JpdGUsIHZveF93cml0ZSwgYWxzYV93cml0ZSk6CisJQWNjZXB0IHNp emVfdCwgbm90IGludC4KKwkod2F2X3BsYXksIGF1X3BsYXkpOiBVc2Ugc2l6ZV90IHRvIHN0 b3JlIHNpemVzLCBhbmQgc3NpemVfdCB0bworCXJlY29yZCByZWFkIHJldHVybiB2YWx1ZXMu CisKIDIwMTEtMDQtMTIgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGxpbnV4LW02OGsub3Jn PgogCiAJKiBjaGFyc2V0LmMgKEZjbGVhcl9jaGFyc2V0X21hcHMpOiBVc2UgeGZyZWUgaW5z dGVhZCBvZiBmcmVlLgoKPT09IG1vZGlmaWVkIGZpbGUgJ3NyYy9nbnV0bHMuYycKLS0tIHNy Yy9nbnV0bHMuYwkyMDExLTA0LTEwIDE0OjAwOjEzICswMDAwCisrKyBzcmMvZ251dGxzLmMJ MjAxMS0wNC0xMyAwNTowMjo1NCArMDAwMApAQCAtNzAsNyArNzAsNyBAQAogICAgIH0KIH0K IAotc3NpemVfdAorc2l6ZV90CiBlbWFjc19nbnV0bHNfd3JpdGUgKGludCBmaWxkZXMsIHN0 cnVjdCBMaXNwX1Byb2Nlc3MgKnByb2MsIGNvbnN0IGNoYXIgKmJ1ZiwKICAgICAgICAgICAg ICAgICAgICAgc2l6ZV90IG5ieXRlKQogewpAQCAtODUsNyArODUsNyBAQAogI2lmZGVmIEVB R0FJTgogICAgIGVycm5vID0gRUFHQUlOOwogI2VuZGlmCi0gICAgcmV0dXJuIC0xOworICAg IHJldHVybiAwOwogICB9CiAKICAgYnl0ZXNfd3JpdHRlbiA9IDA7CkBAIC05OSw3ICs5OSw3 IEBACiAgICAgICAgICAgaWYgKHJ0bnZhbCA9PSBHTlVUTFNfRV9BR0FJTiB8fCBydG52YWwg PT0gR05VVExTX0VfSU5URVJSVVBURUQpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAg ICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gKGJ5dGVzX3dyaXR0ZW4gPyBieXRlc193 cml0dGVuIDogLTEpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAg YnVmICs9IHJ0bnZhbDsKCj09PSBtb2RpZmllZCBmaWxlICdzcmMvZ251dGxzLmgnCi0tLSBz cmMvZ251dGxzLmgJMjAxMS0wNC0xMCAxNDowMDoxMyArMDAwMAorKysgc3JjL2dudXRscy5o CTIwMTEtMDQtMTMgMDU6MDI6NTQgKzAwMDAKQEAgLTUwLDcgKzUwLDcgQEAKIAogI2RlZmlu ZSBHTlVUTFNfTE9HMihsZXZlbCwgbWF4LCBzdHJpbmcsIGV4dHJhKSBpZiAobGV2ZWwgPD0g bWF4KSB7IGdudXRsc19sb2dfZnVuY3Rpb24yIChsZXZlbCwgIihFbWFjcykgIiBzdHJpbmcs IGV4dHJhKTsgfQogCi1zc2l6ZV90CitzaXplX3QKIGVtYWNzX2dudXRsc193cml0ZSAoaW50 IGZpbGRlcywgc3RydWN0IExpc3BfUHJvY2VzcyAqcHJvYywgY29uc3QgY2hhciAqYnVmLAog ICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmJ5dGUpOwogc3NpemVfdAoKPT09IG1vZGlm aWVkIGZpbGUgJ3NyYy9saXNwLmgnCi0tLSBzcmMvbGlzcC5oCTIwMTEtMDQtMTIgMDg6MTI6 MDEgKzAwMDAKKysrIHNyYy9saXNwLmgJMjAxMS0wNC0xMyAwNTowMjo1NCArMDAwMApAQCAt MzM0Nyw3ICszMzQ3LDcgQEAKIGV4dGVybiBpbnQgZW1hY3Nfb3BlbiAoY29uc3QgY2hhciAq LCBpbnQsIGludCk7CiBleHRlcm4gaW50IGVtYWNzX2Nsb3NlIChpbnQpOwogZXh0ZXJuIHNz aXplX3QgZW1hY3NfcmVhZCAoaW50LCBjaGFyICosIHNpemVfdCk7Ci1leHRlcm4gc3NpemVf dCBlbWFjc193cml0ZSAoaW50LCBjb25zdCBjaGFyICosIHNpemVfdCk7CitleHRlcm4gc2l6 ZV90IGVtYWNzX3dyaXRlIChpbnQsIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKIGVudW0geyBS RUFETElOS19CVUZTSVpFID0gMTAyNCB9OwogZXh0ZXJuIGNoYXIgKmVtYWNzX3JlYWRsaW5r IChjb25zdCBjaGFyICosIGNoYXIgW1JFQURMSU5LX0JVRlNJWkVdKTsKICNpZm5kZWYgSEFW RV9NRU1TRVQKCj09PSBtb2RpZmllZCBmaWxlICdzcmMvcHJvY2Vzcy5jJwotLS0gc3JjL3By b2Nlc3MuYwkyMDExLTA0LTEwIDE0OjAwOjEzICswMDAwCisrKyBzcmMvcHJvY2Vzcy5jCTIw MTEtMDQtMTMgMDU6MDI6NTQgKzAwMDAKQEAgLTUzNjcsNiArNTM2Nyw3IEBACiAJICAvKiBT ZW5kIHRoaXMgYmF0Y2gsIHVzaW5nIG9uZSBvciBtb3JlIHdyaXRlIGNhbGxzLiAgKi8KIAkg IHdoaWxlICh0aGlzID4gMCkKIAkgICAgeworCSAgICAgIHNpemVfdCB3cml0dGVuID0gMDsK IAkgICAgICBpbnQgb3V0ZmQgPSBwLT5vdXRmZDsKIAkgICAgICBvbGRfc2lncGlwZSA9ICh2 b2lkICgqKSAoaW50KSkgc2lnbmFsIChTSUdQSVBFLCBzZW5kX3Byb2Nlc3NfdHJhcCk7CiAj aWZkZWYgREFUQUdSQU1fU09DS0VUUwpAQCAtNTM3NSw3ICs1Mzc2LDkgQEAKIAkJICBydiA9 IHNlbmR0byAob3V0ZmQsIGJ1ZiwgdGhpcywKIAkJCSAgICAgICAwLCBkYXRhZ3JhbV9hZGRy ZXNzW291dGZkXS5zYSwKIAkJCSAgICAgICBkYXRhZ3JhbV9hZGRyZXNzW291dGZkXS5sZW4p OwotCQkgIGlmIChydiA8IDAgJiYgZXJybm8gPT0gRU1TR1NJWkUpCisJCSAgaWYgKDAgPD0g cnYpCisJCSAgICB3cml0dGVuID0gcnY7CisJCSAgZWxzZSBpZiAoZXJybm8gPT0gRU1TR1NJ WkUpCiAJCSAgICB7CiAJCSAgICAgIHNpZ25hbCAoU0lHUElQRSwgb2xkX3NpZ3BpcGUpOwog CQkgICAgICByZXBvcnRfZmlsZV9lcnJvciAoInNlbmRpbmcgZGF0YWdyYW0iLApAQCAtNTM4 NywxMiArNTM5MCwxMyBAQAogCQl7CiAjaWZkZWYgSEFWRV9HTlVUTFMKIAkJICBpZiAoWFBS T0NFU1MgKHByb2MpLT5nbnV0bHNfcCkKLQkJICAgIHJ2ID0gZW1hY3NfZ251dGxzX3dyaXRl IChvdXRmZCwKLQkJCQkJICAgICBYUFJPQ0VTUyAocHJvYyksCi0JCQkJCSAgICAgYnVmLCB0 aGlzKTsKKwkJICAgIHdyaXR0ZW4gPSBlbWFjc19nbnV0bHNfd3JpdGUgKG91dGZkLAorCQkJ CQkJIFhQUk9DRVNTIChwcm9jKSwKKwkJCQkJCSBidWYsIHRoaXMpOwogCQkgIGVsc2UKICNl bmRpZgotCQkgICAgcnYgPSBlbWFjc193cml0ZSAob3V0ZmQsIGJ1ZiwgdGhpcyk7CisJCSAg ICB3cml0dGVuID0gZW1hY3Nfd3JpdGUgKG91dGZkLCBidWYsIHRoaXMpOworCQkgIHJ2ID0g KHdyaXR0ZW4gPT0gdGhpcyA/IDAgOiAtMSk7CiAjaWZkZWYgQURBUFRJVkVfUkVBRF9CVUZG RVJJTkcKIAkJICBpZiAocC0+cmVhZF9vdXRwdXRfZGVsYXkgPiAwCiAJCSAgICAgICYmIHAt PmFkYXB0aXZlX3JlYWRfYnVmZmVyaW5nID09IDEpCkBAIC01NDE5LDcgKzU0MjMsNyBAQAog CQkgICAgICAgdGhhdCBtYXkgYWxsb3cgdGhlIHByb2dyYW0KIAkJICAgICAgIHRvIGZpbmlz aCBkb2luZyBvdXRwdXQgYW5kIHJlYWQgbW9yZS4gICovCiAJCSAgICB7Ci0JCSAgICAgIGlu dCBvZmZzZXQgPSAwOworCQkgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKIAogI2lmZGVmIEJS T0tFTl9QVFlfUkVBRF9BRlRFUl9FQUdBSU4KIAkJICAgICAgLyogQSBncm9zcyBoYWNrIHRv IHdvcmsgYXJvdW5kIGEgYnVnIGluIEZyZWVCU0QuCkBAIC01NDY1LDE2ICs1NDY5LDE0IEBA CiAJCQkJCQkJIG9mZnNldCk7CiAJCSAgICAgIGVsc2UgaWYgKFNUUklOR1AgKG9iamVjdCkp CiAJCQlidWYgPSBvZmZzZXQgKyBTU0RBVEEgKG9iamVjdCk7Ci0KLQkJICAgICAgcnYgPSAw OwogCQkgICAgfQogCQkgIGVsc2UKIAkJICAgIC8qIFRoaXMgaXMgYSByZWFsIGVycm9yLiAg Ki8KIAkJICAgIHJlcG9ydF9maWxlX2Vycm9yICgid3JpdGluZyB0byBwcm9jZXNzIiwgRmNv bnMgKHByb2MsIFFuaWwpKTsKIAkJfQotCSAgICAgIGJ1ZiArPSBydjsKLQkgICAgICBsZW4g LT0gcnY7Ci0JICAgICAgdGhpcyAtPSBydjsKKwkgICAgICBidWYgKz0gd3JpdHRlbjsKKwkg ICAgICBsZW4gLT0gd3JpdHRlbjsKKwkgICAgICB0aGlzIC09IHdyaXR0ZW47CiAJICAgIH0K IAl9CiAgICAgfQoKPT09IG1vZGlmaWVkIGZpbGUgJ3NyYy9zb3VuZC5jJwotLS0gc3JjL3Nv dW5kLmMJMjAxMS0wNC0xMiAxMDoyMDozMiArMDAwMAorKysgc3JjL3NvdW5kLmMJMjAxMS0w NC0xMyAwMzoyMjo0MCArMDAwMApAQCAtMjM1LDExICsyMzUsMTEgQEAKIAogICAvKiBSZXR1 cm4gYSBwcmVmZXJyZWQgZGF0YSBzaXplIGluIGJ5dGVzIHRvIGJlIHNlbnQgdG8gd3JpdGUg KGJlbG93KQogICAgICBlYWNoIHRpbWUuICAyMDQ4IGlzIHVzZWQgaWYgdGhpcyBpcyBOVUxM LiAgKi8KLSAgaW50ICgqIHBlcmlvZF9zaXplKSAoc3RydWN0IHNvdW5kX2RldmljZSAqc2Qp OworICBzaXplX3QgKCogcGVyaW9kX3NpemUpIChzdHJ1Y3Qgc291bmRfZGV2aWNlICpzZCk7 CiAKICAgLyogV3JpdGUgTllCVEVTIGJ5dGVzIGZyb20gQlVGRkVSIHRvIGRldmljZSBTRC4g ICovCiAgIHZvaWQgKCogd3JpdGUpIChzdHJ1Y3Qgc291bmRfZGV2aWNlICpzZCwgY29uc3Qg Y2hhciAqYnVmZmVyLAotICAgICAgICAgICAgICAgICAgaW50IG5ieXRlcyk7CisgICAgICAg ICAgICAgICAgICBzaXplX3QgbmJ5dGVzKTsKIAogICAvKiBBIHBsYWNlIGZvciBkZXZpY2Vz IHRvIHN0b3JlIGFkZGl0aW9uYWwgZGF0YS4gICovCiAgIHZvaWQgKmRhdGE7CkBAIC0yOTEs NyArMjkxLDcgQEAKIHN0YXRpYyB2b2lkIHZveF9jbG9zZSAoc3RydWN0IHNvdW5kX2Rldmlj ZSAqc2QpOwogc3RhdGljIHZvaWQgdm94X2Nob29zZV9mb3JtYXQgKHN0cnVjdCBzb3VuZF9k ZXZpY2UgKiwgc3RydWN0IHNvdW5kICopOwogc3RhdGljIGludCB2b3hfaW5pdCAoc3RydWN0 IHNvdW5kX2RldmljZSAqKTsKLXN0YXRpYyB2b2lkIHZveF93cml0ZSAoc3RydWN0IHNvdW5k X2RldmljZSAqLCBjb25zdCBjaGFyICosIGludCk7CitzdGF0aWMgdm9pZCB2b3hfd3JpdGUg KHN0cnVjdCBzb3VuZF9kZXZpY2UgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwogc3RhdGlj IHZvaWQgZmluZF9zb3VuZF90eXBlIChzdHJ1Y3Qgc291bmQgKik7CiBzdGF0aWMgdV9pbnQz Ml90IGxlMmhsICh1X2ludDMyX3QpOwogc3RhdGljIHVfaW50MTZfdCBsZTJocyAodV9pbnQx Nl90KTsKQEAgLTYwMCw5ICs2MDAsOSBAQAogICBlbHNlCiAgICAgewogICAgICAgY2hhciAq YnVmZmVyOwotICAgICAgaW50IG5ieXRlcyA9IDA7Ci0gICAgICBpbnQgYmxrc2l6ZSA9IHNk LT5wZXJpb2Rfc2l6ZSA/IHNkLT5wZXJpb2Rfc2l6ZSAoc2QpIDogMjA0ODsKLSAgICAgIGlu dCBkYXRhX2xlZnQgPSBoZWFkZXItPmRhdGFfbGVuZ3RoOworICAgICAgc3NpemVfdCBuYnl0 ZXMgPSAwOworICAgICAgc2l6ZV90IGJsa3NpemUgPSBzZC0+cGVyaW9kX3NpemUgPyBzZC0+ cGVyaW9kX3NpemUgKHNkKSA6IDIwNDg7CisgICAgICBzaXplX3QgZGF0YV9sZWZ0ID0gaGVh ZGVyLT5kYXRhX2xlbmd0aDsKIAogICAgICAgYnVmZmVyID0gKGNoYXIgKikgYWxsb2NhIChi bGtzaXplKTsKICAgICAgIGxzZWVrIChzLT5mZCwgc2l6ZW9mICpoZWFkZXIsIFNFRUtfU0VU KTsKQEAgLTY5MCw5ICs2OTAsOSBAQAogCSAgICAgICBTQllURVMgKHMtPmRhdGEpIC0gaGVh ZGVyLT5kYXRhX29mZnNldCk7CiAgIGVsc2UKICAgICB7Ci0gICAgICBpbnQgYmxrc2l6ZSA9 IHNkLT5wZXJpb2Rfc2l6ZSA/IHNkLT5wZXJpb2Rfc2l6ZSAoc2QpIDogMjA0ODsKKyAgICAg IHNpemVfdCBibGtzaXplID0gc2QtPnBlcmlvZF9zaXplID8gc2QtPnBlcmlvZF9zaXplIChz ZCkgOiAyMDQ4OwogICAgICAgY2hhciAqYnVmZmVyOwotICAgICAgaW50IG5ieXRlczsKKyAg ICAgIHNzaXplX3QgbmJ5dGVzOwogCiAgICAgICAvKiBTZWVrICovCiAgICAgICBsc2VlayAo cy0+ZmQsIGhlYWRlci0+ZGF0YV9vZmZzZXQsIFNFRUtfU0VUKTsKQEAgLTg5NSwxMCArODk1 LDkgQEAKIC8qIFdyaXRlIE5CWVRFUyBieXRlcyBmcm9tIEJVRkZFUiB0byBkZXZpY2UgU0Qu ICAqLwogCiBzdGF0aWMgdm9pZAotdm94X3dyaXRlIChzdHJ1Y3Qgc291bmRfZGV2aWNlICpz ZCwgY29uc3QgY2hhciAqYnVmZmVyLCBpbnQgbmJ5dGVzKQordm94X3dyaXRlIChzdHJ1Y3Qg c291bmRfZGV2aWNlICpzZCwgY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgbmJ5dGVzKQog ewotICBzc2l6ZV90IG53cml0dGVuID0gZW1hY3Nfd3JpdGUgKHNkLT5mZCwgYnVmZmVyLCBu Ynl0ZXMpOwotICBpZiAobndyaXR0ZW4gPCAwKQorICBpZiAoZW1hY3Nfd3JpdGUgKHNkLT5m ZCwgYnVmZmVyLCBuYnl0ZXMpICE9IG5ieXRlcykKICAgICBzb3VuZF9wZXJyb3IgKCJFcnJv ciB3cml0aW5nIHRvIHNvdW5kIGRldmljZSIpOwogfQogCkBAIC05NTMsNyArOTUyLDcgQEAK ICAgICBhbHNhX3NvdW5kX3BlcnJvciAoZmlsZSwgZXJyKTsKIH0KIAotc3RhdGljIGludAor c3RhdGljIHNpemVfdAogYWxzYV9wZXJpb2Rfc2l6ZSAoc3RydWN0IHNvdW5kX2RldmljZSAq c2QpCiB7CiAgIHN0cnVjdCBhbHNhX3BhcmFtcyAqcCA9IChzdHJ1Y3QgYWxzYV9wYXJhbXMg Kikgc2QtPmRhdGE7CkBAIC0xMTU2LDEzICsxMTU1LDEzIEBACiAvKiBXcml0ZSBOQllURVMg Ynl0ZXMgZnJvbSBCVUZGRVIgdG8gZGV2aWNlIFNELiAgKi8KIAogc3RhdGljIHZvaWQKLWFs c2Ffd3JpdGUgKHN0cnVjdCBzb3VuZF9kZXZpY2UgKnNkLCBjb25zdCBjaGFyICpidWZmZXIs IGludCBuYnl0ZXMpCithbHNhX3dyaXRlIChzdHJ1Y3Qgc291bmRfZGV2aWNlICpzZCwgY29u c3QgY2hhciAqYnVmZmVyLCBzaXplX3QgbmJ5dGVzKQogewogICBzdHJ1Y3QgYWxzYV9wYXJh bXMgKnAgPSAoc3RydWN0IGFsc2FfcGFyYW1zICopIHNkLT5kYXRhOwogCiAgIC8qIFRoZSB0 aGUgdGhpcmQgcGFyYW1ldGVyIHRvIHNuZF9wY21fd3JpdGVpIGlzIGZyYW1lcywgbm90IGJ5 dGVzLiAqLwogICBpbnQgZmFjdCA9IHNuZF9wY21fZm9ybWF0X3NpemUgKHNkLT5mb3JtYXQs IDEpICogc2QtPmNoYW5uZWxzOwotICBpbnQgbndyaXR0ZW4gPSAwOworICBzaXplX3Qgbndy aXR0ZW4gPSAwOwogICBpbnQgZXJyOwogCiAgIHdoaWxlIChud3JpdHRlbiA8IG5ieXRlcykK Cj09PSBtb2RpZmllZCBmaWxlICdzcmMvc3lzZGVwLmMnCi0tLSBzcmMvc3lzZGVwLmMJMjAx MS0wNC0xMiAwODoxMjowMSArMDAwMAorKysgc3JjL3N5c2RlcC5jCTIwMTEtMDQtMTMgMDU6 MDI6NTQgKzAwMDAKQEAgLTE4MjUsNDEgKzE4MjUsMzYgQEAKICAgcmV0dXJuIHJ0bnZhbDsK IH0KIAorLyogUmVhZCBmcm9tIEZJTEVERVNDIHRvIGEgYnVmZmVyIEJVRiB3aXRoIHNpemUg TkJZVEUsIHJldHJ5aW5nIGlmIGludGVycnVwdGVkLgorICAgUmV0dXJuIHRoZSBudW1iZXIg b2YgYnl0ZXMgcmVhZCwgd2hpY2ggbWlnaHQgYmUgbGVzcyB0aGFuIE5CWVRFLgorICAgT24g ZXJyb3IsIHNldCBlcnJubyBhbmQgcmV0dXJuIC0xLiAgKi8KIHNzaXplX3QKIGVtYWNzX3Jl YWQgKGludCBmaWxkZXMsIGNoYXIgKmJ1Ziwgc2l6ZV90IG5ieXRlKQogewogICByZWdpc3Rl ciBzc2l6ZV90IHJ0bnZhbDsKIAotICAvKiBEZWZlbmQgYWdhaW5zdCB0aGUgcG9zc2liaWxp dHkgdGhhdCBhIGJ1Z2d5IGNhbGxlciBwYXNzZXMgYSBuZWdhdGl2ZSBOQllURQotICAgICBh cmd1bWVudCwgd2hpY2ggd291bGQgYmUgY29udmVydGVkIHRvIGEgbGFyZ2UgdW5zaWduZWQg c2l6ZV90IE5CWVRFLiAgVGhpcwotICAgICBkZWZlbnNlIHByZXZlbnRzIGNhbGxlcnMgZnJv bSBkb2luZyBsYXJnZSB3cml0ZXMsIHVuZm9ydHVuYXRlbHkuICBUaGlzCi0gICAgIHNpemUg cmVzdHJpY3Rpb24gY2FuIGJlIHJlbW92ZWQgb25jZSB3ZSBoYXZlIGNhcmVmdWxseSBjaGVj a2VkIHRoYXQgdGhlcmUKLSAgICAgYXJlIG5vIHN1Y2ggY2FsbGVycy4gICovCi0gIGlmICgo c3NpemVfdCkgbmJ5dGUgPCAwKQotICAgIGFib3J0ICgpOwotCiAgIHdoaWxlICgocnRudmFs ID0gcmVhZCAoZmlsZGVzLCBidWYsIG5ieXRlKSkgPT0gLTEKIAkgJiYgKGVycm5vID09IEVJ TlRSKSkKICAgICBRVUlUOwogICByZXR1cm4gKHJ0bnZhbCk7CiB9CiAKLXNzaXplX3QKKy8q IFdyaXRlIHRvIEZJTEVERVMgZnJvbSBhIGJ1ZmZlciBCVUYgd2l0aCBzaXplIE5CWVRFLCBy ZXRyeWluZyBpZiBpbnRlcnJ1cHRlZAorICAgb3IgaWYgYSBwYXJ0aWFsIHdyaXRlIG9jY3Vy cy4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIHNldHRpbmcKKyAgIGVy cm5vIGlmIHRoaXMgaXMgbGVzcyB0aGFuIE5CWVRFLiAgKi8KK3NpemVfdAogZW1hY3Nfd3Jp dGUgKGludCBmaWxkZXMsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG5ieXRlKQogewotICBy ZWdpc3RlciBzc2l6ZV90IHJ0bnZhbCwgYnl0ZXNfd3JpdHRlbjsKLQotICAvKiBEZWZlbmQg YWdhaW5zdCBuZWdhdGl2ZSBOQllURSwgYXMgaW4gZW1hY3NfcmVhZC4gICovCi0gIGlmICgo c3NpemVfdCkgbmJ5dGUgPCAwKQotICAgIGFib3J0ICgpOworICBzc2l6ZV90IHJ0bnZhbDsK KyAgc2l6ZV90IGJ5dGVzX3dyaXR0ZW47CiAKICAgYnl0ZXNfd3JpdHRlbiA9IDA7CiAKLSAg d2hpbGUgKG5ieXRlICE9IDApCisgIHdoaWxlIChuYnl0ZSA+IDApCiAgICAgewogICAgICAg cnRudmFsID0gd3JpdGUgKGZpbGRlcywgYnVmLCBuYnl0ZSk7CiAKLSAgICAgIGlmIChydG52 YWwgPT0gLTEpCisgICAgICBpZiAocnRudmFsIDwgMCkKIAl7CiAJICBpZiAoZXJybm8gPT0g RUlOVFIpCiAJICAgIHsKQEAgLTE4NzEsMTMgKzE4NjYsMTQgQEAKIAkgICAgICBjb250aW51 ZTsKIAkgICAgfQogCSAgZWxzZQotCSAgICByZXR1cm4gKGJ5dGVzX3dyaXR0ZW4gPyBieXRl c193cml0dGVuIDogLTEpOworCSAgICBicmVhazsKIAl9CiAKICAgICAgIGJ1ZiArPSBydG52 YWw7CiAgICAgICBuYnl0ZSAtPSBydG52YWw7CiAgICAgICBieXRlc193cml0dGVuICs9IHJ0 bnZhbDsKICAgICB9CisKICAgcmV0dXJuIChieXRlc193cml0dGVuKTsKIH0KIAoKIyBCZWdp biBidW5kbGUKSXlCQ1lYcGhZWElnY21WMmFYTnBiMjRnWW5WdVpHeGxJSFkwQ2lNS1FscG9P VEZCV1NaVFdWZ2JmL01BQ1VMZmdGQnhjUC8vLy8rbgozdkMvLy8vd1lBLzhBSHdFUlZBQUFB QUVJQUFvVUFBRkFDZ0FSd0RDTUpwaUdBUURJQVlScGt5WVJnSWFIQU1Jd21tSVlCQU1nQmhH Cm1USmhHQWhvY0F3akNhWWhnRUF5QUdFYVpNbUVZQ0dnbFBVaVRDTkNNUW5wTlR4VFpwVDFO TnFaREVESmthTk5xZWllcG9jQXdqQ2EKWWhnRUF5QUdFYVpNbUVZQ0dnVlJDQUlBUUV5WkVh ZWdRUXhEUkhxRFI2ajFEQ1pJS2lFSkZoQXdpakNFR2MyYk0remtxek15NjRpMQo1UFV6UHIy ejcvMjdlbTNLeG54OFZlZm44V204M3Q5NSs2YURZTVdSRFZxeEVzazZjVEcvMkxxcldxZEZL MTBSZ1pKamVQMzEwTEc1CnNOQ0tXMzRXR1RSSkhEWnJwcnBSM2JOZUhEZmpPR2NpTFVDRkln cWNWWTFaaFhHbEp4MDU3SkdjS1dpNDI1VFRnbUdFMVl1cGRlNFgKeE9OeHN5M2NLR3Q0dU9J Z2pqdVFWaEVValViVXJwWnNsc21aZzRQZ0Z2QjdoUjA1bVAwcE1lNGJrK3gwR0lreGs0OHgz ZFFHQUhKRQpJc0tBcWtDcXBBc0haeTlsdU1ML1FFY1BobURaZ2F5a25OazViT1N6bVhtcmhT KzYrMjFpOUY1N3BzU2pHRjBUZUtheVMxdHlUYmJCCmhrc3N5bVNRdlNyWlpOV3hpdGx1V3Ri YjZYc3BhMk5HOUphdVdhMGNreWtwT1NWdFM1UEFmQ2R1ZytXK1R4U1M3WHRwUzB1WjZtS2oK cTBqSDliTUdUQjl0a1VacUsvSERIMGVXYjRGbTVVcFZ1U3NTMkxLNnZxVVhhZjlGSlpyWnBK UllwdTRWWE1WMXFMSzNhUmdobS9XUAo3c2ZkeFpzRFROVGZ3Y05yT1RjbHQvcytiS3VxaVh2 dmIzQjd4V045OUc1dFpKV0cxVmRPaTlXS3Q5eXEyUTU4WXVZN0dhc1hvWTVhCnZSSzl3Tjdh ZS9CMVhxV1VWeW1aS20xVWJWK3hVNEZ6YUY3Qks1MFhzbTNwcXZZL3hxcU5XRGJTMGJlYith ejFZTHRHTVhkUFVQaTYKdDFOeDFkYmEwNGRXMldZd0EzSGx1VkN0TlQxek5tbUFISk1RQnZo dkJxRU96c21abUlDWlZaK3Znd1BWSnZ2Sm5OTWtVRWpvSnE0agp2K1l6NS9UTXZrWjB4QmYy Wmd3RXpGVGRqUlpMYVVlZGh3VTV5d2ZRdVhzZVBaRzEvWWVNbzJJZUI0S0lsOWtXV1VpaEVm YWw1UndLCkdUaHNocTJOZ1VNRzU2aVA3dHoyRU9wK3Z5L2ppN3V1azB0YW5kdnd1d1lUTjlk K0ZsdGhwa3ZlOWhKRWtKTDQ2NDhzQUZTd1dFOHgKZVRBQXZGNU93ZW5aMmRNRktVUll0Ty9q WDNZd2hXbEhHVVVtSStGS0ZJbDVHSXRRUEd4WW5WY2NkZkhZWUJFelN0WVRpTXdRV2lWZApL UWlGYTM0NlJhTGtyaVY4YWhLNVI5RGJHQzRqMDEwWi96MFJCamlRdVhVWDZza0VtLzd0TmpG Zmc3cVAzMTN0cTBOV0N3alQzc0NNCnhPTU9VT0prc3ZjSEp4V2x1WVhMVWFOV2psR3B0bEJX V0NsRzJscWpUbFJPV1M4WlRSUzV5Vk9Xa1djR0NJUHpueE9Qb3ZqUVp4RUcKRzRoaVF1TURG eWRMY0d4MkpWWWI5VzZxbE9GT1BQSjNSazQzeHBITkpFWmNDRnprTmk1NlJreWppUmV3TmZK emF0bmEycTZkaXZLSgppYTlTZW5kVGJJYkhLbDcweDVrT3hxcnBocXRFdVFpblozc1hieDdt TEM5dmQrTmFzV25QdWFxdTdPNmxZbWJjRmRuRGJoZmt0T0VjCm1KVmgzRU5GRkR4bEVHcTln UW91Unh6dWpuYlJ3WXdNWXRnUnNxMTBNd3JsdU1qRzVnNHhrdXVaNjl1VGxwbzFaNDZyT3JW YUVZYzgKbktITmpDK09zT01lWkgrSTNSejNYYzYyakdVOFptL1NWS1lWd3VqQzZrQjJzUlNU VlFoTUlvb2sxNHFHVHFjbE02S3U2N0duWmV6eApiSjJPaWtzWXltNVZiYTFYUnF5WEV5Nm1o d01GOVdEdVZ2YmNWejBUSHVDZWR0ODc5YnF1RzFwanV1Qzdka1JqSGZ4M3RMRVlhTzNHCnpS RUZtSkN5a1hhTXJzV0pqQ0U5ell2YnR0N1JqZXlXdG5mRTdlK21LY0c1NHhrNFpYa3MyNDNv Wks3bWplN1ZHbHNGZm9EeWRVZkIKMWIrcmJMYXk1VzQwcmFsKzJrMnFvSGM0dWFPTFRRckZz N2F1L0pvcmJwTk0xRU1tVExDMkdBVVJpYkpuSmRTY2JNZVMxdDFtNTR1dQpycTliRFZ1ZjRJ ZGdmZVEwNmN1VloxcGpuZHV1NGNweFhJdHh6enBTbVMyTEpXNVpTTGxhM2QxMk1kV21ydjUy NXRMbUdiczJWd2xzCmRiVFM2MjEyc1d2RGliSGE2NGh3Y1p3Ym0vZzQ4bm9lb2ovQmh1MzVk YzZaODd1dW0xZDB0YyttL3AwMktPR1RiZHkycnNUemlpNkoKbGZWb3p5bFRzMlkzUndyMjRk ZllraW1rYkc1c2lxemkzemN1SVcxM0tUSE5QR3RPT2UrclJUQzExekhneHVtSnBPalk1czJP Qmswdwp5YVpVVlpNMTZ6c1N1U2M4S05zdzJxS1lOeVY5VzdXOU1hY0dVWDhWR0M3WTFidFhB b3F2eXJhTFk0MzZYMnN1aTY2N0FodjJaSnBrClpiOFY3YzRFTkZhSEJuc2E2SjJ4ejU1WHpP QzdEQ09ibXBwdnF4VWFzT01hV3laY3pKZG9kVFZ2ZUJHeHlhdWo3RGpFbTVKMUpMczIKdkZR VVR3Y1cxVkRrd1RncEd4aEZrTGxTSlZjRkwwTW9SaGtsK3pUMGVlTktWS3ltdnN2ODdLZG4x dWNIV1FNSDNzZXo5WmludDZ6Wgp1Tm9Tc01Jbk1UdkVwRFJWVldBVzQ1ZnBQUUJTK293VEY4 QUZJNWp6eC9aNmQrME14TUFrS0NrbndEMGV2dDBGQ3dQKytRWGR4WHRQCmJrS1Jqai9wUXg5 b3g4U2hsUG1aNkIzdjhQbk8rWXh4a2pMY2NIZlFwVStZZmtTWFhVL3VteHZqQjVqNVFjWHRU RHpFb2o4ajJQdVkKTUkrekFWZ2tZUWdzZnBqTkVVU0tKaU5odjMwK3VBL2hpL0ZxUTJoWjl6 NzQvRi9CZzN0c1A2ZnlmN056OC85Q0kzTjZOai9OU051VworVzdZL3BDTTQyc1c1VjIvMG1k VzkxU3M3eGdxNEphSmdvUjNjb2lGRlRTa0pkNldEOXE1a1NmVEhXeFZkNXhQTDhZaUw0OVhS M3VqCmUrcitidmVDejg2eGZrdmY2ZnY4MW1NZHk5Ui9CVm50YWF1Y09IYzg0dnpYTW5CL1gr di8xMFIrcjJFUG9JOWRreWxFOXovbDlNQ0wKbERzL1NoN2hJN1hVbDJYeDErS3ZXdWVONis5 VHhWWkwycXJ3dXA5YmI2MTV1U2EvRDVLTDRpL2E4V0hVOFZPdCtiL0pSSHlmcVl2WgptUmkz UUdCMUk5aWhnd2YzZ0pRaThYT0h1V3ZtVzhwU00zTmF5WHZXb3UrcmZFeEsrSmhXMEt1MTVk Rjd4d3h2alVPLzFOWGs5YnJiCm9obnRJb3VhTnpGQlpEMVFkZjl0andZYjNVM3ZZNUtNenph dWtNbjhSdmRibkgyb2VwN1Nyb21BMWtoM0h6OEV5KzN4bDlhVHFLS1MKWEtIb1dWV1hDNXRj ZTJpOHRGbUlua01EdExNRlZBUkU4eFVwR1JVekJtQThKNCs3ampsYjJuS3VYZnR4L2JuT2Rw clRCN2tyZVduaworUHB2Yk1HQ2VMUWRROHE4YUZKaFJxNWlZUmZDRGMvbDF3MTdsR3JiRmxs bXZ0ZGRHRXpsZEd4OFlDU0dmVDNzbkFoazYrMmpWNHRqCnZkTjdzZk4zUktrSlVpSlJUOUl4 WEw0MXJ4Zkx4bytYUDRxbmdmSStJZ2lQcDhGQ2dKVFR5bkFhVWk4K2dtRG9LOUp6RUc0aEVk MEoKZXQ2M1dtRm50ellHZjJ4ODRMY3VVS09oQlpURnNVaUtQbVVmSndiNGowTE5oaW1YUVMz aVVSNnptM01FSGJsRzlMNU5wdW1oTVVlTAp5YkhaNi9MbEx5d2UvQlFoZXZlTEY2SnpaUGRl d3B4ZTJrWVBKREloTVJ2UTN4SENQb0hRZFEzcGRwMjBoN1VzNHVxdEVZb3ZVaXlYClVsTUlr N1NEd2Z2aTZBMng5MFNlbXg2VW9tay9iQm44anU3VkVVS3hXbnRJWXFxdjlVaXFyeWpZb2hY bmMvWVdoS1hHUEVMT3dReFgKUlpQViswaWowZkVmSzdnNzQvWTZJSll1RWZmSnlROThkUmVS NFA5M3JqYjVDTkRPUGpDS3VxMGZZczR4K3A5dUluVjlMeFpzSU42SQo2M2pHNk01VVZSR1VM T1RlbzhES0lIUmkvd3JDTUhKYVBuR3hFUkdrbk02TXo2U05ZNzM0S0lpNVpLWHFoRkhuR2J1 ajhDM3dpY0l2Ckd4RVlLQzJVQjVtRENDTSs2UEtuVzRQM2VyNExQZjhKMi9OZTJLdDVnOFR2 aUMwTGNsRXZjN1I5YjZuellJUjhZMGV5R3cwSFc3RXgKSzZIc2FxTWw2OUNpOVZqV3RLSXFs TDlLeENyQlAzbEQ4SXFVUXlHcDhLUkdVUTJRMGhFakJLaXpCSlNJWEM3Zkc5UnJGNUh1SVlt TQpMa2dnSUpDaEZUTEVCUTFpUlNkanJRVVU5NGthRU5MNWlNSVBNcFdENXV3K0ViVnk4WnNV UjBWTUYwTE10aXVzSXZUMlRNdnVYUStpCktvK1RnaHQ1dmRFUloydlcwYlRleW1aK01aUnpP eUdrTVg3bHhHWHJTSklteUg3aW5vNXVEMFZOSFB5NVdZdnA5MDdIRU1tMWs1a08KK05yMkY2 a0pVbUtURVRDT3QwR0NvbHNiVTNQVDZ2U00wUXVZSmo4cGIxNmlHcG9uU1NPeEVmWk1CYUdT MG9lY2RZOWZreXF0RjR2bQpNRXdHMlhicmJNWUt4aUZrV2M4Sit4a3FxbVBZNmxsWVVXcE1v enJIbkVwaUw0RDhBOTRYMWlHYzNTU2tTaVZhUXZkRzUrVVR2TDNsCkREZS80Ym1ETHBsS2Zo VW1VZFFxWG9pajdrcWt3bEliWWs4b3JwVDV6TkppU1Vna0VOUnhNQ3dkSFMxQ01zS0RuRU1W b2l6dWUwOEMKcTlzUzN3akE1RGFWMHMxcHZQVk95akxuUjk3cmZIQ05TV0c1Y1VVVlJrbTlQ cmVBd09Lekpjb29ua1NtVUpKbE9NWkV0WUN3L0FLcgowWFJIaE1SS1lRc3hvbXpyaUl0Z3ZR MWNnOEd4bSsyeUk3Wkt0amZ1b2wxbTI1WmxFRnpBMkpRM1FLUkVqa3RVaTloQ0xlcUtsQ1B4 CmpGN1VSNElpSlI5a2ZlUmM2aUxvM1JrN1FyODREY0xOL1ZNL0ZDc2RIZzVyMVlSOGZaWEpa c0R2L3FWTVlRK3VMNDBWZFQ0RUx6dVcKUlE3UmVsRVN2YkpZaGN1SlB1RG85eXNiWG00NTVu WkdhakNPaENqbEhFajJ3aXNrZGlVVWNaK2NicVJhZTRoNmpxanliRGE3U0ppRApjUnRqcmVv N1NoNnkrS09zL0owZUVNNFJleE5zVFZ2S3dNNGxCSG1YbW1QL0YzSkZPRkNRV0J0Lzh3PT0K --------------090206070904030202070406--