From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 04 09:28:33 2012 Received: (at submit) by debbugs.gnu.org; 4 Sep 2012 13:28:35 +0000 Received: from localhost ([127.0.0.1]:37993 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8tB2-0007C9-IX for submit@debbugs.gnu.org; Tue, 04 Sep 2012 09:28:25 -0400 Received: from eggs.gnu.org ([208.118.235.92]:46335) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8tAt-0007Bw-7o for submit@debbugs.gnu.org; Tue, 04 Sep 2012 09:28:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1T8tAn-000757-Hc for submit@debbugs.gnu.org; Tue, 04 Sep 2012 09:28:14 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_HI, T_TVD_MIME_NO_HEADERS autolearn=unavailable version=3.3.2 Received: from lists.gnu.org ([208.118.235.17]:39493) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T8stW-0001PY-OW for submit@debbugs.gnu.org; Tue, 04 Sep 2012 09:10:18 -0400 Received: from eggs.gnu.org ([208.118.235.92]:49212) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T8stJ-0007Sa-C9 for bug-coreutils@gnu.org; Tue, 04 Sep 2012 09:10:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1T8stB-0000z8-56 for bug-coreutils@gnu.org; Tue, 04 Sep 2012 09:10:03 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:34589 helo=shell.gmplib.org) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T8stA-0000yU-JJ for bug-coreutils@gnu.org; Tue, 04 Sep 2012 09:09:56 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id F007A1850F; Tue, 4 Sep 2012 15:09:53 +0200 (CEST) To: bug-coreutils@gnu.org Subject: Composites identified as primes in factor.c (when HAVE_GMP) From: Torbjorn Granlund Date: Tue, 04 Sep 2012 15:09:53 +0200 Message-ID: <86zk56orxa.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 208.118.235.17 X-Spam-Score: -6.9 (------) X-Debbugs-Envelope-To: submit Cc: nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -6.9 (------) --=-=-= The very old factoring code cut from an now obsolete version GMP does not pass proper arguments to the mpz_probab_prime_p function. It ask for 3 Miller-Rabin tests only, which is not sufficient. I am afraid the original poor code was wrritten by me, where this particular problem was introduced with 3.0's demos/factorize.c. A Miller-Rabin test will detect composites with at least a probability of 3/4. For a uniform random composite, the probability will actually by much higher. Or put another way, of the N-3 possible Miller-Rabin tests for checking the composite N, there is no number N for which more than (N-3)/4 of the tests will fail to detect the number as a composite. For most numbers N the number of "false witnesses" will be much, much lower. Problem numbers are of the for N=pq, p,q prime and (p-1)/(q-1) = s, where s is a small integer. (There are other problem forms too, incvolving 3 or more prime factors.) When s = 2, we get the 3/4 factor. It is easy to find numbers of that form that causes coreutils factor to fail: 465658903 2242724851 6635692801 17709149503 17754345703 20889169003 42743470771 54890944111 72047131003 85862644003 98275842811 114654168091 117225546301 ... There are 9008992 composites of the form with s=2 below 2^64. With 3 Miller-Rabin test, one would expect about 9008992/4^64 = 140766 to be invalidly recognised as primes in that range. Here is a simple patch: --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=diff *** .~/factor.c.~1~ Sat Mar 31 19:38:21 2012 --- factor.c Tue Sep 4 14:34:52 2012 *************** *** 154,157 **** --- 154,159 ---- } + #define MR_REPS 25 + static void factor_using_pollard_rho (mpz_t n, int a_int) *************** *** 223,227 **** mpz_div (n, n, g); /* divide by g, before g is overwritten */ ! if (!mpz_probab_prime_p (g, 3)) { do --- 225,229 ---- mpz_div (n, n, g); /* divide by g, before g is overwritten */ ! if (!mpz_probab_prime_p (g, MR_REPS)) { do *************** *** 243,247 **** mpz_mod (x1, x1, n); mpz_mod (y, y, n); ! if (mpz_probab_prime_p (n, 3)) { emit_factor (n); --- 245,249 ---- mpz_mod (x1, x1, n); mpz_mod (y, y, n); ! if (mpz_probab_prime_p (n, MR_REPS)) { emit_factor (n); *************** *** 412,416 **** { debug ("[is number prime?] "); ! if (mpz_probab_prime_p (t, 3)) emit_factor (t); else --- 414,418 ---- { debug ("[is number prime?] "); ! if (mpz_probab_prime_p (t, MR_REPS)) emit_factor (t); else --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable I and Niels M=C3=B6ller have written a suggested replacement for coreutils factor.c. It fixes a number of issues with the current code: (1) Much faster trial division code (> 10x) based on a small table of prime inverses. Still, the new code doesn't perform lots of trial dividing. (2) Pollard rho code using Montgomery representation for numbers < 2^64. (We consider extending this to 128 bits.) Not dependent on GMP. (3) Lucas prime proving code instead of probablitic Miller-Rabin primes testing. (4) SQUFOF code, which might be included depending on performance issues. (5) Replacement GMP code (#if HAVE_GMP) that also includes Lucas proving code. The new code is faster than the current code: Old: seq `pexpr 2^64-1000` `pexpr 2^64-1` | time factor >/dev/null 524.57 user New: seq `pexpr 2^64-1000` `pexpr 2^64-1` | time ./factor >/dev/null 0.05 user For smaller number ranges, the improvements are currently much more modest, as little as 2x in some cases. The code should be ready within a few weeks. --=20 Torbj=C3=B6rn --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 04 10:46:59 2012 Received: (at 12350) by debbugs.gnu.org; 4 Sep 2012 14:46:59 +0000 Received: from localhost ([127.0.0.1]:38569 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8uP4-0000eM-OS for submit@debbugs.gnu.org; Tue, 04 Sep 2012 10:46:59 -0400 Received: from mx.meyering.net ([88.168.87.75]:39158) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8uP1-0000eC-Ax for 12350@debbugs.gnu.org; Tue, 04 Sep 2012 10:46:57 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id A02B760162; Tue, 4 Sep 2012 16:46:51 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <86zk56orxa.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Tue, 04 Sep 2012 15:09:53 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> Date: Tue, 04 Sep 2012 16:46:51 +0200 Message-ID: <87vcftc0bo.fsf@rho.meyering.net> Lines: 111 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -2.1 (--) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -2.1 (--) Torbjorn Granlund wrote: > The very old factoring code cut from an now obsolete version GMP does > not pass proper arguments to the mpz_probab_prime_p function. It ask > for 3 Miller-Rabin tests only, which is not sufficient. Hi Torbjorn Thank you for the patch and explanation. I've converted that into the commit below in your name. Please proofread it and let me know if you'd like to change anything. I tweaked the patch to change MR_REPS from a #define to an enum and to add the comment just preceding. I'll add NEWS and tests separately. >From ea6dd126e6452504f9fa1d6708d25473e2c27e67 Mon Sep 17 00:00:00 2001 From: Torbjorn Granlund Date: Tue, 4 Sep 2012 16:22:47 +0200 Subject: [PATCH] factor: don't ever declare composites to be prime The multiple-precision factoring code (with HAVE_GMP) was copied from a now-obsolete version of GMP that did not pass proper arguments to the mpz_probab_prime_p function. It makes that code perform no more than 3 Miller-Rabin tests only, which is not sufficient. A Miller-Rabin test will detect composites with at least a probability of 3/4. For a uniform random composite, the probability will actually by much higher. Or put another way, of the N-3 possible Miller-Rabin tests for checking the composite N, there is no number N for which more than (N-3)/4 of the tests will fail to detect the number as a composite. For most numbers N the number of "false witnesses" will be much, much lower. Problem numbers are of the for N=pq, p,q prime and (p-1)/(q-1) = s, where s is a small integer. (There are other problem forms too, incvolving 3 or more prime factors.) When s = 2, we get the 3/4 factor. It is easy to find numbers of that form that cause coreutils' factor to fail: 465658903 2242724851 6635692801 17709149503 17754345703 20889169003 42743470771 54890944111 72047131003 85862644003 98275842811 114654168091 117225546301 ... There are 9008992 composites of the form with s=2 below 2^64. With 3 Miller-Rabin test, one would expect about 9008992/4^64 = 140766 to be invalidly recognised as primes in that range. * src/factor.c (MR_REPS): Define to 25. (factor_using_pollard_rho): Use MR_REPS, not 3. (print_factors_multi): Likewise. --- src/factor.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/factor.c b/src/factor.c index 1d55805..e63e0e0 100644 --- a/src/factor.c +++ b/src/factor.c @@ -153,6 +153,9 @@ factor_using_division (mpz_t t, unsigned int limit) mpz_clear (r); } +/* The number of Miller-Rabin tests we require. */ +enum { MR_REPS = 25 }; + static void factor_using_pollard_rho (mpz_t n, int a_int) { @@ -222,7 +225,7 @@ S4: mpz_div (n, n, g); /* divide by g, before g is overwritten */ - if (!mpz_probab_prime_p (g, 3)) + if (!mpz_probab_prime_p (g, MR_REPS)) { do { @@ -242,7 +245,7 @@ S4: mpz_mod (x, x, n); mpz_mod (x1, x1, n); mpz_mod (y, y, n); - if (mpz_probab_prime_p (n, 3)) + if (mpz_probab_prime_p (n, MR_REPS)) { emit_factor (n); break; @@ -411,7 +414,7 @@ print_factors_multi (mpz_t t) if (mpz_cmp_ui (t, 1) != 0) { debug ("[is number prime?] "); - if (mpz_probab_prime_p (t, 3)) + if (mpz_probab_prime_p (t, MR_REPS)) emit_factor (t); else factor_using_pollard_rho (t, 1); -- 1.7.12.176.g3fc0e4c From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 04 10:57:27 2012 Received: (at 12350) by debbugs.gnu.org; 4 Sep 2012 14:57:27 +0000 Received: from localhost ([127.0.0.1]:38576 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8uZD-0000sX-23 for submit@debbugs.gnu.org; Tue, 04 Sep 2012 10:57:27 -0400 Received: from moutng.kundenserver.de ([212.227.126.171]:57454) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8uZB-0000sQ-AD for 12350@debbugs.gnu.org; Tue, 04 Sep 2012 10:57:26 -0400 Received: from [192.168.2.108] (p4FF74DA9.dip.t-dialin.net [79.247.77.169]) by mrelayeu.kundenserver.de (node=mreu4) with ESMTP (Nemesis) id 0Lc2Qz-1TqFfx2YsP-00jZq3; Tue, 04 Sep 2012 16:57:21 +0200 Message-ID: <504616CF.6060505@bernhard-voelker.de> Date: Tue, 04 Sep 2012 16:57:19 +0200 From: Bernhard Voelker User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120825 Thunderbird/15.0 MIME-Version: 1.0 To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> In-Reply-To: <87vcftc0bo.fsf@rho.meyering.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Provags-ID: V02:K0:zTdzcdiNq0vKp2HmVWAw9+D+NW+ZVbzLrOOuBcp25tR a6Apa76kFHJPT+xenkoyDV9xWBmjIJs0ZHIXUu9YhMCnriKI2s p2Py92+xhF/EnvyrhMt/K1MCoE7DJEcXXV0p1UewsNsHt+sFhI BPTvQYXYPL42NB1MXzu4L505fILsRb9S5zhc5rFWFUF3NZg/HJ JrqmNSt7lO0VFEhbhil298JEn/uZ10f3H9BiqWhmvYLF5XEtRS XLT5OWUwJVREqsOyz1e5FbrrwdY2nJTPKWXXrFXJzCfyLx+tu8 3Gpp5t3MEpRa1ybIj7QntABtW93INTKEwH4PhaBh3py1vTidzs nxLpItLRaS+KMU9UJ1+gYYyFoFGRInSxlbSWUKBEh X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, Torbjorn Granlund X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) On 09/04/2012 04:46 PM, Jim Meyering wrote: > incvolving 3 or more prime factors.) When s = 2, we get the 3/4 factor. s/incvolving/involving/ Have a nice day, Berny From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 04 11:32:10 2012 Received: (at 12350) by debbugs.gnu.org; 4 Sep 2012 15:32:10 +0000 Received: from localhost ([127.0.0.1]:38647 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8v6l-0001fv-NU for submit@debbugs.gnu.org; Tue, 04 Sep 2012 11:32:09 -0400 Received: from mx1.redhat.com ([209.132.183.28]:19354) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8v6h-0001fk-SG for 12350@debbugs.gnu.org; Tue, 04 Sep 2012 11:32:05 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q84FW0sP032201 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 4 Sep 2012 11:32:01 -0400 Received: from [10.36.116.89] (ovpn-116-89.ams2.redhat.com [10.36.116.89]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q84FVvm6020144 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Tue, 4 Sep 2012 11:31:59 -0400 Message-ID: <50461EEA.4020200@draigBrady.com> Date: Tue, 04 Sep 2012 16:31:54 +0100 From: =?ISO-8859-1?Q?P=E1draig_Brady?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:6.0) Gecko/20110816 Thunderbird/6.0 MIME-Version: 1.0 To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> In-Reply-To: <87vcftc0bo.fsf@rho.meyering.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by mx1.redhat.com id q84FW0sP032201 X-Spam-Score: -6.9 (------) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, Torbjorn Granlund X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -6.9 (------) On 09/04/2012 03:46 PM, Jim Meyering wrote: > There are 9008992 composites of the form with s=3D2 below 2^64. With 3 > Miller-Rabin test, one would expect about 9008992/4^64 =3D 140766 to be s/4^64/64/ ? For what it's worth I checked the million primes in the range 452,930,477 to 472,882,027 and they're now identified correctly (465658903 was included previously). Note processing time has increased with the patch. On my 2.1GHz i3-2310M, running over the above range used to take 14m, but now takes 18m. cheers, P=E1draig. From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 04 12:10:47 2012 Received: (at 12350) by debbugs.gnu.org; 4 Sep 2012 16:10:47 +0000 Received: from localhost ([127.0.0.1]:38671 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8viA-0002Ww-J7 for submit@debbugs.gnu.org; Tue, 04 Sep 2012 12:10:47 -0400 Received: from mx.meyering.net ([88.168.87.75]:39416) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8vi7-0002Wn-QE for 12350@debbugs.gnu.org; Tue, 04 Sep 2012 12:10:44 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id BAC90600CC; Tue, 4 Sep 2012 18:10:39 +0200 (CEST) From: Jim Meyering To: Bernhard Voelker Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <504616CF.6060505@bernhard-voelker.de> (Bernhard Voelker's message of "Tue, 04 Sep 2012 16:57:19 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <504616CF.6060505@bernhard-voelker.de> Date: Tue, 04 Sep 2012 18:10:39 +0200 Message-ID: <87zk5593b4.fsf@rho.meyering.net> Lines: 12 MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.1 (--) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, Torbjorn Granlund X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -2.1 (--) Bernhard Voelker wrote: > On 09/04/2012 04:46 PM, Jim Meyering wrote: >> incvolving 3 or more prime factors.) When s =3D 2, we get the 3/4 facto= r. > > s/incvolving/involving/ P=E1draig Brady wrote: > Miller-Rabin test, one would expect about 9008992/4^64 =3D 140766 to be s/4^64/64/ ? Fixed both. Thanks. I've also changed s/s/z/ in recognised. From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 04 12:43:03 2012 Received: (at 12350) by debbugs.gnu.org; 4 Sep 2012 16:43:03 +0000 Received: from localhost ([127.0.0.1]:38704 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8wDO-0003Ht-Os for submit@debbugs.gnu.org; Tue, 04 Sep 2012 12:43:03 -0400 Received: from mx.meyering.net ([88.168.87.75]:39498) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8wDK-0003HR-NV for 12350@debbugs.gnu.org; Tue, 04 Sep 2012 12:43:00 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 3D8F960058; Tue, 4 Sep 2012 18:42:54 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <87vcftc0bo.fsf@rho.meyering.net> (Jim Meyering's message of "Tue, 04 Sep 2012 16:46:51 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> Date: Tue, 04 Sep 2012 18:42:54 +0200 Message-ID: <87obll91td.fsf@rho.meyering.net> Lines: 185 MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.1 (--) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -2.1 (--) Jim Meyering wrote: > Torbjorn Granlund wrote: >> The very old factoring code cut from an now obsolete version GMP does >> not pass proper arguments to the mpz_probab_prime_p function. It ask >> for 3 Miller-Rabin tests only, which is not sufficient. > > Hi Torbjorn > > Thank you for the patch and explanation. > I've converted that into the commit below in your name. > Please proofread it and let me know if you'd like to change anything. > I tweaked the patch to change MR_REPS from a #define to an enum > and to add the comment just preceding. > > I'll add NEWS and tests separately. ... > From: Torbjorn Granlund > Date: Tue, 4 Sep 2012 16:22:47 +0200 > Subject: [PATCH] factor: don't ever declare composites to be prime Torbj=F6rn, I've just noticed that I misspelled your name above. Here's the NEWS/tests addition. Following is an adjusted commit that spells your name properly. >From e561ff991b74dc19f6728aa1e6e61d1927055ac1 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 4 Sep 2012 18:26:25 +0200 Subject: [PATCH] factor: doc and tests MIME-Version: 1.0 Content-Type: text/plain; charset=3DUTF-8 Content-Transfer-Encoding: 8bit * NEWS (Bug fixes): Mention it. * tests/misc/factor.pl: Add five of Torbj=F6rn's tests. --- NEWS | 3 +++ tests/misc/factor.pl | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/NEWS b/NEWS index f3874fd..ffa7939 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,9 @@ GNU coreutils NEWS -*-= outline -*- it detects this precise type of cycle, diagnoses it as such and eventually exits nonzero. + factor (when using gmp) would mistakenly declare some composite numbers + to be prime, e.g., 465658903, 2242724851, 6635692801. + rm -i -d now prompts the user then removes an empty directory, rather than ignoring the -d option and failing with an 'Is a directory' error. [bug introduced in coreutils-8.19, with the addition of --dir (-d)] diff --git a/tests/misc/factor.pl b/tests/misc/factor.pl index 47f9343..38a5037 100755 --- a/tests/misc/factor.pl +++ b/tests/misc/factor.pl @@ -67,6 +67,11 @@ my @Tests =3D {OUT =3D> "4: 2 2\n"}, {ERR =3D> "$prog: 'a' is not a valid positive integer\n"}, {EXIT =3D> 1}], + ['bug-2012-a', '465658903', {OUT =3D> '15259 30517'}], + ['bug-2012-b', '2242724851', {OUT =3D> '33487 66973'}], + ['bug-2012-c', '6635692801', {OUT =3D> '57601 115201'}], + ['bug-2012-d', '17709149503', {OUT =3D> '94099 188197'}], + ['bug-2012-e', '17754345703', {OUT =3D> '94219 188437'}], ); # Prepend the command line argument and append a newline to end -- 1.7.12.176.g3fc0e4c >From 4c21a96443ee26eb0d4da31526ce4cf180ac7a4e Mon Sep 17 00:00:00 2001 From: =3D?UTF-8?q?Torbj=3DC3=3DB6rn=3D20Granlund?=3D Date: Tue, 4 Sep 2012 18:38:29 +0200 Subject: [PATCH] factor: don't ever declare composites to be prime The multiple-precision factoring code (with HAVE_GMP) was copied from a now-obsolete version of GMP that did not pass proper arguments to the mpz_probab_prime_p function. It makes that code perform no more than 3 Miller-Rabin tests only, which is not sufficient. A Miller-Rabin test will detect composites with at least a probability of 3/4. For a uniform random composite, the probability will actually by much higher. Or put another way, of the N-3 possible Miller-Rabin tests for checking the composite N, there is no number N for which more than (N-3)/4 of the tests will fail to detect the number as a composite. For most numbers N the number of "false witnesses" will be much, much lower. Problem numbers are of the for N=3Dpq, p,q prime and (p-1)/(q-1) =3D s, where s is a small integer. (There are other problem forms too, involving 3 or more prime factors.) When s =3D 2, we get the 3/4 factor. It is easy to find numbers of that form that cause coreutils' factor to fail: 465658903 2242724851 6635692801 17709149503 17754345703 20889169003 42743470771 54890944111 72047131003 85862644003 98275842811 114654168091 117225546301 ... There are 9008992 composites of the form with s=3D2 below 2^64. With 3 Miller-Rabin test, one would expect about 9008992/64 =3D 140766 to be invalidly recognized as primes in that range. * src/factor.c (MR_REPS): Define to 25. (factor_using_pollard_rho): Use MR_REPS, not 3. (print_factors_multi): Likewise. * THANKS.in: Remove my name, now that it will be automatically included in the generated THANKS file. --- THANKS.in | 1 - src/factor.c | 9 ++++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/THANKS.in b/THANKS.in index 1580151..2c3f83c 100644 --- a/THANKS.in +++ b/THANKS.in @@ -608,7 +608,6 @@ Tony Leneis tony@plaza.ds.adp.c= om Tony Robinson ajr@eng.cam.ac.uk Toomas Soome Toomas.Soome@Elion.ee Toralf F=F6rster toralf.foerster@gmx.de -Torbjorn Granlund tege@nada.kth.se Torbjorn Lindgren tl@funcom.no Torsten Landschoff torsten@pclab.ifg.uni-kiel.de Travis Gummels tgummels@redhat.com diff --git a/src/factor.c b/src/factor.c index 1d55805..e63e0e0 100644 --- a/src/factor.c +++ b/src/factor.c @@ -153,6 +153,9 @@ factor_using_division (mpz_t t, unsigned int limit) mpz_clear (r); } +/* The number of Miller-Rabin tests we require. */ +enum { MR_REPS =3D 25 }; + static void factor_using_pollard_rho (mpz_t n, int a_int) { @@ -222,7 +225,7 @@ S4: mpz_div (n, n, g); /* divide by g, before g is overwritten */ - if (!mpz_probab_prime_p (g, 3)) + if (!mpz_probab_prime_p (g, MR_REPS)) { do { @@ -242,7 +245,7 @@ S4: mpz_mod (x, x, n); mpz_mod (x1, x1, n); mpz_mod (y, y, n); - if (mpz_probab_prime_p (n, 3)) + if (mpz_probab_prime_p (n, MR_REPS)) { emit_factor (n); break; @@ -411,7 +414,7 @@ print_factors_multi (mpz_t t) if (mpz_cmp_ui (t, 1) !=3D 0) { debug ("[is number prime?] "); - if (mpz_probab_prime_p (t, 3)) + if (mpz_probab_prime_p (t, MR_REPS)) emit_factor (t); else factor_using_pollard_rho (t, 1); -- 1.7.12.176.g3fc0e4c From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 04 13:24:43 2012 Received: (at 12350) by debbugs.gnu.org; 4 Sep 2012 17:24:43 +0000 Received: from localhost ([127.0.0.1]:38732 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8wrj-0004DN-Gi for submit@debbugs.gnu.org; Tue, 04 Sep 2012 13:24:43 -0400 Received: from mx1.redhat.com ([209.132.183.28]:62584) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8wrg-0004DF-Pi for 12350@debbugs.gnu.org; Tue, 04 Sep 2012 13:24:42 -0400 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q84HOaYZ028604 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 4 Sep 2012 13:24:37 -0400 Received: from [10.3.113.60] (ovpn-113-60.phx2.redhat.com [10.3.113.60]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q84HOZfV009688; Tue, 4 Sep 2012 13:24:35 -0400 Message-ID: <50463953.8030107@redhat.com> Date: Tue, 04 Sep 2012 11:24:35 -0600 From: Eric Blake Organization: Red Hat User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120828 Thunderbird/15.0 MIME-Version: 1.0 To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> In-Reply-To: <87obll91td.fsf@rho.meyering.net> X-Enigmail-Version: 1.4.4 OpenPGP: url=http://people.redhat.com/eblake/eblake.gpg Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="------------enigEA16C6315CF20322B6EF49A5" X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Spam-Score: -7.1 (-------) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, Torbjorn Granlund X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -7.1 (-------) This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enigEA16C6315CF20322B6EF49A5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable On 09/04/2012 10:42 AM, Jim Meyering wrote: > Jim Meyering wrote: >=20 >> > Torbjorn Granlund wrote: >=20 > Problem numbers are of the for N=3Dpq, p,q prime and (p-1)/(q-1) =3D s,= s/for/form/ --=20 Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org --------------enigEA16C6315CF20322B6EF49A5 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) Comment: Public key at http://people.redhat.com/eblake/eblake.gpg Comment: Using GnuPG with Mozilla - http://www.enigmail.net/ iQEcBAEBCAAGBQJQRjlTAAoJEKeha0olJ0NqxTAH/2p2kfJQ235TKd7HlstcyAkm qmG9c3ZQZAHjg/YQOa88GXd9i7/PYZ9xUKzVqIJnMLFF+1Cbgf/+/gKbCBqgXNeP uxCV2kqRZvg0AgZF3KrSHlS7O2DSAiqz8GGpPLuVbcmpFFoJFC3I06C8BtGwovVX 5YbEWP/JhngVpXUzqoYzhq8f0urSwSwfy1H1iL6VZuBM3zdIdLZkjGLjcHcDKhUx +YzCd+lZlSV7m5hb7Wgb55AGv36uvn8dDBzPiOdj0xQ0LPP9s9pkoRxzZbVz8FQ+ pzDMMwIBePevcXVudUTinuEU4xR5Ig7+P/wxcD+fsoJAq56NbRO6P56vTNDyIP8= =aEso -----END PGP SIGNATURE----- --------------enigEA16C6315CF20322B6EF49A5-- From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 04 13:58:25 2012 Received: (at 12350) by debbugs.gnu.org; 4 Sep 2012 17:58:25 +0000 Received: from localhost ([127.0.0.1]:38779 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8xOL-0004yl-Id for submit@debbugs.gnu.org; Tue, 04 Sep 2012 13:58:25 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:60918 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8xOJ-0004yd-U0 for 12350@debbugs.gnu.org; Tue, 04 Sep 2012 13:58:25 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id D25AA1871D; Tue, 4 Sep 2012 19:58:20 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Tue, 04 Sep 2012 19:58:20 +0200 In-Reply-To: <87obll91td.fsf@rho.meyering.net> (Jim Meyering's message of "Tue\, 04 Sep 2012 18\:42\:54 +0200") Message-ID: <86r4qhpt4z.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Jim Meyering writes: Jim Meyering wrote: =20=20 > Torbjorn Granlund wrote: >> The very old factoring code cut from an now obsolete version GMP does >> not pass proper arguments to the mpz_probab_prime_p function. It ask >> for 3 Miller-Rabin tests only, which is not sufficient. > > Hi Torbjorn > > Thank you for the patch and explanation. > I've converted that into the commit below in your name. > Please proofread it and let me know if you'd like to change anything. > I tweaked the patch to change MR_REPS from a #define to an enum > and to add the comment just preceding. > > I'll add NEWS and tests separately. ... > From: Torbjorn Granlund > Date: Tue, 4 Sep 2012 16:22:47 +0200 > Subject: [PATCH] factor: don't ever declare composites to be prime =20=20 Torbj=C3=B6rn, I've just noticed that I misspelled your name above. =20=20 Did you? Well, you misspell recognise too, but then again, most people on the other side of the pond misspell lots of English words. :-) --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 04 14:11:04 2012 Received: (at 12350) by debbugs.gnu.org; 4 Sep 2012 18:11:04 +0000 Received: from localhost ([127.0.0.1]:38792 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8xaZ-0005Gq-WA for submit@debbugs.gnu.org; Tue, 04 Sep 2012 14:11:04 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:54761 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8xaY-0005Gj-1W for 12350@debbugs.gnu.org; Tue, 04 Sep 2012 14:11:02 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 86C8D18735; Tue, 4 Sep 2012 20:10:59 +0200 (CEST) To: =?utf-8?Q?P=C3=A1draig?= Brady Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <50461EEA.4020200@draigBrady.com> From: Torbjorn Granlund Date: Tue, 04 Sep 2012 20:10:59 +0200 In-Reply-To: <50461EEA.4020200@draigBrady.com> (=?utf-8?Q?=22P=C3=A1draig?= Brady"'s message of "Tue\, 04 Sep 2012 16\:31\:54 +0100") Message-ID: <86ipbtpsjw.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, Jim Meyering X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) P=C3=A1draig Brady writes: On 09/04/2012 03:46 PM, Jim Meyering wrote: > There are 9008992 composites of the form with s=3D2 below 2^64. With 3 > Miller-Rabin test, one would expect about 9008992/4^64 =3D 140766 to be =20=20 s/4^64/64/ ? =20=20 For what it's worth I checked the million primes in the range 452,930,477 to 472,882,027 and they're now identified correctly (465658903 was included previously). =20=20 Note processing time has increased with the patch. On my 2.1GHz i3-2310M, running over the above range used to take 14m, but now takes 18m. =20=20 It sometimes takes more time to do things correctly. As I mentioned in the original post, we will replace the current code with code that is many times faster. Your example above will run at less than a minute on your system. --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 04 15:26:57 2012 Received: (at 12350) by debbugs.gnu.org; 4 Sep 2012 19:26:57 +0000 Received: from localhost ([127.0.0.1]:38878 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8ym0-00073g-Qu for submit@debbugs.gnu.org; Tue, 04 Sep 2012 15:26:57 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55084) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T8ylx-00073U-KE for 12350@debbugs.gnu.org; Tue, 04 Sep 2012 15:26:54 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q84JQnBr000457 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 4 Sep 2012 15:26:50 -0400 Received: from [10.36.116.38] (ovpn-116-38.ams2.redhat.com [10.36.116.38]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q84JQkbV006239 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Tue, 4 Sep 2012 15:26:48 -0400 Message-ID: <504655F5.7080000@draigBrady.com> Date: Tue, 04 Sep 2012 20:26:45 +0100 From: =?UTF-8?B?UMOhZHJhaWcgQnJhZHk=?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:6.0) Gecko/20110816 Thunderbird/6.0 MIME-Version: 1.0 To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <50461EEA.4020200@draigBrady.com> <86ipbtpsjw.fsf@shell.gmplib.org> In-Reply-To: <86ipbtpsjw.fsf@shell.gmplib.org> Content-Type: text/plain; charset=UTF-8; format=flowed X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by mx1.redhat.com id q84JQnBr000457 X-Spam-Score: -6.9 (------) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, Jim Meyering X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -6.9 (------) On 09/04/2012 07:10 PM, Torbjorn Granlund wrote: > P=C3=A1draig Brady writes: > > On 09/04/2012 03:46 PM, Jim Meyering wrote: > > There are 9008992 composites of the form with s=3D2 below 2^64. = With 3 > > Miller-Rabin test, one would expect about 9008992/4^64 =3D 140766= to be > > s/4^64/64/ ? > > For what it's worth I checked the million primes in > the range 452,930,477 to 472,882,027 and they're > now identified correctly (465658903 was included previously). > > Note processing time has increased with the patch. > On my 2.1GHz i3-2310M, running over the above range > used to take 14m, but now takes 18m. > > It sometimes takes more time to do things correctly. Sure. I was just quantifying the performance change, for others who may be referencing or noticing patches. (Actually, I'd add a note to the commit message that, this increases calculations by about 25%). > As I mentioned in the original post, we will replace the current code > with code that is many times faster. Your example above will run at > less than a minute on your system. I'd left my test files in place in anticipation ;) thanks, P=C3=A1draig. From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 04 17:56:05 2012 Received: (at 12350) by debbugs.gnu.org; 4 Sep 2012 21:56:05 +0000 Received: from localhost ([127.0.0.1]:38953 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T916K-0001xa-T9 for submit@debbugs.gnu.org; Tue, 04 Sep 2012 17:56:05 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:64504 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T916I-0001xB-FR for 12350@debbugs.gnu.org; Tue, 04 Sep 2012 17:56:03 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 0DD81661D; Tue, 4 Sep 2012 23:55:58 +0200 (CEST) To: =?utf-8?Q?P=C3=A1draig?= Brady Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <50461EEA.4020200@draigBrady.com> <86ipbtpsjw.fsf@shell.gmplib.org> <504655F5.7080000@draigBrady.com> From: Torbjorn Granlund Date: Tue, 04 Sep 2012 23:55:58 +0200 In-Reply-To: <504655F5.7080000@draigBrady.com> (=?utf-8?Q?=22P=C3=A1draig?= Brady"'s message of "Tue\, 04 Sep 2012 20\:26\:45 +0100") Message-ID: <86sjaxsb9t.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, Jim Meyering X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) P=C3=A1draig Brady writes: Sure. I was just quantifying the performance change, for others who may be referencing or noticing patches. (Actually, I'd add a note to the commit message that, this increases calculations by about 25%). =20=20 And surely mode for certain cases. We spend 25/3 or about 8 times more effort in Miller Rabin. > As I mentioned in the original post, we will replace the current code > with code that is many times faster. Your example above will run at > less than a minute on your system. =20=20 I'd left my test files in place in anticipation ;) =20=20 Please do, and let me and Niels know if it takes more than 45s. Your test case takes 28s on my 3.3 GHz Sandy bridge system with our current code. I'm a little disappointed the code doesn't beat the old code more for small factorisations. --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Wed Sep 05 02:52:58 2012 Received: (at 12350) by debbugs.gnu.org; 5 Sep 2012 06:52:58 +0000 Received: from localhost ([127.0.0.1]:39388 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T99Tu-0005jm-48 for submit@debbugs.gnu.org; Wed, 05 Sep 2012 02:52:58 -0400 Received: from mx.meyering.net ([88.168.87.75]:41584) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T99Tr-0005je-KA for 12350@debbugs.gnu.org; Wed, 05 Sep 2012 02:52:56 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id EA83B61D3B; Wed, 5 Sep 2012 08:52:48 +0200 (CEST) From: Jim Meyering To: Eric Blake Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <50463953.8030107@redhat.com> (Eric Blake's message of "Tue, 04 Sep 2012 11:24:35 -0600") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <50463953.8030107@redhat.com> Date: Wed, 05 Sep 2012 08:52:48 +0200 Message-ID: <87sjax6jwf.fsf@rho.meyering.net> Lines: 11 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -2.1 (--) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, Torbjorn Granlund X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -2.1 (--) Eric Blake wrote: > On 09/04/2012 10:42 AM, Jim Meyering wrote: >> Jim Meyering wrote: >> >>> > Torbjorn Granlund wrote: >> >> Problem numbers are of the for N=pq, p,q prime and (p-1)/(q-1) = s, > > s/for/form/ Fixed. Thanks. From debbugs-submit-bounces@debbugs.gnu.org Wed Sep 05 02:57:57 2012 Received: (at 12350) by debbugs.gnu.org; 5 Sep 2012 06:57:57 +0000 Received: from localhost ([127.0.0.1]:39394 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T99Yj-0005qT-Ko for submit@debbugs.gnu.org; Wed, 05 Sep 2012 02:57:57 -0400 Received: from mx.meyering.net ([88.168.87.75]:41600) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T99Yi-0005qN-1P for 12350@debbugs.gnu.org; Wed, 05 Sep 2012 02:57:56 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 3D43160098; Wed, 5 Sep 2012 08:57:50 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <86r4qhpt4z.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Tue, 04 Sep 2012 19:58:20 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> Date: Wed, 05 Sep 2012 08:57:50 +0200 Message-ID: <87mx156jo1.fsf@rho.meyering.net> Lines: 38 MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.1 (--) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -2.1 (--) Torbjorn Granlund wrote: > Jim Meyering writes: > > Jim Meyering wrote: > > > Torbjorn Granlund wrote: > >> The very old factoring code cut from an now obsolete version GMP does > >> not pass proper arguments to the mpz_probab_prime_p function. It ask > >> for 3 Miller-Rabin tests only, which is not sufficient. > > > > Hi Torbjorn > > > > Thank you for the patch and explanation. > > I've converted that into the commit below in your name. > > Please proofread it and let me know if you'd like to change anything. > > I tweaked the patch to change MR_REPS from a #define to an enum > > and to add the comment just preceding. > > > > I'll add NEWS and tests separately. > ... > > From: Torbjorn Granlund > > Date: Tue, 4 Sep 2012 16:22:47 +0200 > > Subject: [PATCH] factor: don't ever declare composites to be prime > > Torbj=F6rn, I've just noticed that I misspelled your name above. > > Did you? I meant that I used Torbjorn rather than Torbj=F6rn. > Well, you misspell recognise too, but then again, most people > on the other side of the pond misspell lots of English words. :-) Yes, the dichotomy is unfortunate. Over the years, it has even caused interface problems, i.e., with --colours vs --colors and $LS_COLOURS vs LS_COLORS. I wanted to settle on one, and US spelling is more common than British so I settled on that. From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 06 14:15:51 2012 Received: (at 12350) by debbugs.gnu.org; 6 Sep 2012 18:15:51 +0000 Received: from localhost ([127.0.0.1]:44665 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9gcJ-0003Ud-7G for submit@debbugs.gnu.org; Thu, 06 Sep 2012 14:15:51 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:33441 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9gcF-0003UU-BA for 12350@debbugs.gnu.org; Thu, 06 Sep 2012 14:15:49 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id B132C257FD; Thu, 6 Sep 2012 20:15:32 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Thu, 06 Sep 2012 20:15:32 +0200 In-Reply-To: <87mx156jo1.fsf@rho.meyering.net> (Jim Meyering's message of "Wed\, 05 Sep 2012 08\:57\:50 +0200") Message-ID: <861uif2f23.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable I and Niels now would appreciate feedback on the new factor code. We've put the entire little project in a tar file, which is attached. The code is also available at . Here is the README file: NT factor (Niels' and Torbj=C3=B6rn's factor, or New Technology factor) This is a project for producing a decent 'factor' command for GNU. The code was written by Torbj=C3=B6rn Granlund and Niels M=C3=B6ller in Aug= -Sept 2012, but parts of the code is based on preexisting GMP code. The old factor program could handle numbers < 2^64, unless GMP was available at build time. Without GMP, only trial division was used; with GMP an old version of GMP's demos/factorize.c code was used, which relies on Pollard rho for much better performance. The old factor program used probabilistic Miller-Rabin primes testing. The new code can factor numbers < 2^127 and does not currently make use of GMP, not even as an option. It uses fast trial division code, Pollard rho, and optionally SQUFOF. It uses the Lucas primality test instead of a probabilistic test. The new code is several times faster then the old code, in particular on 32-bit hardware. On current 64-bit machines, it is between 3 times and 10000 times faster for ranges of numbers; for 32-bit machines we have seen 150,000 times improvement for some number range. The advantage for the new code is greater for larger numbers, matching mathematical theory of algorithm efficiency. (These numbers compare the new code to the old GMP-less code; GMP-enabled old code is only between 3 and 10 times slower.) For smaller numbers, more than half the time is spent in I/O, buffering, and conversions. We have not tried to optimise these parts, but instead kept them clean. * We don't have any --help or --version options currently. * Our packaging with separate Makefile, outseq.c and ChangeLog was useful during our development. We don't expect these to be useful in coreutils. In particular, the slow testing of the 'check' target is probably quite unsuitable for coreutils (but similar but quicker tests would make sense). * The files probably needed for coreutils are: o factor.c -- main factoring code o make-prime-list.c -- primes table generator program o longlong.h -- arithmetic support routines (from GMP) Technical considerations: * Should we handle numbers >=3D 2^127? That would in effect mean merging a current version of GMP's demos/factorize.c into this factor.c, and put that under HAVE_GMP (like in the old factor.c). It should be understood that factoring such large numbers with only Pollard rho is not very feasible. * We think a --verbose option would be nice, although we don't have one in the present version. It would output information on algorithm switches and bounds reached. Opinions? Portability caveats: * We rely on POSIX.1 getchar_unlocked for a performance advantage. * We have some hardwired W_TYPE_SIZE settings for the code interfacing to longlong.h. It is now 64 bits. It will break on systems where uintmax_t is not a 64-bit type. Please see the beginning of factor.c. Legal caveat: * Both Niels and Torbj=C3=B6rn are GNU hackers since long. We do not currently have paperwork in place for coreutils contributions. This will certainly be addressed. --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=nt-factor.tar.lz Content-Transfer-Encoding: base64 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 1eFKElpmoKsA0AIAAAAAAJGAAAAAAAAA --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable --=20 Torbj=C3=B6rn --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 06 14:16:52 2012 Received: (at 12350) by debbugs.gnu.org; 6 Sep 2012 18:16:52 +0000 Received: from localhost ([127.0.0.1]:44669 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9gdH-0003WG-OQ for submit@debbugs.gnu.org; Thu, 06 Sep 2012 14:16:52 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:52543 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9gdE-0003W7-Tg for 12350@debbugs.gnu.org; Thu, 06 Sep 2012 14:16:50 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 43DF2257FF; Thu, 6 Sep 2012 20:16:35 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Thu, 06 Sep 2012 20:16:35 +0200 In-Reply-To: <87mx156jo1.fsf@rho.meyering.net> (Jim Meyering's message of "Wed\, 05 Sep 2012 08\:57\:50 +0200") Message-ID: <86wr0710fw.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable I and Niels now would appreciate feedback on the new factor code. We've put the entire little project in a tar file, which is attached. The code is also available at . Here is the README file: NT factor (Niels' and Torbj=C3=B6rn's factor, or New Technology factor) This is a project for producing a decent 'factor' command for GNU. The code was written by Torbj=C3=B6rn Granlund and Niels M=C3=B6ller in Aug= -Sept 2012, but parts of the code is based on preexisting GMP code. The old factor program could handle numbers < 2^64, unless GMP was available at build time. Without GMP, only trial division was used; with GMP an old version of GMP's demos/factorize.c code was used, which relies on Pollard rho for much better performance. The old factor program used probabilistic Miller-Rabin primes testing. The new code can factor numbers < 2^127 and does not currently make use of GMP, not even as an option. It uses fast trial division code, Pollard rho, and optionally SQUFOF. It uses the Lucas primality test instead of a probabilistic test. The new code is several times faster then the old code, in particular on 32-bit hardware. On current 64-bit machines, it is between 3 times and 10000 times faster for ranges of numbers; for 32-bit machines we have seen 150,000 times improvement for some number range. The advantage for the new code is greater for larger numbers, matching mathematical theory of algorithm efficiency. (These numbers compare the new code to the old GMP-less code; GMP-enabled old code is only between 3 and 10 times slower.) For smaller numbers, more than half the time is spent in I/O, buffering, and conversions. We have not tried to optimise these parts, but instead kept them clean. * We don't have any --help or --version options currently. * Our packaging with separate Makefile, outseq.c and ChangeLog was useful during our development. We don't expect these to be useful in coreutils. In particular, the slow testing of the 'check' target is probably quite unsuitable for coreutils (but similar but quicker tests would make sense). * The files probably needed for coreutils are: o factor.c -- main factoring code o make-prime-list.c -- primes table generator program o longlong.h -- arithmetic support routines (from GMP) Technical considerations: * Should we handle numbers >=3D 2^127? That would in effect mean merging a current version of GMP's demos/factorize.c into this factor.c, and put that under HAVE_GMP (like in the old factor.c). It should be understood that factoring such large numbers with only Pollard rho is not very feasible. * We think a --verbose option would be nice, although we don't have one in the present version. It would output information on algorithm switches and bounds reached. Opinions? Portability caveats: * We rely on POSIX.1 getchar_unlocked for a performance advantage. * We have some hardwired W_TYPE_SIZE settings for the code interfacing to longlong.h. It is now 64 bits. It will break on systems where uintmax_t is not a 64-bit type. Please see the beginning of factor.c. Legal caveat: * Both Niels and Torbj=C3=B6rn are GNU hackers since long. We do not currently have paperwork in place for coreutils contributions. This will certainly be addressed. --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=nt-factor.tar.lz Content-Transfer-Encoding: base64 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 1eFKElpmoKsA0AIAAAAAAJGAAAAAAAAA --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable --=20 Torbj=C3=B6rn --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 06 16:24:00 2012 Received: (at 12350) by debbugs.gnu.org; 6 Sep 2012 20:24:00 +0000 Received: from localhost ([127.0.0.1]:44813 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9icK-0006Rc-6i for submit@debbugs.gnu.org; Thu, 06 Sep 2012 16:24:00 -0400 Received: from mx.meyering.net ([88.168.87.75]:47334) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9icH-0006RU-Kq for 12350@debbugs.gnu.org; Thu, 06 Sep 2012 16:23:59 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 2E8AF60162; Thu, 6 Sep 2012 22:23:42 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <861uif2f23.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Thu, 06 Sep 2012 20:15:32 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <861uif2f23.fsf@shell.gmplib.org> Date: Thu, 06 Sep 2012 22:23:42 +0200 Message-ID: <87627qx5m9.fsf@rho.meyering.net> Lines: 69 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Torbjorn Granlund wrote: > I and Niels now would appreciate feedback on the new factor code. > > We've put the entire little project in a tar file, which is attached. > The code is also available at . Thanks a lot! I've started looking at the code. I was surprised to see "make check" fail. $ ./ourseq 0 100000 > k : $ ./factor < k : 0: 1: 2: 2 3: 3 4: 2 2 5: 5 6: 2 3 7: 7 8: 2 2 2 9: 3 3 zsh: abort (core dumped) ./factor < k That was due to unexpected input. Poking around, I see that ourseq writes from uninitialized memory: $ ./ourseq 9 11 9 102 112 $ ./ourseq 9 11 9 10> 11> $ ./ourseq 9 11 9 10" 11" The fix is to change the memmove to copy one more byte each time: to copy the required trailing NUL. With that, it looks like "make check" will pass. It will definitely benefit from running the individual tests in parallel ;-) >From 9e6db73344f43e828b8d716a0ea6a5842980d518 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Thu, 6 Sep 2012 22:12:41 +0200 Subject: [PATCH] incr: don't omit trailing NUL when incrementing --- ourseq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ourseq.c b/ourseq.c index d2472aa..cb71f13 100644 --- a/ourseq.c +++ b/ourseq.c @@ -48,7 +48,7 @@ incr (string *st) } s[i] = '0'; } - memmove (s + 1, s, len); + memmove (s + 1, s, len + 1); s[0] = '1'; st->len = len + 1; } -- 1.7.12.176.g3fc0e4c From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 06 16:29:42 2012 Received: (at 12350) by debbugs.gnu.org; 6 Sep 2012 20:29:42 +0000 Received: from localhost ([127.0.0.1]:44825 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9ihp-0006Zq-OV for submit@debbugs.gnu.org; Thu, 06 Sep 2012 16:29:42 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:38445 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9ihn-0006Zg-D8 for 12350@debbugs.gnu.org; Thu, 06 Sep 2012 16:29:40 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 38E3D25828; Thu, 6 Sep 2012 22:29:24 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <861uif2f23.fsf@shell.gmplib.org> <87627qx5m9.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Thu, 06 Sep 2012 22:29:24 +0200 In-Reply-To: <87627qx5m9.fsf@rho.meyering.net> (Jim Meyering's message of "Thu\, 06 Sep 2012 22\:23\:42 +0200") Message-ID: <86obli28uz.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Jim Meyering writes: zsh: abort (core dumped) ./factor < k =20=20 That was due to unexpected input. The parsing of the new factor is probably not too bad, but the error reporting could be better. :o) --- a/ourseq.c +++ b/ourseq.c @@ -48,7 +48,7 @@ incr (string *st) } s[i] =3D '0'; } - memmove (s + 1, s, len); + memmove (s + 1, s, len + 1); s[0] =3D '1'; st->len =3D len + 1; } Thanks. Culpa mea, ourseq is not my finest work, just a hack for testing factor. =20=20 --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 06 17:33:37 2012 Received: (at 12350) by debbugs.gnu.org; 6 Sep 2012 21:33:37 +0000 Received: from localhost ([127.0.0.1]:44906 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9jhh-00085f-AD for submit@debbugs.gnu.org; Thu, 06 Sep 2012 17:33:37 -0400 Received: from mx.meyering.net ([88.168.87.75]:47509) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9jhe-00085T-H8 for 12350@debbugs.gnu.org; Thu, 06 Sep 2012 17:33:35 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 1C04B601EB; Thu, 6 Sep 2012 23:33:15 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <86wr0710fw.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Thu, 06 Sep 2012 20:16:35 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> Date: Thu, 06 Sep 2012 23:33:15 +0200 Message-ID: <87y5kmvntw.fsf@rho.meyering.net> Lines: 66 MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Torbjorn Granlund wrote: > I and Niels now would appreciate feedback on the new factor code. ... > * Our packaging with separate Makefile, outseq.c and ChangeLog was > useful during our development. We don't expect these to be useful > in coreutils. In particular, the slow testing of the 'check' target > is probably quite unsuitable for coreutils (but similar but quicker > tests would make sense). I think the tests will be fine, as long as they're separate, and hence can be parallelized by the default mechanism. We might want to label most of them as "expensive", so that they're run only by those who set RUN_EXPENSIVE_TESTS=3Dyes in their environment. > * The files probably needed for coreutils are: > > o factor.c -- main factoring code > o make-prime-list.c -- primes table generator program > o longlong.h -- arithmetic support routines (from GMP) > > > Technical considerations: > > * Should we handle numbers >=3D 2^127? That would in effect mean > merging a current version of GMP's demos/factorize.c into this > factor.c, and put that under HAVE_GMP (like in the old factor.c). > It should be understood that factoring such large numbers with only > Pollard rho is not very feasible. The existing code can factor arbitrarily large numbers quickly, as long as they have no large prime factors. We should retain that capability. > * We think a --verbose option would be nice, although we don't have > one in the present version. It would output information on > algorithm switches and bounds reached. Opinions? I think it would be worthwhile, especially to give an idea of what progress is being made when factoring very large numbers, but hardly something that need be done now. E.g., currently this doesn't print much: $ M8=3D$(echo 2^31-1|bc) M9=3D$(echo 2^61-1|bc) M10=3D$(echo 2^89-1|bc) $ factor --verbose $(echo "$M8 * $M9 * $M10" | bc) [using arbitrary-precision arithmetic][trial division (32761)] [is numb= er prime?] [pollard-rho (1)] Ideally it'd print something every second or two. > Portability caveats: > > * We rely on POSIX.1 getchar_unlocked for a performance advantage. > > * We have some hardwired W_TYPE_SIZE settings for the code interfacing > to longlong.h. It is now 64 bits. It will break on systems where > uintmax_t is not a 64-bit type. Please see the beginning of > factor.c. I wonder how many types of systems would be affected. > Legal caveat: > > * Both Niels and Torbj=F6rn are GNU hackers since long. We do not > currently have paperwork in place for coreutils contributions. This > will certainly be addressed. Thanks. From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 06 18:00:56 2012 Received: (at 12350) by debbugs.gnu.org; 6 Sep 2012 22:00:57 +0000 Received: from localhost ([127.0.0.1]:44923 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9k88-0000Hg-EM for submit@debbugs.gnu.org; Thu, 06 Sep 2012 18:00:56 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:60621 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9k85-0000Ha-Vy for 12350@debbugs.gnu.org; Thu, 06 Sep 2012 18:00:55 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 567902583F; Fri, 7 Sep 2012 00:00:38 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Fri, 07 Sep 2012 00:00:38 +0200 In-Reply-To: <87y5kmvntw.fsf@rho.meyering.net> (Jim Meyering's message of "Thu\, 06 Sep 2012 23\:33\:15 +0200") Message-ID: <86k3w624mx.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Jim Meyering writes: The existing code can factor arbitrarily large numbers quickly, as long as they have no large prime factors. We should retain that capability. =20=20 OK, so we'll put the GMP demos program into this one. This opens another technical concern: We have moved towards proving primality, since for 128 bit numbers it can be done quickly. But if we allow arbitrary large numbers, it is expensive. We might want an option for this choosing probabilistic testing, perhaps --prp (common abbreviation for PRobabilistic Prime). By default, we should prove primality, I think. My current devel version if GMP's demos/factorize has Lucas code. > * We think a --verbose option would be nice, although we don't have > one in the present version. It would output information on > algorithm switches and bounds reached. Opinions? =20=20 I think it would be worthwhile, especially to give an idea of what progre= ss is being made when factoring very large numbers, but hardly something that need be done now. =20=20 E.g., currently this doesn't print much: =20=20 $ M8=3D$(echo 2^31-1|bc) M9=3D$(echo 2^61-1|bc) M10=3D$(echo 2^89-1|b= c) $ factor --verbose $(echo "$M8 * $M9 * $M10" | bc) [using arbitrary-precision arithmetic][trial division (32761)] [is nu= mber prime?] [pollard-rho (1)] =20=20 Ideally it'd print something every second or two. =20=20 I'll let Niels worry about this, since he was the one to ask for it. > Portability caveats: > > * We rely on POSIX.1 getchar_unlocked for a performance advantage. > > * We have some hardwired W_TYPE_SIZE settings for the code interfacing > to longlong.h. It is now 64 bits. It will break on systems where > uintmax_t is not a 64-bit type. Please see the beginning of > factor.c. =20=20 I wonder how many types of systems would be affected. =20=20 It is not used currently anywhere in coreutils? Perhaps coreutils could use autoconf for checking this? (If we're really crazy, we could speed the factor program by an additional 20% by using blocked input with e.g. fread.) Please take a look at the generated code for factor_using_division, towards the end where 8 imulq should be found (on amd64). The code uses mov, imul, cmp, jbe for testing the divisibility of a prime; the branch is taken when the prime divides the number being factored, thus highly non-taken. (I suppose we could do a better job at describing the maths, with some references. This particular trick is from "Division by invariant integers using multiplication".) --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 06 20:22:39 2012 Received: (at 12350) by debbugs.gnu.org; 7 Sep 2012 00:22:39 +0000 Received: from localhost ([127.0.0.1]:45034 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9mLG-0003Ru-Os for submit@debbugs.gnu.org; Thu, 06 Sep 2012 20:22:38 -0400 Received: from smtp.cs.ucla.edu ([131.179.128.62]:44748) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9mLE-0003Rm-Bt for 12350@debbugs.gnu.org; Thu, 06 Sep 2012 20:22:37 -0400 Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp.cs.ucla.edu (Postfix) with ESMTP id C74FD39E8014; Thu, 6 Sep 2012 17:22:20 -0700 (PDT) X-Virus-Scanned: amavisd-new at smtp.cs.ucla.edu 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 uuRialAGkd9P; Thu, 6 Sep 2012 17:22:20 -0700 (PDT) Received: from [192.168.1.3] (pool-108-23-119-2.lsanca.fios.verizon.net [108.23.119.2]) by smtp.cs.ucla.edu (Postfix) with ESMTPSA id 4E07A39E800D; Thu, 6 Sep 2012 17:22:20 -0700 (PDT) Message-ID: <50493E3E.5020000@cs.ucla.edu> Date: Thu, 06 Sep 2012 17:22:22 -0700 From: Paul Eggert Organization: UCLA Computer Science Department User-Agent: Mozilla/5.0 (X11; Linux i686; rv:15.0) Gecko/20120827 Thunderbird/15.0 MIME-Version: 1.0 To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> In-Reply-To: <87y5kmvntw.fsf@rho.meyering.net> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, Torbjorn Granlund X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) On 09/06/2012 02:33 PM, Jim Meyering wrote: >> > * We have some hardwired W_TYPE_SIZE settings for the code interfacing >> > to longlong.h. It is now 64 bits. It will break on systems where >> > uintmax_t is not a 64-bit type. Please see the beginning of >> > factor.c. > I wonder how many types of systems would be affected. It's only a matter of time. GCC already supports 128-bit integers on my everyday host (Fedora 17, x86-64, GCC 4.7.1). Eventually uintmax_t will grow past 64 bits, if only for the crypto guys. If the code needs exactly-64-bit unsigned integers, shouldn't it be using uint64_t? That's the standard way of doing that sort of thing. Gnulib can supply the type on pre-C99 platforms. Weird but standard-conforming platforms that don't have uint64_t will be out of luck, but surely they're out of luck anyway. From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 07 02:19:41 2012 Received: (at 12350) by debbugs.gnu.org; 7 Sep 2012 06:19:41 +0000 Received: from localhost ([127.0.0.1]:45313 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9rum-0005fI-FX for submit@debbugs.gnu.org; Fri, 07 Sep 2012 02:19:41 -0400 Received: from mx.meyering.net ([88.168.87.75]:48738) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9rui-0005f4-5b for 12350@debbugs.gnu.org; Fri, 07 Sep 2012 02:19:38 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 36F1260115; Fri, 7 Sep 2012 08:19:14 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <87obll91td.fsf@rho.meyering.net> (Jim Meyering's message of "Tue, 04 Sep 2012 18:42:54 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> Date: Fri, 07 Sep 2012 08:19:14 +0200 Message-ID: <87k3w6uzh9.fsf@rho.meyering.net> Lines: 199 MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, =?iso-8859-1?Q?P=E1draig?= Brady X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Jim Meyering wrote: > Jim Meyering wrote: > >> Torbjorn Granlund wrote: >>> The very old factoring code cut from an now obsolete version GMP does >>> not pass proper arguments to the mpz_probab_prime_p function. It ask >>> for 3 Miller-Rabin tests only, which is not sufficient. >> >> Hi Torbjorn >> >> Thank you for the patch and explanation. >> I've converted that into the commit below in your name. >> Please proofread it and let me know if you'd like to change anything. >> I tweaked the patch to change MR_REPS from a #define to an enum >> and to add the comment just preceding. >> >> I'll add NEWS and tests separately. > ... >> From: Torbjorn Granlund >> Date: Tue, 4 Sep 2012 16:22:47 +0200 >> Subject: [PATCH] factor: don't ever declare composites to be prime > > Torbj=F6rn, I've just noticed that I misspelled your name above. > > Here's the NEWS/tests addition. > Following is an adjusted commit that spells your name properly. > >>>From e561ff991b74dc19f6728aa1e6e61d1927055ac1 Mon Sep 17 00:00:00 2001 There have been enough changes (mostly typo fixes) that I'm re-posting these for review before I push. Also, I added this sentence to NEWS about the performance hit, too The fix makes factor somewhat slower (~25%) for ranges of consecutive numbers, and up to 8 times slower for some worst-case individual number= s. >From 68cf62bb04ecd138c81b68539c2a065250ca4390 Mon Sep 17 00:00:00 2001 From: =3D?UTF-8?q?Torbj=3DC3=3DB6rn=3D20Granlund?=3D Date: Tue, 4 Sep 2012 18:38:29 +0200 Subject: [PATCH 1/2] factor: don't ever declare composites to be prime The multiple-precision factoring code (with HAVE_GMP) was copied from a now-obsolete version of GMP that did not pass proper arguments to the mpz_probab_prime_p function. It makes that code perform no more than 3 Miller-Rabin tests only, which is not sufficient. A Miller-Rabin test will detect composites with at least a probability of 3/4. For a uniform random composite, the probability will actually be much higher. Or put another way, of the N-3 possible Miller-Rabin tests for checking the composite N, there is no number N for which more than (N-3)/4 of the tests will fail to detect the number as a composite. For most numbers N the number of "false witnesses" will be much, much lower. Problem numbers are of the form N=3Dpq, p,q prime and (p-1)/(q-1) =3D s, where s is a small integer. (There are other problem forms too, involving 3 or more prime factors.) When s =3D 2, we get the 3/4 factor. It is easy to find numbers of that form that cause coreutils' factor to fail: 465658903 2242724851 6635692801 17709149503 17754345703 20889169003 42743470771 54890944111 72047131003 85862644003 98275842811 114654168091 117225546301 ... There are 9008992 composites of the form with s=3D2 below 2^64. With 3 Miller-Rabin tests, one would expect about 9008992/64 =3D 140766 to be invalidly recognized as primes in that range. * src/factor.c (MR_REPS): Define to 25. (factor_using_pollard_rho): Use MR_REPS, not 3. (print_factors_multi): Likewise. * THANKS.in: Remove my name, now that it will be automatically included in the generated THANKS file. --- THANKS.in | 1 - src/factor.c | 9 ++++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/THANKS.in b/THANKS.in index 1580151..2c3f83c 100644 --- a/THANKS.in +++ b/THANKS.in @@ -608,7 +608,6 @@ Tony Leneis tony@plaza.ds.adp.c= om Tony Robinson ajr@eng.cam.ac.uk Toomas Soome Toomas.Soome@Elion.ee Toralf F=F6rster toralf.foerster@gmx.de -Torbjorn Granlund tege@nada.kth.se Torbjorn Lindgren tl@funcom.no Torsten Landschoff torsten@pclab.ifg.uni-kiel.de Travis Gummels tgummels@redhat.com diff --git a/src/factor.c b/src/factor.c index 1d55805..e63e0e0 100644 --- a/src/factor.c +++ b/src/factor.c @@ -153,6 +153,9 @@ factor_using_division (mpz_t t, unsigned int limit) mpz_clear (r); } +/* The number of Miller-Rabin tests we require. */ +enum { MR_REPS =3D 25 }; + static void factor_using_pollard_rho (mpz_t n, int a_int) { @@ -222,7 +225,7 @@ S4: mpz_div (n, n, g); /* divide by g, before g is overwritten */ - if (!mpz_probab_prime_p (g, 3)) + if (!mpz_probab_prime_p (g, MR_REPS)) { do { @@ -242,7 +245,7 @@ S4: mpz_mod (x, x, n); mpz_mod (x1, x1, n); mpz_mod (y, y, n); - if (mpz_probab_prime_p (n, 3)) + if (mpz_probab_prime_p (n, MR_REPS)) { emit_factor (n); break; @@ -411,7 +414,7 @@ print_factors_multi (mpz_t t) if (mpz_cmp_ui (t, 1) !=3D 0) { debug ("[is number prime?] "); - if (mpz_probab_prime_p (t, 3)) + if (mpz_probab_prime_p (t, MR_REPS)) emit_factor (t); else factor_using_pollard_rho (t, 1); -- 1.7.12.176.g3fc0e4c >From 0c0bfdf5e150e430f1ec3edb4fef9170c13ea268 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 4 Sep 2012 18:26:25 +0200 Subject: [PATCH 2/2] factor: NEWS and tests MIME-Version: 1.0 Content-Type: text/plain; charset=3DUTF-8 Content-Transfer-Encoding: 8bit * NEWS (Bug fixes): Mention it. * tests/misc/factor.pl: Add five of Torbj=F6rn's tests. --- NEWS | 6 ++++++ tests/misc/factor.pl | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/NEWS b/NEWS index 995fafb..8770a3b 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,12 @@ GNU coreutils NEWS -*= - outline -*- it detects this precise type of cycle, diagnoses it as such and eventually exits nonzero. + factor (when using gmp) would mistakenly declare some composite numbers + to be prime, e.g., 465658903, 2242724851, 6635692801 and many more. + The fix makes factor somewhat slower (~25%) for ranges of consecutive + numbers, and up to 8 times slower for some worst-case individual numbers. + [bug introduced in coreutils-7.0, with GNU MP support] + rm -i -d now prompts the user then removes an empty directory, rather than ignoring the -d option and failing with an 'Is a directory' error. [bug introduced in coreutils-8.19, with the addition of --dir (-d)] diff --git a/tests/misc/factor.pl b/tests/misc/factor.pl index 47f9343..38a5037 100755 --- a/tests/misc/factor.pl +++ b/tests/misc/factor.pl @@ -67,6 +67,11 @@ my @Tests =3D {OUT =3D> "4: 2 2\n"}, {ERR =3D> "$prog: 'a' is not a valid positive integer\n"}, {EXIT =3D> 1}], + ['bug-2012-a', '465658903', {OUT =3D> '15259 30517'}], + ['bug-2012-b', '2242724851', {OUT =3D> '33487 66973'}], + ['bug-2012-c', '6635692801', {OUT =3D> '57601 115201'}], + ['bug-2012-d', '17709149503', {OUT =3D> '94099 188197'}], + ['bug-2012-e', '17754345703', {OUT =3D> '94219 188437'}], ); # Prepend the command line argument and append a newline to end -- 1.7.12.176.g3fc0e4c From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 07 04:33:17 2012 Received: (at 12350) by debbugs.gnu.org; 7 Sep 2012 08:33:17 +0000 Received: from localhost ([127.0.0.1]:45378 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9u04-0000G9-VQ for submit@debbugs.gnu.org; Fri, 07 Sep 2012 04:33:17 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:21323 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9u02-0000Fz-0x for 12350@debbugs.gnu.org; Fri, 07 Sep 2012 04:33:15 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 5193B299B2; Fri, 7 Sep 2012 10:32:56 +0200 (CEST) To: Paul Eggert Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <50493E3E.5020000@cs.ucla.edu> From: Torbjorn Granlund Date: Fri, 07 Sep 2012 10:32:56 +0200 In-Reply-To: <50493E3E.5020000@cs.ucla.edu> (Paul Eggert's message of "Thu\, 06 Sep 2012 17\:22\:22 -0700") Message-ID: <86ipbqp70n.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, Jim Meyering X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Paul Eggert writes: On 09/06/2012 02:33 PM, Jim Meyering wrote: >> > * We have some hardwired W_TYPE_SIZE settings for the code interfaci= ng >> > to longlong.h. It is now 64 bits. It will break on systems where >> > uintmax_t is not a 64-bit type. Please see the beginning of >> > factor.c. > I wonder how many types of systems would be affected. =20=20 It's only a matter of time. GCC already supports 128-bit integers on my everyday host (Fedora 17, x86-64, GCC 4.7.1). Eventually uintmax_t will grow past 64 bits, if only for the crypto guys. =20=20 It should however be noted that uintmax_t stays at 64 bits even with GCC's 128-bit integers. I think the latter are declared as not being integers, or something along those lines, to avoid the ABI-breaking change of redefining uintmax_t. If the code needs exactly-64-bit unsigned integers, shouldn't it be using uint64_t? That's the standard way of doing that sort of thing. Gnulib can supply the type on pre-C99 platforms. Weird but standard-conforming platforms that don't have uint64_t will be out of luck, but surely they're out of luck anyway. =20=20 The code does not need any particular size of uintmax_t, except that we need a preprocessor-time size measurement of it. The reason for this is longlong.h's tests of which single-line asm code to include. The new factor program works without longlong.h, but some parts of it will become 3-4 times slower. To disable longlong.h, please compile with -DUSE_LONGLONG_H=3D0. (The worst affected parts would probably be the single-word Lucas code and all double-word factoring.) I suppose that an autoconf test of the type size will be needed at least for theoretical portability, if longlong.h is to be retained. There is one other place where some (hypothetical) portability problems may exist, and that's make-prime-list.c. It prints a list of uintmax_t literals. We let the coreutils maintainers worry about the allowable complexity of the factor program; I and Niels are happy to sacrifice some speed for lowering the code complexity. But first we will increase it by retrofitting GMP factoring code. :o) --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 07 04:43:45 2012 Received: (at 12350) by debbugs.gnu.org; 7 Sep 2012 08:43:45 +0000 Received: from localhost ([127.0.0.1]:45395 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9uAD-0000Wz-IV for submit@debbugs.gnu.org; Fri, 07 Sep 2012 04:43:45 -0400 Received: from mail.lysator.liu.se ([130.236.254.3]:43389) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9uAA-0000Wq-6n for 12350@debbugs.gnu.org; Fri, 07 Sep 2012 04:43:43 -0400 Received: from mail.lysator.liu.se (localhost [127.0.0.1]) by mail.lysator.liu.se (Postfix) with ESMTP id 4181640019; Fri, 7 Sep 2012 10:43:24 +0200 (CEST) Received: from stalhein.lysator.liu.se (stalhein.lysator.liu.se [IPv6:2001:6b0:17:f0a0::cc]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.lysator.liu.se (Postfix) with ESMTPS id 1930340005; Fri, 7 Sep 2012 10:43:24 +0200 (CEST) Received: from stalhein.lysator.liu.se (localhost [127.0.0.1]) by stalhein.lysator.liu.se (8.14.4+Sun/8.14.4) with ESMTP id q878hNfd025695; Fri, 7 Sep 2012 10:43:23 +0200 (MEST) Received: (from nisse@localhost) by stalhein.lysator.liu.se (8.14.4+Sun/8.14.4/Submit) id q878hKSO025692; Fri, 7 Sep 2012 10:43:20 +0200 (MEST) X-Authentication-Warning: stalhein.lysator.liu.se: nisse set sender to nisse@lysator.liu.se using -f From: nisse@lysator.liu.se (Niels =?iso-8859-1?Q?M=F6ller?=) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> Date: Fri, 07 Sep 2012 10:43:20 +0200 In-Reply-To: <87y5kmvntw.fsf@rho.meyering.net> (Jim Meyering's message of "Thu, 06 Sep 2012 23:33:15 +0200") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (usg-unix-v) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 X-Virus-Scanned: ClamAV using ClamSMTP Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, Torbjorn Granlund X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Jim Meyering writes: > The existing code can factor arbitrarily large numbers quickly, as long > as they have no large prime factors. We should retain that capability. My understanding is that most gnu/linux distributions build coreutils without linking to gmp. So lots of users don't get this capability. If this is an important feature, maybe one should consider bundling mini-gmp and use that as a fallback in case coreutils is configured without gmp (see http://gmplib.org:8000/gmp/file/7677276bdf92/mini-gmp/README). I would expect it to be a constant factor (maybe 10) times slower than the real gmp for numbers up to a few hundred bits (for larger numbers, it gets much slower due to lack of sophisticated algorithms, but we probably can't factor them in reasonable time anyway). Regards, /Niels --=20 Niels M=F6ller. PGP-encrypted email is preferred. Keyid C0B98E26. Internet email is subject to wholesale government surveillance. From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 07 04:57:06 2012 Received: (at 12350) by debbugs.gnu.org; 7 Sep 2012 08:57:06 +0000 Received: from localhost ([127.0.0.1]:45405 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9uN7-0000pp-Ac for submit@debbugs.gnu.org; Fri, 07 Sep 2012 04:57:06 -0400 Received: from mail.lysator.liu.se ([130.236.254.3]:44824) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9uN4-0000pY-88 for 12350@debbugs.gnu.org; Fri, 07 Sep 2012 04:57:03 -0400 Received: from mail.lysator.liu.se (localhost [127.0.0.1]) by mail.lysator.liu.se (Postfix) with ESMTP id 1CB8940020; Fri, 7 Sep 2012 10:56:45 +0200 (CEST) Received: from stalhein.lysator.liu.se (stalhein.lysator.liu.se [IPv6:2001:6b0:17:f0a0::cc]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.lysator.liu.se (Postfix) with ESMTPS id B8A3D40005; Fri, 7 Sep 2012 10:56:44 +0200 (CEST) Received: from stalhein.lysator.liu.se (localhost [127.0.0.1]) by stalhein.lysator.liu.se (8.14.4+Sun/8.14.4) with ESMTP id q878uh1k026154; Fri, 7 Sep 2012 10:56:44 +0200 (MEST) Received: (from nisse@localhost) by stalhein.lysator.liu.se (8.14.4+Sun/8.14.4/Submit) id q878ugFk026153; Fri, 7 Sep 2012 10:56:42 +0200 (MEST) X-Authentication-Warning: stalhein.lysator.liu.se: nisse set sender to nisse@lysator.liu.se using -f From: nisse@lysator.liu.se (Niels =?iso-8859-1?Q?M=F6ller?=) To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <50493E3E.5020000@cs.ucla.edu> <86ipbqp70n.fsf@shell.gmplib.org> Date: Fri, 07 Sep 2012 10:56:42 +0200 In-Reply-To: <86ipbqp70n.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Fri, 07 Sep 2012 10:32:56 +0200") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (usg-unix-v) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 X-Virus-Scanned: ClamAV using ClamSMTP Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, Paul Eggert , Jim Meyering X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Torbjorn Granlund writes: > There is one other place where some (hypothetical) portability problems > may exist, and that's make-prime-list.c. It prints a list of uintmax_t > literals. I don't think the prime sieving is not a problem, but for each (odd) prime p, it also computes p^{-1} mod 2^{bits} and floor ( (2^{bits} - 1) / p), where "bits" is the size of an uintmax_t. This will break cross compilation, if uintmax_t is of different size on build and host system, or if different suffixes (U, UL, ULL) are needed in the generated primes.h. Regards, /Niels --=20 Niels M=F6ller. PGP-encrypted email is preferred. Keyid C0B98E26. Internet email is subject to wholesale government surveillance. From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 07 05:01:26 2012 Received: (at 12350) by debbugs.gnu.org; 7 Sep 2012 09:01:26 +0000 Received: from localhost ([127.0.0.1]:45422 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9uRK-0000xE-0y for submit@debbugs.gnu.org; Fri, 07 Sep 2012 05:01:26 -0400 Received: from mx.meyering.net ([88.168.87.75]:49157) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9uRH-0000x2-0f for 12350@debbugs.gnu.org; Fri, 07 Sep 2012 05:01:24 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id D19B860115; Fri, 7 Sep 2012 11:01:03 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <86k3w624mx.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Fri, 07 Sep 2012 00:00:38 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> Date: Fri, 07 Sep 2012 11:01:03 +0200 Message-ID: <87bohiurzk.fsf@rho.meyering.net> Lines: 56 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Torbjorn Granlund wrote: ... > > * We have some hardwired W_TYPE_SIZE settings for the code interfacing > > to longlong.h. It is now 64 bits. It will break on systems where > > uintmax_t is not a 64-bit type. Please see the beginning of > > factor.c. > > I wonder how many types of systems would be affected. > > It is not used currently anywhere in coreutils? Perhaps coreutils could uintmax_t is used throughout coreutils, but nowhere (that comes to mind) does it fail when UINTMAX_MAX happens to be different than 2^64-1. What I was wondering is how many systems have a uintmax_t that is only 32 bits wide. Now that I reread, I suppose this code would be ok (albeit slower) with uintmax_t wider than 64. > use autoconf for checking this? (If we're really crazy, we could speed > the factor program by an additional 20% by using blocked input with > e.g. fread.) > > Please take a look at the generated code for factor_using_division, > towards the end where 8 imulq should be found (on amd64). The code uses > mov, imul, cmp, jbe for testing the divisibility of a prime; the branch > is taken when the prime divides the number being factored, thus highly > non-taken. (I suppose we could do a better job at describing the maths, > with some references. This particular trick is from "Division by > invariant integers using multiplication".) Any place you can add a reference would be most welcome. Here's one where I'd appreciate a reference in a comment: #define MAGIC64 ((uint64_t) 0x0202021202030213ULL) #define MAGIC63 ((uint64_t) 0x0402483012450293ULL) #define MAGIC65 ((uint64_t) 0x218a019866014613ULL) #define MAGIC11 0x23b /* Returns the square root if the input is a square, otherwise 0. */ static uintmax_t is_square (uintmax_t x) { /* Uses the tests suggested by Cohen. Excludes 99% of squares before computing the square root. */ if (((MAGIC64 >> (x & 63)) & 1) && ((MAGIC63 >> (x % 63)) & 1) /* Both 0 and 64 are squares mod (65) */ && ((MAGIC65 >> ((x % 65) & 63)) & 1) && ((MAGIC11 >> (x % 11) & 1))) { uintmax_t r = isqrt (x); if (r*r == x) return r; } return 0; } From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 07 05:28:46 2012 Received: (at 12350) by debbugs.gnu.org; 7 Sep 2012 09:28:46 +0000 Received: from localhost ([127.0.0.1]:45442 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9url-0002QY-Q5 for submit@debbugs.gnu.org; Fri, 07 Sep 2012 05:28:46 -0400 Received: from mx1.redhat.com ([209.132.183.28]:29572) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9urj-0002QP-7E for 12350@debbugs.gnu.org; Fri, 07 Sep 2012 05:28:44 -0400 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q879SPqi025345 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 7 Sep 2012 05:28:25 -0400 Received: from [10.36.116.77] (ovpn-116-77.ams2.redhat.com [10.36.116.77]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q879SKcI003010 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 7 Sep 2012 05:28:23 -0400 Message-ID: <5049BE33.30107@draigBrady.com> Date: Fri, 07 Sep 2012 10:28:19 +0100 From: =?ISO-8859-1?Q?P=E1draig_Brady?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:6.0) Gecko/20110816 Thunderbird/6.0 MIME-Version: 1.0 To: =?ISO-8859-1?Q?Niels_M=F6ller?= Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by mx1.redhat.com id q879SPqi025345 X-Spam-Score: -6.9 (------) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, Jim Meyering , Torbjorn Granlund X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -6.9 (------) On 09/07/2012 09:43 AM, Niels M=F6ller wrote: > Jim Meyering writes: > >> The existing code can factor arbitrarily large numbers quickly, as lon= g >> as they have no large prime factors. We should retain that capability. > > My understanding is that most gnu/linux distributions build coreutils > without linking to gmp. So lots of users don't get this capability. > > If this is an important feature, maybe one should consider bundling > mini-gmp and use that as a fallback in case coreutils is configured > without gmp (see > http://gmplib.org:8000/gmp/file/7677276bdf92/mini-gmp/README). I would > expect it to be a constant factor (maybe 10) times slower than the real > gmp for numbers up to a few hundred bits (for larger numbers, it gets > much slower due to lack of sophisticated algorithms, but we probably > can't factor them in reasonable time anyway). Bundling libraries is bad if one needed to update it. The correct approach here is to file a bug against your distro to enable gmp which is trivial matter of adding the build and runtime dependency on gmp. cheers, P=E1draig. From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 07 05:41:25 2012 Received: (at 12350) by debbugs.gnu.org; 7 Sep 2012 09:41:25 +0000 Received: from localhost ([127.0.0.1]:45465 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9v41-0003ZY-HF for submit@debbugs.gnu.org; Fri, 07 Sep 2012 05:41:25 -0400 Received: from mx1.redhat.com ([209.132.183.28]:19036) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9v3z-0003ZK-0m for 12350@debbugs.gnu.org; Fri, 07 Sep 2012 05:41:23 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q879f4Cn028504 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 7 Sep 2012 05:41:05 -0400 Received: from [10.36.116.77] (ovpn-116-77.ams2.redhat.com [10.36.116.77]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q879f2ok012951 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 7 Sep 2012 05:41:03 -0400 Message-ID: <5049C12D.4060507@draigBrady.com> Date: Fri, 07 Sep 2012 10:41:01 +0100 From: =?ISO-8859-1?Q?P=E1draig_Brady?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:6.0) Gecko/20110816 Thunderbird/6.0 MIME-Version: 1.0 To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <87k3w6uzh9.fsf@rho.meyering.net> In-Reply-To: <87k3w6uzh9.fsf@rho.meyering.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by mx1.redhat.com id q879f4Cn028504 X-Spam-Score: -6.9 (------) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, Torbjorn Granlund X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -6.9 (------) On 09/07/2012 07:19 AM, Jim Meyering wrote: > There have been enough changes (mostly typo fixes) that I'm re-posting > these for review before I push. Also, I added this sentence to NEWS > about the performance hit, too > > The fix makes factor somewhat slower (~25%) for ranges of consecut= ive > numbers, and up to 8 times slower for some worst-case individual n= umbers. Thanks for collating all the tweaks. +1 P=E1draig. From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 07 06:35:55 2012 Received: (at 12350) by debbugs.gnu.org; 7 Sep 2012 10:35:55 +0000 Received: from localhost ([127.0.0.1]:45529 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9vul-0005ic-Dz for submit@debbugs.gnu.org; Fri, 07 Sep 2012 06:35:55 -0400 Received: from mail.lysator.liu.se ([130.236.254.3]:46123) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9vuj-0005iU-He for 12350@debbugs.gnu.org; Fri, 07 Sep 2012 06:35:54 -0400 Received: from mail.lysator.liu.se (localhost [127.0.0.1]) by mail.lysator.liu.se (Postfix) with ESMTP id 5853D40019; Fri, 7 Sep 2012 12:35:35 +0200 (CEST) Received: from stalhein.lysator.liu.se (stalhein.lysator.liu.se [IPv6:2001:6b0:17:f0a0::cc]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.lysator.liu.se (Postfix) with ESMTPS id BD3F840005; Fri, 7 Sep 2012 12:35:34 +0200 (CEST) Received: from stalhein.lysator.liu.se (localhost [127.0.0.1]) by stalhein.lysator.liu.se (8.14.4+Sun/8.14.4) with ESMTP id q87AZXbZ029954; Fri, 7 Sep 2012 12:35:33 +0200 (MEST) Received: (from nisse@localhost) by stalhein.lysator.liu.se (8.14.4+Sun/8.14.4/Submit) id q87AZWUq029953; Fri, 7 Sep 2012 12:35:32 +0200 (MEST) X-Authentication-Warning: stalhein.lysator.liu.se: nisse set sender to nisse@lysator.liu.se using -f From: nisse@lysator.liu.se (Niels =?iso-8859-1?Q?M=F6ller?=) To: =?iso-8859-1?Q?P=E1draig?= Brady Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <5049BE33.30107@draigBrady.com> Date: Fri, 07 Sep 2012 12:35:32 +0200 In-Reply-To: <5049BE33.30107@draigBrady.com> (=?iso-8859-1?Q?=22P=E1draig?= Brady"'s message of "Fri, 07 Sep 2012 10:28:19 +0100") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (usg-unix-v) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 X-Virus-Scanned: ClamAV using ClamSMTP Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, Jim Meyering , Torbjorn Granlund X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) P=E1draig Brady writes: > On 09/07/2012 09:43 AM, Niels M=F6ller wrote: >> If this is an important feature, maybe one should consider bundling >> mini-gmp > Bundling libraries is bad if one needed to update it. mini-gmp is not an ordinary library. It's a single portable C source file (currently around 4000 lines) implementing a subset of the GMP API, and with performance only a few times slower than the real thing, for "small bignums". It's *intended* for bundling with applications, either for unconditional use, or for use as a fallback if the real gmp library is not available. It's never (I hope!) going to be installed in /usr/lib. To me, coreutil's factor seem to be close match for what it's intended for. That said, mini-gmp is pretty new (I wrote most of it around last Christmas) and I'm not aware of any application or library using it yet. I think the guile hackers are considering using it (for the benefit of applications which use guile as an extension language, but don't need high performance bignums). So if you decide to use it in coreutils, you'll be pioneers. It *is* used in the GMP build process, for precomputing various internal tables. Regards, /Niels --=20 Niels M=F6ller. PGP-encrypted email is preferred. Keyid C0B98E26. Internet email is subject to wholesale government surveillance. From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 07 06:59:36 2012 Received: (at 12350) by debbugs.gnu.org; 7 Sep 2012 10:59:36 +0000 Received: from localhost ([127.0.0.1]:45586 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9wHf-0007Ap-Ls for submit@debbugs.gnu.org; Fri, 07 Sep 2012 06:59:36 -0400 Received: from mx1.redhat.com ([209.132.183.28]:15835) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9wHc-0007Ae-Ko for 12350@debbugs.gnu.org; Fri, 07 Sep 2012 06:59:33 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q87AxAaJ017748 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 7 Sep 2012 06:59:11 -0400 Received: from [10.36.116.75] (ovpn-116-75.ams2.redhat.com [10.36.116.75]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q87Ax7mx029534 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 7 Sep 2012 06:59:09 -0400 Message-ID: <5049D37B.2090309@draigBrady.com> Date: Fri, 07 Sep 2012 11:59:07 +0100 From: =?ISO-8859-1?Q?P=E1draig_Brady?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:6.0) Gecko/20110816 Thunderbird/6.0 MIME-Version: 1.0 To: =?ISO-8859-1?Q?Niels_M=F6ller?= Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <5049BE33.30107@draigBrady.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by mx1.redhat.com id q87AxAaJ017748 X-Spam-Score: -6.9 (------) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, 608832@bugs.debian.org, Jim Meyering , Torbjorn Granlund X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -6.9 (------) On 09/07/2012 11:35 AM, Niels M=F6ller wrote: > P=E1draig Brady writes: > >> On 09/07/2012 09:43 AM, Niels M=F6ller wrote: > >>> If this is an important feature, maybe one should consider bundling >>> mini-gmp > >> Bundling libraries is bad if one needed to update it. > > mini-gmp is not an ordinary library. It's a single portable C source > file (currently around 4000 lines) implementing a subset of the GMP API= , > and with performance only a few times slower than the real thing, for > "small bignums". It's *intended* for bundling with applications, either > for unconditional use, or for use as a fallback if the real gmp library > is not available. It's never (I hope!) going to be installed in > /usr/lib. To me, coreutil's factor seem to be close match for what it's > intended for. > > That said, mini-gmp is pretty new (I wrote most of it around last > Christmas) and I'm not aware of any application or library using it yet. > I think the guile hackers are considering using it (for the benefit of > applications which use guile as an extension language, but don't need > high performance bignums). > > So if you decide to use it in coreutils, you'll be pioneers. > > It *is* used in the GMP build process, for precomputing various interna= l > tables. I can see the need when bootstrapping, but I'd prefer if coreutils just relied on regular GMP. That said, I see there is some push back in debian on depending on GMP. Note expr from coreutils also uses GMP, which may sway the decision. thanks, P=E1draig. From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 07 10:50:06 2012 Received: (at 12350) by debbugs.gnu.org; 7 Sep 2012 14:50:06 +0000 Received: from localhost ([127.0.0.1]:46774 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9zsj-00006v-Qh for submit@debbugs.gnu.org; Fri, 07 Sep 2012 10:50:06 -0400 Received: from smtp.cs.ucla.edu ([131.179.128.62]:41498) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T9zsg-00006l-Tm for 12350@debbugs.gnu.org; Fri, 07 Sep 2012 10:50:04 -0400 Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp.cs.ucla.edu (Postfix) with ESMTP id 15DD539E800E; Fri, 7 Sep 2012 07:49:44 -0700 (PDT) X-Virus-Scanned: amavisd-new at smtp.cs.ucla.edu 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 9ON82kemOTdo; Fri, 7 Sep 2012 07:49:43 -0700 (PDT) Received: from penguin.cs.ucla.edu (Penguin.CS.UCLA.EDU [131.179.64.200]) by smtp.cs.ucla.edu (Postfix) with ESMTPSA id 8743239E800A; Fri, 7 Sep 2012 07:49:43 -0700 (PDT) Message-ID: <504A0983.8020308@cs.ucla.edu> Date: Fri, 07 Sep 2012 07:49:39 -0700 From: Paul Eggert User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120828 Thunderbird/15.0 MIME-Version: 1.0 To: =?ISO-8859-1?Q?Niels_M=F6ller?= Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <5049BE33.30107@draigBrady.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, =?ISO-8859-1?Q?P=E1draig_Brady?= , Jim Meyering , Torbjorn Granlund X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) On 09/07/2012 03:35 AM, Niels M=F6ller wrote: > It's *intended* for bundling with applications, either > for unconditional use, or for use as a fallback if the real gmp library > is not available. I've been looking for something like that for Emacs, since I want Emacs to use bignums. Do you think it'd be suitable? One hassle I have with combining Emacs and GMP is that Emacs wants to control how memory is allocated, and wants its memory allocator to longjmp out if memory gets low, and GMP is documented to not support that. If the mini-gmp library doesn't have this problem I'm thinking that Emacs might use it *instead* of GMP. From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 07 14:09:57 2012 Received: (at 12350) by debbugs.gnu.org; 7 Sep 2012 18:09:57 +0000 Received: from localhost ([127.0.0.1]:47045 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TA308-0005Wx-PZ for submit@debbugs.gnu.org; Fri, 07 Sep 2012 14:09:57 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:44794 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TA304-0005Wm-FO for 12350@debbugs.gnu.org; Fri, 07 Sep 2012 14:09:55 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 1AB6A29AAD; Fri, 7 Sep 2012 20:09:32 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Fri, 07 Sep 2012 20:09:32 +0200 In-Reply-To: <87bohiurzk.fsf@rho.meyering.net> (Jim Meyering's message of "Fri\, 07 Sep 2012 11\:01\:03 +0200") Message-ID: <86fw6t1z8j.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) --=-=-= Jim Meyering writes: uintmax_t is used throughout coreutils, but nowhere (that comes to mind) does it fail when UINTMAX_MAX happens to be different than 2^64-1. What I was wondering is how many systems have a uintmax_t that is only 32 bits wide. Now that I reread, I suppose this code would be ok (albeit slower) with uintmax_t wider than 64. The code with work with longlong.h iff W_TYPE_SIZE is defined to the bitsize of uintmax_t. Any place you can add a reference would be most welcome. I have added comments here and there. More comments might be desirable. Here's one where I'd appreciate a reference in a comment: #define MAGIC64 ((uint64_t) 0x0202021202030213ULL) #define MAGIC63 ((uint64_t) 0x0402483012450293ULL) #define MAGIC65 ((uint64_t) 0x218a019866014613ULL) #define MAGIC11 0x23b I added a comment explaining these constants. Here is a new version of the code. It now has GMP factoring code, updated from the GMP demos code. --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=nt-factor-002.tar.lz Content-Transfer-Encoding: base64 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 /rr/of9uNivq/ZFKLAD4AgAAAAAAKIgAAAAAAAA= --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable --=20 Torbj=C3=B6rn --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 07 20:11:09 2012 Received: (at 12350) by debbugs.gnu.org; 8 Sep 2012 00:11:09 +0000 Received: from localhost ([127.0.0.1]:47400 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TA8dg-0006IC-Ft for submit@debbugs.gnu.org; Fri, 07 Sep 2012 20:11:09 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:42466 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TA8de-0006I3-0V for 12350@debbugs.gnu.org; Fri, 07 Sep 2012 20:11:06 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 5B34F29AF4; Sat, 8 Sep 2012 02:10:44 +0200 (CEST) To: Jim Meyering , 12350@debbugs.gnu.org, nisse@lysator.liu.se Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86fw6t1z8j.fsf@shell.gmplib.org> From: Torbjorn Granlund Date: Sat, 08 Sep 2012 02:10:44 +0200 In-Reply-To: <86fw6t1z8j.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Fri\, 07 Sep 2012 20\:09\:32 +0200") Message-ID: <867gs51iij.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) I found a problem with the GMP integration. We have a 100 byte buffer in the stdin reading code, which was adequate before we used GMP, but now one might want to attempt to factor much larger numbers. We'll fix that, but not tonight. --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 09 11:22:02 2012 Received: (at 12350) by debbugs.gnu.org; 9 Sep 2012 15:22:02 +0000 Received: from localhost ([127.0.0.1]:50403 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TAjKk-0007f2-Ef for submit@debbugs.gnu.org; Sun, 09 Sep 2012 11:22:02 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:17743 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TAjKi-0007ec-7R for 12350@debbugs.gnu.org; Sun, 09 Sep 2012 11:22:01 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 395F226AC1; Sun, 9 Sep 2012 17:21:29 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Sun, 09 Sep 2012 17:21:29 +0200 In-Reply-To: <87y5kmvntw.fsf@rho.meyering.net> (Jim Meyering's message of "Thu\, 06 Sep 2012 23\:33\:15 +0200") Message-ID: <86627nz0g6.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) We made a number of additional changes to the program. * It now works (again) without longlong.h. We provide this option for code simplicity, at the expensive of performance. * A new command line option `-w' enables weak primes testing. This is actually often a slowdown since 25 Miller-Rabin tests are currently often slower than the default of a combination of Miller-Rabin tests and Lucas tests. It will surely speed up some cases, in particular in the GMP range. * Speedup for prime_p by computing redcify of used bases more efficiently. * Cleanup and more comments. P=C3=A1draig's example should now run at about 40s on his machine. I believe we could make things about 50% faster for numbers < 2^128, mainly by improving powm, and by being more clever about how to compute the powers in Lucas. We could also speed Pollard rho by reducing the gcd call frequency. In the GMP range, there is more headroom. We can leave such improvements for the future. --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 09 16:00:36 2012 Received: (at 12350) by debbugs.gnu.org; 9 Sep 2012 20:00:36 +0000 Received: from localhost ([127.0.0.1]:50665 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TAngK-0005Ua-FJ for submit@debbugs.gnu.org; Sun, 09 Sep 2012 16:00:36 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:55701 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TAngE-0005UK-Mf for 12350@debbugs.gnu.org; Sun, 09 Sep 2012 16:00:33 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id C31CE26AFE; Sun, 9 Sep 2012 21:59:58 +0200 (CEST) To: Jim Meyering , 12350@debbugs.gnu.org, nisse@lysator.liu.se Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86627nz0g6.fsf@shell.gmplib.org> From: Torbjorn Granlund Date: Sun, 09 Sep 2012 21:59:58 +0200 In-Reply-To: <86627nz0g6.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Sun\, 09 Sep 2012 17\:21\:29 +0200") Message-ID: <86d31vx8zl.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) --=-=-= We found a bug causing performance problems for numbers between 2^64 and 2^127. It could also trigger asserts with factoring numbers close to 2^127. The new version is attached. --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=nt-factor-004.tar.lz Content-Transfer-Encoding: base64 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 --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable --=20 Torbj=C3=B6rn --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 10 07:51:49 2012 Received: (at 12350) by debbugs.gnu.org; 10 Sep 2012 11:51:49 +0000 Received: from localhost ([127.0.0.1]:51523 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TB2Wr-0003By-35 for submit@debbugs.gnu.org; Mon, 10 Sep 2012 07:51:49 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:50504 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TB2Wn-0003Bp-P2 for 12350@debbugs.gnu.org; Mon, 10 Sep 2012 07:51:48 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 01D6E31E95; Mon, 10 Sep 2012 13:51:09 +0200 (CEST) To: Jim Meyering , 12350@debbugs.gnu.org, nisse@lysator.liu.se Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86627nz0g6.fsf@shell.gmplib.org> <86d31vx8zl.fsf@shell.gmplib.org> From: Torbjorn Granlund Date: Mon, 10 Sep 2012 13:51:09 +0200 In-Reply-To: <86d31vx8zl.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Sun\, 09 Sep 2012 21\:59\:58 +0200") Message-ID: <86mx0yw0ya.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) --=-=-= Torbjorn Granlund writes: We found a bug causing performance problems for numbers between 2^64 and 2^127. It could also trigger asserts with factoring numbers close to 2^127. The new version is attached. Another bug found, this time related to the GMP code. It would clear out an uninitialised structure with prime proving disabled. Here ia a fixed version: --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=nt-factor-005.tar.lz Content-Transfer-Encoding: base64 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 --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable --=20 Torbj=C3=B6rn --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 13 05:52:45 2012 Received: (at 12350) by debbugs.gnu.org; 13 Sep 2012 09:52:45 +0000 Received: from localhost ([127.0.0.1]:58764 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TC66G-0002AP-7e for submit@debbugs.gnu.org; Thu, 13 Sep 2012 05:52:45 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:63882 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TC66D-0002AG-2G for 12350@debbugs.gnu.org; Thu, 13 Sep 2012 05:52:42 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id E36F139AB6; Thu, 13 Sep 2012 11:51:48 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Thu, 13 Sep 2012 11:51:48 +0200 In-Reply-To: <87bohiurzk.fsf@rho.meyering.net> (Jim Meyering's message of "Fri\, 07 Sep 2012 11\:01\:03 +0200") Message-ID: <86ligel07f.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) We won't be sending any more code replacement blobs to this address; it is most surely the wrong place. Please get our suggested factor.c replacement from . I plan to spend no more time on this project now. Should the contribution be accepted, I will make the necessary amendments to the GNU copyright paperwork. I am certainly willing to answer questions about the code, of course. --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 13 06:21:30 2012 Received: (at 12350) by debbugs.gnu.org; 13 Sep 2012 10:21:30 +0000 Received: from localhost ([127.0.0.1]:58796 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TC6Y4-0002oW-LQ for submit@debbugs.gnu.org; Thu, 13 Sep 2012 06:21:30 -0400 Received: from mx.meyering.net ([88.168.87.75]:41897) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TC6Xz-0002oN-3i for 12350@debbugs.gnu.org; Thu, 13 Sep 2012 06:21:26 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id B7892600FE; Thu, 13 Sep 2012 12:20:30 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <86ligel07f.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Thu, 13 Sep 2012 11:51:48 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> Date: Thu, 13 Sep 2012 12:20:30 +0200 Message-ID: <87ehm66x75.fsf@rho.meyering.net> Lines: 42 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -2.3 (--) --=-=-= Content-Type: text/plain Torbjorn Granlund wrote: > We won't be sending any more code replacement blobs to this address; it > is most surely the wrong place. Hi Torbjorn, I guess you're saying that because there's been too little feedback? IMHO, this is great work. I've been reviewing the latest and had prepared several patches. Just hadn't made time to send them. > Please get our suggested factor.c replacement from > . > > I plan to spend no more time on this project now. Should the > contribution be accepted, I will make the necessary amendments to the You may consider it accepted. That was clear in my mind from the beginning. Sorry if I didn't make that clear to you. Now, it's just a matter of integrating it. > GNU copyright paperwork. I am certainly willing to answer questions > about the code, of course. Here are some suggested changes -- I made these against a temporary local git repository using your -005 tarball. That was before I learned (just now) that you have a mercurial repository. I made the Makefile parallelization changes mostly to avoid waiting too long when I run "make check" -- in the very short run. Obviously we cannot use its GNU make features in coreutils/tests. In coreutils, we are pretty strict on warnings, so most of these changes are to avoid the few that remained. I've also moved some declarations "down" to be nearer their point of first initialization. That's another style issue in coreutils. We are no longer required to declare all variables at the top of each block. --=-=-= Content-Type: text/plain Content-Disposition: inline; filename=k >From bc5f37195abb5c0f9de7d65f5cc937ab902cd774 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 11 Sep 2012 11:59:17 +0200 Subject: [PATCH 01/12] CFLAGS: Add options. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 1378caf..9f84629 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ CC = gcc -CFLAGS = -O2 -g -Wall -Wno-unused-but-set-variable +CFLAGS = -std=gnu99 -O2 -g -Werror -W -Wall -Wno-unused-but-set-variable all: factor make-prime-list -- 1.7.12.363.g53284de >From 6488446b1185498fed02984ac51a1068e0d3bc7c Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 11 Sep 2012 11:55:30 +0200 Subject: [PATCH 02/12] s/const static/static const/ --- factor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/factor.c b/factor.c index abca67c..98e298c 100644 --- a/factor.c +++ b/factor.c @@ -793,7 +793,7 @@ mp_factor_using_division (mpz_t t, struct mp_factors *factors) #endif /* Entry i contains (2i+1)^(-1) mod 2^8. */ -const static unsigned char binvert_table[128] = +static const unsigned char binvert_table[128] = { 0x01, 0xAB, 0xCD, 0xB7, 0x39, 0xA3, 0xC5, 0xEF, 0xF1, 0x1B, 0x3D, 0xA7, 0x29, 0x13, 0x35, 0xDF, -- 1.7.12.363.g53284de >From d2b9e92f883f7817592d2cdbe338866dc9e94d49 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 11 Sep 2012 12:00:00 +0200 Subject: [PATCH 03/12] prime_2p: make r and k unsigned, and millerrabin: make k unsigned; move decl of i into for stmt. --- factor.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/factor.c b/factor.c index 98e298c..0c2999b 100644 --- a/factor.c +++ b/factor.c @@ -1038,7 +1038,6 @@ powm2 (uintmax_t *r1m, int millerrabin (uintmax_t n, uintmax_t ni, uintmax_t b, uintmax_t q, unsigned int k, uintmax_t one) { - unsigned int i; uintmax_t y, nm1; y = powm (b, q, n, ni, one); @@ -1048,7 +1047,7 @@ millerrabin (uintmax_t n, uintmax_t ni, uintmax_t b, uintmax_t q, unsigned int k if (y == one || y == nm1) return 1; - for (i = 1; i < k; i++) + for (unsigned int i = 1; i < k; i++) { y = mulredc (y, y, n, ni); @@ -1063,9 +1062,8 @@ millerrabin (uintmax_t n, uintmax_t ni, uintmax_t b, uintmax_t q, unsigned int k int millerrabin2 (const uintmax_t *np, uintmax_t ni, const uintmax_t *bp, const uintmax_t *qp, - int k, const uintmax_t *one) + unsigned int k, const uintmax_t *one) { - unsigned int i; uintmax_t y1, y0, nm1_1, nm1_0, r1m; y0 = powm2 (&r1m, bp, qp, np, ni, one); @@ -1079,7 +1077,7 @@ millerrabin2 (const uintmax_t *np, uintmax_t ni, if (y0 == nm1_0 && y1 == nm1_1) return 1; - for (i = 1; i < k; i++) + for (unsigned int i = 1; i < k; i++) { y0 = mulredc2 (&r1m, y1, y0, y1, y0, np[1], np[0], ni); y1 = r1m; @@ -1206,7 +1204,7 @@ prime2_p (uintmax_t n1, uintmax_t n0) uintmax_t one[2]; uintmax_t na[2]; uintmax_t ni; - int k, r; + unsigned int k, r; struct factors factors; if (n1 == 0) -- 1.7.12.363.g53284de >From 97d8c18730bd0dbed254ea64f29416c662cf772d Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 11 Sep 2012 12:25:51 +0200 Subject: [PATCH 04/12] move index decl into "for" stmt --- factor.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/factor.c b/factor.c index 0c2999b..0ef3667 100644 --- a/factor.c +++ b/factor.c @@ -1904,12 +1904,11 @@ factor_using_squfof (uintmax_t n1, uintmax_t n0, struct factors *factors) else { struct factors f; - unsigned i; f.nfactors = 0; factor_using_squfof (0, S, &f); /* Duplicate the new factors */ - for (i = 0; i < f.nfactors; i++) + for (unsigned int i = 0; i < f.nfactors; i++) factor_insert_multiplicity (factors, f.p[i], 2*f.e[i]); } return; -- 1.7.12.363.g53284de >From a0994e20ccbce4330fdd3a065e3db6fb43659b5e Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Thu, 6 Sep 2012 22:40:46 +0200 Subject: [PATCH 05/12] strto2uintmax: avoid signed/unsigned mismatch warning --- factor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/factor.c b/factor.c index 0ef3667..e3e5ee7 100644 --- a/factor.c +++ b/factor.c @@ -2182,7 +2182,7 @@ strto2uintmax (uintmax_t *hip, uintmax_t *lop, const char *s) { int errcode; int c; - int lo_carry; + unsigned int lo_carry; uintmax_t hi, lo; hi = lo = 0; -- 1.7.12.363.g53284de >From 4ba89941c2eae13ab3418bf4dc839a41535260b1 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 11 Sep 2012 12:27:28 +0200 Subject: [PATCH 06/12] prime_p: avoid signed/unsigned comparison warning --- factor.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/factor.c b/factor.c index e3e5ee7..ff56b34 100644 --- a/factor.c +++ b/factor.c @@ -1119,7 +1119,7 @@ mp_millerrabin (mpz_srcptr n, mpz_srcptr nm1, mpz_ptr x, mpz_ptr y, int prime_p (uintmax_t n) { - int k, r, is_prime; + int k, is_prime; uintmax_t q, a, a_prim, one, ni; struct factors factors; @@ -1152,7 +1152,7 @@ prime_p (uintmax_t n) /* Loop until Lucas proves our number prime, or Miller-Rabin proves our number composite. */ - for (r = 0; r < PRIMES_PTAB_ENTRIES; r++) + for (unsigned int r = 0; r < PRIMES_PTAB_ENTRIES; r++) { int i; -- 1.7.12.363.g53284de >From d22cf07c4eb7e4da736d3230cfa29515742611b3 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Thu, 6 Sep 2012 22:42:49 +0200 Subject: [PATCH 07/12] factor_using_squfof: (MERGE w/prev) avoid signed/unsigned compare warning --- factor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/factor.c b/factor.c index ff56b34..c49ab0b 100644 --- a/factor.c +++ b/factor.c @@ -1908,7 +1908,7 @@ factor_using_squfof (uintmax_t n1, uintmax_t n0, struct factors *factors) f.nfactors = 0; factor_using_squfof (0, S, &f); /* Duplicate the new factors */ - for (unsigned int i = 0; i < f.nfactors; i++) + for (int i = 0; i < f.nfactors; i++) factor_insert_multiplicity (factors, f.p[i], 2*f.e[i]); } return; -- 1.7.12.363.g53284de >From d242b192b3b2d22f2040cd5260fa7de0785bd550 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Thu, 6 Sep 2012 22:45:45 +0200 Subject: [PATCH 08/12] strto2uintmax: avoid signed/unsigned compare warning --- factor.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/factor.c b/factor.c index c49ab0b..b3a4ca9 100644 --- a/factor.c +++ b/factor.c @@ -2181,14 +2181,13 @@ int strto2uintmax (uintmax_t *hip, uintmax_t *lop, const char *s) { int errcode; - int c; unsigned int lo_carry; uintmax_t hi, lo; hi = lo = 0; for (;;) { - c = *s++; + unsigned char c = *s++; if (c == 0) break; -- 1.7.12.363.g53284de >From 235f5a220f03d44f94222334bc832d738325c8a6 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Thu, 6 Sep 2012 23:00:10 +0200 Subject: [PATCH 09/12] HIGHBIT_TO_MASK: avoid signed/unsigned warning: Cast 2nd operand of ternary operator to uintmax_t, to match the type of the third operand. --- factor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/factor.c b/factor.c index b3a4ca9..7b9e50d 100644 --- a/factor.c +++ b/factor.c @@ -342,7 +342,7 @@ void factor (uintmax_t, uintmax_t, struct factors *); #define HIGHBIT_TO_MASK(x) \ (((intmax_t)-1 >> 1) < 0 \ - ? ((intmax_t)(x) >> (W_TYPE_SIZE - 1)) \ + ? (uintmax_t)((intmax_t)(x) >> (W_TYPE_SIZE - 1)) \ : ((x) & ((uintmax_t) 1 << (W_TYPE_SIZE - 1)) \ ? UINTMAX_MAX : (uintmax_t) 0)) -- 1.7.12.363.g53284de >From 19fc1e4bf36efef4153e49be7703bb3ea425308f Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 11 Sep 2012 13:50:10 +0200 Subject: [PATCH 10/12] run tests in parallel; put expected SHA in Makefile --- Makefile | 84 +++++++++++++++++++++++++++-------------------------------- tests/b0.sha | 1 - tests/b1.sha | 1 - tests/b10.sha | 1 - tests/b2.sha | 1 - tests/b3.sha | 1 - tests/b4.sha | 1 - tests/b5.sha | 1 - tests/b6.sha | 1 - tests/b7.sha | 1 - tests/b8.sha | 1 - tests/b9.sha | 1 - tests/h1.sha | 1 - tests/q1.sha | 1 - tests/q2.sha | 1 - tests/q3.sha | 1 - tests/q4.sha | 1 - tests/q5.sha | 1 - tests/s0.sha | 1 - tests/s1.sha | 1 - tests/s2.sha | 1 - tests/s3.sha | 1 - tests/s4.sha | 1 - tests/s5.sha | 1 - tests/s6.sha | 1 - tests/s7.sha | 1 - tests/s8.sha | 1 - tests/s9.sha | 1 - 28 files changed, 39 insertions(+), 72 deletions(-) delete mode 100644 tests/b0.sha delete mode 100644 tests/b1.sha delete mode 100644 tests/b10.sha delete mode 100644 tests/b2.sha delete mode 100644 tests/b3.sha delete mode 100644 tests/b4.sha delete mode 100644 tests/b5.sha delete mode 100644 tests/b6.sha delete mode 100644 tests/b7.sha delete mode 100644 tests/b8.sha delete mode 100644 tests/b9.sha delete mode 100644 tests/h1.sha delete mode 100644 tests/q1.sha delete mode 100644 tests/q2.sha delete mode 100644 tests/q3.sha delete mode 100644 tests/q4.sha delete mode 100644 tests/q5.sha delete mode 100644 tests/s0.sha delete mode 100644 tests/s1.sha delete mode 100644 tests/s2.sha delete mode 100644 tests/s3.sha delete mode 100644 tests/s4.sha delete mode 100644 tests/s5.sha delete mode 100644 tests/s6.sha delete mode 100644 tests/s7.sha delete mode 100644 tests/s8.sha delete mode 100644 tests/s9.sha diff --git a/Makefile b/Makefile index 9f84629..107a53c 100644 --- a/Makefile +++ b/Makefile @@ -43,51 +43,45 @@ clean: # Use make check CHECK_FLAGS=-s to check squfof CHECK_FLAGS= -check: factor ourseq - ./ourseq 0 1000000 | ./factor $(CHECK_FLAGS) | shasum -c --status tests/s0.sha - ./ourseq 18446744073709541616 18446744073709551615 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/b0.sha - ./ourseq 0 10000000 | ./factor $(CHECK_FLAGS) | shasum -c --status tests/s1.sha - ./ourseq 10000000 20000000 | ./factor $(CHECK_FLAGS) | shasum -c --status tests/s2.sha - ./ourseq 20000000 30000000 | ./factor $(CHECK_FLAGS) | shasum -c --status tests/s3.sha - ./ourseq 30000000 40000000 | ./factor $(CHECK_FLAGS) | shasum -c --status tests/s4.sha - ./ourseq 40000000 50000000 | ./factor $(CHECK_FLAGS) | shasum -c --status tests/s5.sha - ./ourseq 50000000 60000000 | ./factor $(CHECK_FLAGS) | shasum -c --status tests/s6.sha - ./ourseq 60000000 70000000 | ./factor $(CHECK_FLAGS) | shasum -c --status tests/s7.sha - ./ourseq 70000000 80000000 | ./factor $(CHECK_FLAGS) | shasum -c --status tests/s8.sha - ./ourseq 80000000 90000000 | ./factor $(CHECK_FLAGS) | shasum -c --status tests/s9.sha - ./ourseq 18446744073708551616 18446744073708651615 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/b1.sha - ./ourseq 18446744073708651616 18446744073708751615 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/b2.sha - ./ourseq 18446744073708751616 18446744073708851615 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/b3.sha - ./ourseq 18446744073708851616 18446744073708951615 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/b4.sha - ./ourseq 18446744073708951616 18446744073709051615 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/b5.sha - ./ourseq 18446744073709051616 18446744073709151615 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/b6.sha - ./ourseq 18446744073709151616 18446744073709251615 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/b7.sha - ./ourseq 18446744073709251616 18446744073709351615 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/b8.sha - ./ourseq 18446744073709351616 18446744073709451615 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/b9.sha - ./ourseq 18446744073709451616 18446744073709551615 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/b10.sha - ./ourseq 18446744073709551616 18446744073709651615 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/q1.sha - ./ourseq 18446744073709651616 18446744073709751615 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/q2.sha - ./ourseq 18446744073709751616 18446744073709851615 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/q3.sha - ./ourseq 18446744073709851616 18446744073709951615 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/q4.sha - ./ourseq 18446744073709951616 18446744073710051615 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/q5.sha - ./ourseq 79228162514264337593543850336 79228162514264337593543860335 \ - | ./factor $(CHECK_FLAGS) | shasum -c --status tests/h1.sha +p = 1844674407370 +q = 792281625142643375935438 + +args = $(word 2,$(subst -, ,$@)) $(word 3,$(subst -, ,$@)) +tests = \ + t-0-10000000-a451244522b1b662c86cb3cbb55aee3e085a61a0 \ + t-10000000-20000000-c792a2e02f1c8536b5121f624b04039d20187016 \ + t-20000000-30000000-8115e8dff97d1674134ec054598d939a2a5f6113 \ + t-30000000-40000000-fe7b832c8e0ed55035152c0f9ebd59de73224a60 \ + t-40000000-50000000-b8786d66c432e48bc5b342ee3c6752b7f096f206 \ + t-50000000-60000000-a74fe518c5f79873c2b9016745b88b42c8fd3ede \ + t-60000000-70000000-689bc70d681791e5d1b8ac1316a05d0c4473d6db \ + t-70000000-80000000-d370808f2ab8c865f64c2ff909c5722db5b7d58d \ + t-80000000-90000000-7978aa66bf2bdb446398336ea6f02605e9a77581 \ + t-$(p)8551616-$(p)8651615-66c57cd58f4fb572df7f088d17e4f4c1d4f01bb1 \ + t-$(p)8551616-$(p)8651615-66c57cd58f4fb572df7f088d17e4f4c1d4f01bb1 \ + t-$(p)8651616-$(p)8751615-729228e693b1a568ecc85b199927424c7d16d410 \ + t-$(p)8751616-$(p)8851615-5a0c985017c2d285e4698f836f5a059e0b684563 \ + t-$(p)8851616-$(p)8951615-0482295c514e371c98ce9fd335deed0c9c44a4f4 \ + t-$(p)8951616-$(p)9051615-9c0e1105ac7c45e27e7bbeb5e213f530d2ad1a71 \ + t-$(p)9051616-$(p)9151615-604366d2b1d75371d0679e6a68962d66336cd383 \ + t-$(p)9151616-$(p)9251615-9192d2bdee930135b28d7160e6d395a7027871da \ + t-$(p)9251616-$(p)9351615-bcf56ae55d20d700690cff4d3327b78f83fc01bf \ + t-$(p)9351616-$(p)9451615-16b106398749e5f24d278ba7c58229ae43f650ac \ + t-$(p)9451616-$(p)9551615-ad2c6ed63525f8e7c83c4c416e7715fa1bebc54c \ + t-$(p)9551616-$(p)9651615-2b6f9c11742d9de045515a6627c27a042c49f8ba \ + t-$(p)9651616-$(p)9751615-54851acd51c4819beb666e26bc0100dc9adbc310 \ + t-$(p)9751616-$(p)9851615-6939c2a7afd2d81f45f818a159b7c5226f83a50b \ + t-$(p)9851616-$(p)9951615-0f2c8bc011d2a45e2afa01459391e68873363c6c \ + t-$(p)9951616-18446744073710051615-630dc2ad72f4c222bad1405e6c5bea590f92a98c \ + t-$(q)50336-$(q)60335-51ccb201e35599d545cb942e2bb31aba5bce4fc5 + +$(tests): factor ourseq + @echo '$(lastword $(subst -, ,$@)) -' > exp.$@ + @echo $(args) + @./ourseq $(args) | ./factor $(CHECK_FLAGS) | shasum -c --status exp.$@ + @rm exp.$@ + +check: $(tests) factor ourseq ver = `cat ver` dist: diff --git a/tests/b0.sha b/tests/b0.sha deleted file mode 100644 index 2811aa7..0000000 --- a/tests/b0.sha +++ /dev/null @@ -1 +0,0 @@ -28cc641760150f6bd378c27c6f810c8a4a9792d8 - diff --git a/tests/b1.sha b/tests/b1.sha deleted file mode 100644 index 64a6025..0000000 --- a/tests/b1.sha +++ /dev/null @@ -1 +0,0 @@ -66c57cd58f4fb572df7f088d17e4f4c1d4f01bb1 - diff --git a/tests/b10.sha b/tests/b10.sha deleted file mode 100644 index a5bf947..0000000 --- a/tests/b10.sha +++ /dev/null @@ -1 +0,0 @@ -ad2c6ed63525f8e7c83c4c416e7715fa1bebc54c - diff --git a/tests/b2.sha b/tests/b2.sha deleted file mode 100644 index 29c5e6a..0000000 --- a/tests/b2.sha +++ /dev/null @@ -1 +0,0 @@ -729228e693b1a568ecc85b199927424c7d16d410 - diff --git a/tests/b3.sha b/tests/b3.sha deleted file mode 100644 index b8b0a56..0000000 --- a/tests/b3.sha +++ /dev/null @@ -1 +0,0 @@ -5a0c985017c2d285e4698f836f5a059e0b684563 - diff --git a/tests/b4.sha b/tests/b4.sha deleted file mode 100644 index 9ff8dad..0000000 --- a/tests/b4.sha +++ /dev/null @@ -1 +0,0 @@ -0482295c514e371c98ce9fd335deed0c9c44a4f4 - diff --git a/tests/b5.sha b/tests/b5.sha deleted file mode 100644 index d577478..0000000 --- a/tests/b5.sha +++ /dev/null @@ -1 +0,0 @@ -9c0e1105ac7c45e27e7bbeb5e213f530d2ad1a71 - diff --git a/tests/b6.sha b/tests/b6.sha deleted file mode 100644 index f8d57e6..0000000 --- a/tests/b6.sha +++ /dev/null @@ -1 +0,0 @@ -604366d2b1d75371d0679e6a68962d66336cd383 - diff --git a/tests/b7.sha b/tests/b7.sha deleted file mode 100644 index 69997c4..0000000 --- a/tests/b7.sha +++ /dev/null @@ -1 +0,0 @@ -9192d2bdee930135b28d7160e6d395a7027871da - diff --git a/tests/b8.sha b/tests/b8.sha deleted file mode 100644 index 10aac6b..0000000 --- a/tests/b8.sha +++ /dev/null @@ -1 +0,0 @@ -bcf56ae55d20d700690cff4d3327b78f83fc01bf - diff --git a/tests/b9.sha b/tests/b9.sha deleted file mode 100644 index 8859f9f..0000000 --- a/tests/b9.sha +++ /dev/null @@ -1 +0,0 @@ -16b106398749e5f24d278ba7c58229ae43f650ac - diff --git a/tests/h1.sha b/tests/h1.sha deleted file mode 100644 index 3ce3865..0000000 --- a/tests/h1.sha +++ /dev/null @@ -1 +0,0 @@ -51ccb201e35599d545cb942e2bb31aba5bce4fc5 - diff --git a/tests/q1.sha b/tests/q1.sha deleted file mode 100644 index 3bc8e2a..0000000 --- a/tests/q1.sha +++ /dev/null @@ -1 +0,0 @@ -2b6f9c11742d9de045515a6627c27a042c49f8ba - diff --git a/tests/q2.sha b/tests/q2.sha deleted file mode 100644 index c1c4ae4..0000000 --- a/tests/q2.sha +++ /dev/null @@ -1 +0,0 @@ -54851acd51c4819beb666e26bc0100dc9adbc310 - diff --git a/tests/q3.sha b/tests/q3.sha deleted file mode 100644 index 49a29e9..0000000 --- a/tests/q3.sha +++ /dev/null @@ -1 +0,0 @@ -6939c2a7afd2d81f45f818a159b7c5226f83a50b - diff --git a/tests/q4.sha b/tests/q4.sha deleted file mode 100644 index 7922917..0000000 --- a/tests/q4.sha +++ /dev/null @@ -1 +0,0 @@ -0f2c8bc011d2a45e2afa01459391e68873363c6c - diff --git a/tests/q5.sha b/tests/q5.sha deleted file mode 100644 index 9d4f028..0000000 --- a/tests/q5.sha +++ /dev/null @@ -1 +0,0 @@ -630dc2ad72f4c222bad1405e6c5bea590f92a98c - diff --git a/tests/s0.sha b/tests/s0.sha deleted file mode 100644 index 3a8136d..0000000 --- a/tests/s0.sha +++ /dev/null @@ -1 +0,0 @@ -fe06c03e8dcaeee1cb3d657e56047a190c766d46 - diff --git a/tests/s1.sha b/tests/s1.sha deleted file mode 100644 index 41cccdc..0000000 --- a/tests/s1.sha +++ /dev/null @@ -1 +0,0 @@ -a451244522b1b662c86cb3cbb55aee3e085a61a0 - diff --git a/tests/s2.sha b/tests/s2.sha deleted file mode 100644 index c829df7..0000000 --- a/tests/s2.sha +++ /dev/null @@ -1 +0,0 @@ -c792a2e02f1c8536b5121f624b04039d20187016 - diff --git a/tests/s3.sha b/tests/s3.sha deleted file mode 100644 index fb8effc..0000000 --- a/tests/s3.sha +++ /dev/null @@ -1 +0,0 @@ -8115e8dff97d1674134ec054598d939a2a5f6113 - diff --git a/tests/s4.sha b/tests/s4.sha deleted file mode 100644 index f744178..0000000 --- a/tests/s4.sha +++ /dev/null @@ -1 +0,0 @@ -fe7b832c8e0ed55035152c0f9ebd59de73224a60 - diff --git a/tests/s5.sha b/tests/s5.sha deleted file mode 100644 index 61ae911..0000000 --- a/tests/s5.sha +++ /dev/null @@ -1 +0,0 @@ -b8786d66c432e48bc5b342ee3c6752b7f096f206 - diff --git a/tests/s6.sha b/tests/s6.sha deleted file mode 100644 index 0f7f250..0000000 --- a/tests/s6.sha +++ /dev/null @@ -1 +0,0 @@ -a74fe518c5f79873c2b9016745b88b42c8fd3ede - diff --git a/tests/s7.sha b/tests/s7.sha deleted file mode 100644 index 76f5159..0000000 --- a/tests/s7.sha +++ /dev/null @@ -1 +0,0 @@ -689bc70d681791e5d1b8ac1316a05d0c4473d6db - diff --git a/tests/s8.sha b/tests/s8.sha deleted file mode 100644 index ad84d82..0000000 --- a/tests/s8.sha +++ /dev/null @@ -1 +0,0 @@ -d370808f2ab8c865f64c2ff909c5722db5b7d58d - diff --git a/tests/s9.sha b/tests/s9.sha deleted file mode 100644 index 2cfe601..0000000 --- a/tests/s9.sha +++ /dev/null @@ -1 +0,0 @@ -7978aa66bf2bdb446398336ea6f02605e9a77581 - -- 1.7.12.363.g53284de >From d88087d9f4ac1b1e767be6f6547a28e5a01641ff Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 11 Sep 2012 14:27:18 +0200 Subject: [PATCH 11/12] adjust comment wording --- factor.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/factor.c b/factor.c index 7b9e50d..b7cfcbf 100644 --- a/factor.c +++ b/factor.c @@ -18,8 +18,8 @@ PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ -/* Factor efficiently numbers that fit in one or two words (word = uintmax_t), - of with GMP numbers of any size. +/* Efficiently factor numbers that fit in one or two words (word = uintmax_t), + or, with GMP, numbers of any size. Code organisation: -- 1.7.12.363.g53284de >From 509bc134f8a3c603ac338f67c1ad0127ae29fbe3 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 11 Sep 2012 14:27:53 +0200 Subject: [PATCH 12/12] factor_insert_refind: make "off" unsigned, not int --- factor.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/factor.c b/factor.c index b7cfcbf..59a4e73 100644 --- a/factor.c +++ b/factor.c @@ -623,9 +623,10 @@ int flag_prove_primality = 1; #define UNLIKELY(cond) __builtin_expect ((cond) != 0, 0) void -factor_insert_refind (struct factors *factors, uintmax_t p, unsigned int i, int off) +factor_insert_refind (struct factors *factors, uintmax_t p, unsigned int i, + unsigned int off) { - int j; + unsigned int j; for (j = 0; j < off; j++) p += primes_diff[i + j]; factor_insert (factors, p); -- 1.7.12.363.g53284de --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 13 07:31:15 2012 Received: (at 12350) by debbugs.gnu.org; 13 Sep 2012 11:31:15 +0000 Received: from localhost ([127.0.0.1]:58913 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TC7db-0005Ks-8L for submit@debbugs.gnu.org; Thu, 13 Sep 2012 07:31:15 -0400 Received: from mx.meyering.net ([88.168.87.75]:42085) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TC7dY-0005Kf-SN for 12350@debbugs.gnu.org; Thu, 13 Sep 2012 07:31:14 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 0DA2D603A2; Thu, 13 Sep 2012 13:30:18 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <87ehm66x75.fsf@rho.meyering.net> (Jim Meyering's message of "Thu, 13 Sep 2012 12:20:30 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> Date: Thu, 13 Sep 2012 13:30:18 +0200 Message-ID: <87y5ke5fed.fsf@rho.meyering.net> Lines: 135 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -2.4 (--) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -2.4 (--) Jim Meyering wrote: > Torbjorn Granlund wrote: >> We won't be sending any more code replacement blobs to this address; it >> is most surely the wrong place. > > Hi Torbjorn, > > I guess you're saying that because there's been too little feedback? > IMHO, this is great work. > I've been reviewing the latest and had prepared several patches. > Just hadn't made time to send them. > >> Please get our suggested factor.c replacement from >> . >> >> I plan to spend no more time on this project now. Should the >> contribution be accepted, I will make the necessary amendments to the > > You may consider it accepted. That was clear in my mind from > the beginning. Sorry if I didn't make that clear to you. > Now, it's just a matter of integrating it. > >> GNU copyright paperwork. I am certainly willing to answer questions >> about the code, of course. > > Here are some suggested changes -- I made these against > a temporary local git repository using your -005 tarball. > That was before I learned (just now) that you have a mercurial > repository. Here's a change without which ourseq misuse clobbers the heap: $ valgrind ./ourseq 99999999999999999999999 1 ==7387== Memcheck, a memory error detector ==7387== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. ==7387== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info ==7387== Command: ./ourseq 99999999999999999999999 1 ==7387== ==7387== Invalid write of size 8 ==7387== at 0x4A0A0CB: memcpy@@GLIBC_2.14 (mc_replace_strmem.c:837) ==7387== by 0x4006CC: main (ourseq.c:74) ==7387== Address 0x4c35040 is 0 bytes inside a block of size 3 alloc'd ==7387== at 0x4A0884D: malloc (vg_replace_malloc.c:263) ==7387== by 0x4006AD: main (ourseq.c:71) ==7387== first string greater than second string ==7387== ==7387== HEAP SUMMARY: ==7387== in use at exit: 5 bytes in 2 blocks ==7387== total heap usage: 2 allocs, 0 frees, 5 bytes allocated ==7387== ==7387== LEAK SUMMARY: ==7387== definitely lost: 0 bytes in 0 blocks ==7387== indirectly lost: 0 bytes in 0 blocks ==7387== possibly lost: 0 bytes in 0 blocks ==7387== still reachable: 5 bytes in 2 blocks ==7387== suppressed: 0 bytes in 0 blocks ==7387== Rerun with --leak-check=full to see details of leaked memory ==7387== ==7387== For counts of detected and suppressed errors, rerun with: -v ==7387== ERROR SUMMARY: 3 errors from 1 contexts (suppressed: 2 from 2) >From 2fe3143867a3a2f0b3f4d0ff71c8bfca9c676127 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Thu, 13 Sep 2012 13:27:48 +0200 Subject: [PATCH] bug fix: ourseq would clobber heap for some out-of-order args * ourseq.c (main): Don't clobber heap for argv[1] longer than argv[2]. Also declare functions static and some parameters const. --- ChangeLog | 6 ++++++ ourseq.c | 13 +++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index d71a8c3..b009136 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-09-13 Jim Meyering + + bug fix: ourseq would clobber heap for some out-of-order args + * ourseq.c (main): Don't clobber heap for argv[1] longer than argv[2]. + Also declare functions static and some parameters const. + 2012-09-10 Torbjorn Granlund * factor.c (mp_prime_p): Clear out `factors' only after Lucas run. diff --git a/ourseq.c b/ourseq.c index cb71f13..a9899f9 100644 --- a/ourseq.c +++ b/ourseq.c @@ -1,5 +1,5 @@ /* A simple seq program that operates directly on the numeric strings. - This works around strange limits/bugs in standards seq implementations. */ + This works around strange limits/bugs in standard seq implementations. */ #include #include @@ -13,8 +13,8 @@ struct string typedef struct string string; -int -cmp (string *s1, string *s2) +static int +cmp (string const *s1, string const *s2) { size_t len1, len2; @@ -29,7 +29,7 @@ cmp (string *s1, string *s2) return strcmp (s1->str, s2->str); } -void +static void incr (string *st) { size_t len; @@ -67,6 +67,11 @@ main (int argc, char **argv) len1 = strlen (argv[1]); len2 = strlen (argv[2]); + if (len2 < len1) + { + fprintf (stderr, "first string greater than second string\n"); + exit (1); + } b.str = malloc (len2 + 2); /* not a typo for len1 */ e.str = malloc (len2 + 1); -- 1.7.12.363.g53284de From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 13 15:16:24 2012 Received: (at 12350) by debbugs.gnu.org; 13 Sep 2012 19:16:24 +0000 Received: from localhost ([127.0.0.1]:60507 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TCEti-0007iD-Aw for submit@debbugs.gnu.org; Thu, 13 Sep 2012 15:16:23 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:34548 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TCEtf-0007i3-2F for 12350@debbugs.gnu.org; Thu, 13 Sep 2012 15:16:20 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 8E0E239B2D; Thu, 13 Sep 2012 21:15:24 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Thu, 13 Sep 2012 21:15:24 +0200 In-Reply-To: <87ehm66x75.fsf@rho.meyering.net> (Jim Meyering's message of "Thu\, 13 Sep 2012 12\:20\:30 +0200") Message-ID: <86a9wt4tv7.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) > We won't be sending any more code replacement blobs to this address; it > is most surely the wrong place. =20=20 I guess you're saying that because there's been too little feedback? Not really. I suppose I'm sending a code replacement so that it get appended to a bug report. My initial post was infact a bug report, but that was 30 posts ago... IMHO, this is great work. Thanks. You may consider it accepted. That was clear in my mind from the beginning. Sorry if I didn't make that clear to you. Now, it's just a matter of integrating it. =20=20 Good. I would certainly accept rejection, or partial rejection. I suppose the code is a fair bit more complex than one might perhaps expect, but we don't know how to make it neater without a large performance penalty. But we can make it much more complex if desirable. :-) I think the ugliest part is the interface to longlong.h. I don't know how to make that better, though. Here are some suggested changes -- I made these against a temporary local git repository using your -005 tarball. That was before I learned (just now) that you have a mercurial repository. =20=20 I'll take a look within a few days. --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 13 20:25:43 2012 Received: (at 12350) by debbugs.gnu.org; 14 Sep 2012 00:25:43 +0000 Received: from localhost ([127.0.0.1]:60851 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TCJj4-0007EF-23 for submit@debbugs.gnu.org; Thu, 13 Sep 2012 20:25:43 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:61383 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TCJj1-0007E7-FC for 12350@debbugs.gnu.org; Thu, 13 Sep 2012 20:25:40 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id EDE9539B69; Fri, 14 Sep 2012 02:24:43 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <87y5ke5fed.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Fri, 14 Sep 2012 02:24:43 +0200 In-Reply-To: <87y5ke5fed.fsf@rho.meyering.net> (Jim Meyering's message of "Thu\, 13 Sep 2012 13\:30\:18 +0200") Message-ID: <86obl95u44.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) * ourseq.c (main): Don't clobber heap for argv[1] longer than argv[2]. Also declare functions static and some parameters const. I put this into our repo, and also tacked on a GPL header to make sure nobody would mistake this for non-free software. --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 14 07:39:14 2012 Received: (at 12350) by debbugs.gnu.org; 14 Sep 2012 11:39:14 +0000 Received: from localhost ([127.0.0.1]:33169 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TCUEr-0006hH-Pu for submit@debbugs.gnu.org; Fri, 14 Sep 2012 07:39:14 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:44782 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TCUEp-0006h9-Cr for 12350@debbugs.gnu.org; Fri, 14 Sep 2012 07:39:12 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 3D5753C635; Fri, 14 Sep 2012 13:38:13 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Fri, 14 Sep 2012 13:38:13 +0200 In-Reply-To: <87ehm66x75.fsf@rho.meyering.net> (Jim Meyering's message of "Thu\, 13 Sep 2012 12\:20\:30 +0200") Message-ID: <86k3vw6di2.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) I merged your changes, and made several analogous changes. The code now passes strict compilation with and without HAVE_GMP. I did not merge the tests changes yet. Please grab our version from our repo. If your repo is public, please let me now how to access it. Else, please either send a diff -c between your version and our repo version, or your full file. --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 14 08:49:07 2012 Received: (at 12350) by debbugs.gnu.org; 14 Sep 2012 12:49:07 +0000 Received: from localhost ([127.0.0.1]:33218 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TCVKU-0008IT-Ql for submit@debbugs.gnu.org; Fri, 14 Sep 2012 08:49:07 -0400 Received: from mx.meyering.net ([88.168.87.75]:45920) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TCVKQ-0008I0-QT for 12350@debbugs.gnu.org; Fri, 14 Sep 2012 08:49:04 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id EEB0560360; Fri, 14 Sep 2012 14:48:00 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <86k3vw6di2.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Fri, 14 Sep 2012 13:38:13 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86k3vw6di2.fsf@shell.gmplib.org> Date: Fri, 14 Sep 2012 14:48:00 +0200 Message-ID: <87a9ws22kf.fsf@rho.meyering.net> Lines: 26 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -2.4 (--) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -2.4 (--) --=-=-= Content-Type: text/plain Torbjorn Granlund wrote: > I merged your changes, and made several analogous changes. > The code now passes strict compilation with and without HAVE_GMP. > > I did not merge the tests changes yet. > > Please grab our version from our repo. > > If your repo is public, please let me now how to access it. Else, > please either send a diff -c between your version and our repo version, > or your full file. Thanks for finishing the job! Regarding the "full file", I presume you mean the Makefile, since you've integrated all of my changes in factor.c. Included below. Though note that I've replaced the use of ./ourseq with simply "seq", which depends on your having the very latest version of seq.c from coreutils v8.19-129-g77f89d0 or newer built and first in your path. With that Makefile, you can remove the entire tests/ directory. --=-=-= Content-Type: text/plain Content-Disposition: inline; filename=Makefile # Developement Makefile for the NT factor project # Copyright 2012 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation; either version 3 of the License, or (at your option) any later # version. # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # You should have received a copy of the GNU General Public License along with # this program. If not, see http://www.gnu.org/licenses/. */ CC = gcc CFLAGS = -std=gnu99 -O2 -g -Werror -W -Wall -Wno-unused-but-set-variable all: factor make-prime-list factor: factor.o factor.o: factor.c primes.h primes.h: make-prime-list ./make-prime-list 5000 >primes.h %: %.c .PRECIOUS: %.o %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ %: %.o $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ clean: rm -f make-prime-list factor primes.h ourseq *.o # Use make check CHECK_FLAGS=-s to check squfof CHECK_FLAGS= p = 1844674407370 q = 792281625142643375935438 args = $(word 2,$(subst -, ,$@)) $(word 3,$(subst -, ,$@)) tests = \ t-0-10000000-a451244522b1b662c86cb3cbb55aee3e085a61a0 \ t-10000000-20000000-c792a2e02f1c8536b5121f624b04039d20187016 \ t-20000000-30000000-8115e8dff97d1674134ec054598d939a2a5f6113 \ t-30000000-40000000-fe7b832c8e0ed55035152c0f9ebd59de73224a60 \ t-40000000-50000000-b8786d66c432e48bc5b342ee3c6752b7f096f206 \ t-50000000-60000000-a74fe518c5f79873c2b9016745b88b42c8fd3ede \ t-60000000-70000000-689bc70d681791e5d1b8ac1316a05d0c4473d6db \ t-70000000-80000000-d370808f2ab8c865f64c2ff909c5722db5b7d58d \ t-80000000-90000000-7978aa66bf2bdb446398336ea6f02605e9a77581 \ t-$(p)8551616-$(p)8651615-66c57cd58f4fb572df7f088d17e4f4c1d4f01bb1 \ t-$(p)8551616-$(p)8651615-66c57cd58f4fb572df7f088d17e4f4c1d4f01bb1 \ t-$(p)8651616-$(p)8751615-729228e693b1a568ecc85b199927424c7d16d410 \ t-$(p)8751616-$(p)8851615-5a0c985017c2d285e4698f836f5a059e0b684563 \ t-$(p)8851616-$(p)8951615-0482295c514e371c98ce9fd335deed0c9c44a4f4 \ t-$(p)8951616-$(p)9051615-9c0e1105ac7c45e27e7bbeb5e213f530d2ad1a71 \ t-$(p)9051616-$(p)9151615-604366d2b1d75371d0679e6a68962d66336cd383 \ t-$(p)9151616-$(p)9251615-9192d2bdee930135b28d7160e6d395a7027871da \ t-$(p)9251616-$(p)9351615-bcf56ae55d20d700690cff4d3327b78f83fc01bf \ t-$(p)9351616-$(p)9451615-16b106398749e5f24d278ba7c58229ae43f650ac \ t-$(p)9451616-$(p)9551615-ad2c6ed63525f8e7c83c4c416e7715fa1bebc54c \ t-$(p)9551616-$(p)9651615-2b6f9c11742d9de045515a6627c27a042c49f8ba \ t-$(p)9651616-$(p)9751615-54851acd51c4819beb666e26bc0100dc9adbc310 \ t-$(p)9751616-$(p)9851615-6939c2a7afd2d81f45f818a159b7c5226f83a50b \ t-$(p)9851616-$(p)9951615-0f2c8bc011d2a45e2afa01459391e68873363c6c \ t-$(p)9951616-18446744073710051615-630dc2ad72f4c222bad1405e6c5bea590f92a98c \ t-$(q)50336-$(q)60335-51ccb201e35599d545cb942e2bb31aba5bce4fc5 $(tests): factor ourseq @echo '$(lastword $(subst -, ,$@)) -' > exp.$@ @echo $(args) @seq $(args) | ./factor $(CHECK_FLAGS) | shasum -c --status exp.$@ @rm exp.$@ check: $(tests) factor ourseq ver = `cat ver` dist: mkdir nt-factor-$(ver) cp -pr factor.c ChangeLog README Makefile make-prime-list.c ourseq.c longlong.h tests nt-factor-$(ver) tar cf - nt-factor-$(ver) | lzip >nt-factor-$(ver).tar.lz rm -rf nt-factor-$(ver) ./incr ver --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 14 08:52:29 2012 Received: (at 12350) by debbugs.gnu.org; 14 Sep 2012 12:52:29 +0000 Received: from localhost ([127.0.0.1]:33223 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TCVNl-0008N7-J4 for submit@debbugs.gnu.org; Fri, 14 Sep 2012 08:52:29 -0400 Received: from mx.meyering.net ([88.168.87.75]:45929) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TCVNj-0008N0-7y for 12350@debbugs.gnu.org; Fri, 14 Sep 2012 08:52:28 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 5E2E0600A5; Fri, 14 Sep 2012 14:51:29 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <86k3vw6di2.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Fri, 14 Sep 2012 13:38:13 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86k3vw6di2.fsf@shell.gmplib.org> Date: Fri, 14 Sep 2012 14:51:29 +0200 Message-ID: <874nn022em.fsf@rho.meyering.net> Lines: 35 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -2.4 (--) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -2.4 (--) Torbjorn Granlund wrote: > I merged your changes, and made several analogous changes. > The code now passes strict compilation with and without HAVE_GMP. > > I did not merge the tests changes yet. > > Please grab our version from our repo. > > If your repo is public, please let me now how to access it. Else, > please either send a diff -c between your version and our repo version, > or your full file. Oh, if you don't mind making some simple, automated changes, I'd appreciate if you were to expand all TABs in these files: factor.c longlong.h make-prime-list.c ourseq.c And there remain a few longer-than-79 lines: $ wc -L *.[ch] 83 factor.c 88 longlong.h 79 make-prime-list.c 79 ourseq.c 88 total Can you split them? Thanks, Jim From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 14 08:54:09 2012 Received: (at 12350) by debbugs.gnu.org; 14 Sep 2012 12:54:09 +0000 Received: from localhost ([127.0.0.1]:33227 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TCVPM-0008PZ-UK for submit@debbugs.gnu.org; Fri, 14 Sep 2012 08:54:09 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:25815 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TCVPK-0008PR-Kb for 12350@debbugs.gnu.org; Fri, 14 Sep 2012 08:54:08 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id EC31B3C650; Fri, 14 Sep 2012 14:53:07 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86k3vw6di2.fsf@shell.gmplib.org> <87a9ws22kf.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Fri, 14 Sep 2012 14:53:07 +0200 In-Reply-To: <87a9ws22kf.fsf@rho.meyering.net> (Jim Meyering's message of "Fri\, 14 Sep 2012 14\:48\:00 +0200") Message-ID: <86fw6k6a18.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Jim Meyering writes: Regarding the "full file", I presume you mean the Makefile, since you've integrated all of my changes in factor.c. Included below. =20=20 No, I mean factor.c. I integrated the changes manually, so might have missed something. Though note that I've replaced the use of ./ourseq with simply "seq", which depends on your having the very latest version of seq.c from coreutils v8.19-129-g77f89d0 or newer built and first in your path. =20=20 With that Makefile, you can remove the entire tests/ directory. =20=20 I think I stick to our current organisation for now. The important file to keep in synch is factor.c I suppose this is a good time to take care of paperwork. Will you ping assign@xxx or should I? --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 14 09:01:42 2012 Received: (at 12350) by debbugs.gnu.org; 14 Sep 2012 13:01:42 +0000 Received: from localhost ([127.0.0.1]:33233 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TCVWg-00009b-4d for submit@debbugs.gnu.org; Fri, 14 Sep 2012 09:01:42 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:54630 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TCVWc-00009S-LT for 12350@debbugs.gnu.org; Fri, 14 Sep 2012 09:01:40 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id E3E783C654; Fri, 14 Sep 2012 15:00:40 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86k3vw6di2.fsf@shell.gmplib.org> <874nn022em.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Fri, 14 Sep 2012 15:00:40 +0200 In-Reply-To: <874nn022em.fsf@rho.meyering.net> (Jim Meyering's message of "Fri\, 14 Sep 2012 14\:51\:29 +0200") Message-ID: <86boh869on.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Jim Meyering writes: Torbjorn Granlund wrote: =20=20 > I merged your changes, and made several analogous changes. > The code now passes strict compilation with and without HAVE_GMP. > > I did not merge the tests changes yet. > > Please grab our version from our repo. > > If your repo is public, please let me now how to access it. Else, > please either send a diff -c between your version and our repo version, > or your full file. =20=20 Oh, if you don't mind making some simple, automated changes, I'd appreciate if you were to expand all TABs in these files: =20=20 factor.c longlong.h make-prime-list.c ourseq.c =20=20 I would advice against making such changes to longlong.h, since it might make sense to keep it equal to the GMP version. We don't plan to stop using TAB in GMP. But feel free to make any changes to the coreutils versions of any of these files; we then simply need to pass -b to diff. And there remain a few longer-than-79 lines: =20=20 $ wc -L *.[ch] 83 factor.c 88 longlong.h 79 make-prime-list.c 79 ourseq.c 88 total =20=20 Can you split them? =20=20 Same goes for this type of changes.=20=20 I don't see any lines that makes the program hard to read. --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Sat Sep 15 16:48:16 2012 Received: (at 12350) by debbugs.gnu.org; 15 Sep 2012 20:48:17 +0000 Received: from localhost ([127.0.0.1]:35835 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TCzHj-00022K-7u for submit@debbugs.gnu.org; Sat, 15 Sep 2012 16:48:16 -0400 Received: from mx.meyering.net ([88.168.87.75]:50489) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TCzHd-000229-J7 for 12350@debbugs.gnu.org; Sat, 15 Sep 2012 16:48:13 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 4BA91600B1; Sat, 15 Sep 2012 22:47:02 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <86a9wt4tv7.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Thu, 13 Sep 2012 21:15:24 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> Date: Sat, 15 Sep 2012 22:47:02 +0200 Message-ID: <87pq5nt3nd.fsf@rho.meyering.net> Lines: 963 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -2.4 (--) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -2.4 (--) Torbjorn Granlund wrote: > > We won't be sending any more code replacement blobs to this address; it > > is most surely the wrong place. > > I guess you're saying that because there's been too little feedback? > > Not really. I suppose I'm sending a code replacement so that it get > appended to a bug report. My initial post was infact a bug report, but > that was 30 posts ago... > > IMHO, this is great work. > > Thanks. > > You may consider it accepted. That was clear in my mind from > the beginning. Sorry if I didn't make that clear to you. > Now, it's just a matter of integrating it. > > Good. I would certainly accept rejection, or partial rejection. I > suppose the code is a fair bit more complex than one might perhaps > expect, but we don't know how to make it neater without a large > performance penalty. But we can make it much more complex if desirable. > :-) > > I think the ugliest part is the interface to longlong.h. I don't know > how to make that better, though. > > Here are some suggested changes -- I made these against > a temporary local git repository using your -005 tarball. > That was before I learned (just now) that you have a mercurial > repository. Here are some more suggested changes. Sorry about the terse commit logs. The changes are mostly stylistic. changeset: 121:80954440c618 tag: tip user: Jim Meyering date: Sat Sep 15 22:37:19 2012 +0200 files: factor.c description: use "unsigned long int" consistently, not "unsigned long" factor.c | 40 ++++++++++++++++++++-------------------- 1 files changed, 20 insertions(+), 20 deletions(-) diff --git a/factor.c b/factor.c --- a/factor.c +++ b/factor.c @@ -119,7 +119,7 @@ #else typedef unsigned char UQItype; typedef long SItype; -typedef unsigned long USItype; +typedef unsigned long int USItype; #if HAVE_LONG_LONG typedef long long int DItype; typedef unsigned long long int UDItype; @@ -178,8 +178,8 @@ struct mp_factors { mpz_t *p; - unsigned long *e; - unsigned long nfactors; + unsigned long int *e; + unsigned long int nfactors; }; #endif @@ -189,7 +189,7 @@ #define umul_ppmm(w1, w0, u, v) \ do { \ uintmax_t __x0, __x1, __x2, __x3; \ - unsigned long __ul, __vl, __uh, __vh; \ + unsigned long int __ul, __vl, __uh, __vh; \ uintmax_t __u = (u), __v = (v); \ \ __ul = __ll_lowpart (__u); \ @@ -530,9 +530,9 @@ static void mp_factor_insert (struct mp_factors *factors, mpz_t prime) { - unsigned long nfactors = factors->nfactors; + unsigned long int nfactors = factors->nfactors; mpz_t *p = factors->p; - unsigned long *e = factors->e; + unsigned long int *e = factors->e; long i; /* Locate position for insert new or increment e. */ @@ -567,7 +567,7 @@ } static void -mp_factor_insert_ui (struct mp_factors *factors, unsigned long prime) +mp_factor_insert_ui (struct mp_factors *factors, unsigned long int prime) { mpz_t pz; @@ -1367,13 +1367,13 @@ #endif static void -factor_using_pollard_rho (uintmax_t n, unsigned long a, struct factors *factors) +factor_using_pollard_rho (uintmax_t n, unsigned long int a, + struct factors *factors) { uintmax_t x, z, y, P, t, ni, g; - unsigned long k, l; - k = 1; - l = 1; + unsigned long int k = 1; + unsigned long int l = 1; redcify (P, 1, n); addmod (x, P, P, n); /* i.e., redcify(2) */ @@ -1407,7 +1407,7 @@ z = x; k = l; l = 2 * l; - for (unsigned long i = 0; i < k; i++) + for (unsigned long int i = 0; i < k; i++) { x = mulredc (x, x, n, ni); addmod (x, x, a, n); @@ -1446,14 +1446,13 @@ } static void -factor_using_pollard_rho2 (uintmax_t n1, uintmax_t n0, unsigned long a, +factor_using_pollard_rho2 (uintmax_t n1, uintmax_t n0, unsigned long int a, struct factors *factors) { uintmax_t x1, x0, z1, z0, y1, y0, P1, P0, t1, t0, ni, g1, g0, r1m; - unsigned long k, l; - k = 1; - l = 1; + unsigned long int k = 1; + unsigned long int l = 1; redcify2 (P1, P0, 1, n1, n0); addmod2 (x1, x0, P1, P0, P1, P0, n1, n0); /* i.e., redcify(2) */ @@ -1489,7 +1488,7 @@ z1 = x1; z0 = x0; k = l; l = 2 * l; - for (unsigned long i = 0; i < k; i++) + for (unsigned long int i = 0; i < k; i++) { x0 = mulredc2 (&r1m, x1, x0, x1, x0, n1, n0, ni); x1 = r1m; @@ -1562,11 +1561,12 @@ #if HAVE_GMP static void -mp_factor_using_pollard_rho (mpz_t n, unsigned long a, struct mp_factors *factors) +mp_factor_using_pollard_rho (mpz_t n, unsigned long int a, + struct mp_factors *factors) { mpz_t x, z, y, P; mpz_t t, t2; - unsigned long long k, l; + unsigned long long int k, l; if (flag_verbose > 0) { @@ -1608,7 +1608,7 @@ mpz_set (z, x); k = l; l = 2 * l; - for (unsigned long long i = 0; i < k; i++) + for (unsigned long long int i = 0; i < k; i++) { mpz_mul (t, x, x); mpz_mod (x, t, n); changeset: 120:92ea4621a776 user: Jim Meyering date: Sat Sep 15 22:33:36 2012 +0200 files: factor.c description: mp_prime_p: widen type of index to match the type of upper bound In case we operate on a number with more than INT_MAX factors ;-) factor.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/factor.c b/factor.c --- a/factor.c +++ b/factor.c @@ -1328,7 +1328,7 @@ if (flag_prove_primality) { is_prime = true; - for (unsigned int i = 0; i < factors.nfactors && is_prime; i++) + for (unsigned long int i = 0; i < factors.nfactors && is_prime; i++) { mpz_divexact (tmp, nm1, factors.p[i]); mpz_powm (tmp, a, tmp, n); changeset: 119:c1b592ac3449 user: Jim Meyering date: Sat Sep 15 22:22:40 2012 +0200 files: factor.c description: mp_prime_p: use "unsigned long int" not "int" for result of mpz_scan1 factor.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/factor.c b/factor.c --- a/factor.c +++ b/factor.c @@ -1302,7 +1302,7 @@ mpz_sub_ui (nm1, n, 1); /* Find q and k, where q is odd and n = 1 + 2**k * q. */ - int k = mpz_scan1 (nm1, 0); + unsigned long int k = mpz_scan1 (nm1, 0); mpz_tdiv_q_2exp (q, nm1, k); mpz_set_ui (a, 2); changeset: 118:12940edfecc6 user: Jim Meyering date: Sat Sep 15 22:21:02 2012 +0200 files: factor.c description: reduce scope of functions and variables, favor unsigned types, use "bool" factor.c | 210 ++++++++++++++++++++++++++++++--------------------------------- 1 files changed, 99 insertions(+), 111 deletions(-) diff --git a/factor.c b/factor.c --- a/factor.c +++ b/factor.c @@ -89,6 +89,7 @@ #include #include /* for memmove */ #include /* for getopt */ +#include #if HAVE_GMP #include @@ -160,7 +161,7 @@ enum alg_type { ALG_POLLARD_RHO = 1, ALG_SQUFOF = 2 }; -enum alg_type alg; +static enum alg_type alg; /* 2*3*5*7*11...*101 is 128 bits, and has 26 prime factors */ #define MAX_NFACTS 26 @@ -182,7 +183,7 @@ }; #endif -void factor (uintmax_t, uintmax_t, struct factors *); +static void factor (uintmax_t, uintmax_t, struct factors *); #ifndef umul_ppmm #define umul_ppmm(w1, w0, u, v) \ @@ -309,7 +310,7 @@ uintmax_t _rh, _rl, _nh, _nl; \ umul_ppmm (_rh, _rl, (a), (b)); \ _nh = n; _nl = 0; \ - for (int _i = W_TYPE_SIZE; _i != 0; _i--) \ + for (unsigned int _i = W_TYPE_SIZE; _i != 0; _i--) \ { \ rsh2 (_nh, _nl, _nh, _nl, 1); \ if (ge2 (_rh, _rl, _nh, _nl)) \ @@ -352,10 +353,10 @@ /* Compute r = a mod d, where r = <*t1,retval>, a = , d = . Requires that d1 != 0. */ -uintmax_t +static uintmax_t mod2 (uintmax_t *r1, uintmax_t a1, uintmax_t a0, uintmax_t d1, uintmax_t d0) { - int cntd, cnta, cnt; + int cntd, cnta; assert (d1 != 0); @@ -367,7 +368,7 @@ count_leading_zeros (cntd, d1); count_leading_zeros (cnta, a1); - cnt = cntd - cnta; + int cnt = cntd - cnta; lsh2 (d1, d0, d1, d0, cnt); for (int i = 0; i < cnt; i++) { @@ -380,7 +381,7 @@ return a0; } -uintmax_t +static uintmax_t gcd_odd (uintmax_t a, uintmax_t b) { if ( (b & 1) == 0) @@ -418,7 +419,7 @@ } } -uintmax_t +static uintmax_t gcd2_odd (uintmax_t *r1, uintmax_t a1, uintmax_t a0, uintmax_t b1, uintmax_t b0) { while ((a0 & 1) == 0) @@ -456,16 +457,16 @@ return a0; } -void +static void factor_insert_multiplicity (struct factors *factors, uintmax_t prime, unsigned int m) { - int nfactors = factors->nfactors; + unsigned int nfactors = factors->nfactors; uintmax_t *p = factors->p; unsigned char *e = factors->e; - int i; /* Locate position for insert new or increment e. */ + int i; for (i = nfactors - 1; i >= 0; i--) { if (p[i] <= prime) @@ -491,7 +492,7 @@ #define factor_insert(f, p) factor_insert_multiplicity(f, p, 1) -void +static void factor_insert_large (struct factors *factors, uintmax_t p1, uintmax_t p0) { @@ -506,9 +507,9 @@ } #if HAVE_GMP -void mp_factor (mpz_t, struct mp_factors *); +static void mp_factor (mpz_t, struct mp_factors *); -void +static void mp_factor_init (struct mp_factors *factors) { factors->p = malloc (1); @@ -516,7 +517,7 @@ factors->nfactors = 0; } -void +static void mp_factor_clear (struct mp_factors *factors) { for (unsigned int i = 0; i < factors->nfactors; i++) @@ -526,10 +527,10 @@ free (factors->e); } -void +static void mp_factor_insert (struct mp_factors *factors, mpz_t prime) { - long nfactors = factors->nfactors; + unsigned long nfactors = factors->nfactors; mpz_t *p = factors->p; unsigned long *e = factors->e; long i; @@ -565,7 +566,7 @@ } } -void +static void mp_factor_insert_ui (struct mp_factors *factors, unsigned long prime) { mpz_t pz; @@ -606,10 +607,10 @@ #undef P /* This flag is honoured just in the GMP code. */ -int flag_verbose = 0; +static int flag_verbose = 0; /* Prove primality or run probabilistic tests. */ -int flag_prove_primality = 1; +static int flag_prove_primality = 1; /* Number of Miller-Rabin tests to run when not proving primality. */ #define MR_REPS 25 @@ -617,7 +618,7 @@ #define LIKELY(cond) __builtin_expect ((cond) != 0, 1) #define UNLIKELY(cond) __builtin_expect ((cond) != 0, 0) -void +static void factor_insert_refind (struct factors *factors, uintmax_t p, unsigned int i, unsigned int off) { @@ -659,16 +660,13 @@ order, and the non-multiples of p onto the range lim < q < B. */ -uintmax_t +static uintmax_t factor_using_division (uintmax_t *t1p, uintmax_t t1, uintmax_t t0, struct factors *factors) { - unsigned int i; - uintmax_t p; - if (t0 % 2 == 0) { - int cnt; + unsigned int cnt; if (t0 == 0) { @@ -686,7 +684,8 @@ factor_insert_multiplicity (factors, 2, cnt); } - p = 3; + uintmax_t p = 3; + unsigned int i; for (i = 0; t1 > 0 && i < PRIMES_PTAB_ENTRIES; i++) { for (;;) @@ -724,9 +723,7 @@ for (; i < PRIMES_PTAB_ENTRIES; i += 8) { uintmax_t q; - const struct primes_dtab *pd; - - pd = &primes_dtab[i]; + const struct primes_dtab *pd = &primes_dtab[i]; DIVBLOCK(0); DIVBLOCK(1); DIVBLOCK(2); @@ -745,7 +742,7 @@ } #if HAVE_GMP -void +static void mp_factor_using_division (mpz_t t, struct mp_factors *factors) { mpz_t q; @@ -882,7 +879,7 @@ } while (0) /* Modular two-word multiplication, r = a * b mod m, with mi = m^(-1) mod B. - Both a and b has to be in redc form, the result will be in redc form too. */ + Both a and b must be in redc form, the result will be in redc form too. */ inline uintmax_t mulredc (uintmax_t a, uintmax_t b, uintmax_t m, uintmax_t mi) { @@ -899,9 +896,9 @@ } /* Modular two-word multiplication, r = a * b mod m, with mi = m^(-1) mod B. - Both a and b has to be in redc form, the result will be in redc form too. + Both a and b must be in redc form, the result will be in redc form too. For performance reasons, the most significant bit of m must be clear. */ -uintmax_t +static uintmax_t mulredc2 (uintmax_t *r1p, uintmax_t a1, uintmax_t a0, uintmax_t b1, uintmax_t b0, uintmax_t m1, uintmax_t m0, uintmax_t mi) @@ -969,12 +966,10 @@ return r0; } -uintmax_t +static uintmax_t powm (uintmax_t b, uintmax_t e, uintmax_t n, uintmax_t ni, uintmax_t one) { - uintmax_t y; - - y = one; + uintmax_t y = one; if (e & 1) y = b; @@ -991,7 +986,7 @@ return y; } -uintmax_t +static uintmax_t powm2 (uintmax_t *r1m, const uintmax_t *bp, const uintmax_t *ep, const uintmax_t *np, uintmax_t ni, const uintmax_t *one) @@ -1032,32 +1027,30 @@ return r0; } -int +static bool millerrabin (uintmax_t n, uintmax_t ni, uintmax_t b, uintmax_t q, unsigned int k, uintmax_t one) { - uintmax_t y, nm1; + uintmax_t y = powm (b, q, n, ni, one); - y = powm (b, q, n, ni, one); - - nm1 = n - one; /* -1, but in redc representation. */ + uintmax_t nm1 = n - one; /* -1, but in redc representation. */ if (y == one || y == nm1) - return 1; + return true; for (unsigned int i = 1; i < k; i++) { y = mulredc (y, y, n, ni); if (y == nm1) - return 1; + return true; if (y == one) - return 0; + return false; } - return 0; + return false; } -int +static bool millerrabin2 (const uintmax_t *np, uintmax_t ni, const uintmax_t *bp, const uintmax_t *qp, unsigned int k, const uintmax_t *one) { @@ -1067,12 +1060,12 @@ y1 = r1m; if (y0 == one[0] && y1 == one[1]) - return 1; + return true; sub_ddmmss (nm1_1, nm1_0, np[1], np[0], one[1], one[0]); if (y0 == nm1_0 && y1 == nm1_1) - return 1; + return true; for (unsigned int i = 1; i < k; i++) { @@ -1080,66 +1073,65 @@ y1 = r1m; if (y0 == nm1_0 && y1 == nm1_1) - return 1; + return true; if (y0 == one[0] && y1 == one[1]) - return 0; + return false; } - return 0; + return false; } #if HAVE_GMP -static int +static bool mp_millerrabin (mpz_srcptr n, mpz_srcptr nm1, mpz_ptr x, mpz_ptr y, mpz_srcptr q, unsigned long int k) { - unsigned long int i; - mpz_powm (y, x, q, n); if (mpz_cmp_ui (y, 1) == 0 || mpz_cmp (y, nm1) == 0) - return 1; + return true; - for (i = 1; i < k; i++) + for (unsigned long int i = 1; i < k; i++) { mpz_powm_ui (y, y, 2, n); if (mpz_cmp (y, nm1) == 0) - return 1; + return true; if (mpz_cmp_ui (y, 1) == 0) - return 0; + return false; } - return 0; + return false; } #endif /* Lucas' prime test. The number of iterations vary greatly, up to a few dozen have been observed. The average seem to be about 2. */ -int +static bool prime_p (uintmax_t n) { - int k, is_prime; - uintmax_t q, a, a_prim, one, ni; + int k; + bool is_prime; + uintmax_t a_prim, one, ni; struct factors factors; if (n <= 1) - return 0; + return false; /* We have already casted out small primes. */ if (n < (uintmax_t) FIRST_OMITTED_PRIME * FIRST_OMITTED_PRIME) - return 1; + return true; /* Precomputation for Miller-Rabin. */ - q = n - 1; + uintmax_t q = n - 1; for (k = 0; (q & 1) == 0; k++) q >>= 1; - a = 2; + uintmax_t a = 2; binv (ni, n); /* ni <- 1/n mod B */ redcify (one, 1, n); addmod (a_prim, one, one, n); /* i.e., redcify a = 2 */ /* Perform a Miller-Rabin test, finds most composites quickly. */ if (!millerrabin (n, ni, a_prim, q, k, one)) - return 0; + return false; if (flag_prove_primality) { @@ -1151,12 +1143,10 @@ number composite. */ for (unsigned int r = 0; r < PRIMES_PTAB_ENTRIES; r++) { - int i; - if (flag_prove_primality) { - is_prime = 1; - for (i = 0; i < factors.nfactors && is_prime; i++) + is_prime = true; + for (unsigned int i = 0; i < factors.nfactors && is_prime; i++) { is_prime = powm (a_prim, (n - 1) / factors.p[i], n, ni, one) != one; } @@ -1168,7 +1158,7 @@ } if (is_prime) - return 1; + return true; a += primes_diff[r]; /* Establish new base. */ @@ -1185,18 +1175,17 @@ } if (!millerrabin (n, ni, a_prim, q, k, one)) - return 0; + return false; } fprintf (stderr, "Lucas prime test failure. This should not happen\n"); abort (); } -int +static bool prime2_p (uintmax_t n1, uintmax_t n0) { uintmax_t q[2], nm1[2]; - uintmax_t a; uintmax_t a_prim[2]; uintmax_t one[2]; uintmax_t na[2]; @@ -1223,7 +1212,7 @@ rsh2 (q[1], q[0], nm1[1], nm1[0], k); } - a = 2; + uintmax_t a = 2; binv (ni, n0); redcify2 (one[1], one[0], 1, n1, n0); addmod2 (a_prim[1], a_prim[0], one[1], one[0], one[1], one[0], n1, n0); @@ -1233,7 +1222,7 @@ na[1] = n1; if (!millerrabin2 (na, ni, a_prim, q, k, one)) - return 0; + return false; if (flag_prove_primality) { @@ -1245,12 +1234,12 @@ number composite. */ for (unsigned int r = 0; r < PRIMES_PTAB_ENTRIES; r++) { - int i, is_prime; + bool is_prime; uintmax_t e[2], y[2]; if (flag_prove_primality) { - is_prime = 1; + is_prime = true; if (factors.plarge[1]) { uintmax_t pi; @@ -1260,7 +1249,7 @@ y[0] = powm2 (&y[1], a_prim, e, na, ni, one); is_prime = (y[0] != one[0] || y[1] != one[1]); } - for (i = 0; i < factors.nfactors && is_prime; i++) + for (unsigned int i = 0; i < factors.nfactors && is_prime; i++) { /* FIXME: We always have the factor 2. Do we really need to handle it here? We have done the same powering as part of millerrabin. */ @@ -1279,13 +1268,13 @@ } if (is_prime) - return 1; + return true; a += primes_diff[r]; /* Establish new base. */ redcify2 (a_prim[1], a_prim[0], a, n1, n0); if (!millerrabin2 (na, ni, a_prim, q, k, one)) - return 0; + return false; } fprintf (stderr, "Lucas prime test failure. This should not happen\n"); @@ -1293,19 +1282,19 @@ } #if HAVE_GMP -int +static bool mp_prime_p (mpz_t n) { - int k, is_prime; + bool is_prime; mpz_t q, a, nm1, tmp; struct mp_factors factors; if (mpz_cmp_ui (n, 1) <= 0) - return 0; + return false; /* We have already casted out small primes. */ if (mpz_cmp_ui (n, (long) FIRST_OMITTED_PRIME * FIRST_OMITTED_PRIME) < 0) - return 1; + return true; mpz_inits (q, a, nm1, tmp, NULL); @@ -1313,7 +1302,7 @@ mpz_sub_ui (nm1, n, 1); /* Find q and k, where q is odd and n = 1 + 2**k * q. */ - k = mpz_scan1 (nm1, 0); + int k = mpz_scan1 (nm1, 0); mpz_tdiv_q_2exp (q, nm1, k); mpz_set_ui (a, 2); @@ -1321,7 +1310,7 @@ /* Perform a Miller-Rabin test, finds most composites quickly. */ if (!mp_millerrabin (n, nm1, a, tmp, q, k)) { - is_prime = 0; + is_prime = false; goto ret2; } @@ -1338,7 +1327,7 @@ { if (flag_prove_primality) { - is_prime = 1; + is_prime = true; for (unsigned int i = 0; i < factors.nfactors && is_prime; i++) { mpz_divexact (tmp, nm1, factors.p[i]); @@ -1359,7 +1348,7 @@ if (!mp_millerrabin (n, nm1, a, tmp, q, k)) { - is_prime = 0; + is_prime = false; goto ret1; } } @@ -1377,11 +1366,11 @@ } #endif -void +static void factor_using_pollard_rho (uintmax_t n, unsigned long a, struct factors *factors) { uintmax_t x, z, y, P, t, ni, g; - unsigned long k, l, i; + unsigned long k, l; k = 1; l = 1; @@ -1418,7 +1407,7 @@ z = x; k = l; l = 2 * l; - for (i = 0; i < k; i++) + for (unsigned long i = 0; i < k; i++) { x = mulredc (x, x, n, ni); addmod (x, x, a, n); @@ -1456,12 +1445,12 @@ } } -void +static void factor_using_pollard_rho2 (uintmax_t n1, uintmax_t n0, unsigned long a, struct factors *factors) { uintmax_t x1, x0, z1, z0, y1, y0, P1, P0, t1, t0, ni, g1, g0, r1m; - unsigned long k, l, i; + unsigned long k, l; k = 1; l = 1; @@ -1500,7 +1489,7 @@ z1 = x1; z0 = x0; k = l; l = 2 * l; - for (i = 0; i < k; i++) + for (unsigned long i = 0; i < k; i++) { x0 = mulredc2 (&r1m, x1, x0, x1, x0, n1, n0, ni); x1 = r1m; @@ -1572,12 +1561,12 @@ } #if HAVE_GMP -void +static void mp_factor_using_pollard_rho (mpz_t n, unsigned long a, struct mp_factors *factors) { mpz_t x, z, y, P; mpz_t t, t2; - unsigned long long k, l, i; + unsigned long long k, l; if (flag_verbose > 0) { @@ -1619,7 +1608,7 @@ mpz_set (z, x); k = l; l = 2 * l; - for (i = 0; i < k; i++) + for (unsigned long long i = 0; i < k; i++) { mpz_mul (t, x, x); mpz_mod (x, t, n); @@ -1859,7 +1848,7 @@ #endif -void +static void factor_using_squfof (uintmax_t n1, uintmax_t n0, struct factors *factors) { /* Uses algorithm and notation from @@ -2114,7 +2103,7 @@ exit (EXIT_FAILURE); } -void +static void factor (uintmax_t t1, uintmax_t t0, struct factors *factors) { factors->nfactors = 0; @@ -2149,7 +2138,7 @@ } #if HAVE_GMP -void +static void mp_factor (mpz_t t, struct mp_factors *factors) { mp_factor_init (factors); @@ -2173,7 +2162,7 @@ } #endif -int +static int strto2uintmax (uintmax_t *hip, uintmax_t *lop, const char *s) { int errcode; @@ -2226,7 +2215,7 @@ return errcode; } -void +static void print_uintmaxes (uintmax_t t1, uintmax_t t0) { uintmax_t q, r; @@ -2245,7 +2234,7 @@ } } -void +static void factor_one (const char *input) { uintmax_t t1, t0; @@ -2353,7 +2342,6 @@ int main (int argc, char *argv[]) { - int i; int c; alg = ALG_POLLARD_RHO; /* Default to Pollard rho */ @@ -2380,7 +2368,7 @@ #endif if (optind < argc) - for (i = optind; i < argc; i++) + for (int i = optind; i < argc; i++) factor_one (argv[i]); else { @@ -2396,7 +2384,7 @@ { double acc_f; printf ("q freq. cum. freq.(total: %d)\n", q_freq[0]); - for (i = 1, acc_f = 0.0; i <= Q_FREQ_SIZE; i++) + for (unsigned int i = 1, acc_f = 0.0; i <= Q_FREQ_SIZE; i++) { double f = (double) q_freq[i] / q_freq[0]; acc_f += f; From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 16 16:44:48 2012 Received: (at 12350) by debbugs.gnu.org; 16 Sep 2012 20:44:48 +0000 Received: from localhost ([127.0.0.1]:37580 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDLhw-000053-H0 for submit@debbugs.gnu.org; Sun, 16 Sep 2012 16:44:48 -0400 Received: from mx.meyering.net ([88.168.87.75]:53657) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDLhv-00004x-0z for 12350@debbugs.gnu.org; Sun, 16 Sep 2012 16:44:47 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id C7D66600B3; Sun, 16 Sep 2012 22:43:35 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <87pq5nt3nd.fsf@rho.meyering.net> (Jim Meyering's message of "Sat, 15 Sep 2012 22:47:02 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> Date: Sun, 16 Sep 2012 22:43:35 +0200 Message-ID: <87ipbdsnpk.fsf@rho.meyering.net> Lines: 61 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -2.4 (--) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -2.4 (--) Jim Meyering wrote: ... > Here are some more suggested changes. > Sorry about the terse commit logs. > The changes are mostly stylistic. > > changeset: 121:80954440c618 Hi Torbjorn, I've begun inserting your factor.c into coreutils. That enables a lot more warnings, and I've made a few changes, beginning to accommodate them. Unfortunately, I've also converted TABs to spaces, so I'll let you compute your own diffs (presumably with -b). Included below: Would you mind changing the names of a few variables or adjusting declarations to avoid some -Wshadow warnings? I changed the innermost "r" to "rem" locally, but there are others. Also, "S". make all-recursive make[1]: Entering directory `/h/j/w/co/cu' Making all in po make[2]: Entering directory `/h/j/w/co/cu/po' make[2]: Leaving directory `/h/j/w/co/cu/po' Making all in . make[2]: Entering directory `/h/j/w/co/cu' CC src/factor.o src/factor.c: In function 'factor_using_squfof': src/factor.c:1896:17: error: declaration of 'S' shadows a previous local [-Werror=shadow] uintmax_t S, Dh, Dl, Q1, Q, P, L, L1, B; ^ src/factor.c:1860:13: error: shadowed declaration is here [-Werror=shadow] uintmax_t S; ^ src/factor.c:1987:25: error: declaration of 'r' shadows a previous local [-Werror=shadow] uintmax_t r = is_square (Q); ^ src/factor.c:1945:31: error: shadowed declaration is here [-Werror=shadow] uintmax_t q, P1, t, r; ^ src/factor.c:2037:33: error: declaration of 'r' shadows a previous local [-Werror=shadow] uintmax_t r; ^ src/factor.c:1987:25: error: shadowed declaration is here [-Werror=shadow] uintmax_t r = is_square (Q); ^ src/factor.c: At top level: src/factor.c:2291:1: error: no previous prototype for 'read_item' [-Werror=missing-prototypes] read_item (struct inbuf *bufstruct) ^ cc1: all warnings being treated as errors make[2]: *** [src/factor.o] Error 1 make[2]: Leaving directory `/h/j/w/co/cu' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/h/j/w/co/cu' make: *** [all] Error 2 From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 16 16:48:28 2012 Received: (at 12350) by debbugs.gnu.org; 16 Sep 2012 20:48:28 +0000 Received: from localhost ([127.0.0.1]:37584 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDLlR-0000AY-2G for submit@debbugs.gnu.org; Sun, 16 Sep 2012 16:48:28 -0400 Received: from mx.meyering.net ([88.168.87.75]:53675) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDLlJ-0000AL-Ck for 12350@debbugs.gnu.org; Sun, 16 Sep 2012 16:48:23 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id DE10C600B3; Sun, 16 Sep 2012 22:47:05 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <87ipbdsnpk.fsf@rho.meyering.net> (Jim Meyering's message of "Sun, 16 Sep 2012 22:43:35 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> Date: Sun, 16 Sep 2012 22:47:05 +0200 Message-ID: <87d31lsnjq.fsf@rho.meyering.net> Lines: 76 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -2.4 (--) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -2.4 (--) --=-=-= Content-Type: text/plain Jim Meyering wrote: > Jim Meyering wrote: > ... >> Here are some more suggested changes. >> Sorry about the terse commit logs. >> The changes are mostly stylistic. >> >> changeset: 121:80954440c618 > > Hi Torbjorn, > > I've begun inserting your factor.c into coreutils. > That enables a lot more warnings, and I've made a few > changes, beginning to accommodate them. Unfortunately, > I've also converted TABs to spaces, so I'll let you > compute your own diffs (presumably with -b). Included below: > > Would you mind changing the names of a few variables > or adjusting declarations to avoid some -Wshadow warnings? > > I changed the innermost "r" to "rem" locally, but there are > others. Also, "S". > > make all-recursive > make[1]: Entering directory `/h/j/w/co/cu' > Making all in po > make[2]: Entering directory `/h/j/w/co/cu/po' > make[2]: Leaving directory `/h/j/w/co/cu/po' > Making all in . > make[2]: Entering directory `/h/j/w/co/cu' > CC src/factor.o > src/factor.c: In function 'factor_using_squfof': > src/factor.c:1896:17: error: declaration of 'S' shadows a previous local [-Werror=shadow] > uintmax_t S, Dh, Dl, Q1, Q, P, L, L1, B; > ^ > src/factor.c:1860:13: error: shadowed declaration is here [-Werror=shadow] > uintmax_t S; > ^ > src/factor.c:1987:25: error: declaration of 'r' shadows a previous local [-Werror=shadow] > uintmax_t r = is_square (Q); > ^ > src/factor.c:1945:31: error: shadowed declaration is here [-Werror=shadow] > uintmax_t q, P1, t, r; > ^ > src/factor.c:2037:33: error: declaration of 'r' shadows a previous local [-Werror=shadow] > uintmax_t r; > ^ > src/factor.c:1987:25: error: shadowed declaration is here [-Werror=shadow] > uintmax_t r = is_square (Q); > ^ > src/factor.c: At top level: > src/factor.c:2291:1: error: no previous prototype for 'read_item' [-Werror=missing-prototypes] > read_item (struct inbuf *bufstruct) > ^ > cc1: all warnings being treated as errors > make[2]: *** [src/factor.o] Error 1 > make[2]: Leaving directory `/h/j/w/co/cu' > make[1]: *** [all-recursive] Error 1 > make[1]: Leaving directory `/h/j/w/co/cu' > make: *** [all] Error 2 Here is factor.c, as I've begun to adapt it. I.e., including and adding the _GL_ATTRIBUTE_CONST attributes are a must in coreutils, but not useful to you in the stand-alone package. At least one other change may be interesting to you: another scope-reduction one: - inline uintmax_t + static inline uintmax_t mulredc (uintmax_t a, uintmax_t b, uintmax_t m, uintmax_t mi) --=-=-= Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline; filename=factor.c Content-Transfer-Encoding: quoted-printable /* Factoring of uintmax_t numbers. Contributed to the GNU project by Torbj=F6rn Granlund and Niels M=F6ller Contains code from GNU MP. Copyright 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2009, 2012 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it und= er the terms of the GNU General Public License as published by the Free Softwa= re Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT= ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS F= OR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ /* Efficiently factor numbers that fit in one or two words (word =3D uintma= x_t), or, with GMP, numbers of any size. Code organisation: There are several variants of many functions, for handling one word, two words, and GMP's mpz_t type. If the one-word variant is called foo, the two-word variant will be foo2, and the one for mpz_t will be mp_foo. In some cases, the plain function variants will handle both one-word and two-word numbers, evidenced by function arguments. The factoring code for two words will fall into the code for one word w= hen progress allows that. Using GMP is optional. Define HAVE_GMP to make this code include GMP factoring code. The GMP factoring code is based on GMP's demos/factori= ze.c (last synched 2012-09-07). The GMP-based factoring code will stay in G= MP factoring code even if numbers get small enough for using the two-word code. Algorithm: (1) Perform trial division using a small primes table, but without hard= ware division since the primes table store inverses modulo the word base. (The GMP variant of this code doesn't make use of the precomputed inverses, but instead relies on GMP for fast divisibility testing.) (2) Check the nature of any non-factored part using Miller-Rabin for detecting composites, and Lucas for detecting primes. (3) Factor any remaining composite part using the Pollard-Brent rho algorithm or the SQUFOF algorithm, checking status of found factors again using Miller-Rabin and Lucas. We prefer using Hensel norm in the divisions, not the more familiar Euclidian norm, since the former leads to much faster code. In the Pollard-Brent rho code and the the prime testing code, we use Montgomer= y's trick of multiplying all n-residues by the word base, allowing cheap He= nsel reductions mod n. Improvements: * Use modular inverses also for exact division in the Lucas code, and elsewhere. A problem is to locate the inverses not from an index, but from a prime. We might instead compute the inverse on-the-fly. * Tune trial division table size (not forgetting that this is a standal= one program where the table will be read from disk for each invocation). * Implement less naive powm, using k-ary exponentiation for k =3D 3 or perhaps k =3D 4. * Try to speed trial division code for single uintmax_t numbers, i.e., = the code using DIVBLOCK. It currently runs at 2 cycles per prime (Intel = SBR, IBR), 3 cycles per prime (AMD Stars) and 5 cycles per prime (AMD BD) = when using gcc 4.6 and 4.7. Some software pipelining should help; 1, 2, a= nd 4 respectively cycles ought to be possible. * The redcify function could be vastly improved by using (plain Euclidi= an) pre-inversion (such as GMP's invert_limb) and udiv_qrnnd_preinv (from GMP's gmp-impl.h). The redcify2 function could be vastly improved us= ing similar methoods. These functions currently dominate run time when u= sing the -w option. */ #include #include #include #include #include #include #include #include /* for memmove */ #include /* for getopt */ #include #include "system.h" #if HAVE_GMP # include #endif #ifndef STAT_SQUFOF # define STAT_SQUFOF 0 #endif #ifndef USE_LONGLONG_H # define USE_LONGLONG_H 1 #endif #if USE_LONGLONG_H /* Make definitions for longlong.h to make it do what it can do for us */ # define W_TYPE_SIZE 64 /* bitcount for uintmax_t */ # define UWtype uintmax_t # define UHWtype unsigned long int # undef UDWtype # if HAVE_ATTRIBUTE_MODE typedef unsigned int UQItype __attribute__ ((mode (QI))); typedef int SItype __attribute__ ((mode (SI))); typedef unsigned int USItype __attribute__ ((mode (SI))); typedef int DItype __attribute__ ((mode (DI))); typedef unsigned int UDItype __attribute__ ((mode (DI))); # else typedef unsigned char UQItype; typedef long SItype; typedef unsigned long int USItype; # if HAVE_LONG_LONG typedef long long int DItype; typedef unsigned long long int UDItype; # else /* Assume `long' gives us a wide enough type. Needed for hppa2.0w.= */ typedef long int DItype; typedef unsigned long int UDItype; # endif # endif # define LONGLONG_STANDALONE /* Don't require GMP's longlong.h mdep fil= es */ # define ASSERT(x) /* FIXME make longlong.h really standalone= */ # define __clz_tab factor_clz_tab /* Rename to avoid glibc collision */ # ifndef __GMP_GNUC_PREREQ # define __GMP_GNUC_PREREQ(a,b) 1 # endif # if _ARCH_PPC # define HAVE_HOST_CPU_FAMILY_powerpc 1 # endif # include "longlong.h" # ifdef COUNT_LEADING_ZEROS_NEED_CLZ_TAB const unsigned char factor_clz_tab[129] =3D { 1,2,3,3,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9 }; # endif #else /* not USE_LONGLONG_H */ # define W_TYPE_SIZE (8 * sizeof (uintmax_t)) # define __ll_B ((uintmax_t) 1 << (W_TYPE_SIZE / 2)) # define __ll_lowpart(t) ((uintmax_t) (t) & (__ll_B - 1)) # define __ll_highpart(t) ((uintmax_t) (t) >> (W_TYPE_SIZE / 2)) #endif enum alg_type { ALG_POLLARD_RHO =3D 1, ALG_SQUFOF =3D 2 }; static enum alg_type alg; /* 2*3*5*7*11...*101 is 128 bits, and has 26 prime factors */ #define MAX_NFACTS 26 struct factors { uintmax_t plarge[2]; /* Can have a single large factor */ uintmax_t p[MAX_NFACTS]; unsigned char e[MAX_NFACTS]; unsigned char nfactors; }; #if HAVE_GMP struct mp_factors { mpz_t *p; unsigned long int *e; unsigned long int nfactors; }; #endif static void factor (uintmax_t, uintmax_t, struct factors *); #ifndef umul_ppmm # define umul_ppmm(w1, w0, u, v) \ do { \ uintmax_t __x0, __x1, __x2, __x3; \ unsigned long int __ul, __vl, __uh, __vh; \ uintmax_t __u =3D (u), __v =3D (v); = \ \ __ul =3D __ll_lowpart (__u); \ __uh =3D __ll_highpart (__u); \ __vl =3D __ll_lowpart (__v); \ __vh =3D __ll_highpart (__v); \ \ __x0 =3D (uintmax_t) __ul * __vl; \ __x1 =3D (uintmax_t) __ul * __vh; \ __x2 =3D (uintmax_t) __uh * __vl; \ __x3 =3D (uintmax_t) __uh * __vh; \ \ __x1 +=3D __ll_highpart (__x0);/* this can't give carry */ \ __x1 +=3D __x2; /* but this indeed can */ \ if (__x1 < __x2) /* did we get it? */ \ __x3 +=3D __ll_B; /* yes, add it in the proper pos. */ \ \ (w1) =3D __x3 + __ll_highpart (__x1); \ (w0) =3D (__x1 << W_TYPE_SIZE / 2) + __ll_lowpart (__x0); \ } while (0) #endif #if !defined(udiv_qrnnd) || defined(UDIV_NEEDS_NORMALIZATION) /* Define our own, not needing normalization. This function is currently not performance critical, so keep it simple. Similar to the mod macro below. */ # undef udiv_qrnnd # define udiv_qrnnd(q, r, n1, n0, d) \ do { \ uintmax_t __d1, __d0, __q, __r1, __r0; \ \ assert ((n1) < (d)); \ __d1 =3D (d); __d0 =3D 0; = \ __r1 =3D (n1); __r0 =3D (n0); = \ __q =3D 0; \ for (unsigned int __i =3D W_TYPE_SIZE; __i > 0; __i--) \ { \ rsh2 (__d1, __d0, __d1, __d0, 1); \ __q <<=3D 1; \ if (ge2 (__r1, __r0, __d1, __d0)) \ { \ __q++; \ sub_ddmmss (__r1, __r0, __r1, __r0, __d1, __d0); \ } \ } \ (r) =3D __r0; \ (q) =3D __q; \ } while (0) #endif #if !defined (add_ssaaaa) # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ do { \ uintmax_t _add_x; \ _add_x =3D (al) + (bl); \ (sh) =3D (ah) + (bh) + (_add_x < (al)); \ (sl) =3D _add_x; \ } while (0) #endif #define rsh2(rh, rl, ah, al, cnt) \ do { \ (rl) =3D ((ah) << (W_TYPE_SIZE - (cnt))) | ((al) >> (cnt)); \ (rh) =3D (ah) >> (cnt); \ } while (0) #define lsh2(rh, rl, ah, al, cnt) \ do { \ (rh) =3D ((ah) << cnt) | ((al) >> (W_TYPE_SIZE - (cnt))); \ (rl) =3D (al) << (cnt); \ } while (0) #define ge2(ah, al, bh, bl) \ ((ah) > (bh) || ((ah) =3D=3D (bh) && (al) >=3D (bl))) #define gt2(ah, al, bh, bl) \ ((ah) > (bh) || ((ah) =3D=3D (bh) && (al) > (bl))) #ifndef sub_ddmmss # define sub_ddmmss(rh, rl, ah, al, bh, bl) \ do { \ uintmax_t _cy; \ _cy =3D (al) < (bl); \ (rl) =3D (al) - (bl); \ (rh) =3D (ah) - (bh) - _cy; \ } while (0) #endif #ifndef count_leading_zeros # define count_leading_zeros(count, x) do { \ uintmax_t __clz_x =3D (x); \ unsigned int __clz_c; \ for (__clz_c =3D 0; \ (__clz_x & ((uintmax_t) 0xff << (W_TYPE_SIZE - 8))) =3D=3D 0; = \ __clz_c +=3D 8) \ __clz_x <<=3D 8; \ for (; (intmax_t)__clz_x >=3D 0; __clz_c++) \ __clz_x <<=3D 1; \ (count) =3D __clz_c; \ } while (0) #endif #ifndef count_trailing_zeros # define count_trailing_zeros(count, x) do { \ uintmax_t __ctz_x =3D (x); \ unsigned int __ctz_c =3D 0; \ while ((__ctz_x & 1) =3D=3D 0) = \ { \ __ctz_x >>=3D 1; \ __ctz_c++; \ } \ (count) =3D __ctz_c; \ } while (0) #endif /* Requires that a < n and b <=3D n */ #define submod(r,a,b,n) \ do { \ uintmax_t _t =3D - (uintmax_t) (a < b); \ (r) =3D ((n) & _t) + (a) - (b); \ } while (0) #define addmod(r,a,b,n) \ submod((r), (a), ((n) - (b)), (n)) /* Modular two-word addition and subtraction. For performance reasons, the most significant bit of n1 must be clear. The destination variables mus= t be distinct from the mod operand. */ #define addmod2(r1, r0, a1, a0, b1, b0, n1, n0) \ do { \ add_ssaaaa ((r1), (r0), (a1), (a0), (b1), (b0)); \ if (ge2 ((r1), (r0), (n1), (n0))) \ sub_ddmmss ((r1), (r0), (r1), (r0), (n1), (n0)); \ } while (0) #define submod2(r1, r0, a1, a0, b1, b0, n1, n0) \ do { \ sub_ddmmss ((r1), (r0), (a1), (a0), (b1), (b0)); \ if ((intmax_t) (r1) < 0) \ add_ssaaaa ((r1), (r0), (r1), (r0), (n1), (n0)); \ } while (0) #define HIGHBIT_TO_MASK(x) \ (((intmax_t)-1 >> 1) < 0 \ ? (uintmax_t)((intmax_t)(x) >> (W_TYPE_SIZE - 1)) \ : ((x) & ((uintmax_t) 1 << (W_TYPE_SIZE - 1)) \ ? UINTMAX_MAX : (uintmax_t) 0)) /* Compute r =3D a mod d, where r =3D <*t1,retval>, a =3D , d =3D . Requires that d1 !=3D 0. */ static uintmax_t mod2 (uintmax_t *r1, uintmax_t a1, uintmax_t a0, uintmax_t d1, uintmax_t d0) { int cntd, cnta; assert (d1 !=3D 0); if (a1 =3D=3D 0) { *r1 =3D 0; return a0; } count_leading_zeros (cntd, d1); count_leading_zeros (cnta, a1); int cnt =3D cntd - cnta; lsh2 (d1, d0, d1, d0, cnt); for (int i =3D 0; i < cnt; i++) { if (ge2 (a1, a0, d1, d0)) sub_ddmmss (a1, a0, a1, a0, d1, d0); rsh2 (d1, d0, d1, d0, 1); } *r1 =3D a1; return a0; } static uintmax_t _GL_ATTRIBUTE_CONST gcd_odd (uintmax_t a, uintmax_t b) { if ( (b & 1) =3D=3D 0) { uintmax_t t =3D b; b =3D a; a =3D t; } if (a =3D=3D 0) return b; /* Take out least significant one bit, to make room for sign */ b >>=3D 1; for (;;) { uintmax_t t; uintmax_t bgta; while ((a & 1) =3D=3D 0) a >>=3D 1; a >>=3D 1; t =3D a - b; if (t =3D=3D 0) return (a << 1) + 1; bgta =3D HIGHBIT_TO_MASK (t); /* b <-- min (a, b) */ b +=3D (bgta & t); /* a <-- |a - b| */ a =3D (t ^ bgta) - bgta; } } static uintmax_t gcd2_odd (uintmax_t *r1, uintmax_t a1, uintmax_t a0, uintmax_t b1, uintmax_= t b0) { while ((a0 & 1) =3D=3D 0) rsh2 (a1, a0, a1, a0, 1); while ((b0 & 1) =3D=3D 0) rsh2 (b1, b0, b1, b0, 1); for (;;) { if ((b1 | a1) =3D=3D 0) { *r1 =3D 0; return gcd_odd (b0, a0); } if (gt2 (a1, a0, b1, b0)) { sub_ddmmss (a1, a0, a1, a0, b1, b0); do rsh2 (a1, a0, a1, a0, 1); while ((a0 & 1) =3D=3D 0); } else if (gt2 (b1, b0, a1, a0)) { sub_ddmmss (b1, b0, b1, b0, a1, a0); do rsh2 (b1, b0, b1, b0, 1); while ((b0 & 1) =3D=3D 0); } else break; } *r1 =3D a1; return a0; } static void factor_insert_multiplicity (struct factors *factors, uintmax_t prime, unsigned int m) { unsigned int nfactors =3D factors->nfactors; uintmax_t *p =3D factors->p; unsigned char *e =3D factors->e; /* Locate position for insert new or increment e. */ int i; for (i =3D nfactors - 1; i >=3D 0; i--) { if (p[i] <=3D prime) break; } if (i < 0 || p[i] !=3D prime) { for (int j =3D nfactors - 1; j > i; j--) { p[j + 1] =3D p[j]; e[j + 1] =3D e[j]; } p[i + 1] =3D prime; e[i + 1] =3D m; factors->nfactors =3D nfactors + 1; } else { e[i] +=3D m; } } #define factor_insert(f, p) factor_insert_multiplicity(f, p, 1) static void factor_insert_large (struct factors *factors, uintmax_t p1, uintmax_t p0) { if (p1 > 0) { assert (factors->plarge[1] =3D=3D 0); factors->plarge[0] =3D p0; factors->plarge[1] =3D p1; } else factor_insert (factors, p0); } #if HAVE_GMP static void mp_factor (mpz_t, struct mp_factors *); static void mp_factor_init (struct mp_factors *factors) { factors->p =3D malloc (1); factors->e =3D malloc (1); factors->nfactors =3D 0; } static void mp_factor_clear (struct mp_factors *factors) { for (unsigned int i =3D 0; i < factors->nfactors; i++) mpz_clear (factors->p[i]); free (factors->p); free (factors->e); } static void mp_factor_insert (struct mp_factors *factors, mpz_t prime) { unsigned long int nfactors =3D factors->nfactors; mpz_t *p =3D factors->p; unsigned long int *e =3D factors->e; long i; /* Locate position for insert new or increment e. */ for (i =3D nfactors - 1; i >=3D 0; i--) { if (mpz_cmp (p[i], prime) <=3D 0) break; } if (i < 0 || mpz_cmp (p[i], prime) !=3D 0) { p =3D realloc (p, (nfactors + 1) * sizeof p[0]); e =3D realloc (e, (nfactors + 1) * sizeof e[0]); mpz_init (p[nfactors]); for (long j =3D nfactors - 1; j > i; j--) { mpz_set (p[j + 1], p[j]); e[j + 1] =3D e[j]; } mpz_set (p[i + 1], prime); e[i + 1] =3D 1; factors->p =3D p; factors->e =3D e; factors->nfactors =3D nfactors + 1; } else { e[i] +=3D 1; } } static void mp_factor_insert_ui (struct mp_factors *factors, unsigned long int prime) { mpz_t pz; mpz_init_set_ui (pz, prime); mp_factor_insert (factors, pz); mpz_clear (pz); } #endif /* HAVE_GMP */ #define P(a,b,c,d) a, static const unsigned char primes_diff[] =3D { #include "primes.h" 0,0,0,0,0,0,0 /* 7 sentinels for 8-way loop */ }; #undef P #define PRIMES_PTAB_ENTRIES (sizeof(primes_diff) / sizeof(primes_diff[0]) -= 8 + 1) #define P(a,b,c,d) b, static const unsigned char primes_diff8[] =3D { #include "primes.h" 0,0,0,0,0,0,0 /* 7 sentinels for 8-way loop */ }; #undef P struct primes_dtab { uintmax_t binv, lim; }; #define P(a,b,c,d) {c,d}, static const struct primes_dtab primes_dtab[] =3D { #include "primes.h" {1,0},{1,0},{1,0},{1,0},{1,0},{1,0},{1,0} /* 7 sentinels for 8-way loop */ }; #undef P /* This flag is honoured just in the GMP code. */ static int flag_verbose =3D 0; /* Prove primality or run probabilistic tests. */ static int flag_prove_primality =3D 1; /* Number of Miller-Rabin tests to run when not proving primality. */ #define MR_REPS 25 #define LIKELY(cond) __builtin_expect ((cond) !=3D 0, 1) #define UNLIKELY(cond) __builtin_expect ((cond) !=3D 0, 0) static void factor_insert_refind (struct factors *factors, uintmax_t p, unsigned int i, unsigned int off) { for (unsigned int j =3D 0; j < off; j++) p +=3D primes_diff[i + j]; factor_insert (factors, p); } /* Trial division with odd primes uses the following trick. Let p be an odd prime, and B =3D 2^{W_TYPE_SIZE}. For simplicity, consider the case t < B (this is the second loop below). From our tables we get binv =3D p^{-1} (mod B) lim =3D floor ( (B-1) / p ). First assume that t is a multiple of p, t =3D q * p. Then 0 <=3D q <=3D lim (and all quotients in this range occur for some t). Then t =3D q * p is true also (mod B), and p is invertible we get q =3D t * binv (mod B). Next, assume that t is *not* divisible by p. Since multiplication by binv (mod B) is a one-to-one mapping, t * binv (mod B) > lim, because all the smaller values are already taken. This can be summed up by saying that the function q(t) =3D binv * t (mod B) is a permutation of the range 0 <=3D t < B, with the curious property that it maps the multiples of p onto the range 0 <=3D q <=3D lim, in order, and the non-multiples of p onto the range lim < q < B. */ static uintmax_t factor_using_division (uintmax_t *t1p, uintmax_t t1, uintmax_t t0, struct factors *factors) { if (t0 % 2 =3D=3D 0) { unsigned int cnt; if (t0 =3D=3D 0) { count_trailing_zeros (cnt, t1); t0 =3D t1 >> cnt; t1 =3D 0; cnt +=3D W_TYPE_SIZE; } else { count_trailing_zeros (cnt, t0); rsh2 (t1, t0, t1, t0, cnt); } factor_insert_multiplicity (factors, 2, cnt); } uintmax_t p =3D 3; unsigned int i; for (i =3D 0; t1 > 0 && i < PRIMES_PTAB_ENTRIES; i++) { for (;;) { uintmax_t q1, q0, hi, lo; q0 =3D t0 * primes_dtab[i].binv; umul_ppmm (hi, lo, q0, p); if (hi > t1) break; hi =3D t1 - hi; q1 =3D hi * primes_dtab[i].binv; if (LIKELY (q1 > primes_dtab[i].lim)) break; t1 =3D q1; t0 =3D q0; factor_insert (factors, p); } p +=3D primes_diff[i + 1]; } if (t1p) *t1p =3D t1; #define DIVBLOCK(I) \ do { \ for (;;) \ { \ q =3D t0 * pd[I].binv; \ if (LIKELY (q > pd[I].lim)) \ break; \ t0 =3D q; \ factor_insert_refind (factors, p, i + 1, I); \ } \ } while (0) for (; i < PRIMES_PTAB_ENTRIES; i +=3D 8) { uintmax_t q; const struct primes_dtab *pd =3D &primes_dtab[i]; DIVBLOCK (0); DIVBLOCK (1); DIVBLOCK (2); DIVBLOCK (3); DIVBLOCK (4); DIVBLOCK (5); DIVBLOCK (6); DIVBLOCK (7); p +=3D primes_diff8[i]; if (p * p > t0) break; } return t0; } #if HAVE_GMP static void mp_factor_using_division (mpz_t t, struct mp_factors *factors) { mpz_t q; unsigned long int p; if (flag_verbose > 0) { printf ("[trial division] "); } mpz_init (q); p =3D mpz_scan1 (t, 0); mpz_div_2exp (t, t, p); while (p) { mp_factor_insert_ui (factors, 2); --p; } p =3D 3; for (unsigned int i =3D 1; i <=3D PRIMES_PTAB_ENTRIES;) { if (! mpz_divisible_ui_p (t, p)) { p +=3D primes_diff[i++]; if (mpz_cmp_ui (t, p * p) < 0) break; } else { mpz_tdiv_q_ui (t, t, p); mp_factor_insert_ui (factors, p); } } mpz_clear (q); } #endif /* Entry i contains (2i+1)^(-1) mod 2^8. */ static const unsigned char binvert_table[128] =3D { 0x01, 0xAB, 0xCD, 0xB7, 0x39, 0xA3, 0xC5, 0xEF, 0xF1, 0x1B, 0x3D, 0xA7, 0x29, 0x13, 0x35, 0xDF, 0xE1, 0x8B, 0xAD, 0x97, 0x19, 0x83, 0xA5, 0xCF, 0xD1, 0xFB, 0x1D, 0x87, 0x09, 0xF3, 0x15, 0xBF, 0xC1, 0x6B, 0x8D, 0x77, 0xF9, 0x63, 0x85, 0xAF, 0xB1, 0xDB, 0xFD, 0x67, 0xE9, 0xD3, 0xF5, 0x9F, 0xA1, 0x4B, 0x6D, 0x57, 0xD9, 0x43, 0x65, 0x8F, 0x91, 0xBB, 0xDD, 0x47, 0xC9, 0xB3, 0xD5, 0x7F, 0x81, 0x2B, 0x4D, 0x37, 0xB9, 0x23, 0x45, 0x6F, 0x71, 0x9B, 0xBD, 0x27, 0xA9, 0x93, 0xB5, 0x5F, 0x61, 0x0B, 0x2D, 0x17, 0x99, 0x03, 0x25, 0x4F, 0x51, 0x7B, 0x9D, 0x07, 0x89, 0x73, 0x95, 0x3F, 0x41, 0xEB, 0x0D, 0xF7, 0x79, 0xE3, 0x05, 0x2F, 0x31, 0x5B, 0x7D, 0xE7, 0x69, 0x53, 0x75, 0x1F, 0x21, 0xCB, 0xED, 0xD7, 0x59, 0xC3, 0xE5, 0x0F, 0x11, 0x3B, 0x5D, 0xC7, 0x49, 0x33, 0x55, 0xFF }; /* Compute n^(-1) mod B, using a Newton iteration. */ #define binv(inv,n) \ do { \ uintmax_t __n =3D (n); \ uintmax_t __inv; \ \ __inv =3D binvert_table[(__n / 2) & 0x7F]; /* 8 */ \ if (W_TYPE_SIZE > 8) __inv =3D 2 * __inv - __inv * __inv * __n; \ if (W_TYPE_SIZE > 16) __inv =3D 2 * __inv - __inv * __inv * __n; \ if (W_TYPE_SIZE > 32) __inv =3D 2 * __inv - __inv * __inv * __n; \ \ if (W_TYPE_SIZE > 64) \ { \ int __invbits =3D 64; \ do { \ __inv =3D 2 * __inv - __inv * __inv * __n; \ __invbits *=3D 2; \ } while (__invbits < W_TYPE_SIZE); \ } \ \ (inv) =3D __inv; \ } while (0) /* q =3D u / d, assuming d|u. */ #define divexact_21(q1, q0, u1, u0, d) \ do { \ uintmax_t _di, _q0; \ binv (_di, (d)); \ _q0 =3D (u0) * _di; \ if ((u1) >=3D (d)) \ { \ uintmax_t _p1, _p0; \ umul_ppmm (_p1, _p0, _q0, d); \ (q1) =3D ((u1) - _p1) * _di; \ (q0) =3D _q0; \ } \ else \ { \ (q0) =3D _q0; \ (q1) =3D 0; \ } \ } while(0) /* x B (mod n). */ #define redcify(r_prim, r, n) \ do { \ uintmax_t _redcify_q; \ udiv_qrnnd (_redcify_q, r_prim, r, 0, n); \ } while (0) /* x B^2 (mod n). Requires x > 0, n1 < B/2 */ #define redcify2(r1, r0, x, n1, n0) \ do { \ uintmax_t _r1, _r0, _i; \ if ((x) < (n1)) \ { \ _r1 =3D (x); _r0 =3D 0; = \ _i =3D W_TYPE_SIZE; \ } \ else \ { \ _r1 =3D 0; _r0 =3D (x); = \ _i =3D 2*W_TYPE_SIZE; \ } \ while (_i-- > 0) \ { \ lsh2 (_r1, _r0, _r1, _r0, 1); \ if (ge2 (_r1, _r0, (n1), (n0))) \ sub_ddmmss (_r1, _r0, _r1, _r0, (n1), (n0)); \ } \ (r1) =3D _r1; \ (r0) =3D _r0; \ } while (0) /* Modular two-word multiplication, r =3D a * b mod m, with mi =3D m^(-1) m= od B. Both a and b must be in redc form, the result will be in redc form too. = */ static inline uintmax_t mulredc (uintmax_t a, uintmax_t b, uintmax_t m, uintmax_t mi) { uintmax_t rh, rl, q, th, tl, xh; umul_ppmm (rh, rl, a, b); q =3D rl * mi; umul_ppmm (th, tl, q, m); xh =3D rh - th; if (rh < th) xh +=3D m; return xh; } /* Modular two-word multiplication, r =3D a * b mod m, with mi =3D m^(-1) m= od B. Both a and b must be in redc form, the result will be in redc form too. For performance reasons, the most significant bit of m must be clear. */ static uintmax_t mulredc2 (uintmax_t *r1p, uintmax_t a1, uintmax_t a0, uintmax_t b1, uintmax_t b0, uintmax_t m1, uintmax_t m0, uintmax_t mi) { uintmax_t r1, r0, q, p1, p0, t1, t0, s1, s0; mi =3D -mi; assert ( (a1 >> (W_TYPE_SIZE - 1)) =3D=3D 0); assert ( (b1 >> (W_TYPE_SIZE - 1)) =3D=3D 0); assert ( (m1 >> (W_TYPE_SIZE - 1)) =3D=3D 0); /* First compute a0 * B^{-1} +-----+ |a0 b0| +--+--+--+ |a0 b1| +--+--+--+ |q0 m0| +--+--+--+ |q0 m1| -+--+--+--+ |r1|r0| 0| +--+--+--+ */ umul_ppmm (t1, t0, a0, b0); umul_ppmm (r1, r0, a0, b1); q =3D mi * t0; umul_ppmm (p1, p0, q, m0); umul_ppmm (s1, s0, q, m1); r0 +=3D (t0 !=3D 0); /* Carry */ add_ssaaaa (r1, r0, r1, r0, 0, p1); add_ssaaaa (r1, r0, r1, r0, 0, t1); add_ssaaaa (r1, r0, r1, r0, s1, s0); /* Next, (a1 * + B^{-1} +-----+ |a1 b0| +--+--+ |r1|r0| +--+--+--+ |a1 b1| +--+--+--+ |q1 m0| +--+--+--+ |q1 m1| -+--+--+--+ |r1|r0| 0| +--+--+--+ */ umul_ppmm (t1, t0, a1, b0); umul_ppmm (s1, s0, a1, b1); add_ssaaaa (t1, t0, t1, t0, 0, r0); q =3D mi * t0; add_ssaaaa (r1, r0, s1, s0, 0, r1); umul_ppmm (p1, p0, q, m0); umul_ppmm (s1, s0, q, m1); r0 +=3D (t0 !=3D 0); /* Carry */ add_ssaaaa (r1, r0, r1, r0, 0, p1); add_ssaaaa (r1, r0, r1, r0, 0, t1); add_ssaaaa (r1, r0, r1, r0, s1, s0); if (ge2 (r1, r0, m1, m0)) sub_ddmmss (r1, r0, r1, r0, m1, m0); *r1p =3D r1; return r0; } static uintmax_t _GL_ATTRIBUTE_CONST powm (uintmax_t b, uintmax_t e, uintmax_t n, uintmax_t ni, uintmax_t one) { uintmax_t y =3D one; if (e & 1) y =3D b; while (e !=3D 0) { b =3D mulredc (b, b, n, ni); e >>=3D 1; if (e & 1) y =3D mulredc (y, b, n, ni); } return y; } static uintmax_t powm2 (uintmax_t *r1m, const uintmax_t *bp, const uintmax_t *ep, const uintmax_t *np, uintmax_t ni, const uintmax_t *one) { uintmax_t r1, r0, b1, b0, n1, n0; unsigned int i; uintmax_t e; b0 =3D bp[0]; b1 =3D bp[1]; n0 =3D np[0]; n1 =3D np[1]; r0 =3D one[0]; r1 =3D one[1]; for (e =3D ep[0], i =3D W_TYPE_SIZE; i > 0; i--, e >>=3D 1) { if (e & 1) { r0 =3D mulredc2 (r1m, r1, r0, b1, b0, n1, n0, ni); r1 =3D *r1m; } b0 =3D mulredc2 (r1m, b1, b0, b1, b0, n1, n0, ni); b1 =3D *r1m; } for (e =3D ep[1]; e > 0; e >>=3D 1) { if (e & 1) { r0 =3D mulredc2 (r1m, r1, r0, b1, b0, n1, n0, ni); r1 =3D *r1m; } b0 =3D mulredc2 (r1m, b1, b0, b1, b0, n1, n0, ni); b1 =3D *r1m; } *r1m =3D r1; return r0; } static bool _GL_ATTRIBUTE_CONST millerrabin (uintmax_t n, uintmax_t ni, uintmax_t b, uintmax_t q, unsigned int k, uintmax_t one) { uintmax_t y =3D powm (b, q, n, ni, one); uintmax_t nm1 =3D n - one; /* -1, but in redc representation. */ if (y =3D=3D one || y =3D=3D nm1) return true; for (unsigned int i =3D 1; i < k; i++) { y =3D mulredc (y, y, n, ni); if (y =3D=3D nm1) return true; if (y =3D=3D one) return false; } return false; } static bool millerrabin2 (const uintmax_t *np, uintmax_t ni, const uintmax_t *bp, const uintmax_t *qp, unsigned int k, const uintmax_t *one) { uintmax_t y1, y0, nm1_1, nm1_0, r1m; y0 =3D powm2 (&r1m, bp, qp, np, ni, one); y1 =3D r1m; if (y0 =3D=3D one[0] && y1 =3D=3D one[1]) return true; sub_ddmmss (nm1_1, nm1_0, np[1], np[0], one[1], one[0]); if (y0 =3D=3D nm1_0 && y1 =3D=3D nm1_1) return true; for (unsigned int i =3D 1; i < k; i++) { y0 =3D mulredc2 (&r1m, y1, y0, y1, y0, np[1], np[0], ni); y1 =3D r1m; if (y0 =3D=3D nm1_0 && y1 =3D=3D nm1_1) return true; if (y0 =3D=3D one[0] && y1 =3D=3D one[1]) return false; } return false; } #if HAVE_GMP static bool mp_millerrabin (mpz_srcptr n, mpz_srcptr nm1, mpz_ptr x, mpz_ptr y, mpz_srcptr q, unsigned long int k) { mpz_powm (y, x, q, n); if (mpz_cmp_ui (y, 1) =3D=3D 0 || mpz_cmp (y, nm1) =3D=3D 0) return true; for (unsigned long int i =3D 1; i < k; i++) { mpz_powm_ui (y, y, 2, n); if (mpz_cmp (y, nm1) =3D=3D 0) return true; if (mpz_cmp_ui (y, 1) =3D=3D 0) return false; } return false; } #endif /* Lucas' prime test. The number of iterations vary greatly, up to a few d= ozen have been observed. The average seem to be about 2. */ static bool prime_p (uintmax_t n) { int k; bool is_prime; uintmax_t a_prim, one, ni; struct factors factors; if (n <=3D 1) return false; /* We have already casted out small primes. */ if (n < (uintmax_t) FIRST_OMITTED_PRIME * FIRST_OMITTED_PRIME) return true; /* Precomputation for Miller-Rabin. */ uintmax_t q =3D n - 1; for (k =3D 0; (q & 1) =3D=3D 0; k++) q >>=3D 1; uintmax_t a =3D 2; binv (ni, n); /* ni <- 1/n mod B */ redcify (one, 1, n); addmod (a_prim, one, one, n); /* i.e., redcify a =3D 2 */ /* Perform a Miller-Rabin test, finds most composites quickly. */ if (!millerrabin (n, ni, a_prim, q, k, one)) return false; if (flag_prove_primality) { /* Factor n-1 for Lucas. */ factor (0, n - 1, &factors); } /* Loop until Lucas proves our number prime, or Miller-Rabin proves our number composite. */ for (unsigned int r =3D 0; r < PRIMES_PTAB_ENTRIES; r++) { if (flag_prove_primality) { is_prime =3D true; for (unsigned int i =3D 0; i < factors.nfactors && is_prime; i++) { is_prime =3D powm (a_prim, (n - 1) / factors.p[i], n, ni, one= ) !=3D one; } } else { /* After enough Miller-Rabin runs, be content. */ is_prime =3D (r =3D=3D MR_REPS - 1); } if (is_prime) return true; a +=3D primes_diff[r]; /* Establish new base. */ /* The following is equivalent to redcify (a_prim, a, n). It runs fa= ster on most processors, since it avoids udiv_qrnnd. If we go down the udiv_qrnnd_preinv path, this code should be replaced. */ { uintmax_t dummy, s1, s0; umul_ppmm (s1, s0, one, a); if (LIKELY (s1 =3D=3D 0)) a_prim =3D s0 % n; else udiv_qrnnd (dummy, a_prim, s1, s0, n); } if (!millerrabin (n, ni, a_prim, q, k, one)) return false; } fprintf (stderr, "Lucas prime test failure. This should not happen\n"); abort (); } static bool prime2_p (uintmax_t n1, uintmax_t n0) { uintmax_t q[2], nm1[2]; uintmax_t a_prim[2]; uintmax_t one[2]; uintmax_t na[2]; uintmax_t ni; unsigned int k; struct factors factors; if (n1 =3D=3D 0) return prime_p (n0); nm1[1] =3D n1 - (n0 =3D=3D 0); nm1[0] =3D n0 - 1; if (nm1[0] =3D=3D 0) { count_trailing_zeros (k, nm1[1]); q[0] =3D nm1[1] >> k; q[1] =3D 0; k +=3D W_TYPE_SIZE; } else { count_trailing_zeros (k, nm1[0]); rsh2 (q[1], q[0], nm1[1], nm1[0], k); } uintmax_t a =3D 2; binv (ni, n0); redcify2 (one[1], one[0], 1, n1, n0); addmod2 (a_prim[1], a_prim[0], one[1], one[0], one[1], one[0], n1, n0); /* FIXME: Use scalars or pointers in arguments? Some consistency needed. = */ na[0] =3D n0; na[1] =3D n1; if (!millerrabin2 (na, ni, a_prim, q, k, one)) return false; if (flag_prove_primality) { /* Factor n-1 for Lucas. */ factor (nm1[1], nm1[0], &factors); } /* Loop until Lucas proves our number prime, or Miller-Rabin proves our number composite. */ for (unsigned int r =3D 0; r < PRIMES_PTAB_ENTRIES; r++) { bool is_prime; uintmax_t e[2], y[2]; if (flag_prove_primality) { is_prime =3D true; if (factors.plarge[1]) { uintmax_t pi; binv (pi, factors.plarge[0]); e[0] =3D pi * nm1[0]; e[1] =3D 0; y[0] =3D powm2 (&y[1], a_prim, e, na, ni, one); is_prime =3D (y[0] !=3D one[0] || y[1] !=3D one[1]); } for (unsigned int i =3D 0; i < factors.nfactors && is_prime; i++) { /* FIXME: We always have the factor 2. Do we really need to h= andle it here? We have done the same powering as part of millerrabi= n. */ if (factors.p[i] =3D=3D 2) rsh2 (e[1], e[0], nm1[1], nm1[0], 1); else divexact_21 (e[1], e[0], nm1[1], nm1[0], factors.p[i]); y[0] =3D powm2 (&y[1], a_prim, e, na, ni, one); is_prime =3D (y[0] !=3D one[0] || y[1] !=3D one[1]); } } else { /* After enough Miller-Rabin runs, be content. */ is_prime =3D (r =3D=3D MR_REPS - 1); } if (is_prime) return true; a +=3D primes_diff[r]; /* Establish new base. */ redcify2 (a_prim[1], a_prim[0], a, n1, n0); if (!millerrabin2 (na, ni, a_prim, q, k, one)) return false; } fprintf (stderr, "Lucas prime test failure. This should not happen\n"); abort (); } #if HAVE_GMP static bool mp_prime_p (mpz_t n) { bool is_prime; mpz_t q, a, nm1, tmp; struct mp_factors factors; if (mpz_cmp_ui (n, 1) <=3D 0) return false; /* We have already casted out small primes. */ if (mpz_cmp_ui (n, (long) FIRST_OMITTED_PRIME * FIRST_OMITTED_PRIME) < 0) return true; mpz_inits (q, a, nm1, tmp, NULL); /* Precomputation for Miller-Rabin. */ mpz_sub_ui (nm1, n, 1); /* Find q and k, where q is odd and n =3D 1 + 2**k * q. */ unsigned long int k =3D mpz_scan1 (nm1, 0); mpz_tdiv_q_2exp (q, nm1, k); mpz_set_ui (a, 2); /* Perform a Miller-Rabin test, finds most composites quickly. */ if (!mp_millerrabin (n, nm1, a, tmp, q, k)) { is_prime =3D false; goto ret2; } if (flag_prove_primality) { /* Factor n-1 for Lucas. */ mpz_set (tmp, nm1); mp_factor (tmp, &factors); } /* Loop until Lucas proves our number prime, or Miller-Rabin proves our number composite. */ for (unsigned int r =3D 0; r < PRIMES_PTAB_ENTRIES; r++) { if (flag_prove_primality) { is_prime =3D true; for (unsigned long int i =3D 0; i < factors.nfactors && is_prime;= i++) { mpz_divexact (tmp, nm1, factors.p[i]); mpz_powm (tmp, a, tmp, n); is_prime =3D mpz_cmp_ui (tmp, 1) !=3D 0; } } else { /* After enough Miller-Rabin runs, be content. */ is_prime =3D (r =3D=3D MR_REPS - 1); } if (is_prime) goto ret1; mpz_add_ui (a, a, primes_diff[r]); /* Establish new base. */ if (!mp_millerrabin (n, nm1, a, tmp, q, k)) { is_prime =3D false; goto ret1; } } fprintf (stderr, "Lucas prime test failure. This should not happen\n"); abort (); ret1: if (flag_prove_primality) mp_factor_clear (&factors); ret2: mpz_clears (q, a, nm1, tmp, NULL); return is_prime; } #endif static void factor_using_pollard_rho (uintmax_t n, unsigned long int a, struct factors *factors) { uintmax_t x, z, y, P, t, ni, g; unsigned long int k =3D 1; unsigned long int l =3D 1; redcify (P, 1, n); addmod (x, P, P, n); /* i.e., redcify(2) */ y =3D z =3D x; while (n !=3D 1) { assert (a < n); binv (ni, n); /* FIXME: when could we use old 'ni' value?= */ for (;;) { do { x =3D mulredc (x, x, n, ni); addmod (x, x, a, n); submod (t, z, x, n); P =3D mulredc (P, t, n, ni); if (k % 32 =3D=3D 1) { if (gcd_odd (P, n) !=3D 1) goto factor_found; y =3D x; } } while (--k !=3D 0); z =3D x; k =3D l; l =3D 2 * l; for (unsigned long int i =3D 0; i < k; i++) { x =3D mulredc (x, x, n, ni); addmod (x, x, a, n); } y =3D x; } factor_found: do { y =3D mulredc (y, y, n, ni); addmod (y, y, a, n); submod (t, z, y, n); g =3D gcd_odd (t, n); } while (g =3D=3D 1); n =3D n / g; if (!prime_p (g)) factor_using_pollard_rho (g, a + 1, factors); else factor_insert (factors, g); if (prime_p (n)) { factor_insert (factors, n); break; } x =3D x % n; z =3D z % n; y =3D y % n; } } static void factor_using_pollard_rho2 (uintmax_t n1, uintmax_t n0, unsigned long int a, struct factors *factors) { uintmax_t x1, x0, z1, z0, y1, y0, P1, P0, t1, t0, ni, g1, g0, r1m; unsigned long int k =3D 1; unsigned long int l =3D 1; redcify2 (P1, P0, 1, n1, n0); addmod2 (x1, x0, P1, P0, P1, P0, n1, n0); /* i.e., redcify(2) */ y1 =3D z1 =3D x1; y0 =3D z0 =3D x0; while (n1 !=3D 0 || n0 !=3D 1) { binv (ni, n0); for (;;) { do { x0 =3D mulredc2 (&r1m, x1, x0, x1, x0, n1, n0, ni); x1 =3D r1m; addmod2 (x1, x0, x1, x0, 0, a, n1, n0); submod2 (t1, t0, z1, z0, x1, x0, n1, n0); P0 =3D mulredc2 (&r1m, P1, P0, t1, t0, n1, n0, ni); P1 =3D r1m; if (k % 32 =3D=3D 1) { g0 =3D gcd2_odd (&g1, P1, P0, n1, n0); if (g1 !=3D 0 || g0 !=3D 1) goto factor_found; y1 =3D x1; y0 =3D x0; } } while (--k !=3D 0); z1 =3D x1; z0 =3D x0; k =3D l; l =3D 2 * l; for (unsigned long int i =3D 0; i < k; i++) { x0 =3D mulredc2 (&r1m, x1, x0, x1, x0, n1, n0, ni); x1 =3D r1m; addmod2 (x1, x0, x1, x0, 0, a, n1, n0); } y1 =3D x1; y0 =3D x0; } factor_found: do { y0 =3D mulredc2 (&r1m, y1, y0, y1, y0, n1, n0, ni); y1 =3D r1m; addmod2 (y1, y0, y1, y0, 0, a, n1, n0); submod2 (t1, t0, z1, z0, y1, y0, n1, n0); g0 =3D gcd2_odd (&g1, t1, t0, n1, n0); } while (g1 =3D=3D 0 && g0 =3D=3D 1); if (g1 =3D=3D 0) { /* The found factor is one word. */ divexact_21 (n1, n0, n1, n0, g0); /* n =3D n / g */ if (!prime_p (g0)) factor_using_pollard_rho (g0, a + 1, factors); else factor_insert (factors, g0); } else { /* The found factor is two words. This is highly unlikely, thus = hard to trigger. Please be careful before you change this code! */ uintmax_t ginv; binv (ginv, g0); /* Compute n =3D n / g. Since the result w= ill */ n0 =3D ginv * n0; /* fit one word, we can compute the quoti= ent */ n1 =3D 0; /* modulo B, ignoring the high divisor wo= rd. */ if (!prime2_p (g1, g0)) factor_using_pollard_rho2 (g1, g0, a + 1, factors); else factor_insert_large (factors, g1, g0); } if (n1 =3D=3D 0) { if (prime_p (n0)) { factor_insert (factors, n0); break; } factor_using_pollard_rho (n0, a, factors); return; } if (prime2_p (n1, n0)) { factor_insert_large (factors, n1, n0); break; } x0 =3D mod2 (&x1, x1, x0, n1, n0); z0 =3D mod2 (&z1, z1, z0, n1, n0); y0 =3D mod2 (&y1, y1, y0, n1, n0); } } #if HAVE_GMP static void mp_factor_using_pollard_rho (mpz_t n, unsigned long int a, struct mp_factors *factors) { mpz_t x, z, y, P; mpz_t t, t2; unsigned long long int k, l; if (flag_verbose > 0) { printf ("[pollard-rho (%lu)] ", a); } mpz_inits (t, t2, NULL); mpz_init_set_si (y, 2); mpz_init_set_si (x, 2); mpz_init_set_si (z, 2); mpz_init_set_ui (P, 1); k =3D 1; l =3D 1; while (mpz_cmp_ui (n, 1) !=3D 0) { for (;;) { do { mpz_mul (t, x, x); mpz_mod (x, t, n); mpz_add_ui (x, x, a); mpz_sub (t, z, x); mpz_mul (t2, P, t); mpz_mod (P, t2, n); if (k % 32 =3D=3D 1) { mpz_gcd (t, P, n); if (mpz_cmp_ui (t, 1) !=3D 0) goto factor_found; mpz_set (y, x); } } while (--k !=3D 0); mpz_set (z, x); k =3D l; l =3D 2 * l; for (unsigned long long int i =3D 0; i < k; i++) { mpz_mul (t, x, x); mpz_mod (x, t, n); mpz_add_ui (x, x, a); } mpz_set (y, x); } factor_found: do { mpz_mul (t, y, y); mpz_mod (y, t, n); mpz_add_ui (y, y, a); mpz_sub (t, z, y); mpz_gcd (t, t, n); } while (mpz_cmp_ui (t, 1) =3D=3D 0); mpz_divexact (n, n, t); /* divide by t, before t is overwritten */ if (!mp_prime_p (t)) { if (flag_verbose > 0) { printf ("[composite factor--restarting pollard-rho] "); } mp_factor_using_pollard_rho (t, a + 1, factors); } else { mp_factor_insert (factors, t); } if (mp_prime_p (n)) { mp_factor_insert (factors, n); break; } mpz_mod (x, x, n); mpz_mod (z, z, n); mpz_mod (y, y, n); } mpz_clears (P, t2, t, z, x, y, NULL); } #endif /* FIXME: Maybe better to use an iteration converging to 1/sqrt(n)? If algorithm is replaced, consider also returning the remainder. */ static uintmax_t _GL_ATTRIBUTE_CONST isqrt (uintmax_t n) { uintmax_t x; unsigned c; if (n =3D=3D 0) return 0; count_leading_zeros (c, n); /* Make x > sqrt(n). This will be invariant through the loop. */ x =3D (uintmax_t) 1 << ((W_TYPE_SIZE + 1 - c) / 2); for (;;) { uintmax_t y =3D (x + n/x) / 2; if (y >=3D x) return x; x =3D y; } } static uintmax_t _GL_ATTRIBUTE_CONST isqrt2 (uintmax_t nh, uintmax_t nl) { unsigned int shift; uintmax_t x; /* Ensures the remainder fits in an uintmax_t. */ assert (nh < ((uintmax_t) 1 << (W_TYPE_SIZE - 2))); if (nh =3D=3D 0) return isqrt (nl); count_leading_zeros (shift, nh); shift &=3D ~1; /* Make x > sqrt(n) */ x =3D isqrt ( (nh << shift) + (nl >> (W_TYPE_SIZE - shift))) + 1; x <<=3D (W_TYPE_SIZE - shift) / 2; /* Do we need more than one iteration? */ for (;;) { uintmax_t q, r, y; udiv_qrnnd (q, r, nh, nl, x); y =3D (x + q) / 2; if (y >=3D x) { uintmax_t hi, lo; umul_ppmm (hi, lo, x + 1, x + 1); assert (gt2 (hi, lo, nh, nl)); umul_ppmm (hi, lo, x, x); assert (ge2 (nh, nl, hi, lo)); sub_ddmmss (hi, lo, nh, nl, hi, lo); assert (hi =3D=3D 0); return x; } x =3D y; } } /* MAGIC[N] has a bit i set iff i is a quadratic residue mod N. */ #define MAGIC64 ((uint64_t) 0x0202021202030213ULL) #define MAGIC63 ((uint64_t) 0x0402483012450293ULL) #define MAGIC65 ((uint64_t) 0x218a019866014613ULL) #define MAGIC11 0x23b /* Returns the square root if the input is a square, otherwise 0. */ static uintmax_t _GL_ATTRIBUTE_CONST is_square (uintmax_t x) { /* Uses the tests suggested by Cohen. Excludes 99% of the non-squares bef= ore computing the square root. */ if (((MAGIC64 >> (x & 63)) & 1) && ((MAGIC63 >> (x % 63)) & 1) /* Both 0 and 64 are squares mod (65) */ && ((MAGIC65 >> ((x % 65) & 63)) & 1) && ((MAGIC11 >> (x % 11) & 1))) { uintmax_t r =3D isqrt (x); if (r*r =3D=3D x) return r; } return 0; } static const unsigned short invtab[] =3D { 0x1fc, 0x1f8, 0x1f4, 0x1f0, 0x1ec, 0x1e9, 0x1e5, 0x1e1, 0x1de, 0x1da, 0x1d7, 0x1d4, 0x1d0, 0x1cd, 0x1ca, 0x1c7, 0x1c3, 0x1c0, 0x1bd, 0x1ba, 0x1b7, 0x1b4, 0x1b2, 0x1af, 0x1ac, 0x1a9, 0x1a6, 0x1a4, 0x1a1, 0x19e, 0x19c, 0x199, 0x197, 0x194, 0x192, 0x18f, 0x18d, 0x18a, 0x188, 0x186, 0x183, 0x181, 0x17f, 0x17d, 0x17a, 0x178, 0x176, 0x174, 0x172, 0x170, 0x16e, 0x16c, 0x16a, 0x168, 0x166, 0x164, 0x162, 0x160, 0x15e, 0x15c, 0x15a, 0x158, 0x157, 0x155, 0x153, 0x151, 0x150, 0x14e, 0x14c, 0x14a, 0x149, 0x147, 0x146, 0x144, 0x142, 0x141, 0x13f, 0x13e, 0x13c, 0x13b, 0x139, 0x138, 0x136, 0x135, 0x133, 0x132, 0x130, 0x12f, 0x12e, 0x12c, 0x12b, 0x129, 0x128, 0x127, 0x125, 0x124, 0x123, 0x121, 0x120, 0x11f, 0x11e, 0x11c, 0x11b, 0x11a, 0x119, 0x118, 0x116, 0x115, 0x114, 0x113, 0x112, 0x111, 0x10f, 0x10e, 0x10d, 0x10c, 0x10b, 0x10a, 0x109, 0x108, 0x107, 0x106, 0x105, 0x104, 0x103, 0x102, 0x101, 0x100, }; /* Compute q =3D [u/d], r =3D u mod d. Avoids slow hardware division for t= he case that q < 0x40; here it instead uses a table of (Euclidian) inverses. */ #define div_smallq(q, r, u, d) \ do { \ if (0 && (u) / 0x40 < (d)) \ { \ int _cnt; \ uintmax_t _dinv, _mask, _q, _r; \ count_leading_zeros (_cnt, (d)); \ \ _dinv =3D invtab[((d) >> (W_TYPE_SIZE - 8 - _cnt)) \ - (1 << (8 - 1))]; \ \ _r =3D (u); \ _q =3D _r * _dinv >> (W_TYPE_SIZE + 8 - _cnt); \ _r -=3D _q*(d); \ \ _mask =3D -(uintmax_t) (_r >=3D (d)); = \ (r) =3D _r - (_mask & (d)); \ (q) =3D _q - _mask; \ assert ( (q) * (d) + (r) =3D=3D u); = \ } \ else \ { \ uintmax_t _q =3D (u) / (d); \ (r) =3D (u) - _q * (d); \ (q) =3D _q; \ } \ } while (0) /* Notes: Example N =3D 22117019. After first phase we find Q1 =3D 6314, Q =3D 3025, P =3D 1737, representing F_{18} =3D (-6314, 2* 1737, 3025), with 3025 =3D 55^2. Constructing the square root, we get Q1 =3D 55, Q =3D 8653, P =3D 4652, representing G_0 =3D (-55, 2*4652, 8653). In the notation of the paper: S_{-1} =3D 55, S_0 =3D 8653, R_0 =3D 4652 Put t_0 =3D floor([q_0 + R_0] / S0) =3D 1 R_1 =3D t_0 * S_0 - R_0 =3D 4001 S_1 =3D S_{-1} +t_0 (R_0 - R_1) =3D 706 */ /* Multipliers, in order of efficiency: 0.7268 3*5*7*11 =3D 1155 =3D 3 (mod 4) 0.7317 3*5*7 =3D 105 =3D 1 0.7820 3*5*11 =3D 165 =3D 1 0.7872 3*5 =3D 15 =3D 3 0.8101 3*7*11 =3D 231 =3D 3 0.8155 3*7 =3D 21 =3D 1 0.8284 5*7*11 =3D 385 =3D 1 0.8339 5*7 =3D 35 =3D 3 0.8716 3*11 =3D 33 =3D 1 0.8774 3 =3D 3 =3D 3 0.8913 5*11 =3D 55 =3D 3 0.8972 5 =3D 5 =3D 1 0.9233 7*11 =3D 77 =3D 1 0.9295 7 =3D 7 =3D 3 0.9934 11 =3D 11 =3D 3 */ #define QUEUE_SIZE 50 #if STAT_SQUFOF # define Q_FREQ_SIZE 50 /* Element 0 keeps the total */ static unsigned int q_freq[Q_FREQ_SIZE + 1]; # define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif static void factor_using_squfof (uintmax_t n1, uintmax_t n0, struct factors *factors) { /* Uses algorithm and notation from SQUARE FORM FACTORIZATION JASON E. GOWER AND SAMUEL S. WAGSTAFF, JR. http://homes.cerias.purdue.edu/~ssw/squfof.pdf */ static const unsigned int multipliers_1[] =3D { /* =3D 1 (mod 4) */ 105, 165, 21, 385, 33, 5, 77, 1, 0 }; static const unsigned int multipliers_3[] =3D { /* =3D 3 (mod 4) */ 1155, 15, 231, 35, 3, 55, 7, 11, 0 }; uintmax_t S; const unsigned int *m; struct { uintmax_t Q; uintmax_t P; } queue[QUEUE_SIZE]; S =3D isqrt2 (n1, n0); if (n0 =3D=3D S * S) { uintmax_t p1, p0; umul_ppmm (p1, p0, S, S); assert (p0 =3D=3D n0); if (n1 =3D=3D p1) { if (prime_p (S)) factor_insert_multiplicity (factors, S, 2); else { struct factors f; f.nfactors =3D 0; factor_using_squfof (0, S, &f); /* Duplicate the new factors */ for (unsigned int i =3D 0; i < f.nfactors; i++) factor_insert_multiplicity (factors, f.p[i], 2*f.e[i]); } return; } } /* Select multipliers so we always get n * mu =3D 3 (mod 4) */ for (m =3D (n0 % 4 =3D=3D 1) ? multipliers_3 : multipliers_1; *m; m++) { uintmax_t S, Dh, Dl, Q1, Q, P, L, L1, B; unsigned int i; unsigned int mu =3D *m; unsigned int qpos =3D 0; assert (mu * n0 % 4 =3D=3D 3); /* In the notation of the paper, with mu * n =3D=3D 3 (mod 4), we get \Delta =3D 4 mu * n, and the paper's \mu is 2 mu. As far as I understand it, the necessary bound is 4 \mu^3 < n, or 32 mu^3 < n. However, this seems insufficient: With n =3D 37243139 and mu =3D 105, we get a trivial factor, from the square 38809 =3D 197^2, without any corresponding Q earlier in the iteration. Requiring 64 mu^3 < n seems sufficient. */ if (n1 =3D=3D 0) { if ((uintmax_t) mu*mu*mu >=3D n0 / 64) continue; } else { if (n1 > ((uintmax_t) 1 << (W_TYPE_SIZE - 2)) / mu) continue; } umul_ppmm (Dh, Dl, n0, mu); Dh +=3D n1 * mu; assert (Dl % 4 !=3D 1); S =3D isqrt2 (Dh, Dl); Q1 =3D 1; P =3D S; /* Square root remainder fits in one word, so ignore high part. */ Q =3D Dl - P*P; /* FIXME: When can this differ from floor(sqrt(2 sqrt(D)))? */ L =3D isqrt (2*S); B =3D 2*L; L1 =3D mu * 2 * L; /* The form is (+/- Q1, 2P, -/+ Q), of discriminant 4 (P^2 + Q Q1) =3D 4 D. */ for (i =3D 0; i <=3D B; i++) { uintmax_t q, P1, t, r; div_smallq (q, r, S+P, Q); P1 =3D S - r; /* P1 =3D q*Q - P */ #if STAT_SQUFOF assert (q > 0); q_freq[0]++; q_freq[MIN(q, Q_FREQ_SIZE)]++; #endif if (Q <=3D L1) { uintmax_t g =3D Q; if ( (Q & 1) =3D=3D 0) g /=3D 2; g /=3D gcd_odd (g, mu); if (g <=3D L) { if (qpos >=3D QUEUE_SIZE) { fprintf (stderr, "squfof queue overflow.\n"); exit (EXIT_FAILURE); } queue[qpos].Q =3D g; queue[qpos].P =3D P % g; qpos++; } } /* I think the difference can be either sign, but mod 2^W_TYPE_SIZE arithmetic should be fine. */ t =3D Q1 + q * (P - P1); Q1 =3D Q; Q =3D t; P =3D P1; if ( (i & 1) =3D=3D 0) { uintmax_t r =3D is_square (Q); if (r) { unsigned int j; for (j =3D 0; j < qpos; j++) { if (queue[j].Q =3D=3D r) { if (r =3D=3D 1) /* Traversed entire cycle. */ goto next_multiplier; /* Need the absolute value for divisibility test.= */ if (P >=3D queue[j].P) t =3D P - queue[j].P; else t =3D queue[j].P - P; if (t % r =3D=3D 0) { /* Delete entries up to and including entry j, which matched. */ memmove (queue, queue + j + 1, (qpos - j - 1) * sizeof (queue[0])); qpos -=3D (j + 1); } goto next_i; } } /* We have found a square form, which should give a factor. */ Q1 =3D r; assert (S >=3D P); /* What signs are possible? */ P +=3D r * ((S - P) / r); /* Note: Paper says (N - P*P) / Q1, that seems incorrect for the case D =3D 2N. */ /* Compute Q =3D (D - P*P) / Q1, but we need double precision. */ { uintmax_t hi, lo, rem; umul_ppmm (hi, lo, P, P); sub_ddmmss (hi, lo, Dh, Dl, hi, lo); udiv_qrnnd (Q, rem, hi, lo, Q1); assert (rem =3D=3D 0); } for (;;) { uintmax_t r; /* Note: There appears to by a typo in the paper, Step 4a in the algorithm description says q <-- floor([S+P]/\hat Q), but looking at the equations in Sec. 3.1, it should be q <-- floor([S+P] / Q). (In this code, \hat Q is Q1). */ div_smallq (q, r, S+P, Q); P1 =3D S - r; /* P1 =3D q*Q - P */ #if STAT_SQUFOF q_freq[0]++; q_freq[MIN(q, Q_FREQ_SIZE)]++; #endif if (P =3D=3D P1) break; t =3D Q1 + q * (P - P1); Q1 =3D Q; Q =3D t; P =3D P1; } if ( (Q & 1) =3D=3D 0) Q /=3D 2; Q /=3D gcd_odd (Q, mu); assert (Q > 1 && (n1 || Q < n0)); if (prime_p (Q)) factor_insert (factors, Q); else factor_using_squfof (0, Q, factors); divexact_21 (n1, n0, n1, n0, Q); if (prime2_p (n1, n0)) factor_insert_large (factors, n1, n0); else { if (n1 =3D=3D 0) factor_using_pollard_rho (n0, 1, factors); else factor_using_squfof (n1, n0, factors); } return; } } next_i: ; } next_multiplier: ; } fprintf (stderr, "squfof failed.\n"); exit (EXIT_FAILURE); } static void factor (uintmax_t t1, uintmax_t t0, struct factors *factors) { factors->nfactors =3D 0; factors->plarge[1] =3D 0; if (t1 =3D=3D 0 && t0 < 2) return; t0 =3D factor_using_division (&t1, t1, t0, factors); if (t1 =3D=3D 0) { if (t0 !=3D 1) { if (prime_p (t0)) factor_insert (factors, t0); else if (alg =3D=3D ALG_POLLARD_RHO) factor_using_pollard_rho (t0, 1, factors); else factor_using_squfof (0, t0, factors); } } else { if (prime2_p (t1, t0)) factor_insert_large (factors, t1, t0); else if (alg =3D=3D ALG_POLLARD_RHO) factor_using_pollard_rho2 (t1, t0, 1, factors); else factor_using_squfof (t1, t0, factors); } } #if HAVE_GMP static void mp_factor (mpz_t t, struct mp_factors *factors) { mp_factor_init (factors); if (mpz_sgn (t) !=3D 0) { mp_factor_using_division (t, factors); if (mpz_cmp_ui (t, 1) !=3D 0) { if (flag_verbose > 0) { printf ("[is number prime?] "); } if (mp_prime_p (t)) mp_factor_insert (factors, t); else mp_factor_using_pollard_rho (t, 1, factors); } } } #endif static int strto2uintmax (uintmax_t *hip, uintmax_t *lop, const char *s) { int errcode; unsigned int lo_carry; uintmax_t hi, lo; errcode =3D -1; hi =3D lo =3D 0; for (;;) { unsigned int c =3D *s++; if (c =3D=3D 0) break; if (UNLIKELY (c < '0' || c > '9')) { errcode =3D -1; break; } c -=3D '0'; errcode =3D 0; /* we've seen at least one valid digit */ if (UNLIKELY (hi > ~(uintmax_t)0 / 10)) { errcode =3D -1; /* overflow */ break; } hi =3D 10 * hi; lo_carry =3D (lo >> (W_TYPE_SIZE - 3)) + (lo >> (W_TYPE_SIZE - 1)); lo_carry +=3D 10 * lo < 2 * lo; lo =3D 10 * lo; lo +=3D c; lo_carry +=3D lo < c; hi +=3D lo_carry; if (UNLIKELY (hi < lo_carry)) { errcode =3D -1; /* overflow */ break; } } *hip =3D hi; *lop =3D lo; return errcode; } static void print_uintmaxes (uintmax_t t1, uintmax_t t0) { uintmax_t q, r; if (t1 =3D=3D 0) printf ("%ju", t0); else { /* Use very plain code here since it seems hard to write fast code without assuming a specific word size. */ q =3D t1 / 1000000000; r =3D t1 % 1000000000; udiv_qrnnd (t0, r, r, t0, 1000000000); print_uintmaxes (q, t0); printf ("%09u", (int) r); } } static void factor_one (const char *input) { uintmax_t t1, t0; int errcode; /* Try converting the number to one or two words. If it fails, use GMP or print an error message. The 2nd condition checks that the most significant bit of the two-word number is clear, in a typesize neutral way. */ errcode =3D strto2uintmax (&t1, &t0, input); if (errcode =3D=3D 0 && ((t1 << 1) >> 1) =3D=3D t1) { struct factors factors; print_uintmaxes (t1, t0); printf (":"); factor (t1, t0, &factors); for (unsigned int j =3D 0; j < factors.nfactors; j++) for (unsigned int k =3D 0; k < factors.e[j]; k++) printf (" %ju", factors.p[j]); if (factors.plarge[1]) { printf (" "); print_uintmaxes (factors.plarge[1], factors.plarge[0]); } puts (""); } else { #if HAVE_GMP mpz_t t; struct mp_factors factors; mpz_init_set_str (t, input, 10); gmp_printf ("%Zd:", t); mp_factor (t, &factors); for (unsigned int j =3D 0; j < factors.nfactors; j++) for (unsigned int k =3D 0; k < factors.e[j]; k++) gmp_printf (" %Zd", factors.p[j]); mp_factor_clear (&factors); mpz_clear (t); puts (""); #else fprintf (stderr, "error: number %s not parsable or too large\n", inpu= t); exit (EXIT_FAILURE); #endif } } struct inbuf { char *buf; size_t alloc; }; /* Read white-space delimited items. Return 1 on success, 0 on EOF. Exit on I/O errors. */ int read_item (struct inbuf *bufstruct) { int c; size_t i; char *buf =3D bufstruct->buf; do c =3D getchar_unlocked (); while (isspace (c)); for (i =3D 0; !isspace(c); i++) { if (c < 0) { if (ferror (stdin)) { fprintf (stderr, "read error on stdin: %s\n", strerror(errno)= ); exit (EXIT_FAILURE); } if (i =3D=3D 0) return 0; else break; } if (UNLIKELY (bufstruct->alloc <=3D i + 1)) /* +1 byte for terminatin= g NUL */ { bufstruct->alloc =3D bufstruct->alloc * 5 / 4 + 1; bufstruct->buf =3D realloc (bufstruct->buf, bufstruct->alloc); buf =3D bufstruct->buf; } buf[i] =3D c; c =3D getchar_unlocked (); } buf[i] =3D '\0'; return 1; } int main (int argc, char *argv[]) { int c; alg =3D ALG_POLLARD_RHO; /* Default to Pollard rho */ while ( (c =3D getopt(argc, argv, "svw")) !=3D -1) switch (c) { case 's': alg =3D ALG_SQUFOF; break; case 'v': flag_verbose =3D 1; break; case 'w': flag_prove_primality =3D 0; break; case '?': printf ("Usage: %s [-s] number ...\n", argv[0]); return EXIT_FAILURE; } #if STAT_SQUFOF if (alg =3D=3D ALG_SQUFOF) memset (q_freq, 0, sizeof (q_freq)); #endif if (optind < argc) for (int i =3D optind; i < argc; i++) factor_one (argv[i]); else { struct inbuf bufstruct; bufstruct.alloc =3D 50; /* enough unless HAVE_GMP */ bufstruct.buf =3D malloc (bufstruct.alloc); while (read_item (&bufstruct)) factor_one (bufstruct.buf); } #if STAT_SQUFOF if (alg =3D=3D ALG_SQUFOF && q_freq[0] > 0) { double acc_f; printf ("q freq. cum. freq.(total: %d)\n", q_freq[0]); for (unsigned int i =3D 1, acc_f =3D 0.0; i <=3D Q_FREQ_SIZE; i++) { double f =3D (double) q_freq[i] / q_freq[0]; acc_f +=3D f; printf ("%s%d %.2f%% %.2f%%\n", i =3D=3D Q_FREQ_SIZE ? ">=3D" : "= ", i, 100.0 * f, 100.0 * acc_f); } } #endif exit (EXIT_SUCCESS); } --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 17 05:26:34 2012 Received: (at 12350) by debbugs.gnu.org; 17 Sep 2012 09:26:34 +0000 Received: from localhost ([127.0.0.1]:38428 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDXb8-0005OC-CB for submit@debbugs.gnu.org; Mon, 17 Sep 2012 05:26:34 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:30893 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDXb5-0005O3-Cn for 12350@debbugs.gnu.org; Mon, 17 Sep 2012 05:26:32 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id C5CFB469A5; Mon, 17 Sep 2012 11:25:16 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Mon, 17 Sep 2012 11:25:16 +0200 In-Reply-To: <87d31lsnjq.fsf@rho.meyering.net> (Jim Meyering's message of "Sun\, 16 Sep 2012 22\:47\:05 +0200") Message-ID: <86392hngqr.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, Torbjorn Granlund X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Jim Meyering writes: At least one other change may be interesting to you: another scope-reduction one: =20=20 - inline uintmax_t + static inline uintmax_t mulredc (uintmax_t a, uintmax_t b, uintmax_t m, uintmax_t mi) =20=20 How about going all the way, making everything (but main) static? --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 17 05:32:37 2012 Received: (at 12350) by debbugs.gnu.org; 17 Sep 2012 09:32:37 +0000 Received: from localhost ([127.0.0.1]:38432 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDXgz-0005XN-9Y for submit@debbugs.gnu.org; Mon, 17 Sep 2012 05:32:37 -0400 Received: from mx.meyering.net ([88.168.87.75]:55445) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDXgx-0005XD-BD for 12350@debbugs.gnu.org; Mon, 17 Sep 2012 05:32:36 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 54C04600B3; Mon, 17 Sep 2012 11:31:19 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <86392hngqr.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Mon, 17 Sep 2012 11:25:16 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> Date: Mon, 17 Sep 2012 11:31:19 +0200 Message-ID: <87d31lq9lk.fsf@rho.meyering.net> Lines: 16 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -2.4 (--) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -2.4 (--) Torbjorn Granlund wrote: > Jim Meyering writes: > > At least one other change may be interesting to you: > another scope-reduction one: > > - inline uintmax_t > + static inline uintmax_t > mulredc (uintmax_t a, uintmax_t b, uintmax_t m, uintmax_t mi) > > How about going all the way, making everything (but main) static? That was the intent. One of the earlier patches I sent converted all of the others. I had missed mulredc initially because I'd searched manually for names annotated with a " T " in the output of nm. From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 17 12:05:55 2012 Received: (at 12350) by debbugs.gnu.org; 17 Sep 2012 16:05:55 +0000 Received: from localhost ([127.0.0.1]:40105 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDdpa-0000p6-Vy for submit@debbugs.gnu.org; Mon, 17 Sep 2012 12:05:55 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:51084 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDdpX-0000ox-NE for 12350@debbugs.gnu.org; Mon, 17 Sep 2012 12:05:53 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 3D76A469EE; Mon, 17 Sep 2012 18:04:35 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Mon, 17 Sep 2012 18:04:35 +0200 In-Reply-To: <87d31lq9lk.fsf@rho.meyering.net> (Jim Meyering's message of "Mon\, 17 Sep 2012 11\:31\:19 +0200") Message-ID: <86haqwk54c.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Jim Meyering writes: Torbjorn Granlund wrote: > Jim Meyering writes: > > At least one other change may be interesting to you: > another scope-reduction one: > > - inline uintmax_t > + static inline uintmax_t > mulredc (uintmax_t a, uintmax_t b, uintmax_t m, uintmax_t mi) > > How about going all the way, making everything (but main) static? =20=20 Please consider these additional changes: *** .~/cu-factor.c.~1~ Mon Sep 17 11:26:31 2012 --- cu-factor.c Mon Sep 17 15:45:05 2012 *************** *** 134,139 **** --- 134,140 ---- #endif #define LONGLONG_STANDALONE /* Don't require GMP's longlong.h mdep fi= les */ #define ASSERT(x) /* FIXME make longlong.h really standalon= e */ + #define __GMP_DECLSPEC /* FIXME make longlong.h really standalon= e */ #define __clz_tab factor_clz_tab /* Rename to avoid glibc collision */ #ifndef __GMP_GNUC_PREREQ #define __GMP_GNUC_PREREQ(a,b) 1 *************** *** 143,149 **** # endif # include "longlong.h" # ifdef COUNT_LEADING_ZEROS_NEED_CLZ_TAB ! const unsigned char factor_clz_tab[129] =3D { 1,2,3,3,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, --- 144,150 ---- #endif #include "longlong.h" #ifdef COUNT_LEADING_ZEROS_NEED_CLZ_TAB ! static const unsigned char factor_clz_tab[129] =3D { 1,2,3,3,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, *************** *** 1555,1561 **** { mpz_t x, z, y, P; mpz_t t, t2; - unsigned long long int k, l; =20=20 if (flag_verbose > 0) { --- 1556,1561 ---- *************** *** 1567,1574 **** mpz_init_set_si (x, 2); mpz_init_set_si (z, 2); mpz_init_set_ui (P, 1); ! k =3D 1; ! l =3D 1; =20=20 while (mpz_cmp_ui (n, 1) !=3D 0) { --- 1567,1575 ---- mpz_init_set_si (x, 2); mpz_init_set_si (z, 2); mpz_init_set_ui (P, 1); !=20 ! unsigned long long int k =3D 1; ! unsigned long long int l =3D 1; =20=20 while (mpz_cmp_ui (n, 1) !=3D 0) { *************** *** 2287,2293 **** =20=20 /* Read white-space delimited items. Return 1 on success, 0 on EOF. Exit on I/O errors. */ ! int read_item (struct inbuf *bufstruct) { int c; --- 2288,2294 ---- =20=20 /* Read white-space delimited items. Return 1 on success, 0 on EOF. Exit on I/O errors. */ ! static int read_item (struct inbuf *bufstruct) { int c; =20=20 --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 17 13:37:38 2012 Received: (at 12350) by debbugs.gnu.org; 17 Sep 2012 17:37:38 +0000 Received: from localhost ([127.0.0.1]:40222 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDfGL-0002uF-Ob for submit@debbugs.gnu.org; Mon, 17 Sep 2012 13:37:38 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:31787 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDfGJ-0002u6-63 for 12350@debbugs.gnu.org; Mon, 17 Sep 2012 13:37:36 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 89EA546A05; Mon, 17 Sep 2012 19:36:18 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Mon, 17 Sep 2012 19:36:18 +0200 In-Reply-To: <87ipbdsnpk.fsf@rho.meyering.net> (Jim Meyering's message of "Sun\, 16 Sep 2012 22\:43\:35 +0200") Message-ID: <867grsk0vh.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Jim Meyering writes: Would you mind changing the names of a few variables or adjusting declarations to avoid some -Wshadow warnings? =20=20 I changed the innermost "r" to "rem" locally, but there are others. Also, "S". =20=20 The two remaining instances are in squfof. Niels, please address those. You'll find them by passing -Wshadow to gcc. --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 17 16:01:08 2012 Received: (at 12350) by debbugs.gnu.org; 17 Sep 2012 20:01:08 +0000 Received: from localhost ([127.0.0.1]:40351 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDhVD-0006xc-PW for submit@debbugs.gnu.org; Mon, 17 Sep 2012 16:01:08 -0400 Received: from mx.meyering.net ([88.168.87.75]:57044) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDhUx-0006x0-Bl for 12350@debbugs.gnu.org; Mon, 17 Sep 2012 16:01:06 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id A7CDF60098; Mon, 17 Sep 2012 21:59:33 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <86haqwk54c.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Mon, 17 Sep 2012 18:04:35 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> Date: Mon, 17 Sep 2012 21:59:33 +0200 Message-ID: <87ehm0o1y2.fsf@rho.meyering.net> Lines: 93 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -2.4 (--) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -2.4 (--) Torbjorn Granlund wrote: ... > Please consider these additional changes: > > *** .~/cu-factor.c.~1~ Mon Sep 17 11:26:31 2012 > --- cu-factor.c Mon Sep 17 15:45:05 2012 > *************** > *** 134,139 **** > --- 134,140 ---- > #endif > #define LONGLONG_STANDALONE /* Don't require GMP's longlong.h mdep files */ > #define ASSERT(x) /* FIXME make longlong.h really standalone */ > + #define __GMP_DECLSPEC /* FIXME make longlong.h really standalone */ Oh, that must be used in an #else branch that I'm not exercising. It triggers a "symbol defined but never used" warning. Thanks. > #define __clz_tab factor_clz_tab /* Rename to avoid glibc collision */ BTW, why does __clz_tab use the "__" prefix in the first place? > #ifndef __GMP_GNUC_PREREQ > #define __GMP_GNUC_PREREQ(a,b) 1 > *************** > *** 143,149 **** > # endif > # include "longlong.h" > # ifdef COUNT_LEADING_ZEROS_NEED_CLZ_TAB > ! const unsigned char factor_clz_tab[129] = > { > 1,2,3,3,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, > 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, > --- 144,150 ---- > #endif > #include "longlong.h" > #ifdef COUNT_LEADING_ZEROS_NEED_CLZ_TAB > ! static const unsigned char factor_clz_tab[129] = Thanks. Done. > { > 1,2,3,3,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, > 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, > *************** > *** 1555,1561 **** > { > mpz_t x, z, y, P; > mpz_t t, t2; > - unsigned long long int k, l; > > if (flag_verbose > 0) > { > --- 1556,1561 ---- > *************** > *** 1567,1574 **** > mpz_init_set_si (x, 2); > mpz_init_set_si (z, 2); > mpz_init_set_ui (P, 1); > ! k = 1; > ! l = 1; > > while (mpz_cmp_ui (n, 1) != 0) > { > --- 1567,1575 ---- > mpz_init_set_si (x, 2); > mpz_init_set_si (z, 2); > mpz_init_set_ui (P, 1); > ! > ! unsigned long long int k = 1; > ! unsigned long long int l = 1; Likewise. > while (mpz_cmp_ui (n, 1) != 0) > { > *************** > *** 2287,2293 **** > > /* Read white-space delimited items. Return 1 on success, 0 on EOF. > Exit on I/O errors. */ > ! int > read_item (struct inbuf *bufstruct) > { > int c; > --- 2288,2294 ---- > > /* Read white-space delimited items. Return 1 on success, 0 on EOF. > Exit on I/O errors. */ > ! static int I didn't bother with this one, because in coreutils I've just switched back to using readtokens to read input. From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 17 16:27:49 2012 Received: (at 12350) by debbugs.gnu.org; 17 Sep 2012 20:27:49 +0000 Received: from localhost ([127.0.0.1]:40359 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDhv2-0007X6-FX for submit@debbugs.gnu.org; Mon, 17 Sep 2012 16:27:49 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:15971 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDhuy-0007Ww-U1 for 12350@debbugs.gnu.org; Mon, 17 Sep 2012 16:27:46 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 746E146A33; Mon, 17 Sep 2012 22:26:27 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> <87ehm0o1y2.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Mon, 17 Sep 2012 22:26:27 +0200 In-Reply-To: <87ehm0o1y2.fsf@rho.meyering.net> (Jim Meyering's message of "Mon\, 17 Sep 2012 21\:59\:33 +0200") Message-ID: <86txuw9z0s.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) > #endif > #define LONGLONG_STANDALONE /* Don't require GMP's longlong.h mde= p files */ > #define ASSERT(x) /* FIXME make longlong.h really stand= alone */ > + #define __GMP_DECLSPEC /* FIXME make longlong.h really stand= alone */ =20=20 Oh, that must be used in an #else branch that I'm not exercising. It triggers a "symbol defined but never used" warning. Thanks. =20=20 __GMP_DECLSPEC is used from longlong.h when count_leading_zeros ask for __clz_tab. > #define __clz_tab factor_clz_tab /* Rename to avoid glibc collision */ =20=20 BTW, why does __clz_tab use the "__" prefix in the first place? =20=20 It makes sense in glibc. In GMP we prepend something like __gmp_. Here in a non-library we prepend factor_. I'd like to keep the __ for src compatibility. > # endif > # include "longlong.h" > # ifdef COUNT_LEADING_ZEROS_NEED_CLZ_TAB > ! const unsigned char factor_clz_tab[129] =3D > { > 1,2,3,3,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, > 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, > --- 144,150 ---- > #endif > #include "longlong.h" > #ifdef COUNT_LEADING_ZEROS_NEED_CLZ_TAB > ! static const unsigned char factor_clz_tab[129] =3D =20=20 Thanks. Done. =20=20 Actually, that patch is wrong. :-( In longlong.h, we declare it without static. This causes a type clash. I suggest that we kep clz_tab non-static. Do you have any other suggestions? > while (mpz_cmp_ui (n, 1) !=3D 0) > { > *************** > *** 2287,2293 **** > > /* Read white-space delimited items. Return 1 on success, 0 on EOF. > Exit on I/O errors. */ > ! int > read_item (struct inbuf *bufstruct) > { > int c; > --- 2288,2294 ---- > > /* Read white-space delimited items. Return 1 on success, 0 on EOF. > Exit on I/O errors. */ > ! static int =20=20 I didn't bother with this one, because in coreutils I've just switched back to using readtokens to read input. =20=20 Ok. Hopefully, that does not cause too much slowdown for large ranges. With this fast factoring code, input is a significant part of the time! I have a variant of input the code, which replaces all the input code with a single function which freads 4 KiB blocks and plays with sentinels. Here is its non-GMP part. I left this code out for a 20% performance penalty. void read_stdin_and_factor () { uintmax_t n1, n0; unsigned int carry; unsigned int c, tc; char *bp, *be; int valid_char_seen; size_t nread; enum { BUFSIZE =3D 4096 }; char buf[BUFSIZE + 1]; buf[0] =3D '\377'; /* sentinel */ bp =3D buf; be =3D buf; restart: n0 =3D 0; valid_char_seen =3D 0; #ifndef OPTIMISE_SINGLE_WORD #define OPTIMISE_SINGLE_WORD #endif #if OPTIMISE_SINGLE_WORD /* Loop while we have one word */ while (LIKELY (n0 < (~(uintmax_t) 0 - 9) / 10)) { c =3D (unsigned char) *bp++; tc =3D c - '0'; if (UNLIKELY (tc >=3D 10)) { if (bp > be) /* did we hit the sentinel? */ { nread =3D fread (buf, 1, BUFSIZE, stdin); if (nread =3D=3D 0) { if (valid_char_seen) { factor_and_report (0, n0); } return; } buf[nread] =3D '\377'; /* sentinel */ bp =3D buf; be =3D buf + nread; continue; } else { if (valid_char_seen) { factor_and_report (0, n0); valid_char_seen =3D 0; } if (! isspace (c)) { fprintf (stderr, "`%c' is not a valid positive integer\n", c); } } goto restart; } /* got valid digit */ n0 =3D 10 * n0 + tc; valid_char_seen =3D 1; } #endif n1 =3D 0; /* Loop while we have two words */ for (;;) { c =3D (unsigned char) *bp++; tc =3D c - '0'; if (UNLIKELY (tc >=3D 10)) { if (bp > be) /* did we hit the sentinel? */ { nread =3D fread (buf, 1, BUFSIZE, stdin); if (nread =3D=3D 0) { if (valid_char_seen) { factor_and_report (n1, n0); } return; } buf[nread] =3D '\377'; /* sentinel */ bp =3D buf; be =3D buf + nread; continue; } else { if (valid_char_seen) { factor_and_report (n1, n0); valid_char_seen =3D 0; } if (! isspace (c)) { fprintf (stderr, "`%c' is not a valid positive integer\n", c); } } goto restart; } /* got valid digit */ carry =3D (n0 >> (W_TYPE_SIZE - 3)) + (n0 >> (W_TYPE_SIZE - 1)); carry +=3D 10 * n0 < 2 * n0; if (UNLIKELY (n1 > ~(uintmax_t)0 / 2 / 10)) break; /* overflow, error unless we have GMP */ n1 =3D 10 * n1; n0 =3D 10 * n0 + tc; carry +=3D n0 < tc; n1 +=3D carry; if (UNLIKELY (((n1 << 1) >> 1) !=3D n1)) break; /* overflow, error unless we have GMP */ valid_char_seen =3D 1; } #if HAVE_GMP // FIXME: keep going, non-trivial, since any buffer might be insufficient // * Could balk and do O(n^2) algo instead of calling GMP's inp function // * Or we could let the buffer size determine, grab chunks from it, feed // such chunks to GMP functions, multiply by suitable powers. Good, tr= icky. // * Or skip this nifty function altogether when HAVE_GMP? Bad! abort (); #else fprintf (stderr, "number is too large\n"); // FIXME: perhaps skip over rest of number #endif } --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 18 10:35:19 2012 Received: (at 12350) by debbugs.gnu.org; 18 Sep 2012 14:35:19 +0000 Received: from localhost ([127.0.0.1]:41932 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDytT-0008WC-1b for submit@debbugs.gnu.org; Tue, 18 Sep 2012 10:35:19 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:15321 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TDytP-0008Vt-MK for 12350@debbugs.gnu.org; Tue, 18 Sep 2012 10:35:17 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id EA49D48619; Tue, 18 Sep 2012 16:33:53 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> <87ehm0o1y2.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Tue, 18 Sep 2012 16:33:53 +0200 In-Reply-To: <87ehm0o1y2.fsf@rho.meyering.net> (Jim Meyering's message of "Mon\, 17 Sep 2012 21\:59\:33 +0200") Message-ID: <86zk4nieni.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Niels and I made more changes, including some needed to silence -Wshadow. We also re-enabled the div_smallq code after a bug fix, allowed squfof to fail with recovery, and simplified the function factor. I suppose you'll need to apply these manually, because of the TAB/SPC problem. I don't think we anticipate more changes to this code anytime soon. diff -r 3024e91e4b82 factor.c --- a/factor.c Mon Sep 17 19:43:40 2012 +0200 +++ b/factor.c Tue Sep 18 16:28:09 2012 +0200 @@ -140,7 +140,7 @@ #endif #include "longlong.h" #ifdef COUNT_LEADING_ZEROS_NEED_CLZ_TAB -static const unsigned char factor_clz_tab[129] =3D +const unsigned char factor_clz_tab[129] =3D { 1,2,3,3,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, @@ -479,8 +479,7 @@ #define factor_insert(f, p) factor_insert_multiplicity(f, p, 1) =20 static void -factor_insert_large (struct factors *factors, - uintmax_t p1, uintmax_t p0) +factor_insert_large (struct factors *factors, uintmax_t p1, uintmax_t p0) { if (p1 > 0) { @@ -1739,8 +1738,10 @@ return 0; } =20 -static const unsigned short invtab[] =3D +/* invtab[i] =3D floor(0x10000 / (0x100 + i) */ +static const unsigned short invtab[0x81] =3D { + 0x200, 0x1fc, 0x1f8, 0x1f4, 0x1f0, 0x1ec, 0x1e9, 0x1e5, 0x1e1, 0x1de, 0x1da, 0x1d7, 0x1d4, 0x1d0, 0x1cd, 0x1ca, 0x1c7, 0x1c3, 0x1c0, 0x1bd, 0x1ba, 0x1b7, 0x1b4, 0x1b2, 0x1af, @@ -1763,17 +1764,22 @@ that q < 0x40; here it instead uses a table of (Euclidian) inverses. */ #define div_smallq(q, r, u, d) \ do { \ - if (0 && (u) / 0x40 < (d)) \ + if ((u) / 0x40 < (d)) \ { \ int _cnt; \ uintmax_t _dinv, _mask, _q, _r; \ count_leading_zeros (_cnt, (d)); \ - \ - _dinv =3D invtab[((d) >> (W_TYPE_SIZE - 8 - _cnt)) \ - - (1 << (8 - 1))]; \ - \ _r =3D (u); \ - _q =3D _r * _dinv >> (W_TYPE_SIZE + 8 - _cnt); \ + if (UNLIKELY (_cnt > (W_TYPE_SIZE - 8))) \ + { \ + _dinv =3D invtab[((d) << (_cnt + 8 - W_TYPE_SIZE)) - 0x80]; \ + _q =3D _dinv * _r >> (8 + W_TYPE_SIZE - _cnt); \ + } \ + else \ + { \ + _dinv =3D invtab[((d) >> (W_TYPE_SIZE - 8 - _cnt)) - 0x7f]; \ + _q =3D _dinv * (_r >> (W_TYPE_SIZE - 3 - _cnt)) >> 11; \ + } \ _r -=3D _q*(d); \ \ _mask =3D -(uintmax_t) (_r >=3D (d)); \ @@ -1833,8 +1839,9 @@ #define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif =20 - -static void +/* Return true on success. Expected to fail only for numbers >=3D + 2^{2*W_TYPE_SIZE - 2}, or close to that limit. */ +static bool factor_using_squfof (uintmax_t n1, uintmax_t n0, struct factors *factors) { /* Uses algorithm and notation from @@ -1854,35 +1861,41 @@ 1155, 15, 231, 35, 3, 55, 7, 11, 0 }; =20 - uintmax_t S; const unsigned int *m; =20 struct { uintmax_t Q; uintmax_t P; } queue[QUEUE_SIZE]; =20 - S =3D isqrt2 (n1, n0); + if (n1 >=3D ((uintmax_t) 1 << (W_TYPE_SIZE - 2))) + return false; =20 - if (n0 =3D=3D S * S) + uintmax_t sqrt_n =3D isqrt2 (n1, n0); + + if (n0 =3D=3D sqrt_n * sqrt_n) { uintmax_t p1, p0; =20 - umul_ppmm (p1, p0, S, S); + umul_ppmm (p1, p0, sqrt_n, sqrt_n); assert (p0 =3D=3D n0); =20 if (n1 =3D=3D p1) { - if (prime_p (S)) - factor_insert_multiplicity (factors, S, 2); + if (prime_p (sqrt_n)) + factor_insert_multiplicity (factors, sqrt_n, 2); else { struct factors f; =20 f.nfactors =3D 0; - factor_using_squfof (0, S, &f); + if (!factor_using_squfof (0, sqrt_n, &f)) + { + /* Try pollard rho instead */ + factor_using_pollard_rho (sqrt_n, 1, &f); + } /* Duplicate the new factors */ for (unsigned int i =3D 0; i < f.nfactors; i++) factor_insert_multiplicity (factors, f.p[i], 2*f.e[i]); } - return; + return true; } } =20 @@ -1921,6 +1934,7 @@ Dh +=3D n1 * mu; =20 assert (Dl % 4 !=3D 1); + assert (Dh < (uintmax_t) 1 << (W_TYPE_SIZE - 2)); =20 S =3D isqrt2 (Dh, Dl); =20 @@ -1939,10 +1953,10 @@ =20 for (i =3D 0; i <=3D B; i++) { - uintmax_t q, P1, t, r; + uintmax_t q, P1, t, rem; =20 - div_smallq (q, r, S+P, Q); - P1 =3D S - r; /* P1 =3D q*Q - P */ + div_smallq (q, rem, S+P, Q); + P1 =3D S - rem; /* P1 =3D q*Q - P */ =20 #if STAT_SQUFOF assert (q > 0); @@ -2021,25 +2035,21 @@ for the case D =3D 2N. */ /* Compute Q =3D (D - P*P) / Q1, but we need double precision. */ - { - uintmax_t hi, lo, rem; + uintmax_t hi, lo; umul_ppmm (hi, lo, P, P); sub_ddmmss (hi, lo, Dh, Dl, hi, lo); udiv_qrnnd (Q, rem, hi, lo, Q1); assert (rem =3D=3D 0); - } =20 for (;;) { - uintmax_t r; - /* Note: There appears to by a typo in the paper, Step 4a in the algorithm description says q <-- floor([S+P]/\hat Q), but looking at the equations in Sec. 3.1, it should be q <-- floor([S+P] / Q). (In this code, \hat Q is Q1). */ - div_smallq (q, r, S+P, Q); - P1 =3D S - r; /* P1 =3D q*Q - P */ + div_smallq (q, rem, S+P, Q); + P1 =3D S - rem; /* P1 =3D q*Q - P */ =20 #if STAT_SQUFOF q_freq[0]++; @@ -2061,8 +2071,8 @@ =20 if (prime_p (Q)) factor_insert (factors, Q); - else - factor_using_squfof (0, Q, factors); + else if (!factor_using_squfof (0, Q, factors)) + factor_using_pollard_rho (Q, 2, factors); =20 divexact_21 (n1, n0, n1, n0, Q); =20 @@ -2070,13 +2080,16 @@ factor_insert_large (factors, n1, n0); else { + if (!factor_using_squfof (n1, n0, factors)) + { if (n1 =3D=3D 0) factor_using_pollard_rho (n0, 1, factors); else - factor_using_squfof (n1, n0, factors); + factor_using_pollard_rho2 (n1, n0, 1, factors); + } } =20 - return; + return true; } } next_i: @@ -2085,8 +2098,7 @@ next_multiplier: ; } - fprintf (stderr, "squfof failed.\n"); - exit (EXIT_FAILURE); + return false; } =20 static void @@ -2100,26 +2112,21 @@ =20 t0 =3D factor_using_division (&t1, t1, t0, factors); =20 + if (t1 =3D=3D 0 && t0 < 2) + return; + + if (prime2_p (t1, t0)) + factor_insert_large (factors, t1, t0); + else + { + if (alg =3D=3D ALG_SQUFOF) + if (factor_using_squfof (t1, t0, factors)) + return; + if (t1 =3D=3D 0) - { - if (t0 !=3D 1) - { - if (prime_p (t0)) - factor_insert (factors, t0); - else if (alg =3D=3D ALG_POLLARD_RHO) factor_using_pollard_rho (t0, 1, factors); else - factor_using_squfof (0, t0, factors); - } - } - else - { - if (prime2_p (t1, t0)) - factor_insert_large (factors, t1, t0); - else if (alg =3D=3D ALG_POLLARD_RHO) factor_using_pollard_rho2 (t1, t0, 1, factors); - else - factor_using_squfof (t1, t0, factors); } } =20 --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 18 13:02:34 2012 Received: (at 12350) by debbugs.gnu.org; 18 Sep 2012 17:02:34 +0000 Received: from localhost ([127.0.0.1]:42067 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TE1Bx-0007kv-Nz for submit@debbugs.gnu.org; Tue, 18 Sep 2012 13:02:34 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:10206 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TE1Bv-0007ki-Ve for 12350@debbugs.gnu.org; Tue, 18 Sep 2012 13:02:33 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id E129B4862A; Tue, 18 Sep 2012 19:01:09 +0200 (CEST) To: Jim Meyering , 12350@debbugs.gnu.org, nisse@lysator.liu.se Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> <87ehm0o1y2.fsf@rho.meyering.net> <86zk4nieni.fsf@shell.gmplib.org> From: Torbjorn Granlund Date: Tue, 18 Sep 2012 19:01:09 +0200 In-Reply-To: <86zk4nieni.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Tue\, 18 Sep 2012 16\:33\:53 +0200") Message-ID: <86627b1d0q.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Torbjorn Granlund writes: Niels and I made more changes, including some needed to silence -Wshadow. Change log entries can be fund in: http://gmplib.org:8000/factoring/file/61b4eac24ea4/ChangeLog --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 18 14:22:32 2012 Received: (at 12350) by debbugs.gnu.org; 18 Sep 2012 18:22:32 +0000 Received: from localhost ([127.0.0.1]:42165 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TE2RM-0003b9-Hh for submit@debbugs.gnu.org; Tue, 18 Sep 2012 14:22:32 -0400 Received: from mx.meyering.net ([88.168.87.75]:60363) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TE2RJ-0003au-PJ for 12350@debbugs.gnu.org; Tue, 18 Sep 2012 14:22:30 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id B797460198; Tue, 18 Sep 2012 20:21:07 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <86627b1d0q.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Tue, 18 Sep 2012 19:01:09 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> <87ehm0o1y2.fsf@rho.meyering.net> <86zk4nieni.fsf@shell.gmplib.org> <86627b1d0q.fsf@shell.gmplib.org> Date: Tue, 18 Sep 2012 20:21:07 +0200 Message-ID: <87zk4njip8.fsf@rho.meyering.net> Lines: 15 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -2.4 (--) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -2.4 (--) Torbjorn Granlund wrote: > Torbjorn Granlund writes: > > Niels and I made more changes, including some needed to silence > -Wshadow. > > Change log entries can be fund in: > > http://gmplib.org:8000/factoring/file/61b4eac24ea4/ChangeLog Thanks. I've nearly finished integrating it, but have not yet added the options that enable new functionality. I will post soon. From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 23 16:58:32 2012 Received: (at 12350) by debbugs.gnu.org; 23 Sep 2012 20:58:32 +0000 Received: from localhost ([127.0.0.1]:51559 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TFtG3-0007Ea-Io for submit@debbugs.gnu.org; Sun, 23 Sep 2012 16:58:32 -0400 Received: from mx.meyering.net ([88.168.87.75]:49394) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TFtFt-0007EF-Nf for 12350@debbugs.gnu.org; Sun, 23 Sep 2012 16:58:29 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 15CA2600A5; Sun, 23 Sep 2012 22:56:26 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <86627b1d0q.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Tue, 18 Sep 2012 19:01:09 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> <87ehm0o1y2.fsf@rho.meyering.net> <86zk4nieni.fsf@shell.gmplib.org> <86627b1d0q.fsf@shell.gmplib.org> Date: Sun, 23 Sep 2012 22:56:26 +0200 Message-ID: <87r4psxxtx.fsf@rho.meyering.net> Lines: 17 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org --=-=-= Content-Type: text/plain Torbjorn Granlund wrote: > Torbjorn Granlund writes: > > Niels and I made more changes, including some needed to silence > -Wshadow. > > Change log entries can be fund in: > > http://gmplib.org:8000/factoring/file/61b4eac24ea4/ChangeLog Thanks. Here's how I've integrated it so far. This is not ready to push, but rather just to give you an idea of what's coming. I'm sure I'll have to adjust things before pushing. --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=k Content-Transfer-Encoding: base64 RnJvbSA2Y2YwOWU4YTJmNjIzN2U5NTgwYjc3YTBiMjgyMzc3MTJhZmE1YmM4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKaW0gTWV5ZXJpbmcgPG1leWVyaW5nQHJlZGhhdC5jb20+CkRh dGU6IFR1ZSwgMTggU2VwIDIwMTIgMjE6NTc6MzggKzAyMDAKU3ViamVjdDogW1BBVENIIDAxLzEz XSBidWlsZDogcmVtb3ZlIHJlZHVuZGFudCBkZXBlbmRlbmN5OiAkKFBST0dSQU1TKToKIGxpYi9s aWJjb3JldXRpbHMuYQoKKiBzcmMvbG9jYWwubWs6IFJlbW92ZSB0aGUgYWJvdmUgZGVwZW5kZW5j eS4KVGhlIG5ldyBwcm9ncmFtLCBtYWtlLXByaW1lLWxpc3QsIG11c3Qgbm90IGRlcGVuZCBvbiB0 aGF0LgpEZXBlbmRlbmNpZXMgYXJlIGFscmVhZHkgaGFuZGxlZCB2aWEgdGhlIC4uLl9MRF9BREQg dmFyaWFibGVzLAphbmQgc28gKGJlZm9yZSBub3cpLCB0aGF0IHJlZHVuZGFudCBkZXBlbmRlbmN5 IGRpZCBub3QgaHVydC4KLS0tCiBzcmMvbG9jYWwubWsgfCAyIC0tCiAxIGZpbGUgY2hhbmdlZCwg MiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvbG9jYWwubWsgYi9zcmMvbG9jYWwubWsK aW5kZXggMGY5ZTAwMC4uOTgyNTlmYSAxMDA2NDQKLS0tIGEvc3JjL2xvY2FsLm1rCisrKyBiL3Ny Yy9sb2NhbC5tawpAQCAtMjkzLDggKzI5Myw2IEBAIHNyY19raWxsX0xEQUREICs9ICQoTElCVEhS RUFEKQogIyBmb3IgcHRocmVhZAogc3JjX3NvcnRfTERBREQgKz0gJChMSUJfUFRIUkVBRCkKCi0k KFBST0dSQU1TKTogbGliL2xpYmNvcmV1dGlscy5hCi0KICMgR2V0IHRoZSByZWxlYXNlIHllYXIg ZnJvbSBsaWIvdmVyc2lvbi1ldGMuYy4KIFJFTEVBU0VfWUVBUiA9IFwKICAgYHNlZCAtbiAnLy4q Q09QWVJJR0hUX1lFQVIgPSBcKFswLTldWzAtOV1bMC05XVswLTldXCkgfTsvcy8vXDEvcCcgXAot LSAKMS43LjEyLjEuMzgyLmdiMDU3NmE2CgoKRnJvbSA3Y2MzZjg0YmYyODQxNjIwMmY3ZjRlZDA0 MDYzYzAzMjkwMDQ2MmMwIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/ VG9yYmo9QzM9QjZybj0yMEdyYW5sdW5kPz0gPHRnQGdtcGxpYi5vcmc+CkRhdGU6IFN1biwgMTYg U2VwIDIwMTIgMjE6NTk6NDAgKzAyMDAKU3ViamVjdDogW1BBVENIIDAyLzEzXSBmYWN0b3I6IHBy ZXBhcmUgZm9yIHRoZSBuZXcgZmFjdG9yIHByb2dyYW0KCiogc3JjL21ha2UtcHJpbWUtbGlzdC5j OiBOZXcgZmlsZSwgZnJvbSBudC1mYWN0b3IuCi0tLQogc3JjL21ha2UtcHJpbWUtbGlzdC5jIHwg MTY4ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAx IGZpbGUgY2hhbmdlZCwgMTY4IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMv bWFrZS1wcmltZS1saXN0LmMKCmRpZmYgLS1naXQgYS9zcmMvbWFrZS1wcmltZS1saXN0LmMgYi9z cmMvbWFrZS1wcmltZS1saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u MWY1YjNjZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWtlLXByaW1lLWxpc3QuYwpAQCAtMCww ICsxLDE2OCBAQAorLyogRmFjdG9yaW5nIG9mIHVpbnRtYXhfdCBudW1iZXJzLiBHZW5lcmF0aW9u IG9mIG5lZWRlZCB0YWJsZXMuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBi eSBUb3JiasO2cm4gR3Jhbmx1bmQgYW5kIE5pZWxzIE3DtmxsZXIKKyAgIENvbnRhaW5zIGNvZGUg ZnJvbSBHTlUgTVAuCisKK0NvcHlyaWdodCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg SW5jLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1 dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5k YXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv bikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4g dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5U WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgK K3RoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8u ICAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRl IDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RydWN0IHByaW1lCit7CisgIHVu c2lnbmVkIHA7CisgIHVpbnRtYXhfdCBwaW52OyAvKiBJbnZlcnNlIG1vZCBiID0gMl57Yml0c2l6 ZSBvZiB1aW50bWF4X3R9ICovCisgIHVpbnRtYXhfdCBsaW07IC8qIGZsb29yKFVJTlRNQVhfTUFY IC8gcCkgKi8KK307CisKK3N0YXRpYyB1aW50bWF4X3QKK2JpbnZlcnQgKHVpbnRtYXhfdCBhKQor eworICB1aW50bWF4X3QgeCA9IDB4ZjUzOTdkYjEgPj4gKDQqKChhLzIpICYgMHg3KSk7CisgIGZv ciAoOzspCisgICAgeworICAgICAgdWludG1heF90IHkgPSAyKnggLSB4KngqYTsKKyAgICAgIGlm ICh5ID09IHgpCisgICAgICAgIHJldHVybiB4OworICAgICAgeCA9IHk7CisgICAgfQorfQorCitz dGF0aWMgdm9pZAorcHJvY2Vzc19wcmltZSAoc3RydWN0IHByaW1lICppbmZvLCB1bnNpZ25lZCBw KQoreworICBpbmZvLT5wID0gcDsKKyAgaW5mby0+cGludiA9IGJpbnZlcnQgKHApOworICBpbmZv LT5saW0gPSBVSU5UTUFYX01BWCAvICh1aW50bWF4X3QpIHA7Cit9CisKK3N0YXRpYyB2b2lkCitv dXRwdXRfcHJpbWVzIChjb25zdCBzdHJ1Y3QgcHJpbWUgKnByaW1lcywgdW5zaWduZWQgbnByaW1l cykKK3sKKyAgdW5zaWduZWQgaTsKKyAgdW5zaWduZWQgcDsKKyAgaW50IGlzX3ByaW1lOworICBj b25zdCBjaGFyICpzdWZmaXg7CisKKyAgcHV0cyAoIi8qIEdlbmVyYXRlZCBmaWxlIC0tIERPIE5P VCBFRElUICovXG4iKTsKKworICBpZiAoc2l6ZW9mKHVpbnRtYXhfdCkgPD0gc2l6ZW9mKHVuc2ln bmVkIGxvbmcpKQorICAgIHN1ZmZpeCA9ICJVTCI7CisgIGVsc2UgaWYgKHNpemVvZih1aW50bWF4 X3QpIDw9IHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpKQorICAgIHN1ZmZpeCA9ICJVTEwiOwor ICBlbHNlCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRG9uJ3Qga25vdyBob3cgdG8g d3JpdGUgdWludG1heF90IGNvbnN0YW50cy5cbiIpOworICAgICAgZXhpdCAoRVhJVF9GQUlMVVJF KTsKKyAgICB9CisKKyNkZWZpbmUgU1ogKGludCkoMipzaXplb2YodWludG1heF90KSkKKworICBm b3IgKGkgPSAwLCBwID0gMjsgaSA8IG5wcmltZXM7IGkrKykKKyAgICB7CisgICAgICBwcmludGYg KCJQKCUydSwgJTN1LCAweCUwKmp4JXMsIDB4JTAqanglcykgLyogJWQgKi9cbiIsCisgICAgICAg ICAgICAgIHByaW1lc1tpXS5wIC0gcCwKKyAgICAgICAgICAgICAgKGkgKyA4IDwgbnByaW1lcykg PyBwcmltZXNbaSArIDhdLnAgLSBwcmltZXNbaV0ucCA6IDB4ZmYsCisgICAgICAgICAgICAgIFNa LCBwcmltZXNbaV0ucGludiwgc3VmZml4LAorICAgICAgICAgICAgICBTWiwgcHJpbWVzW2ldLmxp bSwgc3VmZml4LCBwcmltZXNbaV0ucCk7CisgICAgICBwID0gcHJpbWVzW2ldLnA7CisgICAgfQor CisgIHByaW50ZiAoIlxuI3VuZGVmIEZJUlNUX09NSVRURURfUFJJTUVcbiIpOworCisgIC8qIEZp bmQgbmV4dCBwcmltZSAqLworICBkbworICAgIHsKKyAgICAgIHAgKz0gMjsKKyAgICAgIGZvciAo aSA9IDAsIGlzX3ByaW1lID0gMTsgaXNfcHJpbWU7IGkrKykKKyAgICAgICAgeworICAgICAgICAg IGlmIChwcmltZXNbaV0ucCAqIHByaW1lc1tpXS5wID4gcCkKKyAgICAgICAgICAgIGJyZWFrOwor ICAgICAgICAgIGlmICggKHVpbnRtYXhfdCkgcCAqIHByaW1lc1tpXS5waW52IDw9IHByaW1lc1tp XS5saW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlzX3ByaW1lID0gMDsKKyAgICAg ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIHdoaWxl ICghaXNfcHJpbWUpOworCisgIHByaW50ZiAoIiNkZWZpbmUgRklSU1RfT01JVFRFRF9QUklNRSAl ZFxuIiwgcCk7Cit9CisKK3N0YXRpYyB2b2lkICoKK3hhbGxvYyAoc2l6ZV90IHMpCit7CisgIHZv aWQgKnAgPSBtYWxsb2Mocyk7CisgIGlmIChwKQorICAgIHJldHVybiBwOworCisgIGZwcmludGYg KHN0ZGVyciwgIlZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZC5cbiIpOworICBleGl0IChFWElUX0ZB SUxVUkUpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50 IGxpbWl0OworCisgIGNoYXIgKnNpZXZlOworICBzaXplX3Qgc2l6ZSwgaTsKKworICBzdHJ1Y3Qg cHJpbWUgKnByaW1lX2xpc3Q7CisgIHVuc2lnbmVkIG5wcmltZXM7CisKKyAgaWYgKGFyZ2MgIT0g MikKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogJXMgTElNSVRcbiIKKyAg ICAgICAgICAgICAgICJQcm9kdWNlcyBhIGxpc3Qgb2Ygb2RkIHByaW1lcyA8PSBMSU1JVFxuIiwg YXJndlswXSk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgbGltaXQgPSBh dG9pKGFyZ3ZbMV0pOworICBpZiAobGltaXQgPCAzKQorICAgIGV4aXQgKEVYSVRfU1VDQ0VTUyk7 CisKKyAgLyogTWFrZSBsaW1pdCBvZGQgKi8KKyAgaWYgKCAhKGxpbWl0ICYgMSkpCisgICAgbGlt aXQtLTsKKworICBzaXplID0gKGxpbWl0LTEpLzI7CisgIC8qIHNpZXZlW2ldIHJlcHJlc2VudHMg MysyKmkgKi8KKyAgc2lldmUgPSB4YWxsb2MgKHNpemUpOworICBtZW1zZXQgKHNpZXZlLCAxLCBz aXplKTsKKworICBwcmltZV9saXN0ID0geGFsbG9jIChzaXplICogc2l6ZW9mICgqcHJpbWVfbGlz dCkpOworICBucHJpbWVzID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTspCisgICAgewor ICAgICAgdW5zaWduZWQgcCA9IDMrMippOworICAgICAgdW5zaWduZWQgajsKKworICAgICAgcHJv Y2Vzc19wcmltZSAoJnByaW1lX2xpc3RbbnByaW1lcysrXSwgcCk7CisKKyAgICAgIGZvciAoaiA9 IChwKnAgLSAzKS8yOyBqIDwgc2l6ZTsgais9IHApCisgICAgICAgIHNpZXZlW2pdID0gMDsKKwor ICAgICAgd2hpbGUgKGkgPCBzaXplICYmIHNpZXZlWysraV0gPT0gMCkKKyAgICAgICAgOworICAg IH0KKworICBvdXRwdXRfcHJpbWVzIChwcmltZV9saXN0LCBucHJpbWVzKTsKKworICByZXR1cm4g RVhJVF9TVUNDRVNTOworfQotLSAKMS43LjEyLjEuMzgyLmdiMDU3NmE2CgoKRnJvbSAwMjEzZDAx M2MzM2ZiMDYzMzgxOTFhZjBkN2MyY2JjYzI1YjJhZWY4IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAw MQpGcm9tOiA9P1VURi04P3E/VG9yYmo9QzM9QjZybj0yMEdyYW5sdW5kPz0gPHRnQGdtcGxpYi5v cmc+CkRhdGU6IFN1biwgMTYgU2VwIDIwMTIgMjI6Mjc6MjAgKzAyMDAKU3ViamVjdDogW1BBVENI IDAzLzEzXSBmYWN0b3I6IG5ldyBpbXBsZW1lbnRhdGlvbjsgbm90IHlldCBpbnRlZ3JhdGVkCgoq IHNyYy9mYWN0b3IuYzogTmV3IGZpbGUsIGZyb20gbnQtZmFjdG9yLgoqIHNyYy9sb25nbG9uZy5o OiBOZXcgZmlsZS4KLS0tCiBzcmMvZmFjdG9yLmMgICB8IDI2MzQgKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0KIHNyYy9sb25nbG9uZy5oIHwg MjE1NiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAyIGZp bGVzIGNoYW5nZWQsIDQzNzcgaW5zZXJ0aW9ucygrKSwgNDEzIGRlbGV0aW9ucygtKQogY3JlYXRl IG1vZGUgMTAwNjQ0IHNyYy9sb25nbG9uZy5oCgpkaWZmIC0tZ2l0IGEvc3JjL2ZhY3Rvci5jIGIv c3JjL2ZhY3Rvci5jCmluZGV4IGU2M2UwZTAuLjc3NmFhYTYgMTAwNjQ0Ci0tLSBhL3NyYy9mYWN0 b3IuYworKysgYi9zcmMvZmFjdG9yLmMKQEAgLTEsNTgwICsxLDIzODggQEAKLS8qIGZhY3RvciAt LSBwcmludCBwcmltZSBmYWN0b3JzIG9mIG4uCi0gICBDb3B5cmlnaHQgKEMpIDE5ODYtMjAxMiBG cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUg c29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAz IG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv bi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg d2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk IGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGgg dGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+ LiAgKi8KLQotLyogV3JpdHRlbiBieSBQYXVsIFJ1YmluIDxwaHJAb2NmLmJlcmtlbGV5LmVkdT4u Ci0gICBBZGFwdGVkIGZvciBHTlUsIGZpeGVkIHRvIGZhY3RvciBVSU5UX01BWCBieSBKaW0gTWV5 ZXJpbmcuCi0gICBBcmJpdHJhcnktcHJlY2lzaW9uIGNvZGUgYWRhcHRlZCBieSBKYW1lcyBZb3Vu Z21hbiBmcm9tIFRvcmJqw7ZybgotICAgR3Jhbmx1bmQncyBmYWN0b3JpemUuYywgZnJvbSBHTlUg TVAgdmVyc2lvbiA0LjIuMi4KKy8qIEZhY3RvcmluZyBvZiB1aW50bWF4X3QgbnVtYmVycy4KKwor ICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZCBh bmQgTmllbHMgTcO2bGxlcgorICAgQ29udGFpbnMgY29kZSBmcm9tIEdOVSBNUC4KKworQ29weXJp Z2h0IDE5OTUsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUs IDIwMDksIDIwMTIKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIHByb2dy YW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlm eSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJz aW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJz aW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3 aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo ZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQ QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv ciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbS4gIElm IG5vdCwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisvKiBFZmZpY2ll bnRseSBmYWN0b3IgbnVtYmVycyB0aGF0IGZpdCBpbiBvbmUgb3IgdHdvIHdvcmRzICh3b3JkID0g dWludG1heF90KSwKKyAgIG9yLCB3aXRoIEdNUCwgbnVtYmVycyBvZiBhbnkgc2l6ZS4KKworICBD b2RlIG9yZ2FuaXNhdGlvbjoKKworICAgIFRoZXJlIGFyZSBzZXZlcmFsIHZhcmlhbnRzIG9mIG1h bnkgZnVuY3Rpb25zLCBmb3IgaGFuZGxpbmcgb25lIHdvcmQsIHR3bworICAgIHdvcmRzLCBhbmQg R01QJ3MgbXB6X3QgdHlwZS4gIElmIHRoZSBvbmUtd29yZCB2YXJpYW50IGlzIGNhbGxlZCBmb28s IHRoZQorICAgIHR3by13b3JkIHZhcmlhbnQgd2lsbCBiZSBmb28yLCBhbmQgdGhlIG9uZSBmb3Ig bXB6X3Qgd2lsbCBiZSBtcF9mb28uICBJbgorICAgIHNvbWUgY2FzZXMsIHRoZSBwbGFpbiBmdW5j dGlvbiB2YXJpYW50cyB3aWxsIGhhbmRsZSBib3RoIG9uZS13b3JkIGFuZAorICAgIHR3by13b3Jk IG51bWJlcnMsIGV2aWRlbmNlZCBieSBmdW5jdGlvbiBhcmd1bWVudHMuCisKKyAgICBUaGUgZmFj dG9yaW5nIGNvZGUgZm9yIHR3byB3b3JkcyB3aWxsIGZhbGwgaW50byB0aGUgY29kZSBmb3Igb25l IHdvcmQgd2hlbgorICAgIHByb2dyZXNzIGFsbG93cyB0aGF0LgorCisgICAgVXNpbmcgR01QIGlz IG9wdGlvbmFsLiAgRGVmaW5lIEhBVkVfR01QIHRvIG1ha2UgdGhpcyBjb2RlIGluY2x1ZGUgR01Q CisgICAgZmFjdG9yaW5nIGNvZGUuICBUaGUgR01QIGZhY3RvcmluZyBjb2RlIGlzIGJhc2VkIG9u IEdNUCdzIGRlbW9zL2ZhY3Rvcml6ZS5jCisgICAgKGxhc3Qgc3luY2hlZCAyMDEyLTA5LTA3KS4g IFRoZSBHTVAtYmFzZWQgZmFjdG9yaW5nIGNvZGUgd2lsbCBzdGF5IGluIEdNUAorICAgIGZhY3Rv cmluZyBjb2RlIGV2ZW4gaWYgbnVtYmVycyBnZXQgc21hbGwgZW5vdWdoIGZvciB1c2luZyB0aGUg dHdvLXdvcmQKKyAgICBjb2RlLgorCisgIEFsZ29yaXRobToKKworICAgICgxKSBQZXJmb3JtIHRy aWFsIGRpdmlzaW9uIHVzaW5nIGEgc21hbGwgcHJpbWVzIHRhYmxlLCBidXQgd2l0aG91dCBoYXJk d2FyZQorICAgICAgICBkaXZpc2lvbiBzaW5jZSB0aGUgcHJpbWVzIHRhYmxlIHN0b3JlIGludmVy c2VzIG1vZHVsbyB0aGUgd29yZCBiYXNlLgorICAgICAgICAoVGhlIEdNUCB2YXJpYW50IG9mIHRo aXMgY29kZSBkb2Vzbid0IG1ha2UgdXNlIG9mIHRoZSBwcmVjb21wdXRlZAorICAgICAgICBpbnZl cnNlcywgYnV0IGluc3RlYWQgcmVsaWVzIG9uIEdNUCBmb3IgZmFzdCBkaXZpc2liaWxpdHkgdGVz dGluZy4pCisgICAgKDIpIENoZWNrIHRoZSBuYXR1cmUgb2YgYW55IG5vbi1mYWN0b3JlZCBwYXJ0 IHVzaW5nIE1pbGxlci1SYWJpbiBmb3IKKyAgICAgICAgZGV0ZWN0aW5nIGNvbXBvc2l0ZXMsIGFu ZCBMdWNhcyBmb3IgZGV0ZWN0aW5nIHByaW1lcy4KKyAgICAoMykgRmFjdG9yIGFueSByZW1haW5p bmcgY29tcG9zaXRlIHBhcnQgdXNpbmcgdGhlIFBvbGxhcmQtQnJlbnQgcmhvCisgICAgICAgIGFs Z29yaXRobSBvciB0aGUgU1FVRk9GIGFsZ29yaXRobSwgY2hlY2tpbmcgc3RhdHVzIG9mIGZvdW5k IGZhY3RvcnMKKyAgICAgICAgYWdhaW4gdXNpbmcgTWlsbGVyLVJhYmluIGFuZCBMdWNhcy4KKwor ICAgIFdlIHByZWZlciB1c2luZyBIZW5zZWwgbm9ybSBpbiB0aGUgZGl2aXNpb25zLCBub3QgdGhl IG1vcmUgZmFtaWxpYXIKKyAgICBFdWNsaWRpYW4gbm9ybSwgc2luY2UgdGhlIGZvcm1lciBsZWFk cyB0byBtdWNoIGZhc3RlciBjb2RlLiAgSW4gdGhlCisgICAgUG9sbGFyZC1CcmVudCByaG8gY29k ZSBhbmQgdGhlIHRoZSBwcmltZSB0ZXN0aW5nIGNvZGUsIHdlIHVzZSBNb250Z29tZXJ5J3MKKyAg ICB0cmljayBvZiBtdWx0aXBseWluZyBhbGwgbi1yZXNpZHVlcyBieSB0aGUgd29yZCBiYXNlLCBh bGxvd2luZyBjaGVhcCBIZW5zZWwKKyAgICByZWR1Y3Rpb25zIG1vZCBuLgorCisgIEltcHJvdmVt ZW50czoKKworICAgICogVXNlIG1vZHVsYXIgaW52ZXJzZXMgYWxzbyBmb3IgZXhhY3QgZGl2aXNp b24gaW4gdGhlIEx1Y2FzIGNvZGUsIGFuZAorICAgICAgZWxzZXdoZXJlLiAgQSBwcm9ibGVtIGlz IHRvIGxvY2F0ZSB0aGUgaW52ZXJzZXMgbm90IGZyb20gYW4gaW5kZXgsIGJ1dAorICAgICAgZnJv bSBhIHByaW1lLiAgV2UgbWlnaHQgaW5zdGVhZCBjb21wdXRlIHRoZSBpbnZlcnNlIG9uLXRoZS1m bHkuCisKKyAgICAqIFR1bmUgdHJpYWwgZGl2aXNpb24gdGFibGUgc2l6ZSAobm90IGZvcmdldHRp bmcgdGhhdCB0aGlzIGlzIGEgc3RhbmRhbG9uZQorICAgICAgcHJvZ3JhbSB3aGVyZSB0aGUgdGFi bGUgd2lsbCBiZSByZWFkIGZyb20gZGlzayBmb3IgZWFjaCBpbnZvY2F0aW9uKS4KKworICAgICog SW1wbGVtZW50IGxlc3MgbmFpdmUgcG93bSwgdXNpbmcgay1hcnkgZXhwb25lbnRpYXRpb24gZm9y IGsgPSAzIG9yCisgICAgICBwZXJoYXBzIGsgPSA0LgorCisgICAgKiBUcnkgdG8gc3BlZWQgdHJp YWwgZGl2aXNpb24gY29kZSBmb3Igc2luZ2xlIHVpbnRtYXhfdCBudW1iZXJzLCBpLmUuLCB0aGUK KyAgICAgIGNvZGUgdXNpbmcgRElWQkxPQ0suICBJdCBjdXJyZW50bHkgcnVucyBhdCAyIGN5Y2xl cyBwZXIgcHJpbWUgKEludGVsIFNCUiwKKyAgICAgIElCUiksIDMgY3ljbGVzIHBlciBwcmltZSAo QU1EIFN0YXJzKSBhbmQgNSBjeWNsZXMgcGVyIHByaW1lIChBTUQgQkQpIHdoZW4KKyAgICAgIHVz aW5nIGdjYyA0LjYgYW5kIDQuNy4gIFNvbWUgc29mdHdhcmUgcGlwZWxpbmluZyBzaG91bGQgaGVs cDsgMSwgMiwgYW5kIDQKKyAgICAgIHJlc3BlY3RpdmVseSBjeWNsZXMgb3VnaHQgdG8gYmUgcG9z c2libGUuCisKKyAgICAqIFRoZSByZWRjaWZ5IGZ1bmN0aW9uIGNvdWxkIGJlIHZhc3RseSBpbXBy b3ZlZCBieSB1c2luZyAocGxhaW4gRXVjbGlkaWFuKQorICAgICAgcHJlLWludmVyc2lvbiAoc3Vj aCBhcyBHTVAncyBpbnZlcnRfbGltYikgYW5kIHVkaXZfcXJubmRfcHJlaW52IChmcm9tCisgICAg ICBHTVAncyBnbXAtaW1wbC5oKS4gIFRoZSByZWRjaWZ5MiBmdW5jdGlvbiBjb3VsZCBiZSB2YXN0 bHkgaW1wcm92ZWQgdXNpbmcKKyAgICAgIHNpbWlsYXIgbWV0aG9vZHMuICBUaGVzZSBmdW5jdGlv bnMgY3VycmVudGx5IGRvbWluYXRlIHJ1biB0aW1lIHdoZW4gdXNpbmcKKyAgICAgIHRoZSAtdyBv cHRpb24uCiAqLwoKICNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLSNp bmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlv Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNs dWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+Cisj aW5jbHVkZSA8c3RyaW5nLmg+ICAgICAgICAgICAgIC8qIGZvciBtZW1tb3ZlICovCisjaW5jbHVk ZSA8dW5pc3RkLmg+ICAgICAgICAgICAgIC8qIGZvciBnZXRvcHQgKi8KKyNpbmNsdWRlIDxzdGRi b29sLmg+CisKKyNpbmNsdWRlICJzeXN0ZW0uaCIKKwogI2lmIEhBVkVfR01QCiAjIGluY2x1ZGUg PGdtcC5oPgogI2VuZGlmCgotI2luY2x1ZGUgPGFzc2VydC5oPgorI2lmbmRlZiBTVEFUX1NRVUZP RgorIyBkZWZpbmUgU1RBVF9TUVVGT0YgMAorI2VuZGlmCgotI2luY2x1ZGUgInN5c3RlbS5oIgot I2luY2x1ZGUgImVycm9yLmgiCi0jaW5jbHVkZSAicXVvdGUuaCIKLSNpbmNsdWRlICJyZWFkdG9r ZW5zLmgiCi0jaW5jbHVkZSAieHN0cnRvbC5oIgorI2lmbmRlZiBVU0VfTE9OR0xPTkdfSAorIyBk ZWZpbmUgVVNFX0xPTkdMT05HX0ggMQorI2VuZGlmCisKKyNpZiBVU0VfTE9OR0xPTkdfSAorCisv KiBNYWtlIGRlZmluaXRpb25zIGZvciBsb25nbG9uZy5oIHRvIG1ha2UgaXQgZG8gd2hhdCBpdCBj YW4gZG8gZm9yIHVzICovCisjIGRlZmluZSBXX1RZUEVfU0laRSA2NCAgICAgICAgICAvKiBiaXRj b3VudCBmb3IgdWludG1heF90ICovCisjIGRlZmluZSBVV3R5cGUgIHVpbnRtYXhfdAorIyBkZWZp bmUgVUhXdHlwZSB1bnNpZ25lZCBsb25nIGludAorIyB1bmRlZiBVRFd0eXBlCisjIGlmIEhBVkVf QVRUUklCVVRFX01PREUKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVRSXR5cGUgICAgX19hdHRyaWJ1 dGVfXyAoKG1vZGUgKFFJKSkpOwordHlwZWRlZiAgICAgICAgICBpbnQgU0l0eXBlICAgICBfX2F0 dHJpYnV0ZV9fICgobW9kZSAoU0kpKSk7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBVU0l0eXBlICAg IF9fYXR0cmlidXRlX18gKChtb2RlIChTSSkpKTsKK3R5cGVkZWYgICAgICAgICAgaW50IERJdHlw ZSAgICAgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKERJKSkpOwordHlwZWRlZiB1bnNpZ25lZCBpbnQg VURJdHlwZSAgICBfX2F0dHJpYnV0ZV9fICgobW9kZSAoREkpKSk7CisjIGVsc2UKK3R5cGVkZWYg dW5zaWduZWQgY2hhciBVUUl0eXBlOwordHlwZWRlZiAgICAgICAgICBsb25nIFNJdHlwZTsKK3R5 cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgVVNJdHlwZTsKKyMgIGlmIEhBVkVfTE9OR19MT05HCit0 eXBlZGVmIGxvbmcgbG9uZyBpbnQgREl0eXBlOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcg aW50IFVESXR5cGU7CisjICBlbHNlIC8qIEFzc3VtZSBgbG9uZycgZ2l2ZXMgdXMgYSB3aWRlIGVu b3VnaCB0eXBlLiAgTmVlZGVkIGZvciBocHBhMi4wdy4gICovCit0eXBlZGVmIGxvbmcgaW50IERJ dHlwZTsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgVURJdHlwZTsKKyMgIGVuZGlmCisjIGVu ZGlmCisjIGRlZmluZSBMT05HTE9OR19TVEFOREFMT05FICAgICAvKiBEb24ndCByZXF1aXJlIEdN UCdzIGxvbmdsb25nLmggbWRlcCBmaWxlcyAqLworIyBkZWZpbmUgQVNTRVJUKHgpICAgICAgICAg ICAgICAgLyogRklYTUUgbWFrZSBsb25nbG9uZy5oIHJlYWxseSBzdGFuZGFsb25lICovCisjIGRl ZmluZSBfX0dNUF9ERUNMU1BFQyAgICAgICAgICAvKiBGSVhNRSBtYWtlIGxvbmdsb25nLmggcmVh bGx5IHN0YW5kYWxvbmUgKi8KKyMgZGVmaW5lIF9fY2x6X3RhYiBmYWN0b3JfY2x6X3RhYiAvKiBS ZW5hbWUgdG8gYXZvaWQgZ2xpYmMgY29sbGlzaW9uICovCisjIGlmbmRlZiBfX0dNUF9HTlVDX1BS RVJFUQorIyAgZGVmaW5lIF9fR01QX0dOVUNfUFJFUkVRKGEsYikgMQorIyBlbmRpZgorIyBpZiBf QVJDSF9QUEMKKyMgIGRlZmluZSBIQVZFX0hPU1RfQ1BVX0ZBTUlMWV9wb3dlcnBjIDEKKyMgZW5k aWYKKyMgaW5jbHVkZSAibG9uZ2xvbmcuaCIKKyMgaWZkZWYgQ09VTlRfTEVBRElOR19aRVJPU19O RUVEX0NMWl9UQUIKK2NvbnN0IHVuc2lnbmVkIGNoYXIgZmFjdG9yX2Nsel90YWJbMTI5XSA9Cit7 CisgIDEsMiwzLDMsNCw0LDQsNCw1LDUsNSw1LDUsNSw1LDUsNiw2LDYsNiw2LDYsNiw2LDYsNiw2 LDYsNiw2LDYsNiwKKyAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcs Nyw3LDcsNyw3LDcsNyw3LDcsNyw3LAorICA4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4 LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsCisgIDgsOCw4LDgsOCw4LDgsOCw4LDgs OCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKKyAgOQorfTsKKyMg ZW5kaWYKKworI2Vsc2UgLyogbm90IFVTRV9MT05HTE9OR19IICovCisKKyMgZGVmaW5lIFdfVFlQ RV9TSVpFICg4ICogc2l6ZW9mICh1aW50bWF4X3QpKQorIyBkZWZpbmUgX19sbF9CICgodWludG1h eF90KSAxIDw8IChXX1RZUEVfU0laRSAvIDIpKQorIyBkZWZpbmUgX19sbF9sb3dwYXJ0KHQpICAo KHVpbnRtYXhfdCkgKHQpICYgKF9fbGxfQiAtIDEpKQorIyBkZWZpbmUgX19sbF9oaWdocGFydCh0 KSAoKHVpbnRtYXhfdCkgKHQpID4+IChXX1RZUEVfU0laRSAvIDIpKQorCisjZW5kaWYKKworZW51 bSBhbGdfdHlwZSB7IEFMR19QT0xMQVJEX1JITyA9IDEsIEFMR19TUVVGT0YgPSAyIH07CisKK3N0 YXRpYyBlbnVtIGFsZ190eXBlIGFsZzsKKworLyogMiozKjUqNyoxMS4uLioxMDEgaXMgMTI4IGJp dHMsIGFuZCBoYXMgMjYgcHJpbWUgZmFjdG9ycyAqLworI2RlZmluZSBNQVhfTkZBQ1RTIDI2CisK K3N0cnVjdCBmYWN0b3JzCit7CisgIHVpbnRtYXhfdCAgICAgcGxhcmdlWzJdOyAvKiBDYW4gaGF2 ZSBhIHNpbmdsZSBsYXJnZSBmYWN0b3IgKi8KKyAgdWludG1heF90ICAgICBwW01BWF9ORkFDVFNd OworICB1bnNpZ25lZCBjaGFyIGVbTUFYX05GQUNUU107CisgIHVuc2lnbmVkIGNoYXIgbmZhY3Rv cnM7Cit9OworCisjaWYgSEFWRV9HTVAKK3N0cnVjdCBtcF9mYWN0b3JzCit7CisgIG1wel90ICAg ICAgICAgKnA7CisgIHVuc2lnbmVkIGxvbmcgaW50ICplOworICB1bnNpZ25lZCBsb25nIGludCBu ZmFjdG9yczsKK307CisjZW5kaWYKKworc3RhdGljIHZvaWQgZmFjdG9yICh1aW50bWF4X3QsIHVp bnRtYXhfdCwgc3RydWN0IGZhY3RvcnMgKik7CisKKyNpZm5kZWYgdW11bF9wcG1tCisjIGRlZmlu ZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnRtYXhfdCBfX3gwLCBfX3gxLCBf X3gyLCBfX3gzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2ln bmVkIGxvbmcgaW50IF9fdWwsIF9fdmwsIF9fdWgsIF9fdmg7ICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAorICAgIHVpbnRtYXhfdCBfX3UgPSAodSksIF9fdiA9ICh2KTsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fdWwgPSBf X2xsX2xvd3BhcnQgKF9fdSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgXAorICAgIF9fdWggPSBfX2xsX2hpZ2hwYXJ0IChfX3UpOyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fdmwgPSBfX2xsX2xvd3BhcnQgKF9fdik7ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fdmggPSBfX2xs X2hpZ2hwYXJ0IChfX3YpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgXAorICAgIF9feDAgPSAodWludG1heF90KSBfX3VsICogX192bDsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9feDEgPSAodWludG1h eF90KSBfX3VsICogX192aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor ICAgIF9feDIgPSAodWludG1heF90KSBfX3VoICogX192bDsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAorICAgIF9feDMgPSAodWludG1heF90KSBfX3VoICogX192aDsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAg IF9feDEgKz0gX19sbF9oaWdocGFydCAoX194MCk7LyogdGhpcyBjYW4ndCBnaXZlIGNhcnJ5ICov ICAgICAgICAgICAgXAorICAgIF9feDEgKz0gX194MjsgICAgICAgICAgICAgICAvKiBidXQgdGhp cyBpbmRlZWQgY2FuICovICAgICAgICAgICAgICAgXAorICAgIGlmIChfX3gxIDwgX194MikgICAg ICAgICAgICAvKiBkaWQgd2UgZ2V0IGl0PyAqLyAgICAgICAgICAgICAgICAgICAgXAorICAgICAg X194MyArPSBfX2xsX0I7ICAgICAgICAgICAvKiB5ZXMsIGFkZCBpdCBpbiB0aGUgcHJvcGVyIHBv cy4gKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh3MSkgPSBfX3gzICsgX19sbF9oaWdo cGFydCAoX194MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh3MCkg PSAoX194MSA8PCBXX1RZUEVfU0laRSAvIDIpICsgX19sbF9sb3dwYXJ0IChfX3gwKTsgICAgICAg ICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCh1ZGl2X3Fybm5k KSB8fCBkZWZpbmVkKFVESVZfTkVFRFNfTk9STUFMSVpBVElPTikKKy8qIERlZmluZSBvdXIgb3du LCBub3QgbmVlZGluZyBub3JtYWxpemF0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzCisgICBjdXJyZW50 bHkgbm90IHBlcmZvcm1hbmNlIGNyaXRpY2FsLCBzbyBrZWVwIGl0IHNpbXBsZS4gU2ltaWxhciB0 bworICAgdGhlIG1vZCBtYWNybyBiZWxvdy4gKi8KKyMgdW5kZWYgdWRpdl9xcm5uZAorIyBkZWZp bmUgdWRpdl9xcm5uZChxLCByLCBuMSwgbjAsIGQpICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50bWF4X3QgX19kMSwgX19kMCwg X19xLCBfX3IxLCBfX3IwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKKyAgICBhc3NlcnQgKChuMSkgPCAoZCkpOyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2QxID0gKGQpOyBfX2QwID0gMDsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX3IxID0g KG4xKTsgX19yMCA9IChuMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKKyAgICBfX3EgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSBXX1RZ UEVfU0laRTsgX19pID4gMDsgX19pLS0pICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFwKKyAgICAgICAgcnNoMiAoX19kMSwgX19kMCwgX19kMSwgX19kMCwgMSk7ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19xIDw8PSAxOyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGdlMiAo X19yMSwgX19yMCwgX19kMSwgX19kMCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK KyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fcSsrOyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN1Yl9kZG1t c3MgKF9fcjEsIF9fcjAsIF9fcjEsIF9fcjAsIF9fZDEsIF9fZDApOyAgICAgICAgICAgIFwKKyAg ICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAocikgPSBfX3IwOyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAo cSkgPSBfX3E7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKGFkZF9z c2FhYWEpCisjIGRlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnRtYXhf dCBfYWRkX3g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgXAorICAgIF9hZGRfeCA9IChhbCkgKyAoYmwpOyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAorICAgIChzaCkgPSAoYWgpICsgKGJoKSArIChfYWRkX3gg PCAoYWwpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChzbCkgPSBfYWRk X3g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgcnNoMihyaCwgcmwsIGFoLCBhbCwg Y250KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKKyAgICAocmwpID0gKChhaCkgPDwgKFdfVFlQRV9TSVpFIC0gKGNudCkpKSB8ICgoYWwp ID4+IChjbnQpKTsgICAgICAgICAgIFwKKyAgICAocmgpID0gKGFoKSA+PiAoY250KTsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkK KworI2RlZmluZSBsc2gyKHJoLCBybCwgYWgsIGFsLCBjbnQpICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChyaCkgPSAoKGFoKSA8 PCBjbnQpIHwgKChhbCkgPj4gKFdfVFlQRV9TSVpFIC0gKGNudCkpKTsgICAgICAgICAgICAgXAor ICAgIChybCkgPSAoYWwpIDw8IChjbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIGdlMihhaCwgYWwsIGJo LCBibCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgo YWgpID4gKGJoKSB8fCAoKGFoKSA9PSAoYmgpICYmIChhbCkgPj0gKGJsKSkpCisKKyNkZWZpbmUg Z3QyKGFoLCBhbCwgYmgsIGJsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKKyAgKChhaCkgPiAoYmgpIHx8ICgoYWgpID09IChiaCkgJiYgKGFsKSA+IChibCkp KQorCisjaWZuZGVmIHN1Yl9kZG1tc3MKKyMgZGVmaW5lIHN1Yl9kZG1tc3MocmgsIHJsLCBhaCwg YWwsIGJoLCBibCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCisgICAgdWludG1heF90IF9jeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCisgICAgX2N5ID0gKGFsKSA8IChibCk7ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHJsKSA9IChhbCkg LSAoYmwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc CisgICAgKHJoKSA9IChhaCkgLSAoYmgpIC0gX2N5OyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmbmRlZiBjb3Vu dF9sZWFkaW5nX3plcm9zCisjIGRlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBk byB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnRtYXhfdCBfX2Nsel94 ID0gKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAg IHVuc2lnbmVkIGludCBfX2Nsel9jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXAorICAgIGZvciAoX19jbHpfYyA9IDA7ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKF9fY2x6X3ggJiAoKHVp bnRtYXhfdCkgMHhmZiA8PCAoV19UWVBFX1NJWkUgLSA4KSkpID09IDA7ICAgICAgXAorICAgICAg ICAgX19jbHpfYyArPSA4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAorICAgICAgX19jbHpfeCA8PD0gODsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoOyAoaW50bWF4X3QpX19jbHpf eCA+PSAwOyBfX2Nsel9jKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX19j bHpfeCA8PD0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAorICAgIChjb3VudCkgPSBfX2Nsel9jOyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZm5k ZWYgY291bnRfdHJhaWxpbmdfemVyb3MKKyMgZGVmaW5lIGNvdW50X3RyYWlsaW5nX3plcm9zKGNv dW50LCB4KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludG1heF90 IF9fY3R6X3ggPSAoeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCisgICAgdW5zaWduZWQgaW50IF9fY3R6X2MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKChfX2N0el94ICYgMSkgPT0gMCkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc CisgICAgICAgIF9fY3R6X3ggPj49IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fY3R6X2MrKzsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg ICAgKGNvdW50KSA9IF9fY3R6X2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogUmVxdWlyZXMgdGhh dCBhIDwgbiBhbmQgYiA8PSBuICovCisjZGVmaW5lIHN1Ym1vZChyLGEsYixuKSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc CisgICAgdWludG1heF90IF90ID0gLSAodWludG1heF90KSAoYSA8IGIpOyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCisgICAgKHIpID0gKChuKSAmIF90KSArIChhKSAtIChiKTsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNk ZWZpbmUgYWRkbW9kKHIsYSxiLG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKKyAgc3VibW9kKChyKSwgKGEpLCAoKG4pIC0gKGIpKSwgKG4pKQorCisv KiBNb2R1bGFyIHR3by13b3JkIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbi4gIEZvciBwZXJmb3Jt YW5jZSByZWFzb25zLCB0aGUKKyAgIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIG4xIG11c3QgYmUg Y2xlYXIuICBUaGUgZGVzdGluYXRpb24gdmFyaWFibGVzIG11c3QgYmUKKyAgIGRpc3RpbmN0IGZy b20gdGhlIG1vZCBvcGVyYW5kLiAgKi8KKyNkZWZpbmUgYWRkbW9kMihyMSwgcjAsIGExLCBhMCwg YjEsIGIwLCBuMSwgbjApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFwKKyAgICBhZGRfc3NhYWFhICgocjEpLCAocjApLCAoYTEpLCAoYTApLCAoYjEpLCAoYjApKTsg ICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZ2UyICgocjEpLCAocjApLCAobjEpLCAobjAp KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN1Yl9kZG1tc3Mg KChyMSksIChyMCksIChyMSksIChyMCksIChuMSksIChuMCkpOyAgICAgICAgICAgICAgICAgIFwK KyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc3VibW9kMihyMSwgcjAsIGExLCBhMCwgYjEsIGIwLCBu MSwgbjApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBz dWJfZGRtbXNzICgocjEpLCAocjApLCAoYTEpLCAoYTApLCAoYjEpLCAoYjApKTsgICAgICAgICAg ICAgICAgICAgIFwKKyAgICBpZiAoKGludG1heF90KSAocjEpIDwgMCkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGFkZF9zc2FhYWEgKChyMSksIChy MCksIChyMSksIChyMCksIChuMSksIChuMCkpOyAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGls ZSAoMCkKKworI2RlZmluZSBISUdIQklUX1RPX01BU0soeCkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChpbnRtYXhfdCktMSA+PiAxKSA8IDAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgPyAodWludG1h eF90KSgoaW50bWF4X3QpKHgpID4+IChXX1RZUEVfU0laRSAtIDEpKSAgICAgICAgICAgICAgICAg ICAgXAorICAgOiAoKHgpICYgKCh1aW50bWF4X3QpIDEgPDwgKFdfVFlQRV9TSVpFIC0gMSkpICAg ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgPyBVSU5UTUFYX01BWCA6ICh1aW50bWF4X3Qp IDApKQorCisvKiBDb21wdXRlIHIgPSBhIG1vZCBkLCB3aGVyZSByID0gPCp0MSxyZXR2YWw+LCBh ID0gPGExLGEwPiwgZCA9IDxkMSxkMD4uCisgICBSZXF1aXJlcyB0aGF0IGQxICE9IDAuICAqLwor c3RhdGljIHVpbnRtYXhfdAorbW9kMiAodWludG1heF90ICpyMSwgdWludG1heF90IGExLCB1aW50 bWF4X3QgYTAsIHVpbnRtYXhfdCBkMSwgdWludG1heF90IGQwKQoreworICBpbnQgY250ZCwgY250 YTsKKworICBhc3NlcnQgKGQxICE9IDApOworCisgIGlmIChhMSA9PSAwKQorICAgIHsKKyAgICAg ICpyMSA9IDA7CisgICAgICByZXR1cm4gYTA7CisgICAgfQorCisgIGNvdW50X2xlYWRpbmdfemVy b3MgKGNudGQsIGQxKTsKKyAgY291bnRfbGVhZGluZ196ZXJvcyAoY250YSwgYTEpOworICBpbnQg Y250ID0gY250ZCAtIGNudGE7CisgIGxzaDIgKGQxLCBkMCwgZDEsIGQwLCBjbnQpOworICBmb3Ig KGludCBpID0gMDsgaSA8IGNudDsgaSsrKQorICAgIHsKKyAgICAgIGlmIChnZTIgKGExLCBhMCwg ZDEsIGQwKSkKKyAgICAgICAgc3ViX2RkbW1zcyAoYTEsIGEwLCBhMSwgYTAsIGQxLCBkMCk7Cisg ICAgICByc2gyIChkMSwgZDAsIGQxLCBkMCwgMSk7CisgICAgfQorCisgICpyMSA9IGExOworICBy ZXR1cm4gYTA7Cit9CisKK3N0YXRpYyB1aW50bWF4X3QgX0dMX0FUVFJJQlVURV9DT05TVAorZ2Nk X29kZCAodWludG1heF90IGEsIHVpbnRtYXhfdCBiKQoreworICBpZiAoIChiICYgMSkgPT0gMCkK KyAgICB7CisgICAgICB1aW50bWF4X3QgdCA9IGI7CisgICAgICBiID0gYTsKKyAgICAgIGEgPSB0 OworICAgIH0KKyAgaWYgKGEgPT0gMCkKKyAgICByZXR1cm4gYjsKKworICAvKiBUYWtlIG91dCBs ZWFzdCBzaWduaWZpY2FudCBvbmUgYml0LCB0byBtYWtlIHJvb20gZm9yIHNpZ24gKi8KKyAgYiA+ Pj0gMTsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIHVpbnRtYXhfdCB0OworICAgICAgdWlu dG1heF90IGJndGE7CisKKyAgICAgIHdoaWxlICgoYSAmIDEpID09IDApCisgICAgICAgIGEgPj49 IDE7CisgICAgICBhID4+PSAxOworCisgICAgICB0ID0gYSAtIGI7CisgICAgICBpZiAodCA9PSAw KQorICAgICAgICByZXR1cm4gKGEgPDwgMSkgKyAxOworCisgICAgICBiZ3RhID0gSElHSEJJVF9U T19NQVNLICh0KTsKKworICAgICAgLyogYiA8LS0gbWluIChhLCBiKSAqLworICAgICAgYiArPSAo Ymd0YSAmIHQpOworCisgICAgICAvKiBhIDwtLSB8YSAtIGJ8ICovCisgICAgICBhID0gKHQgXiBi Z3RhKSAtIGJndGE7CisgICAgfQorfQorCitzdGF0aWMgdWludG1heF90CitnY2QyX29kZCAodWlu dG1heF90ICpyMSwgdWludG1heF90IGExLCB1aW50bWF4X3QgYTAsIHVpbnRtYXhfdCBiMSwgdWlu dG1heF90IGIwKQoreworICB3aGlsZSAoKGEwICYgMSkgPT0gMCkKKyAgICByc2gyIChhMSwgYTAs IGExLCBhMCwgMSk7CisgIHdoaWxlICgoYjAgJiAxKSA9PSAwKQorICAgIHJzaDIgKGIxLCBiMCwg YjEsIGIwLCAxKTsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGlmICgoYjEgfCBhMSkgPT0g MCkKKyAgICAgICAgeworICAgICAgICAgICpyMSA9IDA7CisgICAgICAgICAgcmV0dXJuIGdjZF9v ZGQgKGIwLCBhMCk7CisgICAgICAgIH0KKworICAgICAgaWYgKGd0MiAoYTEsIGEwLCBiMSwgYjAp KQorICAgICAgICB7CisgICAgICAgICAgc3ViX2RkbW1zcyAoYTEsIGEwLCBhMSwgYTAsIGIxLCBi MCk7CisgICAgICAgICAgZG8KKyAgICAgICAgICAgIHJzaDIgKGExLCBhMCwgYTEsIGEwLCAxKTsK KyAgICAgICAgICB3aGlsZSAoKGEwICYgMSkgPT0gMCk7CisgICAgICAgIH0KKyAgICAgIGVsc2Ug aWYgKGd0MiAoYjEsIGIwLCBhMSwgYTApKQorICAgICAgICB7CisgICAgICAgICAgc3ViX2RkbW1z cyAoYjEsIGIwLCBiMSwgYjAsIGExLCBhMCk7CisgICAgICAgICAgZG8KKyAgICAgICAgICAgIHJz aDIgKGIxLCBiMCwgYjEsIGIwLCAxKTsKKyAgICAgICAgICB3aGlsZSAoKGIwICYgMSkgPT0gMCk7 CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICpyMSA9 IGExOworICByZXR1cm4gYTA7Cit9CisKK3N0YXRpYyB2b2lkCitmYWN0b3JfaW5zZXJ0X211bHRp cGxpY2l0eSAoc3RydWN0IGZhY3RvcnMgKmZhY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdWludG1heF90IHByaW1lLCB1bnNpZ25lZCBpbnQgbSkKK3sKKyAgdW5zaWduZWQgaW50 IG5mYWN0b3JzID0gZmFjdG9ycy0+bmZhY3RvcnM7CisgIHVpbnRtYXhfdCAqcCA9IGZhY3RvcnMt PnA7CisgIHVuc2lnbmVkIGNoYXIgKmUgPSBmYWN0b3JzLT5lOworCisgIC8qIExvY2F0ZSBwb3Np dGlvbiBmb3IgaW5zZXJ0IG5ldyBvciBpbmNyZW1lbnQgZS4gICovCisgIGludCBpOworICBmb3Ig KGkgPSBuZmFjdG9ycyAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIGlmIChwW2ldIDw9 IHByaW1lKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKGkgPCAwIHx8IHBbaV0gIT0g cHJpbWUpCisgICAgeworICAgICAgZm9yIChpbnQgaiA9IG5mYWN0b3JzIC0gMTsgaiA+IGk7IGot LSkKKyAgICAgICAgeworICAgICAgICAgIHBbaiArIDFdID0gcFtqXTsKKyAgICAgICAgICBlW2og KyAxXSA9IGVbal07CisgICAgICAgIH0KKyAgICAgIHBbaSArIDFdID0gcHJpbWU7CisgICAgICBl W2kgKyAxXSA9IG07CisgICAgICBmYWN0b3JzLT5uZmFjdG9ycyA9IG5mYWN0b3JzICsgMTsKKyAg ICB9CisgIGVsc2UKKyAgICB7CisgICAgICBlW2ldICs9IG07CisgICAgfQorfQorCisjZGVmaW5l IGZhY3Rvcl9pbnNlcnQoZiwgcCkgZmFjdG9yX2luc2VydF9tdWx0aXBsaWNpdHkoZiwgcCwgMSkK Kworc3RhdGljIHZvaWQKK2ZhY3Rvcl9pbnNlcnRfbGFyZ2UgKHN0cnVjdCBmYWN0b3JzICpmYWN0 b3JzLAorICAgICAgICAgICAgICAgICAgICAgdWludG1heF90IHAxLCB1aW50bWF4X3QgcDApCit7 CisgIGlmIChwMSA+IDApCisgICAgeworICAgICAgYXNzZXJ0IChmYWN0b3JzLT5wbGFyZ2VbMV0g PT0gMCk7CisgICAgICBmYWN0b3JzLT5wbGFyZ2VbMF0gPSBwMDsKKyAgICAgIGZhY3RvcnMtPnBs YXJnZVsxXSA9IHAxOworICAgIH0KKyAgZWxzZQorICAgIGZhY3Rvcl9pbnNlcnQgKGZhY3RvcnMs IHAwKTsKK30KKworI2lmIEhBVkVfR01QCitzdGF0aWMgdm9pZCBtcF9mYWN0b3IgKG1wel90LCBz dHJ1Y3QgbXBfZmFjdG9ycyAqKTsKKworc3RhdGljIHZvaWQKK21wX2ZhY3Rvcl9pbml0IChzdHJ1 Y3QgbXBfZmFjdG9ycyAqZmFjdG9ycykKK3sKKyAgZmFjdG9ycy0+cCA9IG1hbGxvYyAoMSk7Cisg IGZhY3RvcnMtPmUgPSBtYWxsb2MgKDEpOworICBmYWN0b3JzLT5uZmFjdG9ycyA9IDA7Cit9CisK K3N0YXRpYyB2b2lkCittcF9mYWN0b3JfY2xlYXIgKHN0cnVjdCBtcF9mYWN0b3JzICpmYWN0b3Jz KQoreworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGZhY3RvcnMtPm5mYWN0b3JzOyBp KyspCisgICAgbXB6X2NsZWFyIChmYWN0b3JzLT5wW2ldKTsKCi0vKiBUaGUgb2ZmaWNpYWwgbmFt ZSBvZiB0aGlzIHByb2dyYW0gKGUuZy4sIG5vICdnJyBwcmVmaXgpLiAgKi8KLSNkZWZpbmUgUFJP R1JBTV9OQU1FICJmYWN0b3IiCisgIGZyZWUgKGZhY3RvcnMtPnApOworICBmcmVlIChmYWN0b3Jz LT5lKTsKK30KCi0jZGVmaW5lIEFVVEhPUlMgcHJvcGVyX25hbWUgKCJQYXVsIFJ1YmluIikKK3N0 YXRpYyB2b2lkCittcF9mYWN0b3JfaW5zZXJ0IChzdHJ1Y3QgbXBfZmFjdG9ycyAqZmFjdG9ycywg bXB6X3QgcHJpbWUpCit7CisgIHVuc2lnbmVkIGxvbmcgaW50IG5mYWN0b3JzID0gZmFjdG9ycy0+ bmZhY3RvcnM7CisgIG1wel90ICAgICAgICAgKnAgID0gZmFjdG9ycy0+cDsKKyAgdW5zaWduZWQg bG9uZyBpbnQgKmUgID0gZmFjdG9ycy0+ZTsKKyAgbG9uZyBpOwoKLS8qIFRva2VuIGRlbGltaXRl cnMgd2hlbiByZWFkaW5nIGZyb20gYSBmaWxlLiAgKi8KLSNkZWZpbmUgREVMSU0gIlxuXHQgIgor ICAvKiBMb2NhdGUgcG9zaXRpb24gZm9yIGluc2VydCBuZXcgb3IgaW5jcmVtZW50IGUuICAqLwor ICBmb3IgKGkgPSBuZmFjdG9ycyAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIGlmICht cHpfY21wIChwW2ldLCBwcmltZSkgPD0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgfQoKLXN0YXRp YyBib29sIHZlcmJvc2UgPSBmYWxzZTsKKyAgaWYgKGkgPCAwIHx8IG1wel9jbXAgKHBbaV0sIHBy aW1lKSAhPSAwKQorICAgIHsKKyAgICAgIHAgPSByZWFsbG9jIChwLCAobmZhY3RvcnMgKyAxKSAq IHNpemVvZiBwWzBdKTsKKyAgICAgIGUgPSByZWFsbG9jIChlLCAobmZhY3RvcnMgKyAxKSAqIHNp emVvZiBlWzBdKTsKKworICAgICAgbXB6X2luaXQgKHBbbmZhY3RvcnNdKTsKKyAgICAgIGZvciAo bG9uZyBqID0gbmZhY3RvcnMgLSAxOyBqID4gaTsgai0tKQorICAgICAgICB7CisgICAgICAgICAg bXB6X3NldCAocFtqICsgMV0sIHBbal0pOworICAgICAgICAgIGVbaiArIDFdID0gZVtqXTsKKyAg ICAgICAgfQorICAgICAgbXB6X3NldCAocFtpICsgMV0sIHByaW1lKTsKKyAgICAgIGVbaSArIDFd ID0gMTsKKworICAgICAgZmFjdG9ycy0+cCA9IHA7CisgICAgICBmYWN0b3JzLT5lID0gZTsKKyAg ICAgIGZhY3RvcnMtPm5mYWN0b3JzID0gbmZhY3RvcnMgKyAxOworICAgIH0KKyAgZWxzZQorICAg IHsKKyAgICAgIGVbaV0gKz0gMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCittcF9mYWN0b3Jf aW5zZXJ0X3VpIChzdHJ1Y3QgbXBfZmFjdG9ycyAqZmFjdG9ycywgdW5zaWduZWQgbG9uZyBpbnQg cHJpbWUpCit7CisgIG1wel90IHB6OworCisgIG1wel9pbml0X3NldF91aSAocHosIHByaW1lKTsK KyAgbXBfZmFjdG9yX2luc2VydCAoZmFjdG9ycywgcHopOworICBtcHpfY2xlYXIgKHB6KTsKK30K KyNlbmRpZiAvKiBIQVZFX0dNUCAqLworCisKKyNkZWZpbmUgUChhLGIsYyxkKSBhLAorc3RhdGlj IGNvbnN0IHVuc2lnbmVkIGNoYXIgcHJpbWVzX2RpZmZbXSA9IHsKKyNpbmNsdWRlICJwcmltZXMu aCIKKzAsMCwwLDAsMCwwLDAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3IHNlbnRpbmVs cyBmb3IgOC13YXkgbG9vcCAqLworfTsKKyN1bmRlZiBQCisKKyNkZWZpbmUgUFJJTUVTX1BUQUJf RU5UUklFUyAoc2l6ZW9mKHByaW1lc19kaWZmKSAvIHNpemVvZihwcmltZXNfZGlmZlswXSkgLSA4 ICsgMSkKKworI2RlZmluZSBQKGEsYixjLGQpIGIsCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hh ciBwcmltZXNfZGlmZjhbXSA9IHsKKyNpbmNsdWRlICJwcmltZXMuaCIKKzAsMCwwLDAsMCwwLDAg ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3IHNlbnRpbmVscyBmb3IgOC13YXkgbG9vcCAq LworfTsKKyN1bmRlZiBQCisKK3N0cnVjdCBwcmltZXNfZHRhYgoreworICB1aW50bWF4X3QgYmlu diwgbGltOworfTsKKworI2RlZmluZSBQKGEsYixjLGQpIHtjLGR9LAorc3RhdGljIGNvbnN0IHN0 cnVjdCBwcmltZXNfZHRhYiBwcmltZXNfZHRhYltdID0geworI2luY2x1ZGUgInByaW1lcy5oIgor ezEsMH0sezEsMH0sezEsMH0sezEsMH0sezEsMH0sezEsMH0sezEsMH0gLyogNyBzZW50aW5lbHMg Zm9yIDgtd2F5IGxvb3AgKi8KK307CisjdW5kZWYgUAorCisvKiBUaGlzIGZsYWcgaXMgaG9ub3Vy ZWQganVzdCBpbiB0aGUgR01QIGNvZGUuICovCitzdGF0aWMgaW50IGZsYWdfdmVyYm9zZSA9IDA7 CisKKy8qIFByb3ZlIHByaW1hbGl0eSBvciBydW4gcHJvYmFiaWxpc3RpYyB0ZXN0cy4gICovCitz dGF0aWMgaW50IGZsYWdfcHJvdmVfcHJpbWFsaXR5ID0gMTsKKworLyogTnVtYmVyIG9mIE1pbGxl ci1SYWJpbiB0ZXN0cyB0byBydW4gd2hlbiBub3QgcHJvdmluZyBwcmltYWxpdHkuICovCisjZGVm aW5lIE1SX1JFUFMgMjUKKworI2RlZmluZSBMSUtFTFkoY29uZCkgICAgX19idWlsdGluX2V4cGVj dCAoKGNvbmQpICE9IDAsIDEpCisjZGVmaW5lIFVOTElLRUxZKGNvbmQpICBfX2J1aWx0aW5fZXhw ZWN0ICgoY29uZCkgIT0gMCwgMCkKKworc3RhdGljIHZvaWQKK2ZhY3Rvcl9pbnNlcnRfcmVmaW5k IChzdHJ1Y3QgZmFjdG9ycyAqZmFjdG9ycywgdWludG1heF90IHAsIHVuc2lnbmVkIGludCBpLAor ICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvZmYpCit7CisgIGZvciAodW5zaWdu ZWQgaW50IGogPSAwOyBqIDwgb2ZmOyBqKyspCisgICAgcCArPSBwcmltZXNfZGlmZltpICsgal07 CisgIGZhY3Rvcl9pbnNlcnQgKGZhY3RvcnMsIHApOworfQorCisvKiBUcmlhbCBkaXZpc2lvbiB3 aXRoIG9kZCBwcmltZXMgdXNlcyB0aGUgZm9sbG93aW5nIHRyaWNrLgorCisgICBMZXQgcCBiZSBh biBvZGQgcHJpbWUsIGFuZCBCID0gMl57V19UWVBFX1NJWkV9LiBGb3Igc2ltcGxpY2l0eSwKKyAg IGNvbnNpZGVyIHRoZSBjYXNlIHQgPCBCICh0aGlzIGlzIHRoZSBzZWNvbmQgbG9vcCBiZWxvdyku CisKKyAgIEZyb20gb3VyIHRhYmxlcyB3ZSBnZXQKKworICAgICBiaW52ID0gcF57LTF9IChtb2Qg QikKKyAgICAgbGltID0gZmxvb3IgKCAoQi0xKSAvIHAgKS4KKworICAgRmlyc3QgYXNzdW1lIHRo YXQgdCBpcyBhIG11bHRpcGxlIG9mIHAsIHQgPSBxICogcC4gVGhlbiAwIDw9IHEgPD0KKyAgIGxp bSAoYW5kIGFsbCBxdW90aWVudHMgaW4gdGhpcyByYW5nZSBvY2N1ciBmb3Igc29tZSB0KS4KKwor ICAgVGhlbiB0ID0gcSAqIHAgaXMgdHJ1ZSBhbHNvIChtb2QgQiksIGFuZCBwIGlzIGludmVydGli bGUgd2UgZ2V0CisKKyAgICAgcSA9IHQgKiBiaW52IChtb2QgQikuCisKKyAgIE5leHQsIGFzc3Vt ZSB0aGF0IHQgaXMgKm5vdCogZGl2aXNpYmxlIGJ5IHAuIFNpbmNlIG11bHRpcGxpY2F0aW9uCisg ICBieSBiaW52IChtb2QgQikgaXMgYSBvbmUtdG8tb25lIG1hcHBpbmcsCisKKyAgICAgdCAqIGJp bnYgKG1vZCBCKSA+IGxpbSwKKworICAgYmVjYXVzZSBhbGwgdGhlIHNtYWxsZXIgdmFsdWVzIGFy ZSBhbHJlYWR5IHRha2VuLgorCisgICBUaGlzIGNhbiBiZSBzdW1tZWQgdXAgYnkgc2F5aW5nIHRo YXQgdGhlIGZ1bmN0aW9uCisKKyAgICAgcSh0KSA9IGJpbnYgKiB0IChtb2QgQikKKworICAgaXMg YSBwZXJtdXRhdGlvbiBvZiB0aGUgcmFuZ2UgMCA8PSB0IDwgQiwgd2l0aCB0aGUgY3VyaW91cyBw cm9wZXJ0eQorICAgdGhhdCBpdCBtYXBzIHRoZSBtdWx0aXBsZXMgb2YgcCBvbnRvIHRoZSByYW5n ZSAwIDw9IHEgPD0gbGltLCBpbgorICAgb3JkZXIsIGFuZCB0aGUgbm9uLW11bHRpcGxlcyBvZiBw IG9udG8gdGhlIHJhbmdlIGxpbSA8IHEgPCBCLgorICovCisKK3N0YXRpYyB1aW50bWF4X3QKK2Zh Y3Rvcl91c2luZ19kaXZpc2lvbiAodWludG1heF90ICp0MXAsIHVpbnRtYXhfdCB0MSwgdWludG1h eF90IHQwLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmFjdG9ycyAqZmFjdG9ycykK K3sKKyAgaWYgKHQwICUgMiA9PSAwKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBjbnQ7CisK KyAgICAgIGlmICh0MCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgY291bnRfdHJhaWxpbmdf emVyb3MgKGNudCwgdDEpOworICAgICAgICAgIHQwID0gdDEgPj4gY250OworICAgICAgICAgIHQx ID0gMDsKKyAgICAgICAgICBjbnQgKz0gV19UWVBFX1NJWkU7CisgICAgICAgIH0KKyAgICAgIGVs c2UKKyAgICAgICAgeworICAgICAgICAgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjbnQsIHQwKTsK KyAgICAgICAgICByc2gyICh0MSwgdDAsIHQxLCB0MCwgY250KTsKKyAgICAgICAgfQorCisgICAg ICBmYWN0b3JfaW5zZXJ0X211bHRpcGxpY2l0eSAoZmFjdG9ycywgMiwgY250KTsKKyAgICB9CisK KyAgdWludG1heF90IHAgPSAzOworICB1bnNpZ25lZCBpbnQgaTsKKyAgZm9yIChpID0gMDsgdDEg PiAwICYmIGkgPCBQUklNRVNfUFRBQl9FTlRSSUVTOyBpKyspCisgICAgeworICAgICAgZm9yICg7 OykKKyAgICAgICAgeworICAgICAgICAgIHVpbnRtYXhfdCBxMSwgcTAsIGhpLCBsbzsKKworICAg ICAgICAgIHEwID0gdDAgKiBwcmltZXNfZHRhYltpXS5iaW52OworICAgICAgICAgIHVtdWxfcHBt bSAoaGksIGxvLCBxMCwgcCk7CisgICAgICAgICAgaWYgKGhpID4gdDEpCisgICAgICAgICAgICBi cmVhazsKKyAgICAgICAgICBoaSA9IHQxIC0gaGk7CisgICAgICAgICAgcTEgPSBoaSAqIHByaW1l c19kdGFiW2ldLmJpbnY7CisgICAgICAgICAgaWYgKExJS0VMWSAocTEgPiBwcmltZXNfZHRhYltp XS5saW0pKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgdDEgPSBxMTsgdDAgPSBxMDsK KyAgICAgICAgICBmYWN0b3JfaW5zZXJ0IChmYWN0b3JzLCBwKTsKKyAgICAgICAgfQorICAgICAg cCArPSBwcmltZXNfZGlmZltpICsgMV07CisgICAgfQorICBpZiAodDFwKQorICAgICp0MXAgPSB0 MTsKKworI2RlZmluZSBESVZCTE9DSyhJKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoOzspICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBxID0gdDAgKiBwZFtJXS5iaW52OyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoTElLRUxZ IChxID4gcGRbSV0ubGltKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor ICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAorICAgICAgICB0MCA9IHE7ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmYWN0b3JfaW5zZXJ0 X3JlZmluZCAoZmFjdG9ycywgcCwgaSArIDEsIEkpOyAgICAgICAgICAgICAgICAgICAgXAorICAg ICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisgIGZvciAoOyBpIDwgUFJJTUVTX1BUQUJf RU5UUklFUzsgaSArPSA4KQorICAgIHsKKyAgICAgIHVpbnRtYXhfdCBxOworICAgICAgY29uc3Qg c3RydWN0IHByaW1lc19kdGFiICpwZCA9ICZwcmltZXNfZHRhYltpXTsKKyAgICAgIERJVkJMT0NL ICgwKTsKKyAgICAgIERJVkJMT0NLICgxKTsKKyAgICAgIERJVkJMT0NLICgyKTsKKyAgICAgIERJ VkJMT0NLICgzKTsKKyAgICAgIERJVkJMT0NLICg0KTsKKyAgICAgIERJVkJMT0NLICg1KTsKKyAg ICAgIERJVkJMT0NLICg2KTsKKyAgICAgIERJVkJMT0NLICg3KTsKKworICAgICAgcCArPSBwcmlt ZXNfZGlmZjhbaV07CisgICAgICBpZiAocCAqIHAgPiB0MCkKKyAgICAgICAgYnJlYWs7CisgICAg fQorCisgIHJldHVybiB0MDsKK30KCiAjaWYgSEFWRV9HTVAKLXN0YXRpYyBtcHpfdCAqZmFjdG9y ID0gTlVMTDsKLXN0YXRpYyBzaXplX3QgbmZhY3RvcnNfZm91bmQgPSAwOwotc3RhdGljIHNpemVf dCBuZmFjdG9yc19hbGxvY2F0ZWQgPSAwOworc3RhdGljIHZvaWQKK21wX2ZhY3Rvcl91c2luZ19k aXZpc2lvbiAobXB6X3QgdCwgc3RydWN0IG1wX2ZhY3RvcnMgKmZhY3RvcnMpCit7CisgIG1wel90 IHE7CisgIHVuc2lnbmVkIGxvbmcgaW50IHA7CisKKyAgaWYgKGZsYWdfdmVyYm9zZSA+IDApCisg ICAgeworICAgICAgcHJpbnRmICgiW3RyaWFsIGRpdmlzaW9uXSAiKTsKKyAgICB9CisKKyAgbXB6 X2luaXQgKHEpOworCisgIHAgPSBtcHpfc2NhbjEgKHQsIDApOworICBtcHpfZGl2XzJleHAgKHQs IHQsIHApOworICB3aGlsZSAocCkKKyAgICB7CisgICAgICBtcF9mYWN0b3JfaW5zZXJ0X3VpIChm YWN0b3JzLCAyKTsKKyAgICAgIC0tcDsKKyAgICB9CisKKyAgcCA9IDM7CisgIGZvciAodW5zaWdu ZWQgaW50IGkgPSAxOyBpIDw9IFBSSU1FU19QVEFCX0VOVFJJRVM7KQorICAgIHsKKyAgICAgIGlm ICghIG1wel9kaXZpc2libGVfdWlfcCAodCwgcCkpCisgICAgICAgIHsKKyAgICAgICAgICBwICs9 IHByaW1lc19kaWZmW2krK107CisgICAgICAgICAgaWYgKG1wel9jbXBfdWkgKHQsIHAgKiBwKSA8 IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7 CisgICAgICAgICAgbXB6X3RkaXZfcV91aSAodCwgdCwgcCk7CisgICAgICAgICAgbXBfZmFjdG9y X2luc2VydF91aSAoZmFjdG9ycywgcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgbXB6X2NsZWFy IChxKTsKK30KKyNlbmRpZgorCisvKiBFbnRyeSBpIGNvbnRhaW5zICgyaSsxKV4oLTEpIG1vZCAy XjguICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgIGJpbnZlcnRfdGFibGVbMTI4XSA9 Cit7CisgIDB4MDEsIDB4QUIsIDB4Q0QsIDB4QjcsIDB4MzksIDB4QTMsIDB4QzUsIDB4RUYsCisg IDB4RjEsIDB4MUIsIDB4M0QsIDB4QTcsIDB4MjksIDB4MTMsIDB4MzUsIDB4REYsCisgIDB4RTEs IDB4OEIsIDB4QUQsIDB4OTcsIDB4MTksIDB4ODMsIDB4QTUsIDB4Q0YsCisgIDB4RDEsIDB4RkIs IDB4MUQsIDB4ODcsIDB4MDksIDB4RjMsIDB4MTUsIDB4QkYsCisgIDB4QzEsIDB4NkIsIDB4OEQs IDB4NzcsIDB4RjksIDB4NjMsIDB4ODUsIDB4QUYsCisgIDB4QjEsIDB4REIsIDB4RkQsIDB4Njcs IDB4RTksIDB4RDMsIDB4RjUsIDB4OUYsCisgIDB4QTEsIDB4NEIsIDB4NkQsIDB4NTcsIDB4RDks IDB4NDMsIDB4NjUsIDB4OEYsCisgIDB4OTEsIDB4QkIsIDB4REQsIDB4NDcsIDB4QzksIDB4QjMs IDB4RDUsIDB4N0YsCisgIDB4ODEsIDB4MkIsIDB4NEQsIDB4MzcsIDB4QjksIDB4MjMsIDB4NDUs IDB4NkYsCisgIDB4NzEsIDB4OUIsIDB4QkQsIDB4MjcsIDB4QTksIDB4OTMsIDB4QjUsIDB4NUYs CisgIDB4NjEsIDB4MEIsIDB4MkQsIDB4MTcsIDB4OTksIDB4MDMsIDB4MjUsIDB4NEYsCisgIDB4 NTEsIDB4N0IsIDB4OUQsIDB4MDcsIDB4ODksIDB4NzMsIDB4OTUsIDB4M0YsCisgIDB4NDEsIDB4 RUIsIDB4MEQsIDB4RjcsIDB4NzksIDB4RTMsIDB4MDUsIDB4MkYsCisgIDB4MzEsIDB4NUIsIDB4 N0QsIDB4RTcsIDB4NjksIDB4NTMsIDB4NzUsIDB4MUYsCisgIDB4MjEsIDB4Q0IsIDB4RUQsIDB4 RDcsIDB4NTksIDB4QzMsIDB4RTUsIDB4MEYsCisgIDB4MTEsIDB4M0IsIDB4NUQsIDB4QzcsIDB4 NDksIDB4MzMsIDB4NTUsIDB4RkYKK307CisKKy8qIENvbXB1dGUgbl4oLTEpIG1vZCBCLCB1c2lu ZyBhIE5ld3RvbiBpdGVyYXRpb24uICAqLworI2RlZmluZSBiaW52KGludixuKSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgXAorICAgIHVpbnRtYXhfdCAgX19uID0gKG4pOyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnRtYXhfdCAgX19pbnY7ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAorICAgIF9faW52ID0gYmludmVydF90YWJsZVsoX19uIC8gMikgJiAweDdGXTsgLyogIDggKi8g ICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChXX1RZUEVfU0laRSA+IDgpICAgX19pbnYgPSAy ICogX19pbnYgLSBfX2ludiAqIF9faW52ICogX19uOyAgICAgXAorICAgIGlmIChXX1RZUEVfU0la RSA+IDE2KSAgX19pbnYgPSAyICogX19pbnYgLSBfX2ludiAqIF9faW52ICogX19uOyAgICAgXAor ICAgIGlmIChXX1RZUEVfU0laRSA+IDMyKSAgX19pbnYgPSAyICogX19pbnYgLSBfX2ludiAqIF9f aW52ICogX19uOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChXX1RZUEVfU0laRSA+ IDY0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAg ICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXAorICAgICAgICBpbnQgIF9faW52Yml0cyA9IDY0OyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkbyB7ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAg ICAgIF9faW52ID0gMiAqIF9faW52IC0gX19pbnYgKiBfX2ludiAqIF9fbjsgICAgICAgICAgICAg ICAgICAgICAgXAorICAgICAgICAgIF9faW52Yml0cyAqPSAyOyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IHdoaWxlIChfX2ludmJpdHMg PCBXX1RZUEVfU0laRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChpbnYpID0gX19pbnY7ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgw KQorCisvKiBxID0gdSAvIGQsIGFzc3VtaW5nIGR8dS4gICovCisjZGVmaW5lIGRpdmV4YWN0XzIx KHExLCBxMCwgdTEsIHUwLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg IGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCisgICAgdWludG1heF90IF9kaSwgX3EwOyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmludiAoX2RpLCAoZCkpOyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg X3EwID0gKHUwKSAqIF9kaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBcCisgICAgaWYgKCh1MSkgPj0gKGQpKSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAg IHVpbnRtYXhfdCBfcDEsIF9wMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCisgICAgICAgIHVtdWxfcHBtbSAoX3AxLCBfcDAsIF9xMCwgZCk7ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChxMSkgPSAoKHUxKSAtIF9wMSkg KiBfZGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChx MCkgPSBfcTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCisgICAgICAgIChxMCkgPSBfcTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChxMSkgPSAwOyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc CisgIH0gd2hpbGUoMCkKKworLyogeCBCIChtb2QgbikuICovCisjZGVmaW5lIHJlZGNpZnkocl9w cmltLCByLCBuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg IGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCisgICAgdWludG1heF90IF9yZWRjaWZ5X3E7ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWRpdl9xcm5uZCAoX3JlZGNp ZnlfcSwgcl9wcmltLCByLCAwLCBuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0g d2hpbGUgKDApCisKKy8qIHggQl4yIChtb2QgbikuIFJlcXVpcmVzIHggPiAwLCBuMSA8IEIvMiAq LworI2RlZmluZSByZWRjaWZ5MihyMSwgcjAsIHgsIG4xLCBuMCkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnRtYXhfdCBfcjEs IF9yMCwgX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor ICAgIGlmICgoeCkgPCAobjEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfcjEgPSAoeCk7IF9y MCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAg ICAgICBfaSA9IFdfVFlQRV9TSVpFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAg eyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAorICAgICAgICBfcjEgPSAwOyBfcjAgPSAoeCk7ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfaSA9IDIqV19UWVBFX1NJWkU7 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAorICAgIHdoaWxlIChfaS0tID4gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsc2gy IChfcjEsIF9yMCwgX3IxLCBfcjAsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgXAorICAgICAgICBpZiAoZ2UyIChfcjEsIF9yMCwgKG4xKSwgKG4wKSkpICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHN1Yl9kZG1tc3MgKF9yMSwgX3IwLCBf cjEsIF9yMCwgKG4xKSwgKG4wKSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAorICAgIChyMSkgPSBfcjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgXAorICAgIChyMCkgPSBfcjA7ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisv KiBNb2R1bGFyIHR3by13b3JkIG11bHRpcGxpY2F0aW9uLCByID0gYSAqIGIgbW9kIG0sIHdpdGgg bWkgPSBtXigtMSkgbW9kIEIuCisgICBCb3RoIGEgYW5kIGIgbXVzdCBiZSBpbiByZWRjIGZvcm0s IHRoZSByZXN1bHQgd2lsbCBiZSBpbiByZWRjIGZvcm0gdG9vLiAqLworc3RhdGljIGlubGluZSB1 aW50bWF4X3QKK211bHJlZGMgKHVpbnRtYXhfdCBhLCB1aW50bWF4X3QgYiwgdWludG1heF90IG0s IHVpbnRtYXhfdCBtaSkKK3sKKyAgdWludG1heF90IHJoLCBybCwgcSwgdGgsIHRsLCB4aDsKKwor ICB1bXVsX3BwbW0gKHJoLCBybCwgYSwgYik7CisgIHEgPSBybCAqIG1pOworICB1bXVsX3BwbW0g KHRoLCB0bCwgcSwgbSk7CisgIHhoID0gcmggLSB0aDsKKyAgaWYgKHJoIDwgdGgpCisgICAgeGgg Kz0gbTsKKworICByZXR1cm4geGg7Cit9CisKKy8qIE1vZHVsYXIgdHdvLXdvcmQgbXVsdGlwbGlj YXRpb24sIHIgPSBhICogYiBtb2QgbSwgd2l0aCBtaSA9IG1eKC0xKSBtb2QgQi4KKyAgIEJvdGgg YSBhbmQgYiBtdXN0IGJlIGluIHJlZGMgZm9ybSwgdGhlIHJlc3VsdCB3aWxsIGJlIGluIHJlZGMg Zm9ybSB0b28uCisgICBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlIG1vc3Qgc2lnbmlmaWNh bnQgYml0IG9mIG0gbXVzdCBiZSBjbGVhci4gKi8KK3N0YXRpYyB1aW50bWF4X3QKK211bHJlZGMy ICh1aW50bWF4X3QgKnIxcCwKKyAgICAgICAgICB1aW50bWF4X3QgYTEsIHVpbnRtYXhfdCBhMCwg dWludG1heF90IGIxLCB1aW50bWF4X3QgYjAsCisgICAgICAgICAgdWludG1heF90IG0xLCB1aW50 bWF4X3QgbTAsIHVpbnRtYXhfdCBtaSkKK3sKKyAgdWludG1heF90IHIxLCByMCwgcSwgcDEsIHAw LCB0MSwgdDAsIHMxLCBzMDsKKyAgbWkgPSAtbWk7CisgIGFzc2VydCAoIChhMSA+PiAoV19UWVBF X1NJWkUgLSAxKSkgPT0gMCk7CisgIGFzc2VydCAoIChiMSA+PiAoV19UWVBFX1NJWkUgLSAxKSkg PT0gMCk7CisgIGFzc2VydCAoIChtMSA+PiAoV19UWVBFX1NJWkUgLSAxKSkgPT0gMCk7CisKKyAg LyogRmlyc3QgY29tcHV0ZSBhMCAqIDxiMSwgYjA+IEJeey0xfQorICAgICAgICArLS0tLS0rCisg ICAgICAgIHxhMCBiMHwKKyAgICAgKy0tKy0tKy0tKworICAgICB8YTAgYjF8CisgICAgICstLSst LSstLSsKKyAgICAgICAgfHEwIG0wfAorICAgICArLS0rLS0rLS0rCisgICAgIHxxMCBtMXwKKyAg ICAtKy0tKy0tKy0tKworICAgICB8cjF8cjB8IDB8CisgICAgICstLSstLSstLSsKKyAgKi8KKyAg dW11bF9wcG1tICh0MSwgdDAsIGEwLCBiMCk7CisgIHVtdWxfcHBtbSAocjEsIHIwLCBhMCwgYjEp OworICBxID0gbWkgKiB0MDsKKyAgdW11bF9wcG1tIChwMSwgcDAsIHEsIG0wKTsKKyAgdW11bF9w cG1tIChzMSwgczAsIHEsIG0xKTsKKyAgcjAgKz0gKHQwICE9IDApOyAvKiBDYXJyeSAqLworICBh ZGRfc3NhYWFhIChyMSwgcjAsIHIxLCByMCwgMCwgcDEpOworICBhZGRfc3NhYWFhIChyMSwgcjAs IHIxLCByMCwgMCwgdDEpOworICBhZGRfc3NhYWFhIChyMSwgcjAsIHIxLCByMCwgczEsIHMwKTsK KworICAvKiBOZXh0LCAoYTEgKiA8YjEsIGIwPiArIDxyMSwgcjA+IEJeey0xfQorICAgICAgICAr LS0tLS0rCisgICAgICAgIHxhMSBiMHwKKyAgICAgICAgKy0tKy0tKworICAgICAgICB8cjF8cjB8 CisgICAgICstLSstLSstLSsKKyAgICAgfGExIGIxfAorICAgICArLS0rLS0rLS0rCisgICAgICAg IHxxMSBtMHwKKyAgICAgKy0tKy0tKy0tKworICAgICB8cTEgbTF8CisgICAgLSstLSstLSstLSsK KyAgICAgfHIxfHIwfCAwfAorICAgICArLS0rLS0rLS0rCisgICovCisgIHVtdWxfcHBtbSAodDEs IHQwLCBhMSwgYjApOworICB1bXVsX3BwbW0gKHMxLCBzMCwgYTEsIGIxKTsKKyAgYWRkX3NzYWFh YSAodDEsIHQwLCB0MSwgdDAsIDAsIHIwKTsKKyAgcSA9IG1pICogdDA7CisgIGFkZF9zc2FhYWEg KHIxLCByMCwgczEsIHMwLCAwLCByMSk7CisgIHVtdWxfcHBtbSAocDEsIHAwLCBxLCBtMCk7Cisg IHVtdWxfcHBtbSAoczEsIHMwLCBxLCBtMSk7CisgIHIwICs9ICh0MCAhPSAwKTsgLyogQ2Fycnkg Ki8KKyAgYWRkX3NzYWFhYSAocjEsIHIwLCByMSwgcjAsIDAsIHAxKTsKKyAgYWRkX3NzYWFhYSAo cjEsIHIwLCByMSwgcjAsIDAsIHQxKTsKKyAgYWRkX3NzYWFhYSAocjEsIHIwLCByMSwgcjAsIHMx LCBzMCk7CisKKyAgaWYgKGdlMiAocjEsIHIwLCBtMSwgbTApKQorICAgIHN1Yl9kZG1tc3MgKHIx LCByMCwgcjEsIHIwLCBtMSwgbTApOworCisgICpyMXAgPSByMTsKKyAgcmV0dXJuIHIwOworfQor CitzdGF0aWMgdWludG1heF90IF9HTF9BVFRSSUJVVEVfQ09OU1QKK3Bvd20gKHVpbnRtYXhfdCBi LCB1aW50bWF4X3QgZSwgdWludG1heF90IG4sIHVpbnRtYXhfdCBuaSwgdWludG1heF90IG9uZSkK K3sKKyAgdWludG1heF90IHkgPSBvbmU7CisKKyAgaWYgKGUgJiAxKQorICAgIHkgPSBiOworCisg IHdoaWxlIChlICE9IDApCisgICAgeworICAgICAgYiA9IG11bHJlZGMgKGIsIGIsIG4sIG5pKTsK KyAgICAgIGUgPj49IDE7CisKKyAgICAgIGlmIChlICYgMSkKKyAgICAgICAgeSA9IG11bHJlZGMg KHksIGIsIG4sIG5pKTsKKyAgICB9CisKKyAgcmV0dXJuIHk7Cit9CisKK3N0YXRpYyB1aW50bWF4 X3QKK3Bvd20yICh1aW50bWF4X3QgKnIxbSwKKyAgICAgICBjb25zdCB1aW50bWF4X3QgKmJwLCBj b25zdCB1aW50bWF4X3QgKmVwLCBjb25zdCB1aW50bWF4X3QgKm5wLAorICAgICAgIHVpbnRtYXhf dCBuaSwgY29uc3QgdWludG1heF90ICpvbmUpCit7CisgIHVpbnRtYXhfdCByMSwgcjAsIGIxLCBi MCwgbjEsIG4wOworICB1bnNpZ25lZCBpbnQgaTsKKyAgdWludG1heF90IGU7CisKKyAgYjAgPSBi cFswXTsKKyAgYjEgPSBicFsxXTsKKyAgbjAgPSBucFswXTsKKyAgbjEgPSBucFsxXTsKKworICBy MCA9IG9uZVswXTsKKyAgcjEgPSBvbmVbMV07CisKKyAgZm9yIChlID0gZXBbMF0sIGkgPSBXX1RZ UEVfU0laRTsgaSA+IDA7IGktLSwgZSA+Pj0gMSkKKyAgICB7CisgICAgICBpZiAoZSAmIDEpCisg ICAgICAgIHsKKyAgICAgICAgICByMCA9IG11bHJlZGMyIChyMW0sIHIxLCByMCwgYjEsIGIwLCBu MSwgbjAsIG5pKTsKKyAgICAgICAgICByMSA9ICpyMW07CisgICAgICAgIH0KKyAgICAgIGIwID0g bXVscmVkYzIgKHIxbSwgYjEsIGIwLCBiMSwgYjAsIG4xLCBuMCwgbmkpOworICAgICAgYjEgPSAq cjFtOworICAgIH0KKyAgZm9yIChlID0gZXBbMV07IGUgPiAwOyBlID4+PSAxKQorICAgIHsKKyAg ICAgIGlmIChlICYgMSkKKyAgICAgICAgeworICAgICAgICAgIHIwID0gbXVscmVkYzIgKHIxbSwg cjEsIHIwLCBiMSwgYjAsIG4xLCBuMCwgbmkpOworICAgICAgICAgIHIxID0gKnIxbTsKKyAgICAg ICAgfQorICAgICAgYjAgPSBtdWxyZWRjMiAocjFtLCBiMSwgYjAsIGIxLCBiMCwgbjEsIG4wLCBu aSk7CisgICAgICBiMSA9ICpyMW07CisgICAgfQorICAqcjFtID0gcjE7CisgIHJldHVybiByMDsK K30KKworc3RhdGljIGJvb2wgX0dMX0FUVFJJQlVURV9DT05TVAorbWlsbGVycmFiaW4gKHVpbnRt YXhfdCBuLCB1aW50bWF4X3QgbmksIHVpbnRtYXhfdCBiLCB1aW50bWF4X3QgcSwKKyAgICAgICAg ICAgICB1bnNpZ25lZCBpbnQgaywgdWludG1heF90IG9uZSkKK3sKKyAgdWludG1heF90IHkgPSBw b3dtIChiLCBxLCBuLCBuaSwgb25lKTsKKworICB1aW50bWF4X3Qgbm0xID0gbiAtIG9uZTsgICAg ICAvKiAtMSwgYnV0IGluIHJlZGMgcmVwcmVzZW50YXRpb24uICovCisKKyAgaWYgKHkgPT0gb25l IHx8IHkgPT0gbm0xKQorICAgIHJldHVybiB0cnVlOworCisgIGZvciAodW5zaWduZWQgaW50IGkg PSAxOyBpIDwgazsgaSsrKQorICAgIHsKKyAgICAgIHkgPSBtdWxyZWRjICh5LCB5LCBuLCBuaSk7 CisKKyAgICAgIGlmICh5ID09IG5tMSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBpZiAo eSA9PSBvbmUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIHJldHVybiBmYWxzZTsK K30KKworc3RhdGljIGJvb2wKK21pbGxlcnJhYmluMiAoY29uc3QgdWludG1heF90ICpucCwgdWlu dG1heF90IG5pLCBjb25zdCB1aW50bWF4X3QgKmJwLAorICAgICAgICAgICAgICBjb25zdCB1aW50 bWF4X3QgKnFwLCB1bnNpZ25lZCBpbnQgaywgY29uc3QgdWludG1heF90ICpvbmUpCit7CisgIHVp bnRtYXhfdCB5MSwgeTAsIG5tMV8xLCBubTFfMCwgcjFtOworCisgIHkwID0gcG93bTIgKCZyMW0s IGJwLCBxcCwgbnAsIG5pLCBvbmUpOworICB5MSA9IHIxbTsKKworICBpZiAoeTAgPT0gb25lWzBd ICYmIHkxID09IG9uZVsxXSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBzdWJfZGRtbXNzIChubTFf MSwgbm0xXzAsIG5wWzFdLCBucFswXSwgb25lWzFdLCBvbmVbMF0pOworCisgIGlmICh5MCA9PSBu bTFfMCAmJiB5MSA9PSBubTFfMSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBmb3IgKHVuc2lnbmVk IGludCBpID0gMTsgaSA8IGs7IGkrKykKKyAgICB7CisgICAgICB5MCA9IG11bHJlZGMyICgmcjFt LCB5MSwgeTAsIHkxLCB5MCwgbnBbMV0sIG5wWzBdLCBuaSk7CisgICAgICB5MSA9IHIxbTsKKwor ICAgICAgaWYgKHkwID09IG5tMV8wICYmIHkxID09IG5tMV8xKQorICAgICAgICByZXR1cm4gdHJ1 ZTsKKyAgICAgIGlmICh5MCA9PSBvbmVbMF0gJiYgeTEgPT0gb25lWzFdKQorICAgICAgICByZXR1 cm4gZmFsc2U7CisgICAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKyNpZiBIQVZFX0dNUAorc3Rh dGljIGJvb2wKK21wX21pbGxlcnJhYmluIChtcHpfc3JjcHRyIG4sIG1wel9zcmNwdHIgbm0xLCBt cHpfcHRyIHgsIG1wel9wdHIgeSwKKyAgICAgICAgICAgICAgICBtcHpfc3JjcHRyIHEsIHVuc2ln bmVkIGxvbmcgaW50IGspCit7CisgIG1wel9wb3dtICh5LCB4LCBxLCBuKTsKKworICBpZiAobXB6 X2NtcF91aSAoeSwgMSkgPT0gMCB8fCBtcHpfY21wICh5LCBubTEpID09IDApCisgICAgcmV0dXJu IHRydWU7CisKKyAgZm9yICh1bnNpZ25lZCBsb25nIGludCBpID0gMTsgaSA8IGs7IGkrKykKKyAg ICB7CisgICAgICBtcHpfcG93bV91aSAoeSwgeSwgMiwgbik7CisgICAgICBpZiAobXB6X2NtcCAo eSwgbm0xKSA9PSAwKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChtcHpfY21wX3Vp ICh5LCAxKSA9PSAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICByZXR1cm4gZmFs c2U7Cit9CisjZW5kaWYKKworLyogTHVjYXMnIHByaW1lIHRlc3QuICBUaGUgbnVtYmVyIG9mIGl0 ZXJhdGlvbnMgdmFyeSBncmVhdGx5LCB1cCB0byBhIGZldyBkb3plbgorICAgaGF2ZSBiZWVuIG9i c2VydmVkLiAgVGhlIGF2ZXJhZ2Ugc2VlbSB0byBiZSBhYm91dCAyLiAgKi8KK3N0YXRpYyBib29s CitwcmltZV9wICh1aW50bWF4X3QgbikKK3sKKyAgaW50IGs7CisgIGJvb2wgaXNfcHJpbWU7Cisg IHVpbnRtYXhfdCBhX3ByaW0sIG9uZSwgbmk7CisgIHN0cnVjdCBmYWN0b3JzIGZhY3RvcnM7CisK KyAgaWYgKG4gPD0gMSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogV2UgaGF2ZSBhbHJlYWR5 IGNhc3RlZCBvdXQgc21hbGwgcHJpbWVzLiAqLworICBpZiAobiA8ICh1aW50bWF4X3QpIEZJUlNU X09NSVRURURfUFJJTUUgKiBGSVJTVF9PTUlUVEVEX1BSSU1FKQorICAgIHJldHVybiB0cnVlOwor CisgIC8qIFByZWNvbXB1dGF0aW9uIGZvciBNaWxsZXItUmFiaW4uICAqLworICB1aW50bWF4X3Qg cSA9IG4gLSAxOworICBmb3IgKGsgPSAwOyAocSAmIDEpID09IDA7IGsrKykKKyAgICBxID4+PSAx OworCisgIHVpbnRtYXhfdCBhID0gMjsKKyAgYmludiAobmksIG4pOyAgICAgICAgICAgICAgICAg LyogbmkgPC0gMS9uIG1vZCBCICovCisgIHJlZGNpZnkgKG9uZSwgMSwgbik7CisgIGFkZG1vZCAo YV9wcmltLCBvbmUsIG9uZSwgbik7IC8qIGkuZS4sIHJlZGNpZnkgYSA9IDIgKi8KKworICAvKiBQ ZXJmb3JtIGEgTWlsbGVyLVJhYmluIHRlc3QsIGZpbmRzIG1vc3QgY29tcG9zaXRlcyBxdWlja2x5 LiAgKi8KKyAgaWYgKCFtaWxsZXJyYWJpbiAobiwgbmksIGFfcHJpbSwgcSwgaywgb25lKSkKKyAg ICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGZsYWdfcHJvdmVfcHJpbWFsaXR5KQorICAgIHsKKyAg ICAgIC8qIEZhY3RvciBuLTEgZm9yIEx1Y2FzLiAgKi8KKyAgICAgIGZhY3RvciAoMCwgbiAtIDEs ICZmYWN0b3JzKTsKKyAgICB9CisKKyAgLyogTG9vcCB1bnRpbCBMdWNhcyBwcm92ZXMgb3VyIG51 bWJlciBwcmltZSwgb3IgTWlsbGVyLVJhYmluIHByb3ZlcyBvdXIKKyAgICAgbnVtYmVyIGNvbXBv c2l0ZS4gICovCisgIGZvciAodW5zaWduZWQgaW50IHIgPSAwOyByIDwgUFJJTUVTX1BUQUJfRU5U UklFUzsgcisrKQorICAgIHsKKyAgICAgIGlmIChmbGFnX3Byb3ZlX3ByaW1hbGl0eSkKKyAgICAg ICAgeworICAgICAgICAgIGlzX3ByaW1lID0gdHJ1ZTsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVk IGludCBpID0gMDsgaSA8IGZhY3RvcnMubmZhY3RvcnMgJiYgaXNfcHJpbWU7IGkrKykKKyAgICAg ICAgICAgIHsKKyAgICAgICAgICAgICAgaXNfcHJpbWUgPSBwb3dtIChhX3ByaW0sIChuIC0gMSkg LyBmYWN0b3JzLnBbaV0sIG4sIG5pLCBvbmUpICE9IG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAg ICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogQWZ0ZXIgZW5vdWdoIE1p bGxlci1SYWJpbiBydW5zLCBiZSBjb250ZW50LiAqLworICAgICAgICAgIGlzX3ByaW1lID0gKHIg PT0gTVJfUkVQUyAtIDEpOworICAgICAgICB9CisKKyAgICAgIGlmIChpc19wcmltZSkKKyAgICAg ICAgcmV0dXJuIHRydWU7CisKKyAgICAgIGEgKz0gcHJpbWVzX2RpZmZbcl07ICAgICAgLyogRXN0 YWJsaXNoIG5ldyBiYXNlLiAgKi8KKworICAgICAgLyogVGhlIGZvbGxvd2luZyBpcyBlcXVpdmFs ZW50IHRvIHJlZGNpZnkgKGFfcHJpbSwgYSwgbikuICBJdCBydW5zIGZhc3RlcgorICAgICAgICAg b24gbW9zdCBwcm9jZXNzb3JzLCBzaW5jZSBpdCBhdm9pZHMgdWRpdl9xcm5uZC4gIElmIHdlIGdv IGRvd24gdGhlCisgICAgICAgICB1ZGl2X3Fybm5kX3ByZWludiBwYXRoLCB0aGlzIGNvZGUgc2hv dWxkIGJlIHJlcGxhY2VkLiAgKi8KKyAgICAgIHsKKyAgICAgICAgdWludG1heF90IGR1bW15LCBz MSwgczA7CisgICAgICAgIHVtdWxfcHBtbSAoczEsIHMwLCBvbmUsIGEpOworICAgICAgICBpZiAo TElLRUxZIChzMSA9PSAwKSkKKyAgICAgICAgICBhX3ByaW0gPSBzMCAlIG47CisgICAgICAgIGVs c2UKKyAgICAgICAgICB1ZGl2X3Fybm5kIChkdW1teSwgYV9wcmltLCBzMSwgczAsIG4pOworICAg ICAgfQorCisgICAgICBpZiAoIW1pbGxlcnJhYmluIChuLCBuaSwgYV9wcmltLCBxLCBrLCBvbmUp KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGZwcmludGYgKHN0ZGVyciwgIkx1 Y2FzIHByaW1lIHRlc3QgZmFpbHVyZS4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW5cbiIpOworICBh Ym9ydCAoKTsKK30KKworc3RhdGljIGJvb2wKK3ByaW1lMl9wICh1aW50bWF4X3QgbjEsIHVpbnRt YXhfdCBuMCkKK3sKKyAgdWludG1heF90IHFbMl0sIG5tMVsyXTsKKyAgdWludG1heF90IGFfcHJp bVsyXTsKKyAgdWludG1heF90IG9uZVsyXTsKKyAgdWludG1heF90IG5hWzJdOworICB1aW50bWF4 X3Qgbmk7CisgIHVuc2lnbmVkIGludCBrOworICBzdHJ1Y3QgZmFjdG9ycyBmYWN0b3JzOworCisg IGlmIChuMSA9PSAwKQorICAgIHJldHVybiBwcmltZV9wIChuMCk7CisKKyAgbm0xWzFdID0gbjEg LSAobjAgPT0gMCk7CisgIG5tMVswXSA9IG4wIC0gMTsKKyAgaWYgKG5tMVswXSA9PSAwKQorICAg IHsKKyAgICAgIGNvdW50X3RyYWlsaW5nX3plcm9zIChrLCBubTFbMV0pOworCisgICAgICBxWzBd ID0gbm0xWzFdID4+IGs7CisgICAgICBxWzFdID0gMDsKKyAgICAgIGsgKz0gV19UWVBFX1NJWkU7 CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY291bnRfdHJhaWxpbmdfemVyb3MgKGssIG5t MVswXSk7CisgICAgICByc2gyIChxWzFdLCBxWzBdLCBubTFbMV0sIG5tMVswXSwgayk7CisgICAg fQorCisgIHVpbnRtYXhfdCBhID0gMjsKKyAgYmludiAobmksIG4wKTsKKyAgcmVkY2lmeTIgKG9u ZVsxXSwgb25lWzBdLCAxLCBuMSwgbjApOworICBhZGRtb2QyIChhX3ByaW1bMV0sIGFfcHJpbVsw XSwgb25lWzFdLCBvbmVbMF0sIG9uZVsxXSwgb25lWzBdLCBuMSwgbjApOworCisgIC8qIEZJWE1F OiBVc2Ugc2NhbGFycyBvciBwb2ludGVycyBpbiBhcmd1bWVudHM/IFNvbWUgY29uc2lzdGVuY3kg bmVlZGVkLiAqLworICBuYVswXSA9IG4wOworICBuYVsxXSA9IG4xOworCisgIGlmICghbWlsbGVy cmFiaW4yIChuYSwgbmksIGFfcHJpbSwgcSwgaywgb25lKSkKKyAgICByZXR1cm4gZmFsc2U7CisK KyAgaWYgKGZsYWdfcHJvdmVfcHJpbWFsaXR5KQorICAgIHsKKyAgICAgIC8qIEZhY3RvciBuLTEg Zm9yIEx1Y2FzLiAgKi8KKyAgICAgIGZhY3RvciAobm0xWzFdLCBubTFbMF0sICZmYWN0b3JzKTsK KyAgICB9CisKKyAgLyogTG9vcCB1bnRpbCBMdWNhcyBwcm92ZXMgb3VyIG51bWJlciBwcmltZSwg b3IgTWlsbGVyLVJhYmluIHByb3ZlcyBvdXIKKyAgICAgbnVtYmVyIGNvbXBvc2l0ZS4gICovCisg IGZvciAodW5zaWduZWQgaW50IHIgPSAwOyByIDwgUFJJTUVTX1BUQUJfRU5UUklFUzsgcisrKQor ICAgIHsKKyAgICAgIGJvb2wgaXNfcHJpbWU7CisgICAgICB1aW50bWF4X3QgZVsyXSwgeVsyXTsK KworICAgICAgaWYgKGZsYWdfcHJvdmVfcHJpbWFsaXR5KQorICAgICAgICB7CisgICAgICAgICAg aXNfcHJpbWUgPSB0cnVlOworICAgICAgICAgIGlmIChmYWN0b3JzLnBsYXJnZVsxXSkKKyAgICAg ICAgICAgIHsKKyAgICAgICAgICAgICAgdWludG1heF90IHBpOworICAgICAgICAgICAgICBiaW52 IChwaSwgZmFjdG9ycy5wbGFyZ2VbMF0pOworICAgICAgICAgICAgICBlWzBdID0gcGkgKiBubTFb MF07CisgICAgICAgICAgICAgIGVbMV0gPSAwOworICAgICAgICAgICAgICB5WzBdID0gcG93bTIg KCZ5WzFdLCBhX3ByaW0sIGUsIG5hLCBuaSwgb25lKTsKKyAgICAgICAgICAgICAgaXNfcHJpbWUg PSAoeVswXSAhPSBvbmVbMF0gfHwgeVsxXSAhPSBvbmVbMV0pOworICAgICAgICAgICAgfQorICAg ICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgZmFjdG9ycy5uZmFjdG9ycyAmJiBp c19wcmltZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBGSVhNRTogV2Ug YWx3YXlzIGhhdmUgdGhlIGZhY3RvciAyLiBEbyB3ZSByZWFsbHkgbmVlZCB0byBoYW5kbGUgaXQK KyAgICAgICAgICAgICAgICAgaGVyZT8gV2UgaGF2ZSBkb25lIHRoZSBzYW1lIHBvd2VyaW5nIGFz IHBhcnQgb2YgbWlsbGVycmFiaW4uICovCisgICAgICAgICAgICAgIGlmIChmYWN0b3JzLnBbaV0g PT0gMikKKyAgICAgICAgICAgICAgICByc2gyIChlWzFdLCBlWzBdLCBubTFbMV0sIG5tMVswXSwg MSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkaXZleGFjdF8yMSAoZVsx XSwgZVswXSwgbm0xWzFdLCBubTFbMF0sIGZhY3RvcnMucFtpXSk7CisgICAgICAgICAgICAgIHlb MF0gPSBwb3dtMiAoJnlbMV0sIGFfcHJpbSwgZSwgbmEsIG5pLCBvbmUpOworICAgICAgICAgICAg ICBpc19wcmltZSA9ICh5WzBdICE9IG9uZVswXSB8fCB5WzFdICE9IG9uZVsxXSk7CisgICAgICAg ICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIEFm dGVyIGVub3VnaCBNaWxsZXItUmFiaW4gcnVucywgYmUgY29udGVudC4gKi8KKyAgICAgICAgICBp c19wcmltZSA9IChyID09IE1SX1JFUFMgLSAxKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoaXNf cHJpbWUpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBhICs9IHByaW1lc19kaWZmW3Jd OyAgICAgIC8qIEVzdGFibGlzaCBuZXcgYmFzZS4gICovCisgICAgICByZWRjaWZ5MiAoYV9wcmlt WzFdLCBhX3ByaW1bMF0sIGEsIG4xLCBuMCk7CisKKyAgICAgIGlmICghbWlsbGVycmFiaW4yIChu YSwgbmksIGFfcHJpbSwgcSwgaywgb25lKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K KworICBmcHJpbnRmIChzdGRlcnIsICJMdWNhcyBwcmltZSB0ZXN0IGZhaWx1cmUuICBUaGlzIHNo b3VsZCBub3QgaGFwcGVuXG4iKTsKKyAgYWJvcnQgKCk7Cit9CisKKyNpZiBIQVZFX0dNUAorc3Rh dGljIGJvb2wKK21wX3ByaW1lX3AgKG1wel90IG4pCit7CisgIGJvb2wgaXNfcHJpbWU7CisgIG1w el90IHEsIGEsIG5tMSwgdG1wOworICBzdHJ1Y3QgbXBfZmFjdG9ycyBmYWN0b3JzOworCisgIGlm IChtcHpfY21wX3VpIChuLCAxKSA8PSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBXZSBo YXZlIGFscmVhZHkgY2FzdGVkIG91dCBzbWFsbCBwcmltZXMuICovCisgIGlmIChtcHpfY21wX3Vp IChuLCAobG9uZykgRklSU1RfT01JVFRFRF9QUklNRSAqIEZJUlNUX09NSVRURURfUFJJTUUpIDwg MCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBtcHpfaW5pdHMgKHEsIGEsIG5tMSwgdG1wLCBOVUxM KTsKKworICAvKiBQcmVjb21wdXRhdGlvbiBmb3IgTWlsbGVyLVJhYmluLiAgKi8KKyAgbXB6X3N1 Yl91aSAobm0xLCBuLCAxKTsKKworICAvKiBGaW5kIHEgYW5kIGssIHdoZXJlIHEgaXMgb2RkIGFu ZCBuID0gMSArIDIqKmsgKiBxLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgayA9IG1wel9zY2Fu MSAobm0xLCAwKTsKKyAgbXB6X3RkaXZfcV8yZXhwIChxLCBubTEsIGspOworCisgIG1wel9zZXRf dWkgKGEsIDIpOworCisgIC8qIFBlcmZvcm0gYSBNaWxsZXItUmFiaW4gdGVzdCwgZmluZHMgbW9z dCBjb21wb3NpdGVzIHF1aWNrbHkuICAqLworICBpZiAoIW1wX21pbGxlcnJhYmluIChuLCBubTEs IGEsIHRtcCwgcSwgaykpCisgICAgeworICAgICAgaXNfcHJpbWUgPSBmYWxzZTsKKyAgICAgIGdv dG8gcmV0MjsKKyAgICB9CisKKyAgaWYgKGZsYWdfcHJvdmVfcHJpbWFsaXR5KQorICAgIHsKKyAg ICAgIC8qIEZhY3RvciBuLTEgZm9yIEx1Y2FzLiAgKi8KKyAgICAgIG1wel9zZXQgKHRtcCwgbm0x KTsKKyAgICAgIG1wX2ZhY3RvciAodG1wLCAmZmFjdG9ycyk7CisgICAgfQorCisgIC8qIExvb3Ag dW50aWwgTHVjYXMgcHJvdmVzIG91ciBudW1iZXIgcHJpbWUsIG9yIE1pbGxlci1SYWJpbiBwcm92 ZXMgb3VyCisgICAgIG51bWJlciBjb21wb3NpdGUuICAqLworICBmb3IgKHVuc2lnbmVkIGludCBy ID0gMDsgciA8IFBSSU1FU19QVEFCX0VOVFJJRVM7IHIrKykKKyAgICB7CisgICAgICBpZiAoZmxh Z19wcm92ZV9wcmltYWxpdHkpCisgICAgICAgIHsKKyAgICAgICAgICBpc19wcmltZSA9IHRydWU7 CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBsb25nIGludCBpID0gMDsgaSA8IGZhY3RvcnMubmZh Y3RvcnMgJiYgaXNfcHJpbWU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbXB6 X2RpdmV4YWN0ICh0bXAsIG5tMSwgZmFjdG9ycy5wW2ldKTsKKyAgICAgICAgICAgICAgbXB6X3Bv d20gKHRtcCwgYSwgdG1wLCBuKTsKKyAgICAgICAgICAgICAgaXNfcHJpbWUgPSBtcHpfY21wX3Vp ICh0bXAsIDEpICE9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAg ICAgICAgeworICAgICAgICAgIC8qIEFmdGVyIGVub3VnaCBNaWxsZXItUmFiaW4gcnVucywgYmUg Y29udGVudC4gKi8KKyAgICAgICAgICBpc19wcmltZSA9IChyID09IE1SX1JFUFMgLSAxKTsKKyAg ICAgICAgfQorCisgICAgICBpZiAoaXNfcHJpbWUpCisgICAgICAgIGdvdG8gcmV0MTsKKworICAg ICAgbXB6X2FkZF91aSAoYSwgYSwgcHJpbWVzX2RpZmZbcl0pOyAgICAgICAgLyogRXN0YWJsaXNo IG5ldyBiYXNlLiAgKi8KKworICAgICAgaWYgKCFtcF9taWxsZXJyYWJpbiAobiwgbm0xLCBhLCB0 bXAsIHEsIGspKQorICAgICAgICB7CisgICAgICAgICAgaXNfcHJpbWUgPSBmYWxzZTsKKyAgICAg ICAgICBnb3RvIHJldDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgZnByaW50ZiAoc3RkZXJyLCAi THVjYXMgcHJpbWUgdGVzdCBmYWlsdXJlLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlblxuIik7Cisg IGFib3J0ICgpOworCisgcmV0MToKKyAgaWYgKGZsYWdfcHJvdmVfcHJpbWFsaXR5KQorICAgIG1w X2ZhY3Rvcl9jbGVhciAoJmZhY3RvcnMpOworIHJldDI6CisgIG1wel9jbGVhcnMgKHEsIGEsIG5t MSwgdG1wLCBOVUxMKTsKKworICByZXR1cm4gaXNfcHJpbWU7Cit9CisjZW5kaWYKKworc3RhdGlj IHZvaWQKK2ZhY3Rvcl91c2luZ19wb2xsYXJkX3JobyAodWludG1heF90IG4sIHVuc2lnbmVkIGxv bmcgaW50IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmYWN0b3JzICpmYWN0 b3JzKQoreworICB1aW50bWF4X3QgeCwgeiwgeSwgUCwgdCwgbmksIGc7CisKKyAgdW5zaWduZWQg bG9uZyBpbnQgayA9IDE7CisgIHVuc2lnbmVkIGxvbmcgaW50IGwgPSAxOworCisgIHJlZGNpZnkg KFAsIDEsIG4pOworICBhZGRtb2QgKHgsIFAsIFAsIG4pOyAgICAgICAgICAvKiBpLmUuLCByZWRj aWZ5KDIpICovCisgIHkgPSB6ID0geDsKKworICB3aGlsZSAobiAhPSAxKQorICAgIHsKKyAgICAg IGFzc2VydCAoYSA8IG4pOworCisgICAgICBiaW52IChuaSwgbik7ICAgICAgICAgICAgIC8qIEZJ WE1FOiB3aGVuIGNvdWxkIHdlIHVzZSBvbGQgJ25pJyB2YWx1ZT8gKi8KKworICAgICAgZm9yICg7 OykKKyAgICAgICAgeworICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAg IHggPSBtdWxyZWRjICh4LCB4LCBuLCBuaSk7CisgICAgICAgICAgICAgIGFkZG1vZCAoeCwgeCwg YSwgbik7CisKKyAgICAgICAgICAgICAgc3VibW9kICh0LCB6LCB4LCBuKTsKKyAgICAgICAgICAg ICAgUCA9IG11bHJlZGMgKFAsIHQsIG4sIG5pKTsKKworICAgICAgICAgICAgICBpZiAoayAlIDMy ID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKGdjZF9vZGQg KFAsIG4pICE9IDEpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFjdG9yX2ZvdW5kOworICAg ICAgICAgICAgICAgICAgeSA9IHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQor ICAgICAgICAgIHdoaWxlICgtLWsgIT0gMCk7CisKKyAgICAgICAgICB6ID0geDsKKyAgICAgICAg ICBrID0gbDsKKyAgICAgICAgICBsID0gMiAqIGw7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBs b25nIGludCBpID0gMDsgaSA8IGs7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAg eCA9IG11bHJlZGMgKHgsIHgsIG4sIG5pKTsKKyAgICAgICAgICAgICAgYWRkbW9kICh4LCB4LCBh LCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB5ID0geDsKKyAgICAgICAgfQorCisgICAg ZmFjdG9yX2ZvdW5kOgorICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgIHkgPSBtdWxyZWRj ICh5LCB5LCBuLCBuaSk7CisgICAgICAgICAgYWRkbW9kICh5LCB5LCBhLCBuKTsKKworICAgICAg ICAgIHN1Ym1vZCAodCwgeiwgeSwgbik7CisgICAgICAgICAgZyA9IGdjZF9vZGQgKHQsIG4pOwor ICAgICAgICB9CisgICAgICB3aGlsZSAoZyA9PSAxKTsKKworICAgICAgbiA9IG4gLyBnOworCisg ICAgICBpZiAoIXByaW1lX3AgKGcpKQorICAgICAgICBmYWN0b3JfdXNpbmdfcG9sbGFyZF9yaG8g KGcsIGEgKyAxLCBmYWN0b3JzKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZmFjdG9yX2luc2VydCAo ZmFjdG9ycywgZyk7CisKKyAgICAgIGlmIChwcmltZV9wIChuKSkKKyAgICAgICAgeworICAgICAg ICAgIGZhY3Rvcl9pbnNlcnQgKGZhY3RvcnMsIG4pOworICAgICAgICAgIGJyZWFrOworICAgICAg ICB9Cgotc3RhdGljIHZvaWQKLWRlYnVnIChjaGFyIGNvbnN0ICpmbXQsIC4uLikKLXsKLSAgaWYg KHZlcmJvc2UpCi0gICAgewotICAgICAgdmFfbGlzdCBhcDsKLSAgICAgIHZhX3N0YXJ0IChhcCwg Zm10KTsKLSAgICAgIHZmcHJpbnRmIChzdGRlcnIsIGZtdCwgYXApOwotICAgICAgdmFfZW5kIChh cCk7CisgICAgICB4ID0geCAlIG47CisgICAgICB6ID0geiAlIG47CisgICAgICB5ID0geSAlIG47 CiAgICAgfQogfQoKIHN0YXRpYyB2b2lkCi1lbWl0X2ZhY3RvciAobXB6X3QgbikKK2ZhY3Rvcl91 c2luZ19wb2xsYXJkX3JobzIgKHVpbnRtYXhfdCBuMSwgdWludG1heF90IG4wLCB1bnNpZ25lZCBs b25nIGludCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZhY3RvcnMgKmZh Y3RvcnMpCiB7Ci0gIGlmIChuZmFjdG9yc19mb3VuZCA9PSBuZmFjdG9yc19hbGxvY2F0ZWQpCi0g ICAgZmFjdG9yID0gWDJOUkVBTExPQyAoZmFjdG9yLCAmbmZhY3RvcnNfYWxsb2NhdGVkKTsKLSAg bXB6X2luaXQgKGZhY3RvcltuZmFjdG9yc19mb3VuZF0pOwotICBtcHpfc2V0IChmYWN0b3JbbmZh Y3RvcnNfZm91bmRdLCBuKTsKLSAgKytuZmFjdG9yc19mb3VuZDsKLX0KKyAgdWludG1heF90IHgx LCB4MCwgejEsIHowLCB5MSwgeTAsIFAxLCBQMCwgdDEsIHQwLCBuaSwgZzEsIGcwLCByMW07Cgot c3RhdGljIHZvaWQKLWVtaXRfdWxfZmFjdG9yICh1bnNpZ25lZCBsb25nIGludCBpKQotewotICBt cHpfdCB0OwotICBtcHpfaW5pdCAodCk7Ci0gIG1wel9zZXRfdWkgKHQsIGkpOwotICBlbWl0X2Zh Y3RvciAodCk7Ci0gIG1wel9jbGVhciAodCk7Ci19CisgIHVuc2lnbmVkIGxvbmcgaW50IGsgPSAx OworICB1bnNpZ25lZCBsb25nIGludCBsID0gMTsKCi1zdGF0aWMgdm9pZAotZmFjdG9yX3VzaW5n X2RpdmlzaW9uIChtcHpfdCB0LCB1bnNpZ25lZCBpbnQgbGltaXQpCi17Ci0gIG1wel90IHEsIHI7 Ci0gIHVuc2lnbmVkIGxvbmcgaW50IGY7Ci0gIGludCBhaTsKLSAgc3RhdGljIHVuc2lnbmVkIGlu dCBjb25zdCBhZGRbXSA9IHs0LCAyLCA0LCAyLCA0LCA2LCAyLCA2fTsKLSAgdW5zaWduZWQgaW50 IGNvbnN0ICphZGR2ID0gYWRkOwotICB1bnNpZ25lZCBpbnQgZmFpbHVyZXM7CisgIHJlZGNpZnky IChQMSwgUDAsIDEsIG4xLCBuMCk7CisgIGFkZG1vZDIgKHgxLCB4MCwgUDEsIFAwLCBQMSwgUDAs IG4xLCBuMCk7IC8qIGkuZS4sIHJlZGNpZnkoMikgKi8KKyAgeTEgPSB6MSA9IHgxOworICB5MCA9 IHowID0geDA7CgotICBkZWJ1ZyAoIlt0cmlhbCBkaXZpc2lvbiAoJXUpXSAiLCBsaW1pdCk7Cisg IHdoaWxlIChuMSAhPSAwIHx8IG4wICE9IDEpCisgICAgeworICAgICAgYmludiAobmksIG4wKTsK Ci0gIG1wel9pbml0IChxKTsKLSAgbXB6X2luaXQgKHIpOworICAgICAgZm9yICg7OykKKyAgICAg ICAgeworICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHgwID0gbXVs cmVkYzIgKCZyMW0sIHgxLCB4MCwgeDEsIHgwLCBuMSwgbjAsIG5pKTsKKyAgICAgICAgICAgICAg eDEgPSByMW07CisgICAgICAgICAgICAgIGFkZG1vZDIgKHgxLCB4MCwgeDEsIHgwLCAwLCBhLCBu MSwgbjApOworCisgICAgICAgICAgICAgIHN1Ym1vZDIgKHQxLCB0MCwgejEsIHowLCB4MSwgeDAs IG4xLCBuMCk7CisgICAgICAgICAgICAgIFAwID0gbXVscmVkYzIgKCZyMW0sIFAxLCBQMCwgdDEs IHQwLCBuMSwgbjAsIG5pKTsKKyAgICAgICAgICAgICAgUDEgPSByMW07CisKKyAgICAgICAgICAg ICAgaWYgKGsgJSAzMiA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAg IGcwID0gZ2NkMl9vZGQgKCZnMSwgUDEsIFAwLCBuMSwgbjApOworICAgICAgICAgICAgICAgICAg aWYgKGcxICE9IDAgfHwgZzAgIT0gMSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWN0b3Jf Zm91bmQ7CisgICAgICAgICAgICAgICAgICB5MSA9IHgxOyB5MCA9IHgwOworICAgICAgICAgICAg ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB3aGlsZSAoLS1rICE9IDApOwoKLSAgZiA9 IG1wel9zY2FuMSAodCwgMCk7Ci0gIG1wel9kaXZfMmV4cCAodCwgdCwgZik7Ci0gIHdoaWxlIChm KQotICAgIHsKLSAgICAgIGVtaXRfdWxfZmFjdG9yICgyKTsKLSAgICAgIC0tZjsKLSAgICB9Cisg ICAgICAgICAgejEgPSB4MTsgejAgPSB4MDsKKyAgICAgICAgICBrID0gbDsKKyAgICAgICAgICBs ID0gMiAqIGw7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBsb25nIGludCBpID0gMDsgaSA8IGs7 IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgeDAgPSBtdWxyZWRjMiAoJnIxbSwg eDEsIHgwLCB4MSwgeDAsIG4xLCBuMCwgbmkpOworICAgICAgICAgICAgICB4MSA9IHIxbTsKKyAg ICAgICAgICAgICAgYWRkbW9kMiAoeDEsIHgwLCB4MSwgeDAsIDAsIGEsIG4xLCBuMCk7CisgICAg ICAgICAgICB9CisgICAgICAgICAgeTEgPSB4MTsgeTAgPSB4MDsKKyAgICAgICAgfQoKLSAgd2hp bGUgKHRydWUpCi0gICAgewotICAgICAgbXB6X3RkaXZfcXJfdWkgKHEsIHIsIHQsIDMpOwotICAg ICAgaWYgKG1wel9jbXBfdWkgKHIsIDApICE9IDApCi0gICAgICAgIGJyZWFrOwotICAgICAgbXB6 X3NldCAodCwgcSk7Ci0gICAgICBlbWl0X3VsX2ZhY3RvciAoMyk7Ci0gICAgfQorICAgIGZhY3Rv cl9mb3VuZDoKKyAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICB5MCA9IG11bHJlZGMyICgm cjFtLCB5MSwgeTAsIHkxLCB5MCwgbjEsIG4wLCBuaSk7CisgICAgICAgICAgeTEgPSByMW07Cisg ICAgICAgICAgYWRkbW9kMiAoeTEsIHkwLCB5MSwgeTAsIDAsIGEsIG4xLCBuMCk7CgotICB3aGls ZSAodHJ1ZSkKLSAgICB7Ci0gICAgICBtcHpfdGRpdl9xcl91aSAocSwgciwgdCwgNSk7Ci0gICAg ICBpZiAobXB6X2NtcF91aSAociwgMCkgIT0gMCkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBtcHpf c2V0ICh0LCBxKTsKLSAgICAgIGVtaXRfdWxfZmFjdG9yICg1KTsKLSAgICB9CisgICAgICAgICAg c3VibW9kMiAodDEsIHQwLCB6MSwgejAsIHkxLCB5MCwgbjEsIG4wKTsKKyAgICAgICAgICBnMCA9 IGdjZDJfb2RkICgmZzEsIHQxLCB0MCwgbjEsIG4wKTsKKyAgICAgICAgfQorICAgICAgd2hpbGUg KGcxID09IDAgJiYgZzAgPT0gMSk7CgotICBmYWlsdXJlcyA9IDA7Ci0gIGYgPSA3OwotICBhaSA9 IDA7Ci0gIHdoaWxlIChtcHpfY21wX3VpICh0LCAxKSAhPSAwKQotICAgIHsKLSAgICAgIG1wel90 ZGl2X3FyX3VpIChxLCByLCB0LCBmKTsKLSAgICAgIGlmIChtcHpfY21wX3VpIChyLCAwKSAhPSAw KQorICAgICAgaWYgKGcxID09IDApCiAgICAgICAgIHsKLSAgICAgICAgICBmICs9IGFkZHZbYWld OwotICAgICAgICAgIGlmIChtcHpfY21wX3VpIChxLCBmKSA8IDApCi0gICAgICAgICAgICBicmVh azsKLSAgICAgICAgICBhaSA9IChhaSArIDEpICYgNzsKLSAgICAgICAgICBmYWlsdXJlcysrOwot ICAgICAgICAgIGlmIChmYWlsdXJlcyA+IGxpbWl0KQotICAgICAgICAgICAgYnJlYWs7CisgICAg ICAgICAgLyogVGhlIGZvdW5kIGZhY3RvciBpcyBvbmUgd29yZC4gKi8KKyAgICAgICAgICBkaXZl eGFjdF8yMSAobjEsIG4wLCBuMSwgbjAsIGcwKTsgICAgIC8qIG4gPSBuIC8gZyAqLworCisgICAg ICAgICAgaWYgKCFwcmltZV9wIChnMCkpCisgICAgICAgICAgICBmYWN0b3JfdXNpbmdfcG9sbGFy ZF9yaG8gKGcwLCBhICsgMSwgZmFjdG9ycyk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAg ZmFjdG9yX2luc2VydCAoZmFjdG9ycywgZzApOwogICAgICAgICB9CiAgICAgICBlbHNlCiAgICAg ICAgIHsKLSAgICAgICAgICBtcHpfc3dhcCAodCwgcSk7Ci0gICAgICAgICAgZW1pdF91bF9mYWN0 b3IgKGYpOwotICAgICAgICAgIGZhaWx1cmVzID0gMDsKKyAgICAgICAgICAvKiBUaGUgZm91bmQg ZmFjdG9yIGlzIHR3byB3b3Jkcy4gIFRoaXMgaXMgaGlnaGx5IHVubGlrZWx5LCB0aHVzIGhhcmQK KyAgICAgICAgICAgICB0byB0cmlnZ2VyLiAgUGxlYXNlIGJlIGNhcmVmdWwgYmVmb3JlIHlvdSBj aGFuZ2UgdGhpcyBjb2RlISAgKi8KKyAgICAgICAgICB1aW50bWF4X3QgZ2ludjsKKworICAgICAg ICAgIGJpbnYgKGdpbnYsIGcwKTsgICAgICAvKiBDb21wdXRlIG4gPSBuIC8gZy4gIFNpbmNlIHRo ZSByZXN1bHQgd2lsbCAqLworICAgICAgICAgIG4wID0gZ2ludiAqIG4wOyAgICAgICAvKiBmaXQg b25lIHdvcmQsIHdlIGNhbiBjb21wdXRlIHRoZSBxdW90aWVudCAqLworICAgICAgICAgIG4xID0g MDsgICAgICAgICAgICAgICAvKiBtb2R1bG8gQiwgaWdub3JpbmcgdGhlIGhpZ2ggZGl2aXNvciB3 b3JkLiAqLworCisgICAgICAgICAgaWYgKCFwcmltZTJfcCAoZzEsIGcwKSkKKyAgICAgICAgICAg IGZhY3Rvcl91c2luZ19wb2xsYXJkX3JobzIgKGcxLCBnMCwgYSArIDEsIGZhY3RvcnMpOworICAg ICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZhY3Rvcl9pbnNlcnRfbGFyZ2UgKGZhY3RvcnMsIGcx LCBnMCk7CiAgICAgICAgIH0KLSAgICB9CgotICBtcHpfY2xlYXIgKHEpOwotICBtcHpfY2xlYXIg KHIpOwotfQorICAgICAgaWYgKG4xID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocHJp bWVfcCAobjApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmYWN0b3JfaW5zZXJ0IChm YWN0b3JzLCBuMCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAg ICAgICAgZmFjdG9yX3VzaW5nX3BvbGxhcmRfcmhvIChuMCwgYSwgZmFjdG9ycyk7CisgICAgICAg ICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgIGlmIChwcmltZTJfcCAobjEsIG4wKSkKKyAg ICAgICAgeworICAgICAgICAgIGZhY3Rvcl9pbnNlcnRfbGFyZ2UgKGZhY3RvcnMsIG4xLCBuMCk7 CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KCi0vKiBUaGUgbnVtYmVyIG9mIE1pbGxlci1S YWJpbiB0ZXN0cyB3ZSByZXF1aXJlLiAgKi8KLWVudW0geyBNUl9SRVBTID0gMjUgfTsKKyAgICAg IHgwID0gbW9kMiAoJngxLCB4MSwgeDAsIG4xLCBuMCk7CisgICAgICB6MCA9IG1vZDIgKCZ6MSwg ejEsIHowLCBuMSwgbjApOworICAgICAgeTAgPSBtb2QyICgmeTEsIHkxLCB5MCwgbjEsIG4wKTsK KyAgICB9Cit9CgorI2lmIEhBVkVfR01QCiBzdGF0aWMgdm9pZAotZmFjdG9yX3VzaW5nX3BvbGxh cmRfcmhvIChtcHpfdCBuLCBpbnQgYV9pbnQpCittcF9mYWN0b3JfdXNpbmdfcG9sbGFyZF9yaG8g KG1wel90IG4sIHVuc2lnbmVkIGxvbmcgaW50IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHN0cnVjdCBtcF9mYWN0b3JzICpmYWN0b3JzKQogewotICBtcHpfdCB4LCB4MSwgeSwgUDsK LSAgbXB6X3QgYTsKLSAgbXB6X3QgZzsKLSAgbXB6X3QgdDEsIHQyOwotICBpbnQgaywgbCwgYzsK KyAgbXB6X3QgeCwgeiwgeSwgUDsKKyAgbXB6X3QgdCwgdDI7CisgIHVuc2lnbmVkIGxvbmcgbG9u ZyBpbnQgaywgbDsKCi0gIGRlYnVnICgiW3BvbGxhcmQtcmhvICglZCldICIsIGFfaW50KTsKLQot ICBtcHpfaW5pdCAoZyk7Ci0gIG1wel9pbml0ICh0MSk7Ci0gIG1wel9pbml0ICh0Mik7CisgIGlm IChmbGFnX3ZlcmJvc2UgPiAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIltwb2xsYXJkLXJobyAo JWx1KV0gIiwgYSk7CisgICAgfQoKLSAgbXB6X2luaXRfc2V0X3NpIChhLCBhX2ludCk7CisgIG1w el9pbml0cyAodCwgdDIsIE5VTEwpOwogICBtcHpfaW5pdF9zZXRfc2kgKHksIDIpOwogICBtcHpf aW5pdF9zZXRfc2kgKHgsIDIpOwotICBtcHpfaW5pdF9zZXRfc2kgKHgxLCAyKTsKKyAgbXB6X2lu aXRfc2V0X3NpICh6LCAyKTsKKyAgbXB6X2luaXRfc2V0X3VpIChQLCAxKTsKICAgayA9IDE7CiAg IGwgPSAxOwotICBtcHpfaW5pdF9zZXRfdWkgKFAsIDEpOwotICBjID0gMDsKCiAgIHdoaWxlICht cHpfY21wX3VpIChuLCAxKSAhPSAwKQogICAgIHsKLVMyOgotICAgICAgbXB6X211bCAoeCwgeCwg eCk7IG1wel9hZGQgKHgsIHgsIGEpOyBtcHpfbW9kICh4LCB4LCBuKTsKLQotICAgICAgbXB6X3N1 YiAodDEsIHgxLCB4KTsgbXB6X211bCAodDIsIFAsIHQxKTsgbXB6X21vZCAoUCwgdDIsIG4pOwot ICAgICAgYysrOwotICAgICAgaWYgKGMgPT0gMjApCisgICAgICBmb3IgKDs7KQogICAgICAgICB7 Ci0gICAgICAgICAgYyA9IDA7Ci0gICAgICAgICAgbXB6X2djZCAoZywgUCwgbik7Ci0gICAgICAg ICAgaWYgKG1wel9jbXBfdWkgKGcsIDEpICE9IDApCi0gICAgICAgICAgICBnb3RvIFM0OworICAg ICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1wel9tdWwgKHQsIHgsIHgp OworICAgICAgICAgICAgICBtcHpfbW9kICh4LCB0LCBuKTsKKyAgICAgICAgICAgICAgbXB6X2Fk ZF91aSAoeCwgeCwgYSk7CisKKyAgICAgICAgICAgICAgbXB6X3N1YiAodCwgeiwgeCk7CisgICAg ICAgICAgICAgIG1wel9tdWwgKHQyLCBQLCB0KTsKKyAgICAgICAgICAgICAgbXB6X21vZCAoUCwg dDIsIG4pOworCisgICAgICAgICAgICAgIGlmIChrICUgMzIgPT0gMSkKKyAgICAgICAgICAgICAg ICB7CisgICAgICAgICAgICAgICAgICBtcHpfZ2NkICh0LCBQLCBuKTsKKyAgICAgICAgICAgICAg ICAgIGlmIChtcHpfY21wX3VpICh0LCAxKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICBnb3Rv IGZhY3Rvcl9mb3VuZDsKKyAgICAgICAgICAgICAgICAgIG1wel9zZXQgKHksIHgpOworICAgICAg ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB3aGlsZSAoLS1rICE9IDApOwor CisgICAgICAgICAgbXB6X3NldCAoeiwgeCk7CisgICAgICAgICAgayA9IGw7CisgICAgICAgICAg bCA9IDIgKiBsOworICAgICAgICAgIGZvciAodW5zaWduZWQgbG9uZyBsb25nIGludCBpID0gMDsg aSA8IGs7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbXB6X211bCAodCwgeCwg eCk7CisgICAgICAgICAgICAgIG1wel9tb2QgKHgsIHQsIG4pOworICAgICAgICAgICAgICBtcHpf YWRkX3VpICh4LCB4LCBhKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICBtcHpfc2V0ICh5LCB4 KTsKICAgICAgICAgfQoKLSAgICAgIGstLTsKLSAgICAgIGlmIChrID4gMCkKLSAgICAgICAgZ290 byBTMjsKLQotICAgICAgbXB6X2djZCAoZywgUCwgbik7Ci0gICAgICBpZiAobXB6X2NtcF91aSAo ZywgMSkgIT0gMCkKLSAgICAgICAgZ290byBTNDsKLQotICAgICAgbXB6X3NldCAoeDEsIHgpOwot ICAgICAgayA9IGw7Ci0gICAgICBsID0gMiAqIGw7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAg ICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBtcHpfbXVs ICh4LCB4LCB4KTsgbXB6X2FkZCAoeCwgeCwgYSk7IG1wel9tb2QgKHgsIHgsIG4pOwotICAgICAg ICB9Ci0gICAgICBtcHpfc2V0ICh5LCB4KTsKLSAgICAgIGMgPSAwOwotICAgICAgZ290byBTMjsK LVM0OgorICAgIGZhY3Rvcl9mb3VuZDoKICAgICAgIGRvCiAgICAgICAgIHsKLSAgICAgICAgICBt cHpfbXVsICh5LCB5LCB5KTsgbXB6X2FkZCAoeSwgeSwgYSk7IG1wel9tb2QgKHksIHksIG4pOwot ICAgICAgICAgIG1wel9zdWIgKHQxLCB4MSwgeSk7IG1wel9nY2QgKGcsIHQxLCBuKTsKKyAgICAg ICAgICBtcHpfbXVsICh0LCB5LCB5KTsKKyAgICAgICAgICBtcHpfbW9kICh5LCB0LCBuKTsKKyAg ICAgICAgICBtcHpfYWRkX3VpICh5LCB5LCBhKTsKKworICAgICAgICAgIG1wel9zdWIgKHQsIHos IHkpOworICAgICAgICAgIG1wel9nY2QgKHQsIHQsIG4pOwogICAgICAgICB9Ci0gICAgICB3aGls ZSAobXB6X2NtcF91aSAoZywgMSkgPT0gMCk7CisgICAgICB3aGlsZSAobXB6X2NtcF91aSAodCwg MSkgPT0gMCk7CgotICAgICAgbXB6X2RpdiAobiwgbiwgZyk7CS8qIGRpdmlkZSBieSBnLCBiZWZv cmUgZyBpcyBvdmVyd3JpdHRlbiAqLworICAgICAgbXB6X2RpdmV4YWN0IChuLCBuLCB0KTsgICAv KiBkaXZpZGUgYnkgdCwgYmVmb3JlIHQgaXMgb3ZlcndyaXR0ZW4gKi8KCi0gICAgICBpZiAoIW1w el9wcm9iYWJfcHJpbWVfcCAoZywgTVJfUkVQUykpCisgICAgICBpZiAoIW1wX3ByaW1lX3AgKHQp KQogICAgICAgICB7Ci0gICAgICAgICAgZG8KKyAgICAgICAgICBpZiAoZmxhZ192ZXJib3NlID4g MCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbXBfbGltYl90IGFfbGltYjsKLSAgICAg ICAgICAgICAgbXBuX3JhbmRvbSAoJmFfbGltYiwgKG1wX3NpemVfdCkgMSk7Ci0gICAgICAgICAg ICAgIGFfaW50ID0gKGludCkgYV9saW1iOworICAgICAgICAgICAgICBwcmludGYgKCJbY29tcG9z aXRlIGZhY3Rvci0tcmVzdGFydGluZyBwb2xsYXJkLXJob10gIik7CiAgICAgICAgICAgICB9Ci0g ICAgICAgICAgd2hpbGUgKGFfaW50ID09IC0yIHx8IGFfaW50ID09IDApOwotCi0gICAgICAgICAg ZGVidWcgKCJbY29tcG9zaXRlIGZhY3Rvci0tcmVzdGFydGluZyBwb2xsYXJkLXJob10gIik7Ci0g ICAgICAgICAgZmFjdG9yX3VzaW5nX3BvbGxhcmRfcmhvIChnLCBhX2ludCk7CisgICAgICAgICAg bXBfZmFjdG9yX3VzaW5nX3BvbGxhcmRfcmhvICh0LCBhICsgMSwgZmFjdG9ycyk7CiAgICAgICAg IH0KICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgIGVtaXRfZmFjdG9yIChnKTsKKyAg ICAgICAgICBtcF9mYWN0b3JfaW5zZXJ0IChmYWN0b3JzLCB0KTsKICAgICAgICAgfQotICAgICAg bXB6X21vZCAoeCwgeCwgbik7Ci0gICAgICBtcHpfbW9kICh4MSwgeDEsIG4pOwotICAgICAgbXB6 X21vZCAoeSwgeSwgbik7Ci0gICAgICBpZiAobXB6X3Byb2JhYl9wcmltZV9wIChuLCBNUl9SRVBT KSkKKworICAgICAgaWYgKG1wX3ByaW1lX3AgKG4pKQogICAgICAgICB7Ci0gICAgICAgICAgZW1p dF9mYWN0b3IgKG4pOworICAgICAgICAgIG1wX2ZhY3Rvcl9pbnNlcnQgKGZhY3RvcnMsIG4pOwog ICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisKKyAgICAgIG1wel9tb2QgKHgsIHgsIG4pOwor ICAgICAgbXB6X21vZCAoeiwgeiwgbik7CisgICAgICBtcHpfbW9kICh5LCB5LCBuKTsKICAgICB9 CgotICBtcHpfY2xlYXIgKGcpOwotICBtcHpfY2xlYXIgKFApOwotICBtcHpfY2xlYXIgKHQyKTsK LSAgbXB6X2NsZWFyICh0MSk7Ci0gIG1wel9jbGVhciAoYSk7Ci0gIG1wel9jbGVhciAoeDEpOwot ICBtcHpfY2xlYXIgKHgpOwotICBtcHpfY2xlYXIgKHkpOworICBtcHpfY2xlYXJzIChQLCB0Miwg dCwgeiwgeCwgeSwgTlVMTCk7CiB9CisjZW5kaWYKCi0jZWxzZQotCi1zdGF0aWMgdm9pZAotZGVi dWcgKGNoYXIgY29uc3QgKmZtdCBBVFRSSUJVVEVfVU5VU0VELCAuLi4pCisvKiBGSVhNRTogTWF5 YmUgYmV0dGVyIHRvIHVzZSBhbiBpdGVyYXRpb24gY29udmVyZ2luZyB0byAxL3NxcnQobik/ICBJ ZgorICAgYWxnb3JpdGhtIGlzIHJlcGxhY2VkLCBjb25zaWRlciBhbHNvIHJldHVybmluZyB0aGUg cmVtYWluZGVyLiAqLworc3RhdGljIHVpbnRtYXhfdCBfR0xfQVRUUklCVVRFX0NPTlNUCitpc3Fy dCAodWludG1heF90IG4pCiB7Ci19CisgIHVpbnRtYXhfdCB4OworICB1bnNpZ25lZCBjOworICBp ZiAobiA9PSAwKQorICAgIHJldHVybiAwOwoKLSNlbmRpZgorICBjb3VudF9sZWFkaW5nX3plcm9z IChjLCBuKTsKCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZmFjdG9ycywgaW5jbHVkaW5nIC0x LCBmb3IgbmVnYXRpdmUgbnVtYmVycy4gICovCi0jZGVmaW5lIE1BWF9OX0ZBQ1RPUlMgKHNpemVv ZiAodWludG1heF90KSAqIENIQVJfQklUKQorICAvKiBNYWtlIHggPiBzcXJ0KG4pLiBUaGlzIHdp bGwgYmUgaW52YXJpYW50IHRocm91Z2ggdGhlIGxvb3AuICovCisgIHggPSAodWludG1heF90KSAx IDw8ICgoV19UWVBFX1NJWkUgKyAxIC0gYykgLyAyKTsKCi0vKiBUaGUgdHJpYWwgZGl2aXNvciBp bmNyZW1lbnQgd2hlZWwuICBVc2UgaXQgdG8gc2tpcCBvdmVyIGRpdmlzb3JzIHRoYXQKLSAgIGFy ZSBjb21wb3NpdGVzIG9mIDIsIDMsIDUsIDcsIG9yIDExLiAgVGhlIHBhcnQgZnJvbSBXSEVFTF9T VEFSVCB1cCB0bwotICAgV0hFRUxfRU5EIGlzIHJldXNlZCBwZXJpb2RpY2FsbHksIHdoaWxlIHRo ZSAibGVhZCBpbiIgaXMgdXNlZCB0byB0ZXN0Ci0gICBmb3IgdGhvc2UgcHJpbWVzIGFuZCB0byBq dW1wIG9udG8gdGhlIHdoZWVsLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQotICAgaHR0cDov L3d3dy51dG0uZWR1L3Jlc2VhcmNoL3ByaW1lcy9nbG9zc2FyeS9XaGVlbEZhY3Rvcml6YXRpb24u aHRtbCAgKi8KKyAgZm9yICg7OykKKyAgICB7CisgICAgICB1aW50bWF4X3QgeSA9ICh4ICsgbi94 KSAvIDI7CisgICAgICBpZiAoeSA+PSB4KQorICAgICAgICByZXR1cm4geDsKCi0jaW5jbHVkZSAi d2hlZWwtc2l6ZS5oIiAgLyogRm9yIHRoZSBkZWZpbml0aW9uIG9mIFdIRUVMX1NJWkUuICAqLwot c3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgd2hlZWxfdGFiW10gPQotICB7Ci0jaW5jbHVkZSAi d2hlZWwuaCIKLSAgfTsKKyAgICAgIHggPSB5OworICAgIH0KK30KCi0jZGVmaW5lIFdIRUVMX1NU QVJUICh3aGVlbF90YWIgKyBXSEVFTF9TSVpFKQotI2RlZmluZSBXSEVFTF9FTkQgKHdoZWVsX3Rh YiArIEFSUkFZX0NBUkRJTkFMSVRZICh3aGVlbF90YWIpKQorc3RhdGljIHVpbnRtYXhfdCBfR0xf QVRUUklCVVRFX0NPTlNUCitpc3FydDIgKHVpbnRtYXhfdCBuaCwgdWludG1heF90IG5sKQorewor ICB1bnNpZ25lZCBpbnQgc2hpZnQ7CisgIHVpbnRtYXhfdCB4OwoKLS8qIEZJWE1FOiBjb21tZW50 ICovCisgIC8qIEVuc3VyZXMgdGhlIHJlbWFpbmRlciBmaXRzIGluIGFuIHVpbnRtYXhfdC4gKi8K KyAgYXNzZXJ0IChuaCA8ICgodWludG1heF90KSAxIDw8IChXX1RZUEVfU0laRSAtIDIpKSk7Cgot c3RhdGljIHNpemVfdAotZmFjdG9yX3doZWVsICh1aW50bWF4X3QgbjAsIHNpemVfdCBtYXhfbl9m YWN0b3JzLCB1aW50bWF4X3QgKmZhY3RvcnMpCi17Ci0gIHVpbnRtYXhfdCBuID0gbjAsIGQsIHE7 Ci0gIHNpemVfdCBuX2ZhY3RvcnMgPSAwOwotICB1bnNpZ25lZCBjaGFyIGNvbnN0ICp3ID0gd2hl ZWxfdGFiOworICBpZiAobmggPT0gMCkKKyAgICByZXR1cm4gaXNxcnQgKG5sKTsKCi0gIGlmIChu IDw9IDEpCi0gICAgcmV0dXJuIG5fZmFjdG9yczsKKyAgY291bnRfbGVhZGluZ196ZXJvcyAoc2hp ZnQsIG5oKTsKKyAgc2hpZnQgJj0gfjE7CgotICAvKiBUaGUgZXhpdCBjb25kaXRpb24gaW4gdGhl IGZvbGxvd2luZyBsb29wIGlzIGNvcnJlY3QgYmVjYXVzZQotICAgICBhbnkgdGltZSBpdCBpcyB0 ZXN0ZWQgb25lIG9mIHRoZXNlIDMgY29uZGl0aW9ucyBob2xkczoKLSAgICAgICgxKSBkIGRpdmlk ZXMgbgotICAgICAgKDIpIG4gaXMgcHJpbWUKLSAgICAgICgzKSBuIGlzIGNvbXBvc2l0ZSBidXQg aGFzIG5vIGZhY3RvcnMgbGVzcyB0aGFuIGQuCi0gICAgIElmICgxKSBvciAoMikgb2J2aW91c2x5 IHRoZSByaWdodCB0aGluZyBoYXBwZW5zLgotICAgICBJZiAoMyksIHRoZW4gc2luY2UgbiBpcyBj b21wb3NpdGUgaXQgaXMgPj0gZF4yLiAqLworICAvKiBNYWtlIHggPiBzcXJ0KG4pICovCisgIHgg PSBpc3FydCAoIChuaCA8PCBzaGlmdCkgKyAobmwgPj4gKFdfVFlQRV9TSVpFIC0gc2hpZnQpKSkg KyAxOworICB4IDw8PSAoV19UWVBFX1NJWkUgLSBzaGlmdCkgLyAyOwoKLSAgZCA9IDI7Ci0gIGRv CisgIC8qIERvIHdlIG5lZWQgbW9yZSB0aGFuIG9uZSBpdGVyYXRpb24/ICovCisgIGZvciAoOzsp CiAgICAgewotICAgICAgcSA9IG4gLyBkOwotICAgICAgd2hpbGUgKG4gPT0gcSAqIGQpCisgICAg ICB1aW50bWF4X3QgcSwgciwgeTsKKyAgICAgIHVkaXZfcXJubmQgKHEsIHIsIG5oLCBubCwgeCk7 CisgICAgICB5ID0gKHggKyBxKSAvIDI7CisKKyAgICAgIGlmICh5ID49IHgpCiAgICAgICAgIHsK LSAgICAgICAgICBhc3NlcnQgKG5fZmFjdG9ycyA8IG1heF9uX2ZhY3RvcnMpOwotICAgICAgICAg IGZhY3RvcnNbbl9mYWN0b3JzKytdID0gZDsKLSAgICAgICAgICBuID0gcTsKLSAgICAgICAgICBx ID0gbiAvIGQ7CisgICAgICAgICAgdWludG1heF90IGhpLCBsbzsKKyAgICAgICAgICB1bXVsX3Bw bW0gKGhpLCBsbywgeCArIDEsIHggKyAxKTsKKyAgICAgICAgICBhc3NlcnQgKGd0MiAoaGksIGxv LCBuaCwgbmwpKTsKKworICAgICAgICAgIHVtdWxfcHBtbSAoaGksIGxvLCB4LCB4KTsKKyAgICAg ICAgICBhc3NlcnQgKGdlMiAobmgsIG5sLCBoaSwgbG8pKTsKKyAgICAgICAgICBzdWJfZGRtbXNz IChoaSwgbG8sIG5oLCBubCwgaGksIGxvKTsKKyAgICAgICAgICBhc3NlcnQgKGhpID09IDApOwor CisgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgIH0KLSAgICAgIGQgKz0gKih3KyspOwotICAg ICAgaWYgKHcgPT0gV0hFRUxfRU5EKQotICAgICAgICB3ID0gV0hFRUxfU1RBUlQ7CisKKyAgICAg IHggPSB5OwogICAgIH0KLSAgd2hpbGUgKGQgPD0gcSk7Cit9CgotICBpZiAobiAhPSAxIHx8IG4w ID09IDEpCisvKiBNQUdJQ1tOXSBoYXMgYSBiaXQgaSBzZXQgaWZmIGkgaXMgYSBxdWFkcmF0aWMg cmVzaWR1ZSBtb2QgTi4gKi8KKyNkZWZpbmUgTUFHSUM2NCAoKHVpbnQ2NF90KSAweDAyMDIwMjEy MDIwMzAyMTNVTEwpCisjZGVmaW5lIE1BR0lDNjMgKCh1aW50NjRfdCkgMHgwNDAyNDgzMDEyNDUw MjkzVUxMKQorI2RlZmluZSBNQUdJQzY1ICgodWludDY0X3QpIDB4MjE4YTAxOTg2NjAxNDYxM1VM TCkKKyNkZWZpbmUgTUFHSUMxMSAweDIzYgorCisvKiBSZXR1cm5zIHRoZSBzcXVhcmUgcm9vdCBp ZiB0aGUgaW5wdXQgaXMgYSBzcXVhcmUsIG90aGVyd2lzZSAwLiAqLworc3RhdGljIHVpbnRtYXhf dCBfR0xfQVRUUklCVVRFX0NPTlNUCitpc19zcXVhcmUgKHVpbnRtYXhfdCB4KQoreworICAvKiBV c2VzIHRoZSB0ZXN0cyBzdWdnZXN0ZWQgYnkgQ29oZW4uIEV4Y2x1ZGVzIDk5JSBvZiB0aGUgbm9u LXNxdWFyZXMgYmVmb3JlCisgICAgIGNvbXB1dGluZyB0aGUgc3F1YXJlIHJvb3QuICovCisgIGlm ICgoKE1BR0lDNjQgPj4gKHggJiA2MykpICYgMSkKKyAgICAgICYmICgoTUFHSUM2MyA+PiAoeCAl IDYzKSkgJiAxKQorICAgICAgLyogQm90aCAwIGFuZCA2NCBhcmUgc3F1YXJlcyBtb2QgKDY1KSAq LworICAgICAgJiYgKChNQUdJQzY1ID4+ICgoeCAlIDY1KSAmIDYzKSkgJiAxKQorICAgICAgJiYg KChNQUdJQzExID4+ICh4ICUgMTEpICYgMSkpKQogICAgIHsKLSAgICAgIGFzc2VydCAobl9mYWN0 b3JzIDwgbWF4X25fZmFjdG9ycyk7Ci0gICAgICBmYWN0b3JzW25fZmFjdG9ycysrXSA9IG47Cisg ICAgICB1aW50bWF4X3QgciA9IGlzcXJ0ICh4KTsKKyAgICAgIGlmIChyKnIgPT0geCkKKyAgICAg ICAgcmV0dXJuIHI7CiAgICAgfQotCi0gIHJldHVybiBuX2ZhY3RvcnM7CisgIHJldHVybiAwOwog fQoKLS8qIFNpbmdsZS1wcmVjaXNpb24gZmFjdG9yaW5nICovCi1zdGF0aWMgdm9pZAotcHJpbnRf ZmFjdG9yc19zaW5nbGUgKHVpbnRtYXhfdCBuKQotewotICB1aW50bWF4X3QgZmFjdG9yc1tNQVhf Tl9GQUNUT1JTXTsKLSAgc2l6ZV90IG5fZmFjdG9ycyA9IGZhY3Rvcl93aGVlbCAobiwgTUFYX05f RkFDVE9SUywgZmFjdG9ycyk7Ci0gIHNpemVfdCBpOwotICBjaGFyIGJ1ZltJTlRfQlVGU0laRV9C T1VORCAodWludG1heF90KV07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgaW52dGFiW10g PQorICB7CisgICAgMHgxZmMsIDB4MWY4LCAweDFmNCwgMHgxZjAsIDB4MWVjLCAweDFlOSwgMHgx ZTUsIDB4MWUxLAorICAgIDB4MWRlLCAweDFkYSwgMHgxZDcsIDB4MWQ0LCAweDFkMCwgMHgxY2Qs IDB4MWNhLCAweDFjNywKKyAgICAweDFjMywgMHgxYzAsIDB4MWJkLCAweDFiYSwgMHgxYjcsIDB4 MWI0LCAweDFiMiwgMHgxYWYsCisgICAgMHgxYWMsIDB4MWE5LCAweDFhNiwgMHgxYTQsIDB4MWEx LCAweDE5ZSwgMHgxOWMsIDB4MTk5LAorICAgIDB4MTk3LCAweDE5NCwgMHgxOTIsIDB4MThmLCAw eDE4ZCwgMHgxOGEsIDB4MTg4LCAweDE4NiwKKyAgICAweDE4MywgMHgxODEsIDB4MTdmLCAweDE3 ZCwgMHgxN2EsIDB4MTc4LCAweDE3NiwgMHgxNzQsCisgICAgMHgxNzIsIDB4MTcwLCAweDE2ZSwg MHgxNmMsIDB4MTZhLCAweDE2OCwgMHgxNjYsIDB4MTY0LAorICAgIDB4MTYyLCAweDE2MCwgMHgx NWUsIDB4MTVjLCAweDE1YSwgMHgxNTgsIDB4MTU3LCAweDE1NSwKKyAgICAweDE1MywgMHgxNTEs IDB4MTUwLCAweDE0ZSwgMHgxNGMsIDB4MTRhLCAweDE0OSwgMHgxNDcsCisgICAgMHgxNDYsIDB4 MTQ0LCAweDE0MiwgMHgxNDEsIDB4MTNmLCAweDEzZSwgMHgxM2MsIDB4MTNiLAorICAgIDB4MTM5 LCAweDEzOCwgMHgxMzYsIDB4MTM1LCAweDEzMywgMHgxMzIsIDB4MTMwLCAweDEyZiwKKyAgICAw eDEyZSwgMHgxMmMsIDB4MTJiLCAweDEyOSwgMHgxMjgsIDB4MTI3LCAweDEyNSwgMHgxMjQsCisg ICAgMHgxMjMsIDB4MTIxLCAweDEyMCwgMHgxMWYsIDB4MTFlLCAweDExYywgMHgxMWIsIDB4MTFh LAorICAgIDB4MTE5LCAweDExOCwgMHgxMTYsIDB4MTE1LCAweDExNCwgMHgxMTMsIDB4MTEyLCAw eDExMSwKKyAgICAweDEwZiwgMHgxMGUsIDB4MTBkLCAweDEwYywgMHgxMGIsIDB4MTBhLCAweDEw OSwgMHgxMDgsCisgICAgMHgxMDcsIDB4MTA2LCAweDEwNSwgMHgxMDQsIDB4MTAzLCAweDEwMiwg MHgxMDEsIDB4MTAwLAorICB9OwoKLSAgcHJpbnRmICgiJXM6IiwgdW1heHRvc3RyIChuLCBidWYp KTsKLSAgZm9yIChpID0gMDsgaSA8IG5fZmFjdG9yczsgaSsrKQotICAgIHByaW50ZiAoIiAlcyIs IHVtYXh0b3N0ciAoZmFjdG9yc1tpXSwgYnVmKSk7Ci0gIHB1dGNoYXIgKCdcbicpOwotfQorLyog Q29tcHV0ZSBxID0gW3UvZF0sIHIgPSB1IG1vZCBkLiAgQXZvaWRzIHNsb3cgaGFyZHdhcmUgZGl2 aXNpb24gZm9yIHRoZSBjYXNlCisgICB0aGF0IHEgPCAweDQwOyBoZXJlIGl0IGluc3RlYWQgdXNl cyBhIHRhYmxlIG9mIChFdWNsaWRpYW4pIGludmVyc2VzLiAgKi8KKyNkZWZpbmUgZGl2X3NtYWxs cShxLCByLCB1LCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK KyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoMCAmJiAodSkgLyAweDQwIDwgKGQpKSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg ICAgICAgaW50IF9jbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKKyAgICAgICAgdWludG1heF90IF9kaW52LCBfbWFzaywgX3EsIF9yOyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY291bnRfbGVhZGluZ196 ZXJvcyAoX2NudCwgKGQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKKyAgICAgICAgX2RpbnYgPSBpbnZ0YWJbKChkKSA+PiAoV19UWVBFX1NJWkUg LSA4IC0gX2NudCkpICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgLSAo MSA8PCAoOCAtIDEpKV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKKyAgICAgICAgX3IgPSAodSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX3EgPSBfciAqIF9kaW52ID4+IChX X1RZUEVfU0laRSArIDggLSBfY250KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX3Ig LT0gX3EqKGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX21hc2sgPSAtKHVpbnRtYXhfdCkgKF9y ID49IChkKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHIpID0g X3IgLSAoX21hc2sgJiAoZCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFwKKyAgICAgICAgKHEpID0gX3EgLSBfbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXNzZXJ0ICggKHEpICogKGQpICsgKHIpID09 IHUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK KyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludG1heF90IF9x ID0gKHUpIC8gKGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg ICAgICAgKHIpID0gKHUpIC0gX3EgKiAoZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKKyAgICAgICAgKHEpID0gX3E7ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3 aGlsZSAoMCkKKworLyogTm90ZXM6IEV4YW1wbGUgTiA9IDIyMTE3MDE5LiBBZnRlciBmaXJzdCBw aGFzZSB3ZSBmaW5kIFExID0gNjMxNCwgUQorICAgPSAzMDI1LCBQID0gMTczNywgcmVwcmVzZW50 aW5nIEZfezE4fSA9ICgtNjMxNCwgMiogMTczNywgMzAyNSksCisgICB3aXRoIDMwMjUgPSA1NV4y LgorCisgICBDb25zdHJ1Y3RpbmcgdGhlIHNxdWFyZSByb290LCB3ZSBnZXQgUTEgPSA1NSwgUSA9 IDg2NTMsIFAgPSA0NjUyLAorICAgcmVwcmVzZW50aW5nIEdfMCA9ICgtNTUsIDIqNDY1MiwgODY1 MykuCisKKyAgIEluIHRoZSBub3RhdGlvbiBvZiB0aGUgcGFwZXI6CisKKyAgIFNfey0xfSA9IDU1 LCBTXzAgPSA4NjUzLCBSXzAgPSA0NjUyCisKKyAgIFB1dAorCisgICAgIHRfMCA9IGZsb29yKFtx XzAgKyBSXzBdIC8gUzApID0gMQorICAgICBSXzEgPSB0XzAgKiBTXzAgLSBSXzAgPSA0MDAxCisg ICAgIFNfMSA9IFNfey0xfSArdF8wIChSXzAgLSBSXzEpID0gNzA2CisqLworCisvKiBNdWx0aXBs aWVycywgaW4gb3JkZXIgb2YgZWZmaWNpZW5jeToKKyAgIDAuNzI2OCAgMyo1KjcqMTEgPSAxMTU1 ID0gMyAobW9kIDQpCisgICAwLjczMTcgIDMqNSo3ICAgID0gIDEwNSA9IDEKKyAgIDAuNzgyMCAg Myo1KjExICAgPSAgMTY1ID0gMQorICAgMC43ODcyICAzKjUgICAgICA9ICAgMTUgPSAzCisgICAw LjgxMDEgIDMqNyoxMSAgID0gIDIzMSA9IDMKKyAgIDAuODE1NSAgMyo3ICAgICAgPSAgIDIxID0g MQorICAgMC44Mjg0ICA1KjcqMTEgICA9ICAzODUgPSAxCisgICAwLjgzMzkgIDUqNyAgICAgID0g ICAzNSA9IDMKKyAgIDAuODcxNiAgMyoxMSAgICAgPSAgIDMzID0gMQorICAgMC44Nzc0ICAzICAg ICAgICA9ICAgIDMgPSAzCisgICAwLjg5MTMgIDUqMTEgICAgID0gICA1NSA9IDMKKyAgIDAuODk3 MiAgNSAgICAgICAgPSAgICA1ID0gMQorICAgMC45MjMzICA3KjExICAgICA9ICAgNzcgPSAxCisg ICAwLjkyOTUgIDcgICAgICAgID0gICAgNyA9IDMKKyAgIDAuOTkzNCAgMTEgICAgICAgPSAgIDEx ID0gMworKi8KKyNkZWZpbmUgUVVFVUVfU0laRSA1MAorCisjaWYgU1RBVF9TUVVGT0YKKyMgZGVm aW5lIFFfRlJFUV9TSVpFIDUwCisvKiBFbGVtZW50IDAga2VlcHMgdGhlIHRvdGFsICovCitzdGF0 aWMgdW5zaWduZWQgaW50IHFfZnJlcVtRX0ZSRVFfU0laRSArIDFdOworIyBkZWZpbmUgTUlOKGEs YikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKKyNlbmRpZgoKLSNpZiBIQVZFX0dNUAotc3RhdGlj IGludAotbXBjb21wYXJlIChjb25zdCB2b2lkICphdiwgY29uc3Qgdm9pZCAqYnYpCi17Ci0gIG1w el90ICpjb25zdCAqYSA9IGF2OwotICBtcHpfdCAqY29uc3QgKmIgPSBidjsKLSAgcmV0dXJuIG1w el9jbXAgKCoqYSwgKipiKTsKLX0KCiBzdGF0aWMgdm9pZAotc29ydF9hbmRfcHJpbnRfZmFjdG9y cyAodm9pZCkKK2ZhY3Rvcl91c2luZ19zcXVmb2YgKHVpbnRtYXhfdCBuMSwgdWludG1heF90IG4w LCBzdHJ1Y3QgZmFjdG9ycyAqZmFjdG9ycykKIHsKLSAgbXB6X3QgKipmYWNsaXN0OwotICBzaXpl X3QgaTsKKyAgLyogVXNlcyBhbGdvcml0aG0gYW5kIG5vdGF0aW9uIGZyb20KKworICAgICBTUVVB UkUgRk9STSBGQUNUT1JJWkFUSU9OCisgICAgIEpBU09OIEUuIEdPV0VSIEFORCBTQU1VRUwgUy4g V0FHU1RBRkYsIEpSLgorCisgICAgIGh0dHA6Ly9ob21lcy5jZXJpYXMucHVyZHVlLmVkdS9+c3N3 L3NxdWZvZi5wZGYKKyAgICovCisKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtdWx0aXBs aWVyc18xW10gPQorICAgIHsgLyogPSAxIChtb2QgNCkgKi8KKyAgICAgIDEwNSwgMTY1LCAyMSwg Mzg1LCAzMywgNSwgNzcsIDEsIDAKKyAgICB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50 IG11bHRpcGxpZXJzXzNbXSA9CisgICAgeyAvKiA9IDMgKG1vZCA0KSAqLworICAgICAgMTE1NSwg MTUsIDIzMSwgMzUsIDMsIDU1LCA3LCAxMSwgMAorICAgIH07CgotICBmYWNsaXN0ID0geGNhbGxv YyAobmZhY3RvcnNfZm91bmQsIHNpemVvZiAqZmFjbGlzdCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBu ZmFjdG9yc19mb3VuZDsgKytpKQorICB1aW50bWF4X3QgUzsKKyAgY29uc3QgdW5zaWduZWQgaW50 ICptOworCisgIHN0cnVjdCB7IHVpbnRtYXhfdCBROyB1aW50bWF4X3QgUDsgfSBxdWV1ZVtRVUVV RV9TSVpFXTsKKworICBTID0gaXNxcnQyIChuMSwgbjApOworCisgIGlmIChuMCA9PSBTICogUykK ICAgICB7Ci0gICAgICBmYWNsaXN0W2ldID0gJmZhY3RvcltpXTsKKyAgICAgIHVpbnRtYXhfdCBw MSwgcDA7CisKKyAgICAgIHVtdWxfcHBtbSAocDEsIHAwLCBTLCBTKTsKKyAgICAgIGFzc2VydCAo cDAgPT0gbjApOworCisgICAgICBpZiAobjEgPT0gcDEpCisgICAgICAgIHsKKyAgICAgICAgICBp ZiAocHJpbWVfcCAoUykpCisgICAgICAgICAgICBmYWN0b3JfaW5zZXJ0X211bHRpcGxpY2l0eSAo ZmFjdG9ycywgUywgMik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAg ICAgICBzdHJ1Y3QgZmFjdG9ycyBmOworCisgICAgICAgICAgICAgIGYubmZhY3RvcnMgPSAwOwor ICAgICAgICAgICAgICBmYWN0b3JfdXNpbmdfc3F1Zm9mICgwLCBTLCAmZik7CisgICAgICAgICAg ICAgIC8qIER1cGxpY2F0ZSB0aGUgbmV3IGZhY3RvcnMgKi8KKyAgICAgICAgICAgICAgZm9yICh1 bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBmLm5mYWN0b3JzOyBpKyspCisgICAgICAgICAgICAgICAg ZmFjdG9yX2luc2VydF9tdWx0aXBsaWNpdHkgKGZhY3RvcnMsIGYucFtpXSwgMipmLmVbaV0pOwor ICAgICAgICAgICAgfQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KLSAgcXNv cnQgKGZhY2xpc3QsIG5mYWN0b3JzX2ZvdW5kLCBzaXplb2YgKmZhY2xpc3QsIG1wY29tcGFyZSk7 CgotICBmb3IgKGkgPSAwOyBpIDwgbmZhY3RvcnNfZm91bmQ7ICsraSkKKyAgLyogU2VsZWN0IG11 bHRpcGxpZXJzIHNvIHdlIGFsd2F5cyBnZXQgbiAqIG11ID0gMyAobW9kIDQpICovCisgIGZvciAo bSA9IChuMCAlIDQgPT0gMSkgPyBtdWx0aXBsaWVyc18zIDogbXVsdGlwbGllcnNfMTsKKyAgICAg ICAqbTsgbSsrKQogICAgIHsKLSAgICAgIGZwdXRjICgnICcsIHN0ZG91dCk7Ci0gICAgICBtcHpf b3V0X3N0ciAoc3Rkb3V0LCAxMCwgKmZhY2xpc3RbaV0pOworICAgICAgdWludG1heF90IFMsIERo LCBEbCwgUTEsIFEsIFAsIEwsIEwxLCBCOworICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICB1 bnNpZ25lZCBpbnQgbXUgPSAqbTsKKyAgICAgIHVuc2lnbmVkIGludCBxcG9zID0gMDsKKworICAg ICAgYXNzZXJ0IChtdSAqIG4wICUgNCA9PSAzKTsKKworICAgICAgLyogSW4gdGhlIG5vdGF0aW9u IG9mIHRoZSBwYXBlciwgd2l0aCBtdSAqIG4gPT0gMyAobW9kIDQpLCB3ZQorICAgICAgICAgZ2V0 IFxEZWx0YSA9IDQgbXUgKiBuLCBhbmQgdGhlIHBhcGVyJ3MgXG11IGlzIDIgbXUuIEFzIGZhciBh cworICAgICAgICAgSSB1bmRlcnN0YW5kIGl0LCB0aGUgbmVjZXNzYXJ5IGJvdW5kIGlzIDQgXG11 XjMgPCBuLCBvciAzMgorICAgICAgICAgbXVeMyA8IG4uCisKKyAgICAgICAgIEhvd2V2ZXIsIHRo aXMgc2VlbXMgaW5zdWZmaWNpZW50OiBXaXRoIG4gPSAzNzI0MzEzOSBhbmQgbXUgPQorICAgICAg ICAgMTA1LCB3ZSBnZXQgYSB0cml2aWFsIGZhY3RvciwgZnJvbSB0aGUgc3F1YXJlIDM4ODA5ID0g MTk3XjIsCisgICAgICAgICB3aXRob3V0IGFueSBjb3JyZXNwb25kaW5nIFEgZWFybGllciBpbiB0 aGUgaXRlcmF0aW9uLgorCisgICAgICAgICBSZXF1aXJpbmcgNjQgbXVeMyA8IG4gc2VlbXMgc3Vm ZmljaWVudC4gKi8KKyAgICAgIGlmIChuMSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYg KCh1aW50bWF4X3QpIG11Km11Km11ID49IG4wIC8gNjQpCisgICAgICAgICAgICBjb250aW51ZTsK KyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKG4xID4gKCh1 aW50bWF4X3QpIDEgPDwgKFdfVFlQRV9TSVpFIC0gMikpIC8gbXUpCisgICAgICAgICAgICBjb250 aW51ZTsKKyAgICAgICAgfQorICAgICAgdW11bF9wcG1tIChEaCwgRGwsIG4wLCBtdSk7CisgICAg ICBEaCArPSBuMSAqIG11OworCisgICAgICBhc3NlcnQgKERsICUgNCAhPSAxKTsKKworICAgICAg UyA9IGlzcXJ0MiAoRGgsIERsKTsKKworICAgICAgUTEgPSAxOworICAgICAgUCA9IFM7CisKKyAg ICAgIC8qIFNxdWFyZSByb290IHJlbWFpbmRlciBmaXRzIGluIG9uZSB3b3JkLCBzbyBpZ25vcmUg aGlnaCBwYXJ0LiAqLworICAgICAgUSA9IERsIC0gUCpQOworICAgICAgLyogRklYTUU6IFdoZW4g Y2FuIHRoaXMgZGlmZmVyIGZyb20gZmxvb3Ioc3FydCgyIHNxcnQoRCkpKT8gKi8KKyAgICAgIEwg PSBpc3FydCAoMipTKTsKKyAgICAgIEIgPSAyKkw7CisgICAgICBMMSA9IG11ICogMiAqIEw7CisK KyAgICAgIC8qIFRoZSBmb3JtIGlzICgrLy0gUTEsIDJQLCAtLysgUSksIG9mIGRpc2NyaW1pbmFu dCA0IChQXjIgKyBRIFExKSA9CisgICAgICAgICA0IEQuICovCisKKyAgICAgIGZvciAoaSA9IDA7 IGkgPD0gQjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgdWludG1heF90IHEsIFAxLCB0LCBy OworCisgICAgICAgICAgZGl2X3NtYWxscSAocSwgciwgUytQLCBRKTsKKyAgICAgICAgICBQMSA9 IFMgLSByOyAgIC8qIFAxID0gcSpRIC0gUCAqLworCisjaWYgU1RBVF9TUVVGT0YKKyAgICAgICAg ICBhc3NlcnQgKHEgPiAwKTsKKyAgICAgICAgICBxX2ZyZXFbMF0rKzsKKyAgICAgICAgICBxX2Zy ZXFbTUlOKHEsIFFfRlJFUV9TSVpFKV0rKzsKKyNlbmRpZgorCisgICAgICAgICAgaWYgKFEgPD0g TDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHVpbnRtYXhfdCBnID0gUTsKKworICAg ICAgICAgICAgICBpZiAoIChRICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICBnIC89IDI7CisK KyAgICAgICAgICAgICAgZyAvPSBnY2Rfb2RkIChnLCBtdSk7CisKKyAgICAgICAgICAgICAgaWYg KGcgPD0gTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAocXBvcyA+ PSBRVUVVRV9TSVpFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAg ICAgZnByaW50ZiAoc3RkZXJyLCAic3F1Zm9mIHF1ZXVlIG92ZXJmbG93LlxuIik7CisgICAgICAg ICAgICAgICAgICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAg fQorICAgICAgICAgICAgICAgICAgcXVldWVbcXBvc10uUSA9IGc7CisgICAgICAgICAgICAgICAg ICBxdWV1ZVtxcG9zXS5QID0gUCAlIGc7CisgICAgICAgICAgICAgICAgICBxcG9zKys7CisgICAg ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogSSB0aGluayB0aGUg ZGlmZmVyZW5jZSBjYW4gYmUgZWl0aGVyIHNpZ24sIGJ1dCBtb2QKKyAgICAgICAgICAgICAyXldf VFlQRV9TSVpFIGFyaXRobWV0aWMgc2hvdWxkIGJlIGZpbmUuICovCisgICAgICAgICAgdCA9IFEx ICsgcSAqIChQIC0gUDEpOworICAgICAgICAgIFExID0gUTsKKyAgICAgICAgICBRID0gdDsKKyAg ICAgICAgICBQID0gUDE7CisKKyAgICAgICAgICBpZiAoIChpICYgMSkgPT0gMCkKKyAgICAgICAg ICAgIHsKKyAgICAgICAgICAgICAgdWludG1heF90IHIgPSBpc19zcXVhcmUgKFEpOworICAgICAg ICAgICAgICBpZiAocikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICB1bnNp Z25lZCBpbnQgajsKKworICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHFwb3M7IGor KykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWV1 ZVtqXS5RID09IHIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg ICAgICAgICAgIGlmIChyID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJh dmVyc2VkIGVudGlyZSBjeWNsZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3Rv IG5leHRfbXVsdGlwbGllcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkIHRo ZSBhYnNvbHV0ZSB2YWx1ZSBmb3IgZGl2aXNpYmlsaXR5IHRlc3QuICovCisgICAgICAgICAgICAg ICAgICAgICAgICAgIGlmIChQID49IHF1ZXVlW2pdLlApCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdCA9IFAgLSBxdWV1ZVtqXS5QOworICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNl CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHF1ZXVlW2pdLlAgLSBQOworICAgICAg ICAgICAgICAgICAgICAgICAgICBpZiAodCAlIHIgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgZW50cmll cyB1cCB0byBhbmQgaW5jbHVkaW5nIGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBqLCB3aGljaCBtYXRjaGVkLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg bWVtbW92ZSAocXVldWUsIHF1ZXVlICsgaiArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAocXBvcyAtIGogLSAxKSAqIHNpemVvZiAocXVldWVbMF0pKTsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHFwb3MgLT0gKGogKyAxKTsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dF9pOwor ICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAg ICAgICAgICAgICAgIC8qIFdlIGhhdmUgZm91bmQgYSBzcXVhcmUgZm9ybSwgd2hpY2ggc2hvdWxk IGdpdmUgYQorICAgICAgICAgICAgICAgICAgICAgZmFjdG9yLiAqLworICAgICAgICAgICAgICAg ICAgUTEgPSByOworICAgICAgICAgICAgICAgICAgYXNzZXJ0IChTID49IFApOyAvKiBXaGF0IHNp Z25zIGFyZSBwb3NzaWJsZT8gKi8KKyAgICAgICAgICAgICAgICAgIFAgKz0gciAqICgoUyAtIFAp IC8gcik7CisKKyAgICAgICAgICAgICAgICAgIC8qIE5vdGU6IFBhcGVyIHNheXMgKE4gLSBQKlAp IC8gUTEsIHRoYXQgc2VlbXMgaW5jb3JyZWN0CisgICAgICAgICAgICAgICAgICAgICBmb3IgdGhl IGNhc2UgRCA9IDJOLiAqLworICAgICAgICAgICAgICAgICAgLyogQ29tcHV0ZSBRID0gKEQgLSBQ KlApIC8gUTEsIGJ1dCB3ZSBuZWVkIGRvdWJsZQorICAgICAgICAgICAgICAgICAgICAgcHJlY2lz aW9uLiAqLworICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50bWF4 X3QgaGksIGxvLCByZW07CisgICAgICAgICAgICAgICAgICAgIHVtdWxfcHBtbSAoaGksIGxvLCBQ LCBQKTsKKyAgICAgICAgICAgICAgICAgICAgc3ViX2RkbW1zcyAoaGksIGxvLCBEaCwgRGwsIGhp LCBsbyk7CisgICAgICAgICAgICAgICAgICAgIHVkaXZfcXJubmQgKFEsIHJlbSwgaGksIGxvLCBR MSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCAocmVtID09IDApOworICAgICAgICAgICAg ICAgICAgfQorCisgICAgICAgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgICAgICAg ICB7CisgICAgICAgICAgICAgICAgICAgICAgdWludG1heF90IHI7CisKKyAgICAgICAgICAgICAg ICAgICAgICAvKiBOb3RlOiBUaGVyZSBhcHBlYXJzIHRvIGJ5IGEgdHlwbyBpbiB0aGUgcGFwZXIs CisgICAgICAgICAgICAgICAgICAgICAgICAgU3RlcCA0YSBpbiB0aGUgYWxnb3JpdGhtIGRlc2Ny aXB0aW9uIHNheXMgcSA8LS0KKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vcihbUytQXS9c aGF0IFEpLCBidXQgbG9va2luZyBhdCB0aGUgZXF1YXRpb25zCisgICAgICAgICAgICAgICAgICAg ICAgICAgaW4gU2VjLiAzLjEsIGl0IHNob3VsZCBiZSBxIDwtLSBmbG9vcihbUytQXSAvIFEpLgor ICAgICAgICAgICAgICAgICAgICAgICAgIChJbiB0aGlzIGNvZGUsIFxoYXQgUSBpcyBRMSkuICov CisgICAgICAgICAgICAgICAgICAgICAgZGl2X3NtYWxscSAocSwgciwgUytQLCBRKTsKKyAgICAg ICAgICAgICAgICAgICAgICBQMSA9IFMgLSByOyAgICAgICAvKiBQMSA9IHEqUSAtIFAgKi8KKwor I2lmIFNUQVRfU1FVRk9GCisgICAgICAgICAgICAgICAgICAgICAgcV9mcmVxWzBdKys7CisgICAg ICAgICAgICAgICAgICAgICAgcV9mcmVxW01JTihxLCBRX0ZSRVFfU0laRSldKys7CisjZW5kaWYK KyAgICAgICAgICAgICAgICAgICAgICBpZiAoUCA9PSBQMSkKKyAgICAgICAgICAgICAgICAgICAg ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIHQgPSBRMSArIHEgKiAoUCAtIFAxKTsK KyAgICAgICAgICAgICAgICAgICAgICBRMSA9IFE7CisgICAgICAgICAgICAgICAgICAgICAgUSA9 IHQ7CisgICAgICAgICAgICAgICAgICAgICAgUCA9IFAxOworICAgICAgICAgICAgICAgICAgICB9 CisKKyAgICAgICAgICAgICAgICAgIGlmICggKFEgJiAxKSA9PSAwKQorICAgICAgICAgICAgICAg ICAgICBRIC89IDI7CisgICAgICAgICAgICAgICAgICBRIC89IGdjZF9vZGQgKFEsIG11KTsKKwor ICAgICAgICAgICAgICAgICAgYXNzZXJ0IChRID4gMSAmJiAobjEgfHwgUSA8IG4wKSk7CisKKyAg ICAgICAgICAgICAgICAgIGlmIChwcmltZV9wIChRKSkKKyAgICAgICAgICAgICAgICAgICAgZmFj dG9yX2luc2VydCAoZmFjdG9ycywgUSk7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAg ICAgICAgICAgICAgIGZhY3Rvcl91c2luZ19zcXVmb2YgKDAsIFEsIGZhY3RvcnMpOworCisgICAg ICAgICAgICAgICAgICBkaXZleGFjdF8yMSAobjEsIG4wLCBuMSwgbjAsIFEpOworCisgICAgICAg ICAgICAgICAgICBpZiAocHJpbWUyX3AgKG4xLCBuMCkpCisgICAgICAgICAgICAgICAgICAgIGZh Y3Rvcl9pbnNlcnRfbGFyZ2UgKGZhY3RvcnMsIG4xLCBuMCk7CisgICAgICAgICAgICAgICAgICBl bHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAobjEg PT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl91c2luZ19wb2xsYXJkX3JobyAo bjAsIDEsIGZhY3RvcnMpOworICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg ICAgICAgICAgICAgIGZhY3Rvcl91c2luZ19zcXVmb2YgKG4xLCBuMCwgZmFjdG9ycyk7CisgICAg ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAg ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgbmV4dF9pOgorICAgICAgICAgIDsKKyAg ICAgICAgfQorICAgIG5leHRfbXVsdGlwbGllcjoKKyAgICAgIDsKICAgICB9Ci0gIHB1dGNoYXIg KCdcbicpOwotICBmcmVlIChmYWNsaXN0KTsKKyAgZnByaW50ZiAoc3RkZXJyLCAic3F1Zm9mIGZh aWxlZC5cbiIpOworICBleGl0IChFWElUX0ZBSUxVUkUpOwogfQoKIHN0YXRpYyB2b2lkCi1mcmVl X2ZhY3RvcnMgKHZvaWQpCitmYWN0b3IgKHVpbnRtYXhfdCB0MSwgdWludG1heF90IHQwLCBzdHJ1 Y3QgZmFjdG9ycyAqZmFjdG9ycykKIHsKLSAgc2l6ZV90IGk7CisgIGZhY3RvcnMtPm5mYWN0b3Jz ID0gMDsKKyAgZmFjdG9ycy0+cGxhcmdlWzFdID0gMDsKKworICBpZiAodDEgPT0gMCAmJiB0MCA8 IDIpCisgICAgcmV0dXJuOwoKLSAgZm9yIChpID0gMDsgaSA8IG5mYWN0b3JzX2ZvdW5kOyArK2kp CisgIHQwID0gZmFjdG9yX3VzaW5nX2RpdmlzaW9uICgmdDEsIHQxLCB0MCwgZmFjdG9ycyk7CisK KyAgaWYgKHQxID09IDApCisgICAgeworICAgICAgaWYgKHQwICE9IDEpCisgICAgICAgIHsKKyAg ICAgICAgICBpZiAocHJpbWVfcCAodDApKQorICAgICAgICAgICAgZmFjdG9yX2luc2VydCAoZmFj dG9ycywgdDApOworICAgICAgICAgIGVsc2UgaWYgKGFsZyA9PSBBTEdfUE9MTEFSRF9SSE8pCisg ICAgICAgICAgICBmYWN0b3JfdXNpbmdfcG9sbGFyZF9yaG8gKHQwLCAxLCBmYWN0b3JzKTsKKyAg ICAgICAgICBlbHNlCisgICAgICAgICAgICBmYWN0b3JfdXNpbmdfc3F1Zm9mICgwLCB0MCwgZmFj dG9ycyk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKICAgICB7Ci0gICAgICBtcHpfY2xlYXIg KGZhY3RvcltpXSk7CisgICAgICBpZiAocHJpbWUyX3AgKHQxLCB0MCkpCisgICAgICAgIGZhY3Rv cl9pbnNlcnRfbGFyZ2UgKGZhY3RvcnMsIHQxLCB0MCk7CisgICAgICBlbHNlIGlmIChhbGcgPT0g QUxHX1BPTExBUkRfUkhPKQorICAgICAgICBmYWN0b3JfdXNpbmdfcG9sbGFyZF9yaG8yICh0MSwg dDAsIDEsIGZhY3RvcnMpOworICAgICAgZWxzZQorICAgICAgICBmYWN0b3JfdXNpbmdfc3F1Zm9m ICh0MSwgdDAsIGZhY3RvcnMpOwogICAgIH0KLSAgLyogRG9uJ3QgYWN0dWFsbHkgZnJlZSBmYWN0 b3JbXSBiZWNhdXNlIGluIHRoZSBjYXNlIHdoZXJlIHdlIGFyZQotICAgICByZWFkaW5nIG51bWJl cnMgZnJvbSBzdGRpbiwgd2UgbWF5IGJlIGFib3V0IHRvIHVzZSBpdCBhZ2Fpbi4gICovCi0gIG5m YWN0b3JzX2ZvdW5kID0gMDsKIH0KCi0vKiBBcmJpdHJhcnktcHJlY2lzaW9uIGZhY3RvcmluZyAq LworI2lmIEhBVkVfR01QCiBzdGF0aWMgdm9pZAotcHJpbnRfZmFjdG9yc19tdWx0aSAobXB6X3Qg dCkKK21wX2ZhY3RvciAobXB6X3QgdCwgc3RydWN0IG1wX2ZhY3RvcnMgKmZhY3RvcnMpCiB7Ci0g IG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCB0KTsKLSAgcHV0Y2hhciAoJzonKTsKKyAgbXBfZmFj dG9yX2luaXQgKGZhY3RvcnMpOwoKICAgaWYgKG1wel9zZ24gKHQpICE9IDApCiAgICAgewotICAg ICAgLyogU2V0IHRoZSB0cmlhbCBkaXZpc2lvbiBsaW1pdCBhY2NvcmRpbmcgdG8gdGhlIHNpemUg b2YgdC4gICovCi0gICAgICBzaXplX3Qgbl9iaXRzID0gbXB6X3NpemVpbmJhc2UgKHQsIDIpOwot ICAgICAgdW5zaWduZWQgaW50IGRpdmlzaW9uX2xpbWl0ID0gTUlOIChuX2JpdHMsIDEwMDApOwot ICAgICAgZGl2aXNpb25fbGltaXQgKj0gZGl2aXNpb25fbGltaXQ7Ci0KLSAgICAgIGZhY3Rvcl91 c2luZ19kaXZpc2lvbiAodCwgZGl2aXNpb25fbGltaXQpOworICAgICAgbXBfZmFjdG9yX3VzaW5n X2RpdmlzaW9uICh0LCBmYWN0b3JzKTsKCiAgICAgICBpZiAobXB6X2NtcF91aSAodCwgMSkgIT0g MCkKICAgICAgICAgewotICAgICAgICAgIGRlYnVnICgiW2lzIG51bWJlciBwcmltZT9dICIpOwot ICAgICAgICAgIGlmIChtcHpfcHJvYmFiX3ByaW1lX3AgKHQsIE1SX1JFUFMpKQotICAgICAgICAg ICAgZW1pdF9mYWN0b3IgKHQpOworICAgICAgICAgIGlmIChmbGFnX3ZlcmJvc2UgPiAwKQorICAg ICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGYgKCJbaXMgbnVtYmVyIHByaW1lP10gIik7 CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1wX3ByaW1lX3AgKHQpKQorICAgICAgICAg ICAgbXBfZmFjdG9yX2luc2VydCAoZmFjdG9ycywgdCk7CiAgICAgICAgICAgZWxzZQotICAgICAg ICAgICAgZmFjdG9yX3VzaW5nX3BvbGxhcmRfcmhvICh0LCAxKTsKKyAgICAgICAgICAgIG1wX2Zh Y3Rvcl91c2luZ19wb2xsYXJkX3JobyAodCwgMSwgZmFjdG9ycyk7CiAgICAgICAgIH0KICAgICB9 Ci0KLSAgbXB6X2NsZWFyICh0KTsKLSAgc29ydF9hbmRfcHJpbnRfZmFjdG9ycyAoKTsKLSAgZnJl ZV9mYWN0b3JzICgpOwogfQogI2VuZGlmCgotCi0vKiBFbWl0IHRoZSBmYWN0b3JzIG9mIHRoZSBp bmRpY2F0ZWQgbnVtYmVyLiAgSWYgd2UgaGF2ZSB0aGUgb3B0aW9uIG9mIHVzaW5nCi0gICBlaXRo ZXIgYWxnb3JpdGhtLCB3ZSBzZWxlY3Qgb24gdGhlIGJhc2lzIG9mIHRoZSBsZW5ndGggb2YgdGhl IG51bWJlci4KLSAgIEZvciBsb25nZXIgbnVtYmVycywgd2UgcHJlZmVyIHRoZSBNUCBhbGdvcml0 aG0gZXZlbiBpZiB0aGUgbmF0aXZlIGFsZ29yaXRobQotICAgaGFzIGVub3VnaCBkaWdpdHMsIGJl Y2F1c2UgdGhlIGFsZ29yaXRobSBpcyBiZXR0ZXIuICBUaGUgdHVybm92ZXIgcG9pbnQKLSAgIGRl cGVuZHMgb24gdGhlIHZhbHVlLiAgKi8KLXN0YXRpYyBib29sCi1wcmludF9mYWN0b3JzIChjaGFy IGNvbnN0ICpzKQorc3RhdGljIGludAorc3RydG8ydWludG1heCAodWludG1heF90ICpoaXAsIHVp bnRtYXhfdCAqbG9wLCBjb25zdCBjaGFyICpzKQogewotICB1aW50bWF4X3QgbjsKLSAgc3RydG9s X2Vycm9yIGVyciA9IHhzdHJ0b3VtYXggKHMsIE5VTEwsIDEwLCAmbiwgIiIpOworICBpbnQgZXJy Y29kZTsKKyAgdW5zaWduZWQgaW50IGxvX2NhcnJ5OworICB1aW50bWF4X3QgaGksIGxvOwoKLSNp ZiBIQVZFX0dNUAotICBlbnVtIHsgR01QX1RVUk5PVkVSX1BPSU5UID0gMTAwMDAwIH07CisgIGVy cmNvZGUgPSAtMTsKCi0gIGlmIChlcnIgPT0gTE9OR0lOVF9PVkVSRkxPVwotICAgICAgfHwgKGVy ciA9PSBMT05HSU5UX09LICYmIEdNUF9UVVJOT1ZFUl9QT0lOVCA8PSBuKSkKKyAgaGkgPSBsbyA9 IDA7CisgIGZvciAoOzspCiAgICAgewotICAgICAgbXB6X3QgdDsKLSAgICAgIG1wel9pbml0ICh0 KTsKLSAgICAgIGlmIChnbXBfc3NjYW5mIChzLCAiJVpkIiwgdCkgPT0gMSkKKyAgICAgIHVuc2ln bmVkIGludCBjID0gKnMrKzsKKyAgICAgIGlmIChjID09IDApCisgICAgICAgIGJyZWFrOworCisg ICAgICBpZiAoVU5MSUtFTFkgKGMgPCAnMCcgfHwgYyA+ICc5JykpCiAgICAgICAgIHsKLSAgICAg ICAgICBkZWJ1ZyAoIlslc10iLCBfKCJ1c2luZyBhcmJpdHJhcnktcHJlY2lzaW9uIGFyaXRobWV0 aWMiKSk7Ci0gICAgICAgICAgcHJpbnRfZmFjdG9yc19tdWx0aSAodCk7Ci0gICAgICAgICAgcmV0 dXJuIHRydWU7CisgICAgICAgICAgZXJyY29kZSA9IC0xOworICAgICAgICAgIGJyZWFrOwogICAg ICAgICB9Ci0gICAgICBlcnIgPSBMT05HSU5UX0lOVkFMSUQ7Ci0gICAgfQotI2VuZGlmCisgICAg ICBjIC09ICcwJzsKCi0gIHN3aXRjaCAoZXJyKQotICAgIHsKLSAgICBjYXNlIExPTkdJTlRfT0s6 Ci0gICAgICBkZWJ1ZyAoIlslc10iLCBfKCJ1c2luZyBzaW5nbGUtcHJlY2lzaW9uIGFyaXRobWV0 aWMiKSk7Ci0gICAgICBwcmludF9mYWN0b3JzX3NpbmdsZSAobik7Ci0gICAgICByZXR1cm4gdHJ1 ZTsKKyAgICAgIGVycmNvZGUgPSAwOyAgICAgICAgICAgICAgLyogd2UndmUgc2VlbiBhdCBsZWFz dCBvbmUgdmFsaWQgZGlnaXQgKi8KKworICAgICAgaWYgKFVOTElLRUxZIChoaSA+IH4odWludG1h eF90KTAgLyAxMCkpCisgICAgICAgIHsKKyAgICAgICAgICBlcnJjb2RlID0gLTE7IC8qIG92ZXJm bG93ICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGhpID0gMTAgKiBoaTsK Ci0gICAgY2FzZSBMT05HSU5UX09WRVJGTE9XOgotICAgICAgZXJyb3IgKDAsIDAsIF8oIiVzIGlz IHRvbyBsYXJnZSIpLCBxdW90ZSAocykpOwotICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgbG9f Y2FycnkgPSAobG8gPj4gKFdfVFlQRV9TSVpFIC0gMykpICsgKGxvID4+IChXX1RZUEVfU0laRSAt IDEpKTsKKyAgICAgIGxvX2NhcnJ5ICs9IDEwICogbG8gPCAyICogbG87CgotICAgIGRlZmF1bHQ6 Ci0gICAgICBlcnJvciAoMCwgMCwgXygiJXMgaXMgbm90IGEgdmFsaWQgcG9zaXRpdmUgaW50ZWdl ciIpLCBxdW90ZSAocykpOwotICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgbG8gPSAxMCAqIGxv OworICAgICAgbG8gKz0gYzsKKworICAgICAgbG9fY2FycnkgKz0gbG8gPCBjOworICAgICAgaGkg Kz0gbG9fY2Fycnk7CisgICAgICBpZiAoVU5MSUtFTFkgKGhpIDwgbG9fY2FycnkpKQorICAgICAg ICB7CisgICAgICAgICAgZXJyY29kZSA9IC0xOyAvKiBvdmVyZmxvdyAqLworICAgICAgICAgIGJy ZWFrOworICAgICAgICB9CiAgICAgfQotfQoKLWVudW0KLXsKLSAgVkVSQk9TRV9PUFRJT04gPSBD SEFSX01BWCArIDEKLX07CisgICpoaXAgPSBoaTsKKyAgKmxvcCA9IGxvOwoKLXN0YXRpYyBzdHJ1 Y3Qgb3B0aW9uIGNvbnN0IGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyJ2ZXJib3NlIiwgbm9fYXJn dW1lbnQsIE5VTEwsIFZFUkJPU0VfT1BUSU9OfSwKLSAge0dFVE9QVF9IRUxQX09QVElPTl9ERUNM fSwKLSAge0dFVE9QVF9WRVJTSU9OX09QVElPTl9ERUNMfSwKLSAge05VTEwsIDAsIE5VTEwsIDB9 Ci19OworICByZXR1cm4gZXJyY29kZTsKK30KCi12b2lkCi11c2FnZSAoaW50IHN0YXR1cykKK3N0 YXRpYyB2b2lkCitwcmludF91aW50bWF4ZXMgKHVpbnRtYXhfdCB0MSwgdWludG1heF90IHQwKQog ewotICBpZiAoc3RhdHVzICE9IEVYSVRfU1VDQ0VTUykKLSAgICBlbWl0X3RyeV9oZWxwICgpOwor ICB1aW50bWF4X3QgcSwgcjsKKworICBpZiAodDEgPT0gMCkKKyAgICBwcmludGYgKCIlanUiLCB0 MCk7CiAgIGVsc2UKICAgICB7Ci0gICAgICBwcmludGYgKF8oIlwKLVVzYWdlOiAlcyBbTlVNQkVS XS4uLlxuXAotICBvcjogICVzIE9QVElPTlxuXAotIiksCi0gICAgICAgICAgICAgIHByb2dyYW1f bmFtZSwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIGZwdXRzIChfKCJcCi1QcmludCB0aGUgcHJpbWUg ZmFjdG9ycyBvZiBlYWNoIHNwZWNpZmllZCBpbnRlZ2VyIE5VTUJFUi4gIElmIG5vbmVcblwKLWFy ZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgcmVhZCB0aGVtIGZyb20gc3RhbmRhcmQg aW5wdXQuXG5cCi1cblwKLSIpLCBzdGRvdXQpOwotICAgICAgZnB1dHMgKEhFTFBfT1BUSU9OX0RF U0NSSVBUSU9OLCBzdGRvdXQpOwotICAgICAgZnB1dHMgKFZFUlNJT05fT1BUSU9OX0RFU0NSSVBU SU9OLCBzdGRvdXQpOwotICAgICAgZW1pdF9hbmNpbGxhcnlfaW5mbyAoKTsKKyAgICAgIC8qIFVz ZSB2ZXJ5IHBsYWluIGNvZGUgaGVyZSBzaW5jZSBpdCBzZWVtcyBoYXJkIHRvIHdyaXRlIGZhc3Qg Y29kZQorICAgICAgICAgd2l0aG91dCBhc3N1bWluZyBhIHNwZWNpZmljIHdvcmQgc2l6ZS4gICov CisgICAgICBxID0gdDEgLyAxMDAwMDAwMDAwOworICAgICAgciA9IHQxICUgMTAwMDAwMDAwMDsK KyAgICAgIHVkaXZfcXJubmQgKHQwLCByLCByLCB0MCwgMTAwMDAwMDAwMCk7CisgICAgICBwcmlu dF91aW50bWF4ZXMgKHEsIHQwKTsKKyAgICAgIHByaW50ZiAoIiUwOXUiLCAoaW50KSByKTsKICAg ICB9Ci0gIGV4aXQgKHN0YXR1cyk7CiB9Cgotc3RhdGljIGJvb2wKLWRvX3N0ZGluICh2b2lkKQor c3RhdGljIHZvaWQKK2ZhY3Rvcl9vbmUgKGNvbnN0IGNoYXIgKmlucHV0KQogewotICBib29sIG9r ID0gdHJ1ZTsKLSAgdG9rZW5fYnVmZmVyIHRva2VuYnVmZmVyOworICB1aW50bWF4X3QgdDEsIHQw OworICBpbnQgZXJyY29kZTsKKworICAvKiBUcnkgY29udmVydGluZyB0aGUgbnVtYmVyIHRvIG9u ZSBvciB0d28gd29yZHMuICBJZiBpdCBmYWlscywgdXNlIEdNUCBvcgorICAgICBwcmludCBhbiBl cnJvciBtZXNzYWdlLiAgVGhlIDJuZCBjb25kaXRpb24gY2hlY2tzIHRoYXQgdGhlIG1vc3QKKyAg ICAgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSB0d28td29yZCBudW1iZXIgaXMgY2xlYXIsIGluIGEg dHlwZXNpemUgbmV1dHJhbAorICAgICB3YXkuICAqLworICBlcnJjb2RlID0gc3RydG8ydWludG1h eCAoJnQxLCAmdDAsIGlucHV0KTsKKyAgaWYgKGVycmNvZGUgPT0gMCAmJiAoKHQxIDw8IDEpID4+ IDEpID09IHQxKQorICAgIHsKKyAgICAgIHN0cnVjdCBmYWN0b3JzIGZhY3RvcnM7CgotICBpbml0 X3Rva2VuYnVmZmVyICgmdG9rZW5idWZmZXIpOworICAgICAgcHJpbnRfdWludG1heGVzICh0MSwg dDApOworICAgICAgcHJpbnRmICgiOiIpOwoKLSAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAg c2l6ZV90IHRva2VuX2xlbmd0aCA9IHJlYWR0b2tlbiAoc3RkaW4sIERFTElNLCBzaXplb2YgKERF TElNKSAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9rZW5i dWZmZXIpOwotICAgICAgaWYgKHRva2VuX2xlbmd0aCA9PSAoc2l6ZV90KSAtMSkKLSAgICAgICAg YnJlYWs7Ci0gICAgICBvayAmPSBwcmludF9mYWN0b3JzICh0b2tlbmJ1ZmZlci5idWZmZXIpOwor ICAgICAgZmFjdG9yICh0MSwgdDAsICZmYWN0b3JzKTsKKworICAgICAgZm9yICh1bnNpZ25lZCBp bnQgaiA9IDA7IGogPCBmYWN0b3JzLm5mYWN0b3JzOyBqKyspCisgICAgICAgIGZvciAodW5zaWdu ZWQgaW50IGsgPSAwOyBrIDwgZmFjdG9ycy5lW2pdOyBrKyspCisgICAgICAgICAgcHJpbnRmICgi ICVqdSIsIGZhY3RvcnMucFtqXSk7CisKKyAgICAgIGlmIChmYWN0b3JzLnBsYXJnZVsxXSkKKyAg ICAgICAgeworICAgICAgICAgIHByaW50ZiAoIiAiKTsKKyAgICAgICAgICBwcmludF91aW50bWF4 ZXMgKGZhY3RvcnMucGxhcmdlWzFdLCBmYWN0b3JzLnBsYXJnZVswXSk7CisgICAgICAgIH0KKyAg ICAgIHB1dHMgKCIiKTsKICAgICB9Ci0gIGZyZWUgKHRva2VuYnVmZmVyLmJ1ZmZlcik7CisgIGVs c2UKKyAgICB7CisjaWYgSEFWRV9HTVAKKyAgICAgIG1wel90IHQ7CisgICAgICBzdHJ1Y3QgbXBf ZmFjdG9ycyBmYWN0b3JzOworCisgICAgICBtcHpfaW5pdF9zZXRfc3RyICh0LCBpbnB1dCwgMTAp OwoKLSAgcmV0dXJuIG9rOworICAgICAgZ21wX3ByaW50ZiAoIiVaZDoiLCB0KTsKKyAgICAgIG1w X2ZhY3RvciAodCwgJmZhY3RvcnMpOworCisgICAgICBmb3IgKHVuc2lnbmVkIGludCBqID0gMDsg aiA8IGZhY3RvcnMubmZhY3RvcnM7IGorKykKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgayA9 IDA7IGsgPCBmYWN0b3JzLmVbal07IGsrKykKKyAgICAgICAgICBnbXBfcHJpbnRmICgiICVaZCIs IGZhY3RvcnMucFtqXSk7CisKKyAgICAgIG1wX2ZhY3Rvcl9jbGVhciAoJmZhY3RvcnMpOworICAg ICAgbXB6X2NsZWFyICh0KTsKKyAgICAgIHB1dHMgKCIiKTsKKyNlbHNlCisgICAgICBmcHJpbnRm IChzdGRlcnIsICJlcnJvcjogbnVtYmVyICVzIG5vdCBwYXJzYWJsZSBvciB0b28gbGFyZ2VcbiIs IGlucHV0KTsKKyAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7CisjZW5kaWYKKyAgICB9CiB9Cgor c3RydWN0IGluYnVmCit7CisgIGNoYXIgKmJ1ZjsKKyAgc2l6ZV90IGFsbG9jOworfTsKKworLyog UmVhZCB3aGl0ZS1zcGFjZSBkZWxpbWl0ZWQgaXRlbXMuIFJldHVybiAxIG9uIHN1Y2Nlc3MsIDAg b24gRU9GLgorICAgRXhpdCBvbiBJL08gZXJyb3JzLiAqLwogaW50Ci1tYWluIChpbnQgYXJnYywg Y2hhciAqKmFyZ3YpCityZWFkX2l0ZW0gKHN0cnVjdCBpbmJ1ZiAqYnVmc3RydWN0KQogewotICBi b29sIG9rOwogICBpbnQgYzsKKyAgc2l6ZV90IGk7CisgIGNoYXIgKmJ1ZiA9IGJ1ZnN0cnVjdC0+ YnVmOwoKLSAgaW5pdGlhbGl6ZV9tYWluICgmYXJnYywgJmFyZ3YpOwotICBzZXRfcHJvZ3JhbV9u YW1lIChhcmd2WzBdKTsKLSAgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsKLSAgYmluZHRleHRkb21h aW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIGF0 ZXhpdCAoY2xvc2Vfc3Rkb3V0KTsKKyAgZG8KKyAgICBjID0gZ2V0Y2hhcl91bmxvY2tlZCAoKTsK KyAgd2hpbGUgKGlzc3BhY2UgKGMpKTsKCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdj LCBhcmd2LCAiIiwgbG9uZ19vcHRpb25zLCBOVUxMKSkgIT0gLTEpCisgIGZvciAoaSA9IDA7ICFp c3NwYWNlKGMpOyBpKyspCiAgICAgewotICAgICAgc3dpdGNoIChjKQorICAgICAgaWYgKGMgPCAw KQogICAgICAgICB7Ci0gICAgICAgIGNhc2UgVkVSQk9TRV9PUFRJT046Ci0gICAgICAgICAgdmVy Ym9zZSA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZV9HRVRPUFRfSEVM UF9DSEFSOwotCi0gICAgICAgIGNhc2VfR0VUT1BUX1ZFUlNJT05fQ0hBUiAoUFJPR1JBTV9OQU1F LCBBVVRIT1JTKTsKKyAgICAgICAgICBpZiAoZmVycm9yIChzdGRpbikpCisgICAgICAgICAgICB7 CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgInJlYWQgZXJyb3Igb24gc3RkaW46ICVz XG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICBleGl0IChFWElUX0ZBSUxVUkUp OworICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICByZXR1 cm4gMDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQoKLSAg ICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB1c2FnZSAoRVhJVF9GQUlMVVJFKTsKKyAgICAgIGlm IChVTkxJS0VMWSAoYnVmc3RydWN0LT5hbGxvYyA8PSBpICsgMSkpIC8qICsxIGJ5dGUgZm9yIHRl cm1pbmF0aW5nIE5VTCAqLworICAgICAgICB7CisgICAgICAgICAgYnVmc3RydWN0LT5hbGxvYyA9 IGJ1ZnN0cnVjdC0+YWxsb2MgKiA1IC8gNCArIDE7CisgICAgICAgICAgYnVmc3RydWN0LT5idWYg PSByZWFsbG9jIChidWZzdHJ1Y3QtPmJ1ZiwgYnVmc3RydWN0LT5hbGxvYyk7CisgICAgICAgICAg YnVmID0gYnVmc3RydWN0LT5idWY7CiAgICAgICAgIH0KKworICAgICAgYnVmW2ldID0gYzsKKyAg ICAgIGMgPSBnZXRjaGFyX3VubG9ja2VkICgpOwogICAgIH0KCi0gIGlmIChhcmdjIDw9IG9wdGlu ZCkKLSAgICBvayA9IGRvX3N0ZGluICgpOworICBidWZbaV0gPSAnXDAnOworICByZXR1cm4gMTsK K30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgYzsKKwor ICBhbGcgPSBBTEdfUE9MTEFSRF9SSE87ICAgICAgICAvKiBEZWZhdWx0IHRvIFBvbGxhcmQgcmhv ICovCisKKyAgd2hpbGUgKCAoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAic3Z3IikpICE9IC0xKQor ICAgIHN3aXRjaCAoYykKKyAgICAgIHsKKyAgICAgIGNhc2UgJ3MnOgorICAgICAgICBhbGcgPSBB TEdfU1FVRk9GOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3YnOgorICAgICAgICBmbGFn X3ZlcmJvc2UgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3cnOgorICAgICAgICBm bGFnX3Byb3ZlX3ByaW1hbGl0eSA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPyc6 CisgICAgICAgIHByaW50ZiAoIlVzYWdlOiAlcyBbLXNdIG51bWJlciAuLi5cbiIsIGFyZ3ZbMF0p OworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgfQorI2lmIFNUQVRfU1FVRk9G CisgIGlmIChhbGcgPT0gQUxHX1NRVUZPRikKKyAgICBtZW1zZXQgKHFfZnJlcSwgMCwgc2l6ZW9m IChxX2ZyZXEpKTsKKyNlbmRpZgorCisgIGlmIChvcHRpbmQgPCBhcmdjKQorICAgIGZvciAoaW50 IGkgPSBvcHRpbmQ7IGkgPCBhcmdjOyBpKyspCisgICAgICBmYWN0b3Jfb25lIChhcmd2W2ldKTsK ICAgZWxzZQogICAgIHsKLSAgICAgIGludCBpOwotICAgICAgb2sgPSB0cnVlOwotICAgICAgZm9y IChpID0gb3B0aW5kOyBpIDwgYXJnYzsgaSsrKQotICAgICAgICBpZiAoISBwcmludF9mYWN0b3Jz IChhcmd2W2ldKSkKLSAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgc3RydWN0IGluYnVmIGJ1 ZnN0cnVjdDsKKyAgICAgIGJ1ZnN0cnVjdC5hbGxvYyA9IDUwOyAgICAgLyogZW5vdWdoIHVubGVz cyBIQVZFX0dNUCAqLworICAgICAgYnVmc3RydWN0LmJ1ZiA9IG1hbGxvYyAoYnVmc3RydWN0LmFs bG9jKTsKKyAgICAgIHdoaWxlIChyZWFkX2l0ZW0gKCZidWZzdHJ1Y3QpKQorICAgICAgICBmYWN0 b3Jfb25lIChidWZzdHJ1Y3QuYnVmKTsKKyAgICB9CisKKyNpZiBTVEFUX1NRVUZPRgorICBpZiAo YWxnID09IEFMR19TUVVGT0YgJiYgcV9mcmVxWzBdID4gMCkKKyAgICB7CisgICAgICBkb3VibGUg YWNjX2Y7CisgICAgICBwcmludGYgKCJxICBmcmVxLiAgY3VtLiBmcmVxLih0b3RhbDogJWQpXG4i LCBxX2ZyZXFbMF0pOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDEsIGFjY19mID0gMC4w OyBpIDw9IFFfRlJFUV9TSVpFOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBkb3VibGUgZiA9 IChkb3VibGUpIHFfZnJlcVtpXSAvIHFfZnJlcVswXTsKKyAgICAgICAgICBhY2NfZiArPSBmOwor ICAgICAgICAgIHByaW50ZiAoIiVzJWQgJS4yZiUlICUuMmYlJVxuIiwgaSA9PSBRX0ZSRVFfU0la RSA/ICI+PSIgOiAiIiwgaSwKKyAgICAgICAgICAgICAgICAgIDEwMC4wICogZiwgMTAwLjAgKiBh Y2NfZik7CisgICAgICAgIH0KICAgICB9Ci0jaWYgSEFWRV9HTVAKLSAgZnJlZSAoZmFjdG9yKTsK ICNlbmRpZgotICBleGl0IChvayA/IEVYSVRfU1VDQ0VTUyA6IEVYSVRfRkFJTFVSRSk7CisKKyAg ZXhpdCAoRVhJVF9TVUNDRVNTKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9sb25nbG9uZy5oIGIvc3Jj L2xvbmdsb25nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRlMzJlZQot LS0gL2Rldi9udWxsCisrKyBiL3NyYy9sb25nbG9uZy5oCkBAIC0wLDAgKzEsMjE1NiBAQAorLyog bG9uZ2xvbmcuaCAtLSBkZWZpbml0aW9ucyBmb3IgbWl4ZWQgc2l6ZSAzMi82NCBiaXQgYXJpdGht ZXRpYy4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTcsIDE5 OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsCisyMDA0LCAyMDA1LCAyMDA3LCAyMDA4LCAyMDA5 LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRl ciB0aGUKK3Rlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg cHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lv biAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorbGF0ZXIgdmVyc2lv bi4KKworVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi ZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w bGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElD VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug Zm9yIG1vcmUKK2RldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIGZp bGUuICBJZiBub3QsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworLyog WW91IGhhdmUgdG8gZGVmaW5lIHRoZSBmb2xsb3dpbmcgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZp bGU6CisKKyAgIFVXdHlwZSAtLSBBbiB1bnNpZ25lZCB0eXBlLCBkZWZhdWx0IHR5cGUgZm9yIG9w ZXJhdGlvbnMgKHR5cGljYWxseSBhICJ3b3JkIikKKyAgIFVIV3R5cGUgLS0gQW4gdW5zaWduZWQg dHlwZSwgYXQgbGVhc3QgaGFsZiB0aGUgc2l6ZSBvZiBVV3R5cGUKKyAgIFVEV3R5cGUgLS0gQW4g dW5zaWduZWQgdHlwZSwgYXQgbGVhc3QgdHdpY2UgYXMgbGFyZ2UgYSBVV3R5cGUKKyAgIFdfVFlQ RV9TSVpFIC0tIHNpemUgaW4gYml0cyBvZiBVV3R5cGUKKworICAgU0l0eXBlLCBVU0l0eXBlIC0t IFNpZ25lZCBhbmQgdW5zaWduZWQgMzIgYml0IHR5cGVzCisgICBESXR5cGUsIFVESXR5cGUgLS0g U2lnbmVkIGFuZCB1bnNpZ25lZCA2NCBiaXQgdHlwZXMKKworICAgT24gYSAzMiBiaXQgbWFjaGlu ZSBVV3R5cGUgc2hvdWxkIHR5cGljYWxseSBiZSBVU0l0eXBlOworICAgb24gYSA2NCBiaXQgbWFj aGluZSwgVVd0eXBlIHNob3VsZCB0eXBpY2FsbHkgYmUgVURJdHlwZS4KKworICAgT3B0aW9uYWxs eSwgZGVmaW5lOgorCisgICBMT05HTE9OR19TVEFOREFMT05FIC0tIEF2b2lkIGNvZGUgdGhhdCBu ZWVkcyBtYWNoaW5lLWRlcGVuZGVudCBzdXBwb3J0IGZpbGVzCisgICBOT19BU00gLS0gRGlzYWJs ZSBpbmxpbmUgYXNtCisKKworICAgQ0FVVElPTiEgIFVzaW5nIHRoaXMgdmVyc2lvbiBvZiBsb25n bG9uZy5oIG91dHNpZGUgb2YgR01QIGlzIG5vdCBzYWZlLiAgWW91CisgICBuZWVkIHRvIGluY2x1 ZGUgZ21wLmggYW5kIGdtcC1pbXBsLmgsIG9yIGNlcnRhaW4gdGhpbmdzIG1pZ2h0IG5vdCB3b3Jr IGFzCisgICBleHBlY3RlZC4KKyovCisKKyNkZWZpbmUgX19CSVRTNCAoV19UWVBFX1NJWkUgLyA0 KQorI2RlZmluZSBfX2xsX0IgKChVV3R5cGUpIDEgPDwgKFdfVFlQRV9TSVpFIC8gMikpCisjZGVm aW5lIF9fbGxfbG93cGFydCh0KSAoKFVXdHlwZSkgKHQpICYgKF9fbGxfQiAtIDEpKQorI2RlZmlu ZSBfX2xsX2hpZ2hwYXJ0KHQpICgoVVd0eXBlKSAodCkgPj4gKFdfVFlQRV9TSVpFIC8gMikpCisK Ky8qIFRoaXMgaXMgdXNlZCB0byBtYWtlIHN1cmUgbm8gdW5kZXNpcmFibGUgc2hhcmluZyBiZXR3 ZWVuIGRpZmZlcmVudCBsaWJyYXJpZXMKKyAgIHRoYXQgdXNlIHRoaXMgZmlsZSB0YWtlcyBwbGFj ZS4gICovCisjaWZuZGVmIF9fTVBOCisjZGVmaW5lIF9fTVBOKHgpIF9fIyN4CisjZW5kaWYKKwor LyogRGVmaW5lIGF1eGlsaWFyeSBhc20gbWFjcm9zLgorCisgICAxKSB1bXVsX3BwbW0oaGlnaF9w cm9kLCBsb3dfcHJvZCwgbXVsdGlwbGllciwgbXVsdGlwbGljYW5kKSBtdWx0aXBsaWVzIHR3bwor ICAgVVd0eXBlIGludGVnZXJzIE1VTFRJUExJRVIgYW5kIE1VTFRJUExJQ0FORCwgYW5kIGdlbmVy YXRlcyBhIHR3byBVV3R5cGUKKyAgIHdvcmQgcHJvZHVjdCBpbiBISUdIX1BST0QgYW5kIExPV19Q Uk9ELgorCisgICAyKSBfX3VtdWxzaWRpMyhhLGIpIG11bHRpcGxpZXMgdHdvIFVXdHlwZSBpbnRl Z2VycyBBIGFuZCBCLCBhbmQgcmV0dXJucyBhCisgICBVRFd0eXBlIHByb2R1Y3QuICBUaGlzIGlz IGp1c3QgYSB2YXJpYW50IG9mIHVtdWxfcHBtbS4KKworICAgMykgdWRpdl9xcm5uZChxdW90aWVu dCwgcmVtYWluZGVyLCBoaWdoX251bWVyYXRvciwgbG93X251bWVyYXRvciwKKyAgIGRlbm9taW5h dG9yKSBkaXZpZGVzIGEgVURXdHlwZSwgY29tcG9zZWQgYnkgdGhlIFVXdHlwZSBpbnRlZ2Vycwor ICAgSElHSF9OVU1FUkFUT1IgYW5kIExPV19OVU1FUkFUT1IsIGJ5IERFTk9NSU5BVE9SIGFuZCBw bGFjZXMgdGhlIHF1b3RpZW50CisgICBpbiBRVU9USUVOVCBhbmQgdGhlIHJlbWFpbmRlciBpbiBS RU1BSU5ERVIuICBISUdIX05VTUVSQVRPUiBtdXN0IGJlIGxlc3MKKyAgIHRoYW4gREVOT01JTkFU T1IgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLiAgSWYsIGluIGFkZGl0aW9uLCB0aGUgbW9zdAorICAg c2lnbmlmaWNhbnQgYml0IG9mIERFTk9NSU5BVE9SIG11c3QgYmUgMSwgdGhlbiB0aGUgcHJlLXBy b2Nlc3NvciBzeW1ib2wKKyAgIFVESVZfTkVFRFNfTk9STUFMSVpBVElPTiBpcyBkZWZpbmVkIHRv IDEuCisKKyAgIDQpIHNkaXZfcXJubmQocXVvdGllbnQsIHJlbWFpbmRlciwgaGlnaF9udW1lcmF0 b3IsIGxvd19udW1lcmF0b3IsCisgICBkZW5vbWluYXRvcikuICBMaWtlIHVkaXZfcXJubmQgYnV0 IHRoZSBudW1iZXJzIGFyZSBzaWduZWQuICBUaGUgcXVvdGllbnQKKyAgIGlzIHJvdW5kZWQgdG93 YXJkcyAwLgorCisgICA1KSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBjb3VudHMgdGhl IG51bWJlciBvZiB6ZXJvLWJpdHMgZnJvbSB0aGUKKyAgIG1zYiB0byB0aGUgZmlyc3Qgbm9uLXpl cm8gYml0IGluIHRoZSBVV3R5cGUgWC4gIFRoaXMgaXMgdGhlIG51bWJlciBvZgorICAgc3RlcHMg WCBuZWVkcyB0byBiZSBzaGlmdGVkIGxlZnQgdG8gc2V0IHRoZSBtc2IuICBVbmRlZmluZWQgZm9y IFggPT0gMCwKKyAgIHVubGVzcyB0aGUgc3ltYm9sIENPVU5UX0xFQURJTkdfWkVST1NfMCBpcyBk ZWZpbmVkIHRvIHNvbWUgdmFsdWUuCisKKyAgIDYpIGNvdW50X3RyYWlsaW5nX3plcm9zKGNvdW50 LCB4KSBsaWtlIGNvdW50X2xlYWRpbmdfemVyb3MsIGJ1dCBjb3VudHMKKyAgIGZyb20gdGhlIGxl YXN0IHNpZ25pZmljYW50IGVuZC4KKworICAgNykgYWRkX3NzYWFhYShoaWdoX3N1bSwgbG93X3N1 bSwgaGlnaF9hZGRlbmRfMSwgbG93X2FkZGVuZF8xLAorICAgaGlnaF9hZGRlbmRfMiwgbG93X2Fk ZGVuZF8yKSBhZGRzIHR3byBVV3R5cGUgaW50ZWdlcnMsIGNvbXBvc2VkIGJ5CisgICBISUdIX0FE REVORF8xIGFuZCBMT1dfQURERU5EXzEsIGFuZCBISUdIX0FEREVORF8yIGFuZCBMT1dfQURERU5E XzIKKyAgIHJlc3BlY3RpdmVseS4gIFRoZSByZXN1bHQgaXMgcGxhY2VkIGluIEhJR0hfU1VNIGFu ZCBMT1dfU1VNLiAgT3ZlcmZsb3cKKyAgIChpLmUuIGNhcnJ5IG91dCkgaXMgbm90IHN0b3JlZCBh bnl3aGVyZSwgYW5kIGlzIGxvc3QuCisKKyAgIDgpIHN1Yl9kZG1tc3MoaGlnaF9kaWZmZXJlbmNl LCBsb3dfZGlmZmVyZW5jZSwgaGlnaF9taW51ZW5kLCBsb3dfbWludWVuZCwKKyAgIGhpZ2hfc3Vi dHJhaGVuZCwgbG93X3N1YnRyYWhlbmQpIHN1YnRyYWN0cyB0d28gdHdvLXdvcmQgVVd0eXBlIGlu dGVnZXJzLAorICAgY29tcG9zZWQgYnkgSElHSF9NSU5VRU5EXzEgYW5kIExPV19NSU5VRU5EXzEs IGFuZCBISUdIX1NVQlRSQUhFTkRfMiBhbmQKKyAgIExPV19TVUJUUkFIRU5EXzIgcmVzcGVjdGl2 ZWx5LiAgVGhlIHJlc3VsdCBpcyBwbGFjZWQgaW4gSElHSF9ESUZGRVJFTkNFCisgICBhbmQgTE9X X0RJRkZFUkVOQ0UuICBPdmVyZmxvdyAoaS5lLiBjYXJyeSBvdXQpIGlzIG5vdCBzdG9yZWQgYW55 d2hlcmUsCisgICBhbmQgaXMgbG9zdC4KKworICAgSWYgYW55IG9mIHRoZXNlIG1hY3JvcyBhcmUg bGVmdCB1bmRlZmluZWQgZm9yIGEgcGFydGljdWxhciBDUFUsCisgICBDIG1hY3JvcyBhcmUgdXNl ZC4KKworCisgICBOb3RlczoKKworICAgRm9yIGFkZF9zc2FhYWEgdGhlIHR3byBoaWdoIGFuZCB0 d28gbG93IGFkZGVuZHMgY2FuIGJvdGggY29tbXV0ZSwgYnV0CisgICB1bmZvcnR1bmF0ZWx5IGdj YyBvbmx5IHN1cHBvcnRzIG9uZSAiJSIgY29tbXV0YXRpdmUgaW4gZWFjaCBhc20gYmxvY2suCisg ICBUaGlzIGhhcyBhbHdheXMgYmVlbiBzbyBidXQgaXMgb25seSBkb2N1bWVudGVkIGluIHJlY2Vu dCB2ZXJzaW9ucworICAgKGVnLiBwcmUtcmVsZWFzZSAzLjMpLiAgSGF2aW5nIHR3byBvciBtb3Jl ICIlInMgY2FuIGNhdXNlIGFuIGludGVybmFsCisgICBjb21waWxlciBlcnJvciBpbiBjZXJ0YWlu IHJhcmUgY2lyY3Vtc3RhbmNlcy4KKworICAgQXBwYXJlbnRseSBpdCB3YXMgb25seSB0aGUgbGFz dCAiJSIgdGhhdCB3YXMgZXZlciBhY3R1YWxseSByZXNwZWN0ZWQsIHNvCisgICB0aGUgY29kZSBo YXMgYmVlbiB1cGRhdGVkIHRvIGxlYXZlIGp1c3QgdGhhdC4gIENsZWFybHkgdGhlcmUncyBhIGZy ZWUKKyAgIGNob2ljZSB3aGV0aGVyIGhpZ2ggb3IgbG93IHNob3VsZCBnZXQgaXQsIGlmIHRoZXJl J3MgYSByZWFzb24gdG8gZmF2b3VyCisgICBvbmUgb3ZlciB0aGUgb3RoZXIuICBBbHNvIG9idmlv dXNseSB3aGVuIHRoZSBjb25zdHJhaW50cyBvbiB0aGUgdHdvCisgICBvcGVyYW5kcyBhcmUgaWRl bnRpY2FsIHRoZXJlJ3Mgbm8gYmVuZWZpdCB0byB0aGUgcmVsb2FkZXIgaW4gYW55ICIlIiBhdAor ICAgYWxsLgorCisgICAqLworCisvKiBUaGUgQ1BVcyBjb21lIGluIGFscGhhYmV0aWNhbCBvcmRl ciBiZWxvdy4KKworICAgUGxlYXNlIGFkZCBzdXBwb3J0IGZvciBtb3JlIENQVXMgaGVyZSwgb3Ig aW1wcm92ZSB0aGUgY3VycmVudCBzdXBwb3J0CisgICBmb3IgdGhlIENQVXMgYmVsb3chICAqLwor CisKKy8qIGNvdW50X2xlYWRpbmdfemVyb3NfZ2NjX2NseiBpcyBjb3VudF9sZWFkaW5nX3plcm9z IGltcGxlbWVudGVkIHdpdGggZ2NjCisgICAzLjQgX19idWlsdGluX2Nsemwgb3IgX19idWlsdGlu X2NsemxsLCBhY2NvcmRpbmcgdG8gb3VyIGxpbWIgc2l6ZS4KKyAgIFNpbWlsYXJseSBjb3VudF90 cmFpbGluZ196ZXJvc19nY2NfY3R6IHVzaW5nIF9fYnVpbHRpbl9jdHpsIG9yCisgICBfX2J1aWx0 aW5fY3R6bGwuCisKKyAgIFRoZXNlIGJ1aWx0aW5zIGFyZSBvbmx5IHVzZWQgd2hlbiB3ZSBjaGVj ayB3aGF0IGNvZGUgY29tZXMgb3V0LCBvbiBzb21lCisgICBjaGlwcyB0aGV5J3JlIG1lcmVseSBs aWJnY2MgY2FsbHMsIHdoZXJlIHdlIHdpbGwgaW5zdGVhZCB3YW50IGFuIGlubGluZQorICAgaW4g dGhhdCBjYXNlIChlaXRoZXIgYXNtIG9yIGdlbmVyaWMgQykuCisKKyAgIFRoZXNlIGJ1aWx0aW5z IGFyZSBiZXR0ZXIgdGhhbiBhbiBhc20gYmxvY2sgb2YgdGhlIHNhbWUgaW5zbiwgc2luY2UgYW4K KyAgIGFzbSBibG9jayBkb2Vzbid0IGdpdmUgZ2NjIGFueSBpbmZvcm1hdGlvbiBhYm91dCBzY2hl ZHVsaW5nIG9yIHJlc291cmNlCisgICB1c2FnZS4gIFdlIGtlZXAgYW4gYXNtIGJsb2NrIGZvciB1 c2Ugb24gcHJpb3IgdmVyc2lvbnMgb2YgZ2NjIHRob3VnaC4KKworICAgRm9yIHJlZmVyZW5jZSwg X19idWlsdGluX2ZmcyBleGlzdGVkIGluIGdjYyBwcmlvciB0byBfX2J1aWx0aW5fY2x6LCBidXQK KyAgIGl0J3Mgbm90IHVzZWQgKGZvciBjb3VudF9sZWFkaW5nX3plcm9zKSBiZWNhdXNlIGl0IGdl bmVyYWxseSBnaXZlcyBleHRyYQorICAgY29kZSB0byBlbnN1cmUgdGhlIHJlc3VsdCBpcyAwIHdo ZW4gdGhlIGlucHV0IGlzIDAsIHdoaWNoIHdlIGRvbid0IG5lZWQKKyAgIG9yIHdhbnQuICAqLwor CisjaWZkZWYgX0xPTkdfTE9OR19MSU1CCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3NfZ2Nj X2Nseihjb3VudCx4KSAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBcCisgICAgQVNTRVJUICgoeCkgIT0gMCk7ICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgKGNvdW50KSA9IF9fYnVpbHRpbl9jbHpsbCAoeCk7ICAgICAgICAgICAgICBc CisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zX2djY19j bHooY291bnQseCkgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAorICAgIEFTU0VSVCAoKHgpICE9IDApOyAgICAgICAgICAgICAgICAgICAgICAg ICAgXAorICAgIChjb3VudCkgPSBfX2J1aWx0aW5fY2x6bCAoeCk7ICAgICAgICAgICAgICAgXAor ICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZmRlZiBfTE9OR19MT05HX0xJTUIKKyNkZWZpbmUg Y291bnRfdHJhaWxpbmdfemVyb3NfZ2NjX2N0eihjb3VudCx4KSAgIFwKKyAgZG8geyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBU1NFUlQgKCh4KSAhPSAw KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoY291bnQpID0gX19idWlsdGluX2N0 emxsICh4KTsgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIGNv dW50X3RyYWlsaW5nX3plcm9zX2djY19jdHooY291bnQseCkgICBcCisgIGRvIHsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVNTRVJUICgoeCkgIT0gMCk7 ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGNvdW50KSA9IF9fYnVpbHRpbl9jdHps ICh4KTsgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworCisvKiBGSVhN RTogVGhlIG1hY3JvcyB1c2luZyBleHRlcm5hbCByb3V0aW5lcyBsaWtlIF9fTVBOKGNvdW50X2xl YWRpbmdfemVyb3MpCisgICBkb24ndCBuZWVkIHRvIGJlIHVuZGVyICFOT19BU00gKi8KKyNpZiAh IGRlZmluZWQgKE5PX0FTTSkKKworI2lmIGRlZmluZWQgKF9fYWxwaGEpICYmIFdfVFlQRV9TSVpF ID09IDY0CisvKiBNb3N0IGFscGhhLWJhc2VkIG1hY2hpbmVzLCBleGNlcHQgQ3JheSBzeXN0ZW1z LiAqLworI2lmIGRlZmluZWQgKF9fR05VQ19fKQorI2lmIF9fR01QX0dOVUNfUFJFUkVRICgzLDMp CisjZGVmaW5lIHVtdWxfcHBtbShwaCwgcGwsIG0wLCBtMSkgXAorICBkbyB7CQkJCQkJCQkJXAor ICAgIFVESXR5cGUgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOwkJCQkJXAorICAgIChwaCkgPSBf X2J1aWx0aW5fYWxwaGFfdW11bGggKF9fbTAsIF9fbTEpOwkJCQlcCisgICAgKHBsKSA9IF9fbTAg KiBfX20xOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSB1bXVsX3BwbW0o cGgsIHBsLCBtMCwgbTEpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVREl0eXBlIF9fbTAgPSAo bTApLCBfX20xID0gKG0xKTsJCQkJCVwKKyAgICBfX2FzbV9fICgidW11bGggJXIxLCUyLCUwIgkJ CQkJCVwKKwkgICAgIDogIj1yIiAocGgpCQkJCQkJXAorCSAgICAgOiAiJXJKIiAobTApLCAickki IChtMSkpOwkJCQkJXAorICAgIChwbCkgPSBfX20wICogX19tMTsJCQkJCQkJXAorICB9IHdoaWxl ICgwKQorI2VuZGlmCisjZGVmaW5lIFVNVUxfVElNRSAxOAorI2Vsc2UgLyogISBfX0dOVUNfXyAq LworI2luY2x1ZGUgPG1hY2hpbmUvYnVpbHRpbnMuaD4KKyNkZWZpbmUgdW11bF9wcG1tKHBoLCBw bCwgbTAsIG0xKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVURJdHlwZSBfX20wID0gKG0wKSwg X19tMSA9IChtMSk7CQkJCQlcCisgICAgKHBoKSA9IF9fVU1VTEggKG0wLCBtMSk7CQkJCQkJXAor ICAgIChwbCkgPSBfX20wICogX19tMTsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisj aWZuZGVmIExPTkdMT05HX1NUQU5EQUxPTkUKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuMSwg bjAsIGQpIFwKKyAgZG8geyBVV3R5cGUgX19kaTsJCQkJCQkJXAorICAgIF9fZGkgPSBfX01QTihp bnZlcnRfbGltYikgKGQpOwkJCQkJXAorICAgIHVkaXZfcXJubmRfcHJlaW52IChxLCByLCBuMSwg bjAsIGQsIF9fZGkpOwkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIFVESVZfUFJFSU5WX0FM V0FZUyAgMQorI2RlZmluZSBVRElWX05FRURTX05PUk1BTElaQVRJT04gMQorI2RlZmluZSBVRElW X1RJTUUgMjIwCisjZW5kaWYgLyogTE9OR0xPTkdfU1RBTkRBTE9ORSAqLworCisvKiBjbHpfdGFi IGlzIHJlcXVpcmVkIGluIGFsbCBjb25maWd1cmF0aW9ucywgc2luY2UgbXBuL2FscGhhL2NudGx6 LmFzbQorICAgYWx3YXlzIGdvZXMgaW50byBsaWJnbXAuc28sIGV2ZW4gd2hlbiBub3QgYWN0dWFs bHkgdXNlZC4gICovCisjZGVmaW5lIENPVU5UX0xFQURJTkdfWkVST1NfTkVFRF9DTFpfVEFCCisK KyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgSEFWRV9IT1NUX0NQVV9hbHBoYV9DSVgKKyNkZWZp bmUgY291bnRfbGVhZGluZ196ZXJvcyhDT1VOVCxYKSBcCisgIF9fYXNtX18oImN0bHogJTEsJTAi IDogIj1yIihDT1VOVCkgOiAiciIoWCkpCisjZGVmaW5lIGNvdW50X3RyYWlsaW5nX3plcm9zKENP VU5ULFgpIFwKKyAgX19hc21fXygiY3R0eiAlMSwlMCIgOiAiPXIiKENPVU5UKSA6ICJyIihYKSkK KyNlbmRpZiAvKiBjbHovY3R6IHVzaW5nIGNpeCAqLworCisjaWYgISBkZWZpbmVkIChjb3VudF9s ZWFkaW5nX3plcm9zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAmJiBkZWZpbmVk IChfX0dOVUNfXykgJiYgISBkZWZpbmVkIChMT05HTE9OR19TVEFOREFMT05FKQorLyogQUxQSEFf Q01QQkdFXzAgZ2l2ZXMgImNtcGJnZSAkMzEsc3JjLGRzdCIsIGllLiB0ZXN0IHNyYyBieXRlcyA9 PSAwLgorICAgIiQzMSIgaXMgd3JpdHRlbiBleHBsaWNpdGx5IGluIHRoZSBhc20sIHNpbmNlIGFu ICJyIiBjb25zdHJhaW50IHdvbid0CisgICBzZWxlY3QgcmVnIDMxLiAgVGhlcmUgc2VlbXMgbm8g bmVlZCB0byB3b3JyeSBhYm91dCAicjMxIiBzeW50YXggZm9yIGNyYXksCisgICBzaW5jZSBnY2Mg aXRzZWxmIChwcmUtcmVsZWFzZSAzLjQpIGVtaXRzIGp1c3QgJDMxIGluIHZhcmlvdXMgcGxhY2Vz LiAgKi8KKyNkZWZpbmUgQUxQSEFfQ01QQkdFXzAoZHN0LCBzcmMpICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyBhc20gKCJjbXBiZ2UgJDMxLCAlMSwgJTAi IDogIj1yIiAoZHN0KSA6ICJyIiAoc3JjKSk7IH0gd2hpbGUgKDApCisvKiBaZXJvIGJ5dGVzIGFy ZSB0dXJuZWQgaW50byBiaXRzIHdpdGggY21wYmdlLCBhIF9fY2x6X3RhYiBsb29rdXAgY291bnRz CisgICB0aGVtLCBsb2NhdGluZyB0aGUgaGlnaGVzdCBub24temVybyBieXRlLiAgQSBzZWNvbmQg X19jbHpfdGFiIGxvb2t1cAorICAgY291bnRzIHRoZSBsZWFkaW5nIHplcm8gYml0cyBpbiB0aGF0 IGJ5dGUsIGdpdmluZyB0aGUgcmVzdWx0LiAgKi8KKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJv cyhjb3VudCwgeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKKyAgICBVV3R5cGUgIF9fY2x6X19iLCBfX2Nsel9fYywgX19jbHpfX3ggPSAoeCk7 ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBTFBIQV9DTVBCR0VfMCAoX19jbHpfX2Is ICBfX2Nsel9feCk7ICAgICAgICAgICAvKiB6ZXJvIGJ5dGVzICovICAgIFwKKyAgICBfX2Nsel9f YiA9IF9fY2x6X3RhYiBbKF9fY2x6X19iID4+IDEpIF4gMHg3Rl07ICAvKiA4IHRvIDEgYnl0ZSAq LyAgIFwKKyAgICBfX2Nsel9fYiA9IF9fY2x6X19iICogOCAtIDc7ICAgICAgICAgICAgICAgICAg ICAvKiA1NyB0byAxIHNoaWZ0ICovIFwKKyAgICBfX2Nsel9feCA+Pj0gX19jbHpfX2I7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2Nsel9fYyA9 IF9fY2x6X3RhYiBbX19jbHpfX3hdOyAgICAgICAgICAgICAgICAvKiA4IHRvIDEgYml0ICovICAg IFwKKyAgICBfX2Nsel9fYiA9IDY1IC0gX19jbHpfX2I7ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKKyAgICAoY291bnQpID0gX19jbHpfX2IgLSBfX2Nsel9fYzsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNk ZWZpbmUgQ09VTlRfTEVBRElOR19aRVJPU19ORUVEX0NMWl9UQUIKKyNlbmRpZiAvKiBjbHogdXNp bmcgY21wYmdlICovCisKKyNpZiAhIGRlZmluZWQgKGNvdW50X2xlYWRpbmdfemVyb3MpICYmICEg ZGVmaW5lZCAoTE9OR0xPTkdfU1RBTkRBTE9ORSkKKyNpZiBIQVZFX0FUVFJJQlVURV9DT05TVAor bG9uZyBfX01QTihjb3VudF9sZWFkaW5nX3plcm9zKSAoVURJdHlwZSkgX19hdHRyaWJ1dGVfXyAo KGNvbnN0KSk7CisjZWxzZQorbG9uZyBfX01QTihjb3VudF9sZWFkaW5nX3plcm9zKSAoVURJdHlw ZSk7CisjZW5kaWYKKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgXAorICAo KGNvdW50KSA9IF9fTVBOKGNvdW50X2xlYWRpbmdfemVyb3MpICh4KSkKKyNlbmRpZiAvKiBjbHog dXNpbmcgbXBuICovCisjZW5kaWYgLyogX19hbHBoYSAqLworCisjaWYgZGVmaW5lZCAoX19BVlIp ICYmIFdfVFlQRV9TSVpFID09IDgKKyNkZWZpbmUgdW11bF9wcG1tKHBoLCBwbCwgbTAsIG0xKSBc CisgIGRvIHsJCQkJCQkJCQlcCisgICAgdW5zaWduZWQgc2hvcnQgX19wID0gKHVuc2lnbmVkIHNo b3J0KSAobTApICogKG0xKTsJCQlcCisgICAgKHBoKSA9IF9fcCA+PiA4OwkJCQkJCQlcCisgICAg KHBsKSA9IF9fcDsJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBBVlIgKi8KKwor I2lmIGRlZmluZWQgKF9DUkFZKSAmJiBXX1RZUEVfU0laRSA9PSA2NAorI2luY2x1ZGUgPGludHJp bnNpY3MuaD4KKyNkZWZpbmUgVURJVl9QUkVJTlZfQUxXQVlTICAxCisjZGVmaW5lIFVESVZfTkVF RFNfTk9STUFMSVpBVElPTiAxCisjZGVmaW5lIFVESVZfVElNRSAyMjAKK2xvbmcgX19NUE4oY291 bnRfbGVhZGluZ196ZXJvcykgKFVESXR5cGUpOworI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9z KGNvdW50LCB4KSBcCisgICgoY291bnQpID0gX2xlYWR6ICgoVVd0eXBlKSAoeCkpKQorI2lmIGRl ZmluZWQgKF9DUkFZSUVFRSkJCS8qIEkuZS4sIENyYXkgVDkwL2llZWUsIFQzRCwgYW5kIFQzRSAq LworI2RlZmluZSB1bXVsX3BwbW0ocGgsIHBsLCBtMCwgbTEpIFwKKyAgZG8gewkJCQkJCQkJCVwK KyAgICBVREl0eXBlIF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsJCQkJCVwKKyAgICAocGgpID0g X2ludF9tdWx0X3VwcGVyIChtMCwgbTEpOwkJCQkJXAorICAgIChwbCkgPSBfX20wICogX19tMTsJ CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2lmbmRlZiBMT05HTE9OR19TVEFOREFMT05FCisjZGVm aW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisgIGRvIHsgVVd0eXBlIF9fZGk7CQkJ CQkJCVwKKyAgICBfX2RpID0gX19NUE4oaW52ZXJ0X2xpbWIpIChkKTsJCQkJCVwKKyAgICB1ZGl2 X3Fybm5kX3ByZWludiAocSwgciwgbjEsIG4wLCBkLCBfX2RpKTsJCQkJXAorICB9IHdoaWxlICgw KQorI2VuZGlmIC8qIExPTkdMT05HX1NUQU5EQUxPTkUgKi8KKyNlbmRpZiAvKiBfQ1JBWUlFRUUg Ki8KKyNlbmRpZiAvKiBfQ1JBWSAqLworCisjaWYgZGVmaW5lZCAoX19pYTY0KSAmJiBXX1RZUEVf U0laRSA9PSA2NAorLyogVGhpcyBmb3JtIGVuY291cmFnZXMgZ2NjIChwcmUtcmVsZWFzZSAzLjQg YXQgbGVhc3QpIHRvIGVtaXQgcHJlZGljYXRlZAorICAgInN1YiByPXIsciIgYW5kICJzdWIgcj1y LHIsMSIsIGdpdmluZyBhIDIgY3ljbGUgbGF0ZW5jeS4gIFRoZSBnZW5lcmljCisgICBjb2RlIHVz aW5nICJhbDxibCIgYXJpdGhtZXRpY2FsbHkgY29tZXMgb3V0IG1ha2luZyBhbiBhY3R1YWwgMCBv ciAxIGluIGEKKyAgIHJlZ2lzdGVyLCB3aGljaCB0YWtlcyBhbiBleHRyYSBjeWNsZS4gICovCisj ZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgICAgICBcCisgIGRvIHsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVVd0eXBlIF9f eDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX194ID0gKGFsKSAtIChi bCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChhbCkgPCAoYmwpKSAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoc2gpID0gKGFoKSAtIChiaCkgLSAxOyAg ICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBcCisgICAgICAoc2gpID0gKGFoKSAtIChiaCk7ICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgKHNsKSA9IF9feDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc CisgIH0gd2hpbGUgKDApCisjaWYgZGVmaW5lZCAoX19HTlVDX18pICYmICEgZGVmaW5lZCAoX19J TlRFTF9DT01QSUxFUikKKy8qIERvIGJvdGggcHJvZHVjdCBwYXJ0cyBpbiBhc3NlbWJseSwgc2lu Y2UgdGhhdCBnaXZlcyBiZXR0ZXIgY29kZSB3aXRoCisgICBhbGwgZ2NjIHZlcnNpb25zLiAgU29t ZSBjYWxsZXJzIHdpbGwganVzdCB1c2UgdGhlIHVwcGVyIHBhcnQsIGFuZCBpbgorICAgdGhhdCBz aXR1YXRpb24gd2Ugd2FzdGUgYW4gaW5zdHJ1Y3Rpb24sIGJ1dCBub3QgYW55IGN5Y2xlcy4gICov CisjZGVmaW5lIHVtdWxfcHBtbShwaCwgcGwsIG0wLCBtMSkgXAorICAgIF9fYXNtX18gKCJ4bWEu aHUgJTAgPSAlMiwgJTMsIGYwXG5cdHhtYS5sICUxID0gJTIsICUzLCBmMCIJCVwKKwkgICAgIDog Ij0mZiIgKHBoKSwgIj1mIiAocGwpCQkJCQlcCisJICAgICA6ICJmIiAobTApLCAiZiIgKG0xKSkK KyNkZWZpbmUgVU1VTF9USU1FIDE0CisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQs IHgpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVV3R5cGUgX3ggPSAoeCksIF95LCBfYSwgX2M7 CQkJCQlcCisgICAgX19hc21fXyAoIm11eDEgJTAgPSAlMSwgQHJldiIgOiAiPXIiIChfeSkgOiAi ciIgKF94KSk7CQlcCisgICAgX19hc21fXyAoImN6eDEubCAlMCA9ICUxIiA6ICI9ciIgKF9hKSA6 ICJyIiAoLV95IHwgX3kpKTsJCVwKKyAgICBfYyA9IChfYSAtIDEpIDw8IDM7CQkJCQkJCVwKKyAg ICBfeCA+Pj0gX2M7CQkJCQkJCQlcCisgICAgaWYgKF94ID49IDEgPDwgNCkJCQkJCQkJXAorICAg ICAgX3ggPj49IDQsIF9jICs9IDQ7CQkJCQkJXAorICAgIGlmIChfeCA+PSAxIDw8IDIpCQkJCQkJ CVwKKyAgICAgIF94ID4+PSAyLCBfYyArPSAyOwkJCQkJCVwKKyAgICBfYyArPSBfeCA+PiAxOwkJ CQkJCQlcCisgICAgKGNvdW50KSA9ICBXX1RZUEVfU0laRSAtIDEgLSBfYzsJCQkJCVwKKyAgfSB3 aGlsZSAoMCkKKy8qIHNpbWlsYXIgdG8gd2hhdCBnY2MgZG9lcyBmb3IgX19idWlsdGluX2Zmcywg YnV0IDAgYmFzZWQgcmF0aGVyIHRoYW4gMQorICAgYmFzZWQsIGFuZCB3ZSBkb24ndCBuZWVkIGEg c3BlY2lhbCBjYXNlIGZvciB4PT0wIGhlcmUgKi8KKyNkZWZpbmUgY291bnRfdHJhaWxpbmdfemVy b3MoY291bnQsIHgpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVd0eXBlIF9fY3R6X3gg PSAoeCk7CQkJCQkJXAorICAgIF9fYXNtX18gKCJwb3BjbnQgJTAgPSAlMSIJCQkJCQlcCisJICAg ICA6ICI9ciIgKGNvdW50KQkJCQkJCVwKKwkgICAgIDogInIiICgoX19jdHpfeC0xKSAmIH5fX2N0 el94KSk7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2lmIGRlZmluZWQgKF9fSU5URUxf Q09NUElMRVIpCisjaW5jbHVkZSA8aWE2NGludHJpbi5oPgorI2RlZmluZSB1bXVsX3BwbW0ocGgs IHBsLCBtMCwgbTEpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVd0eXBlIF9tMCA9ICht MCksIF9tMSA9IChtMSk7CQkJCQlcCisgICAgcGggPSBfbTY0X3htYWh1IChfbTAsIF9tMSwgMCk7 CQkJCQlcCisgICAgcGwgPSBfbTAgKiBfbTE7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRp ZgorI2lmbmRlZiBMT05HTE9OR19TVEFOREFMT05FCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwg bjEsIG4wLCBkKSBcCisgIGRvIHsgVVd0eXBlIF9fZGk7CQkJCQkJCVwKKyAgICBfX2RpID0gX19N UE4oaW52ZXJ0X2xpbWIpIChkKTsJCQkJCVwKKyAgICB1ZGl2X3Fybm5kX3ByZWludiAocSwgciwg bjEsIG4wLCBkLCBfX2RpKTsJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBVRElWX1BSRUlO Vl9BTFdBWVMgIDEKKyNkZWZpbmUgVURJVl9ORUVEU19OT1JNQUxJWkFUSU9OIDEKKyNlbmRpZgor I2RlZmluZSBVRElWX1RJTUUgMjIwCisjZW5kaWYKKworCisjaWYgZGVmaW5lZCAoX19HTlVDX18p CisKKy8qIFdlIHNvbWV0aW1lcyBuZWVkIHRvIGNsb2JiZXIgImNjIiB3aXRoIGdjYzIsIGJ1dCB0 aGF0IHdvdWxkIG5vdCBiZQorICAgdW5kZXJzdG9vZCBieSBnY2MxLiAgVXNlIGNwcCB0byBhdm9p ZCBtYWpvciBjb2RlIGR1cGxpY2F0aW9uLiAgKi8KKyNpZiBfX0dOVUNfXyA8IDIKKyNkZWZpbmUg X19DTE9CQkVSX0NDCisjZGVmaW5lIF9fQU5EX0NMT0JCRVJfQ0MKKyNlbHNlIC8qIF9fR05VQ19f ID49IDIgKi8KKyNkZWZpbmUgX19DTE9CQkVSX0NDIDogImNjIgorI2RlZmluZSBfX0FORF9DTE9C QkVSX0NDICwgImNjIgorI2VuZGlmIC8qIF9fR05VQ19fIDwgMiAqLworCisjaWYgKGRlZmluZWQg KF9fYTI5a19fKSB8fCBkZWZpbmVkIChfQU0yOUspKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2Rl ZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoImFk ZCAlMSwlNCwlNVxuXHRhZGRjICUwLCUyLCUzIgkJCQlcCisJICAgOiAiPXIiIChzaCksICI9JnIi IChzbCkJCQkJCVwKKwkgICA6ICJyIiAoYWgpLCAickkiIChiaCksICIlciIgKGFsKSwgInJJIiAo YmwpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19h c21fXyAoInN1YiAlMSwlNCwlNVxuXHRzdWJjICUwLCUyLCUzIgkJCQlcCisJICAgOiAiPXIiIChz aCksICI9JnIiIChzbCkJCQkJCVwKKwkgICA6ICJyIiAoYWgpLCAickkiIChiaCksICJyIiAoYWwp LCAickkiIChibCkpCisjZGVmaW5lIHVtdWxfcHBtbSh4aCwgeGwsIG0wLCBtMSkgXAorICBkbyB7 CQkJCQkJCQkJXAorICAgIFVTSXR5cGUgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOwkJCQkJXAor ICAgIF9fYXNtX18gKCJtdWx0aXBsdSAlMCwlMSwlMiIJCQkJCVwKKwkgICAgIDogIj1yIiAoeGwp CQkJCQkJXAorCSAgICAgOiAiciIgKF9fbTApLCAiciIgKF9fbTEpKTsJCQkJCVwKKyAgICBfX2Fz bV9fICgibXVsdG11ICUwLCUxLCUyIgkJCQkJCVwKKwkgICAgIDogIj1yIiAoeGgpCQkJCQkJXAor CSAgICAgOiAiciIgKF9fbTApLCAiciIgKF9fbTEpKTsJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNk ZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuMSwgbjAsIGQpIFwKKyAgX19hc21fXyAoImRpdmlkdSAl MCwlMywlNCIJCQkJCQlcCisJICAgOiAiPXIiIChxKSwgIj1xIiAocikJCQkJCQlcCisJICAgOiAi MSIgKG4xKSwgInIiIChuMCksICJyIiAoZCkpCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3Mo Y291bnQsIHgpIFwKKyAgICBfX2FzbV9fICgiY2x6ICUwLCUxIgkJCQkJCVwKKwkgICAgIDogIj1y IiAoY291bnQpCQkJCQkJXAorCSAgICAgOiAiciIgKHgpKQorI2RlZmluZSBDT1VOVF9MRUFESU5H X1pFUk9TXzAgMzIKKyNlbmRpZiAvKiBfX2EyOWtfXyAqLworCisjaWYgZGVmaW5lZCAoX19hcmNf XykKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNt X18gKCJhZGQuZlx0JTEsICU0LCAlNVxuXHRhZGNcdCUwLCAlMiwgJTMiCQkJXAorCSAgIDogIj1y IiAoc2gpLAkJCQkJCQlcCisJICAgICAiPSZyIiAoc2wpCQkJCQkJCVwKKwkgICA6ICJyIiAgKChV U0l0eXBlKSAoYWgpKSwJCQkJCVwKKwkgICAgICJySUoiICgoVVNJdHlwZSkgKGJoKSksCQkJCQlc CisJICAgICAiJXIiICgoVVNJdHlwZSkgKGFsKSksCQkJCQlcCisJICAgICAicklKIiAoKFVTSXR5 cGUpIChibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwK KyAgX19hc21fXyAoInN1Yi5mXHQlMSwgJTQsICU1XG5cdHNiY1x0JTAsICUyLCAlMyIJCQlcCisJ ICAgOiAiPXIiIChzaCksCQkJCQkJCVwKKwkgICAgICI9JnIiIChzbCkJCQkJCQkJXAorCSAgIDog InIiICgoVVNJdHlwZSkgKGFoKSksCQkJCQlcCisJICAgICAicklKIiAoKFVTSXR5cGUpIChiaCkp LAkJCQkJXAorCSAgICAgInIiICgoVVNJdHlwZSkgKGFsKSksCQkJCQlcCisJICAgICAicklKIiAo KFVTSXR5cGUpIChibCkpKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX2FybV9fKSAmJiBXX1RZ UEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwp IFwKKyAgX19hc21fXyAoImFkZHNcdCUxLCAlNCwgJTVcblx0YWRjXHQlMCwgJTIsICUzIgkJCVwK KwkgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgIDogInIiIChhaCksICJySSIg KGJoKSwgIiVyIiAoYWwpLCAickkiIChibCkgX19DTE9CQkVSX0NDKQorI2RlZmluZSBzdWJfZGRt bXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAo X19idWlsdGluX2NvbnN0YW50X3AgKGFsKSkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJaWYg KF9fYnVpbHRpbl9jb25zdGFudF9wIChhaCkpCQkJCQlcCisJICBfX2FzbV9fICgicnNic1x0JTEs ICU1LCAlNFxuXHRyc2NcdCUwLCAlMywgJTIiCQlcCisJCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAo c2wpCQkJCVwKKwkJICAgOiAickkiIChhaCksICJyIiAoYmgpLCAickkiIChhbCksICJyIiAoYmwp IF9fQ0xPQkJFUl9DQyk7IFwKKwllbHNlCQkJCQkJCQlcCisJICBfX2FzbV9fICgicnNic1x0JTEs ICU1LCAlNFxuXHRzYmNcdCUwLCAlMiwgJTMiCQlcCisJCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAo c2wpCQkJCVwKKwkJICAgOiAiciIgKGFoKSwgInJJIiAoYmgpLCAickkiIChhbCksICJyIiAoYmwp IF9fQ0xPQkJFUl9DQyk7IFwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgZWxzZSBpZiAoX19idWls dGluX2NvbnN0YW50X3AgKGFoKSkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJaWYgKF9fYnVp bHRpbl9jb25zdGFudF9wIChibCkpCQkJCQlcCisJICBfX2FzbV9fICgic3Vic1x0JTEsICU0LCAl NVxuXHRyc2NcdCUwLCAlMywgJTIiCQlcCisJCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJ CVwKKwkJICAgOiAickkiIChhaCksICJyIiAoYmgpLCAiciIgKGFsKSwgInJJIiAoYmwpIF9fQ0xP QkJFUl9DQyk7IFwKKwllbHNlCQkJCQkJCQlcCisJICBfX2FzbV9fICgicnNic1x0JTEsICU1LCAl NFxuXHRyc2NcdCUwLCAlMywgJTIiCQlcCisJCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJ CVwKKwkJICAgOiAickkiIChhaCksICJyIiAoYmgpLCAickkiIChhbCksICJyIiAoYmwpIF9fQ0xP QkJFUl9DQyk7IFwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgZWxzZSBpZiAoX19idWlsdGluX2Nv bnN0YW50X3AgKGJsKSkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJaWYgKF9fYnVpbHRpbl9j b25zdGFudF9wIChiaCkpCQkJCQlcCisJICBfX2FzbV9fICgic3Vic1x0JTEsICU0LCAlNVxuXHRz YmNcdCUwLCAlMiwgJTMiCQlcCisJCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCVwKKwkJ ICAgOiAiciIgKGFoKSwgInJJIiAoYmgpLCAiciIgKGFsKSwgInJJIiAoYmwpIF9fQ0xPQkJFUl9D Qyk7IFwKKwllbHNlCQkJCQkJCQlcCisJICBfX2FzbV9fICgic3Vic1x0JTEsICU0LCAlNVxuXHRy c2NcdCUwLCAlMywgJTIiCQlcCisJCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCVwKKwkJ ICAgOiAickkiIChhaCksICJyIiAoYmgpLCAiciIgKGFsKSwgInJJIiAoYmwpIF9fQ0xPQkJFUl9D Qyk7IFwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgZWxzZSAvKiBvbmx5IGJoIG1pZ2h0IGJlIGEg Y29uc3RhbnQgKi8JCQkJXAorICAgICAgX19hc21fXyAoInN1YnNcdCUxLCAlNCwgJTVcblx0c2Jj XHQlMCwgJTIsICUzIgkJCVwKKwkgICAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwK KwkgICAgICAgOiAiciIgKGFoKSwgInJJIiAoYmgpLCAiciIgKGFsKSwgInJJIiAoYmwpIF9fQ0xP QkJFUl9DQyk7XAorICAgIH0gd2hpbGUgKDApCisjaWYgMSB8fCBkZWZpbmVkIChfX2FybV9tX18p CS8qIGBNJyBzZXJpZXMgaGFzIHdpZGVuaW5nIG11bHRpcGx5IHN1cHBvcnQgKi8KKyNkZWZpbmUg dW11bF9wcG1tKHhoLCB4bCwgYSwgYikgXAorICBfX2FzbV9fICgidW11bGwgJTAsJTEsJTIsJTMi IDogIj0mciIgKHhsKSwgIj0mciIgKHhoKSA6ICJyIiAoYSksICJyIiAoYikpCisjZGVmaW5lIFVN VUxfVElNRSA1CisjZGVmaW5lIHNtdWxfcHBtbSh4aCwgeGwsIGEsIGIpIFwKKyAgX19hc21fXyAo InNtdWxsICUwLCUxLCUyLCUzIiA6ICI9JnIiICh4bCksICI9JnIiICh4aCkgOiAiciIgKGEpLCAi ciIgKGIpKQorI2lmbmRlZiBMT05HTE9OR19TVEFOREFMT05FCisjZGVmaW5lIHVkaXZfcXJubmQo cSwgciwgbjEsIG4wLCBkKSBcCisgIGRvIHsgVVd0eXBlIF9fZGk7CQkJCQkJCVwKKyAgICBfX2Rp ID0gX19NUE4oaW52ZXJ0X2xpbWIpIChkKTsJCQkJCVwKKyAgICB1ZGl2X3Fybm5kX3ByZWludiAo cSwgciwgbjEsIG4wLCBkLCBfX2RpKTsJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBVRElW X1BSRUlOVl9BTFdBWVMgIDEKKyNkZWZpbmUgVURJVl9ORUVEU19OT1JNQUxJWkFUSU9OIDEKKyNk ZWZpbmUgVURJVl9USU1FIDcwCisjZW5kaWYgLyogTE9OR0xPTkdfU1RBTkRBTE9ORSAqLworI2Vs c2UKKyNkZWZpbmUgdW11bF9wcG1tKHhoLCB4bCwgYSwgYikgXAorICBfX2FzbV9fICgiJUAgSW5s aW5lZCB1bXVsX3BwbW1cbiIJCQkJCVwKKyIJbW92CSV8cjAsICUyLCBsc3IgIzE2XG4iCQkJCQlc CisiCW1vdgklfHIyLCAlMywgbHNyICMxNlxuIgkJCQkJXAorIgliaWMJJXxyMSwgJTIsICV8cjAs IGxzbCAjMTZcbiIJCQkJXAorIgliaWMJJXxyMiwgJTMsICV8cjIsIGxzbCAjMTZcbiIJCQkJXAor IgltdWwJJTEsICV8cjEsICV8cjJcbiIJCQkJCVwKKyIJbXVsCSV8cjIsICV8cjAsICV8cjJcbiIJ CQkJCVwKKyIJbXVsCSV8cjEsICUwLCAlfHIxXG4iCQkJCQlcCisiCW11bAklMCwgJXxyMCwgJTBc biIJCQkJCQlcCisiCWFkZHMJJXxyMSwgJXxyMiwgJXxyMVxuIgkJCQkJXAorIglhZGRjcwklMCwg JTAsICM2NTUzNlxuIgkJCQkJXAorIglhZGRzCSUxLCAlMSwgJXxyMSwgbHNsICMxNlxuIgkJCQlc CisiCWFkYwklMCwgJTAsICV8cjEsIGxzciAjMTYiCQkJCQlcCisJICAgOiAiPSZyIiAoeGgpLCAi PXIiICh4bCkJCQkJCVwKKwkgICA6ICJyIiAoYSksICJyIiAoYikJCQkJCQlcCisJICAgOiAicjAi LCAicjEiLCAicjIiKQorI2RlZmluZSBVTVVMX1RJTUUgMjAKKyNpZm5kZWYgTE9OR0xPTkdfU1RB TkRBTE9ORQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorICBkbyB7IFVX dHlwZSBfX3I7CQkJCQkJCVwKKyAgICAocSkgPSBfX01QTih1ZGl2X3Fybm5kKSAoJl9fciwgKG4x KSwgKG4wKSwgKGQpKTsJCQlcCisgICAgKHIpID0gX19yOwkJCQkJCQkJXAorICB9IHdoaWxlICgw KQorZXh0ZXJuIFVXdHlwZSBfX01QTih1ZGl2X3Fybm5kKSAoVVd0eXBlICosIFVXdHlwZSwgVVd0 eXBlLCBVV3R5cGUpOworI2RlZmluZSBVRElWX1RJTUUgMjAwCisjZW5kaWYgLyogTE9OR0xPTkdf U1RBTkRBTE9ORSAqLworI2VuZGlmCisvKiBUaGlzIGlzIGEgYml6YXJyZSB0ZXN0LCBidXQgR0ND IGRvZXNuJ3QgZGVmaW5lIHVzZWZ1bCBjb21tb24gc3ltYm9sLiAqLworI2lmIGRlZmluZWQgKF9f QVJNX0FSQ0hfNV9fKSAgfHwgZGVmaW5lZCAoX19BUk1fQVJDSF81VF9fKSB8fCBcCisgICAgZGVm aW5lZCAoX19BUk1fQVJDSF81RV9fKSB8fCBkZWZpbmVkIChfX0FSTV9BUkNIXzVURV9fKXx8IFwK KyAgICBkZWZpbmVkIChfX0FSTV9BUkNIXzZfXykgIHx8IGRlZmluZWQgKF9fQVJNX0FSQ0hfNkpf XykgfHwgXAorICAgIGRlZmluZWQgKF9fQVJNX0FSQ0hfNktfXykgfHwgZGVmaW5lZCAoX19BUk1f QVJDSF82Wl9fKSB8fCBcCisgICAgZGVmaW5lZCAoX19BUk1fQVJDSF82WktfXyl8fCBkZWZpbmVk IChfX0FSTV9BUkNIXzZUMl9fKXx8IFwKKyAgICBkZWZpbmVkIChfX0FSTV9BUkNIXzZNX18pIHx8 IGRlZmluZWQgKF9fQVJNX0FSQ0hfN19fKSAgfHwgXAorICAgIGRlZmluZWQgKF9fQVJNX0FSQ0hf N0FfXykgfHwgZGVmaW5lZCAoX19BUk1fQVJDSF83Ul9fKSB8fCBcCisgICAgZGVmaW5lZCAoX19B Uk1fQVJDSF83TV9fKSB8fCBkZWZpbmVkIChfX0FSTV9BUkNIXzdFTV9fKQorI2RlZmluZSBjb3Vu dF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBcCisgIF9fYXNtX18gKCJjbHpcdCUwLCAlMSIgOiAi PXIiIChjb3VudCkgOiAiciIgKHgpKQorI2RlZmluZSBDT1VOVF9MRUFESU5HX1pFUk9TXzAgMzIK KyNlbmRpZgorI2VuZGlmIC8qIF9fYXJtX18gKi8KKworI2lmIGRlZmluZWQgKF9fYWFyY2g2NF9f KSAmJiBXX1RZUEVfU0laRSA9PSA2NAorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFs LCBiaCwgYmwpIFwKKyAgX19hc21fXyAoImFkZHNcdCUxLCAlNCwgJTVcblx0YWRjXHQlMCwgJTIs ICUzIgkJCVwKKwkgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgIDogInIiIChh aCksICJyWiIgKGJoKSwgIiVyIiAoYWwpLCAickkiIChibCkgX19DTE9CQkVSX0NDKQorI2RlZmlu ZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgZG8gewkJCQkJCQkJCVwK KyAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGJsKSkJCQkJCVwKKyAgICAgIHsJCQkJCQkJ CQlcCisJX19hc21fXyAoInN1YnNcdCUxLCAlNCwgJTVcblx0c2JjXHQlMCwgJTIsICUzIgkJCVwK KwkJIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCVwKKwkJIDogInIiIChhaCksICJyIiAoYmgp LCAiciIgKGFsKSwgInJJIiAoYmwpIF9fQ0xPQkJFUl9DQyk7IFwKKyAgICAgIH0JCQkJCQkJCQlc CisgICAgZWxzZSAvKiBvbmx5IGJoIG1pZ2h0IGJlIGEgY29uc3RhbnQgKi8JCQkJXAorICAgICAg X19hc21fXyAoInN1YnNcdCUxLCAlNCwgJTVcblx0c2JjXHQlMCwgJTIsICUzIgkJCVwKKwkgICAg ICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICAgICAgOiAiciIgKGFoKSwgInJa IiAoYmgpLCAiciIgKGFsKSwgInJJIiAoYmwpIF9fQ0xPQkJFUl9DQyk7XAorICAgIH0gd2hpbGUg KDApCisjZGVmaW5lIHVtdWxfcHBtbShwaCwgcGwsIG0wLCBtMSkgXAorICBkbyB7CQkJCQkJCQkJ XAorICAgIFVESXR5cGUgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOwkJCQkJXAorICAgIF9fYXNt X18gKCJ1bXVsaFx0JTAsICUxLCAlMiIgOiAiPXIiIChwaCkgOiAiciIgKG0wKSwgInIiIChtMSkp OwlcCisgICAgKHBsKSA9IF9fbTAgKiBfX20xOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVm aW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpIFwKKyAgX19hc21fXyAoImNselx0JTAs ICUxIiA6ICI9ciIgKGNvdW50KSA6ICJyIiAoeCkpCisjZGVmaW5lIENPVU5UX0xFQURJTkdfWkVS T1NfMCA2NAorI2VuZGlmIC8qIF9fYWFyY2g2NF9fICovCisKKyNpZiBkZWZpbmVkIChfX2NsaXBw ZXJfXykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwg dikgXAorICAoe3VuaW9uIHtVREl0eXBlIF9fbGw7CQkJCQkJXAorCSAgIHN0cnVjdCB7VVNJdHlw ZSBfX2wsIF9faDt9IF9faTsJCQkJXAorCSAgfSBfX3g7CQkJCQkJCVwKKyAgX19hc21fXyAoIm11 bHd1eCAlMiwlMCIJCQkJCQlcCisJICAgOiAiPXIiIChfX3guX19sbCkJCQkJCQlcCisJICAgOiAi JTAiICgoVVNJdHlwZSkodSkpLCAiciIgKChVU0l0eXBlKSh2KSkpOwkJCVwKKyAgKHcxKSA9IF9f eC5fX2kuX19oOyAodzApID0gX194Ll9faS5fX2w7fSkKKyNkZWZpbmUgc211bF9wcG1tKHcxLCB3 MCwgdSwgdikgXAorICAoe3VuaW9uIHtESXR5cGUgX19sbDsJCQkJCQkJXAorCSAgIHN0cnVjdCB7 U0l0eXBlIF9fbCwgX19oO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJXAorICBfX2FzbV9f ICgibXVsd3ggJTIsJTAiCQkJCQkJXAorCSAgIDogIj1yIiAoX194Ll9fbGwpCQkJCQkJXAorCSAg IDogIiUwIiAoKFNJdHlwZSkodSkpLCAiciIgKChTSXR5cGUpKHYpKSk7CQkJXAorICAodzEpID0g X194Ll9faS5fX2g7ICh3MCkgPSBfX3guX19pLl9fbDt9KQorI2RlZmluZSBfX3VtdWxzaWRpMyh1 LCB2KSBcCisgICh7VURJdHlwZSBfX3c7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgibXVsd3V4ICUy LCUwIgkJCQkJCVwKKwkgICAgIDogIj1yIiAoX193KSA6ICIlMCIgKChVU0l0eXBlKSh1KSksICJy IiAoKFVTSXR5cGUpKHYpKSk7CVwKKyAgICBfX3c7IH0pCisjZW5kaWYgLyogX19jbGlwcGVyX18g Ki8KKworLyogRnVqaXRzdSB2ZWN0b3IgY29tcHV0ZXJzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3V4 cF9fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSB1bXVsX3BwbW0ocGgsIHBsLCB1LCB2 KSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgdW5pb24ge1VESXR5cGUgX19sbDsJCQkJCQlcCisJ ICAgc3RydWN0IHtVU0l0eXBlIF9faCwgX19sO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJ XAorICAgIF9fYXNtX18gKCJtdWx0Lmx1ICUxLCUyLCUwIgk6ICI9ciIgKF9feC5fX2xsKSA6ICIl ciIgKHUpLCAicksiICh2KSk7XAorICAgIChwaCkgPSBfX3guX19pLl9faDsJCQkJCQkJXAorICAg IChwbCkgPSBfX3guX19pLl9fbDsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBzbXVs X3BwbW0ocGgsIHBsLCB1LCB2KSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgdW5pb24ge1VESXR5 cGUgX19sbDsJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9faCwgX19sO30gX19pOwkJCQlc CisJICB9IF9feDsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJtdWx0LmwgJTEsJTIsJTAiIDogIj1y IiAoX194Ll9fbGwpIDogIiVyIiAodSksICJySyIgKHYpKTsJXAorICAgIChwaCkgPSBfX3guX19p Ll9faDsJCQkJCQkJXAorICAgIChwbCkgPSBfX3guX19pLl9fbDsJCQkJCQkJXAorICB9IHdoaWxl ICgwKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX2dtaWNyb19fKSAmJiBXX1RZUEVfU0laRSA9 PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19h c21fXyAoImFkZC53ICU1LCUxXG5cdGFkZHggJTMsJTAiCQkJCQlcCisJICAgOiAiPWciIChzaCks ICI9JmciIChzbCkJCQkJCVwKKwkgICA6ICIwIiAgKChVU0l0eXBlKShhaCkpLCAiZyIgKChVU0l0 eXBlKShiaCkpLAkJCVwKKwkgICAgICIlMSIgKChVU0l0eXBlKShhbCkpLCAiZyIgKChVU0l0eXBl KShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAg X19hc21fXyAoInN1Yi53ICU1LCUxXG5cdHN1YnggJTMsJTAiCQkJCQlcCisJICAgOiAiPWciIChz aCksICI9JmciIChzbCkJCQkJCVwKKwkgICA6ICIwIiAoKFVTSXR5cGUpKGFoKSksICJnIiAoKFVT SXR5cGUpKGJoKSksCQkJXAorCSAgICAgIjEiICgoVVNJdHlwZSkoYWwpKSwgImciICgoVVNJdHlw ZSkoYmwpKSkKKyNkZWZpbmUgdW11bF9wcG1tKHBoLCBwbCwgbTAsIG0xKSBcCisgIF9fYXNtX18g KCJtdWx4ICUzLCUwLCUxIgkJCQkJCVwKKwkgICA6ICI9ZyIgKHBoKSwgIj1yIiAocGwpCQkJCQlc CisJICAgOiAiJTAiICgoVVNJdHlwZSkobTApKSwgImciICgoVVNJdHlwZSkobTEpKSkKKyNkZWZp bmUgdWRpdl9xcm5uZChxLCByLCBuaCwgbmwsIGQpIFwKKyAgX19hc21fXyAoImRpdnggJTQsJTAs JTEiCQkJCQkJXAorCSAgIDogIj1nIiAocSksICI9ciIgKHIpCQkJCQkJXAorCSAgIDogIjEiICgo VVNJdHlwZSkobmgpKSwgIjAiICgoVVNJdHlwZSkobmwpKSwgImciICgoVVNJdHlwZSkoZCkpKQor I2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBcCisgIF9fYXNtX18gKCJic2No LzEgJTEsJTAiCQkJCQkJXAorCSAgIDogIj1nIiAoY291bnQpIDogImciICgoVVNJdHlwZSkoeCkp LCAiMCIgKChVU0l0eXBlKTApKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX2hwcGEpICYmIFdf VFlQRV9TSVpFID09IDMyCisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBi bCkgXAorICBfX2FzbV9fICgiYWRkJUk1ICU1LCVyNCwlMVxuXHRhZGRjICVyMiwlcjMsJTAiCQkJ XAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgOiAick0iIChhaCksICJy TSIgKGJoKSwgIiVyTSIgKGFsKSwgInJJIiAoYmwpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBz bCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInN1YiVJNCAlNCwlcjUsJTFcblx0c3Vi YiAlcjIsJXIzLCUwIgkJCVwKKwkgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAg IDogInJNIiAoYWgpLCAick0iIChiaCksICJySSIgKGFsKSwgInJNIiAoYmwpKQorI2lmIGRlZmlu ZWQgKF9QQV9SSVNDMV8xKQorI2RlZmluZSB1bXVsX3BwbW0od2gsIHdsLCB1LCB2KSBcCisgIGRv IHsJCQkJCQkJCQlcCisgICAgdW5pb24ge1VESXR5cGUgX19sbDsJCQkJCQlcCisJICAgc3RydWN0 IHtVU0l0eXBlIF9faCwgX19sO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJXAorICAgIF9f YXNtX18gKCJ4bXB5dSAlMSwlMiwlMCIgOiAiPSpmIiAoX194Ll9fbGwpIDogIipmIiAodSksICIq ZiIgKHYpKTsJXAorICAgICh3aCkgPSBfX3guX19pLl9faDsJCQkJCQkJXAorICAgICh3bCkgPSBf X3guX19pLl9fbDsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBVTVVMX1RJTUUgOAor I2RlZmluZSBVRElWX1RJTUUgNjAKKyNlbHNlCisjZGVmaW5lIFVNVUxfVElNRSA0MAorI2RlZmlu ZSBVRElWX1RJTUUgODAKKyNlbmRpZgorI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50 LCB4KSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVNJdHlwZSBfX3RtcDsJCQkJCQkJXAorICAg IF9fYXNtX18gKAkJCQkJCQkJXAorICAgICAgICJsZGkJCTEsJTBcbiIJCQkJCQlcCisiCWV4dHJ1 LD0JCSUxLDE1LDE2LCUlcjAJOyBCaXRzIDMxLi4xNiB6ZXJvP1xuIgkJXAorIglleHRydSx0cgkl MSwxNSwxNiwlMQk7IE5vLiAgU2hpZnQgZG93biwgc2tpcCBhZGQuXG4iCVwKKyIJbGRvCQkxNigl MCksJTAJOyBZZXMuICBQZXJmb3JtIGFkZC5cbiIJCVwKKyIJZXh0cnUsPQkJJTEsMjMsOCwlJXIw CTsgQml0cyAxNS4uOCB6ZXJvP1xuIgkJXAorIglleHRydSx0cgklMSwyMyw4LCUxCTsgTm8uICBT aGlmdCBkb3duLCBza2lwIGFkZC5cbiIJXAorIglsZG8JCTgoJTApLCUwCTsgWWVzLiAgUGVyZm9y bSBhZGQuXG4iCQlcCisiCWV4dHJ1LD0JCSUxLDI3LDQsJSVyMAk7IEJpdHMgNy4uNCB6ZXJvP1xu IgkJXAorIglleHRydSx0cgklMSwyNyw0LCUxCTsgTm8uICBTaGlmdCBkb3duLCBza2lwIGFkZC5c biIJXAorIglsZG8JCTQoJTApLCUwCTsgWWVzLiAgUGVyZm9ybSBhZGQuXG4iCQlcCisiCWV4dHJ1 LD0JCSUxLDI5LDIsJSVyMAk7IEJpdHMgMy4uMiB6ZXJvP1xuIgkJXAorIglleHRydSx0cgklMSwy OSwyLCUxCTsgTm8uICBTaGlmdCBkb3duLCBza2lwIGFkZC5cbiIJXAorIglsZG8JCTIoJTApLCUw CTsgWWVzLiAgUGVyZm9ybSBhZGQuXG4iCQlcCisiCWV4dHJ1CQklMSwzMCwxLCUxCTsgRXh0cmFj dCBiaXQgMS5cbiIJCVwKKyIJc3ViCQklMCwlMSwlMAk7IFN1YnRyYWN0IGl0LlxuIgkJXAorCTog Ij1yIiAoY291bnQpLCAiPXIiIChfX3RtcCkgOiAiMSIgKHgpKTsJCQlcCisgIH0gd2hpbGUgKDAp CisjZW5kaWYgLyogaHBwYSAqLworCisvKiBUaGVzZSBtYWNyb3MgYXJlIGZvciBBQkk9Mi4wdy4g IEluIEFCST0yLjBuIHRoZXkgY2FuJ3QgYmUgdXNlZCwgc2luY2UgR0NDCisgICAoMy4yKSBwdXRz IGxvbmdsb25nIGludG8gdHdvIGFkamFjZW50IDMyLWJpdCByZWdpc3RlcnMuICBQcmVzdW1hYmx5 IHRoaXMKKyAgIGlzIGp1c3QgYSBjYXNlIG9mIG5vIGRpcmVjdCBzdXBwb3J0IGZvciAyLjBuIGJ1 dCB0cmVhdGluZyBpdCBsaWtlIDEuMC4gKi8KKyNpZiBkZWZpbmVkIChfX2hwcGEpICYmIFdfVFlQ RV9TSVpFID09IDY0ICYmICEgZGVmaW5lZCAoX0xPTkdfTE9OR19MSU1CKQorI2RlZmluZSBhZGRf c3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoImFkZCVJNSAlNSwl cjQsJTFcblx0YWRkLGRjICVyMiwlcjMsJTAiCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAo c2wpCQkJCQlcCisJICAgOiAick0iIChhaCksICJyTSIgKGJoKSwgIiVyTSIgKGFsKSwgInJJIiAo YmwpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19h c21fXyAoInN1YiVJNCAlNCwlcjUsJTFcblx0c3ViLGRiICVyMiwlcjMsJTAiCQkJXAorCSAgIDog Ij1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgOiAick0iIChhaCksICJyTSIgKGJoKSwg InJJIiAoYWwpLCAick0iIChibCkpCisjZW5kaWYgLyogaHBwYSAqLworCisjaWYgKGRlZmluZWQg KF9faTM3MF9fKSB8fCBkZWZpbmVkIChfX3MzOTBfXykgfHwgZGVmaW5lZCAoX19tdnNfXykpICYm IFdfVFlQRV9TSVpFID09IDMyCisjaWYgZGVmaW5lZCAoX196YXJjaF9fKSB8fCBkZWZpbmVkIChI QVZFX0hPU1RfQ1BVX3MzOTBfemFyY2gpCisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwg YWwsIGJoLCBibCkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorLyogIGlmIChfX2J1aWx0aW5fY29u c3RhbnRfcCAoYmwpKQkJCQkJXAorICAgICAgX19hc21fXyAoImFsZmlcdCUxLCVvNVxuXHRhbGNy XHQlMCwlMyIJCQkJXAorCSAgICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAg ICAgICA6ICIwIiAgKGFoKSwgInIiIChiaCksICIlMSIgKGFsKSwgIm4iIChibCkgX19DTE9CQkVS X0NDKTtcCisgICAgZWxzZQkJCQkJCQkJXAorKi8gICAgX19hc21fXyAoImFsclx0JTEsJTVcblx0 YWxjclx0JTAsJTMiCQkJCVwKKwkgICAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwK KwkgICAgICAgOiAiMCIgIChhaCksICJyIiAoYmgpLCAiJTEiIChhbCksICJyIiAoYmwpX19DTE9C QkVSX0NDKTsJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgs IGFsLCBiaCwgYmwpCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKy8qICBpZiAoX19idWlsdGluX2Nv bnN0YW50X3AgKGJsKSkJCQkJCVwKKyAgICAgIF9fYXNtX18gKCJzbGZpXHQlMSwlbzVcblx0c2xi clx0JTAsJTMiCQkJCVwKKwkgICAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkg ICAgICAgOiAiMCIgKGFoKSwgInIiIChiaCksICIxIiAoYWwpLCAibiIgKGJsKSBfX0NMT0JCRVJf Q0MpOwlcCisgICAgZWxzZQkJCQkJCQkJXAorKi8gICAgX19hc21fXyAoInNsclx0JTEsJTVcblx0 c2xiclx0JTAsJTMiCQkJCVwKKwkgICAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwK KwkgICAgICAgOiAiMCIgKGFoKSwgInIiIChiaCksICIxIiAoYWwpLCAiciIgKGJsKSBfX0NMT0JC RVJfQ0MpOwlcCisgIH0gd2hpbGUgKDApCisjaWYgX19HTVBfR05VQ19QUkVSRVEgKDQsNSkKKyNk ZWZpbmUgdW11bF9wcG1tKHhoLCB4bCwgbTAsIG0xKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAor ICAgIHVuaW9uIHtVREl0eXBlIF9fbGw7CQkJCQkJXAorCSAgIHN0cnVjdCB7VVNJdHlwZSBfX2gs IF9fbDt9IF9faTsJCQkJXAorCSAgfSBfX3g7CQkJCQkJCVwKKyAgICBfX3guX19sbCA9IChVREl0 eXBlKSAobTApICogKFVESXR5cGUpIChtMSk7CQkJCVwKKyAgICAoeGgpID0gX194Ll9faS5fX2g7 ICh4bCkgPSBfX3guX19pLl9fbDsJCQkJXAorICB9IHdoaWxlICgwKQorI2Vsc2UKKyNpZiAwCisv KiBGSVhNRTogdGhpcyBmYWlscyBpZiBnY2Mga25vd3MgYWJvdXQgdGhlIDY0LWJpdCByZWdpc3Rl cnMuICBVc2Ugb25seQorICAgd2l0aCBhIG5ldyBlbm91Z2ggcHJvY2Vzc29yIHByZXRlbmRpbmcg d2UgaGF2ZSAzMi1iaXQgcmVnaXN0ZXJzLiAgKi8KKyNkZWZpbmUgdW11bF9wcG1tKHhoLCB4bCwg bTAsIG0xKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIHVuaW9uIHtVREl0eXBlIF9fbGw7 CQkJCQkJXAorCSAgIHN0cnVjdCB7VVNJdHlwZSBfX2gsIF9fbDt9IF9faTsJCQkJXAorCSAgfSBf X3g7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgibWxyXHQlMCwlMiIJCQkJCQlcCisJICAgICA6ICI9 ciIgKF9feC5fX2xsKQkJCQkJCVwKKwkgICAgIDogIiUwIiAobTApLCAiciIgKG0xKSk7CQkJCQlc CisgICAgKHhoKSA9IF9feC5fX2kuX19oOyAoeGwpID0gX194Ll9faS5fX2w7CQkJCVwKKyAgfSB3 aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIHVtdWxfcHBtbSh4aCwgeGwsIG0wLCBtMSkJCQkJCVwK KyAgZG8gewkJCQkJCQkJCVwKKyAgLyogV2hlbiB3ZSBoYXZlIDY0LWJpdCByZWdzIGFuZCBnY2Mg aXMgYXdhcmUgb2YgdGhhdCwgd2UgY2Fubm90IHNpbXBseSB1c2UKKyAgICAgREltb2RlIGZvciB0 aGUgcHJvZHVjdCwgc2luY2UgdGhhdCB3b3VsZCBiZSBhbGxvY2F0ZWQgdG8gYSBzaW5nbGUgNjQt Yml0CisgICAgIHJlZ2lzdGVyLCB3aGVyZWFzIG1sciB1c2VzIHRoZSBsb3cgMzItYml0cyBvZiBh biBldmVuLW9kZCByZWdpc3RlciBwYWlyLgorICAqLwkJCQkJCQkJCVwKKyAgICByZWdpc3RlciBV U0l0eXBlIF9fcjAgX19hc21fXyAoIjAiKTsJCQkJXAorICAgIHJlZ2lzdGVyIFVTSXR5cGUgX19y MSBfX2FzbV9fICgiMSIpID0gKG0wKTsJCQkJXAorICAgIF9fYXNtX18gKCJtbHJcdCUwLCUzIgkJ CQkJCVwKKwkgICAgIDogIj1yIiAoX19yMCksICI9ciIgKF9fcjEpCQkJCQlcCisJICAgICA6ICJy IiAoX19yMSksICJyIiAobTEpKTsJCQkJCVwKKyAgICAoeGgpID0gX19yMDsgKHhsKSA9IF9fcjE7 CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmIC8qIGlmIDAgKi8KKyNlbmRpZgorI2lmIDAK Ky8qIEZJWE1FOiB0aGlzIGZhaWxzIGlmIGdjYyBrbm93cyBhYm91dCB0aGUgNjQtYml0IHJlZ2lz dGVycy4gIFVzZSBvbmx5CisgICB3aXRoIGEgbmV3IGVub3VnaCBwcm9jZXNzb3IgcHJldGVuZGlu ZyB3ZSBoYXZlIDMyLWJpdCByZWdpc3RlcnMuICAqLworI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIs IG4xLCBuMCwgZCkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB1bmlvbiB7VURJdHlwZSBf X2xsOwkJCQkJCVwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19oLCBfX2w7fSBfX2k7CQkJCVwKKwkg IH0gX194OwkJCQkJCQlcCisgICAgX194Ll9faS5fX2ggPSBuMTsgX194Ll9faS5fX2wgPSBuMDsJ CQkJCVwKKyAgICBfX2FzbV9fICgiZGxyXHQlMCwlMiIJCQkJCQlcCisJICAgICA6ICI9ciIgKF9f eC5fX2xsKQkJCQkJCVwKKwkgICAgIDogIjAiIChfX3guX19sbCksICJyIiAoZCkpOwkJCQlcCisg ICAgKHEpID0gX194Ll9faS5fX2w7IChyKSA9IF9feC5fX2kuX19oOwkJCQlcCisgIH0gd2hpbGUg KDApCisjZWxzZQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkJCQkJCVwKKyAg ZG8gewkJCQkJCQkJCVwKKyAgICByZWdpc3RlciBVU0l0eXBlIF9fcjAgX19hc21fXyAoIjAiKSA9 IChuMSk7CQkJCVwKKyAgICByZWdpc3RlciBVU0l0eXBlIF9fcjEgX19hc21fXyAoIjEiKSA9IChu MCk7CQkJCVwKKyAgICBfX2FzbV9fICgiZGxyXHQlMCwlNCIJCQkJCQlcCisJICAgICA6ICI9ciIg KF9fcjApLCAiPXIiIChfX3IxKQkJCQkJXAorCSAgICAgOiAiciIgKF9fcjApLCAiciIgKF9fcjEp LCAiciIgKGQpKTsJCQlcCisgICAgKHEpID0gX19yMTsgKHIpID0gX19yMDsJCQkJCQlcCisgIH0g d2hpbGUgKDApCisjZW5kaWYgLyogaWYgMCAqLworI2Vsc2UgLyogaWYgX196YXJjaF9fICovCisv KiBGSVhNRTogdGhpcyBmYWlscyBpZiBnY2Mga25vd3MgYWJvdXQgdGhlIDY0LWJpdCByZWdpc3Rl cnMuICAqLworI2RlZmluZSBzbXVsX3BwbW0oeGgsIHhsLCBtMCwgbTEpCQkJCQlcCisgIGRvIHsJ CQkJCQkJCQlcCisgICAgdW5pb24ge0RJdHlwZSBfX2xsOwkJCQkJCQlcCisJICAgc3RydWN0IHtV U0l0eXBlIF9faCwgX19sO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJXAorICAgIF9fYXNt X18gKCJtclx0JTAsJTIiCQkJCQkJXAorCSAgICAgOiAiPXIiIChfX3guX19sbCkJCQkJCQlcCisJ ICAgICA6ICIlMCIgKG0wKSwgInIiIChtMSkpOwkJCQkJXAorICAgICh4aCkgPSBfX3guX19pLl9f aDsgKHhsKSA9IF9feC5fX2kuX19sOwkJCQlcCisgIH0gd2hpbGUgKDApCisvKiBGSVhNRTogdGhp cyBmYWlscyBpZiBnY2Mga25vd3MgYWJvdXQgdGhlIDY0LWJpdCByZWdpc3RlcnMuICAqLworI2Rl ZmluZSBzZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwK KyAgICB1bmlvbiB7REl0eXBlIF9fbGw7CQkJCQkJCVwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19o LCBfX2w7fSBfX2k7CQkJCVwKKwkgIH0gX194OwkJCQkJCQlcCisgICAgX194Ll9faS5fX2ggPSBu MTsgX194Ll9faS5fX2wgPSBuMDsJCQkJCVwKKyAgICBfX2FzbV9fICgiZHJcdCUwLCUyIgkJCQkJ CVwKKwkgICAgIDogIj1yIiAoX194Ll9fbGwpCQkJCQkJXAorCSAgICAgOiAiMCIgKF9feC5fX2xs KSwgInIiIChkKSk7CQkJCVwKKyAgICAocSkgPSBfX3guX19pLl9fbDsgKHIpID0gX194Ll9faS5f X2g7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBpZiBfX3phcmNoX18gKi8KKyNlbmRp ZgorCisjaWYgZGVmaW5lZCAoX19zMzkweF9fKSAmJiBXX1RZUEVfU0laRSA9PSA2NAorLyogV2Ug bmVlZCB0byBjYXN0IG9wZXJhbmRzIHdpdGggcmVnaXN0ZXIgY29uc3RyYWludHMsIG90aGVyd2lz ZSB0aGVpciB0eXBlcworICAgd2lsbCBiZSBhc3N1bWVkIHRvIGJlIFNJbW9kZSBieSBnY2MuICBG b3IgdGhlc2UgbWFjaGluZXMsIHN1Y2ggb3BlcmF0aW9ucworICAgd2lsbCBpbnNlcnQgYSB2YWx1 ZSBpbnRvIHRoZSBsb3cgMzIgYml0cywgYW5kIGxlYXZlIHRoZSBoaWdoIDMyIGJpdHMgd2l0aAor ICAgZ2FyYmFnZS4gICovCisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBi bCkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIF9fYXNtX18gKCJhbGdyXHQlMSwlNVxuXHRh bGNnclx0JTAsJTMiCQkJCVwKKwkgICAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwK KwkgICAgICAgOiAiMCIgICgoVURJdHlwZSkoYWgpKSwgInIiICgoVURJdHlwZSkoYmgpKSwJCVwK KwkJICIlMSIgKChVREl0eXBlKShhbCkpLCAiciIgKChVREl0eXBlKShibCkpIF9fQ0xPQkJFUl9D Qyk7IFwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwg YmgsIGJsKQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgX19hc21fXyAoInNsZ3JcdCUxLCU1 XG5cdHNsYmdyXHQlMCwlMyIJCQkJXAorCSAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJ CVwKKwkgICAgIDogIjAiICgoVURJdHlwZSkoYWgpKSwgInIiICgoVURJdHlwZSkoYmgpKSwJCVwK KwkgICAgICAgIjEiICgoVURJdHlwZSkoYWwpKSwgInIiICgoVURJdHlwZSkoYmwpKSBfX0NMT0JC RVJfQ0MpOwlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIHVtdWxfcHBtbSh4aCwgeGwsIG0wLCBt MSkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB1bmlvbiB7dW5zaWduZWQgaW50IF9fYXR0 cmlidXRlX18gKChtb2RlKFRJKSkpIF9fbGw7CQlcCisJICAgc3RydWN0IHtVREl0eXBlIF9faCwg X19sO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJtbGdyXHQl MCwlMiIJCQkJCQlcCisJICAgICA6ICI9ciIgKF9feC5fX2xsKQkJCQkJCVwKKwkgICAgIDogIiUw IiAoKFVESXR5cGUpKG0wKSksICJyIiAoKFVESXR5cGUpKG0xKSkpOwkJXAorICAgICh4aCkgPSBf X3guX19pLl9faDsgKHhsKSA9IF9feC5fX2kuX19sOwkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVm aW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAor ICAgIHVuaW9uIHt1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXyAoKG1vZGUoVEkpKSkgX19sbDsJ CVwKKwkgICBzdHJ1Y3Qge1VESXR5cGUgX19oLCBfX2w7fSBfX2k7CQkJCVwKKwkgIH0gX194OwkJ CQkJCQlcCisgICAgX194Ll9faS5fX2ggPSBuMTsgX194Ll9faS5fX2wgPSBuMDsJCQkJCVwKKyAg ICBfX2FzbV9fICgiZGxnclx0JTAsJTIiCQkJCQkJXAorCSAgICAgOiAiPXIiIChfX3guX19sbCkJ CQkJCQlcCisJICAgICA6ICIwIiAoX194Ll9fbGwpLCAiciIgKChVREl0eXBlKShkKSkpOwkJCVwK KyAgICAocSkgPSBfX3guX19pLl9fbDsgKHIpID0gX194Ll9faS5fX2g7CQkJCVwKKyAgfSB3aGls ZSAoMCkKKyNpZiAwIC8qIEZJWE1FOiBFbmFibGUgZm9yIHoxMCAoPykgKi8KKyNkZWZpbmUgY291 bnRfbGVhZGluZ196ZXJvcyhjbnQsIHgpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgdW5p b24ge3Vuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fICgobW9kZShUSSkpKSBfX2xsOwkJXAorCSAg IHN0cnVjdCB7VURJdHlwZSBfX2gsIF9fbDt9IF9faTsJCQkJXAorCSAgfSBfX2Nscl9jbnQ7CQkJ CQkJCVwKKyAgICBfX2FzbV9fICgiZmxvZ3JcdCUwLCUxIgkJCQkJCVwKKwkgICAgIDogIj1yIiAo X19jbHJfY250Ll9fbGwpCQkJCQlcCisJICAgICA6ICJyIiAoeCkgX19DTE9CQkVSX0NDKTsJCQkJ CVwKKyAgICAoY250KSA9IF9fY2xyX2NudC5fX2kuX19oOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkK KyNlbmRpZgorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCAoX19pMzg2X18pIHx8IGRlZmluZWQgKF9f aTQ4Nl9fKSkgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2ws IGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJhZGRsICU1LCVrMVxuXHRhZGNsICUzLCVr MCIJCQkJCVwKKwkgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgIDogIjAiICAo KFVTSXR5cGUpKGFoKSksICJnIiAoKFVTSXR5cGUpKGJoKSksCQkJXAorCSAgICAgIiUxIiAoKFVT SXR5cGUpKGFsKSksICJnIiAoKFVTSXR5cGUpKGJsKSkpCisjZGVmaW5lIHN1Yl9kZG1tc3Moc2gs IHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBfX2FzbV9fICgic3VibCAlNSwlazFcblx0c2JibCAl MywlazAiCQkJCQlcCisJICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICA6ICIw IiAoKFVTSXR5cGUpKGFoKSksICJnIiAoKFVTSXR5cGUpKGJoKSksCQkJXAorCSAgICAgIjEiICgo VVNJdHlwZSkoYWwpKSwgImciICgoVVNJdHlwZSkoYmwpKSkKKyNkZWZpbmUgdW11bF9wcG1tKHcx LCB3MCwgdSwgdikgXAorICBfX2FzbV9fICgibXVsbCAlMyIJCQkJCQkJXAorCSAgIDogIj1hIiAo dzApLCAiPWQiICh3MSkJCQkJCVwKKwkgICA6ICIlMCIgKChVU0l0eXBlKSh1KSksICJybSIgKChV U0l0eXBlKSh2KSkpCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkeCkgLyogZCBy ZW5hbWVkIHRvIGR4IGF2b2lkaW5nICI9ZCIgKi9cCisgIF9fYXNtX18gKCJkaXZsICU0IgkJICAg ICAvKiBzdHJpbmdpZmljYXRpb24gaW4gSyZSIEMgKi8JXAorCSAgIDogIj1hIiAocSksICI9ZCIg KHIpCQkJCQkJXAorCSAgIDogIjAiICgoVVNJdHlwZSkobjApKSwgIjEiICgoVVNJdHlwZSkobjEp KSwgInJtIiAoKFVTSXR5cGUpKGR4KSkpCisKKyNpZiBIQVZFX0hPU1RfQ1BVX2k1ODYgfHwgSEFW RV9IT1NUX0NQVV9wZW50aXVtIHx8IEhBVkVfSE9TVF9DUFVfcGVudGl1bW1teAorLyogUGVudGl1 bSBic3JsIHRha2VzIGJldHdlZW4gMTAgYW5kIDcyIGN5Y2xlcyBkZXBlbmRpbmcgd2hlcmUgdGhl IG1vc3QKKyAgIHNpZ25pZmljYW50IDEgYml0IGlzLCBoZW5jZSB0aGUgdXNlIG9mIHRoZSBmb2xs b3dpbmcgYWx0ZXJuYXRpdmVzLiAgYnNmbAorICAgaXMgc2xvdyB0b28sIGJldHdlZW4gMTggYW5k IDQyIGRlcGVuZGluZyB3aGVyZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgMQorICAgYml0IGlzLCBz byBsZXQgdGhlIGdlbmVyaWMgY291bnRfdHJhaWxpbmdfemVyb3MgYmVsb3cgbWFrZSB1c2Ugb2Yg dGhlCisgICBjb3VudF9sZWFkaW5nX3plcm9zIGhlcmUgdG9vLiAgKi8KKworI2lmIEhBVkVfSE9T VF9DUFVfcGVudGl1bW1teCAmJiAhIGRlZmluZWQgKExPTkdMT05HX1NUQU5EQUxPTkUpCisvKiBU aGUgZm9sbG93aW5nIHNob3VsZCBiZSBhIGZpeGVkIDE0IG9yIDE1IGN5Y2xlcywgYnV0IHBvc3Np Ymx5IHBsdXMgYW4gTDEKKyAgIGNhY2hlIG1pc3MgcmVhZGluZyBmcm9tIF9fY2x6X3RhYi4gIEZv ciBQNTUgaXQncyBmYXZvdXJlZCBvdmVyIHRoZSBmbG9hdAorICAgYmVsb3cgc28gYXMgdG8gYXZv aWQgbWl4aW5nIE1NWCBhbmQgeDg3LCBzaW5jZSB0aGUgcGVuYWx0eSBmb3Igc3dpdGNoaW5nCisg ICBiZXR3ZWVuIHRoZSB0d28gaXMgYWJvdXQgMTAwIGN5Y2xlcy4KKworICAgVGhlIGFzbSBibG9j ayBzZXRzIF9fc2hpZnQgdG8gLTMgaWYgdGhlIGhpZ2ggMjQgYml0cyBhcmUgY2xlYXIsIC0yIGZv cgorICAgMTYsIC0xIGZvciA4LCBvciAwIG90aGVyd2lzZS4gIFRoaXMgY291bGQgYmUgd3JpdHRl biBlcXVpdmFsZW50bHkgYXMKKyAgIGZvbGxvd3MsIGJ1dCBhcyBvZiBnY2MgMi45NS4yIGl0IHJl c3VsdHMgaW4gY29uZGl0aW9uYWwganVtcHMuCisKKyAgICAgICBfX3NoaWZ0ID0gLShfX24gPCAw eDEwMDAwMDApOworICAgICAgIF9fc2hpZnQgLT0gKF9fbiA8IDB4MTAwMDApOworICAgICAgIF9f c2hpZnQgLT0gKF9fbiA8IDB4MTAwKTsKKworICAgVGhlIG1pZGRsZSB0d28gc2JibCBhbmQgY21w bCdzIHBhaXIsIGFuZCB3aXRoIGx1Y2sgc29tZXRoaW5nIGdjYworICAgZ2VuZXJhdGVzIG1pZ2h0 IHBhaXIgd2l0aCB0aGUgZmlyc3QgY21wbCBhbmQgdGhlIGxhc3Qgc2JibC4gIFRoZSAiMzIrMSIK KyAgIGNvbnN0YW50IGNvdWxkIGJlIGZvbGRlZCBpbnRvIF9fY2x6X3RhYltdLCBidXQgaXQgZG9l c24ndCBzZWVtIHdvcnRoCisgICBtYWtpbmcgYSBkaWZmZXJlbnQgdGFibGUganVzdCBmb3IgdGhh dC4gICovCisKKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJvcyhjLG4pCQkJCQlcCisgIGRvIHsJ CQkJCQkJCQlcCisgICAgVVNJdHlwZSAgX19uID0gKG4pOwkJCQkJCQlcCisgICAgVVNJdHlwZSAg X19zaGlmdDsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJjbXBsICAkMHgxMDAwMDAwLCAlMVxuIgkJ CQkJXAorCSAgICAgInNiYmwgICUwLCAlMFxuIgkJCQkJCVwKKwkgICAgICJjbXBsICAkMHgxMDAw MCwgJTFcbiIJCQkJCVwKKwkgICAgICJzYmJsICAkMCwgJTBcbiIJCQkJCQlcCisJICAgICAiY21w bCAgJDB4MTAwLCAlMVxuIgkJCQkJXAorCSAgICAgInNiYmwgICQwLCAlMFxuIgkJCQkJCVwKKwkg ICAgIDogIj0mciIgKF9fc2hpZnQpIDogInIiICAoX19uKSk7CQkJCVwKKyAgICBfX3NoaWZ0ID0g X19zaGlmdCo4ICsgMjQgKyAxOwkJCQkJXAorICAgIChjKSA9IDMyICsgMSAtIF9fc2hpZnQgLSBf X2Nsel90YWJbX19uID4+IF9fc2hpZnRdOwkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgQ09V TlRfTEVBRElOR19aRVJPU19ORUVEX0NMWl9UQUIKKyNkZWZpbmUgQ09VTlRfTEVBRElOR19aRVJP U18wICAgMzEgICAvKiBuPT0wIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gbj09MSAqLworCisjZWxz ZSAvKiAhIHBlbnRpdW1tbXggfHwgTE9OR0xPTkdfU1RBTkRBTE9ORSAqLworLyogVGhlIGZvbGxv d2luZyBzaG91bGQgYmUgYSBmaXhlZCAxNCBjeWNsZXMgb3Igc28uICBTb21lIHNjaGVkdWxpbmcK KyAgIG9wcG9ydHVuaXRpZXMgc2hvdWxkIGJlIGF2YWlsYWJsZSBiZXR3ZWVuIHRoZSBmbG9hdCBs b2FkL3N0b3JlIHRvby4gIFRoaXMKKyAgIHNvcnQgb2YgY29kZSBpcyB1c2VkIGluIGdjYyAzIGZv ciBfX2J1aWx0aW5fZmZzICh3aXRoICJuJi1uIikgYW5kIGlzCisgICBhcHBhcmVudGx5IHN1Z2dl c3RlZCBieSB0aGUgSW50ZWwgb3B0aW1pemluZyBtYW51YWwgKGRvbid0IGtub3cgZXhhY3RseQor ICAgd2hlcmUpLiAgZ2NjIDIuOTUgb3IgdXAgd2lsbCBiZSBiZXN0IGZvciB0aGlzLCBzbyB0aGUg ImRvdWJsZSIgaXMKKyAgIGNvcnJlY3RseSBhbGlnbmVkIG9uIHRoZSBzdGFjay4gICovCisjZGVm aW5lIGNvdW50X2xlYWRpbmdfemVyb3MoYyxuKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAg IHVuaW9uIHsJCQkJCQkJCVwKKyAgICAgIGRvdWJsZSAgICBkOwkJCQkJCQlcCisgICAgICB1bnNp Z25lZCAgYVsyXTsJCQkJCQkJXAorICAgIH0gX191OwkJCQkJCQkJXAorICAgIEFTU0VSVCAoKG4p ICE9IDApOwkJCQkJCQlcCisgICAgX191LmQgPSAoVVd0eXBlKSAobik7CQkJCQkJXAorICAgIChj KSA9IDB4M0ZGICsgMzEgLSAoX191LmFbMV0gPj4gMjApOwkJCQlcCisgIH0gd2hpbGUgKDApCisj ZGVmaW5lIENPVU5UX0xFQURJTkdfWkVST1NfMCAgICgweDNGRiArIDMxKQorI2VuZGlmIC8qIHBl bnRpdW1teCAqLworCisjZWxzZSAvKiAhIHBlbnRpdW0gKi8KKworI2lmIF9fR01QX0dOVUNfUFJF UkVRICgzLDQpICAvKiB1c2luZyBic3JsICovCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3Mo Y291bnQseCkgIGNvdW50X2xlYWRpbmdfemVyb3NfZ2NjX2Nseihjb3VudCx4KQorI2VuZGlmIC8q IGdjYyBjbHogKi8KKworLyogT24gUDYsIGdjYyBwcmlvciB0byAzLjAgZ2VuZXJhdGVzIGEgcGFy dGlhbCByZWdpc3RlciBzdGFsbCBmb3IKKyAgIF9fY2J0bXBeMzEsIGR1ZSB0byB1c2luZyAieG9y YiAkMzEiIGluc3RlYWQgb2YgInhvcmwgJDMxIiwgdGhlIGZvcm1lcgorICAgYmVpbmcgMSBjb2Rl IGJ5dGUgc21hbGxlci4gICIzMS1fX2NidG1wIiBpcyBhIHdvcmthcm91bmQsIHByb2JhYmx5IGF0 IHRoZQorICAgY29zdCBvZiBvbmUgZXh0cmEgaW5zdHJ1Y3Rpb24uICBEbyB0aGlzIGZvciAiaTM4 NiIgdG9vLCBzaW5jZSB0aGF0IG1lYW5zCisgICBnZW5lcmljIHg4Ni4gICovCisjaWYgISBkZWZp bmVkIChjb3VudF9sZWFkaW5nX3plcm9zKSAmJiBfX0dOVUNfXyA8IDMgICAgICAgICAgICAgICAg ICAgICBcCisgICYmIChIQVZFX0hPU1RfQ1BVX2kzODYJCQkJCQlcCisgICAgICB8fCBIQVZFX0hP U1RfQ1BVX2k2ODYJCQkJCQlcCisgICAgICB8fCBIQVZFX0hPU1RfQ1BVX3BlbnRpdW1wcm8JCQkJ CVwKKyAgICAgIHx8IEhBVkVfSE9TVF9DUFVfcGVudGl1bTIJCQkJCQlcCisgICAgICB8fCBIQVZF X0hPU1RfQ1BVX3BlbnRpdW0zKQorI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4 KQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVTSXR5cGUgX19jYnRtcDsJCQkJCQkJXAor ICAgIEFTU0VSVCAoKHgpICE9IDApOwkJCQkJCQlcCisgICAgX19hc21fXyAoImJzcmwgJTEsJTAi IDogIj1yIiAoX19jYnRtcCkgOiAicm0iICgoVVNJdHlwZSkoeCkpKTsJXAorICAgIChjb3VudCkg PSAzMSAtIF9fY2J0bXA7CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmIC8qIGdjYzwzIGFz bSBic3JsICovCisKKyNpZm5kZWYgY291bnRfbGVhZGluZ196ZXJvcworI2RlZmluZSBjb3VudF9s ZWFkaW5nX3plcm9zKGNvdW50LCB4KQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVTSXR5 cGUgX19jYnRtcDsJCQkJCQkJXAorICAgIEFTU0VSVCAoKHgpICE9IDApOwkJCQkJCQlcCisgICAg X19hc21fXyAoImJzcmwgJTEsJTAiIDogIj1yIiAoX19jYnRtcCkgOiAicm0iICgoVVNJdHlwZSko eCkpKTsJXAorICAgIChjb3VudCkgPSBfX2NidG1wIF4gMzE7CQkJCQkJXAorICB9IHdoaWxlICgw KQorI2VuZGlmIC8qIGFzbSBic3JsICovCisKKyNpZiBfX0dNUF9HTlVDX1BSRVJFUSAoMyw0KSAg LyogdXNpbmcgYnNmbCAqLworI2RlZmluZSBjb3VudF90cmFpbGluZ196ZXJvcyhjb3VudCx4KSAg Y291bnRfdHJhaWxpbmdfemVyb3NfZ2NjX2N0eihjb3VudCx4KQorI2VuZGlmIC8qIGdjYyBjdHog Ki8KKworI2lmbmRlZiBjb3VudF90cmFpbGluZ196ZXJvcworI2RlZmluZSBjb3VudF90cmFpbGlu Z196ZXJvcyhjb3VudCwgeCkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBBU1NFUlQgKCh4 KSAhPSAwKTsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJic2ZsICUxLCVrMCIgOiAiPXIiIChjb3Vu dCkgOiAicm0iICgoVVNJdHlwZSkoeCkpKTsJXAorICB9IHdoaWxlICgwKQorI2VuZGlmIC8qIGFz bSBic2ZsICovCisKKyNlbmRpZiAvKiAhIHBlbnRpdW0gKi8KKworI2lmbmRlZiBVTVVMX1RJTUUK KyNkZWZpbmUgVU1VTF9USU1FIDEwCisjZW5kaWYKKyNpZm5kZWYgVURJVl9USU1FCisjZGVmaW5l IFVESVZfVElNRSA0MAorI2VuZGlmCisjZW5kaWYgLyogODB4ODYgKi8KKworI2lmIGRlZmluZWQg KF9fYW1kNjRfXykgJiYgV19UWVBFX1NJWkUgPT0gNjQKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwg c2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJhZGRxICU1LCVxMVxuXHRhZGNxICUz LCVxMCIJCQkJCVwKKwkgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgIDogIjAi ICAoKFVESXR5cGUpKGFoKSksICJybWUiICgoVURJdHlwZSkoYmgpKSwJCVwKKwkgICAgICIlMSIg KChVREl0eXBlKShhbCkpLCAicm1lIiAoKFVESXR5cGUpKGJsKSkpCisjZGVmaW5lIHN1Yl9kZG1t c3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBfX2FzbV9fICgic3VicSAlNSwlcTFcblx0 c2JicSAlMywlcTAiCQkJCQlcCisJICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkg ICA6ICIwIiAoKFVESXR5cGUpKGFoKSksICJybWUiICgoVURJdHlwZSkoYmgpKSwJCVwKKwkgICAg ICIxIiAoKFVESXR5cGUpKGFsKSksICJybWUiICgoVURJdHlwZSkoYmwpKSkKKyNkZWZpbmUgdW11 bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBfX2FzbV9fICgibXVscSAlMyIJCQkJCQkJXAorCSAg IDogIj1hIiAodzApLCAiPWQiICh3MSkJCQkJCVwKKwkgICA6ICIlMCIgKChVREl0eXBlKSh1KSks ICJybSIgKChVREl0eXBlKSh2KSkpCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBk eCkgLyogZCByZW5hbWVkIHRvIGR4IGF2b2lkaW5nICI9ZCIgKi9cCisgIF9fYXNtX18gKCJkaXZx ICU0IgkJICAgICAvKiBzdHJpbmdpZmljYXRpb24gaW4gSyZSIEMgKi8JXAorCSAgIDogIj1hIiAo cSksICI9ZCIgKHIpCQkJCQkJXAorCSAgIDogIjAiICgoVURJdHlwZSkobjApKSwgIjEiICgoVURJ dHlwZSkobjEpKSwgInJtIiAoKFVESXR5cGUpKGR4KSkpCisvKiBic3JxIGRlc3RpbmF0aW9uIG11 c3QgYmUgYSA2NC1iaXQgcmVnaXN0ZXIsIGhlbmNlIFVESXR5cGUgZm9yIF9fY2J0bXAuICovCisj ZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpCQkJCQlcCisgIGRvIHsJCQkJCQkJ CQlcCisgICAgVURJdHlwZSBfX2NidG1wOwkJCQkJCQlcCisgICAgQVNTRVJUICgoeCkgIT0gMCk7 CQkJCQkJCVwKKyAgICBfX2FzbV9fICgiYnNycSAlMSwlMCIgOiAiPXIiIChfX2NidG1wKSA6ICJy bSIgKChVREl0eXBlKSh4KSkpOwlcCisgICAgKGNvdW50KSA9IF9fY2J0bXAgXiA2MzsJCQkJCQlc CisgIH0gd2hpbGUgKDApCisvKiBic2ZxIGRlc3RpbmF0aW9uIG11c3QgYmUgYSA2NC1iaXQgcmVn aXN0ZXIsICIlcTAiIGZvcmNlcyB0aGlzIGluIGNhc2UKKyAgIGNvdW50IGlzIG9ubHkgYW4gaW50 LiAqLworI2RlZmluZSBjb3VudF90cmFpbGluZ196ZXJvcyhjb3VudCwgeCkJCQkJCVwKKyAgZG8g ewkJCQkJCQkJCVwKKyAgICBBU1NFUlQgKCh4KSAhPSAwKTsJCQkJCQkJXAorICAgIF9fYXNtX18g KCJic2ZxICUxLCVxMCIgOiAiPXIiIChjb3VudCkgOiAicm0iICgoVURJdHlwZSkoeCkpKTsJXAor ICB9IHdoaWxlICgwKQorI2VuZGlmIC8qIHg4Nl82NCAqLworCisjaWYgZGVmaW5lZCAoX19pODYw X18pICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIHJzaGlmdF9yaGxjKHIsaCxsLGMpIFwK KyAgX19hc21fXyAoInNociAlMyxyMCxyMFw7c2hyZCAlMSwlMiwlMCIJCQkJXAorCSAgICI9ciIg KHIpIDogInIiIChoKSwgInIiIChsKSwgInJuIiAoYykpCisjZW5kaWYgLyogaTg2MCAqLworCisj aWYgZGVmaW5lZCAoX19pOTYwX18pICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIGFkZF9z c2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBfX2FzbV9fICgiY21wbyAxLDBcO2Fk ZGMgJTUsJTQsJTFcO2FkZGMgJTMsJTIsJTAiCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAo c2wpCQkJCQlcCisJICAgOiAiZEkiIChhaCksICJkSSIgKGJoKSwgIiVkSSIgKGFsKSwgImRJIiAo YmwpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19h c21fXyAoImNtcG8gMCwwXDtzdWJjICU1LCU0LCUxXDtzdWJjICUzLCUyLCUwIgkJCVwKKwkgICA6 ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgIDogImRJIiAoYWgpLCAiZEkiIChiaCks ICJkSSIgKGFsKSwgImRJIiAoYmwpKQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBc CisgICh7dW5pb24ge1VESXR5cGUgX19sbDsJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9f bCwgX19oO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJXAorICBfX2FzbV9fICgiZW11bCAl MiwlMSwlMCIJCQkJCQlcCisJICAgOiAiPWQiIChfX3guX19sbCkgOiAiJWRJIiAodSksICJkSSIg KHYpKTsJCQlcCisgICh3MSkgPSBfX3guX19pLl9faDsgKHcwKSA9IF9feC5fX2kuX19sO30pCisj ZGVmaW5lIF9fdW11bHNpZGkzKHUsIHYpIFwKKyAgKHtVREl0eXBlIF9fdzsJCQkJCQkJXAorICAg IF9fYXNtX18gKCJlbXVsICUyLCUxLCUwIiA6ICI9ZCIgKF9fdykgOiAiJWRJIiAodSksICJkSSIg KHYpKTsJXAorICAgIF9fdzsgfSkKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuaCwgbmwsIGQp IFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB1bmlvbiB7VURJdHlwZSBfX2xsOwkJCQkJCVwKKwkg ICBzdHJ1Y3Qge1VTSXR5cGUgX19sLCBfX2g7fSBfX2k7CQkJCVwKKwkgIH0gX19ubjsJCQkJCQkJ XAorICAgIF9fbm4uX19pLl9faCA9IChuaCk7IF9fbm4uX19pLl9fbCA9IChubCk7CQkJCVwKKyAg ICBfX2FzbV9fICgiZWRpdiAlZCwlbiwlMCIJCQkJCQlcCisJICAgOiAiPWQiIChfX3JxLl9fbGwp IDogImRJIiAoX19ubi5fX2xsKSwgImRJIiAoZCkpOwkJXAorICAgIChyKSA9IF9fcnEuX19pLl9f bDsgKHEpID0gX19ycS5fX2kuX19oOwkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIGNvdW50 X2xlYWRpbmdfemVyb3MoY291bnQsIHgpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVU0l0eXBl IF9fY2J0bXA7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgic2NhbmJpdCAlMSwlMCIgOiAiPXIiIChf X2NidG1wKSA6ICJyIiAoeCkpOwkJXAorICAgIChjb3VudCkgPSBfX2NidG1wIF4gMzE7CQkJCQkJ XAorICB9IHdoaWxlICgwKQorI2RlZmluZSBDT1VOVF9MRUFESU5HX1pFUk9TXzAgKC0zMikgLyog c2ljICovCisjaWYgZGVmaW5lZCAoX19pOTYwbXgpCQkvKiB3aGF0IGlzIHRoZSBwcm9wZXIgc3lt Ym9sIHRvIHRlc3Q/Pz8gKi8KKyNkZWZpbmUgcnNoaWZ0X3JobGMocixoLGwsYykgXAorICBkbyB7 CQkJCQkJCQkJXAorICAgIHVuaW9uIHtVREl0eXBlIF9fbGw7CQkJCQkJXAorCSAgIHN0cnVjdCB7 VVNJdHlwZSBfX2wsIF9faDt9IF9faTsJCQkJXAorCSAgfSBfX25uOwkJCQkJCQlcCisgICAgX19u bi5fX2kuX19oID0gKGgpOyBfX25uLl9faS5fX2wgPSAobCk7CQkJCVwKKyAgICBfX2FzbV9fICgi c2hyZSAlMiwlMSwlMCIgOiAiPWQiIChyKSA6ICJkSSIgKF9fbm4uX19sbCksICJkSSIgKGMpKTsJ XAorICB9CisjZW5kaWYgLyogaTk2MG14ICovCisjZW5kaWYgLyogaTk2MCAqLworCisjaWYgKGRl ZmluZWQgKF9fbWM2ODAwMF9fKSB8fCBkZWZpbmVkIChfX21jNjgwMjBfXykgfHwgZGVmaW5lZCht YzY4MDIwKSBcCisgICAgIHx8IGRlZmluZWQgKF9fbTY4a19fKSB8fCBkZWZpbmVkIChfX21jNTIw MF9fKSB8fCBkZWZpbmVkIChfX21jNTIwNmVfXykgXAorICAgICB8fCBkZWZpbmVkIChfX21jNTMw N19fKSkgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFo LCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJhZGQlLmwgJTUsJTFcblx0YWRkeCUubCAlMywl MCIJCQkJXAorCSAgIDogIj1kIiAoc2gpLCAiPSZkIiAoc2wpCQkJCQlcCisJICAgOiAiMCIgICgo VVNJdHlwZSkoYWgpKSwgImQiICgoVVNJdHlwZSkoYmgpKSwJCQlcCisJICAgICAiJTEiICgoVVNJ dHlwZSkoYWwpKSwgImciICgoVVNJdHlwZSkoYmwpKSkKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwg c2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJzdWIlLmwgJTUsJTFcblx0c3VieCUu bCAlMywlMCIJCQkJXAorCSAgIDogIj1kIiAoc2gpLCAiPSZkIiAoc2wpCQkJCQlcCisJICAgOiAi MCIgKChVU0l0eXBlKShhaCkpLCAiZCIgKChVU0l0eXBlKShiaCkpLAkJCVwKKwkgICAgICIxIiAo KFVTSXR5cGUpKGFsKSksICJnIiAoKFVTSXR5cGUpKGJsKSkpCisvKiBUaGUgJzAyMCwgJzAzMCwg JzA0MCBhbmQgQ1BVMzIgaGF2ZSAzMngzMi0+NjQgYW5kIDY0LzMyLT4zMnEtMzJyLiAgKi8KKyNp ZiBkZWZpbmVkIChfX21jNjgwMjBfXykgfHwgZGVmaW5lZChtYzY4MDIwKSBcCisgICAgIHx8IGRl ZmluZWQgKF9fbWM2ODAzMF9fKSB8fCBkZWZpbmVkIChtYzY4MDMwKSBcCisgICAgIHx8IGRlZmlu ZWQgKF9fbWM2ODA0MF9fKSB8fCBkZWZpbmVkIChtYzY4MDQwKSBcCisgICAgIHx8IGRlZmluZWQg KF9fbWNwdTMyX18pIHx8IGRlZmluZWQgKG1jcHUzMikgXAorICAgICB8fCBkZWZpbmVkIChfX05l WFRfXykKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBfX2FzbV9fICgibXVs dSUubCAlMywlMTolMCIJCQkJCQlcCisJICAgOiAiPWQiICh3MCksICI9ZCIgKHcxKQkJCQkJXAor CSAgIDogIiUwIiAoKFVTSXR5cGUpKHUpKSwgImRtaSIgKChVU0l0eXBlKSh2KSkpCisjZGVmaW5l IFVNVUxfVElNRSA0NQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorICBf X2FzbV9fICgiZGl2dSUubCAlNCwlMTolMCIJCQkJCQlcCisJICAgOiAiPWQiIChxKSwgIj1kIiAo cikJCQkJCQlcCisJICAgOiAiMCIgKChVU0l0eXBlKShuMCkpLCAiMSIgKChVU0l0eXBlKShuMSkp LCAiZG1pIiAoKFVTSXR5cGUpKGQpKSkKKyNkZWZpbmUgVURJVl9USU1FIDkwCisjZGVmaW5lIHNk aXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisgIF9fYXNtX18gKCJkaXZzJS5sICU0LCUxOiUw IgkJCQkJCVwKKwkgICA6ICI9ZCIgKHEpLCAiPWQiIChyKQkJCQkJCVwKKwkgICA6ICIwIiAoKFVT SXR5cGUpKG4wKSksICIxIiAoKFVTSXR5cGUpKG4xKSksICJkbWkiICgoVVNJdHlwZSkoZCkpKQor I2Vsc2UgLyogZm9yIG90aGVyIDY4ayBmYW1pbHkgbWVtYmVycyB1c2UgMTZ4MTYtPjMyIG11bHRp cGxpY2F0aW9uICovCisjZGVmaW5lIHVtdWxfcHBtbSh4aCwgeGwsIGEsIGIpIFwKKyAgZG8geyBV U0l0eXBlIF9fdW11bF90bXAxLCBfX3VtdWxfdG1wMjsJCQkJXAorCV9fYXNtX18gKCJ8IElubGlu ZWQgdW11bF9wcG1tXG4iCQkJCVwKKyIJbW92ZSUubAklNSwlM1xuIgkJCQkJCVwKKyIJbW92ZSUu bAklMiwlMFxuIgkJCQkJCVwKKyIJbW92ZSUudwklMywlMVxuIgkJCQkJCVwKKyIJc3dhcAklM1xu IgkJCQkJCQlcCisiCXN3YXAJJTBcbiIJCQkJCQkJXAorIgltdWx1JS53CSUyLCUxXG4iCQkJCQkJ XAorIgltdWx1JS53CSUzLCUwXG4iCQkJCQkJXAorIgltdWx1JS53CSUyLCUzXG4iCQkJCQkJXAor Iglzd2FwCSUyXG4iCQkJCQkJCVwKKyIJbXVsdSUudwklNSwlMlxuIgkJCQkJCVwKKyIJYWRkJS5s CSUzLCUyXG4iCQkJCQkJXAorIglqY2MJMWZcbiIJCQkJCQkJXAorIglhZGQlLmwJJSMweDEwMDAw LCUwXG4iCQkJCQkJXAorIjE6CW1vdmUlLmwJJTIsJTNcbiIJCQkJCQlcCisiCWNsciUudwklMlxu IgkJCQkJCQlcCisiCXN3YXAJJTJcbiIJCQkJCQkJXAorIglzd2FwCSUzXG4iCQkJCQkJCVwKKyIJ Y2xyJS53CSUzXG4iCQkJCQkJCVwKKyIJYWRkJS5sCSUzLCUxXG4iCQkJCQkJXAorIglhZGR4JS5s CSUyLCUwXG4iCQkJCQkJXAorIgl8IEVuZCBpbmxpbmVkIHVtdWxfcHBtbSIJCQkJCVwKKwkgICAg ICA6ICI9JmQiICh4aCksICI9JmQiICh4bCksCQkJCQlcCisJCSI9ZCIgKF9fdW11bF90bXAxKSwg Ij0mZCIgKF9fdW11bF90bXAyKQkJCVwKKwkgICAgICA6ICIlMiIgKChVU0l0eXBlKShhKSksICJk IiAoKFVTSXR5cGUpKGIpKSk7CQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIFVNVUxfVElNRSAx MDAKKyNkZWZpbmUgVURJVl9USU1FIDQwMAorI2VuZGlmIC8qIG5vdCBtYzY4MDIwICovCisvKiBU aGUgJzAyMCwgJzAzMCwgJzA0MCBhbmQgJzA2MCBoYXZlIGJpdGZpZWxkIGluc25zLgorICAgR0ND IDMuNCBkZWZpbmVzIF9fbWM2ODAyMF9fIHdoZW4gaW4gQ1BVMzIgbW9kZSwgY2hlY2sgZm9yIF9f bWNwdTMyX18gdG8KKyAgIGV4Y2x1ZGUgYmZmZm8gb24gdGhhdCBjaGlwIChiaXRmaWVsZCBpbnNu cyBub3QgYXZhaWxhYmxlKS4gICovCisjaWYgKGRlZmluZWQgKF9fbWM2ODAyMF9fKSB8fCBkZWZp bmVkIChtYzY4MDIwKSAgICBcCisgICAgIHx8IGRlZmluZWQgKF9fbWM2ODAzMF9fKSB8fCBkZWZp bmVkIChtYzY4MDMwKSBcCisgICAgIHx8IGRlZmluZWQgKF9fbWM2ODA0MF9fKSB8fCBkZWZpbmVk IChtYzY4MDQwKSBcCisgICAgIHx8IGRlZmluZWQgKF9fbWM2ODA2MF9fKSB8fCBkZWZpbmVkICht YzY4MDYwKSBcCisgICAgIHx8IGRlZmluZWQgKF9fTmVYVF9fKSkgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICYmICEgZGVmaW5lZCAoX19tY3B1MzJfXykKKyNkZWZpbmUgY291bnRfbGVhZGlu Z196ZXJvcyhjb3VudCwgeCkgXAorICBfX2FzbV9fICgiYmZmZm8gJTF7JWIyOiViMn0sJTAiCQkJ CQlcCisJICAgOiAiPWQiIChjb3VudCkJCQkJCQlcCisJICAgOiAib2QiICgoVVNJdHlwZSkgKHgp KSwgIm4iICgwKSkKKyNkZWZpbmUgQ09VTlRfTEVBRElOR19aRVJPU18wIDMyCisjZW5kaWYKKyNl bmRpZiAvKiBtYzY4MDAwICovCisKKyNpZiBkZWZpbmVkIChfX204ODAwMF9fKSAmJiBXX1RZUEVf U0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwK KyAgX19hc21fXyAoImFkZHUuY28gJTEsJXI0LCVyNVxuXHRhZGR1LmNpICUwLCVyMiwlcjMiCQkJ XAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgOiAickoiIChhaCksICJy SiIgKGJoKSwgIiVySiIgKGFsKSwgInJKIiAoYmwpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBz bCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInN1YnUuY28gJTEsJXI0LCVyNVxuXHRz dWJ1LmNpICUwLCVyMiwlcjMiCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlc CisJICAgOiAickoiIChhaCksICJySiIgKGJoKSwgInJKIiAoYWwpLCAickoiIChibCkpCisjZGVm aW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAg ICBVU0l0eXBlIF9fY2J0bXA7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgiZmYxICUwLCUxIiA6ICI9 ciIgKF9fY2J0bXApIDogInIiICh4KSk7CQkJXAorICAgIChjb3VudCkgPSBfX2NidG1wIF4gMzE7 CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBDT1VOVF9MRUFESU5HX1pFUk9TXzAgNjMg Lyogc2ljICovCisjaWYgZGVmaW5lZCAoX19tODgxMTBfXykKKyNkZWZpbmUgdW11bF9wcG1tKHdo LCB3bCwgdSwgdikgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIHVuaW9uIHtVREl0eXBlIF9fbGw7 CQkJCQkJXAorCSAgIHN0cnVjdCB7VVNJdHlwZSBfX2gsIF9fbDt9IF9faTsJCQkJXAorCSAgfSBf X3g7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgibXVsdS5kICUwLCUxLCUyIiA6ICI9ciIgKF9feC5f X2xsKSA6ICJyIiAodSksICJyIiAodikpOwlcCisgICAgKHdoKSA9IF9feC5fX2kuX19oOwkJCQkJ CQlcCisgICAgKHdsKSA9IF9feC5fX2kuX19sOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVm aW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisgICh7dW5pb24ge1VESXR5cGUgX19s bDsJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9faCwgX19sO30gX19pOwkJCQlcCisJICB9 IF9feCwgX19xOwkJCQkJCQlcCisgIF9feC5fX2kuX19oID0gKG4xKTsgX194Ll9faS5fX2wgPSAo bjApOwkJCQlcCisgIF9fYXNtX18gKCJkaXZ1LmQgJTAsJTEsJTIiCQkJCQkJXAorCSAgIDogIj1y IiAoX19xLl9fbGwpIDogInIiIChfX3guX19sbCksICJyIiAoZCkpOwkJXAorICAocikgPSAobjAp IC0gX19xLl9fbCAqIChkKTsgKHEpID0gX19xLl9fbDsgfSkKKyNkZWZpbmUgVU1VTF9USU1FIDUK KyNkZWZpbmUgVURJVl9USU1FIDI1CisjZWxzZQorI2RlZmluZSBVTVVMX1RJTUUgMTcKKyNkZWZp bmUgVURJVl9USU1FIDE1MAorI2VuZGlmIC8qIF9fbTg4MTEwX18gKi8KKyNlbmRpZiAvKiBfX204 ODAwMF9fICovCisKKyNpZiBkZWZpbmVkIChfX21pcHMpICYmIFdfVFlQRV9TSVpFID09IDMyCisj aWYgX19HTVBfR05VQ19QUkVSRVEgKDQsNCkKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwg dikgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVESXR5cGUgX19sbCA9IChVREl0eXBlKSh1KSAq ICh2KTsJCQkJCVwKKyAgICB3MSA9IF9fbGwgPj4gMzI7CQkJCQkJCVwKKyAgICB3MCA9IF9fbGw7 CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZiAhZGVmaW5lZCAodW11bF9wcG1t KSAmJiBfX0dNUF9HTlVDX1BSRVJFUSAoMiw3KQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1 LCB2KSBcCisgIF9fYXNtX18gKCJtdWx0dSAlMiwlMyIgOiAiPWwiICh3MCksICI9aCIgKHcxKSA6 ICJkIiAodSksICJkIiAodikpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCAodW11bF9wcG1tKQorI2Rl ZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgIF9fYXNtX18gKCJtdWx0dSAlMiwlM1xu XHRtZmxvICUwXG5cdG1maGkgJTEiCQkJCVwKKwkgICA6ICI9ZCIgKHcwKSwgIj1kIiAodzEpIDog ImQiICh1KSwgImQiICh2KSkKKyNlbmRpZgorI2RlZmluZSBVTVVMX1RJTUUgMTAKKyNkZWZpbmUg VURJVl9USU1FIDEwMAorI2VuZGlmIC8qIF9fbWlwcyAqLworCisjaWYgKGRlZmluZWQgKF9fbWlw cykgJiYgX19taXBzID49IDMpICYmIFdfVFlQRV9TSVpFID09IDY0CisjaWYgX19HTVBfR05VQ19Q UkVSRVEgKDQsNCkKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBkbyB7CQkJ CQkJCQkJXAorICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IF9fbGxfVVRJdHlwZSBfX2F0dHJpYnV0 ZV9fKChtb2RlKFRJKSkpOwlcCisgICAgX19sbF9VVEl0eXBlIF9fbGwgPSAoX19sbF9VVEl0eXBl KSh1KSAqICh2KTsJCQlcCisgICAgdzEgPSBfX2xsID4+IDY0OwkJCQkJCQlcCisgICAgdzAgPSBf X2xsOwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisjaWYgIWRlZmluZWQgKHVtdWxf cHBtbSkgJiYgX19HTVBfR05VQ19QUkVSRVEgKDIsNykKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3 MCwgdSwgdikgXAorICBfX2FzbV9fICgiZG11bHR1ICUyLCUzIiA6ICI9bCIgKHcwKSwgIj1oIiAo dzEpIDogImQiICh1KSwgImQiICh2KSkKKyNlbmRpZgorI2lmICFkZWZpbmVkICh1bXVsX3BwbW0p CisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgX19hc21fXyAoImRtdWx0dSAl MiwlM1xuXHRtZmxvICUwXG5cdG1maGkgJTEiCQkJCVwKKwkgICA6ICI9ZCIgKHcwKSwgIj1kIiAo dzEpIDogImQiICh1KSwgImQiICh2KSkKKyNlbmRpZgorI2RlZmluZSBVTVVMX1RJTUUgMjAKKyNk ZWZpbmUgVURJVl9USU1FIDE0MAorI2VuZGlmIC8qIF9fbWlwcyAqLworCisjaWYgZGVmaW5lZCAo X19tbWl4X18pICYmIFdfVFlQRV9TSVpFID09IDY0CisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAs IHUsIHYpIFwKKyAgX19hc21fXyAoIk1VTFUgJTAsJTIsJTMiIDogIj1yIiAodzApLCAiPXoiICh3 MSkgOiAiciIgKHUpLCAiciIgKHYpKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX25zMzIwMDBf XykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikg XAorICAoe3VuaW9uIHtVREl0eXBlIF9fbGw7CQkJCQkJXAorCSAgIHN0cnVjdCB7VVNJdHlwZSBf X2wsIF9faDt9IF9faTsJCQkJXAorCSAgfSBfX3g7CQkJCQkJCVwKKyAgX19hc21fXyAoIm1laWQg JTIsJTAiCQkJCQkJCVwKKwkgICA6ICI9ZyIgKF9feC5fX2xsKQkJCQkJCVwKKwkgICA6ICIlMCIg KChVU0l0eXBlKSh1KSksICJnIiAoKFVTSXR5cGUpKHYpKSk7CQkJXAorICAodzEpID0gX194Ll9f aS5fX2g7ICh3MCkgPSBfX3guX19pLl9fbDt9KQorI2RlZmluZSBfX3VtdWxzaWRpMyh1LCB2KSBc CisgICh7VURJdHlwZSBfX3c7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgibWVpZCAlMiwlMCIJCQkJ CQlcCisJICAgICA6ICI9ZyIgKF9fdykJCQkJCQlcCisJICAgICA6ICIlMCIgKChVU0l0eXBlKSh1 KSksICJnIiAoKFVTSXR5cGUpKHYpKSk7CQlcCisgICAgX193OyB9KQorI2RlZmluZSB1ZGl2X3Fy bm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorICAoe3VuaW9uIHtVREl0eXBlIF9fbGw7CQkJCQkJXAor CSAgIHN0cnVjdCB7VVNJdHlwZSBfX2wsIF9faDt9IF9faTsJCQkJXAorCSAgfSBfX3g7CQkJCQkJ CVwKKyAgX194Ll9faS5fX2ggPSAobjEpOyBfX3guX19pLl9fbCA9IChuMCk7CQkJCVwKKyAgX19h c21fXyAoImRlaWQgJTIsJTAiCQkJCQkJCVwKKwkgICA6ICI9ZyIgKF9feC5fX2xsKQkJCQkJCVwK KwkgICA6ICIwIiAoX194Ll9fbGwpLCAiZyIgKChVU0l0eXBlKShkKSkpOwkJCVwKKyAgKHIpID0g X194Ll9faS5fX2w7IChxKSA9IF9feC5fX2kuX19oOyB9KQorI2RlZmluZSBjb3VudF90cmFpbGlu Z196ZXJvcyhjb3VudCx4KSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgX19hc21fXyAoImZmc2QJ JTIsJTAiCQkJCQkJXAorCSAgICAgOiAiPXIiIChjb3VudCkJCQkJCQlcCisJICAgICA6ICIwIiAo KFVTSXR5cGUpIDApLCAiciIgKChVU0l0eXBlKSAoeCkpKTsJCQlcCisgIH0gd2hpbGUgKDApCisj ZW5kaWYgLyogX19uczMyMDAwX18gKi8KKworLyogSW4gdGhlIHBhc3Qgd2UgaGFkIGEgYmxvY2sg b2YgdmFyaW91cyAjZGVmaW5lcyB0ZXN0ZWQKKyAgICAgICBfQVJDSF9QUEMgICAgLSBBSVgKKyAg ICAgICBfQVJDSF9QV1IgICAgLSBBSVgKKyAgICAgICBfX3Bvd2VycGNfXyAgLSBnY2MKKyAgICAg ICBfX1BPV0VSUENfXyAgLSBCRU9TCisgICAgICAgX19wcGNfXyAgICAgIC0gRGFyd2luCisgICAg ICAgUFBDICAgICAgICAgIC0gb2xkIGdjYywgR05VL0xpbnV4LCBTeXNWCisgICBUaGUgcGxhaW4g UFBDIHRlc3Qgd2FzIG5vdCBnb29kIGZvciB2eFdvcmtzLCBzaW5jZSBQUEMgaXMgZGVmaW5lZCBv biBhbGwKKyAgIENQVXMgdGhlcmUgKGVnLiBtNjhrIHRvbyksIGFzIGEgY29uc3RhbnQgb25lIGlz IGV4cGVjdGVkIHRvIGNvbXBhcmUKKyAgIENQVV9GQU1JTFkgYWdhaW5zdC4KKworICAgQXQgYW55 IHJhdGUsIHRoaXMgd2FzIHByZXR0eSB1bmF0dHJhY3RpdmUgYW5kIGEgYml0IGZyYWdpbGUuICBU aGUgdXNlIG9mCisgICBIQVZFX0hPU1RfQ1BVX0ZBTUlMWSBpcyBkZXNpZ25lZCB0byBjdXQgdGhy b3VnaCBpdCBhbGwgYW5kIGJlIHN1cmUgb2YKKyAgIGdldHRpbmcgdGhlIGRlc2lyZWQgZWZmZWN0 LgorCisgICBFTkhBTkNFLU1FOiBXZSBzaG91bGQgdGVzdCBfSUJNUjIgaGVyZSB3aGVuIHdlIGFk ZCBhc3NlbWJseSBzdXBwb3J0IGZvcgorICAgdGhlIHN5c3RlbSB2ZW5kb3IgY29tcGlsZXJzLiAg KElzIHRoYXQgdmVuZG9yIGNvbXBpbGVycyB3aXRoIGlubGluZSBhc20sCisgICBvciB3aGF0Pykg ICovCisKKyNpZiAoSEFWRV9IT1NUX0NQVV9GQU1JTFlfcG93ZXIgfHwgSEFWRV9IT1NUX0NQVV9G QU1JTFlfcG93ZXJwYykgICAgICAgIFwKKyAgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUg YWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIGRvIHsJCQkJCQkJCQlcCisg ICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChiaCkgJiYgKGJoKSA9PSAwKQkJCQlcCisgICAg ICBfX2FzbV9fICgie2ElSTR8YWRkJUk0Y30gJTEsJTMsJTRcblx0e2F6ZXxhZGR6ZX0gJTAsJTIi CQlcCisJICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKSA6ICJyIiAoYWgpLCAiJXIiIChhbCks ICJySSIgKGJsKSk7XAorICAgIGVsc2UgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChiaCkgJiYg KGJoKSA9PSB+KFVTSXR5cGUpIDApCQlcCisgICAgICBfX2FzbV9fICgie2ElSTR8YWRkJUk0Y30g JTEsJTMsJTRcblx0e2FtZXxhZGRtZX0gJTAsJTIiCQlcCisJICAgICA6ICI9ciIgKHNoKSwgIj0m ciIgKHNsKSA6ICJyIiAoYWgpLCAiJXIiIChhbCksICJySSIgKGJsKSk7XAorICAgIGVsc2UJCQkJ CQkJCVwKKyAgICAgIF9fYXNtX18gKCJ7YSVJNXxhZGQlSTVjfSAlMSwlNCwlNVxuXHR7YWV8YWRk ZX0gJTAsJTIsJTMiCQlcCisJICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAg ICAgOiAiciIgKGFoKSwgInIiIChiaCksICIlciIgKGFsKSwgInJJIiAoYmwpKTsJCVwKKyAgfSB3 aGlsZSAoMCkKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisg IGRvIHsJCQkJCQkJCQlcCisgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChhaCkgJiYgKGFo KSA9PSAwKQkJCQlcCisgICAgICBfX2FzbV9fICgie3NmJUkzfHN1YmYlSTNjfSAlMSwlNCwlM1xu XHR7c2Z6ZXxzdWJmemV9ICUwLCUyIglcCisJICAgICAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wp IDogInIiIChiaCksICJySSIgKGFsKSwgInIiIChibCkpO1wKKyAgICBlbHNlIGlmIChfX2J1aWx0 aW5fY29uc3RhbnRfcCAoYWgpICYmIChhaCkgPT0gfihVU0l0eXBlKSAwKQkJXAorICAgICAgX19h c21fXyAoIntzZiVJM3xzdWJmJUkzY30gJTEsJTQsJTNcblx0e3NmbWV8c3ViZm1lfSAlMCwlMiIJ XAorCSAgICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKSA6ICJyIiAoYmgpLCAickkiIChhbCks ICJyIiAoYmwpKTtcCisgICAgZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGJoKSAmJiAo YmgpID09IDApCQkJXAorICAgICAgX19hc21fXyAoIntzZiVJM3xzdWJmJUkzY30gJTEsJTQsJTNc blx0e2FtZXxhZGRtZX0gJTAsJTIiCQlcCisJICAgICAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wp IDogInIiIChhaCksICJySSIgKGFsKSwgInIiIChibCkpO1wKKyAgICBlbHNlIGlmIChfX2J1aWx0 aW5fY29uc3RhbnRfcCAoYmgpICYmIChiaCkgPT0gfihVU0l0eXBlKSAwKQkJXAorICAgICAgX19h c21fXyAoIntzZiVJM3xzdWJmJUkzY30gJTEsJTQsJTNcblx0e2F6ZXxhZGR6ZX0gJTAsJTIiCQlc CisJICAgICAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpIDogInIiIChhaCksICJySSIgKGFsKSwg InIiIChibCkpO1wKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICBfX2FzbV9fICgie3NmJUk0fHN1 YmYlSTRjfSAlMSwlNSwlNFxuXHR7c2ZlfHN1YmZlfSAlMCwlMywlMiIJXAorCSAgICAgICA6ICI9 ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgICAgICA6ICJyIiAoYWgpLCAiciIgKGJoKSwg InJJIiAoYWwpLCAiciIgKGJsKSk7CQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIGNvdW50X2xl YWRpbmdfemVyb3MoY291bnQsIHgpIFwKKyAgX19hc21fXyAoIntjbnRsenxjbnRsend9ICUwLCUx IiA6ICI9ciIgKGNvdW50KSA6ICJyIiAoeCkpCisjZGVmaW5lIENPVU5UX0xFQURJTkdfWkVST1Nf MCAzMgorI2lmIEhBVkVfSE9TVF9DUFVfRkFNSUxZX3Bvd2VycGMKKyNpZiBfX0dNUF9HTlVDX1BS RVJFUSAoNCw0KQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgIGRvIHsJCQkJ CQkJCQlcCisgICAgVURJdHlwZSBfX2xsID0gKFVESXR5cGUpKHUpICogKHYpOwkJCQkJXAorICAg IHcxID0gX19sbCA+PiAzMjsJCQkJCQkJXAorICAgIHcwID0gX19sbDsJCQkJCQkJCVwKKyAgfSB3 aGlsZSAoMCkKKyNlbmRpZgorI2lmICFkZWZpbmVkICh1bXVsX3BwbW0pCisjZGVmaW5lIHVtdWxf cHBtbShwaCwgcGwsIG0wLCBtMSkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVTSXR5cGUgX19t MCA9IChtMCksIF9fbTEgPSAobTEpOwkJCQkJXAorICAgIF9fYXNtX18gKCJtdWxod3UgJTAsJTEs JTIiIDogIj1yIiAocGgpIDogIiVyIiAobTApLCAiciIgKG0xKSk7CVwKKyAgICAocGwpID0gX19t MCAqIF9fbTE7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2RlZmluZSBVTVVMX1RJ TUUgMTUKKyNkZWZpbmUgc211bF9wcG1tKHBoLCBwbCwgbTAsIG0xKSBcCisgIGRvIHsJCQkJCQkJ CQlcCisgICAgU0l0eXBlIF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsJCQkJCVwKKyAgICBfX2Fz bV9fICgibXVsaHcgJTAsJTEsJTIiIDogIj1yIiAocGgpIDogIiVyIiAobTApLCAiciIgKG0xKSk7 CVwKKyAgICAocGwpID0gX19tMCAqIF9fbTE7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZp bmUgU01VTF9USU1FIDE0CisjZGVmaW5lIFVESVZfVElNRSAxMjAKKyNlbHNlCisjZGVmaW5lIFVN VUxfVElNRSA4CisjZGVmaW5lIHNtdWxfcHBtbSh4aCwgeGwsIG0wLCBtMSkgXAorICBfX2FzbV9f ICgibXVsICUwLCUyLCUzIiA6ICI9ciIgKHhoKSwgIj1xIiAoeGwpIDogInIiIChtMCksICJyIiAo bTEpKQorI2RlZmluZSBTTVVMX1RJTUUgNAorI2RlZmluZSBzZGl2X3Fybm5kKHEsIHIsIG5oLCBu bCwgZCkgXAorICBfX2FzbV9fICgiZGl2ICUwLCUyLCU0IiA6ICI9ciIgKHEpLCAiPXEiIChyKSA6 ICJyIiAobmgpLCAiMSIgKG5sKSwgInIiIChkKSkKKyNkZWZpbmUgVURJVl9USU1FIDEwMAorI2Vu ZGlmCisjZW5kaWYgLyogMzItYml0IFBPV0VSIGFyY2hpdGVjdHVyZSB2YXJpYW50cy4gICovCisK Ky8qIFdlIHNob3VsZCB0ZXN0IF9JQk1SMiBoZXJlIHdoZW4gd2UgYWRkIGFzc2VtYmx5IHN1cHBv cnQgZm9yIHRoZSBzeXN0ZW0KKyAgIHZlbmRvciBjb21waWxlcnMuICAqLworI2lmIEhBVkVfSE9T VF9DUFVfRkFNSUxZX3Bvd2VycGMgJiYgV19UWVBFX1NJWkUgPT0gNjQKKyNpZiAhZGVmaW5lZCAo X0xPTkdfTE9OR19MSU1CKQorLyogX0xPTkdfTE9OR19MSU1CIGlzIEFCST1tb2RlMzIgd2hlcmUg YWRkZSBvcGVyYXRlcyBvbiAzMi1iaXQgdmFsdWVzLiAgU28KKyAgIHVzZSBhZGRlIGV0YyBvbmx5 IHdoZW4gbm90IF9MT05HX0xPTkdfTElNQi4gICovCisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNs LCBhaCwgYWwsIGJoLCBibCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChfX2J1aWx0aW5f Y29uc3RhbnRfcCAoYmgpICYmIChiaCkgPT0gMCkJCQkJXAorICAgICAgX19hc21fXyAoInthJUk0 fGFkZCVJNGN9ICUxLCUzLCU0XG5cdHthemV8YWRkemV9ICUwLCUyIgkJXAorCSAgICAgOiAiPXIi IChzaCksICI9JnIiIChzbCkgOiAiciIgKGFoKSwgIiVyIiAoYWwpLCAickkiIChibCkpO1wKKyAg ICBlbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYmgpICYmIChiaCkgPT0gfihVREl0eXBl KSAwKQkJXAorICAgICAgX19hc21fXyAoInthJUk0fGFkZCVJNGN9ICUxLCUzLCU0XG5cdHthbWV8 YWRkbWV9ICUwLCUyIgkJXAorCSAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkgOiAiciIgKGFo KSwgIiVyIiAoYWwpLCAickkiIChibCkpO1wKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICBfX2Fz bV9fICgie2ElSTV8YWRkJUk1Y30gJTEsJTQsJTVcblx0e2FlfGFkZGV9ICUwLCUyLCUzIgkJXAor CSAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICAgIDogInIiIChhaCksICJy IiAoYmgpLCAiJXIiIChhbCksICJySSIgKGJsKSk7CQlcCisgIH0gd2hpbGUgKDApCisvKiBXZSB1 c2UgIipySSIgZm9yIHRoZSBjb25zdGFudCBvcGVyYW5kIGhlcmUsIHNpbmNlIHdpdGgganVzdCAi SSIsIGdjYyBiYXJmcy4KKyAgIFRoaXMgbWlnaHQgc2VlbSBzdHJhbmdlLCBidXQgZ2NjIGZvbGRz IGF3YXkgdGhlIGRlYWQgY29kZSBsYXRlLiAgKi8KKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2ws IGFoLCBhbCwgYmgsIGJsKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgaWYgKF9fYnVp bHRpbl9jb25zdGFudF9wIChibCkgJiYgYmwgPiAtMHg4MDAwICYmIGJsIDw9IDB4ODAwMCkgewkg ICAgICBcCisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChhaCkgJiYgKGFoKSA9PSAwKQkJCSAg ICAgIFwKKwkgIF9fYXNtX18gKCJ7YWl8YWRkaWN9ICUxLCUzLCU0XG5cdHtzZnplfHN1YmZ6ZX0g JTAsJTIiCQkgICAgICBcCisJCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpIDogInIiIChiaCks ICJySSIgKGFsKSwgIipySSIgKC1ibCkpOyBcCisJZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50 X3AgKGFoKSAmJiAoYWgpID09IH4oVURJdHlwZSkgMCkJICAgICAgXAorCSAgX19hc21fXyAoInth aXxhZGRpY30gJTEsJTMsJTRcblx0e3NmbWV8c3ViZm1lfSAlMCwlMiIJCSAgICAgIFwKKwkJICAg OiAiPXIiIChzaCksICI9JnIiIChzbCkgOiAiciIgKGJoKSwgInJJIiAoYWwpLCAiKnJJIiAoLWJs KSk7IFwKKwllbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYmgpICYmIChiaCkgPT0gMCkJ CSAgICAgIFwKKwkgIF9fYXNtX18gKCJ7YWl8YWRkaWN9ICUxLCUzLCU0XG5cdHthbWV8YWRkbWV9 ICUwLCUyIgkJICAgICAgXAorCQkgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKSA6ICJyIiAoYWgp LCAickkiIChhbCksICIqckkiICgtYmwpKTsgXAorCWVsc2UgaWYgKF9fYnVpbHRpbl9jb25zdGFu dF9wIChiaCkgJiYgKGJoKSA9PSB+KFVESXR5cGUpIDApCSAgICAgIFwKKwkgIF9fYXNtX18gKCJ7 YWl8YWRkaWN9ICUxLCUzLCU0XG5cdHthemV8YWRkemV9ICUwLCUyIgkJICAgICAgXAorCQkgICA6 ICI9ciIgKHNoKSwgIj0mciIgKHNsKSA6ICJyIiAoYWgpLCAickkiIChhbCksICIqckkiICgtYmwp KTsgXAorCWVsc2UJCQkJCQkJCSAgICAgIFwKKwkgIF9fYXNtX18gKCJ7YWl8YWRkaWN9ICUxLCU0 LCU1XG5cdHtzZmV8c3ViZmV9ICUwLCUzLCUyIgkgICAgICBcCisJCSAgIDogIj1yIiAoc2gpLCAi PSZyIiAoc2wpCQkJCSAgICAgIFwKKwkJICAgOiAiciIgKGFoKSwgInIiIChiaCksICJySSIgKGFs KSwgIipySSIgKC1ibCkpOwkgICAgICBcCisgICAgICB9IGVsc2UgewkJCQkJCQkJICAgICAgXAor CWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWgpICYmIChhaCkgPT0gMCkJCQkgICAgICBcCisJ ICBfX2FzbV9fICgie3NmJUkzfHN1YmYlSTNjfSAlMSwlNCwlM1xuXHR7c2Z6ZXxzdWJmemV9ICUw LCUyIgkgICAgICBcCisJCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpIDogInIiIChiaCksICJy SSIgKGFsKSwgInIiIChibCkpOyAgXAorCWVsc2UgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChh aCkgJiYgKGFoKSA9PSB+KFVESXR5cGUpIDApCSAgICAgIFwKKwkgIF9fYXNtX18gKCJ7c2YlSTN8 c3ViZiVJM2N9ICUxLCU0LCUzXG5cdHtzZm1lfHN1YmZtZX0gJTAsJTIiCSAgICAgIFwKKwkJICAg OiAiPXIiIChzaCksICI9JnIiIChzbCkgOiAiciIgKGJoKSwgInJJIiAoYWwpLCAiciIgKGJsKSk7 ICBcCisJZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGJoKSAmJiAoYmgpID09IDApCQkg ICAgICBcCisJICBfX2FzbV9fICgie3NmJUkzfHN1YmYlSTNjfSAlMSwlNCwlM1xuXHR7YW1lfGFk ZG1lfSAlMCwlMiIJICAgICAgXAorCQkgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKSA6ICJyIiAo YWgpLCAickkiIChhbCksICJyIiAoYmwpKTsgIFwKKwllbHNlIGlmIChfX2J1aWx0aW5fY29uc3Rh bnRfcCAoYmgpICYmIChiaCkgPT0gfihVREl0eXBlKSAwKQkgICAgICBcCisJICBfX2FzbV9fICgi e3NmJUkzfHN1YmYlSTNjfSAlMSwlNCwlM1xuXHR7YXplfGFkZHplfSAlMCwlMiIJICAgICAgXAor CQkgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKSA6ICJyIiAoYWgpLCAickkiIChhbCksICJyIiAo YmwpKTsgIFwKKwllbHNlCQkJCQkJCQkgICAgICBcCisJICBfX2FzbV9fICgie3NmJUk0fHN1YmYl STRjfSAlMSwlNSwlNFxuXHR7c2ZlfHN1YmZlfSAlMCwlMywlMiIJICAgICAgXAorCQkgICA6ICI9 ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkgICAgICBcCisJCSAgIDogInIiIChhaCksICJyIiAoYmgp LCAickkiIChhbCksICJyIiAoYmwpKTsJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBc CisgIH0gd2hpbGUgKDApCisjZW5kaWYgLyogISBfTE9OR19MT05HX0xJTUIgKi8KKyNkZWZpbmUg Y291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgXAorICBfX2FzbV9fICgiY250bHpkICUwLCUx IiA6ICI9ciIgKGNvdW50KSA6ICJyIiAoeCkpCisjZGVmaW5lIENPVU5UX0xFQURJTkdfWkVST1Nf MCA2NAorI2lmIDAgJiYgX19HTVBfR05VQ19QUkVSRVEgKDQsNCkgLyogRGlzYWJsZSwgdGhpcyBy ZXN1bHRzIGluIGxpYmNhbGxzISAqLworI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBc CisgIGRvIHsJCQkJCQkJCQlcCisgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgX19sbF9VVEl0eXBl IF9fYXR0cmlidXRlX18oKG1vZGUoVEkpKSk7CVwKKyAgICBfX2xsX1VUSXR5cGUgX19sbCA9IChf X2xsX1VUSXR5cGUpKHUpICogKHYpOwkJCVwKKyAgICB3MSA9IF9fbGwgPj4gNjQ7CQkJCQkJCVwK KyAgICB3MCA9IF9fbGw7CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZiAhZGVm aW5lZCAodW11bF9wcG1tKQorI2RlZmluZSB1bXVsX3BwbW0ocGgsIHBsLCBtMCwgbTEpIFwKKyAg ZG8gewkJCQkJCQkJCVwKKyAgICBVREl0eXBlIF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsJCQkJ CVwKKyAgICBfX2FzbV9fICgibXVsaGR1ICUwLCUxLCUyIiA6ICI9ciIgKHBoKSA6ICIlciIgKG0w KSwgInIiIChtMSkpOwlcCisgICAgKHBsKSA9IF9fbTAgKiBfX20xOwkJCQkJCQlcCisgIH0gd2hp bGUgKDApCisjZW5kaWYKKyNkZWZpbmUgVU1VTF9USU1FIDE1CisjZGVmaW5lIHNtdWxfcHBtbShw aCwgcGwsIG0wLCBtMSkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIERJdHlwZSBfX20wID0gKG0w KSwgX19tMSA9IChtMSk7CQkJCQlcCisgICAgX19hc21fXyAoIm11bGhkICUwLCUxLCUyIiA6ICI9 ciIgKHBoKSA6ICIlciIgKG0wKSwgInIiIChtMSkpOwlcCisgICAgKHBsKSA9IF9fbTAgKiBfX20x OwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIFNNVUxfVElNRSAxNCAgLyogPz8/ICov CisjZGVmaW5lIFVESVZfVElNRSAxMjAgLyogPz8/ICovCisjZW5kaWYgLyogNjQtYml0IFBvd2Vy UEMuICAqLworCisjaWYgZGVmaW5lZCAoX19weXJfXykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNk ZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJh ZGR3ICU1LCUxXG5cdGFkZHdjICUzLCUwIgkJCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAo c2wpCQkJCQlcCisJICAgOiAiMCIgICgoVVNJdHlwZSkoYWgpKSwgImciICgoVVNJdHlwZSkoYmgp KSwJCQlcCisJICAgICAiJTEiICgoVVNJdHlwZSkoYWwpKSwgImciICgoVVNJdHlwZSkoYmwpKSkK KyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18g KCJzdWJ3ICU1LCUxXG5cdHN1YndiICUzLCUwIgkJCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZy IiAoc2wpCQkJCQlcCisJICAgOiAiMCIgKChVU0l0eXBlKShhaCkpLCAiZyIgKChVU0l0eXBlKShi aCkpLAkJCVwKKwkgICAgICIxIiAoKFVTSXR5cGUpKGFsKSksICJnIiAoKFVTSXR5cGUpKGJsKSkp CisvKiBUaGlzIGluc24gd29ya3Mgb24gUHlyYW1pZHMgd2l0aCBBUCwgWFAsIG9yIE1JIENQVXMs IGJ1dCBub3Qgd2l0aCBTUC4gICovCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwK KyAgKHt1bmlvbiB7VURJdHlwZSBfX2xsOwkJCQkJCVwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19o LCBfX2w7fSBfX2k7CQkJCVwKKwkgIH0gX194OwkJCQkJCQlcCisgIF9fYXNtX18gKCJtb3Z3ICUx LCVSMFxuXHR1ZW11bCAlMiwlMCIJCQkJCVwKKwkgICA6ICI9JnIiIChfX3guX19sbCkJCQkJCQlc CisJICAgOiAiZyIgKChVU0l0eXBlKSAodSkpLCAiZyIgKChVU0l0eXBlKSh2KSkpOwkJCVwKKyAg KHcxKSA9IF9feC5fX2kuX19oOyAodzApID0gX194Ll9faS5fX2w7fSkKKyNlbmRpZiAvKiBfX3B5 cl9fICovCisKKyNpZiBkZWZpbmVkIChfX2libTAzMl9fKSAvKiBSVC9ST01QICovICAmJiBXX1RZ UEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwp IFwKKyAgX19hc21fXyAoImEgJTEsJTVcblx0YWUgJTAsJTMiCQkJCQlcCisJICAgOiAiPXIiIChz aCksICI9JnIiIChzbCkJCQkJCVwKKwkgICA6ICIwIiAgKChVU0l0eXBlKShhaCkpLCAiciIgKChV U0l0eXBlKShiaCkpLAkJCVwKKwkgICAgICIlMSIgKChVU0l0eXBlKShhbCkpLCAiciIgKChVU0l0 eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwK KyAgX19hc21fXyAoInMgJTEsJTVcblx0c2UgJTAsJTMiCQkJCQlcCisJICAgOiAiPXIiIChzaCks ICI9JnIiIChzbCkJCQkJCVwKKwkgICA6ICIwIiAoKFVTSXR5cGUpKGFoKSksICJyIiAoKFVTSXR5 cGUpKGJoKSksCQkJXAorCSAgICAgIjEiICgoVVNJdHlwZSkoYWwpKSwgInIiICgoVVNJdHlwZSko YmwpKSkKKyNkZWZpbmUgc211bF9wcG1tKHBoLCBwbCwgbTAsIG0xKSBcCisgIF9fYXNtX18gKAkJ CQkJCQkJXAorICAgICAgICJzCXIyLHIyXG4iCQkJCQkJXAorIgltdHMgcjEwLCUyXG4iCQkJCQkJ CVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xu IgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQly MiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwK KyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJ CQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwl M1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJ Y2FzCSUwLHIyLHIwXG4iCQkJCQkJXAorIgltZnMJcjEwLCUxIgkJCQkJCQlcCisJICAgOiAiPXIi IChwaCksICI9ciIgKHBsKQkJCQkJXAorCSAgIDogIiVyIiAoKFVTSXR5cGUpKG0wKSksICJyIiAo KFVTSXR5cGUpKG0xKSkJCQlcCisJICAgOiAicjIiKQorI2RlZmluZSBVTVVMX1RJTUUgMjAKKyNk ZWZpbmUgVURJVl9USU1FIDIwMAorI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4 KSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgaWYgKCh4KSA+PSAweDEwMDAwKQkJCQkJCQlcCisg ICAgICBfX2FzbV9fICgiY2x6CSUwLCUxIgkJCQkJCVwKKwkgICAgICAgOiAiPXIiIChjb3VudCkg OiAiciIgKChVU0l0eXBlKSh4KSA+PiAxNikpOwkJXAorICAgIGVsc2UJCQkJCQkJCVwKKyAgICAg IHsJCQkJCQkJCQlcCisJX19hc21fXyAoImNsegklMCwlMSIJCQkJCQlcCisJCSA6ICI9ciIgKGNv dW50KSA6ICJyIiAoKFVTSXR5cGUpKHgpKSk7CQkJXAorCShjb3VudCkgKz0gMTY7CQkJCQkJCVwK KyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYgLyogUlQvUk9NUCAqLwor CisjaWYgKGRlZmluZWQgKF9fU0gyX18pIHx8IGRlZmluZWQgKF9fU0gzX18pIHx8IGRlZmluZWQg KF9fU0g0X18pKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcw LCB1LCB2KSBcCisgIF9fYXNtX18gKCJkbXVsdS5sICUyLCUzXG5cdHN0cyBtYWNsLCUxXG5cdHN0 cyBtYWNoLCUwIgkJXAorCSAgIDogIj1yIiAodzEpLCAiPXIiICh3MCkgOiAiciIgKHUpLCAiciIg KHYpIDogIm1hY2wiLCAibWFjaCIpCisjZGVmaW5lIFVNVUxfVElNRSA1CisjZW5kaWYKKworI2lm IGRlZmluZWQgKF9fc3BhcmNfXykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3Nz YWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJhZGRjYyAlcjQsJTUs JTFcblx0YWRkeCAlcjIsJTMsJTAiCQkJCVwKKwkgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJ CQkJXAorCSAgIDogInJKIiAoYWgpLCAickkiIChiaCksIiVySiIgKGFsKSwgInJJIiAoYmwpCQkJ XAorCSAgIF9fQ0xPQkJFUl9DQykKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwg YmgsIGJsKSBcCisgIF9fYXNtX18gKCJzdWJjYyAlcjQsJTUsJTFcblx0c3VieCAlcjIsJTMsJTAi CQkJCVwKKwkgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgIDogInJKIiAoYWgp LCAickkiIChiaCksICJySiIgKGFsKSwgInJJIiAoYmwpCVwKKwkgICBfX0NMT0JCRVJfQ0MpCisv KiBGSVhNRTogV2hlbiBnY2MgLW1jcHU9djkgaXMgdXNlZCBvbiBzb2xhcmlzLCBnY2MvY29uZmln L3NvbDItc2xkLTY0LmgKKyAgIGRvZXNuJ3QgZGVmaW5lIGFueXRoaW5nIHRvIGluZGljYXRlIHRo YXQgdG8gdXMsIGl0IG9ubHkgc2V0cyBfX3NwYXJjdjguICovCisjaWYgZGVmaW5lZCAoX19zcGFy Y192OV9fKSB8fCBkZWZpbmVkIChfX3NwYXJjdjkpCisvKiBQZXJoYXBzIHdlIHNob3VsZCB1c2Ug ZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBoZXJlPyAgKi8KKyNpZiAwCisvKiBUcmlnZ2VycyBh IGJ1ZyBtYWtpbmcgbXB6L3Rlc3RzL3QtZ2NkLmMgZmFpbC4KKyAgIFBlcmhhcHMgd2Ugc2ltcGx5 IG5lZWQgZXhwbGljaXRseSB6ZXJvLWV4dGVuZCB0aGUgaW5wdXRzPyAgKi8KKyNkZWZpbmUgdW11 bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBfX2FzbV9fICgibXVseCAlMiwlMywlJWcxOyBzcmwg JSVnMSwwLCUxOyBzcmx4ICUlZzEsMzIsJTAiIDoJCVwKKwkgICAiPXIiICh3MSksICI9ciIgKHcw KSA6ICJyIiAodSksICJyIiAodikgOiAiZzEiKQorI2Vsc2UKKy8qIFVzZSB2OCB1bXVsIHVudGls IGFib3ZlIGJ1ZyBpcyBmaXhlZC4gICovCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYp IFwKKyAgX19hc21fXyAoInVtdWwgJTIsJTMsJTE7cmQgJSV5LCUwIiA6ICI9ciIgKHcxKSwgIj1y IiAodzApIDogInIiICh1KSwgInIiICh2KSkKKyNlbmRpZgorLyogVXNlIGEgcGxhaW4gdjggZGl2 aWRlIGZvciB2OS4gICovCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisg IGRvIHsJCQkJCQkJCQlcCisgICAgVVNJdHlwZSBfX3E7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgi bW92ICUxLCUleTtub3A7bm9wO25vcDt1ZGl2ICUyLCUzLCUwIgkJCVwKKwkgICAgIDogIj1yIiAo X19xKSA6ICJyIiAobjEpLCAiciIgKG4wKSwgInIiIChkKSk7CQlcCisgICAgKHIpID0gKG4wKSAt IF9fcSAqIChkKTsJCQkJCQlcCisgICAgKHEpID0gX19xOwkJCQkJCQkJXAorICB9IHdoaWxlICgw KQorI2Vsc2UKKyNpZiBkZWZpbmVkIChfX3NwYXJjX3Y4X18pICAgLyogZ2NjIG5vcm1hbCAqLwkJ CQlcCisgIHx8IGRlZmluZWQgKF9fc3BhcmN2OCkgICAgIC8qIGdjYyBzb2xhcmlzICovCQkJCVwK KyAgfHwgSEFWRV9IT1NUX0NQVV9zdXBlcnNwYXJjCisvKiBEb24ndCBtYXRjaCBpbW1lZGlhdGUg cmFuZ2UgYmVjYXVzZSwgMSkgaXQgaXMgbm90IG9mdGVuIHVzZWZ1bCwKKyAgIDIpIHRoZSAnSScg ZmxhZyB0aGlua3Mgb2YgdGhlIHJhbmdlIGFzIGEgMTMgYml0IHNpZ25lZCBpbnRlcnZhbCwKKyAg IHdoaWxlIHdlIHdhbnQgdG8gbWF0Y2ggYSAxMyBiaXQgaW50ZXJ2YWwsIHNpZ24gZXh0ZW5kZWQg dG8gMzIgYml0cywKKyAgIGJ1dCBJTlRFUlBSRVRFRCBBUyBVTlNJR05FRC4gICovCisjZGVmaW5l IHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgX19hc21fXyAoInVtdWwgJTIsJTMsJTE7cmQg JSV5LCUwIiA6ICI9ciIgKHcxKSwgIj1yIiAodzApIDogInIiICh1KSwgInIiICh2KSkKKyNkZWZp bmUgVU1VTF9USU1FIDUKKworI2lmIEhBVkVfSE9TVF9DUFVfc3VwZXJzcGFyYworI2RlZmluZSBV RElWX1RJTUUgNjAJCS8qIFN1cGVyU1BBUkMgdGltaW5nICovCisjZWxzZQorLyogRG9uJ3QgdXNl IHRoaXMgb24gU3VwZXJTUEFSQyBiZWNhdXNlIGl0cyB1ZGl2IG9ubHkgaGFuZGxlcyA1MyBiaXQK KyAgIGRpdmlkZW5kcyBhbmQgd2lsbCB0cmFwIHRvIHRoZSBrZXJuZWwgZm9yIHRoZSByZXN0LiAq LworI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorICBkbyB7CQkJCQkJCQkJ XAorICAgIFVTSXR5cGUgX19xOwkJCQkJCQlcCisgICAgX19hc21fXyAoIm1vdiAlMSwlJXk7bm9w O25vcDtub3A7dWRpdiAlMiwlMywlMCIJCQlcCisJICAgICA6ICI9ciIgKF9fcSkgOiAiciIgKG4x KSwgInIiIChuMCksICJyIiAoZCkpOwkJXAorICAgIChyKSA9IChuMCkgLSBfX3EgKiAoZCk7CQkJ CQkJXAorICAgIChxKSA9IF9fcTsJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgVURJ Vl9USU1FIDI1CisjZW5kaWYgLyogSEFWRV9IT1NUX0NQVV9zdXBlcnNwYXJjICovCisKKyNlbHNl IC8qICEgX19zcGFyY192OF9fICovCisjaWYgZGVmaW5lZCAoX19zcGFyY2xpdGVfXykKKy8qIFRo aXMgaGFzIGhhcmR3YXJlIG11bHRpcGx5IGJ1dCBub3QgZGl2aWRlLiAgSXQgYWxzbyBoYXMgdHdv IGFkZGl0aW9uYWwKKyAgIGluc3RydWN0aW9ucyBzY2FuIChmZnMgZnJvbSBoaWdoIGJpdCkgYW5k IGRpdnNjYy4gICovCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgX19hc21f XyAoInVtdWwgJTIsJTMsJTE7cmQgJSV5LCUwIiA6ICI9ciIgKHcxKSwgIj1yIiAodzApIDogInIi ICh1KSwgInIiICh2KSkKKyNkZWZpbmUgVU1VTF9USU1FIDUKKyNkZWZpbmUgdWRpdl9xcm5uZChx LCByLCBuMSwgbjAsIGQpIFwKKyAgX19hc21fXyAoIiEgSW5saW5lZCB1ZGl2X3Fybm5kXG4iCQkJ CQlcCisiCXdyCSUlZzAsJTIsJSV5CSEgTm90IGEgZGVsYXllZCB3cml0ZSBmb3Igc3BhcmNsaXRl XG4iCVwKKyIJdHN0CSUlZzBcbiIJCQkJCQkJXAorIglkaXZzY2MJJTMsJTQsJSVnMVxuIgkJCQkJ CVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVn MVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUl ZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJ ZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJ CQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQs JSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2Nj CSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwK KyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxu IgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEs JTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2 c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJ CVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVn MVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUl ZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJ ZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJ CQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQs JSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2Nj CSUlZzEsJTQsJSVnMVxuIgkJCQkJCVwKKyIJZGl2c2NjCSUlZzEsJTQsJTBcbiIJCQkJCQlcCisi CXJkCSUleSwlMVxuIgkJCQkJCVwKKyIJYmwsYSAxZlxuIgkJCQkJCQlcCisiCWFkZAklMSwlNCwl MVxuIgkJCQkJCVwKKyIxOgkhIEVuZCBvZiBpbmxpbmUgdWRpdl9xcm5uZCIJCQkJCVwKKwkgICA6 ICI9ciIgKHEpLCAiPXIiIChyKSA6ICJyIiAobjEpLCAiciIgKG4wKSwgInJJIiAoZCkJCVwKKwkg ICA6ICIlZzEiIF9fQU5EX0NMT0JCRVJfQ0MpCisjZGVmaW5lIFVESVZfVElNRSAzNworI2RlZmlu ZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBcCisgIF9fYXNtX18gKCJzY2FuICUxLDEs JTAiIDogIj1yIiAoY291bnQpIDogInIiICh4KSkKKy8qIEVhcmx5IHNwYXJjbGl0ZXMgcmV0dXJu IDYzIGZvciBhbiBhcmd1bWVudCBvZiAwLCBidXQgdGhleSB3YXJuIHRoYXQgZnV0dXJlCisgICBp bXBsZW1lbnRhdGlvbnMgbWlnaHQgY2hhbmdlIHRoaXMuICBUaGVyZWZvcmUsIGxlYXZlIENPVU5U X0xFQURJTkdfWkVST1NfMAorICAgdW5kZWZpbmVkLiAgKi8KKyNlbmRpZiAvKiBfX3NwYXJjbGl0 ZV9fICovCisjZW5kaWYgLyogX19zcGFyY192OF9fICovCisjZW5kaWYgLyogX19zcGFyY192OV9f ICovCisvKiBEZWZhdWx0IHRvIHNwYXJjIHY3IHZlcnNpb25zIG9mIHVtdWxfcHBtbSBhbmQgdWRp dl9xcm5uZC4gICovCisjaWZuZGVmIHVtdWxfcHBtbQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcw LCB1LCB2KSBcCisgIF9fYXNtX18gKCIhIElubGluZWQgdW11bF9wcG1tXG4iCQkJCQlcCisiCXdy CSUlZzAsJTIsJSV5CSEgU1BBUkMgaGFzIDAtMyBkZWxheSBpbnNuIGFmdGVyIGEgd3JcbiIgXAor IglzcmEJJTMsMzEsJSVnMgkhIERvbid0IG1vdmUgdGhpcyBpbnNuXG4iCQlcCisiCWFuZAklMiwl JWcyLCUlZzIJISBEb24ndCBtb3ZlIHRoaXMgaW5zblxuIgkJXAorIglhbmRjYwklJWcwLDAsJSVn MQkhIERvbid0IG1vdmUgdGhpcyBpbnNuXG4iCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJ CQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUz LCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNj YwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlc CisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFc biIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcx LCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11 bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJ CQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUl ZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwkl JWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisi CW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJ CQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUz LCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNj YwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlc CisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFc biIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcx LCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11 bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJCQlcCisiCW11bHNjYwklJWcxLCUzLCUlZzFcbiIJCQkJ CQlcCisiCW11bHNjYwklJWcxLDAsJSVnMVxuIgkJCQkJCVwKKyIJYWRkCSUlZzEsJSVnMiwlMFxu IgkJCQkJCVwKKyIJcmQJJSV5LCUxIgkJCQkJCQlcCisJICAgOiAiPXIiICh3MSksICI9ciIgKHcw KSA6ICIlckkiICh1KSwgInIiICh2KQkJCVwKKwkgICA6ICIlZzEiLCAiJWcyIiBfX0FORF9DTE9C QkVSX0NDKQorI2RlZmluZSBVTVVMX1RJTUUgMzkJCS8qIDM5IGluc3RydWN0aW9ucyAqLworI2Vu ZGlmCisjaWZuZGVmIHVkaXZfcXJubmQKKyNpZm5kZWYgTE9OR0xPTkdfU1RBTkRBTE9ORQorI2Rl ZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorICBkbyB7IFVXdHlwZSBfX3I7CQkJ CQkJCVwKKyAgICAocSkgPSBfX01QTih1ZGl2X3Fybm5kKSAoJl9fciwgKG4xKSwgKG4wKSwgKGQp KTsJCQlcCisgICAgKHIpID0gX19yOwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorZXh0ZXJuIFVX dHlwZSBfX01QTih1ZGl2X3Fybm5kKSAoVVd0eXBlICosIFVXdHlwZSwgVVd0eXBlLCBVV3R5cGUp OworI2lmbmRlZiBVRElWX1RJTUUKKyNkZWZpbmUgVURJVl9USU1FIDE0MAorI2VuZGlmCisjZW5k aWYgLyogTE9OR0xPTkdfU1RBTkRBTE9ORSAqLworI2VuZGlmIC8qIHVkaXZfcXJubmQgKi8KKyNl bmRpZiAvKiBfX3NwYXJjX18gKi8KKworI2lmIGRlZmluZWQgKF9fc3BhcmNfXykgJiYgV19UWVBF X1NJWkUgPT0gNjQKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBc CisgIF9fYXNtX18gKAkJCQkJCQkJXAorICAgICAgICJhZGRjYwklcjQsJTUsJTFcbiIJCQkJCQlc CisgICAgICAiCWFkZGNjYwklcjYsJTcsJSVnMFxuIgkJCQkJCVwKKyAgICAgICIJYWRkYwklcjIs JTMsJTAiCQkJCQkJXAorCSAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgIDogInJK IiAoYWgpLCAickkiIChiaCksICIlckoiIChhbCksICJySSIgKGJsKSwJCVwKKwkgICAgIiVySiIg KChhbCkgPj4gMzIpLCAickkiICgoYmwpID4+IDMyKQkJCVwKKwkgICBfX0NMT0JCRVJfQ0MpCisj ZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBfX2FzbV9fICgJ CQkJCQkJCVwKKyAgICAgICAic3ViY2MJJXI0LCU1LCUxXG4iCQkJCQkJXAorICAgICAgIglzdWJj Y2MJJXI2LCU3LCUlZzBcbiIJCQkJCQlcCisgICAgICAiCXN1YmMJJXIyLCUzLCUwIgkJCQkJCVwK KwkgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICA6ICJySiIgKGFoKSwgInJJIiAo YmgpLCAickoiIChhbCksICJySSIgKGJsKSwJCVwKKwkgICAgInJKIiAoKGFsKSA+PiAzMiksICJy SSIgKChibCkgPj4gMzIpCQkJXAorCSAgIF9fQ0xPQkJFUl9DQykKKyNlbmRpZgorCisjaWYgZGVm aW5lZCAoX192YXhfXykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShz aCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJhZGRsMiAlNSwlMVxuXHRhZHdj ICUzLCUwIgkJCQkJXAorCSAgIDogIj1nIiAoc2gpLCAiPSZnIiAoc2wpCQkJCQlcCisJICAgOiAi MCIgICgoVVNJdHlwZSkoYWgpKSwgImciICgoVVNJdHlwZSkoYmgpKSwJCQlcCisJICAgICAiJTEi ICgoVVNJdHlwZSkoYWwpKSwgImciICgoVVNJdHlwZSkoYmwpKSkKKyNkZWZpbmUgc3ViX2RkbW1z cyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJzdWJsMiAlNSwlMVxuXHRz YndjICUzLCUwIgkJCQkJXAorCSAgIDogIj1nIiAoc2gpLCAiPSZnIiAoc2wpCQkJCQlcCisJICAg OiAiMCIgKChVU0l0eXBlKShhaCkpLCAiZyIgKChVU0l0eXBlKShiaCkpLAkJCVwKKwkgICAgICIx IiAoKFVTSXR5cGUpKGFsKSksICJnIiAoKFVTSXR5cGUpKGJsKSkpCisjZGVmaW5lIHNtdWxfcHBt bSh4aCwgeGwsIG0wLCBtMSkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIHVuaW9uIHtVREl0eXBl IF9fbGw7CQkJCQkJXAorCSAgIHN0cnVjdCB7VVNJdHlwZSBfX2wsIF9faDt9IF9faTsJCQkJXAor CSAgfSBfX3g7CQkJCQkJCVwKKyAgICBVU0l0eXBlIF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsJ CQkJCVwKKyAgICBfX2FzbV9fICgiZW11bCAlMSwlMiwkMCwlMCIJCQkJCQlcCisJICAgICA6ICI9 ZyIgKF9feC5fX2xsKSA6ICJnIiAoX19tMCksICJnIiAoX19tMSkpOwkJXAorICAgICh4aCkgPSBf X3guX19pLl9faDsgKHhsKSA9IF9feC5fX2kuX19sOwkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVm aW5lIHNkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAg dW5pb24ge0RJdHlwZSBfX2xsOwkJCQkJCQlcCisJICAgc3RydWN0IHtTSXR5cGUgX19sLCBfX2g7 fSBfX2k7CQkJCVwKKwkgIH0gX194OwkJCQkJCQlcCisgICAgX194Ll9faS5fX2ggPSBuMTsgX194 Ll9faS5fX2wgPSBuMDsJCQkJCVwKKyAgICBfX2FzbV9fICgiZWRpdiAlMywlMiwlMCwlMSIJCQkJ CQlcCisJICAgICA6ICI9ZyIgKHEpLCAiPWciIChyKSA6ICJnIiAoX194Ll9fbGwpLCAiZyIgKGQp KTsJCVwKKyAgfSB3aGlsZSAoMCkKKyNpZiAwCisvKiBGSVhNRTogVGhpcyBpbnN0cnVjdGlvbiBh cHBlYXJzIHRvIGJlIHVuaW1wbGVtZW50ZWQgb24gc29tZSBzeXN0ZW1zICh2YXgKKyAgIDg4MDAg bWF5YmUpLiAqLworI2RlZmluZSBjb3VudF90cmFpbGluZ196ZXJvcyhjb3VudCx4KQkJCQkJXAor ICBkbyB7CQkJCQkJCQkJXAorICAgIF9fYXNtX18gKCJmZnMgMCwgMzEsICUxLCAlMCIJCQkJCVwK KwkgICAgIDogIj1nIiAoY291bnQpCQkJCQkJXAorCSAgICAgOiAiZyIgKChVU0l0eXBlKSAoeCkp KTsJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2VuZGlmIC8qIF9fdmF4X18gKi8KKwor I2lmIGRlZmluZWQgKF9fejgwMDBfXykgJiYgV19UWVBFX1NJWkUgPT0gMTYKKyNkZWZpbmUgYWRk X3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJhZGQJJUgxLCVI NVxuXHRhZGMJJUgwLCVIMyIJCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlc CisJICAgOiAiMCIgICgodW5zaWduZWQgaW50KShhaCkpLCAiciIgKCh1bnNpZ25lZCBpbnQpKGJo KSksCVwKKwkgICAgICIlMSIgKCh1bnNpZ25lZCBpbnQpKGFsKSksICJyUVIiICgodW5zaWduZWQg aW50KShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwK KyAgX19hc21fXyAoInN1YgklSDEsJUg1XG5cdHNiYwklSDAsJUgzIgkJCQlcCisJICAgOiAiPXIi IChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICA6ICIwIiAoKHVuc2lnbmVkIGludCkoYWgpKSwg InIiICgodW5zaWduZWQgaW50KShiaCkpLAlcCisJICAgICAiMSIgKCh1bnNpZ25lZCBpbnQpKGFs KSksICJyUVIiICgodW5zaWduZWQgaW50KShibCkpKQorI2RlZmluZSB1bXVsX3BwbW0oeGgsIHhs LCBtMCwgbTEpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB1bmlvbiB7bG9uZyBpbnQgX19sbDsJ CQkJCQlcCisJICAgc3RydWN0IHt1bnNpZ25lZCBpbnQgX19oLCBfX2w7fSBfX2k7CQkJCVwKKwkg IH0gX194OwkJCQkJCQlcCisgICAgdW5zaWduZWQgaW50IF9fbTAgPSAobTApLCBfX20xID0gKG0x KTsJCQkJXAorICAgIF9fYXNtX18gKCJtdWx0CSVTMCwlSDMiCQkJCQlcCisJICAgICA6ICI9ciIg KF9feC5fX2kuX19oKSwgIj1yIiAoX194Ll9faS5fX2wpCQkJXAorCSAgICAgOiAiJTEiIChtMCks ICJyUVIiIChtMSkpOwkJCQkJXAorICAgICh4aCkgPSBfX3guX19pLl9faDsgKHhsKSA9IF9feC5f X2kuX19sOwkJCQlcCisgICAgKHhoKSArPSAoKCgoc2lnbmVkIGludCkgX19tMCA+PiAxNSkgJiBf X20xKQkJCQlcCisJICAgICArICgoKHNpZ25lZCBpbnQpIF9fbTEgPj4gMTUpICYgX19tMCkpOwkJ CVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBfX3o4MDAwX18gKi8KKworI2VuZGlmIC8qIF9f R05VQ19fICovCisKKyNlbmRpZiAvKiBOT19BU00gKi8KKworCisvKiBGSVhNRTogInNpZGkiIGhl cmUgaXMgaGlnaGx5IGRvdWJ0ZnVsLCBzaG91bGQgc29tZXRpbWVzIGJlICJkaXRpIi4gICovCisj aWYgIWRlZmluZWQgKHVtdWxfcHBtbSkgJiYgZGVmaW5lZCAoX191bXVsc2lkaTMpCisjZGVmaW5l IHVtdWxfcHBtbShwaCwgcGwsIG0wLCBtMSkgXAorICB7CQkJCQkJCQkJXAorICAgIFVEV3R5cGUg X19sbCA9IF9fdW11bHNpZGkzIChtMCwgbTEpOwkJCQlcCisgICAgcGggPSAoVVd0eXBlKSAoX19s bCA+PiBXX1RZUEVfU0laRSk7CQkJCVwKKyAgICBwbCA9IChVV3R5cGUpIF9fbGw7CQkJCQkJCVwK KyAgfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX191bXVsc2lkaTMpCisjZGVmaW5lIF9fdW11 bHNpZGkzKHUsIHYpIFwKKyAgKHtVV3R5cGUgX19oaSwgX19sbzsJCQkJCQkJXAorICAgIHVtdWxf cHBtbSAoX19oaSwgX19sbywgdSwgdik7CQkJCQlcCisgICAgKChVRFd0eXBlKSBfX2hpIDw8IFdf VFlQRV9TSVpFKSB8IF9fbG87IH0pCisjZW5kaWYKKworCisvKiBVc2UgbXBuX3VtdWxfcHBtbSBv ciBtcG5fdWRpdl9xcm5uZCBmdW5jdGlvbnMsIGlmIHRoZXkgZXhpc3QuICBUaGUgIl9yIgorICAg Zm9ybXMgaGF2ZSAicmV2ZXJzZWQiIGFyZ3VtZW50cywgbWVhbmluZyB0aGUgcG9pbnRlciBpcyBs YXN0LCB3aGljaAorICAgc29tZXRpbWVzIGFsbG93cyBiZXR0ZXIgcGFyYW1ldGVyIHBhc3Npbmcs IGluIHBhcnRpY3VsYXIgb24gNjQtYml0CisgICBocHBhLiAqLworCisjZGVmaW5lIG1wbl91bXVs X3BwbW0gIF9fTVBOKHVtdWxfcHBtbSkKK2V4dGVybiBVV3R5cGUgbXBuX3VtdWxfcHBtbSAoVVd0 eXBlICosIFVXdHlwZSwgVVd0eXBlKTsKKworI2lmICEgZGVmaW5lZCAodW11bF9wcG1tKSAmJiBI QVZFX05BVElWRV9tcG5fdW11bF9wcG1tICBcCisgICYmICEgZGVmaW5lZCAoTE9OR0xPTkdfU1RB TkRBTE9ORSkKKyNkZWZpbmUgdW11bF9wcG1tKHdoLCB3bCwgdSwgdikJCQkJCQkgICAgICBcCisg IGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgVVd0eXBlIF9fdW11bF9wcG1tX19wMDsJCQkJCQkg ICAgICBcCisgICAgKHdoKSA9IG1wbl91bXVsX3BwbW0gKCZfX3VtdWxfcHBtbV9fcDAsIChVV3R5 cGUpICh1KSwgKFVXdHlwZSkgKHYpKTsgICAgICBcCisgICAgKHdsKSA9IF9fdW11bF9wcG1tX19w MDsJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBtcG5fdW11 bF9wcG1tX3IgIF9fTVBOKHVtdWxfcHBtbV9yKQorZXh0ZXJuIFVXdHlwZSBtcG5fdW11bF9wcG1t X3IgKFVXdHlwZSwgVVd0eXBlLCBVV3R5cGUgKik7CisKKyNpZiAhIGRlZmluZWQgKHVtdWxfcHBt bSkgJiYgSEFWRV9OQVRJVkVfbXBuX3VtdWxfcHBtbV9yCVwKKyAgJiYgISBkZWZpbmVkIChMT05H TE9OR19TVEFOREFMT05FKQorI2RlZmluZSB1bXVsX3BwbW0od2gsIHdsLCB1LCB2KQkJCQkJCSAg ICAgIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBVV3R5cGUgX191bXVsX3BwbW1fX3Aw OwkJCQkJCSAgICAgIFwKKyAgICAod2gpID0gbXBuX3VtdWxfcHBtbV9yICgoVVd0eXBlKSAodSks IChVV3R5cGUpICh2KSwgJl9fdW11bF9wcG1tX19wMCk7ICAgIFwKKyAgICAod2wpID0gX191bXVs X3BwbW1fX3AwOwkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5l IG1wbl91ZGl2X3Fybm5kICBfX01QTih1ZGl2X3Fybm5kKQorZXh0ZXJuIFVXdHlwZSBtcG5fdWRp dl9xcm5uZCAoVVd0eXBlICosIFVXdHlwZSwgVVd0eXBlLCBVV3R5cGUpOworCisjaWYgISBkZWZp bmVkICh1ZGl2X3Fybm5kKSAmJiBIQVZFX05BVElWRV9tcG5fdWRpdl9xcm5uZAlcCisgICYmICEg ZGVmaW5lZCAoTE9OR0xPTkdfU1RBTkRBTE9ORSkKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBu MSwgbjAsIGQpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVd0eXBlIF9fdWRpdl9xcm5u ZF9fcjsJCQkJCQlcCisgICAgKHEpID0gbXBuX3VkaXZfcXJubmQgKCZfX3VkaXZfcXJubmRfX3Is CQkJCVwKKwkJCSAgKFVXdHlwZSkgKG4xKSwgKFVXdHlwZSkgKG4wKSwgKFVXdHlwZSkgZCk7CVwK KyAgICAocikgPSBfX3VkaXZfcXJubmRfX3I7CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlm CisKKyNkZWZpbmUgbXBuX3VkaXZfcXJubmRfciAgX19NUE4odWRpdl9xcm5uZF9yKQorZXh0ZXJu IFVXdHlwZSBtcG5fdWRpdl9xcm5uZF9yIChVV3R5cGUsIFVXdHlwZSwgVVd0eXBlLCBVV3R5cGUg Kik7CisKKyNpZiAhIGRlZmluZWQgKHVkaXZfcXJubmQpICYmIEhBVkVfTkFUSVZFX21wbl91ZGl2 X3Fybm5kX3IJXAorICAmJiAhIGRlZmluZWQgKExPTkdMT05HX1NUQU5EQUxPTkUpCisjZGVmaW5l IHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAg IFVXdHlwZSBfX3VkaXZfcXJubmRfX3I7CQkJCQkJXAorICAgIChxKSA9IG1wbl91ZGl2X3Fybm5k X3IgKChVV3R5cGUpIChuMSksIChVV3R5cGUpIChuMCksIChVV3R5cGUpIGQsCVwKKwkJCSAgICAm X191ZGl2X3Fybm5kX19yKTsJCQkJXAorICAgIChyKSA9IF9fdWRpdl9xcm5uZF9fcjsJCQkJCQlc CisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworCisvKiBJZiB0aGlzIG1hY2hpbmUgaGFzIG5vIGlu bGluZSBhc3NlbWJsZXIsIHVzZSBDIG1hY3Jvcy4gICovCisKKyNpZiAhZGVmaW5lZCAoYWRkX3Nz YWFhYSkKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIGRv IHsJCQkJCQkJCQlcCisgICAgVVd0eXBlIF9feDsJCQkJCQkJCVwKKyAgICBfX3ggPSAoYWwpICsg KGJsKTsJCQkJCQkJXAorICAgIChzaCkgPSAoYWgpICsgKGJoKSArIChfX3ggPCAoYWwpKTsJCQkJ CVwKKyAgICAoc2wpID0gX194OwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNp ZiAhZGVmaW5lZCAoc3ViX2RkbW1zcykKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBh bCwgYmgsIGJsKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVd0eXBlIF9feDsJCQkJCQkJCVwK KyAgICBfX3ggPSAoYWwpIC0gKGJsKTsJCQkJCQkJXAorICAgIChzaCkgPSAoYWgpIC0gKGJoKSAt ICgoYWwpIDwgKGJsKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChz bCkgPSBfX3g7CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogSWYgd2UgbGFj ayB1bXVsX3BwbW0gYnV0IGhhdmUgc211bF9wcG1tLCBkZWZpbmUgdW11bF9wcG1tIGluIHRlcm1z IG9mCisgICBzbXVsX3BwbW0uICAqLworI2lmICFkZWZpbmVkICh1bXVsX3BwbW0pICYmIGRlZmlu ZWQgKHNtdWxfcHBtbSkKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikJCQkJCQlcCisg IGRvIHsJCQkJCQkJCQlcCisgICAgVVd0eXBlIF9fdzE7CQkJCQkJCVwKKyAgICBVV3R5cGUgX194 bTAgPSAodSksIF9feG0xID0gKHYpOwkJCQkJXAorICAgIHNtdWxfcHBtbSAoX193MSwgdzAsIF9f eG0wLCBfX3htMSk7CQkJCQlcCisgICAgKHcxKSA9IF9fdzEgKyAoLShfX3htMCA+PiAoV19UWVBF X1NJWkUgLSAxKSkgJiBfX3htMSkJCVwKKwkJKyAoLShfX3htMSA+PiAoV19UWVBFX1NJWkUgLSAx KSkgJiBfX3htMCk7CQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogSWYgd2Ugc3RpbGwg ZG9uJ3QgaGF2ZSB1bXVsX3BwbW0sIGRlZmluZSBpdCB1c2luZyBwbGFpbiBDLgorCisgICBGb3Ig cmVmZXJlbmNlLCB3aGVuIHRoaXMgY29kZSBpcyB1c2VkIGZvciBzcXVhcmluZyAoaWUuIHUgYW5k IHYgaWRlbnRpY2FsCisgICBleHByZXNzaW9ucyksIGdjYyByZWNvZ25pc2VzIF9feDEgYW5kIF9f eDIgYXJlIHRoZSBzYW1lIGFuZCBnZW5lcmF0ZXMgMworICAgbXVsdGlwbGllcywgbm90IDQuICBU aGUgc3Vic2VxdWVudCBhZGRpdGlvbnMgY291bGQgYmUgb3B0aW1pemVkIGEgYml0LAorICAgYnV0 IHRoZSBvbmx5IHBsYWNlIEdNUCBjdXJyZW50bHkgdXNlcyBzdWNoIGEgc3F1YXJlIGlzIG1wbl9z cXJfYmFzZWNhc2UsCisgICBhbmQgY2hpcHMgb2JsaWdlZCB0byB1c2UgdGhpcyBnZW5lcmljIEMg dW11bCB3aWxsIGhhdmUgcGxlbnR5IG9mIHdvcnNlCisgICBwZXJmb3JtYW5jZSBwcm9ibGVtcyB0 aGFuIGEgY291cGxlIG9mIGV4dHJhIGluc3RydWN0aW9ucyBvbiB0aGUgZGlhZ29uYWwKKyAgIG9m IHNxcl9iYXNlY2FzZS4gICovCisKKyNpZiAhZGVmaW5lZCAodW11bF9wcG1tKQorI2RlZmluZSB1 bXVsX3BwbW0odzEsIHcwLCB1LCB2KQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVV3R5 cGUgX194MCwgX194MSwgX194MiwgX194MzsJCQkJCVwKKyAgICBVSFd0eXBlIF9fdWwsIF9fdmws IF9fdWgsIF9fdmg7CQkJCQlcCisgICAgVVd0eXBlIF9fdSA9ICh1KSwgX192ID0gKHYpOwkJCQkJ XAorCQkJCQkJCQkJXAorICAgIF9fdWwgPSBfX2xsX2xvd3BhcnQgKF9fdSk7CQkJCQkJXAorICAg IF9fdWggPSBfX2xsX2hpZ2hwYXJ0IChfX3UpOwkJCQkJCVwKKyAgICBfX3ZsID0gX19sbF9sb3dw YXJ0IChfX3YpOwkJCQkJCVwKKyAgICBfX3ZoID0gX19sbF9oaWdocGFydCAoX192KTsJCQkJCQlc CisJCQkJCQkJCQlcCisgICAgX194MCA9IChVV3R5cGUpIF9fdWwgKiBfX3ZsOwkJCQkJXAorICAg IF9feDEgPSAoVVd0eXBlKSBfX3VsICogX192aDsJCQkJCVwKKyAgICBfX3gyID0gKFVXdHlwZSkg X191aCAqIF9fdmw7CQkJCQlcCisgICAgX194MyA9IChVV3R5cGUpIF9fdWggKiBfX3ZoOwkJCQkJ XAorCQkJCQkJCQkJXAorICAgIF9feDEgKz0gX19sbF9oaWdocGFydCAoX194MCk7LyogdGhpcyBj YW4ndCBnaXZlIGNhcnJ5ICovCQlcCisgICAgX194MSArPSBfX3gyOwkJLyogYnV0IHRoaXMgaW5k ZWVkIGNhbiAqLwkJXAorICAgIGlmIChfX3gxIDwgX194MikJCS8qIGRpZCB3ZSBnZXQgaXQ/ICov CQkJXAorICAgICAgX194MyArPSBfX2xsX0I7CQkvKiB5ZXMsIGFkZCBpdCBpbiB0aGUgcHJvcGVy IHBvcy4gKi8JXAorCQkJCQkJCQkJXAorICAgICh3MSkgPSBfX3gzICsgX19sbF9oaWdocGFydCAo X194MSk7CQkJCQlcCisgICAgKHcwKSA9IChfX3gxIDw8IFdfVFlQRV9TSVpFLzIpICsgX19sbF9s b3dwYXJ0IChfX3gwKTsJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBJZiB3ZSBkb24n dCBoYXZlIHNtdWxfcHBtbSwgZGVmaW5lIGl0IHVzaW5nIHVtdWxfcHBtbSAod2hpY2ggc3VyZWx5 IHdpbGwKKyAgIGV4aXN0IGluIG9uZSBmb3JtIG9yIGFub3RoZXIuICAqLworI2lmICFkZWZpbmVk IChzbXVsX3BwbW0pCisjZGVmaW5lIHNtdWxfcHBtbSh3MSwgdzAsIHUsIHYpCQkJCQkJXAorICBk byB7CQkJCQkJCQkJXAorICAgIFVXdHlwZSBfX3cxOwkJCQkJCQlcCisgICAgVVd0eXBlIF9feG0w ID0gKHUpLCBfX3htMSA9ICh2KTsJCQkJCVwKKyAgICB1bXVsX3BwbW0gKF9fdzEsIHcwLCBfX3ht MCwgX194bTEpOwkJCQkJXAorICAgICh3MSkgPSBfX3cxIC0gKC0oX194bTAgPj4gKFdfVFlQRV9T SVpFIC0gMSkpICYgX194bTEpCQlcCisJCS0gKC0oX194bTEgPj4gKFdfVFlQRV9TSVpFIC0gMSkp ICYgX194bTApOwkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIERlZmluZSB0aGlzIHVu Y29uZGl0aW9uYWxseSwgc28gaXQgY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZy4gICovCisjZGVm aW5lIF9fdWRpdl9xcm5uZF9jKHEsIHIsIG4xLCBuMCwgZCkgXAorICBkbyB7CQkJCQkJCQkJXAor ICAgIFVXdHlwZSBfX2QxLCBfX2QwLCBfX3ExLCBfX3EwLCBfX3IxLCBfX3IwLCBfX207CQkJXAor CQkJCQkJCQkJXAorICAgIEFTU0VSVCAoKGQpICE9IDApOwkJCQkJCQlcCisgICAgQVNTRVJUICgo bjEpIDwgKGQpKTsJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgX19kMSA9IF9fbGxfaGlnaHBhcnQg KGQpOwkJCQkJCVwKKyAgICBfX2QwID0gX19sbF9sb3dwYXJ0IChkKTsJCQkJCQlcCisJCQkJCQkJ CQlcCisgICAgX19xMSA9IChuMSkgLyBfX2QxOwkJCQkJCQlcCisgICAgX19yMSA9IChuMSkgLSBf X3ExICogX19kMTsJCQkJCQlcCisgICAgX19tID0gX19xMSAqIF9fZDA7CQkJCQkJCVwKKyAgICBf X3IxID0gX19yMSAqIF9fbGxfQiB8IF9fbGxfaGlnaHBhcnQgKG4wKTsJCQkJXAorICAgIGlmIChf X3IxIDwgX19tKQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCV9fcTEtLSwgX19yMSArPSAo ZCk7CQkJCQkJXAorCWlmIChfX3IxID49IChkKSkgLyogaS5lLiB3ZSBkaWRuJ3QgZ2V0IGNhcnJ5 IHdoZW4gYWRkaW5nIHRvIF9fcjEgKi9cCisJICBpZiAoX19yMSA8IF9fbSkJCQkJCQlcCisJICAg IF9fcTEtLSwgX19yMSArPSAoZCk7CQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIF9fcjEg LT0gX19tOwkJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgX19xMCA9IF9fcjEgLyBfX2QxOwkJCQkJ CQlcCisgICAgX19yMCA9IF9fcjEgIC0gX19xMCAqIF9fZDE7CQkJCQkJXAorICAgIF9fbSA9IF9f cTAgKiBfX2QwOwkJCQkJCQlcCisgICAgX19yMCA9IF9fcjAgKiBfX2xsX0IgfCBfX2xsX2xvd3Bh cnQgKG4wKTsJCQkJXAorICAgIGlmIChfX3IwIDwgX19tKQkJCQkJCQlcCisgICAgICB7CQkJCQkJ CQkJXAorCV9fcTAtLSwgX19yMCArPSAoZCk7CQkJCQkJXAorCWlmIChfX3IwID49IChkKSkJCQkJ CQlcCisJICBpZiAoX19yMCA8IF9fbSkJCQkJCQlcCisJICAgIF9fcTAtLSwgX19yMCArPSAoZCk7 CQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIF9fcjAgLT0gX19tOwkJCQkJCQlcCisJCQkJ CQkJCQlcCisgICAgKHEpID0gX19xMSAqIF9fbGxfQiB8IF9fcTA7CQkJCQkJXAorICAgIChyKSA9 IF9fcjA7CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKy8qIElmIHRoZSBwcm9jZXNzb3IgaGFz IG5vIHVkaXZfcXJubmQgYnV0IHNkaXZfcXJubmQsIGdvIHRocm91Z2gKKyAgIF9fdWRpdl93X3Nk aXYgKGRlZmluZWQgaW4gbGliZ2NjIG9yIGVsc2V3aGVyZSkuICAqLworI2lmICFkZWZpbmVkICh1 ZGl2X3Fybm5kKSAmJiBkZWZpbmVkIChzZGl2X3Fybm5kKQorI2RlZmluZSB1ZGl2X3Fybm5kKHEs IHIsIG5oLCBubCwgZCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVXdHlwZSBfX3I7CQkJCQkJ CQlcCisgICAgKHEpID0gX19NUE4odWRpdl93X3NkaXYpICgmX19yLCBuaCwgbmwsIGQpOwkJCQlc CisgICAgKHIpID0gX19yOwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorX19HTVBfREVDTFNQRUMg VVd0eXBlIF9fTVBOKHVkaXZfd19zZGl2KSAoVVd0eXBlICosIFVXdHlwZSwgVVd0eXBlLCBVV3R5 cGUpOworI2VuZGlmCisKKy8qIElmIHVkaXZfcXJubmQgd2FzIG5vdCBkZWZpbmVkIGZvciB0aGlz IHByb2Nlc3NvciwgdXNlIF9fdWRpdl9xcm5uZF9jLiAgKi8KKyNpZiAhZGVmaW5lZCAodWRpdl9x cm5uZCkKKyNkZWZpbmUgVURJVl9ORUVEU19OT1JNQUxJWkFUSU9OIDEKKyNkZWZpbmUgdWRpdl9x cm5uZCBfX3VkaXZfcXJubmRfYworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoY291bnRfbGVhZGlu Z196ZXJvcykKKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgXAorICBkbyB7 CQkJCQkJCQkJXAorICAgIFVXdHlwZSBfX3hyID0gKHgpOwkJCQkJCQlcCisgICAgVVd0eXBlIF9f YTsJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICBpZiAoV19UWVBFX1NJWkUgPT0gMzIpCQkJCQkJ XAorICAgICAgewkJCQkJCQkJCVwKKwlfX2EgPSBfX3hyIDwgKChVV3R5cGUpIDEgPDwgMipfX0JJ VFM0KQkJCQlcCisJICA/IChfX3hyIDwgKChVV3R5cGUpIDEgPDwgX19CSVRTNCkgPyAxIDogX19C SVRTNCArIDEpCQlcCisJICA6IChfX3hyIDwgKChVV3R5cGUpIDEgPDwgMypfX0JJVFM0KSA/IDIq X19CSVRTNCArIDEJCVwKKwkgIDogMypfX0JJVFM0ICsgMSk7CQkJCQkJXAorICAgICAgfQkJCQkJ CQkJCVwKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCWZvciAoX19hID0g V19UWVBFX1NJWkUgLSA4OyBfX2EgPiAwOyBfX2EgLT0gOCkJCQlcCisJICBpZiAoKChfX3hyID4+ IF9fYSkgJiAweGZmKSAhPSAwKQkJCQlcCisJICAgIGJyZWFrOwkJCQkJCQlcCisJKytfX2E7CQkJ CQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICAgIChjb3VudCkgPSBXX1RZ UEVfU0laRSArIDEgLSBfX2EgLSBfX2Nsel90YWJbX194ciA+PiBfX2FdOwkJXAorICB9IHdoaWxl ICgwKQorLyogVGhpcyB2ZXJzaW9uIGdpdmVzIGEgd2VsbC1kZWZpbmVkIHZhbHVlIGZvciB6ZXJv LiAqLworI2RlZmluZSBDT1VOVF9MRUFESU5HX1pFUk9TXzAgKFdfVFlQRV9TSVpFIC0gMSkKKyNk ZWZpbmUgQ09VTlRfTEVBRElOR19aRVJPU19ORUVEX0NMWl9UQUIKKyNkZWZpbmUgQ09VTlRfTEVB RElOR19aRVJPU19TTE9XCisjZW5kaWYKKworLyogY2x6X3RhYiBuZWVkZWQgYnkgbXBuL3g4Ni9w ZW50aXVtL21vZF8xLmFzbSBpbiBhIGZhdCBiaW5hcnkgKi8KKyNpZiBIQVZFX0hPU1RfQ1BVX0ZB TUlMWV94ODYgJiYgV0FOVF9GQVRfQklOQVJZCisjZGVmaW5lIENPVU5UX0xFQURJTkdfWkVST1Nf TkVFRF9DTFpfVEFCCisjZW5kaWYKKworI2lmZGVmIENPVU5UX0xFQURJTkdfWkVST1NfTkVFRF9D TFpfVEFCCitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBfX0dNUF9ERUNMU1BFQyBfX2Nsel90 YWJbMTI5XTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKGNvdW50X3RyYWlsaW5nX3plcm9zKQor I2lmICFkZWZpbmVkIChDT1VOVF9MRUFESU5HX1pFUk9TX1NMT1cpCisvKiBEZWZpbmUgY291bnRf dHJhaWxpbmdfemVyb3MgdXNpbmcgYW4gYXNtIGNvdW50X2xlYWRpbmdfemVyb3MuICAqLworI2Rl ZmluZSBjb3VudF90cmFpbGluZ196ZXJvcyhjb3VudCwgeCkJCQkJCVwKKyAgZG8gewkJCQkJCQkJ CVwKKyAgICBVV3R5cGUgX19jdHpfeCA9ICh4KTsJCQkJCQlcCisgICAgVVd0eXBlIF9fY3R6X2M7 CQkJCQkJCVwKKyAgICBBU1NFUlQgKF9fY3R6X3ggIT0gMCk7CQkJCQkJXAorICAgIGNvdW50X2xl YWRpbmdfemVyb3MgKF9fY3R6X2MsIF9fY3R6X3ggJiAtX19jdHpfeCk7CQkJXAorICAgIChjb3Vu dCkgPSBXX1RZUEVfU0laRSAtIDEgLSBfX2N0el9jOwkJCQlcCisgIH0gd2hpbGUgKDApCisjZWxz ZQorLyogRGVmaW5lIGNvdW50X3RyYWlsaW5nX3plcm9zIGluIHBsYWluIEMsIGFzc3VtaW5nIHNt YWxsIGNvdW50cyBhcmUgY29tbW9uLgorICAgV2UgdXNlIGNsel90YWIgd2l0aG91dCBhZG8sIHNp bmNlIHRoZSBDIGNvdW50X2xlYWRpbmdfemVyb3MgYWJvdmUgd2lsbCBoYXZlCisgICBwdWxsZWQg aXQgaW4uICAqLworI2RlZmluZSBjb3VudF90cmFpbGluZ196ZXJvcyhjb3VudCwgeCkJCQkJCVwK KyAgZG8gewkJCQkJCQkJCVwKKyAgICBVV3R5cGUgX19jdHpfeCA9ICh4KTsJCQkJCQlcCisgICAg aW50IF9fY3R6X2M7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICBpZiAoTElLRUxZICgoX19jdHpf eCAmIDB4ZmYpICE9IDApKQkJCQkJXAorICAgICAgKGNvdW50KSA9IF9fY2x6X3RhYltfX2N0el94 ICYgLV9fY3R6X3hdIC0gMjsJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJ CVwKKwlmb3IgKF9fY3R6X2MgPSA4IC0gMjsgX19jdHpfYyA8IFdfVFlQRV9TSVpFIC0gMjsgX19j dHpfYyArPSA4KQlcCisJICB7CQkJCQkJCQlcCisJICAgIF9fY3R6X3ggPj49IDg7CQkJCQkJXAor CSAgICBpZiAoTElLRUxZICgoX19jdHpfeCAmIDB4ZmYpICE9IDApKQkJCQlcCisJICAgICAgYnJl YWs7CQkJCQkJCVwKKwkgIH0JCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwkoY291bnQpID0gX19jdHpf YyArIF9fY2x6X3RhYltfX2N0el94ICYgLV9fY3R6X3hdOwkJXAorICAgICAgfQkJCQkJCQkJCVwK KyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgVURJVl9ORUVEU19OT1JN QUxJWkFUSU9OCisjZGVmaW5lIFVESVZfTkVFRFNfTk9STUFMSVpBVElPTiAwCisjZW5kaWYKKwor LyogV2hldGhlciB1ZGl2X3Fybm5kIGlzIGFjdHVhbGx5IGltcGxlbWVudGVkIHdpdGggdWRpdl9x cm5uZF9wcmVpbnYsIGFuZAorICAgdGhhdCBoZW5jZSB0aGUgbGF0dGVyIHNob3VsZCBhbHdheXMg YmUgdXNlZC4gICovCisjaWZuZGVmIFVESVZfUFJFSU5WX0FMV0FZUworI2RlZmluZSBVRElWX1BS RUlOVl9BTFdBWVMgMAorI2VuZGlmCisKKy8qIEdpdmUgZGVmYXVsdHMgZm9yIFVNVUxfVElNRSBh bmQgVURJVl9USU1FLiAgKi8KKyNpZm5kZWYgVU1VTF9USU1FCisjZGVmaW5lIFVNVUxfVElNRSAx CisjZW5kaWYKKworI2lmbmRlZiBVRElWX1RJTUUKKyNkZWZpbmUgVURJVl9USU1FIFVNVUxfVElN RQorI2VuZGlmCi0tIAoxLjcuMTIuMS4zODIuZ2IwNTc2YTYKCgpGcm9tIGJiZDA1ZTg3Zjc0YzQ2 MzFmY2M5NDRhOTZmODVmNmJiZmQ1NjZjNGIgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCkZyb206 IEppbSBNZXllcmluZyA8bWV5ZXJpbmdAcmVkaGF0LmNvbT4KRGF0ZTogU3VuLCAxNiBTZXAgMjAx MiAyMjozMTowNCArMDIwMApTdWJqZWN0OiBbUEFUQ0ggMDQvMTNdIGJ1aWxkOiBhZGQgcnVsZXMg dG8gYnVpbGQgdGhlIG5ldyBmYWN0b3IgcHJvZ3JhbQoKKiBzcmMvbG9jYWwubWsgKHNyYy9wcmlt ZXMuaCk6IE5ldyBydWxlLgoobm9pbnN0X1BST0dSQU1TKTogQWRkIG1ha2UtcHJpbWUtbGlzdC4K KG5vaW5zdF9IRUFERVJTKTogQWRkIGxvbmdsb25nLmguClJlbW92ZSBhbGwgd2hlZWwtcmVsYXRl ZCBydWxlcyBhbmQgZmlsZXMuCiogY2ZnLm1rIChBTV9DRkxBR1MpOiBBdWdtZW50IHdpdGggcGVy LXRhcmdldC1DRkxBR1MgdmFsdWVzLgotLS0KIGNmZy5tayAgICAgICB8ICA0ICsrLS0KIHNyYy9s b2NhbC5tayB8IDI0ICsrKysrKysrLS0tLS0tLS0tLS0tLS0tLQogMiBmaWxlcyBjaGFuZ2VkLCAx MCBpbnNlcnRpb25zKCspLCAxOCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9jZmcubWsgYi9j ZmcubWsKaW5kZXggMDc5YWI1Yi4uMWJkOTM5YSAxMDA2NDQKLS0tIGEvY2ZnLm1rCisrKyBiL2Nm Zy5tawpAQCAtNTYwLDggKzU2MCw4IEBAIGV4Y2x1ZGVfZmlsZV9uYW1lX3JlZ2V4cC0tc2NfcHJv aGliaXRfdGVzdF9iYWNrdGlja3MgPSBcCiBleGNsdWRlX2ZpbGVfbmFtZV9yZWdleHAtLXNjX3By b2hpYml0X29wZXJhdG9yX2F0X2VuZF9vZl9saW5lID0gXAogICBec3JjLyhwdHh8dGVzdHxoZWFk KVwuYyQkCgotIyBBdWdtZW50IEFNX0NGTEFHUyB0byBpbmNsdWRlIG91ciBwZXItZGlyZWN0b3J5 IG9wdGlvbnM6Ci1BTV9DRkxBR1MgKz0gJCgkKEBEKV9DRkxBR1MpCisjIEF1Z21lbnQgQU1fQ0ZM QUdTIHRvIGluY2x1ZGUgb3VyIHBlci1kaXJlY3RvcnkgYW5kIHBlci1maWxlIG9wdGlvbnM6CitB TV9DRkxBR1MgKz0gJCgkKEBEKV9DRkxBR1MpICQoJDxfQ0ZMQUdTKQoKIHNyY19DRkxBR1MgPSAk KFdBUk5fQ0ZMQUdTKQogbGliX0NGTEFHUyA9ICQoR05VTElCX1dBUk5fQ0ZMQUdTKQpkaWZmIC0t Z2l0IGEvc3JjL2xvY2FsLm1rIGIvc3JjL2xvY2FsLm1rCmluZGV4IDk4MjU5ZmEuLmJjZDYwMmEg MTAwNjQ0Ci0tLSBhL3NyYy9sb2NhbC5taworKysgYi9zcmMvbG9jYWwubWsKQEAgLTM1LDcgKzM1 LDEwIEBAIGJpbl9QUk9HUkFNUyA9IEBiaW5fUFJPR1JBTVNACiBwa2dsaWJleGVjX1BST0dSQU1T ID0gQHBrZ2xpYmV4ZWNfUFJPR1JBTVNACgogIyBOZWVkZWQgYnkgdGhlIHRlc3RzdWl0ZS4KLW5v aW5zdF9QUk9HUkFNUyA9IHNyYy9zZXR1aWRnaWQgc3JjL2dldGxpbWl0cworbm9pbnN0X1BST0dS QU1TID0JCVwKKyAgc3JjL2dldGxpbWl0cwkJCVwKKyAgc3JjL21ha2UtcHJpbWUtbGlzdAkJXAor ICBzcmMvc2V0dWlkZ2lkCgogbm9pbnN0X0hFQURFUlMgPQkJXAogICBzcmMvY2hvd24tY29yZS5o CQlcCkBAIC00OCwyMCArNTEsMTggQEAgbm9pbnN0X0hFQURFUlMgPQkJXAogICBzcmMvZnMtaXMt bG9jYWwuaAkJXAogICBzcmMvZ3JvdXAtbGlzdC5oCQlcCiAgIHNyYy9pb2Jsa3NpemUuaAkJXAor ICBzcmMvbG9uZ2xvbmcuaAkJXAogICBzcmMvbHMuaAkJCVwKICAgc3JjL29wZXJhbmQyc2lnLmgJ CVwKICAgc3JjL3Byb2ctZnByaW50Zi5oCQlcCiAgIHNyYy9yZW1vdmUuaAkJCVwKICAgc3JjL3N5 c3RlbS5oCQkJXAotICBzcmMvd2hlZWwtc2l6ZS5oCQlcCi0gIHNyYy93aGVlbC5oCQkJXAogICBz cmMvdW5hbWUuaAoKIEVYVFJBX0RJU1QgKz0JCVwKICAgc3JjL2RjZ2VuCQlcCiAgIHNyYy9kaXJj b2xvcnMuaGluCVwKICAgc3JjL3RhYy1waXBlLmMJXAotICBzcmMvd2hlZWwtZ2VuLnBsCVwKICAg c3JjL2V4dHJhY3QtbWFnaWMJXAogICBzcmMvYzk5LXRvLWM4OS5kaWZmCgpAQCAtMzcxLDE5ICsz NzIsMTAgQEAgc3JjL2RpcmNvbG9ycy5oOiBzcmMvZGNnZW4gc3JjL2RpcmNvbG9ycy5oaW4KIAkk KEFNX1ZfYXQpY2htb2QgYS13ICRALXQKIAkkKEFNX1ZfYXQpbXYgJEAtdCAkQAoKLXdoZWVsX3Np emUgPSA1Ci0KLUJVSUxUX1NPVVJDRVMgKz0gc3JjL3doZWVsLXNpemUuaAotc3JjL3doZWVsLXNp emUuaDogTWFrZWZpbGUuYW0KLQkkKEFNX1ZfR0VOKXJtIC1mICRAICRALXQKLQkkKEFNX1ZfYXQp ZWNobyAnI2RlZmluZSBXSEVFTF9TSVpFICQod2hlZWxfc2l6ZSknID4gJEAtdAotCSQoQU1fVl9h dCljaG1vZCBhLXcgJEAtdAotCSQoQU1fVl9hdCltdiAkQC10ICRACi0KLUJVSUxUX1NPVVJDRVMg Kz0gc3JjL3doZWVsLmgKLXNyYy93aGVlbC5oOiBzcmMvd2hlZWwtZ2VuLnBsIE1ha2VmaWxlLmFt CitCVUlMVF9TT1VSQ0VTICs9IHNyYy9wcmltZXMuaAorc3JjL3ByaW1lcy5oOiBzcmMvbWFrZS1w cmltZS1saXN0CiAJJChBTV9WX0dFTilybSAtZiAkQCAkQC10Ci0JJChBTV9WX2F0KSQoc3JjZGly KS9zcmMvd2hlZWwtZ2VuLnBsICQod2hlZWxfc2l6ZSkgPiAkQC10CisJJChBTV9WX2F0KXNyYy9t YWtlLXByaW1lLWxpc3QgNTAwMCA+ICRALXQKIAkkKEFNX1ZfYXQpY2htb2QgYS13ICRALXQKIAkk KEFNX1ZfYXQpbXYgJEAtdCAkQAoKLS0gCjEuNy4xMi4xLjM4Mi5nYjA1NzZhNgoKCkZyb20gYTky ODc5ZTEyMDk3MTg5Njg5ZjI5NTljMzJjMDMyYWU2MDNlYmEwYiBNb24gU2VwIDE3IDAwOjAwOjAw IDIwMDEKRnJvbTogSmltIE1leWVyaW5nIDxtZXllcmluZ0ByZWRoYXQuY29tPgpEYXRlOiBXZWQs IDE5IFNlcCAyMDEyIDE2OjIwOjExICswMjAwClN1YmplY3Q6IFtQQVRDSCAwNS8xM10gZmFjdG9y OiBpbXByb3ZlbWVudHMgZnJvbSBUK04KCi0tLQogc3JjL2ZhY3Rvci5jIHwgMTI0ICsrKysrKysr KysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAxIGZp bGUgY2hhbmdlZCwgNjYgaW5zZXJ0aW9ucygrKSwgNTggZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0 IGEvc3JjL2ZhY3Rvci5jIGIvc3JjL2ZhY3Rvci5jCmluZGV4IDc3NmFhYTYuLjM2YmU1ZTYgMTAw NjQ0Ci0tLSBhL3NyYy9mYWN0b3IuYworKysgYi9zcmMvZmFjdG9yLmMKQEAgLTE3NDMsOCArMTc0 MywxMCBAQCBpc19zcXVhcmUgKHVpbnRtYXhfdCB4KQogICByZXR1cm4gMDsKIH0KCi1zdGF0aWMg Y29uc3QgdW5zaWduZWQgc2hvcnQgaW52dGFiW10gPQorLyogaW52dGFiW2ldID0gZmxvb3IoMHgx MDAwMCAvICgweDEwMCArIGkpICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgaW52dGFi WzB4ODFdID0KICAgeworICAgIDB4MjAwLAogICAgIDB4MWZjLCAweDFmOCwgMHgxZjQsIDB4MWYw LCAweDFlYywgMHgxZTksIDB4MWU1LCAweDFlMSwKICAgICAweDFkZSwgMHgxZGEsIDB4MWQ3LCAw eDFkNCwgMHgxZDAsIDB4MWNkLCAweDFjYSwgMHgxYzcsCiAgICAgMHgxYzMsIDB4MWMwLCAweDFi ZCwgMHgxYmEsIDB4MWI3LCAweDFiNCwgMHgxYjIsIDB4MWFmLApAQCAtMTc2NywxNyArMTc2OSwy MiBAQCBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgaW52dGFiW10gPQogICAgdGhhdCBxIDwg MHg0MDsgaGVyZSBpdCBpbnN0ZWFkIHVzZXMgYSB0YWJsZSBvZiAoRXVjbGlkaWFuKSBpbnZlcnNl cy4gICovCiAjZGVmaW5lIGRpdl9zbWFsbHEocSwgciwgdSwgZCkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKDAgJiYg KHUpIC8gMHg0MCA8IChkKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCisgICAgaWYgKCh1KSAvIDB4NDAgPCAoZCkpICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGludCBfY250 OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc CiAgICAgICAgIHVpbnRtYXhfdCBfZGludiwgX21hc2ssIF9xLCBfcjsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGNvdW50X2xlYWRpbmdfemVyb3MgKF9jbnQsIChk KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0g ICAgICAgIF9kaW52ID0gaW52dGFiWygoZCkgPj4gKFdfVFlQRV9TSVpFIC0gOCAtIF9jbnQpKSAg ICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgIC0gKDEgPDwgKDggLSAxKSld OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAg ICAgIF9yID0gKHUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBcCi0gICAgICAgIF9xID0gX3IgKiBfZGludiA+PiAoV19UWVBFX1NJWkUgKyA4 IC0gX2NudCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChVTkxJS0VMWSAoX2Nu dCA+IChXX1RZUEVfU0laRSAtIDgpKSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAg ICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCisgICAgICAgICAgICBfZGludiA9IGludnRhYlsoKGQpIDw8IChfY250ICsgOCAt IFdfVFlQRV9TSVpFKSkgLSAweDgwXTsgICBcCisgICAgICAgICAgICBfcSA9IF9kaW52ICogX3Ig Pj4gKDggKyBXX1RZUEVfU0laRSAtIF9jbnQpOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAg fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBf ZGludiA9IGludnRhYlsoKGQpID4+IChXX1RZUEVfU0laRSAtIDggLSBfY250KSkgLSAweDdmXTsg ICBcCisgICAgICAgICAgICBfcSA9IF9kaW52ICogKF9yID4+IChXX1RZUEVfU0laRSAtIDMgLSBf Y250KSkgPj4gMTE7ICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIF9yIC09IF9x KihkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCiAgICAgICAgIF9tYXNrID0gLSh1aW50bWF4X3QpIChfciA+PSAo ZCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xODM3LDggKzE4NDQsOSBA QCBzdGF0aWMgdW5zaWduZWQgaW50IHFfZnJlcVtRX0ZSRVFfU0laRSArIDFdOwogIyBkZWZpbmUg TUlOKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKICNlbmRpZgoKLQotc3RhdGljIHZvaWQK Ky8qIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MuICBFeHBlY3RlZCB0byBmYWlsIG9ubHkgZm9yIG51 bWJlcnMKKyAgID49IDJeezIqV19UWVBFX1NJWkUgLSAyfSwgb3IgY2xvc2UgdG8gdGhhdCBsaW1p dC4gKi8KK3N0YXRpYyBib29sCiBmYWN0b3JfdXNpbmdfc3F1Zm9mICh1aW50bWF4X3QgbjEsIHVp bnRtYXhfdCBuMCwgc3RydWN0IGZhY3RvcnMgKmZhY3RvcnMpCiB7CiAgIC8qIFVzZXMgYWxnb3Jp dGhtIGFuZCBub3RhdGlvbiBmcm9tCkBAIC0xODU4LDM1ICsxODY2LDQxIEBAIGZhY3Rvcl91c2lu Z19zcXVmb2YgKHVpbnRtYXhfdCBuMSwgdWludG1heF90IG4wLCBzdHJ1Y3QgZmFjdG9ycyAqZmFj dG9ycykKICAgICAgIDExNTUsIDE1LCAyMzEsIDM1LCAzLCA1NSwgNywgMTEsIDAKICAgICB9OwoK LSAgdWludG1heF90IFM7CiAgIGNvbnN0IHVuc2lnbmVkIGludCAqbTsKCiAgIHN0cnVjdCB7IHVp bnRtYXhfdCBROyB1aW50bWF4X3QgUDsgfSBxdWV1ZVtRVUVVRV9TSVpFXTsKCi0gIFMgPSBpc3Fy dDIgKG4xLCBuMCk7CisgIGlmIChuMSA+PSAoKHVpbnRtYXhfdCkgMSA8PCAoV19UWVBFX1NJWkUg LSAyKSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHVpbnRtYXhfdCBzcXJ0X24gPSBpc3FydDIg KG4xLCBuMCk7CgotICBpZiAobjAgPT0gUyAqIFMpCisgIGlmIChuMCA9PSBzcXJ0X24gKiBzcXJ0 X24pCiAgICAgewogICAgICAgdWludG1heF90IHAxLCBwMDsKCi0gICAgICB1bXVsX3BwbW0gKHAx LCBwMCwgUywgUyk7CisgICAgICB1bXVsX3BwbW0gKHAxLCBwMCwgc3FydF9uLCBzcXJ0X24pOwog ICAgICAgYXNzZXJ0IChwMCA9PSBuMCk7CgogICAgICAgaWYgKG4xID09IHAxKQogICAgICAgICB7 Ci0gICAgICAgICAgaWYgKHByaW1lX3AgKFMpKQotICAgICAgICAgICAgZmFjdG9yX2luc2VydF9t dWx0aXBsaWNpdHkgKGZhY3RvcnMsIFMsIDIpOworICAgICAgICAgIGlmIChwcmltZV9wIChzcXJ0 X24pKQorICAgICAgICAgICAgZmFjdG9yX2luc2VydF9tdWx0aXBsaWNpdHkgKGZhY3RvcnMsIHNx cnRfbiwgMik7CiAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewogICAgICAgICAgICAgICBz dHJ1Y3QgZmFjdG9ycyBmOwoKICAgICAgICAgICAgICAgZi5uZmFjdG9ycyA9IDA7Ci0gICAgICAg ICAgICAgIGZhY3Rvcl91c2luZ19zcXVmb2YgKDAsIFMsICZmKTsKKyAgICAgICAgICAgICAgaWYg KCFmYWN0b3JfdXNpbmdfc3F1Zm9mICgwLCBzcXJ0X24sICZmKSkKKyAgICAgICAgICAgICAgICB7 CisgICAgICAgICAgICAgICAgICAvKiBUcnkgcG9sbGFyZCByaG8gaW5zdGVhZCAqLworICAgICAg ICAgICAgICAgICAgZmFjdG9yX3VzaW5nX3BvbGxhcmRfcmhvIChzcXJ0X24sIDEsICZmKTsKKyAg ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC8qIER1cGxpY2F0ZSB0aGUgbmV3IGZhY3Rv cnMgKi8KICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBmLm5mYWN0 b3JzOyBpKyspCiAgICAgICAgICAgICAgICAgZmFjdG9yX2luc2VydF9tdWx0aXBsaWNpdHkgKGZh Y3RvcnMsIGYucFtpXSwgMipmLmVbaV0pOwogICAgICAgICAgICAgfQotICAgICAgICAgIHJldHVy bjsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KCkBAIC0xOTI1LDYg KzE5MzksNyBAQCBmYWN0b3JfdXNpbmdfc3F1Zm9mICh1aW50bWF4X3QgbjEsIHVpbnRtYXhfdCBu MCwgc3RydWN0IGZhY3RvcnMgKmZhY3RvcnMpCiAgICAgICBEaCArPSBuMSAqIG11OwoKICAgICAg IGFzc2VydCAoRGwgJSA0ICE9IDEpOworICAgICAgYXNzZXJ0IChEaCA8ICh1aW50bWF4X3QpIDEg PDwgKFdfVFlQRV9TSVpFIC0gMikpOwoKICAgICAgIFMgPSBpc3FydDIgKERoLCBEbCk7CgpAQCAt MTk0MywxMCArMTk1OCwxMCBAQCBmYWN0b3JfdXNpbmdfc3F1Zm9mICh1aW50bWF4X3QgbjEsIHVp bnRtYXhfdCBuMCwgc3RydWN0IGZhY3RvcnMgKmZhY3RvcnMpCgogICAgICAgZm9yIChpID0gMDsg aSA8PSBCOyBpKyspCiAgICAgICAgIHsKLSAgICAgICAgICB1aW50bWF4X3QgcSwgUDEsIHQsIHI7 CisgICAgICAgICAgdWludG1heF90IHEsIFAxLCB0LCByZW07CgotICAgICAgICAgIGRpdl9zbWFs bHEgKHEsIHIsIFMrUCwgUSk7Ci0gICAgICAgICAgUDEgPSBTIC0gcjsgICAvKiBQMSA9IHEqUSAt IFAgKi8KKyAgICAgICAgICBkaXZfc21hbGxxIChxLCByZW0sIFMrUCwgUSk7CisgICAgICAgICAg UDEgPSBTIC0gcmVtOyAvKiBQMSA9IHEqUSAtIFAgKi8KCiAjaWYgU1RBVF9TUVVGT0YKICAgICAg ICAgICBhc3NlcnQgKHEgPiAwKTsKQEAgLTIwMjUsMjkgKzIwNDAsMjUgQEAgZmFjdG9yX3VzaW5n X3NxdWZvZiAodWludG1heF90IG4xLCB1aW50bWF4X3QgbjAsIHN0cnVjdCBmYWN0b3JzICpmYWN0 b3JzKQogICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBjYXNlIEQgPSAyTi4gKi8KICAgICAg ICAgICAgICAgICAgIC8qIENvbXB1dGUgUSA9IChEIC0gUCpQKSAvIFExLCBidXQgd2UgbmVlZCBk b3VibGUKICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbi4gKi8KLSAgICAgICAgICAgICAg ICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdWludG1heF90IGhpLCBsbywgcmVtOwotICAgICAg ICAgICAgICAgICAgICB1bXVsX3BwbW0gKGhpLCBsbywgUCwgUCk7Ci0gICAgICAgICAgICAgICAg ICAgIHN1Yl9kZG1tc3MgKGhpLCBsbywgRGgsIERsLCBoaSwgbG8pOwotICAgICAgICAgICAgICAg ICAgICB1ZGl2X3Fybm5kIChRLCByZW0sIGhpLCBsbywgUTEpOwotICAgICAgICAgICAgICAgICAg ICBhc3NlcnQgKHJlbSA9PSAwKTsKLSAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg ICAgIHVpbnRtYXhfdCBoaSwgbG87CisgICAgICAgICAgICAgICAgICB1bXVsX3BwbW0gKGhpLCBs bywgUCwgUCk7CisgICAgICAgICAgICAgICAgICBzdWJfZGRtbXNzIChoaSwgbG8sIERoLCBEbCwg aGksIGxvKTsKKyAgICAgICAgICAgICAgICAgIHVkaXZfcXJubmQgKFEsIHJlbSwgaGksIGxvLCBR MSk7CisgICAgICAgICAgICAgICAgICBhc3NlcnQgKHJlbSA9PSAwKTsKCiAgICAgICAgICAgICAg ICAgICBmb3IgKDs7KQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAg ICAgdWludG1heF90IHI7Ci0KICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3RlOiBUaGVyZSBh cHBlYXJzIHRvIGJ5IGEgdHlwbyBpbiB0aGUgcGFwZXIsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgU3RlcCA0YSBpbiB0aGUgYWxnb3JpdGhtIGRlc2NyaXB0aW9uIHNheXMgcSA8LS0KICAgICAg ICAgICAgICAgICAgICAgICAgICBmbG9vcihbUytQXS9caGF0IFEpLCBidXQgbG9va2luZyBhdCB0 aGUgZXF1YXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gU2VjLiAzLjEsIGl0IHNo b3VsZCBiZSBxIDwtLSBmbG9vcihbUytQXSAvIFEpLgogICAgICAgICAgICAgICAgICAgICAgICAg IChJbiB0aGlzIGNvZGUsIFxoYXQgUSBpcyBRMSkuICovCi0gICAgICAgICAgICAgICAgICAgICAg ZGl2X3NtYWxscSAocSwgciwgUytQLCBRKTsKLSAgICAgICAgICAgICAgICAgICAgICBQMSA9IFMg LSByOyAgICAgICAvKiBQMSA9IHEqUSAtIFAgKi8KKyAgICAgICAgICAgICAgICAgICAgICBkaXZf c21hbGxxIChxLCByZW0sIFMrUCwgUSk7CisgICAgICAgICAgICAgICAgICAgICAgUDEgPSBTIC0g cmVtOyAgICAgLyogUDEgPSBxKlEgLSBQICovCgogI2lmIFNUQVRfU1FVRk9GCiAgICAgICAgICAg ICAgICAgICAgICAgcV9mcmVxWzBdKys7Ci0gICAgICAgICAgICAgICAgICAgICAgcV9mcmVxW01J TihxLCBRX0ZSRVFfU0laRSldKys7CisgICAgICAgICAgICAgICAgICAgICAgcV9mcmVxW01JTiAo cSwgUV9GUkVRX1NJWkUpXSsrOwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgaWYgKFAg PT0gUDEpCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTIwNjUsOCArMjA3Niw4 IEBAIGZhY3Rvcl91c2luZ19zcXVmb2YgKHVpbnRtYXhfdCBuMSwgdWludG1heF90IG4wLCBzdHJ1 Y3QgZmFjdG9ycyAqZmFjdG9ycykKCiAgICAgICAgICAgICAgICAgICBpZiAocHJpbWVfcCAoUSkp CiAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9pbnNlcnQgKGZhY3RvcnMsIFEpOwotICAgICAg ICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBmYWN0b3JfdXNpbmdfc3F1Zm9m ICgwLCBRLCBmYWN0b3JzKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFmYWN0b3JfdXNp bmdfc3F1Zm9mICgwLCBRLCBmYWN0b3JzKSkKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yX3Vz aW5nX3BvbGxhcmRfcmhvIChRLCAyLCBmYWN0b3JzKTsKCiAgICAgICAgICAgICAgICAgICBkaXZl eGFjdF8yMSAobjEsIG4wLCBuMSwgbjAsIFEpOwoKQEAgLTIwNzQsMTMgKzIwODUsMTYgQEAgZmFj dG9yX3VzaW5nX3NxdWZvZiAodWludG1heF90IG4xLCB1aW50bWF4X3QgbjAsIHN0cnVjdCBmYWN0 b3JzICpmYWN0b3JzKQogICAgICAgICAgICAgICAgICAgICBmYWN0b3JfaW5zZXJ0X2xhcmdlIChm YWN0b3JzLCBuMSwgbjApOwogICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAg ICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKG4xID09IDApCi0gICAgICAgICAgICAg ICAgICAgICAgICBmYWN0b3JfdXNpbmdfcG9sbGFyZF9yaG8gKG4wLCAxLCBmYWN0b3JzKTsKLSAg ICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3Jf dXNpbmdfc3F1Zm9mIChuMSwgbjAsIGZhY3RvcnMpOworICAgICAgICAgICAgICAgICAgICAgIGlm ICghZmFjdG9yX3VzaW5nX3NxdWZvZiAobjEsIG4wLCBmYWN0b3JzKSkKKyAgICAgICAgICAgICAg ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4xID09IDApCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX3VzaW5nX3BvbGxhcmRfcmhvIChuMCwgMSwg ZmFjdG9ycyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICBmYWN0b3JfdXNpbmdfcG9sbGFyZF9yaG8yIChuMSwgbjAsIDEsIGZhY3Rv cnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Cgot ICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7 CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICBuZXh0X2k6CkBAIC0y MDg5LDggKzIxMDMsNyBAQCBmYWN0b3JfdXNpbmdfc3F1Zm9mICh1aW50bWF4X3QgbjEsIHVpbnRt YXhfdCBuMCwgc3RydWN0IGZhY3RvcnMgKmZhY3RvcnMpCiAgICAgbmV4dF9tdWx0aXBsaWVyOgog ICAgICAgOwogICAgIH0KLSAgZnByaW50ZiAoc3RkZXJyLCAic3F1Zm9mIGZhaWxlZC5cbiIpOwot ICBleGl0IChFWElUX0ZBSUxVUkUpOworICByZXR1cm4gZmFsc2U7CiB9Cgogc3RhdGljIHZvaWQK QEAgLTIxMDQsMjYgKzIxMTcsMjEgQEAgZmFjdG9yICh1aW50bWF4X3QgdDEsIHVpbnRtYXhfdCB0 MCwgc3RydWN0IGZhY3RvcnMgKmZhY3RvcnMpCgogICB0MCA9IGZhY3Rvcl91c2luZ19kaXZpc2lv biAoJnQxLCB0MSwgdDAsIGZhY3RvcnMpOwoKLSAgaWYgKHQxID09IDApCi0gICAgewotICAgICAg aWYgKHQwICE9IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocHJpbWVfcCAodDApKQotICAg ICAgICAgICAgZmFjdG9yX2luc2VydCAoZmFjdG9ycywgdDApOwotICAgICAgICAgIGVsc2UgaWYg KGFsZyA9PSBBTEdfUE9MTEFSRF9SSE8pCi0gICAgICAgICAgICBmYWN0b3JfdXNpbmdfcG9sbGFy ZF9yaG8gKHQwLCAxLCBmYWN0b3JzKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBmYWN0 b3JfdXNpbmdfc3F1Zm9mICgwLCB0MCwgZmFjdG9ycyk7Ci0gICAgICAgIH0KLSAgICB9CisgIGlm ICh0MSA9PSAwICYmIHQwIDwgMikKKyAgICByZXR1cm47CisKKyAgaWYgKHByaW1lMl9wICh0MSwg dDApKQorICAgIGZhY3Rvcl9pbnNlcnRfbGFyZ2UgKGZhY3RvcnMsIHQxLCB0MCk7CiAgIGVsc2UK ICAgICB7Ci0gICAgICBpZiAocHJpbWUyX3AgKHQxLCB0MCkpCi0gICAgICAgIGZhY3Rvcl9pbnNl cnRfbGFyZ2UgKGZhY3RvcnMsIHQxLCB0MCk7Ci0gICAgICBlbHNlIGlmIChhbGcgPT0gQUxHX1BP TExBUkRfUkhPKQotICAgICAgICBmYWN0b3JfdXNpbmdfcG9sbGFyZF9yaG8yICh0MSwgdDAsIDEs IGZhY3RvcnMpOworICAgICAgaWYgKGFsZyA9PSBBTEdfU1FVRk9GKQorICAgICAgICBpZiAoZmFj dG9yX3VzaW5nX3NxdWZvZiAodDEsIHQwLCBmYWN0b3JzKSkKKyAgICAgICAgICByZXR1cm47CisK KyAgICAgIGlmICh0MSA9PSAwKQorICAgICAgICBmYWN0b3JfdXNpbmdfcG9sbGFyZF9yaG8gKHQw LCAxLCBmYWN0b3JzKTsKICAgICAgIGVsc2UKLSAgICAgICAgZmFjdG9yX3VzaW5nX3NxdWZvZiAo dDEsIHQwLCBmYWN0b3JzKTsKKyAgICAgICAgZmFjdG9yX3VzaW5nX3BvbGxhcmRfcmhvMiAodDEs IHQwLCAxLCBmYWN0b3JzKTsKICAgICB9CiB9CgotLSAKMS43LjEyLjEuMzgyLmdiMDU3NmE2CgoK RnJvbSA4MTNiOGE5YmU1ODI5NjUyOTQ1YWViNWM2ZGE3MGEzN2VmNDg1YmQzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKaW0gTWV5ZXJpbmcgPG1leWVyaW5nQHJlZGhhdC5jb20+CkRh dGU6IFdlZCwgMTkgU2VwIDIwMTIgMTY6MjM6MTAgKzAyMDAKU3ViamVjdDogW1BBVENIIDA2LzEz XSBmYWN0b3I6IG1lcmdlIHdpdGggcHJlZXhpc3RpbmcgZmFjdG9yLCBpbnRlZ3JhdGUKIHRlc3Rz LCBldGMuCk1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNl dD1VVEYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CgoqIHNyYy9mYWN0b3IuYzog QWRqdXN0IGNvcHlyaWdodCBoZWFkZXIgdG8gYmUgY29uc2lzdGVudCB3aXRoIG90aGVycy4KVXNl IHhtYWxsb2MgYW5kIHhyZWFsbG9jLCB0byBhdm9pZCBzZWd2IHVwb24gT09NLgpTd2l0Y2ggYmFj ayB0byB1c2luZyByZWFkdG9rZW5zIHRvIGhhbmRsZSBpbnB1dC4KRGlhZ25vc2UgaW52YWxpZCBp bnB1dHMuCnMvZnByaW50ZitleGl0L2Vycm9yLwoocHJpbnRfZmFjdG9ycyk6IEFkZCBjb21tZW50 cy4KKHN0cnRvMnVpbnRtYXgpOiBSZXR1cm4gc3RydG9sX2Vycm9yLCBub3QgaW50LgoocmVhZF9p dGVtKTogUmVtb3ZlLCBubyBsb25nZXIgdXNlZC4KKG1haW4pOiBVc2UgYXRleGl0KGNsb3NlX3N0 ZG91dCkgc28gdGhhdCB3ZSBkb24ndCBpZ25vcmUgZmFpbGVkIHdyaXRlLgoqIHNyYy9tYWtlLXBy aW1lLWxpc3QuYzogTmV3IGZpbGUuCiogY2ZnLm1rOiBFeGVtcHQgc3JjL2xvbmdsb25nLmggZnJv bSBzZXZlcmFsIHRlc3RzLgoqIEFVVEhPUlMgKGZhY3Rvcik6IEFkZCBUb3JiasO2cm4gYW5kIE5p ZWxzLgoqIHRlc3RzL2xvY2FsLm1rIChmYWN0b3JfdGVzdHMpOiBFbmNvZGUgdGhlIDM3IHRlc3Rz LgooJChmYWN0b3JfdGVzdHMpKTogUnVsZSB0byBnZW5lcmF0ZSBhIHRlc3Qgc2NyaXB0IGZvciBl YWNoIHRlc3QuCiogdGVzdHMvZmFjdG9yL3J1bi5zaDogTmV3IHNjcmlwdCwgbWFya2VkIGFzIHZl cnkgZXhwZW5zaXZlLgotLS0KIEFVVEhPUlMgICAgICAgICAgICAgfCAgIDIgKy0KIGNmZy5tayAg ICAgICAgICAgICAgfCAgMTMgKy0KIHNyYy9mYWN0b3IuYyAgICAgICAgfCA0NDEgKysrKysrKysr KysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3JjL2xvY2FsLm1r ICAgICAgICB8ICAgNyArCiB0ZXN0cy9mYWN0b3IvcnVuLnNoIHwgIDMwICsrKysKIHRlc3RzL2xv Y2FsLm1rICAgICAgfCAgNjkgKysrKysrKy0KIDYgZmlsZXMgY2hhbmdlZCwgMzU4IGluc2VydGlv bnMoKyksIDIwNCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDc1NSB0ZXN0cy9mYWN0b3Iv cnVuLnNoCgpkaWZmIC0tZ2l0IGEvQVVUSE9SUyBiL0FVVEhPUlMKaW5kZXggOTk4NGEyZS4uNTUy ZTlkNCAxMDA2NDQKLS0tIGEvQVVUSE9SUworKysgYi9BVVRIT1JTCkBAIC0yNiw3ICsyNiw3IEBA IGVjaG86IEJyaWFuIEZveCwgQ2hldCBSYW1leQogZW52OiBSaWNoYXJkIE1seW5hcmlrLCBEYXZp ZCBNYWNLZW56aWUKIGV4cGFuZDogRGF2aWQgTWFjS2VuemllCiBleHByOiBNaWtlIFBhcmtlciwg SmFtZXMgWW91bmdtYW4sIFBhdWwgRWdnZXJ0Ci1mYWN0b3I6IFBhdWwgUnViaW4KK2ZhY3Rvcjog UGF1bCBSdWJpbiwgVG9yYmrDtnJuIEdyYW5sdW5kLCBOaWVscyBNw7ZsbGVyCiBmYWxzZTogSmlt IE1leWVyaW5nCiBmbXQ6IFJvc3MgUGF0ZXJzb24KIGZvbGQ6IERhdmlkIE1hY0tlbnppZQpkaWZm IC0tZ2l0IGEvY2ZnLm1rIGIvY2ZnLm1rCmluZGV4IDFiZDkzOWEuLjg3MGYzOWYgMTAwNjQ0Ci0t LSBhL2NmZy5taworKysgYi9jZmcubWsKQEAgLTUxNSw3ICs1MTUsOCBAQCB1cGRhdGUtY29weXJp Z2h0LWVudiA9IFwKICMgTGlzdCBzeW50YXgtY2hlY2sgZXhlbXB0aW9ucy4KIGV4Y2x1ZGVfZmls ZV9uYW1lX3JlZ2V4cC0tc2Nfc3BhY2VfdGFiID0gXAogICBeKHRlc3RzL3ByL3x0ZXN0cy9taXNj L25sXC5zaCQkfGdsLy4qXC5kaWZmJCQpCi1leGNsdWRlX2ZpbGVfbmFtZV9yZWdleHAtLXNjX2Jp bmR0ZXh0ZG9tYWluID0gXihnbC8uKnxsaWIvZXVpZGFjY2Vzcy1zdGF0KVwuYyQkCitleGNsdWRl X2ZpbGVfbmFtZV9yZWdleHAtLXNjX2JpbmR0ZXh0ZG9tYWluID0gXAorICBeKGdsLy4qfGxpYi9l dWlkYWNjZXNzLXN0YXR8c3JjL21ha2UtcHJpbWUtbGlzdClcLmMkJAogZXhjbHVkZV9maWxlX25h bWVfcmVnZXhwLS1zY190cmFpbGluZ19ibGFuayA9IF50ZXN0cy9wci8KIGV4Y2x1ZGVfZmlsZV9u YW1lX3JlZ2V4cC0tc2Nfc3lzdGVtX2hfaGVhZGVycyA9IFwKICAgXnNyYy8oKHN5c3RlbXxjb3B5 KVwuaHxsaWJzdGRidWZcLmMpJCQKQEAgLTUzOSwxNCArNTQwLDIwIEBAIGV4Y2x1ZGVfZmlsZV9u YW1lX3JlZ2V4cC0tc2NfcHJvaGliaXRfZmFpbF8wID0gXAogICAoXi4qL2dpdC1ob29rcy9jb21t aXQtbXNnfF50ZXN0cy9pbml0XC5zaHxNYWtlZmlsZVwuYW18XC5ta3wuKlwudGV4aSkkJAogZXhj bHVkZV9maWxlX25hbWVfcmVnZXhwLS1zY19wcm9oaWJpdF9hdG9pX2F0b2YgPSBebGliL2V1aWRh Y2Nlc3Mtc3RhdFwuYyQkCgorIyBsb25nbG9uZy5oIGlzIG1haW50YWluZWQgZWxzZXdoZXJlLgor X2xsID0gXnNyYy9sb25nbG9uZ1wuaCQkCitleGNsdWRlX2ZpbGVfbmFtZV9yZWdleHAtLXNjX3Vz ZWxlc3NfY3BwX3BhcmVucyA9ICQoX2xsKQorZXhjbHVkZV9maWxlX25hbWVfcmVnZXhwLS1zY19s b25nX2xpbmVzID0gJChfbGwpCitleGNsdWRlX2ZpbGVfbmFtZV9yZWdleHAtLXNjX3NwYWNlX2Jl Zm9yZV9vcGVuX3BhcmVuID0gJChfbGwpCisKIHRiaV8xID0gXnRlc3RzL3ByL3woXmdsL2xpYi9y ZWcuKlwuY1wuZGlmZnxcLm1rfF5tYW4vaGVscDJtYW4pJCQKIHRiaV8yID0gXnNjcmlwdHMvZ2l0 LWhvb2tzLyhwcmUtY29tbWl0fHByZS1hcHBseXBhdGNofGFwcGx5cGF0Y2gtbXNnKSQkCi10Ymlf MyA9IChHTlUpP1tNbV1ha2VmaWxlKFwuYW0pPyQkCit0YmlfMyA9IChHTlUpP1tNbV1ha2VmaWxl KFwuYW0pPyQkfCQoX2xsKQogZXhjbHVkZV9maWxlX25hbWVfcmVnZXhwLS1zY19wcm9oaWJpdF90 YWJfYmFzZWRfaW5kZW50YXRpb24gPSBcCiAgICQodGJpXzEpfCQodGJpXzIpfCQodGJpXzMpCgog ZXhjbHVkZV9maWxlX25hbWVfcmVnZXhwLS1zY19wcmVwcm9jZXNzb3JfaW5kZW50YXRpb24gPSBc Ci0gIF4oZ2wvbGliL3JhbmQtaXNhYWNcLltjaF18Z2wvdGVzdHMvdGVzdC1yYW5kLWlzYWFjXC5j KSQkCisgIF4oZ2wvbGliL3JhbmQtaXNhYWNcLltjaF18Z2wvdGVzdHMvdGVzdC1yYW5kLWlzYWFj XC5jKSQkfCQoX19sbCkKIGV4Y2x1ZGVfZmlsZV9uYW1lX3JlZ2V4cC0tc2NfcHJvaGliaXRfc3Rh dF9zdF9ibG9ja3MgPSBcCiAgIF4oc3JjL3N5c3RlbVwuaHx0ZXN0cy9kdS8yZ1wuc2gpJCQKCmRp ZmYgLS1naXQgYS9zcmMvZmFjdG9yLmMgYi9zcmMvZmFjdG9yLmMKaW5kZXggMzZiZTVlNi4uY2Uz NGUxNiAxMDA2NDQKLS0tIGEvc3JjL2ZhY3Rvci5jCisrKyBiL3NyYy9mYWN0b3IuYwpAQCAtMSwy MiArMSwyMSBAQAotLyogRmFjdG9yaW5nIG9mIHVpbnRtYXhfdCBudW1iZXJzLgorLyogZmFjdG9y IC0tIHByaW50IHByaW1lIGZhY3RvcnMgb2Ygbi4KKyAgIENvcHlyaWdodCAoQykgMTk4Ni0yMDEy IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKLSAgIENvbnRyaWJ1dGVkIHRvIHRoZSBH TlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQgYW5kIE5pZWxzIE3DtmxsZXIKLSAgIENv bnRhaW5zIGNvZGUgZnJvbSBHTlUgTVAuCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy ZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkK KyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhl IExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKLUNv cHlyaWdodCAxOTk1LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAy MDA1LCAyMDA5LCAyMDEyCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMg cHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs LAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg d2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt b3JlIGRldGFpbHMuCgotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLXRoZSB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl Ci1Gb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91 ciBvcHRpb24pIGFueSBsYXRlcgotdmVyc2lvbi4KKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl ZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRo IHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMv Pi4gICovCgotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg d2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQotV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQot UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm b3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi10aGlzIHByb2dyYW0uICBJ ZiBub3QsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKy8qIENvbnRyaWJ1 dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQgYW5kIE5pZWxzIE3D tmxsZXIKKyAgIENvbnRhaW5zIGNvZGUgZnJvbSBHTlUgTVAuICAqLwoKIC8qIEVmZmljaWVudGx5 IGZhY3RvciBudW1iZXJzIHRoYXQgZml0IGluIG9uZSBvciB0d28gd29yZHMgKHdvcmQgPSB1aW50 bWF4X3QpLAogICAgb3IsIHdpdGggR01QLCBudW1iZXJzIG9mIGFueSBzaXplLgpAQCAtNTIsNyAr NTEsNyBAQCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGlj ZW5zZXMvLiAgKi8KCiAgICAgV2UgcHJlZmVyIHVzaW5nIEhlbnNlbCBub3JtIGluIHRoZSBkaXZp c2lvbnMsIG5vdCB0aGUgbW9yZSBmYW1pbGlhcgogICAgIEV1Y2xpZGlhbiBub3JtLCBzaW5jZSB0 aGUgZm9ybWVyIGxlYWRzIHRvIG11Y2ggZmFzdGVyIGNvZGUuICBJbiB0aGUKLSAgICBQb2xsYXJk LUJyZW50IHJobyBjb2RlIGFuZCB0aGUgdGhlIHByaW1lIHRlc3RpbmcgY29kZSwgd2UgdXNlIE1v bnRnb21lcnkncworICAgIFBvbGxhcmQtQnJlbnQgcmhvIGNvZGUgYW5kIHRoZSBwcmltZSB0ZXN0 aW5nIGNvZGUsIHdlIHVzZSBNb250Z29tZXJ5J3MKICAgICB0cmljayBvZiBtdWx0aXBseWluZyBh bGwgbi1yZXNpZHVlcyBieSB0aGUgd29yZCBiYXNlLCBhbGxvd2luZyBjaGVhcCBIZW5zZWwKICAg ICByZWR1Y3Rpb25zIG1vZCBuLgoKQEAgLTgyLDIyICs4MSwzMCBAQCB0aGlzIHByb2dyYW0uICBJ ZiBub3QsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KICovCgogI2luY2x1 ZGUgPGNvbmZpZy5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+ CiAjaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGVy cm5vLmg+CisjaWYgSEFWRV9HTVAKKyMgaW5jbHVkZSA8Z21wLmg+CisjZW5kaWYKKwogI2luY2x1 ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+ICAg ICAgICAgICAgIC8qIGZvciBtZW1tb3ZlICovCi0jaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAg ICAgIC8qIGZvciBnZXRvcHQgKi8KLSNpbmNsdWRlIDxzdGRib29sLmg+CgogI2luY2x1ZGUgInN5 c3RlbS5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRl ICJyZWFkdG9rZW5zLmgiCisjaW5jbHVkZSAieHN0cnRvbC5oIgoKLSNpZiBIQVZFX0dNUAotIyBp bmNsdWRlIDxnbXAuaD4KLSNlbmRpZgorLyogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhpcyBwcm9n cmFtIChlLmcuLCBubyAnZycgcHJlZml4KS4gICovCisjZGVmaW5lIFBST0dSQU1fTkFNRSAiZmFj dG9yIgorCisjZGVmaW5lIEFVVEhPUlMgXAorICBwcm9wZXJfbmFtZSAoIlBhdWwgUnViaW4iKSwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwcm9wZXJfbmFt ZV91dGY4ICgiVG9yYmpvcm4gR3Jhbmx1bmQiLCAiVG9yYmpcMzAzXDI2NnJuIEdyYW5sdW5kIiks ICAgXAorICBwcm9wZXJfbmFtZV91dGY4ICgiTmllbHMgTW9sbGVyIiwgIk5pZWxzIE1cMzAzXDI2 NmxsZXIiKQorCisvKiBUb2tlbiBkZWxpbWl0ZXJzIHdoZW4gcmVhZGluZyBmcm9tIGEgZmlsZS4g ICovCisjZGVmaW5lIERFTElNICJcblx0ICIKCiAjaWZuZGVmIFNUQVRfU1FVRk9GCiAjIGRlZmlu ZSBTVEFUX1NRVUZPRiAwCkBAIC0xNzAsNiArMTc3LDQzIEBAIHN0YXRpYyBlbnVtIGFsZ190eXBl IGFsZzsKIC8qIDIqMyo1KjcqMTEuLi4qMTAxIGlzIDEyOCBiaXRzLCBhbmQgaGFzIDI2IHByaW1l IGZhY3RvcnMgKi8KICNkZWZpbmUgTUFYX05GQUNUUyAyNgoKK2VudW0KK3sKKyAgVkVSQk9TRV9P UFRJT04gPSBDSEFSX01BWCArIDEKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGNvbnN0IGxv bmdfb3B0aW9uc1tdID0KK3sKKyAgeyJ2ZXJib3NlIiwgbm9fYXJndW1lbnQsIE5VTEwsIFZFUkJP U0VfT1BUSU9OfSwKKyAge0dFVE9QVF9IRUxQX09QVElPTl9ERUNMfSwKKyAge0dFVE9QVF9WRVJT SU9OX09QVElPTl9ERUNMfSwKKyAge05VTEwsIDAsIE5VTEwsIDB9Cit9OworCit2b2lkCit1c2Fn ZSAoaW50IHN0YXR1cykKK3sKKyAgaWYgKHN0YXR1cyAhPSBFWElUX1NVQ0NFU1MpCisgICAgZW1p dF90cnlfaGVscCAoKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZiAoXygiXAorVXNhZ2U6 ICVzIFtOVU1CRVJdLi4uXG5cCisgIG9yOiAgJXMgT1BUSU9OXG5cCisiKSwKKyAgICAgICAgICAg ICAgcHJvZ3JhbV9uYW1lLCBwcm9ncmFtX25hbWUpOworICAgICAgZnB1dHMgKF8oIlwKK1ByaW50 IHRoZSBwcmltZSBmYWN0b3JzIG9mIGVhY2ggc3BlY2lmaWVkIGludGVnZXIgTlVNQkVSLiAgSWYg bm9uZVxuXAorYXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCByZWFkIHRoZW0gZnJv bSBzdGFuZGFyZCBpbnB1dC5cblwKK1xuXAorIiksIHN0ZG91dCk7CisgICAgICBmcHV0cyAoSEVM UF9PUFRJT05fREVTQ1JJUFRJT04sIHN0ZG91dCk7CisgICAgICBmcHV0cyAoVkVSU0lPTl9PUFRJ T05fREVTQ1JJUFRJT04sIHN0ZG91dCk7CisgICAgICBlbWl0X2FuY2lsbGFyeV9pbmZvICgpOwor ICAgIH0KKyAgZXhpdCAoc3RhdHVzKTsKK30KKwogc3RydWN0IGZhY3RvcnMKIHsKICAgdWludG1h eF90ICAgICBwbGFyZ2VbMl07IC8qIENhbiBoYXZlIGEgc2luZ2xlIGxhcmdlIGZhY3RvciAqLwpA QCAtMTgxLDcgKzIyNSw3IEBAIHN0cnVjdCBmYWN0b3JzCiAjaWYgSEFWRV9HTVAKIHN0cnVjdCBt cF9mYWN0b3JzCiB7Ci0gIG1wel90ICAgICAgICAgKnA7CisgIG1wel90ICAgICAgICAgICAgICpw OwogICB1bnNpZ25lZCBsb25nIGludCAqZTsKICAgdW5zaWduZWQgbG9uZyBpbnQgbmZhY3RvcnM7 CiB9OwpAQCAtMTkwLDcgKzIzNCw3IEBAIHN0cnVjdCBtcF9mYWN0b3JzCiBzdGF0aWMgdm9pZCBm YWN0b3IgKHVpbnRtYXhfdCwgdWludG1heF90LCBzdHJ1Y3QgZmFjdG9ycyAqKTsKCiAjaWZuZGVm IHVtdWxfcHBtbQotIyBkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyMgZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAs IHUsIHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZG8geyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKICAgICB1aW50bWF4X3QgX194MCwgX194MSwgX194MiwgX194MzsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB1bnNpZ25lZCBsb25nIGludCBfX3VsLCBf X3ZsLCBfX3VoLCBfX3ZoOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTIxNiwxMiAr MjYwLDEyIEBAIHN0YXRpYyB2b2lkIGZhY3RvciAodWludG1heF90LCB1aW50bWF4X3QsIHN0cnVj dCBmYWN0b3JzICopOwogICB9IHdoaWxlICgwKQogI2VuZGlmCgotI2lmICFkZWZpbmVkKHVkaXZf cXJubmQpIHx8IGRlZmluZWQoVURJVl9ORUVEU19OT1JNQUxJWkFUSU9OKQorI2lmICFkZWZpbmVk IHVkaXZfcXJubmQgfHwgZGVmaW5lZCBVRElWX05FRURTX05PUk1BTElaQVRJT04KIC8qIERlZmlu ZSBvdXIgb3duLCBub3QgbmVlZGluZyBub3JtYWxpemF0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzCiAg ICBjdXJyZW50bHkgbm90IHBlcmZvcm1hbmNlIGNyaXRpY2FsLCBzbyBrZWVwIGl0IHNpbXBsZS4g U2ltaWxhciB0bwogICAgdGhlIG1vZCBtYWNybyBiZWxvdy4gKi8KICMgdW5kZWYgdWRpdl9xcm5u ZAotIyBkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuMSwgbjAsIGQpICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKKyMgZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBk KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZG8geyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK ICAgICB1aW50bWF4X3QgX19kMSwgX19kMCwgX19xLCBfX3IxLCBfX3IwOyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTI0NCw4ICsyODgsOCBAQCBz dGF0aWMgdm9pZCBmYWN0b3IgKHVpbnRtYXhfdCwgdWludG1heF90LCBzdHJ1Y3QgZmFjdG9ycyAq KTsKICAgfSB3aGlsZSAoMCkKICNlbmRpZgoKLSNpZiAhZGVmaW5lZCAoYWRkX3NzYWFhYSkKLSMg ZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCisjaWYgIWRlZmluZWQgYWRkX3NzYWFhYQorIyBkZWZpbmUgYWRkX3Nz YWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAogICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgXAogICAgIHVpbnRtYXhfdCBfYWRkX3g7ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIF9hZGRfeCA9IChhbCkg KyAoYmwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApA QCAtMjczLDcgKzMxNyw3IEBAIHN0YXRpYyB2b2lkIGZhY3RvciAodWludG1heF90LCB1aW50bWF4 X3QsIHN0cnVjdCBmYWN0b3JzICopOwogICAoKGFoKSA+IChiaCkgfHwgKChhaCkgPT0gKGJoKSAm JiAoYWwpID4gKGJsKSkpCgogI2lmbmRlZiBzdWJfZGRtbXNzCi0jIGRlZmluZSBzdWJfZGRtbXNz KHJoLCBybCwgYWgsIGFsLCBiaCwgYmwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor IyBkZWZpbmUgc3ViX2RkbW1zcyhyaCwgcmwsIGFoLCBhbCwgYmgsIGJsKSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAogICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHVpbnRtYXhfdCBfY3k7ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAg IF9jeSA9IChhbCkgPCAoYmwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXApAQCAtMjgzLDcgKzMyNyw3IEBAIHN0YXRpYyB2b2lkIGZhY3RvciAodWlu dG1heF90LCB1aW50bWF4X3QsIHN0cnVjdCBmYWN0b3JzICopOwogI2VuZGlmCgogI2lmbmRlZiBj b3VudF9sZWFkaW5nX3plcm9zCi0jIGRlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4 KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIyBkZWZpbmUgY291bnRfbGVh ZGluZ196ZXJvcyhjb3VudCwgeCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAog ICAgIHVpbnRtYXhfdCBfX2Nsel94ID0gKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAogICAgIHVuc2lnbmVkIGludCBfX2Nsel9jOyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGZvciAoX19jbHpfYyA9IDA7 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAt Mjk3LDcgKzM0MSw3IEBAIHN0YXRpYyB2b2lkIGZhY3RvciAodWludG1heF90LCB1aW50bWF4X3Qs IHN0cnVjdCBmYWN0b3JzICopOwogI2VuZGlmCgogI2lmbmRlZiBjb3VudF90cmFpbGluZ196ZXJv cwotIyBkZWZpbmUgY291bnRfdHJhaWxpbmdfemVyb3MoY291bnQsIHgpIGRvIHsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKKyMgZGVmaW5lIGNvdW50X3RyYWlsaW5nX3plcm9zKGNvdW50 LCB4KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB1aW50bWF4X3QgX19j dHpfeCA9ICh4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK ICAgICB1bnNpZ25lZCBpbnQgX19jdHpfYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKICAgICB3aGlsZSAoKF9fY3R6X3ggJiAxKSA9PSAwKSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTMxNyw3ICszNjEsNyBAQCBz dGF0aWMgdm9pZCBmYWN0b3IgKHVpbnRtYXhfdCwgdWludG1heF90LCBzdHJ1Y3QgZmFjdG9ycyAq KTsKICAgfSB3aGlsZSAoMCkKCiAjZGVmaW5lIGFkZG1vZChyLGEsYixuKSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN1Ym1vZCgociksIChhKSwg KChuKSAtIChiKSksIChuKSkKKyAgc3VibW9kICgociksIChhKSwgKChuKSAtIChiKSksIChuKSkK CiAvKiBNb2R1bGFyIHR3by13b3JkIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbi4gIEZvciBwZXJm b3JtYW5jZSByZWFzb25zLCB0aGUKICAgIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIG4xIG11c3Qg YmUgY2xlYXIuICBUaGUgZGVzdGluYXRpb24gdmFyaWFibGVzIG11c3QgYmUKQEAgLTQ4MCw3ICs1 MjQsNyBAQCBmYWN0b3JfaW5zZXJ0X211bHRpcGxpY2l0eSAoc3RydWN0IGZhY3RvcnMgKmZhY3Rv cnMsCiAgICAgfQogfQoKLSNkZWZpbmUgZmFjdG9yX2luc2VydChmLCBwKSBmYWN0b3JfaW5zZXJ0 X211bHRpcGxpY2l0eShmLCBwLCAxKQorI2RlZmluZSBmYWN0b3JfaW5zZXJ0KGYsIHApIGZhY3Rv cl9pbnNlcnRfbXVsdGlwbGljaXR5IChmLCBwLCAxKQoKIHN0YXRpYyB2b2lkCiBmYWN0b3JfaW5z ZXJ0X2xhcmdlIChzdHJ1Y3QgZmFjdG9ycyAqZmFjdG9ycywKQEAgLTUwMiw4ICs1NDYsOCBAQCBz dGF0aWMgdm9pZCBtcF9mYWN0b3IgKG1wel90LCBzdHJ1Y3QgbXBfZmFjdG9ycyAqKTsKIHN0YXRp YyB2b2lkCiBtcF9mYWN0b3JfaW5pdCAoc3RydWN0IG1wX2ZhY3RvcnMgKmZhY3RvcnMpCiB7Ci0g IGZhY3RvcnMtPnAgPSBtYWxsb2MgKDEpOwotICBmYWN0b3JzLT5lID0gbWFsbG9jICgxKTsKKyAg ZmFjdG9ycy0+cCA9IHhtYWxsb2MgKDEpOworICBmYWN0b3JzLT5lID0geG1hbGxvYyAoMSk7CiAg IGZhY3RvcnMtPm5mYWN0b3JzID0gMDsKIH0KCkBAIC01MzQsOCArNTc4LDggQEAgbXBfZmFjdG9y X2luc2VydCAoc3RydWN0IG1wX2ZhY3RvcnMgKmZhY3RvcnMsIG1wel90IHByaW1lKQoKICAgaWYg KGkgPCAwIHx8IG1wel9jbXAgKHBbaV0sIHByaW1lKSAhPSAwKQogICAgIHsKLSAgICAgIHAgPSBy ZWFsbG9jIChwLCAobmZhY3RvcnMgKyAxKSAqIHNpemVvZiBwWzBdKTsKLSAgICAgIGUgPSByZWFs bG9jIChlLCAobmZhY3RvcnMgKyAxKSAqIHNpemVvZiBlWzBdKTsKKyAgICAgIHAgPSB4cmVhbGxv YyAocCwgKG5mYWN0b3JzICsgMSkgKiBzaXplb2YgcFswXSk7CisgICAgICBlID0geHJlYWxsb2Mg KGUsIChuZmFjdG9ycyArIDEpICogc2l6ZW9mIGVbMF0pOwoKICAgICAgIG1wel9pbml0IChwW25m YWN0b3JzXSk7CiAgICAgICBmb3IgKGxvbmcgaiA9IG5mYWN0b3JzIC0gMTsgaiA+IGk7IGotLSkK QEAgLTU3NSw3ICs2MTksOCBAQCBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwcmltZXNfZGlm ZltdID0gewogfTsKICN1bmRlZiBQCgotI2RlZmluZSBQUklNRVNfUFRBQl9FTlRSSUVTIChzaXpl b2YocHJpbWVzX2RpZmYpIC8gc2l6ZW9mKHByaW1lc19kaWZmWzBdKSAtIDggKyAxKQorI2RlZmlu ZSBQUklNRVNfUFRBQl9FTlRSSUVTIFwKKyAgKHNpemVvZiAocHJpbWVzX2RpZmYpIC8gc2l6ZW9m IChwcmltZXNfZGlmZlswXSkgLSA4ICsgMSkKCiAjZGVmaW5lIFAoYSxiLGMsZCkgYiwKIHN0YXRp YyBjb25zdCB1bnNpZ25lZCBjaGFyIHByaW1lc19kaWZmOFtdID0gewpAQCAtNTk2LDggKzY0MSw4 IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcHJpbWVzX2R0YWIgcHJpbWVzX2R0YWJbXSA9IHsKIH07 CiAjdW5kZWYgUAoKLS8qIFRoaXMgZmxhZyBpcyBob25vdXJlZCBqdXN0IGluIHRoZSBHTVAgY29k ZS4gKi8KLXN0YXRpYyBpbnQgZmxhZ192ZXJib3NlID0gMDsKKy8qIFRoaXMgZmxhZyBpcyBob25v cmVkIG9ubHkgaW4gdGhlIEdNUCBjb2RlLiAqLworc3RhdGljIGludCB2ZXJib3NlID0gMDsKCiAv KiBQcm92ZSBwcmltYWxpdHkgb3IgcnVuIHByb2JhYmlsaXN0aWMgdGVzdHMuICAqLwogc3RhdGlj IGludCBmbGFnX3Byb3ZlX3ByaW1hbGl0eSA9IDE7CkBAIC02MDksNiArNjU0LDE4IEBAIHN0YXRp YyBpbnQgZmxhZ19wcm92ZV9wcmltYWxpdHkgPSAxOwogI2RlZmluZSBVTkxJS0VMWShjb25kKSAg X19idWlsdGluX2V4cGVjdCAoKGNvbmQpICE9IDAsIDApCgogc3RhdGljIHZvaWQKK2RlYnVnIChj aGFyIGNvbnN0ICpmbXQsIC4uLikKK3sKKyAgaWYgKHZlcmJvc2UpCisgICAgeworICAgICAgdmFf bGlzdCBhcDsKKyAgICAgIHZhX3N0YXJ0IChhcCwgZm10KTsKKyAgICAgIHZmcHJpbnRmIChzdGRl cnIsIGZtdCwgYXApOworICAgICAgdmFfZW5kIChhcCk7CisgICAgfQorfQorCitzdGF0aWMgdm9p ZAogZmFjdG9yX2luc2VydF9yZWZpbmQgKHN0cnVjdCBmYWN0b3JzICpmYWN0b3JzLCB1aW50bWF4 X3QgcCwgdW5zaWduZWQgaW50IGksCiAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50 IG9mZikKIHsKQEAgLTYyNyw4ICs2ODQsOCBAQCBmYWN0b3JfaW5zZXJ0X3JlZmluZCAoc3RydWN0 IGZhY3RvcnMgKmZhY3RvcnMsIHVpbnRtYXhfdCBwLCB1bnNpZ25lZCBpbnQgaSwKICAgICAgYmlu diA9IHBeey0xfSAobW9kIEIpCiAgICAgIGxpbSA9IGZsb29yICggKEItMSkgLyBwICkuCgotICAg Rmlyc3QgYXNzdW1lIHRoYXQgdCBpcyBhIG11bHRpcGxlIG9mIHAsIHQgPSBxICogcC4gVGhlbiAw IDw9IHEgPD0KLSAgIGxpbSAoYW5kIGFsbCBxdW90aWVudHMgaW4gdGhpcyByYW5nZSBvY2N1ciBm b3Igc29tZSB0KS4KKyAgIEZpcnN0IGFzc3VtZSB0aGF0IHQgaXMgYSBtdWx0aXBsZSBvZiBwLCB0 ID0gcSAqIHAuIFRoZW4gMCA8PSBxIDw9IGxpbQorICAgKGFuZCBhbGwgcXVvdGllbnRzIGluIHRo aXMgcmFuZ2Ugb2NjdXIgZm9yIHNvbWUgdCkuCgogICAgVGhlbiB0ID0gcSAqIHAgaXMgdHJ1ZSBh bHNvIChtb2QgQiksIGFuZCBwIGlzIGludmVydGlibGUgd2UgZ2V0CgpAQCAtNzM4LDEwICs3OTUs NyBAQCBtcF9mYWN0b3JfdXNpbmdfZGl2aXNpb24gKG1wel90IHQsIHN0cnVjdCBtcF9mYWN0b3Jz ICpmYWN0b3JzKQogICBtcHpfdCBxOwogICB1bnNpZ25lZCBsb25nIGludCBwOwoKLSAgaWYgKGZs YWdfdmVyYm9zZSA+IDApCi0gICAgewotICAgICAgcHJpbnRmICgiW3RyaWFsIGRpdmlzaW9uXSAi KTsKLSAgICB9CisgIGRlYnVnICgiW3RyaWFsIGRpdmlzaW9uXSAiKTsKCiAgIG1wel9pbml0IChx KTsKCkBAIC04MzUsNyArODg5LDcgQEAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgIGJpbnZl cnRfdGFibGVbMTI4XSA9CiAgICAgICAgIChxMCkgPSBfcTA7ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIChxMSkgPSAwOyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAg ICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBcCi0gIH0gd2hpbGUoMCkKKyAgfSB3aGlsZSAoMCkKCiAvKiB4IEIgKG1vZCBu KS4gKi8KICNkZWZpbmUgcmVkY2lmeShyX3ByaW0sIHIsIG4pICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTExMzgsNyArMTE5Miw4IEBAIHByaW1lX3AgKHVp bnRtYXhfdCBuKQogICAgICAgICAgIGlzX3ByaW1lID0gdHJ1ZTsKICAgICAgICAgICBmb3IgKHVu c2lnbmVkIGludCBpID0gMDsgaSA8IGZhY3RvcnMubmZhY3RvcnMgJiYgaXNfcHJpbWU7IGkrKykK ICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaXNfcHJpbWUgPSBwb3dtIChhX3ByaW0sIChu IC0gMSkgLyBmYWN0b3JzLnBbaV0sIG4sIG5pLCBvbmUpICE9IG9uZTsKKyAgICAgICAgICAgICAg aXNfcHJpbWUKKyAgICAgICAgICAgICAgICA9IHBvd20gKGFfcHJpbSwgKG4gLSAxKSAvIGZhY3Rv cnMucFtpXSwgbiwgbmksIG9uZSkgIT0gb25lOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAg ICAgICBlbHNlCkBAIC0xMTY4LDcgKzEyMjMsNyBAQCBwcmltZV9wICh1aW50bWF4X3QgbikKICAg ICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KCi0gIGZwcmludGYgKHN0ZGVyciwgIkx1Y2FzIHBy aW1lIHRlc3QgZmFpbHVyZS4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW5cbiIpOworICBlcnJvciAo MCwgMCwgXygiTHVjYXMgcHJpbWUgdGVzdCBmYWlsdXJlLiAgVGhpcyBzaG91bGQgbm90IGhhcHBl biIpKTsKICAgYWJvcnQgKCk7CiB9CgpAQCAtMTI0MSw4ICsxMjk2LDkgQEAgcHJpbWUyX3AgKHVp bnRtYXhfdCBuMSwgdWludG1heF90IG4wKQogICAgICAgICAgICAgfQogICAgICAgICAgIGZvciAo dW5zaWduZWQgaW50IGkgPSAwOyBpIDwgZmFjdG9ycy5uZmFjdG9ycyAmJiBpc19wcmltZTsgaSsr KQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBGSVhNRTogV2UgYWx3YXlzIGhhdmUg dGhlIGZhY3RvciAyLiBEbyB3ZSByZWFsbHkgbmVlZCB0byBoYW5kbGUgaXQKLSAgICAgICAgICAg ICAgICAgaGVyZT8gV2UgaGF2ZSBkb25lIHRoZSBzYW1lIHBvd2VyaW5nIGFzIHBhcnQgb2YgbWls bGVycmFiaW4uICovCisgICAgICAgICAgICAgIC8qIEZJWE1FOiBXZSBhbHdheXMgaGF2ZSB0aGUg ZmFjdG9yIDIuIERvIHdlIHJlYWxseSBuZWVkIHRvCisgICAgICAgICAgICAgICAgIGhhbmRsZSBp dCBoZXJlPyBXZSBoYXZlIGRvbmUgdGhlIHNhbWUgcG93ZXJpbmcgYXMgcGFydAorICAgICAgICAg ICAgICAgICBvZiBtaWxsZXJyYWJpbi4gKi8KICAgICAgICAgICAgICAgaWYgKGZhY3RvcnMucFtp XSA9PSAyKQogICAgICAgICAgICAgICAgIHJzaDIgKGVbMV0sIGVbMF0sIG5tMVsxXSwgbm0xWzBd LCAxKTsKICAgICAgICAgICAgICAgZWxzZQpAQCAtMTI2Nyw3ICsxMzIzLDcgQEAgcHJpbWUyX3Ag KHVpbnRtYXhfdCBuMSwgdWludG1heF90IG4wKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAg fQoKLSAgZnByaW50ZiAoc3RkZXJyLCAiTHVjYXMgcHJpbWUgdGVzdCBmYWlsdXJlLiAgVGhpcyBz aG91bGQgbm90IGhhcHBlblxuIik7CisgIGVycm9yICgwLCAwLCBfKCJMdWNhcyBwcmltZSB0ZXN0 IGZhaWx1cmUuICBUaGlzIHNob3VsZCBub3QgaGFwcGVuIikpOwogICBhYm9ydCAoKTsKIH0KCkBA IC0xMzQzLDcgKzEzOTksNyBAQCBtcF9wcmltZV9wIChtcHpfdCBuKQogICAgICAgICB9CiAgICAg fQoKLSAgZnByaW50ZiAoc3RkZXJyLCAiTHVjYXMgcHJpbWUgdGVzdCBmYWlsdXJlLiAgVGhpcyBz aG91bGQgbm90IGhhcHBlblxuIik7CisgIGVycm9yICgwLCAwLCBfKCJMdWNhcyBwcmltZSB0ZXN0 IGZhaWx1cmUuICBUaGlzIHNob3VsZCBub3QgaGFwcGVuIikpOwogICBhYm9ydCAoKTsKCiAgcmV0 MToKQEAgLTE1NTYsMjAgKzE2MTIsMTcgQEAgbXBfZmFjdG9yX3VzaW5nX3BvbGxhcmRfcmhvICht cHpfdCBuLCB1bnNpZ25lZCBsb25nIGludCBhLAogewogICBtcHpfdCB4LCB6LCB5LCBQOwogICBt cHpfdCB0LCB0MjsKLSAgdW5zaWduZWQgbG9uZyBsb25nIGludCBrLCBsOwoKLSAgaWYgKGZsYWdf dmVyYm9zZSA+IDApCi0gICAgewotICAgICAgcHJpbnRmICgiW3BvbGxhcmQtcmhvICglbHUpXSAi LCBhKTsKLSAgICB9CisgIGRlYnVnICgiW3BvbGxhcmQtcmhvICglbHUpXSAiLCBhKTsKCiAgIG1w el9pbml0cyAodCwgdDIsIE5VTEwpOwogICBtcHpfaW5pdF9zZXRfc2kgKHksIDIpOwogICBtcHpf aW5pdF9zZXRfc2kgKHgsIDIpOwogICBtcHpfaW5pdF9zZXRfc2kgKHosIDIpOwogICBtcHpfaW5p dF9zZXRfdWkgKFAsIDEpOwotICBrID0gMTsKLSAgbCA9IDE7CisKKyAgdW5zaWduZWQgbG9uZyBs b25nIGludCBrID0gMTsKKyAgdW5zaWduZWQgbG9uZyBsb25nIGludCBsID0gMTsKCiAgIHdoaWxl IChtcHpfY21wX3VpIChuLCAxKSAhPSAwKQogICAgIHsKQEAgLTE2MjMsMTAgKzE2NzYsNyBAQCBt cF9mYWN0b3JfdXNpbmdfcG9sbGFyZF9yaG8gKG1wel90IG4sIHVuc2lnbmVkIGxvbmcgaW50IGEs CgogICAgICAgaWYgKCFtcF9wcmltZV9wICh0KSkKICAgICAgICAgewotICAgICAgICAgIGlmIChm bGFnX3ZlcmJvc2UgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwcmludGYgKCJb Y29tcG9zaXRlIGZhY3Rvci0tcmVzdGFydGluZyBwb2xsYXJkLXJob10gIik7Ci0gICAgICAgICAg ICB9CisgICAgICAgICAgZGVidWcgKCJbY29tcG9zaXRlIGZhY3Rvci0tcmVzdGFydGluZyBwb2xs YXJkLXJob10gIik7CiAgICAgICAgICAgbXBfZmFjdG9yX3VzaW5nX3BvbGxhcmRfcmhvICh0LCBh ICsgMSwgZmFjdG9ycyk7CiAgICAgICAgIH0KICAgICAgIGVsc2UKQEAgLTE5NjYsNyArMjAxNiw3 IEBAIGZhY3Rvcl91c2luZ19zcXVmb2YgKHVpbnRtYXhfdCBuMSwgdWludG1heF90IG4wLCBzdHJ1 Y3QgZmFjdG9ycyAqZmFjdG9ycykKICNpZiBTVEFUX1NRVUZPRgogICAgICAgICAgIGFzc2VydCAo cSA+IDApOwogICAgICAgICAgIHFfZnJlcVswXSsrOwotICAgICAgICAgIHFfZnJlcVtNSU4ocSwg UV9GUkVRX1NJWkUpXSsrOworICAgICAgICAgIHFfZnJlcVtNSU4gKHEsIFFfRlJFUV9TSVpFKV0r KzsKICNlbmRpZgoKICAgICAgICAgICBpZiAoUSA8PSBMMSkKQEAgLTE5ODEsMTAgKzIwMzEsNyBA QCBmYWN0b3JfdXNpbmdfc3F1Zm9mICh1aW50bWF4X3QgbjEsIHVpbnRtYXhfdCBuMCwgc3RydWN0 IGZhY3RvcnMgKmZhY3RvcnMpCiAgICAgICAgICAgICAgIGlmIChnIDw9IEwpCiAgICAgICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgICAgaWYgKHFwb3MgPj0gUVVFVUVfU0laRSkKLSAgICAg ICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwg InNxdWZvZiBxdWV1ZSBvdmVyZmxvdy5cbiIpOwotICAgICAgICAgICAgICAgICAgICAgIGV4aXQg KEVYSVRfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg ICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgXygic3F1Zm9mIHF1ZXVlIG92ZXJmbG93LiIpKTsK ICAgICAgICAgICAgICAgICAgIHF1ZXVlW3Fwb3NdLlEgPSBnOwogICAgICAgICAgICAgICAgICAg cXVldWVbcXBvc10uUCA9IFAgJSBnOwogICAgICAgICAgICAgICAgICAgcXBvcysrOwpAQCAtMjAw Myw5ICsyMDUwLDcgQEAgZmFjdG9yX3VzaW5nX3NxdWZvZiAodWludG1heF90IG4xLCB1aW50bWF4 X3QgbjAsIHN0cnVjdCBmYWN0b3JzICpmYWN0b3JzKQogICAgICAgICAgICAgICB1aW50bWF4X3Qg ciA9IGlzX3NxdWFyZSAoUSk7CiAgICAgICAgICAgICAgIGlmIChyKQogICAgICAgICAgICAgICAg IHsKLSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBqOwotCi0gICAgICAgICAgICAgICAg ICBmb3IgKGogPSAwOyBqIDwgcXBvczsgaisrKQorICAgICAgICAgICAgICAgICAgZm9yICh1bnNp Z25lZCBpbnQgaiA9IDA7IGogPCBxcG9zOyBqKyspCiAgICAgICAgICAgICAgICAgICAgIHsKICAg ICAgICAgICAgICAgICAgICAgICBpZiAocXVldWVbal0uUSA9PSByKQogICAgICAgICAgICAgICAg ICAgICAgICAgewpAQCAtMjA5NywxMSArMjE0Miw5IEBAIGZhY3Rvcl91c2luZ19zcXVmb2YgKHVp bnRtYXhfdCBuMSwgdWludG1heF90IG4wLCBzdHJ1Y3QgZmFjdG9ycyAqZmFjdG9ycykKICAgICAg ICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg IH0KLSAgICAgICAgbmV4dF9pOgotICAgICAgICAgIDsKKyAgICAgICAgbmV4dF9pOjsKICAgICAg ICAgfQotICAgIG5leHRfbXVsdGlwbGllcjoKLSAgICAgIDsKKyAgICBuZXh0X211bHRpcGxpZXI6 OwogICAgIH0KICAgcmV0dXJuIGZhbHNlOwogfQpAQCAtMjE0NywxMCArMjE5MCw3IEBAIG1wX2Zh Y3RvciAobXB6X3QgdCwgc3RydWN0IG1wX2ZhY3RvcnMgKmZhY3RvcnMpCgogICAgICAgaWYgKG1w el9jbXBfdWkgKHQsIDEpICE9IDApCiAgICAgICAgIHsKLSAgICAgICAgICBpZiAoZmxhZ192ZXJi b3NlID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHJpbnRmICgiW2lzIG51bWJl ciBwcmltZT9dICIpOwotICAgICAgICAgICAgfQorICAgICAgICAgIGRlYnVnICgiW2lzIG51bWJl ciBwcmltZT9dICIpOwogICAgICAgICAgIGlmIChtcF9wcmltZV9wICh0KSkKICAgICAgICAgICAg IG1wX2ZhY3Rvcl9pbnNlcnQgKGZhY3RvcnMsIHQpOwogICAgICAgICAgIGVsc2UKQEAgLTIxNjAs MTQgKzIyMDAsMTMgQEAgbXBfZmFjdG9yIChtcHpfdCB0LCBzdHJ1Y3QgbXBfZmFjdG9ycyAqZmFj dG9ycykKIH0KICNlbmRpZgoKLXN0YXRpYyBpbnQKK3N0YXRpYyBzdHJ0b2xfZXJyb3IKIHN0cnRv MnVpbnRtYXggKHVpbnRtYXhfdCAqaGlwLCB1aW50bWF4X3QgKmxvcCwgY29uc3QgY2hhciAqcykK IHsKLSAgaW50IGVycmNvZGU7CiAgIHVuc2lnbmVkIGludCBsb19jYXJyeTsKICAgdWludG1heF90 IGhpLCBsbzsKCi0gIGVycmNvZGUgPSAtMTsKKyAgc3RydG9sX2Vycm9yIGVycjsKCiAgIGhpID0g bG8gPSAwOwogICBmb3IgKDs7KQpAQCAtMjE3NiwxOCArMjIxNSwxOCBAQCBzdHJ0bzJ1aW50bWF4 ICh1aW50bWF4X3QgKmhpcCwgdWludG1heF90ICpsb3AsIGNvbnN0IGNoYXIgKnMpCiAgICAgICBp ZiAoYyA9PSAwKQogICAgICAgICBicmVhazsKCi0gICAgICBpZiAoVU5MSUtFTFkgKGMgPCAnMCcg fHwgYyA+ICc5JykpCisgICAgICBpZiAoVU5MSUtFTFkgKCFJU0RJR0lUIChjKSkpCiAgICAgICAg IHsKLSAgICAgICAgICBlcnJjb2RlID0gLTE7CisgICAgICAgICAgZXJyID0gTE9OR0lOVF9JTlZB TElEOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICBjIC09ICcwJzsKCi0gICAg ICBlcnJjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHdlJ3ZlIHNlZW4gYXQgbGVhc3Qgb25lIHZh bGlkIGRpZ2l0ICovCisgICAgICBlcnIgPSBMT05HSU5UX09LOyAgICAgICAgICAgLyogd2UndmUg c2VlbiBhdCBsZWFzdCBvbmUgdmFsaWQgZGlnaXQgKi8KCiAgICAgICBpZiAoVU5MSUtFTFkgKGhp ID4gfih1aW50bWF4X3QpMCAvIDEwKSkKICAgICAgICAgewotICAgICAgICAgIGVycmNvZGUgPSAt MTsgLyogb3ZlcmZsb3cgKi8KKyAgICAgICAgICBlcnIgPSBMT05HSU5UX09WRVJGTE9XOwogICAg ICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICBoaSA9IDEwICogaGk7CkBAIC0yMjAyLDcg KzIyNDEsNyBAQCBzdHJ0bzJ1aW50bWF4ICh1aW50bWF4X3QgKmhpcCwgdWludG1heF90ICpsb3As IGNvbnN0IGNoYXIgKnMpCiAgICAgICBoaSArPSBsb19jYXJyeTsKICAgICAgIGlmIChVTkxJS0VM WSAoaGkgPCBsb19jYXJyeSkpCiAgICAgICAgIHsKLSAgICAgICAgICBlcnJjb2RlID0gLTE7IC8q IG92ZXJmbG93ICovCisgICAgICAgICAgZXJyID0gTE9OR0lOVF9PVkVSRkxPVzsKICAgICAgICAg ICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTIyMTAsNyArMjI0OSw3IEBAIHN0cnRvMnVp bnRtYXggKHVpbnRtYXhfdCAqaGlwLCB1aW50bWF4X3QgKmxvcCwgY29uc3QgY2hhciAqcykKICAg KmhpcCA9IGhpOwogICAqbG9wID0gbG87CgotICByZXR1cm4gZXJyY29kZTsKKyAgcmV0dXJuIGVy cjsKIH0KCiBzdGF0aWMgdm9pZApAQCAtMjIzMiwxNDkgKzIyNzEsMTU5IEBAIHByaW50X3VpbnRt YXhlcyAodWludG1heF90IHQxLCB1aW50bWF4X3QgdDApCiAgICAgfQogfQoKKy8qIFNpbmdsZS1w cmVjaXNpb24gZmFjdG9yaW5nICovCiBzdGF0aWMgdm9pZAotZmFjdG9yX29uZSAoY29uc3QgY2hh ciAqaW5wdXQpCitwcmludF9mYWN0b3JzX3NpbmdsZSAodWludG1heF90IHQxLCB1aW50bWF4X3Qg dDApCit7CisgIHN0cnVjdCBmYWN0b3JzIGZhY3RvcnM7CisKKyAgcHJpbnRfdWludG1heGVzICh0 MSwgdDApOworICBwdXRjaGFyICgnOicpOworCisgIGZhY3RvciAodDEsIHQwLCAmZmFjdG9ycyk7 CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgaiA9IDA7IGogPCBmYWN0b3JzLm5mYWN0b3JzOyBqKysp CisgICAgZm9yICh1bnNpZ25lZCBpbnQgayA9IDA7IGsgPCBmYWN0b3JzLmVbal07IGsrKykKKyAg ICAgIHByaW50ZiAoIiAlanUiLCBmYWN0b3JzLnBbal0pOworCisgIGlmIChmYWN0b3JzLnBsYXJn ZVsxXSkKKyAgICB7CisgICAgICBwdXRjaGFyICgnICcpOworICAgICAgcHJpbnRfdWludG1heGVz IChmYWN0b3JzLnBsYXJnZVsxXSwgZmFjdG9ycy5wbGFyZ2VbMF0pOworICAgIH0KKyAgcHV0Y2hh ciAoJ1xuJyk7Cit9CisKKy8qIEVtaXQgdGhlIGZhY3RvcnMgb2YgdGhlIGluZGljYXRlZCBudW1i ZXIuICBJZiB3ZSBoYXZlIHRoZSBvcHRpb24gb2YgdXNpbmcKKyAgIGVpdGhlciBhbGdvcml0aG0s IHdlIHNlbGVjdCBvbiB0aGUgYmFzaXMgb2YgdGhlIGxlbmd0aCBvZiB0aGUgbnVtYmVyLgorICAg Rm9yIGxvbmdlciBudW1iZXJzLCB3ZSBwcmVmZXIgdGhlIE1QIGFsZ29yaXRobSBldmVuIGlmIHRo ZSBuYXRpdmUgYWxnb3JpdGhtCisgICBoYXMgZW5vdWdoIGRpZ2l0cywgYmVjYXVzZSB0aGUgYWxn b3JpdGhtIGlzIGJldHRlci4gIFRoZSB0dXJub3ZlciBwb2ludAorICAgZGVwZW5kcyBvbiB0aGUg dmFsdWUuICAqLworc3RhdGljIGJvb2wKK3ByaW50X2ZhY3RvcnMgKGNvbnN0IGNoYXIgKmlucHV0 KQogewogICB1aW50bWF4X3QgdDEsIHQwOwotICBpbnQgZXJyY29kZTsKCiAgIC8qIFRyeSBjb252 ZXJ0aW5nIHRoZSBudW1iZXIgdG8gb25lIG9yIHR3byB3b3Jkcy4gIElmIGl0IGZhaWxzLCB1c2Ug R01QIG9yCiAgICAgIHByaW50IGFuIGVycm9yIG1lc3NhZ2UuICBUaGUgMm5kIGNvbmRpdGlvbiBj aGVja3MgdGhhdCB0aGUgbW9zdAogICAgICBzaWduaWZpY2FudCBiaXQgb2YgdGhlIHR3by13b3Jk IG51bWJlciBpcyBjbGVhciwgaW4gYSB0eXBlc2l6ZSBuZXV0cmFsCiAgICAgIHdheS4gICovCi0g IGVycmNvZGUgPSBzdHJ0bzJ1aW50bWF4ICgmdDEsICZ0MCwgaW5wdXQpOwotICBpZiAoZXJyY29k ZSA9PSAwICYmICgodDEgPDwgMSkgPj4gMSkgPT0gdDEpCi0gICAgewotICAgICAgc3RydWN0IGZh Y3RvcnMgZmFjdG9yczsKLQotICAgICAgcHJpbnRfdWludG1heGVzICh0MSwgdDApOwotICAgICAg cHJpbnRmICgiOiIpOworICBzdHJ0b2xfZXJyb3IgZXJyID0gc3RydG8ydWludG1heCAoJnQxLCAm dDAsIGlucHV0KTsKCi0gICAgICBmYWN0b3IgKHQxLCB0MCwgJmZhY3RvcnMpOwotCi0gICAgICBm b3IgKHVuc2lnbmVkIGludCBqID0gMDsgaiA8IGZhY3RvcnMubmZhY3RvcnM7IGorKykKLSAgICAg ICAgZm9yICh1bnNpZ25lZCBpbnQgayA9IDA7IGsgPCBmYWN0b3JzLmVbal07IGsrKykKLSAgICAg ICAgICBwcmludGYgKCIgJWp1IiwgZmFjdG9ycy5wW2pdKTsKLQotICAgICAgaWYgKGZhY3RvcnMu cGxhcmdlWzFdKQorICBzd2l0Y2ggKGVycikKKyAgICB7CisgICAgY2FzZSBMT05HSU5UX09LOgor ICAgICAgaWYgKCgodDEgPDwgMSkgPj4gMSkgPT0gdDEpCiAgICAgICAgIHsKLSAgICAgICAgICBw cmludGYgKCIgIik7Ci0gICAgICAgICAgcHJpbnRfdWludG1heGVzIChmYWN0b3JzLnBsYXJnZVsx XSwgZmFjdG9ycy5wbGFyZ2VbMF0pOworICAgICAgICAgIGRlYnVnICgiWyVzXSIsIF8oInVzaW5n IHNpbmdsZS1wcmVjaXNpb24gYXJpdGhtZXRpYyIpKTsKKyAgICAgICAgICBwcmludF9mYWN0b3Jz X3NpbmdsZSAodDEsIHQwKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAg ICAgcHV0cyAoIiIpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3Ig KDAsIDAsIF8oIiVzIGlzIG5vdCBhIHZhbGlkIHBvc2l0aXZlIGludGVnZXIiKSwgcXVvdGUgKGlu cHV0KSk7CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICBlbHNlCi0gICAgeworCiAjaWYg SEFWRV9HTVAKLSAgICAgIG1wel90IHQ7Ci0gICAgICBzdHJ1Y3QgbXBfZmFjdG9ycyBmYWN0b3Jz OworICBkZWJ1ZyAoIlslc10iLCBfKCJ1c2luZyBhcmJpdHJhcnktcHJlY2lzaW9uIGFyaXRobWV0 aWMiKSk7CisgIG1wel90IHQ7CisgIHN0cnVjdCBtcF9mYWN0b3JzIGZhY3RvcnM7CgotICAgICAg bXB6X2luaXRfc2V0X3N0ciAodCwgaW5wdXQsIDEwKTsKKyAgbXB6X2luaXRfc2V0X3N0ciAodCwg aW5wdXQsIDEwKTsKCi0gICAgICBnbXBfcHJpbnRmICgiJVpkOiIsIHQpOwotICAgICAgbXBfZmFj dG9yICh0LCAmZmFjdG9ycyk7CisgIGdtcF9wcmludGYgKCIlWmQ6IiwgdCk7CisgIG1wX2ZhY3Rv ciAodCwgJmZhY3RvcnMpOwoKLSAgICAgIGZvciAodW5zaWduZWQgaW50IGogPSAwOyBqIDwgZmFj dG9ycy5uZmFjdG9yczsgaisrKQotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBrID0gMDsgayA8 IGZhY3RvcnMuZVtqXTsgaysrKQotICAgICAgICAgIGdtcF9wcmludGYgKCIgJVpkIiwgZmFjdG9y cy5wW2pdKTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaiA9IDA7IGogPCBmYWN0b3JzLm5mYWN0b3Jz OyBqKyspCisgICAgZm9yICh1bnNpZ25lZCBpbnQgayA9IDA7IGsgPCBmYWN0b3JzLmVbal07IGsr KykKKyAgICAgIGdtcF9wcmludGYgKCIgJVpkIiwgZmFjdG9ycy5wW2pdKTsKCi0gICAgICBtcF9m YWN0b3JfY2xlYXIgKCZmYWN0b3JzKTsKLSAgICAgIG1wel9jbGVhciAodCk7Ci0gICAgICBwdXRz ICgiIik7CisgIG1wX2ZhY3Rvcl9jbGVhciAoJmZhY3RvcnMpOworICBtcHpfY2xlYXIgKHQpOwor ICBwdXRjaGFyICgnXG4nKTsKKyAgcmV0dXJuIHRydWU7CiAjZWxzZQotICAgICAgZnByaW50ZiAo c3RkZXJyLCAiZXJyb3I6IG51bWJlciAlcyBub3QgcGFyc2FibGUgb3IgdG9vIGxhcmdlXG4iLCBp bnB1dCk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOworICBlcnJvciAoMCwgMCwgXygiJXMg aXMgdG9vIGxhcmdlIiksIHF1b3RlIChpbnB1dCkpOworICByZXR1cm4gZmFsc2U7CiAjZW5kaWYK LSAgICB9CiB9Cgotc3RydWN0IGluYnVmCitzdGF0aWMgYm9vbAorZG9fc3RkaW4gKHZvaWQpCiB7 Ci0gIGNoYXIgKmJ1ZjsKLSAgc2l6ZV90IGFsbG9jOwotfTsKKyAgYm9vbCBvayA9IHRydWU7Cisg IHRva2VuX2J1ZmZlciB0b2tlbmJ1ZmZlcjsKKworICBpbml0X3Rva2VuYnVmZmVyICgmdG9rZW5i dWZmZXIpOworCisgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgIHNpemVfdCB0b2tlbl9sZW5n dGggPSByZWFkdG9rZW4gKHN0ZGluLCBERUxJTSwgc2l6ZW9mIChERUxJTSkgLSAxLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRva2VuYnVmZmVyKTsKKyAgICAgIGlm ICh0b2tlbl9sZW5ndGggPT0gKHNpemVfdCkgLTEpCisgICAgICAgIGJyZWFrOworICAgICAgb2sg Jj0gcHJpbnRfZmFjdG9ycyAodG9rZW5idWZmZXIuYnVmZmVyKTsKKyAgICB9CisgIGZyZWUgKHRv a2VuYnVmZmVyLmJ1ZmZlcik7CisKKyAgcmV0dXJuIG9rOworfQoKLS8qIFJlYWQgd2hpdGUtc3Bh Y2UgZGVsaW1pdGVkIGl0ZW1zLiBSZXR1cm4gMSBvbiBzdWNjZXNzLCAwIG9uIEVPRi4KLSAgIEV4 aXQgb24gSS9PIGVycm9ycy4gKi8KIGludAotcmVhZF9pdGVtIChzdHJ1Y3QgaW5idWYgKmJ1ZnN0 cnVjdCkKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKLSAgaW50IGM7Ci0gIHNpemVf dCBpOwotICBjaGFyICpidWYgPSBidWZzdHJ1Y3QtPmJ1ZjsKKyAgaW5pdGlhbGl6ZV9tYWluICgm YXJnYywgJmFyZ3YpOworICBzZXRfcHJvZ3JhbV9uYW1lIChhcmd2WzBdKTsKKyAgc2V0bG9jYWxl IChMQ19BTEwsICIiKTsKKyAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Cisg IHRleHRkb21haW4gKFBBQ0tBR0UpOwoKLSAgZG8KLSAgICBjID0gZ2V0Y2hhcl91bmxvY2tlZCAo KTsKLSAgd2hpbGUgKGlzc3BhY2UgKGMpKTsKKyAgYXRleGl0IChjbG9zZV9zdGRvdXQpOwoKLSAg Zm9yIChpID0gMDsgIWlzc3BhY2UoYyk7IGkrKykKKyAgYWxnID0gQUxHX1BPTExBUkRfUkhPOyAg ICAgICAgLyogRGVmYXVsdCB0byBQb2xsYXJkIHJobyAqLworCisgIGludCBjOworICB3aGlsZSAo KGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgIiIsIGxvbmdfb3B0aW9ucywgTlVMTCkpICE9 IC0xKQogICAgIHsKLSAgICAgIGlmIChjIDwgMCkKKyAgICAgIHN3aXRjaCAoYykKICAgICAgICAg ewotICAgICAgICAgIGlmIChmZXJyb3IgKHN0ZGluKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAg ICAgICAgZnByaW50ZiAoc3RkZXJyLCAicmVhZCBlcnJvciBvbiBzdGRpbjogJXNcbiIsIHN0cmVy cm9yKGVycm5vKSk7Ci0gICAgICAgICAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgICAg ICAgICB9Ci0gICAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAg ICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgICAgIGNhc2Ug VkVSQk9TRV9PUFRJT046CisgICAgICAgICAgdmVyYm9zZSA9IDE7CisgICAgICAgICAgYnJlYWs7 CgotICAgICAgaWYgKFVOTElLRUxZIChidWZzdHJ1Y3QtPmFsbG9jIDw9IGkgKyAxKSkgLyogKzEg Ynl0ZSBmb3IgdGVybWluYXRpbmcgTlVMICovCi0gICAgICAgIHsKLSAgICAgICAgICBidWZzdHJ1 Y3QtPmFsbG9jID0gYnVmc3RydWN0LT5hbGxvYyAqIDUgLyA0ICsgMTsKLSAgICAgICAgICBidWZz dHJ1Y3QtPmJ1ZiA9IHJlYWxsb2MgKGJ1ZnN0cnVjdC0+YnVmLCBidWZzdHJ1Y3QtPmFsbG9jKTsK LSAgICAgICAgICBidWYgPSBidWZzdHJ1Y3QtPmJ1ZjsKLSAgICAgICAgfQorICAgICAgICBjYXNl ICdzJzoKKyAgICAgICAgICBhbGcgPSBBTEdfU1FVRk9GOworICAgICAgICAgIGJyZWFrOwoKLSAg ICAgIGJ1ZltpXSA9IGM7Ci0gICAgICBjID0gZ2V0Y2hhcl91bmxvY2tlZCAoKTsKLSAgICB9Cisg ICAgICAgIGNhc2UgJ3cnOgorICAgICAgICAgIGZsYWdfcHJvdmVfcHJpbWFsaXR5ID0gMDsKKyAg ICAgICAgICBicmVhazsKCi0gIGJ1ZltpXSA9ICdcMCc7Ci0gIHJldHVybiAxOwotfQorICAgICAg ICBjYXNlX0dFVE9QVF9IRUxQX0NIQVI7CgotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJn dltdKQotewotICBpbnQgYzsKKyAgICAgICAgY2FzZV9HRVRPUFRfVkVSU0lPTl9DSEFSIChQUk9H UkFNX05BTUUsIEFVVEhPUlMpOwoKLSAgYWxnID0gQUxHX1BPTExBUkRfUkhPOyAgICAgICAgLyog RGVmYXVsdCB0byBQb2xsYXJkIHJobyAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHVz YWdlIChFWElUX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgfQoKLSAgd2hpbGUgKCAoYyA9IGdl dG9wdChhcmdjLCBhcmd2LCAic3Z3IikpICE9IC0xKQotICAgIHN3aXRjaCAoYykKLSAgICAgIHsK LSAgICAgIGNhc2UgJ3MnOgotICAgICAgICBhbGcgPSBBTEdfU1FVRk9GOwotICAgICAgICBicmVh azsKLSAgICAgIGNhc2UgJ3YnOgotICAgICAgICBmbGFnX3ZlcmJvc2UgPSAxOwotICAgICAgICBi cmVhazsKLSAgICAgIGNhc2UgJ3cnOgotICAgICAgICBmbGFnX3Byb3ZlX3ByaW1hbGl0eSA9IDA7 Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnPyc6Ci0gICAgICAgIHByaW50ZiAoIlVzYWdl OiAlcyBbLXNdIG51bWJlciAuLi5cbiIsIGFyZ3ZbMF0pOwotICAgICAgICByZXR1cm4gRVhJVF9G QUlMVVJFOwotICAgICAgfQogI2lmIFNUQVRfU1FVRk9GCiAgIGlmIChhbGcgPT0gQUxHX1NRVUZP RikKICAgICBtZW1zZXQgKHFfZnJlcSwgMCwgc2l6ZW9mIChxX2ZyZXEpKTsKICNlbmRpZgoKLSAg aWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgZm9yIChpbnQgaSA9IG9wdGluZDsgaSA8IGFyZ2M7IGkr KykKLSAgICAgIGZhY3Rvcl9vbmUgKGFyZ3ZbaV0pOworICBib29sIG9rOworICBpZiAoYXJnYyA8 PSBvcHRpbmQpCisgICAgb2sgPSBkb19zdGRpbiAoKTsKICAgZWxzZQogICAgIHsKLSAgICAgIHN0 cnVjdCBpbmJ1ZiBidWZzdHJ1Y3Q7Ci0gICAgICBidWZzdHJ1Y3QuYWxsb2MgPSA1MDsgICAgIC8q IGVub3VnaCB1bmxlc3MgSEFWRV9HTVAgKi8KLSAgICAgIGJ1ZnN0cnVjdC5idWYgPSBtYWxsb2Mg KGJ1ZnN0cnVjdC5hbGxvYyk7Ci0gICAgICB3aGlsZSAocmVhZF9pdGVtICgmYnVmc3RydWN0KSkK LSAgICAgICAgZmFjdG9yX29uZSAoYnVmc3RydWN0LmJ1Zik7CisgICAgICBvayA9IHRydWU7Cisg ICAgICBmb3IgKGludCBpID0gb3B0aW5kOyBpIDwgYXJnYzsgaSsrKQorICAgICAgICBpZiAoISBw cmludF9mYWN0b3JzIChhcmd2W2ldKSkKKyAgICAgICAgICBvayA9IGZhbHNlOwogICAgIH0KCiAj aWYgU1RBVF9TUVVGT0YKQEAgLTIzOTIsNSArMjQ0MSw1IEBAIG1haW4gKGludCBhcmdjLCBjaGFy ICphcmd2W10pCiAgICAgfQogI2VuZGlmCgotICBleGl0IChFWElUX1NVQ0NFU1MpOworICBleGl0 IChvayA/IEVYSVRfU1VDQ0VTUyA6IEVYSVRfRkFJTFVSRSk7CiB9CmRpZmYgLS1naXQgYS9zcmMv bG9jYWwubWsgYi9zcmMvbG9jYWwubWsKaW5kZXggYmNkNjAyYS4uNmEwMWVmMSAxMDA2NDQKLS0t IGEvc3JjL2xvY2FsLm1rCisrKyBiL3NyYy9sb2NhbC5tawpAQCAtMTM1LDYgKzEzNSwxMiBAQCBz cmNfbGlua19MREFERCA9ICQoTERBREQpCiBzcmNfbG5fTERBREQgPSAkKExEQUREKQogc3JjX2xv Z25hbWVfTERBREQgPSAkKExEQUREKQogc3JjX2xzX0xEQUREID0gJChMREFERCkKKworIyBUaGlz IG11c3QgKm5vdCogZGVwZW5kIG9uIGFueXRoaW5nIGluIGxpYi8sIHNpbmNlIGl0IGlzIHVzZWQg dG8gZ2VuZXJhdGUKKyMgc3JjL3ByaW1lcy5oLiAgSWYgaXQgZGVwZW5kZWQgb24gbGliY29yZXV0 aWxzLmEsIHRoYXQgd291bGQgcHVsbCBhbGwgbGliLyouYworIyBpbnRvIEJVSUxUX1NPVVJDRVMu CitzcmNfbWFrZV9wcmltZV9saXN0X0xEQUREID0KKwogc3JjX21kNXN1bV9MREFERCA9ICQoTERB REQpCiBzcmNfbWtkaXJfTERBREQgPSAkKExEQUREKQogc3JjX21rZmlmb19MREFERCA9ICQoTERB REQpCkBAIC0zNzMsNiArMzc5LDcgQEAgc3JjL2RpcmNvbG9ycy5oOiBzcmMvZGNnZW4gc3JjL2Rp cmNvbG9ycy5oaW4KIAkkKEFNX1ZfYXQpbXYgJEAtdCAkQAoKIEJVSUxUX1NPVVJDRVMgKz0gc3Jj L3ByaW1lcy5oCitDTEVBTkZJTEVTICs9IHNyYy9wcmltZXMuaAogc3JjL3ByaW1lcy5oOiBzcmMv bWFrZS1wcmltZS1saXN0CiAJJChBTV9WX0dFTilybSAtZiAkQCAkQC10CiAJJChBTV9WX2F0KXNy Yy9tYWtlLXByaW1lLWxpc3QgNTAwMCA+ICRALXQKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhY3Rvci9y dW4uc2ggYi90ZXN0cy9mYWN0b3IvcnVuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAw MDAwMDAuLjRhZWNkODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mYWN0b3IvcnVuLnNoCkBA IC0wLDAgKzEsMzAgQEAKKyMhL2Jpbi9zaAorIyBUZXN0IHRoZSBmYWN0b3IgcmV3cml0ZS4KKyMg RXhwZWN0IHRvIGJlIGludm9rZWQgdmlhIGEgZmlsZSB3aG9zZSBiYXNlbmFtZSBtYXRjaGVzCisj IC9eKFxkKylcLShcZCspXC0oW1xkYS1mXXs0MH0pXC5zaCQvCisjIFRoZSB0ZXN0IGlzIHRvIHJ1 biB0aGlzIGNvbW1hbmQKKyMgc2VxICQxICQyIHwgZmFjdG9yIHwgc2hhc3VtIC1jIC0tc3RhdHVz IDwoZWNobyAkMyAgLSkKKyMgSS5lLiwgdG8gZW5zdXJlIHRoYXQgdGhlIGZhY3Rvcml6YXRpb25z IG9mIGludGVnZXJzICQxLi4kMgorIyBtYXRjaCB3aGF0IHdlIGV4cGVjdC4KKworIyBDb3B5cmln aHQgKEMpIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKy4gIiR7c3JjZGly PS59L3Rlc3RzL2luaXQuc2giOyBwYXRoX3ByZXBlbmRfIC4vc3JjCisKKyMgRG9uJ3QgcnVuIHRo ZXNlIHRlc3RzIGJ5IGRlZmF1bHQuCit2ZXJ5X2V4cGVuc2l2ZV8KKworcHJpbnRfdmVyXyBmYWN0 b3Igc2VxCisKKyMgUmVtb3ZlIHRoZSAiLnNoIiBzdWZmaXg6Cit0PSR7TUVfJS5zaH0KKworIyBN YWtlIElGUyBpbmNsdWRlICItIiwgc28gdGhhdCBhIHNpbXBsZSAic2V0IiB3aWxsIHNlcGFyYXRl IHRoZSBhcmdzOgorSUZTPS0kSUZTCitzZXQgJHQKK2VjaG8gIiQzICAtIiA+IGV4cAorCitmYWls PTEKK3NlcSAkMSAkMiB8IGZhY3RvciB8IHNoYXN1bSAtYyAtLXN0YXR1cyBleHAgJiYgZmFpbD0w CisKK0V4aXQgJGZhaWwKZGlmZiAtLWdpdCBhL3Rlc3RzL2xvY2FsLm1rIGIvdGVzdHMvbG9jYWwu bWsKaW5kZXggNTU3MDBiNS4uOGRhNDc0MSAxMDA2NDQKLS0tIGEvdGVzdHMvbG9jYWwubWsKKysr IGIvdGVzdHMvbG9jYWwubWsKQEAgLTE2LDkgKzE2LDkgQEAKICMjIGFsb25nIHdpdGggdGhpcyBw cm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKICMg SW5kaXJlY3Rpb25zIHJlcXVpcmVkIHNvIHRoYXQgd2UnbGwgc3RpbGwgYmUgYWJsZSB0byBrbm93 IHRoZQotIyBjb21wbGV0ZSBsaXN0IG9mIG91ciB0ZXN0cyBldmVuIGlmIHRoZSB1c2VyIG92ZXJy aWRlIFRFU1RTIGZyb20gdGhlCi0jIGNvbW1hbmQgbGluZSAod2hpY2ggaGUncyBhbGxvd2VkIHRv IGRvIGJ5IHRoZSB0ZXN0IGhhcm5lc3MgQVBJKS4KLVRFU1RTID0gJChhbGxfdGVzdHMpCisjIGNv bXBsZXRlIGxpc3Qgb2Ygb3VyIHRlc3RzIGV2ZW4gaWYgdGhlIHVzZXIgb3ZlcnJpZGVzIFRFU1RT CisjIGZyb20gdGhlIGNvbW1hbmQgbGluZSAoYXMgcGVybWl0dGVkIGJ5IHRoZSB0ZXN0IGhhcm5l c3MgQVBJKS4KK1RFU1RTID0gJChhbGxfdGVzdHMpICQoZmFjdG9yX3Rlc3RzKQogcm9vdF90ZXN0 cyA9ICQoYWxsX3Jvb3RfdGVzdHMpCgogRVhUUkFfRElTVCArPSAkKGFsbF90ZXN0cykKQEAgLTg5 LDE0ICs4OSwxNSBAQCBURVNUU19FTlZJUk9OTUVOVCA9CQkJCVwKIFZFUkJPU0UgPSB5ZXMKCiBF WFRSQV9ESVNUICs9CQkJXAorICBpbml0LmNmZwkJCVwKICAgdGVzdHMvQ29yZXV0aWxzLnBtCQlc CiAgIHRlc3RzL0N1U2tpcC5wbQkJXAogICB0ZXN0cy9DdVRtcGRpci5wbQkJXAogICB0ZXN0cy9k X3R5cGUtY2hlY2sJCVwKICAgdGVzdHMvZW52dmFyLWNoZWNrCQlcCisgIHRlc3RzL2ZhY3Rvci9y dW4uc2gJCVwKICAgdGVzdHMvZmlsZWZyYWctZXh0ZW50LWNvbXBhcmUgXAogICB0ZXN0cy9maWVt YXAtY2FwYWJsZQkJXAotICBpbml0LmNmZwkJCVwKICAgdGVzdHMvaW5pdC5zaAkJCVwKICAgdGVz dHMvbGFuZy1kZWZhdWx0CQlcCiAgIHRlc3RzL25vLXBlcmwJCQlcCkBAIC02MjMsNiArNjI0LDY2 IEBAIGFsbF90ZXN0cyA9CQkJCQlcCiAgIHRlc3RzL3RvdWNoL3RyYWlsaW5nLXNsYXNoLnNoCQkJ XAogICAkKGFsbF9yb290X3Rlc3RzKQoKKyMgcHJlZml4IG9mIDJeNjQKK3AgPSAxODQ0Njc0NDA3 MzcKKyMgcHJlZml4IG9mIDJeOTYKK3EgPSA3OTIyODE2MjUxNDI2NDMzNzU5MzU0MworCisjIEVh Y2ggb2YgdGhlc2UgbnVtYmVycyBoYXMgYSBQb2xsYXJkIHJobyBmYWN0b3IgbGFyZ2VyIHRoYW4g Ml42NCwKKyMgYW5kIHRodXMgZXhlcmNpc2VzIHNvbWUgaGFyZC10by1yZWFjaCBjb2RlIGluIGZh Y3Rvci5jLgordDEgPSAxNzAxNDExODM0NjA0NjkyMjU0NTA1NzA5NDY2MTc3ODE3NDQ0ODkKK3Qy ID0gMTcwMTQxMTgzNDYwNDY5MjI5NTQ1NzQ4MTMwOTgxMzAyMjIzODg3CisjIEZhY3RvcnMgb2Yg dGhlIGFib3ZlOgorIyB0MTogOTIyMzM3MjAzNjg1NDc3NTQyMSAxODQ0Njc0NDA3MzcwOTU1MTcw OQorIyB0MjogOTIyMzM3MjAzNjg1NDc3NTY0MyAxODQ0Njc0NDA3MzcwOTU1MTcwOQorCisjIEVh Y2ggdGVzdHMgaXMgYSB0cmlwbGU6IGxvLCBoaSwgc2hhMSBvZiByZXN1bHQuCisjIFRoZSB0ZXN0 IHNjcmlwdCwgcnVuLnNoLCBydW5zIHNlcSBsbyBoaXxmYWN0b3J8c2hhMXN1bQorIyBhbmQgdmVy aWZpZXMgdGhhdCB0aGUgYWN0dWFsIGFuZCBleHBlY3RlZCBjaGVja3N1bXMgYXJlIHRoZSBzYW1l LgorZmFjdG9yX3Rlc3RzID0gXAorICAwLTEwMDAwMDAwLWE0NTEyNDQ1MjJiMWI2NjJjODZjYjNj YmI1NWFlZTNlMDg1YTYxYTAuc2ggXAorICAxMDAwMDAwMC0yMDAwMDAwMC1jNzkyYTJlMDJmMWM4 NTM2YjUxMjFmNjI0YjA0MDM5ZDIwMTg3MDE2LnNoIFwKKyAgMjAwMDAwMDAtMzAwMDAwMDAtODEx NWU4ZGZmOTdkMTY3NDEzNGVjMDU0NTk4ZDkzOWEyYTVmNjExMy5zaCBcCisgIDMwMDAwMDAwLTQw MDAwMDAwLWZlN2I4MzJjOGUwZWQ1NTAzNTE1MmMwZjllYmQ1OWRlNzMyMjRhNjAuc2ggXAorICA0 MDAwMDAwMC01MDAwMDAwMC1iODc4NmQ2NmM0MzJlNDhiYzViMzQyZWUzYzY3NTJiN2YwOTZmMjA2 LnNoIFwKKyAgNTAwMDAwMDAtNjAwMDAwMDAtYTc0ZmU1MThjNWY3OTg3M2MyYjkwMTY3NDViODhi NDJjOGZkM2VkZS5zaCBcCisgIDYwMDAwMDAwLTcwMDAwMDAwLTY4OWJjNzBkNjgxNzkxZTVkMWI4 YWMxMzE2YTA1ZDBjNDQ3M2Q2ZGIuc2ggXAorICA3MDAwMDAwMC04MDAwMDAwMC1kMzcwODA4ZjJh YjhjODY1ZjY0YzJmZjkwOWM1NzIyZGI1YjdkNThkLnNoIFwKKyAgODAwMDAwMDAtOTAwMDAwMDAt Nzk3OGFhNjZiZjJiZGI0NDYzOTgzMzZlYTZmMDI2MDVlOWE3NzU4MS5zaCBcCisgICQodDEpLSQo dDEpLTQ2MjIyODdjNWYwNDBjZGI3YjNiYmU0ZDE5ZDI5YTcxYWIyNzc4Mjcuc2ggXAorICAkKHQy KS0kKHQyKS1kZWEzMDgyNTM3MDhiNTdhZmFkMzU3ZThjMGQyYTExMTQ2MGVmNTBlLnNoIFwKKyAg JChwKTA4NTUxNjE2LSQocCkwODY1MTYxNS02NmM1N2NkNThmNGZiNTcyZGY3ZjA4OGQxN2U0ZjRj MWQ0ZjAxYmIxXAorICAkKHApMDg2NTE2MTYtJChwKTA4NzUxNjE1LTcyOTIyOGU2OTNiMWE1Njhl Y2M4NWIxOTk5Mjc0MjRjN2QxNmQ0MTAuc2ggXAorICAkKHApMDg3NTE2MTYtJChwKTA4ODUxNjE1 LTVhMGM5ODUwMTdjMmQyODVlNDY5OGY4MzZmNWEwNTllMGI2ODQ1NjMuc2ggXAorICAkKHApMDg4 NTE2MTYtJChwKTA4OTUxNjE1LTA0ODIyOTVjNTE0ZTM3MWM5OGNlOWZkMzM1ZGVlZDBjOWM0NGE0 ZjQuc2ggXAorICAkKHApMDg5NTE2MTYtJChwKTA5MDUxNjE1LTljMGUxMTA1YWM3YzQ1ZTI3ZTdi YmViNWUyMTNmNTMwZDJhZDFhNzEuc2ggXAorICAkKHApMDkwNTE2MTYtJChwKTA5MTUxNjE1LTYw NDM2NmQyYjFkNzUzNzFkMDY3OWU2YTY4OTYyZDY2MzM2Y2QzODMuc2ggXAorICAkKHApMDkxNTE2 MTYtJChwKTA5MjUxNjE1LTkxOTJkMmJkZWU5MzAxMzViMjhkNzE2MGU2ZDM5NWE3MDI3ODcxZGEu c2ggXAorICAkKHApMDkyNTE2MTYtJChwKTA5MzUxNjE1LWJjZjU2YWU1NWQyMGQ3MDA2OTBjZmY0 ZDMzMjdiNzhmODNmYzAxYmYuc2ggXAorICAkKHApMDkzNTE2MTYtJChwKTA5NDUxNjE1LTE2YjEw NjM5ODc0OWU1ZjI0ZDI3OGJhN2M1ODIyOWFlNDNmNjUwYWMuc2ggXAorICAkKHApMDk0NTE2MTYt JChwKTA5NTUxNjE1LWFkMmM2ZWQ2MzUyNWY4ZTdjODNjNGM0MTZlNzcxNWZhMWJlYmM1NGMuc2gg XAorICAkKHApMDk1NTE2MTYtJChwKTA5NjUxNjE1LTJiNmY5YzExNzQyZDlkZTA0NTUxNWE2NjI3 YzI3YTA0MmM0OWY4YmEuc2ggXAorICAkKHApMDk2NTE2MTYtJChwKTA5NzUxNjE1LTU0ODUxYWNk NTFjNDgxOWJlYjY2NmUyNmJjMDEwMGRjOWFkYmMzMTAuc2ggXAorICAkKHApMDk3NTE2MTYtJChw KTA5ODUxNjE1LTY5MzljMmE3YWZkMmQ4MWY0NWY4MThhMTU5YjdjNTIyNmY4M2E1MGIuc2ggXAor ICAkKHApMDk4NTE2MTYtJChwKTA5OTUxNjE1LTBmMmM4YmMwMTFkMmE0NWUyYWZhMDE0NTkzOTFl Njg4NzMzNjNjNmMuc2ggXAorICAkKHApMDk5NTE2MTYtJChwKTEwMDUxNjE1LTYzMGRjMmFkNzJm NGMyMjJiYWQxNDA1ZTZjNWJlYTU5MGY5MmE5OGMuc2ggXAorICAkKHEpOTQwMzM2LSQocSk5NDIz MzUtNjNjYmQ2MzEzZDc4MjQ3YjA0ZDYzYmJiYWM1MGNiOGY4ZDMzZmY3MS5zaCBcCisgICQocSk5 NDIzMzYtJChxKTk0NDMzNS0wZDAzZDYzNjUzNzY3MTczMTgyNDkxYjg2ZmExOGY4ZjY4MGJiMDM2 LnNoIFwKKyAgJChxKTk0NDMzNi0kKHEpOTQ2MzM1LWNhNDNiZDM4Y2Q5Zjk3Y2M1YmI2MzYxM2Ni MTk2NDM1Nzg2NDBmMGIuc2ggXAorICAkKHEpOTQ2MzM2LSQocSk5NDgzMzUtODZkNTk1NDVhMGMx MzU2N2ZhOTY4MTE4MjFlYTVjZGU5NTA2MTFiMS5zaCBcCisgICQocSk5NDgzMzYtJChxKTk1MDMz NS1jMzc0MGU3MDJmYTljOTdlNmNmMDAxNTA4NjBlMGI5MzZhMTQxYTZiLnNoIFwKKyAgJChxKTk1 MDMzNi0kKHEpOTUyMzM1LTU1MWMzYzRjNDY0MGQ4NmZkYTMxMWI1YzMwMDZkYWM0NTUwNWMwY2Uu c2ggXAorICAkKHEpOTUyMzM2LSQocSk5NTQzMzUtYjFiMGIwMDQ2M2MyZjg1M2Q3MGVmOWM0Zjdh OTZkZTVjYjYxNDE1Ni5zaCBcCisgICQocSk5NTQzMzYtJChxKTk1NjMzNS04OTM4YTQ4NGE5ZWY2 YmIxNjQ3ODA5MWQyOTRmY2RlOWY4ZWNlYTY5LnNoIFwKKyAgJChxKTk1NjMzNi0kKHEpOTU4MzM1 LWQxYWU2YmM3MTJkOTk0ZjM1ZWRmNTVjNzg1ZDcxZGRmMzFmMTY1MzUuc2ggXAorICAkKHEpOTU4 MzM2LSQocSk5NjAzMzUtMjM3NDkxOWE4OTE5NmUxZmNlOTNhZGZlNzc5Y2I0NjY0NTU2ZDRiNi5z aCBcCisgICQocSk5NjAzMzYtJChxKTk2MjMzNS01NjllNDM2M2U4ZDllODgzMGExODdkOWFiMjcz NjVlZWYwOGFiZGUxCisKKyQoZmFjdG9yX3Rlc3RzKTogdGVzdHMvZmFjdG9yL3J1bi5zaAorCSQo QU1fVl9HRU4pbG4gLWYgJChzcmNkaXIpL3Rlc3RzL2ZhY3Rvci9ydW4uc2ggJEAKKworQ0xFQU5G SUxFUyArPSAkKGZhY3Rvcl90ZXN0cykKKwogcHJfZGF0YSA9CQkJCQlcCiAgIHRlc3RzL3ByLzBG CQkJCQlcCiAgIHRlc3RzL3ByLzBGRgkJCQkJXAotLSAKMS43LjEyLjEuMzgyLmdiMDU3NmE2CgoK RnJvbSAyY2JhZjUwOTk5YWQyZjE4OGRkYmZiZWMzMjMxMmUzYWFhNzJjOWE2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKaW0gTWV5ZXJpbmcgPG1leWVyaW5nQHJlZGhhdC5jb20+CkRh dGU6IFdlZCwgMTkgU2VwIDIwMTIgMDg6MjE6MTIgKzAyMDAKU3ViamVjdDogW1BBVENIIDA3LzEz XSBtYWludDogdXNlIF9fYnVpbHRpbl9leHBlY3Qgb25seSBpZiBfX0dOVUNfXwoKKiBzcmMvZmFj dG9yLmMgKExJS0VMWSwgVU5MSUtFTFkpIFtfX0dOVUNfX106IEFkZCAjaWZkZWYgZ3VhcmQuCi0t LQogc3JjL2ZhY3Rvci5jIHwgOSArKysrKysrLS0KIDEgZmlsZSBjaGFuZ2VkLCA3IGluc2VydGlv bnMoKyksIDIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2ZhY3Rvci5jIGIvc3JjL2Zh Y3Rvci5jCmluZGV4IGNlMzRlMTYuLmFiZmY1MGEgMTAwNjQ0Ci0tLSBhL3NyYy9mYWN0b3IuYwor KysgYi9zcmMvZmFjdG9yLmMKQEAgLTY1MCw4ICs2NTAsMTMgQEAgc3RhdGljIGludCBmbGFnX3By b3ZlX3ByaW1hbGl0eSA9IDE7CiAvKiBOdW1iZXIgb2YgTWlsbGVyLVJhYmluIHRlc3RzIHRvIHJ1 biB3aGVuIG5vdCBwcm92aW5nIHByaW1hbGl0eS4gKi8KICNkZWZpbmUgTVJfUkVQUyAyNQoKLSNk ZWZpbmUgTElLRUxZKGNvbmQpICAgIF9fYnVpbHRpbl9leHBlY3QgKChjb25kKSAhPSAwLCAxKQot I2RlZmluZSBVTkxJS0VMWShjb25kKSAgX19idWlsdGluX2V4cGVjdCAoKGNvbmQpICE9IDAsIDAp CisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIExJS0VMWShjb25kKSAgICBfX2J1aWx0aW5fZXhw ZWN0ICgoY29uZCksIDEpCisjIGRlZmluZSBVTkxJS0VMWShjb25kKSAgX19idWlsdGluX2V4cGVj dCAoKGNvbmQpLCAwKQorI2Vsc2UKKyMgZGVmaW5lIExJS0VMWShjb25kKSAgICAoY29uZCkKKyMg ZGVmaW5lIFVOTElLRUxZKGNvbmQpICAoY29uZCkKKyNlbmRpZgoKIHN0YXRpYyB2b2lkCiBkZWJ1 ZyAoY2hhciBjb25zdCAqZm10LCAuLi4pCi0tIAoxLjcuMTIuMS4zODIuZ2IwNTc2YTYKCgpGcm9t IDExMTM1NGIwZTc5ZDUzOGZlZTc0ODUwNDExMWUxMGEwYTRhNjg5NTEgTW9uIFNlcCAxNyAwMDow MDowMCAyMDAxCkZyb206IEppbSBNZXllcmluZyA8bWV5ZXJpbmdAcmVkaGF0LmNvbT4KRGF0ZTog TW9uLCAxNyBTZXAgMjAxMiAyMjowNzozOSArMDIwMApTdWJqZWN0OiBbUEFUQ0ggMDgvMTNdIG1h aW50OiBzeW50YXgtY2hlY2s6IGFkZCBtYWtlLXByaW1lLWxpc3QgZXhlbXB0aW9ucwoKKiBjZmcu bWs6IEV4ZW1wdCBydW4uc2ggZnJvbSB0aGUgdGVzdC1saXN0LWNvbnNpc3RlbmN5IHRlc3QuCkV4 ZW1wdCBtYWtlLXByaW1lLWxpc3QuYyBmcm9tIG51bWVyb3VzIHRlc3RzLCBzaW5jZSB3ZSB3b24n dApiZSBtYWtpbmcgaXQgY29uZm9ybTogaXQgbXVzdCBub3QgbGluayB3aXRoIGxpYmNvcmV1dGls cy5hLgpFeGVtcHQgZmFjdG9yLmMgZnJvbSB0aGUgbm8tdXBwZXItY2FzZSBlcnJvciBtZXNzYWdl IHRlc3QuCiogc3JjL2ZhY3Rvci5jOiBSZW1vdmUgYSBzdHJheSAiLiIgYXQgZW5kIG9mIGRpYWdu b3N0aWMuCiogc3JjL21ha2UtcHJpbWUtbGlzdC5jOiBJbnNlcnQgc3BhY2VzIGJlZm9yZSBwYXJl bnMuCihtYWluKTogQWJvcnQgaWYgdGhlIDgtZGVsdGEgdmFsdWUgZXZlciBleGNlZWRzIDI1NS4K KiB0ZXN0cy9mYWN0b3IvcnVuLnNoOiBVc2UgImYiIHJhdGhlciB0aGFuICJmYWlsIgp0byBhdm9p ZCBhIGJvZ3VzIHN5bnRheC1jaGVjayBmYWlsdXJlLgotLS0KIGNmZy5tayAgICAgICAgICAgICAg ICB8IDEwICsrKysrKystLS0KIHNyYy9mYWN0b3IuYyAgICAgICAgICB8ICAyICstCiBzcmMvbWFr ZS1wcmltZS1saXN0LmMgfCAxOCArKysrKysrKysrLS0tLS0tLS0KIHRlc3RzL2ZhY3Rvci9ydW4u c2ggICB8ICA2ICsrKy0tLQogNCBmaWxlcyBjaGFuZ2VkLCAyMSBpbnNlcnRpb25zKCspLCAxNSBk ZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9jZmcubWsgYi9jZmcubWsKaW5kZXggODcwZjM5Zi4u NGI0ZDBiNyAxMDA2NDQKLS0tIGEvY2ZnLm1rCisrKyBiL2NmZy5tawpAQCAtMTExLDcgKzExMSw3 IEBAIHNjX3Rlc3RzX2xpc3RfY29uc2lzdGVuY3k6CiAJICBmb3IgdCBpbiAkKGFsbF90ZXN0cyk7 IGRvIGVjaG8gJCR0OyBkb25lOwkJCVwKIAkgIGNkICQodG9wX3NyY2Rpcik7CQkJCQkJXAogCSAg JChTSEVMTCkgYnVpbGQtYXV4L3ZjLWxpc3QtZmlsZXMgdGVzdHMJCQlcCi0JICAgIHwgZ3JlcCAt diAnXnRlc3RzL2luaXRcLnNoJCQnCQkJCVwKKwkgICAgfCBncmVwIC1FdiAnXnRlc3RzLyhmYWN0 b3IvcnVufGluaXQpXC5zaCQkJwkJCVwKIAkgICAgfCAkKEVHUkVQKSAiJCR0ZXN0X2V4dGVuc2lv bnNfcnhcJCQiOwkJCVwKIAl9IHwgc29ydCB8IHVuaXEgLXUgfCBncmVwIC4gJiYgZXhpdCAxOyA6 CgpAQCAtNTE5LDcgKzUxOSw3IEBAIGV4Y2x1ZGVfZmlsZV9uYW1lX3JlZ2V4cC0tc2NfYmluZHRl eHRkb21haW4gPSBcCiAgIF4oZ2wvLip8bGliL2V1aWRhY2Nlc3Mtc3RhdHxzcmMvbWFrZS1wcmlt ZS1saXN0KVwuYyQkCiBleGNsdWRlX2ZpbGVfbmFtZV9yZWdleHAtLXNjX3RyYWlsaW5nX2JsYW5r ID0gXnRlc3RzL3ByLwogZXhjbHVkZV9maWxlX25hbWVfcmVnZXhwLS1zY19zeXN0ZW1faF9oZWFk ZXJzID0gXAotICBec3JjLygoc3lzdGVtfGNvcHkpXC5ofGxpYnN0ZGJ1ZlwuYykkJAorICBec3Jj Lygoc3lzdGVtfGNvcHkpXC5ofGxpYnN0ZGJ1ZlwuY3xtYWtlLXByaW1lLWxpc3RcLmMpJCQKCiBf c3JjID0gKGZhbHNlfGxicmFja2V0fGxzLShkaXJ8bHN8dmRpcil8dGFjLXBpcGV8dW5hbWUtKGFy Y2h8dW5hbWUpKQogZXhjbHVkZV9maWxlX25hbWVfcmVnZXhwLS1zY19yZXF1aXJlX2NvbmZpZ19o X2ZpcnN0ID0gXApAQCAtNTMxLDcgKzUzMSw4IEBAIGV4Y2x1ZGVfZmlsZV9uYW1lX3JlZ2V4cC0t c2NfcG9fY2hlY2sgPSBeZ2wvCiBleGNsdWRlX2ZpbGVfbmFtZV9yZWdleHAtLXNjX3Byb2hpYml0 X2Fsd2F5cy1kZWZpbmVkX21hY3JvcyA9IFwKICAgXnNyYy8oc2VxfHJlbW92ZSlcLmMkJAogZXhj bHVkZV9maWxlX25hbWVfcmVnZXhwLS1zY19wcm9oaWJpdF9lbXB0eV9saW5lc19hdF9FT0YgPSBe dGVzdHMvcHIvCi1leGNsdWRlX2ZpbGVfbmFtZV9yZWdleHAtLXNjX3Byb2dyYW1fbmFtZSA9IF4o Z2wvLip8bGliL2V1aWRhY2Nlc3Mtc3RhdClcLmMkJAorZXhjbHVkZV9maWxlX25hbWVfcmVnZXhw LS1zY19wcm9ncmFtX25hbWUgPSBcCisgIF4oZ2wvLip8bGliL2V1aWRhY2Nlc3Mtc3RhdHxzcmMv bWFrZS1wcmltZS1saXN0KVwuYyQkCiBleGNsdWRlX2ZpbGVfbmFtZV9yZWdleHAtLXNjX2ZpbGVf c3lzdGVtID0gXAogICBORVdTfF4oaW5pdFwuY2ZnfHNyYy9kZlwuY3x0ZXN0cy9kZi9kZi1QXC5z aCkkJAogZXhjbHVkZV9maWxlX25hbWVfcmVnZXhwLS1zY19wcm9oaWJpdF9hbHdheXNfdHJ1ZV9o ZWFkZXJfdGVzdHMgPSBcCkBAIC01NjcsNiArNTY4LDkgQEAgZXhjbHVkZV9maWxlX25hbWVfcmVn ZXhwLS1zY19wcm9oaWJpdF90ZXN0X2JhY2t0aWNrcyA9IFwKIGV4Y2x1ZGVfZmlsZV9uYW1lX3Jl Z2V4cC0tc2NfcHJvaGliaXRfb3BlcmF0b3JfYXRfZW5kX29mX2xpbmUgPSBcCiAgIF5zcmMvKHB0 eHx0ZXN0fGhlYWQpXC5jJCQKCitleGNsdWRlX2ZpbGVfbmFtZV9yZWdleHAtLXNjX2Vycm9yX21l c3NhZ2VfdXBwZXJjYXNlID0gXnNyYy9mYWN0b3JcLmMkJAorZXhjbHVkZV9maWxlX25hbWVfcmVn ZXhwLS1zY19wcm9oaWJpdF9hdG9pX2F0b2YgPSBec3JjL21ha2UtcHJpbWUtbGlzdFwuYyQkCisK ICMgQXVnbWVudCBBTV9DRkxBR1MgdG8gaW5jbHVkZSBvdXIgcGVyLWRpcmVjdG9yeSBhbmQgcGVy LWZpbGUgb3B0aW9uczoKIEFNX0NGTEFHUyArPSAkKCQoQEQpX0NGTEFHUykgJCgkPF9DRkxBR1Mp CgpkaWZmIC0tZ2l0IGEvc3JjL2ZhY3Rvci5jIGIvc3JjL2ZhY3Rvci5jCmluZGV4IGFiZmY1MGEu LmI3NmUwYzggMTAwNjQ0Ci0tLSBhL3NyYy9mYWN0b3IuYworKysgYi9zcmMvZmFjdG9yLmMKQEAg LTIwMzYsNyArMjAzNiw3IEBAIGZhY3Rvcl91c2luZ19zcXVmb2YgKHVpbnRtYXhfdCBuMSwgdWlu dG1heF90IG4wLCBzdHJ1Y3QgZmFjdG9ycyAqZmFjdG9ycykKICAgICAgICAgICAgICAgaWYgKGcg PD0gTCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICBpZiAocXBvcyA+PSBR VUVVRV9TSVpFKQotICAgICAgICAgICAgICAgICAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBf KCJzcXVmb2YgcXVldWUgb3ZlcmZsb3cuIikpOworICAgICAgICAgICAgICAgICAgICBlcnJvciAo RVhJVF9GQUlMVVJFLCAwLCBfKCJzcXVmb2YgcXVldWUgb3ZlcmZsb3ciKSk7CiAgICAgICAgICAg ICAgICAgICBxdWV1ZVtxcG9zXS5RID0gZzsKICAgICAgICAgICAgICAgICAgIHF1ZXVlW3Fwb3Nd LlAgPSBQICUgZzsKICAgICAgICAgICAgICAgICAgIHFwb3MrKzsKZGlmZiAtLWdpdCBhL3NyYy9t YWtlLXByaW1lLWxpc3QuYyBiL3NyYy9tYWtlLXByaW1lLWxpc3QuYwppbmRleCAxZjViM2NlLi41 ODQ4OGM0IDEwMDY0NAotLS0gYS9zcmMvbWFrZS1wcmltZS1saXN0LmMKKysrIGIvc3JjL21ha2Ut cHJpbWUtbGlzdC5jCkBAIC02MCw5ICs2MCw5IEBAIG91dHB1dF9wcmltZXMgKGNvbnN0IHN0cnVj dCBwcmltZSAqcHJpbWVzLCB1bnNpZ25lZCBucHJpbWVzKQoKICAgcHV0cyAoIi8qIEdlbmVyYXRl ZCBmaWxlIC0tIERPIE5PVCBFRElUICovXG4iKTsKCi0gIGlmIChzaXplb2YodWludG1heF90KSA8 PSBzaXplb2YodW5zaWduZWQgbG9uZykpCisgIGlmIChzaXplb2YgKHVpbnRtYXhfdCkgPD0gc2l6 ZW9mICh1bnNpZ25lZCBsb25nKSkKICAgICBzdWZmaXggPSAiVUwiOwotICBlbHNlIGlmIChzaXpl b2YodWludG1heF90KSA8PSBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSkKKyAgZWxzZSBpZiAo c2l6ZW9mICh1aW50bWF4X3QpIDw9IHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKSkKICAgICBz dWZmaXggPSAiVUxMIjsKICAgZWxzZQogICAgIHsKQEAgLTcwLDEzICs3MCwxNSBAQCBvdXRwdXRf cHJpbWVzIChjb25zdCBzdHJ1Y3QgcHJpbWUgKnByaW1lcywgdW5zaWduZWQgbnByaW1lcykKICAg ICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7CiAgICAgfQoKLSNkZWZpbmUgU1ogKGludCkoMipzaXpl b2YodWludG1heF90KSkKKyNkZWZpbmUgU1ogKGludCkoMipzaXplb2YgKHVpbnRtYXhfdCkpCgog ICBmb3IgKGkgPSAwLCBwID0gMjsgaSA8IG5wcmltZXM7IGkrKykKICAgICB7Ci0gICAgICBwcmlu dGYgKCJQKCUydSwgJTN1LCAweCUwKmp4JXMsIDB4JTAqanglcykgLyogJWQgKi9cbiIsCi0gICAg ICAgICAgICAgIHByaW1lc1tpXS5wIC0gcCwKLSAgICAgICAgICAgICAgKGkgKyA4IDwgbnByaW1l cykgPyBwcmltZXNbaSArIDhdLnAgLSBwcmltZXNbaV0ucCA6IDB4ZmYsCisgICAgICB1bnNpZ25l ZCBpbnQgZDggPSBpICsgOCA8IG5wcmltZXMgPyBwcmltZXNbaSArIDhdLnAgLSBwcmltZXNbaV0u cCA6IDB4ZmY7CisgICAgICBpZiAoMjU1IDwgZDgpIC8qIHRoaXMgaGFwcGVucyBhdCA2NjgyMjEg Ki8KKyAgICAgICAgYWJvcnQgKCk7CisgICAgICBwcmludGYgKCJQICglMnUsICUzdSwgMHglMCpq eCVzLCAweCUwKmp4JXMpIC8qICVkICovXG4iLAorICAgICAgICAgICAgICBwcmltZXNbaV0ucCAt IHAsIGQ4LAogICAgICAgICAgICAgICBTWiwgcHJpbWVzW2ldLnBpbnYsIHN1ZmZpeCwKICAgICAg ICAgICAgICAgU1osIHByaW1lc1tpXS5saW0sIHN1ZmZpeCwgcHJpbWVzW2ldLnApOwogICAgICAg cCA9IHByaW1lc1tpXS5wOwpAQCAtMTA3LDcgKzEwOSw3IEBAIG91dHB1dF9wcmltZXMgKGNvbnN0 IHN0cnVjdCBwcmltZSAqcHJpbWVzLCB1bnNpZ25lZCBucHJpbWVzKQogc3RhdGljIHZvaWQgKgog eGFsbG9jIChzaXplX3QgcykKIHsKLSAgdm9pZCAqcCA9IG1hbGxvYyhzKTsKKyAgdm9pZCAqcCA9 IG1hbGxvYyAocyk7CiAgIGlmIChwKQogICAgIHJldHVybiBwOwoKQEAgLTEzMiw3ICsxMzQsNyBA QCBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAgICAgICAgICAgICAgICAiUHJvZHVjZXMg YSBsaXN0IG9mIG9kZCBwcmltZXMgPD0gTElNSVRcbiIsIGFyZ3ZbMF0pOwogICAgICAgcmV0dXJu IEVYSVRfRkFJTFVSRTsKICAgICB9Ci0gIGxpbWl0ID0gYXRvaShhcmd2WzFdKTsKKyAgbGltaXQg PSBhdG9pIChhcmd2WzFdKTsKICAgaWYgKGxpbWl0IDwgMykKICAgICBleGl0IChFWElUX1NVQ0NF U1MpOwoKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhY3Rvci9ydW4uc2ggYi90ZXN0cy9mYWN0b3IvcnVu LnNoCmluZGV4IDRhZWNkODYuLjZmZjI0YzMgMTAwNzU1Ci0tLSBhL3Rlc3RzL2ZhY3Rvci9ydW4u c2gKKysrIGIvdGVzdHMvZmFjdG9yL3J1bi5zaApAQCAtMjQsNyArMjQsNyBAQCBJRlM9LSRJRlMK IHNldCAkdAogZWNobyAiJDMgIC0iID4gZXhwCgotZmFpbD0xCi1zZXEgJDEgJDIgfCBmYWN0b3Ig fCBzaGFzdW0gLWMgLS1zdGF0dXMgZXhwICYmIGZhaWw9MAorZj0xCitzZXEgJDEgJDIgfCBmYWN0 b3IgfCBzaGFzdW0gLWMgLS1zdGF0dXMgZXhwICYmIGY9MAoKLUV4aXQgJGZhaWwKK0V4aXQgJGYK LS0gCjEuNy4xMi4xLjM4Mi5nYjA1NzZhNgoKCkZyb20gODI4YTZjOWY5OGNmM2M1OTVkN2FlY2Q4 YTk0NjZjMjkxYmQzYmU1YyBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKRnJvbTogSmltIE1leWVy aW5nIDxtZXllcmluZ0ByZWRoYXQuY29tPgpEYXRlOiBUdWUsIDE4IFNlcCAyMDEyIDA4OjI2OjE3 ICswMjAwClN1YmplY3Q6IFtQQVRDSCAwOS8xM10gZmFjdG9yOiAyNSUgc3BlZWQtdXAsIG9uIG91 dHB1dAoKKiBzcmMvZmFjdG9yLmMgKHByaW50X2ZhY3RvcnNfc2luZ2xlKTogVXNlIGZwdXRzIGFu ZCB1bWF4dG9zdHIKcmF0aGVyIHRoYW4gcHJpbnRmIHdpdGggIiVqdSIuICBUaGlzIHJlZHVjZWQg dGhlIHRpbWUgcmVxdWlyZWQKdG8gY29tcHV0ZSBhbmQgcHJpbnQgdGhlIGZhY3RvcnMgb2YgdGhl IGZpcnN0IDEwXjcgaW50ZWdlcnMgZnJvbQpvdmVyIDggc2Vjb25kcyB0byA1Ljc1cy4gIFJ1biB0 aGlzIGNvbW1hbmQ6CnNlcSAkKCgxMCoqNykpIHwgZW52IHRpbWUgZmFjdG9yID4gL2Rldi9udWxs Ci0tLQogc3JjL2ZhY3Rvci5jIHwgNiArKysrKy0KIDEgZmlsZSBjaGFuZ2VkLCA1IGluc2VydGlv bnMoKyksIDEgZGVsZXRpb24oLSkKCmRpZmYgLS1naXQgYS9zcmMvZmFjdG9yLmMgYi9zcmMvZmFj dG9yLmMKaW5kZXggYjc2ZTBjOC4uMGUyYjJlMyAxMDA2NDQKLS0tIGEvc3JjL2ZhY3Rvci5jCisr KyBiL3NyYy9mYWN0b3IuYwpAQCAtMjI4OSw3ICsyMjg5LDExIEBAIHByaW50X2ZhY3RvcnNfc2lu Z2xlICh1aW50bWF4X3QgdDEsIHVpbnRtYXhfdCB0MCkKCiAgIGZvciAodW5zaWduZWQgaW50IGog PSAwOyBqIDwgZmFjdG9ycy5uZmFjdG9yczsgaisrKQogICAgIGZvciAodW5zaWduZWQgaW50IGsg PSAwOyBrIDwgZmFjdG9ycy5lW2pdOyBrKyspCi0gICAgICBwcmludGYgKCIgJWp1IiwgZmFjdG9y cy5wW2pdKTsKKyAgICAgIHsKKyAgICAgICAgY2hhciBidWZbSU5UX0JVRlNJWkVfQk9VTkQgKHVp bnRtYXhfdCldOworICAgICAgICBwdXRjaGFyICgnICcpOworICAgICAgICBmcHV0cyAodW1heHRv c3RyIChmYWN0b3JzLnBbal0sIGJ1ZiksIHN0ZG91dCk7CisgICAgICB9CgogICBpZiAoZmFjdG9y cy5wbGFyZ2VbMV0pCiAgICAgewotLSAKMS43LjEyLjEuMzgyLmdiMDU3NmE2CgoKRnJvbSAyNDZl MTVkODNiYjUwNDViNTQwODQyOGM5YmUwYjBjMTMwNTY2MmQxIE1vbiBTZXAgMTcgMDA6MDA6MDAg MjAwMQpGcm9tOiBKaW0gTWV5ZXJpbmcgPG1leWVyaW5nQHJlZGhhdC5jb20+CkRhdGU6IFdlZCwg MTkgU2VwIDIwMTIgMDk6NTQ6MzIgKzAyMDAKU3ViamVjdDogW1BBVENIIDEwLzEzXSBmYWN0b3I6 IGF2b2lkIHdhcm5pbmcgYWJvdXQgdW51c2VkIG1hY3JvCgoqIHNyYy9mYWN0b3IuYyAoX19HTVBf REVDTFNQRUMpOiBEb24ndCBkZWZpbmUgaGVyZQoqIHNyYy9sb25nbG9uZy5oIChfX0dNUF9ERUNM U1BFQyk6IERlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotLS0KIHNyYy9mYWN0b3IuYyAg IHwgMSAtCiBzcmMvbG9uZ2xvbmcuaCB8IDYgKysrKystCiAyIGZpbGVzIGNoYW5nZWQsIDUgaW5z ZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvZmFjdG9yLmMgYi9z cmMvZmFjdG9yLmMKaW5kZXggMGUyYjJlMy4uNjhhNTVlZiAxMDA2NDQKLS0tIGEvc3JjL2ZhY3Rv ci5jCisrKyBiL3NyYy9mYWN0b3IuYwpAQCAtMTQxLDcgKzE0MSw2IEBAIHR5cGVkZWYgdW5zaWdu ZWQgbG9uZyBpbnQgVURJdHlwZTsKICMgZW5kaWYKICMgZGVmaW5lIExPTkdMT05HX1NUQU5EQUxP TkUgICAgIC8qIERvbid0IHJlcXVpcmUgR01QJ3MgbG9uZ2xvbmcuaCBtZGVwIGZpbGVzICovCiAj IGRlZmluZSBBU1NFUlQoeCkgICAgICAgICAgICAgICAvKiBGSVhNRSBtYWtlIGxvbmdsb25nLmgg cmVhbGx5IHN0YW5kYWxvbmUgKi8KLSMgZGVmaW5lIF9fR01QX0RFQ0xTUEVDICAgICAgICAgIC8q IEZJWE1FIG1ha2UgbG9uZ2xvbmcuaCByZWFsbHkgc3RhbmRhbG9uZSAqLwogIyBkZWZpbmUgX19j bHpfdGFiIGZhY3Rvcl9jbHpfdGFiIC8qIFJlbmFtZSB0byBhdm9pZCBnbGliYyBjb2xsaXNpb24g Ki8KICMgaWZuZGVmIF9fR01QX0dOVUNfUFJFUkVRCiAjICBkZWZpbmUgX19HTVBfR05VQ19QUkVS RVEoYSxiKSAxCmRpZmYgLS1naXQgYS9zcmMvbG9uZ2xvbmcuaCBiL3NyYy9sb25nbG9uZy5oCmlu ZGV4IDg0ZTMyZWUuLjRiNWZiMzggMTAwNjQ0Ci0tLSBhL3NyYy9sb25nbG9uZy5oCisrKyBiL3Ny Yy9sb25nbG9uZy5oCkBAIC0xLDcgKzEsNyBAQAogLyogbG9uZ2xvbmcuaCAtLSBkZWZpbml0aW9u cyBmb3IgbWl4ZWQgc2l6ZSAzMi82NCBiaXQgYXJpdGhtZXRpYy4KCiBDb3B5cmlnaHQgMTk5MSwg MTk5MiwgMTk5MywgMTk5NCwgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAw MywKLTIwMDQsIDIwMDUsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uLCBJbmMuCisyMDA0LCAyMDA1LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDExLCAyMDEyIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQogdGVy bXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg YnkgdGhlIEZyZWUKQEAgLTIwNTIsNiArMjA1MiwxMCBAQCBleHRlcm4gVVd0eXBlIG1wbl91ZGl2 X3Fybm5kX3IgKFVXdHlwZSwgVVd0eXBlLCBVV3R5cGUsIFVXdHlwZSAqKTsKICAgICAocSkgPSBf X01QTih1ZGl2X3dfc2RpdikgKCZfX3IsIG5oLCBubCwgZCk7CQkJCVwKICAgICAocikgPSBfX3I7 CQkJCQkJCQlcCiAgIH0gd2hpbGUgKDApCisKKyNpZm5kZWYgX19HTVBfREVDTFNQRUMKKyNkZWZp bmUgX19HTVBfREVDTFNQRUMgLyogZW1wdHkgKi8KKyNlbmRpZgogX19HTVBfREVDTFNQRUMgVVd0 eXBlIF9fTVBOKHVkaXZfd19zZGl2KSAoVVd0eXBlICosIFVXdHlwZSwgVVd0eXBlLCBVV3R5cGUp OwogI2VuZGlmCgotLSAKMS43LjEyLjEuMzgyLmdiMDU3NmE2CgoKRnJvbSA0ZDI0NmM1M2RlNDg0 Mzk5NjQ1ZTQ5NGEwYWJmYTJhYzNlZTI1NDBhIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9t OiBKaW0gTWV5ZXJpbmcgPG1leWVyaW5nQHJlZGhhdC5jb20+CkRhdGU6IFdlZCwgMTkgU2VwIDIw MTIgMTA6MDI6MDAgKzAyMDAKU3ViamVjdDogW1BBVENIIDExLzEzXSBtYWludDogbWFyayBzZXQt YnV0LW5vdC11c2VkIHZhcmlhYmxlcyB3aXRoCiBBVFRSSUJVVEVfVU5VU0VECgoqIHNyYy9mYWN0 b3IuYyAocmVkY2lmeSwgcHJpbWVfcCwgaXNxcnQyKTogTWFyayB0aGVtLCBzbyB3ZQpkb24ndCBo YXZlIHRvIGRpc2FibGUgLVd1bnVzZWQtYnV0LXNldC12YXJpYWJsZS4KLS0tCiBzcmMvZmFjdG9y LmMgfCAxMiArKysrKysrKy0tLS0KIDEgZmlsZSBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDQg ZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2ZhY3Rvci5jIGIvc3JjL2ZhY3Rvci5jCmlu ZGV4IDY4YTU1ZWYuLjYzNGMyOTQgMTAwNjQ0Ci0tLSBhL3NyYy9mYWN0b3IuYworKysgYi9zcmMv ZmFjdG9yLmMKQEAgLTg5OCw3ICs4OTgsNyBAQCBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAg YmludmVydF90YWJsZVsxMjhdID0KIC8qIHggQiAobW9kIG4pLiAqLwogI2RlZmluZSByZWRjaWZ5 KHJfcHJpbSwgciwgbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAogICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnRtYXhfdCBfcmVkY2lmeV9xOyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnRtYXhfdCBfcmVk Y2lmeV9xIEFUVFJJQlVURV9VTlVTRUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAog ICAgIHVkaXZfcXJubmQgKF9yZWRjaWZ5X3EsIHJfcHJpbSwgciwgMCwgbik7ICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAogICB9IHdoaWxlICgwKQoKQEAgLTEyMTUsMTIgKzEyMTUsMTUgQEAg cHJpbWVfcCAodWludG1heF90IG4pCiAgICAgICAgICBvbiBtb3N0IHByb2Nlc3NvcnMsIHNpbmNl IGl0IGF2b2lkcyB1ZGl2X3Fybm5kLiAgSWYgd2UgZ28gZG93biB0aGUKICAgICAgICAgIHVkaXZf cXJubmRfcHJlaW52IHBhdGgsIHRoaXMgY29kZSBzaG91bGQgYmUgcmVwbGFjZWQuICAqLwogICAg ICAgewotICAgICAgICB1aW50bWF4X3QgZHVtbXksIHMxLCBzMDsKKyAgICAgICAgdWludG1heF90 IHMxLCBzMDsKICAgICAgICAgdW11bF9wcG1tIChzMSwgczAsIG9uZSwgYSk7CiAgICAgICAgIGlm IChMSUtFTFkgKHMxID09IDApKQogICAgICAgICAgIGFfcHJpbSA9IHMwICUgbjsKICAgICAgICAg ZWxzZQotICAgICAgICAgIHVkaXZfcXJubmQgKGR1bW15LCBhX3ByaW0sIHMxLCBzMCwgbik7Cisg ICAgICAgICAgeworICAgICAgICAgICAgdWludG1heF90IGR1bW15IEFUVFJJQlVURV9VTlVTRUQ7 CisgICAgICAgICAgICB1ZGl2X3Fybm5kIChkdW1teSwgYV9wcmltLCBzMSwgczAsIG4pOworICAg ICAgICAgIH0KICAgICAgIH0KCiAgICAgICBpZiAoIW1pbGxlcnJhYmluIChuLCBuaSwgYV9wcmlt LCBxLCBrLCBvbmUpKQpAQCAtMTc1MCw3ICsxNzUzLDggQEAgaXNxcnQyICh1aW50bWF4X3Qgbmgs IHVpbnRtYXhfdCBubCkKICAgLyogRG8gd2UgbmVlZCBtb3JlIHRoYW4gb25lIGl0ZXJhdGlvbj8g Ki8KICAgZm9yICg7OykKICAgICB7Ci0gICAgICB1aW50bWF4X3QgcSwgciwgeTsKKyAgICAgIHVp bnRtYXhfdCByIEFUVFJJQlVURV9VTlVTRUQ7CisgICAgICB1aW50bWF4X3QgcSwgeTsKICAgICAg IHVkaXZfcXJubmQgKHEsIHIsIG5oLCBubCwgeCk7CiAgICAgICB5ID0gKHggKyBxKSAvIDI7Cgot LSAKMS43LjEyLjEuMzgyLmdiMDU3NmE2CgoKRnJvbSBkN2JkMGJiNThjYmFjZjNlYjljZDFhNjQ0 ZGY5ODhlZDI0ZjQ1MzU0IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKaW0gTWV5ZXJp bmcgPG1leWVyaW5nQHJlZGhhdC5jb20+CkRhdGU6IFdlZCwgMTkgU2VwIDIwMTIgMTE6MDc6NDEg KzAyMDAKU3ViamVjdDogW1BBVENIIDEyLzEzXSBtYWludDogYXZvaWQgLVdzdWdnZXN0LWF0dHJp YnV0ZT1jb25zdCB3YXJuaW5nCgoqIHNyYy9tYWtlLXByaW1lLWxpc3QuYzogSW5jbHVkZSA8Y29u ZmlnLmg+LgooYmludmVydCk6IEFkZCBfR0xfQVRUUklCVVRFX0NPTlNULgotLS0KIHNyYy9tYWtl LXByaW1lLWxpc3QuYyB8IDQgKysrLQogMSBmaWxlIGNoYW5nZWQsIDMgaW5zZXJ0aW9ucygrKSwg MSBkZWxldGlvbigtKQoKZGlmZiAtLWdpdCBhL3NyYy9tYWtlLXByaW1lLWxpc3QuYyBiL3NyYy9t YWtlLXByaW1lLWxpc3QuYwppbmRleCA1ODQ4OGM0Li42OTE3YmZmIDEwMDY0NAotLS0gYS9zcmMv bWFrZS1wcmltZS1saXN0LmMKKysrIGIvc3JjL21ha2UtcHJpbWUtbGlzdC5jCkBAIC0xNyw2ICsx Nyw4IEBAIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKIHRoaXMgcHJvZ3Jh bS4gIElmIG5vdCwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLwoKKyNpbmNs dWRlIDxjb25maWcuaD4KKwogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+ CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0yOSw3ICszMSw3IEBAIHN0cnVjdCBwcmltZQogICB1 aW50bWF4X3QgbGltOyAvKiBmbG9vcihVSU5UTUFYX01BWCAvIHApICovCiB9OwoKLXN0YXRpYyB1 aW50bWF4X3QKK3N0YXRpYyB1aW50bWF4X3QgX0dMX0FUVFJJQlVURV9DT05TVAogYmludmVydCAo dWludG1heF90IGEpCiB7CiAgIHVpbnRtYXhfdCB4ID0gMHhmNTM5N2RiMSA+PiAoNCooKGEvMikg JiAweDcpKTsKLS0gCjEuNy4xMi4xLjM4Mi5nYjA1NzZhNgoKCkZyb20gYzhmOWNjNmM0ZDQ1N2I1 ZjRhNGZlMTlkMWY2NmUwZjFhNzdmOGI5NSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKRnJvbTog SmltIE1leWVyaW5nIDxtZXllcmluZ0ByZWRoYXQuY29tPgpEYXRlOiBTdW4sIDIzIFNlcCAyMDEy IDExOjMzOjAxICswMjAwClN1YmplY3Q6IFtQQVRDSCAxMy8xM10gbWFpbnQ6IG1ha2UtcHJpbWUt bGlzdDogZG8gbm90IGlnbm9yZSB3cml0ZSBmYWlsdXJlCgotLS0KIHNyYy9tYWtlLXByaW1lLWxp c3QuYyB8IDggKysrKysrKysKIDEgZmlsZSBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKykKCmRpZmYg LS1naXQgYS9zcmMvbWFrZS1wcmltZS1saXN0LmMgYi9zcmMvbWFrZS1wcmltZS1saXN0LmMKaW5k ZXggNjkxN2JmZi4uNDlkYjJiYSAxMDA2NDQKLS0tIGEvc3JjL21ha2UtcHJpbWUtbGlzdC5jCisr KyBiL3NyYy9tYWtlLXByaW1lLWxpc3QuYwpAQCAtMjMsNiArMjMsOCBAQCB0aGlzIHByb2dyYW0u ICBJZiBub3QsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KICNpbmNsdWRl IDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lu Y2x1ZGUgPGVycm5vLmg+CisjdW5kZWYgZmNsb3NlCgogc3RydWN0IHByaW1lCiB7CkBAIC0xNjgs NSArMTcwLDExIEBAIG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKCiAgIG91dHB1dF9wcmlt ZXMgKHByaW1lX2xpc3QsIG5wcmltZXMpOwoKKyAgaWYgKGZlcnJvciAoc3Rkb3V0KSArIGZjbG9z ZSAoc3Rkb3V0KSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJ3cml0ZSBlcnJvcjog JXNcbiIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAg ICB9CisKICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKIH0KLS0gCjEuNy4xMi4xLjM4Mi5nYjA1NzZh NgoK --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 30 10:51:53 2012 Received: (at 12350) by debbugs.gnu.org; 30 Sep 2012 14:51:53 +0000 Received: from localhost ([127.0.0.1]:34787 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TIKs5-0006vt-EX for submit@debbugs.gnu.org; Sun, 30 Sep 2012 10:51:53 -0400 Received: from mx.meyering.net ([88.168.87.75]:44648) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TIKs0-0006vd-Ot for 12350@debbugs.gnu.org; Sun, 30 Sep 2012 10:51:51 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 8B753600A6; Sun, 30 Sep 2012 16:51:20 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <87r4psxxtx.fsf@rho.meyering.net> (Jim Meyering's message of "Sun, 23 Sep 2012 22:56:26 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> <87ehm0o1y2.fsf@rho.meyering.net> <86zk4nieni.fsf@shell.gmplib.org> <86627b1d0q.fsf@shell.gmplib.org> <87r4psxxtx.fsf@rho.meyering.net> Date: Sun, 30 Sep 2012 16:51:20 +0200 Message-ID: <87d313wolz.fsf@rho.meyering.net> Lines: 47 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -4.0 (----) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -4.0 (----) --=-=-= Content-Type: text/plain Jim Meyering wrote: > Torbjorn Granlund wrote: > >> Torbjorn Granlund writes: >> >> Niels and I made more changes, including some needed to silence >> -Wshadow. >> >> Change log entries can be fund in: >> >> http://gmplib.org:8000/factoring/file/61b4eac24ea4/ChangeLog > > Thanks. Here's how I've integrated it so far. > This is not ready to push, but rather just to give you an idea > of what's coming. I'm sure I'll have to adjust things before pushing. There have been a few corrections, and I've fleshed out some log entries. The following series is ready: [PATCH 01/13] build: remove redundant dependency: $(PROGRAMS): [PATCH 02/13] factor: prepare for the new factor program [PATCH 03/13] factor: new implementation; not yet integrated [PATCH 04/13] build: add rules to build the new factor program [PATCH 05/13] factor: improvements from [PATCH 06/13] factor: merge with preexisting factor, integrate [PATCH 07/13] maint: use __builtin_expect only if __GNUC__ [PATCH 08/13] maint: syntax-check: add make-prime-list exemptions [PATCH 09/13] factor: 25% speed-up, on output [PATCH 10/13] build: avoid warning about unused macro [PATCH 11/13] maint: mark set-but-not-used variables with [PATCH 12/13] maint: avoid -Wsuggest-attribute=const warning [PATCH 13/13] maint: make-prime-list: do not ignore write failure Torbjorn and Niels, I'd be happy to include more fine-grained changes to factor.c if you can convert the http://gmplib.org:8000/factoring commits and ChangeLog deltas to git commits where the ChangeLog delta appears in the commit log and passes coreutils' commit-log-checking hook. But that may be more trouble than it's worth. The only missing piece is a NEWS entry. Would one of you please write that? --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=factor-ng.xz Content-Transfer-Encoding: base64 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 --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 30 11:13:47 2012 Received: (at 12350) by debbugs.gnu.org; 30 Sep 2012 15:13:47 +0000 Received: from localhost ([127.0.0.1]:34795 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TILDG-0007QV-Qh for submit@debbugs.gnu.org; Sun, 30 Sep 2012 11:13:47 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:59642 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TILDD-0007QL-Sl for 12350@debbugs.gnu.org; Sun, 30 Sep 2012 11:13:45 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 76C5C6C8B8; Sun, 30 Sep 2012 17:13:21 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> <87ehm0o1y2.fsf@rho.meyering.net> <86zk4nieni.fsf@shell.gmplib.org> <86627b1d0q.fsf@shell.gmplib.org> <87r4psxxtx.fsf@rho.meyering.net> <87d313wolz.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Sun, 30 Sep 2012 17:13:21 +0200 In-Reply-To: <87d313wolz.fsf@rho.meyering.net> (Jim Meyering's message of "Sun\, 30 Sep 2012 16\:51\:20 +0200") Message-ID: <86k3vbtuge.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Jim Meyering writes: > Thanks. Here's how I've integrated it so far. > This is not ready to push, but rather just to give you an idea > of what's coming. I'm sure I'll have to adjust things before pushing. =20=20 There have been a few corrections, and I've fleshed out some log entries. =20=20 The following series is ready: =20=20 [PATCH 01/13] build: remove redundant dependency: $(PROGRAMS): [PATCH 02/13] factor: prepare for the new factor program [PATCH 03/13] factor: new implementation; not yet integrated [PATCH 04/13] build: add rules to build the new factor program [PATCH 05/13] factor: improvements from [PATCH 06/13] factor: merge with preexisting factor, integrate [PATCH 07/13] maint: use __builtin_expect only if __GNUC__ [PATCH 08/13] maint: syntax-check: add make-prime-list exemptions [PATCH 09/13] factor: 25% speed-up, on output [PATCH 10/13] build: avoid warning about unused macro [PATCH 11/13] maint: mark set-but-not-used variables with [PATCH 12/13] maint: avoid -Wsuggest-attribute=3Dconst warning [PATCH 13/13] maint: make-prime-list: do not ignore write failure =20=20 Torbjorn and Niels, =20=20 I'd be happy to include more fine-grained changes to factor.c if you can convert the http://gmplib.org:8000/factoring commits and ChangeLog deltas to git commits where the ChangeLog delta appears in the commit log and passes coreutils' commit-log-checking hook. But that may be more trouble than it's worth. =20=20 I think those change logs are not super relevant for the coreutils ChangeLog. "factor.c: Complete rewrite" seem sufficient to me... Both Niels and I mailed the paperwork to the FSF a week or two ago. Have you heard from them? Snail mail tend to disappear. The only missing piece is a NEWS entry. Would one of you please write that? =20=20 Sure. Do you have an example of an old one? Here is a start: The 'factor' program has been completely rewritten for speed and to add range. It can now always factor numbers up to 2^128, even without GMP support. Its speed is from a few times better (for small numbers) to over 10,000 times better (just below 2^64). The new program also runs a proper prime criterion on found factors, not a probabilistic test. As you might have spotted from our repo, I and Nisse M=C3=B6ller are working on a small Quadratic Sieve ("QS") factorer, for which we have two goals: (1) offer it as a HAVE_GMP dependent addition to GNU factor (2) make a more complex variant intended to be state-of-the-art QS is one of the most powerful factoring algorithms yet discovered. With our implementation, we will be able to factor even the most stubborn 128-bit composites within seconds, but with enough patience numbers of upp to 300 bits are within reach. The code is not very large, it will make 'factor' about 30% larger. It should factor any 128-bit numbers in around 1 second. Any 30 bits extra take about 10 times more time. I don't think these new developments should hold up a commit of our old factor.c developments. --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 30 11:34:00 2012 Received: (at 12350) by debbugs.gnu.org; 30 Sep 2012 15:34:00 +0000 Received: from localhost ([127.0.0.1]:34802 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TILWp-0007te-Me for submit@debbugs.gnu.org; Sun, 30 Sep 2012 11:34:00 -0400 Received: from mx.meyering.net ([88.168.87.75]:44763) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TILWm-0007tT-2V for 12350@debbugs.gnu.org; Sun, 30 Sep 2012 11:33:57 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id DD80E601EF; Sun, 30 Sep 2012 17:33:33 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <86k3vbtuge.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Sun, 30 Sep 2012 17:13:21 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> <87ehm0o1y2.fsf@rho.meyering.net> <86zk4nieni.fsf@shell.gmplib.org> <86627b1d0q.fsf@shell.gmplib.org> <87r4psxxtx.fsf@rho.meyering.net> <87d313wolz.fsf@rho.meyering.net> <86k3vbtuge.fsf@shell.gmplib.org> Date: Sun, 30 Sep 2012 17:33:33 +0200 Message-ID: <87txufv836.fsf@rho.meyering.net> Lines: 91 MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -4.0 (----) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -4.0 (----) Torbjorn Granlund wrote: > Jim Meyering writes: > > > Thanks. Here's how I've integrated it so far. > > This is not ready to push, but rather just to give you an idea > > of what's coming. I'm sure I'll have to adjust things before pushing. > > There have been a few corrections, and I've fleshed out some log entrie= s. > > The following series is ready: > > [PATCH 01/13] build: remove redundant dependency: $(PROGRAMS): > [PATCH 02/13] factor: prepare for the new factor program > [PATCH 03/13] factor: new implementation; not yet integrated > [PATCH 04/13] build: add rules to build the new factor program > [PATCH 05/13] factor: improvements from > [PATCH 06/13] factor: merge with preexisting factor, integrate > [PATCH 07/13] maint: use __builtin_expect only if __GNUC__ > [PATCH 08/13] maint: syntax-check: add make-prime-list exemptions > [PATCH 09/13] factor: 25% speed-up, on output > [PATCH 10/13] build: avoid warning about unused macro > [PATCH 11/13] maint: mark set-but-not-used variables with > [PATCH 12/13] maint: avoid -Wsuggest-attribute=3Dconst warning > [PATCH 13/13] maint: make-prime-list: do not ignore write failure > > Torbjorn and Niels, > > I'd be happy to include more fine-grained changes to factor.c > if you can convert the http://gmplib.org:8000/factoring commits > and ChangeLog deltas to git commits where the ChangeLog delta > appears in the commit log and passes coreutils' commit-log-checking hoo= k. > But that may be more trouble than it's worth. > > I think those change logs are not super relevant for the coreutils > ChangeLog. "factor.c: Complete rewrite" seem sufficient to me... > > Both Niels and I mailed the paperwork to the FSF a week or two ago. > Have you heard from them? Snail mail tend to disappear. Not yet. I've just asked them. > The only missing piece is a NEWS entry. > Would one of you please write that? > > Sure. Do you have an example of an old one? Here is a start: Here are a few years worth of NEWS entries: http://git.sv.gnu.org/cgit/coreutils.git/tree/NEWS That looks fine. Thanks. > The 'factor' program has been completely rewritten for speed and to > add range. It can now always factor numbers up to 2^128, even without > GMP support. Its speed is from a few times better (for small numbers) > to over 10,000 times better (just below 2^64). The new program also > runs a proper prime criterion on found factors, not a probabilistic > test. How about this in place of the final sentence? The new program also runs a deterministic primality test for each prime factor, not just a probabilistic test. > As you might have spotted from our repo, I and Nisse M=F6ller are working > on a small Quadratic Sieve ("QS") factorer, for which we have two goals: > > (1) offer it as a HAVE_GMP dependent addition to GNU factor > (2) make a more complex variant intended to be state-of-the-art > > QS is one of the most powerful factoring algorithms yet discovered. > With our implementation, we will be able to factor even the most > stubborn 128-bit composites within seconds, but with enough patience > numbers of upp to 300 bits are within reach. > > The code is not very large, it will make 'factor' about 30% larger. That sort of code size increase sounds perfectly reasonable considering the algorithmic improvements. > It should factor any 128-bit numbers in around 1 second. Any 30 bits > extra take about 10 times more time. That sounds great. > I don't think these new developments should hold up a commit of our old > factor.c developments. I agree. From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 30 11:39:57 2012 Received: (at 12350) by debbugs.gnu.org; 30 Sep 2012 15:39:57 +0000 Received: from localhost ([127.0.0.1]:34806 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TILca-00081m-KT for submit@debbugs.gnu.org; Sun, 30 Sep 2012 11:39:57 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:58035 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TILcY-00081f-0r for 12350@debbugs.gnu.org; Sun, 30 Sep 2012 11:39:55 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id D8BBA6C8BE; Sun, 30 Sep 2012 17:39:31 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> <87ehm0o1y2.fsf@rho.meyering.net> <86zk4nieni.fsf@shell.gmplib.org> <86627b1d0q.fsf@shell.gmplib.org> <87r4psxxtx.fsf@rho.meyering.net> <87d313wolz.fsf@rho.meyering.net> <86k3vbtuge.fsf@shell.gmplib.org> <87txufv836.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Sun, 30 Sep 2012 17:39:31 +0200 In-Reply-To: <87txufv836.fsf@rho.meyering.net> (Jim Meyering's message of "Sun\, 30 Sep 2012 17\:33\:33 +0200") Message-ID: <86fw5ztt8s.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) Jim Meyering writes: How about this in place of the final sentence? =20=20 The new program also runs a deterministic primality test for each prime factor, not just a probabilistic test. =20=20 That's better, thanks. --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 07 05:01:20 2012 Received: (at 12350-done) by debbugs.gnu.org; 7 Oct 2012 09:01:21 +0000 Received: from localhost ([127.0.0.1]:59008 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TKmjf-0000yo-U6 for submit@debbugs.gnu.org; Sun, 07 Oct 2012 05:01:20 -0400 Received: from mx.meyering.net ([88.168.87.75]:39980) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TKmjd-0000yg-S1 for 12350-done@debbugs.gnu.org; Sun, 07 Oct 2012 05:01:18 -0400 Received: from hx.meyering.net (hx.meyering.net [192.168.0.33]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id BCD37603EA; Sun, 7 Oct 2012 11:00:55 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> <87ehm0o1y2.fsf@rho.meyering.net> <86zk4nieni.fsf@shell.gmplib.org> <86627b1d0q.fsf@shell.gmplib.org> <87r4psxxtx.fsf@rho.meyering.net> <87d313wolz.fsf@rho.meyering.net> <86k3vbtuge.fsf@shell.gmplib.org> <87txufv836.fsf@rho.meyering.net> <86fw5ztt8s.fsf@shell.gmplib.org> Date: Sun, 07 Oct 2012 11:00:55 +0200 In-Reply-To: <86fw5ztt8s.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Sun, 30 Sep 2012 17:39:31 +0200") Message-ID: <87626mhd14.fsf@hx.meyering.net> Lines: 20 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: 12350-done Cc: 12350-done@debbugs.gnu.org, nisse@lysator.liu.se X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.3 (-) Torbjorn Granlund wrote: > Jim Meyering writes: > > How about this in place of the final sentence? > > The new program also > runs a deterministic primality test for each prime factor, not just > a probabilistic test. > > That's better, thanks. I pushed the actual bug fix (for the issue mentioned in the Subject) long ago, so I'm closing this "issue". Regarding your upcoming improvements, please start a new thread when you're ready to discuss them, so that your comments are not lost in the volume of with this now-"done" bug report. Thanks again, Jim From debbugs-submit-bounces@debbugs.gnu.org Mon Oct 08 06:35:33 2012 Received: (at 12350) by debbugs.gnu.org; 8 Oct 2012 10:35:33 +0000 Received: from localhost ([127.0.0.1]:60856 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLAgP-0001ql-5k for submit@debbugs.gnu.org; Mon, 08 Oct 2012 06:35:33 -0400 Received: from mx1.redhat.com ([209.132.183.28]:21129) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLAgM-0001qd-FM for 12350@debbugs.gnu.org; Mon, 08 Oct 2012 06:35:31 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q98AZ01i023040 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 8 Oct 2012 06:35:01 -0400 Received: from [10.36.116.94] (ovpn-116-94.ams2.redhat.com [10.36.116.94]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q98AYuLO011751 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 8 Oct 2012 06:34:58 -0400 Message-ID: <5072AC50.60701@draigBrady.com> Date: Mon, 08 Oct 2012 11:34:56 +0100 From: =?UTF-8?B?UMOhZHJhaWcgQnJhZHk=?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <50461EEA.4020200@draigBrady.com> <86ipbtpsjw.fsf@shell.gmplib.org> <504655F5.7080000@draigBrady.com> <86sjaxsb9t.fsf@shell.gmplib.org> In-Reply-To: <86sjaxsb9t.fsf@shell.gmplib.org> Content-Type: text/plain; charset=UTF-8; format=flowed X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by mx1.redhat.com id q98AZ01i023040 X-Spam-Score: -4.2 (----) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, Jim Meyering X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -4.2 (----) On 09/04/2012 10:55 PM, Torbjorn Granlund wrote: > P=C3=A1draig Brady writes: > > Sure. I was just quantifying the performance change, > for others who may be referencing or noticing patches. > (Actually, I'd add a note to the commit message that, > this increases calculations by about 25%). > > And surely mode for certain cases. We spend 25/3 or about 8 times more > effort in Miller Rabin. > > > As I mentioned in the original post, we will replace the current c= ode > > with code that is many times faster. Your example above will run = at > > less than a minute on your system. > > I'd left my test files in place in anticipation ;) > > Please do, and let me and Niels know if it takes more than 45s. Your > test case takes 28s on my 3.3 GHz Sandy bridge system with our current > code. I'm a little disappointed the code doesn't beat the old code mor= e > for small factorisations. So on my 2.1GHz i3-2310M, running over the range 452,930,477 to 472,882,0= 27. old broken code =3D 14m old fixed code =3D 18m new code =3D 63s cheers, P=C3=A1draig. From debbugs-submit-bounces@debbugs.gnu.org Mon Oct 08 06:38:21 2012 Received: (at 12350) by debbugs.gnu.org; 8 Oct 2012 10:38:21 +0000 Received: from localhost ([127.0.0.1]:60901 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLAj7-0001xh-50 for submit@debbugs.gnu.org; Mon, 08 Oct 2012 06:38:21 -0400 Received: from mx1.redhat.com ([209.132.183.28]:13883) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLAj1-0001xX-KD for 12350@debbugs.gnu.org; Mon, 08 Oct 2012 06:38:18 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q98AbmBx028817 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 8 Oct 2012 06:37:48 -0400 Received: from [10.36.116.94] (ovpn-116-94.ams2.redhat.com [10.36.116.94]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q98Abj2e032597 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Mon, 8 Oct 2012 06:37:47 -0400 Message-ID: <5072ACF9.9030901@draigBrady.com> Date: Mon, 08 Oct 2012 11:37:45 +0100 From: =?ISO-8859-1?Q?P=E1draig_Brady?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: 12350@debbugs.gnu.org, meyering@meyering.net Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <86k3w624mx.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> <87ehm0o1y2.fsf@rho.meyering.net> <86zk4nieni.fsf@shell.gmplib.org> <86627b1d0q.fsf@shell.gmplib.org> <87r4psxxtx.fsf@rho.meyering.net> <87d313wolz.fsf@rho.meyering.net> <86k3vbtuge.fsf@shell.gmplib.org> <87txufv836.fsf@rho.meyering.net> <86fw5ztt8s.fsf@shell.gmplib.org> <87626mhd14.fsf@hx.meyering.net> In-Reply-To: <87626mhd14.fsf@hx.meyering.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Spam-Score: -4.2 (----) X-Debbugs-Envelope-To: 12350 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -4.2 (----) On 10/07/2012 10:00 AM, Jim Meyering wrote: > Torbjorn Granlund wrote: >> Jim Meyering writes: >> >> How about this in place of the final sentence? >> >> The new program also >> runs a deterministic primality test for each prime factor, not just >> a probabilistic test. >> >> That's better, thanks. > > I pushed the actual bug fix (for the issue mentioned in the Subject) > long ago, so I'm closing this "issue". > > Regarding your upcoming improvements, please start a new thread > when you're ready to discuss them, so that your comments are not > lost in the volume of with this now-"done" bug report. A small amendment I'm going to push is not to rely on GMP5. GMP4 on my fedora 15 system doesn't have mpz_inits(). i.e. support for initializing multiple variables at once. Patch is simple enough... diff --git a/src/factor.c b/src/factor.c index 5bfbfdc..1857297 100644 --- a/src/factor.c +++ b/src/factor.c @@ -1335,7 +1335,10 @@ mp_prime_p (mpz_t n) if (mpz_cmp_ui (n, (long) FIRST_OMITTED_PRIME * FIRST_OMITTED_PRIME) < 0) return true; - mpz_inits (q, a, nm1, tmp, NULL); + mpz_init (q); + mpz_init (a); + mpz_init (nm1); + mpz_init (tmp); /* Precomputation for Miller-Rabin. */ mpz_sub_ui (nm1, n, 1); @@ -1399,7 +1402,10 @@ mp_prime_p (mpz_t n) if (flag_prove_primality) mp_factor_clear (&factors); ret2: - mpz_clears (q, a, nm1, tmp, NULL); + mpz_clear (q); + mpz_clear (a); + mpz_clear (nm1); + mpz_clear (tmp); return is_prime; } @@ -1608,7 +1614,8 @@ mp_factor_using_pollard_rho (mpz_t n, unsigned long int a, debug ("[pollard-rho (%lu)] ", a); - mpz_inits (t, t2, NULL); + mpz_init (t); + mpz_init (t2); mpz_init_set_si (y, 2); mpz_init_set_si (x, 2); mpz_init_set_si (z, 2); @@ -1688,7 +1695,12 @@ mp_factor_using_pollard_rho (mpz_t n, unsigned long int a, mpz_mod (y, y, n); } - mpz_clears (P, t2, t, z, x, y, NULL); + mpz_clear (P); + mpz_clear (t2); + mpz_clear (t); + mpz_clear (z); + mpz_clear (x); + mpz_clear (y); } #endif From debbugs-submit-bounces@debbugs.gnu.org Mon Oct 08 06:52:42 2012 Received: (at 12350) by debbugs.gnu.org; 8 Oct 2012 10:52:42 +0000 Received: from localhost ([127.0.0.1]:60910 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLAwz-0002I5-FQ for submit@debbugs.gnu.org; Mon, 08 Oct 2012 06:52:42 -0400 Received: from mx.meyering.net ([88.168.87.75]:43557) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLAww-0002Hv-0l for 12350@debbugs.gnu.org; Mon, 08 Oct 2012 06:52:39 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 704E760098; Mon, 8 Oct 2012 12:52:08 +0200 (CEST) From: Jim Meyering To: =?iso-8859-1?Q?P=E1draig?= Brady Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <5072ACF9.9030901@draigBrady.com> (=?iso-8859-1?Q?=22P=E1drai?= =?iso-8859-1?Q?g?= Brady"'s message of "Mon, 08 Oct 2012 11:37:45 +0100") References: <86zk56orxa.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> <87ehm0o1y2.fsf@rho.meyering.net> <86zk4nieni.fsf@shell.gmplib.org> <86627b1d0q.fsf@shell.gmplib.org> <87r4psxxtx.fsf@rho.meyering.net> <87d313wolz.fsf@rho.meyering.net> <86k3vbtuge.fsf@shell.gmplib.org> <87txufv836.fsf@rho.meyering.net> <86fw5ztt8s.fsf@shell.gmplib.org> <87626mhd14.fsf@hx.meyering.net> <5072ACF9.9030901@draigBrady.com> Date: Mon, 08 Oct 2012 12:52:08 +0200 Message-ID: <87zk3xtew7.fsf@rho.meyering.net> Lines: 50 MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.3 (-) P=E1draig Brady wrote: > On 10/07/2012 10:00 AM, Jim Meyering wrote: >> Torbjorn Granlund wrote: >>> Jim Meyering writes: >>> >>> How about this in place of the final sentence? >>> >>> The new program = also >>> runs a deterministic primality test for each prime factor, not j= ust >>> a probabilistic test. >>> >>> That's better, thanks. >> >> I pushed the actual bug fix (for the issue mentioned in the Subject) >> long ago, so I'm closing this "issue". >> >> Regarding your upcoming improvements, please start a new thread >> when you're ready to discuss them, so that your comments are not >> lost in the volume of with this now-"done" bug report. > > A small amendment I'm going to push is not to rely on GMP5. > GMP4 on my fedora 15 system doesn't have mpz_inits(). > i.e. support for initializing multiple variables at once. > > Patch is simple enough... Hi P=E1draig, Thanks, but wouldn't that be a slight "pessimization"? What do you think about providing the missing function instead? Maybe not worth the hassle, but still, it would avoid adding those 12 in-function lines. factor.c is already large and complex enough that every little bit helps. BTW, Fedora 15 passed "end of life" back in June. > diff --git a/src/factor.c b/src/factor.c > index 5bfbfdc..1857297 100644 > --- a/src/factor.c > +++ b/src/factor.c > @@ -1335,7 +1335,10 @@ mp_prime_p (mpz_t n) > if (mpz_cmp_ui (n, (long) FIRST_OMITTED_PRIME * FIRST_OMITTED_PRIME) <= 0) > return true; > > - mpz_inits (q, a, nm1, tmp, NULL); > + mpz_init (q); > + mpz_init (a); > + mpz_init (nm1); > + mpz_init (tmp); ... From debbugs-submit-bounces@debbugs.gnu.org Mon Oct 08 08:13:22 2012 Received: (at 12350) by debbugs.gnu.org; 8 Oct 2012 12:13:22 +0000 Received: from localhost ([127.0.0.1]:32789 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLCD1-0004yG-9d for submit@debbugs.gnu.org; Mon, 08 Oct 2012 08:13:21 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:45564 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLCCx-0004y3-HN for 12350@debbugs.gnu.org; Mon, 08 Oct 2012 08:13:17 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 057A18169C; Mon, 8 Oct 2012 14:12:47 +0200 (CEST) To: =?utf-8?Q?P=C3=A1draig?= Brady Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <50461EEA.4020200@draigBrady.com> <86ipbtpsjw.fsf@shell.gmplib.org> <504655F5.7080000@draigBrady.com> <86sjaxsb9t.fsf@shell.gmplib.org> <5072AC50.60701@draigBrady.com> From: Torbjorn Granlund Date: Mon, 08 Oct 2012 14:12:46 +0200 In-Reply-To: <5072AC50.60701@draigBrady.com> (=?utf-8?Q?=22P=C3=A1draig?= Brady"'s message of "Mon\, 08 Oct 2012 11\:34\:56 +0100") Message-ID: <86r4p9f9hd.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.8 (/) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, jim@meyering.net X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: 0.8 (/) > Please do, and let me and Niels know if it takes more than 45s. Your > test case takes 28s on my 3.3 GHz Sandy bridge system with our current > code. I'm a little disappointed the code doesn't beat the old code more > for small factorisations. =20=20 So on my 2.1GHz i3-2310M, running over the range 452,930,477 to 472,882,0= 27. =20=20 old broken code =3D 14m old fixed code =3D 18m new code =3D 63s =20=20 OK, this is about 60% slower than I would have expected. Our code at http://gmplib.org:8000/factoring/ should run at about 39s on your system. (I am using gcc 4.7.1.) I haven't looked at the final version that went into codeutils, so I have no idea why it runs slower. A wild guess is that its actual input or tokenisation has been slowed down. For smallish numbers, such things can dominate over actually factoring the numbers. I think the current coreutils factor performance for smallish numbers might be sufficient. (Larger numbers than 2^100 need a bit too much time, but we are working on a fix.) --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Mon Oct 08 08:35:16 2012 Received: (at 12350) by debbugs.gnu.org; 8 Oct 2012 12:35:16 +0000 Received: from localhost ([127.0.0.1]:32824 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLCYE-0005TT-EJ for submit@debbugs.gnu.org; Mon, 08 Oct 2012 08:35:15 -0400 Received: from mx.meyering.net ([88.168.87.75]:43805) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLCYA-0005T8-Lu for 12350@debbugs.gnu.org; Mon, 08 Oct 2012 08:35:12 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 75AFA601AA; Mon, 8 Oct 2012 14:34:39 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <86r4p9f9hd.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Mon, 08 Oct 2012 14:12:46 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <50461EEA.4020200@draigBrady.com> <86ipbtpsjw.fsf@shell.gmplib.org> <504655F5.7080000@draigBrady.com> <86sjaxsb9t.fsf@shell.gmplib.org> <5072AC50.60701@draigBrady.com> <86r4p9f9hd.fsf@shell.gmplib.org> Date: Mon, 08 Oct 2012 14:34:39 +0200 Message-ID: <87txu5ta5c.fsf@rho.meyering.net> Lines: 38 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, =?iso-8859-1?Q?P=E1draig?= Brady X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.3 (-) Torbjorn Granlund wrote: > > Please do, and let me and Niels know if it takes more than 45s. Your > > test case takes 28s on my 3.3 GHz Sandy bridge system with our current > > code. I'm a little disappointed the code doesn't beat the old code more > > for small factorisations. > > So on my 2.1GHz i3-2310M, running over the range 452,930,477 to 472,882,027. > > old broken code = 14m > old fixed code = 18m > new code = 63s > > OK, this is about 60% slower than I would have expected. Our code at > http://gmplib.org:8000/factoring/ should run at about 39s on your > system. (I am using gcc 4.7.1.) > > I haven't looked at the final version that went into codeutils, so I > have no idea why it runs slower. A wild guess is that its actual input > or tokenisation has been slowed down. For smallish numbers, such things > can dominate over actually factoring the numbers. > > I think the current coreutils factor performance for smallish numbers > might be sufficient. (Larger numbers than 2^100 need a bit too much > time, but we are working on a fix.) When I compare the factor built from http://gmplib.org:8000/factoring/, and the one in coreutils.git I see these single-trial times: (on a 3.2GHz i7-970) $ seq 452930477 472882027|env time ./factor > k 29.28user 0.44system 0:30.85elapsed 96%CPU (0avgtext+0avgdata 548maxresident)k 0inputs+1011088outputs (0major+162minor)pagefaults 0swaps ... $ seq 452930477 472882027|env time /cu/src/factor > k 26.47user 0.48system 0:28.07elapsed 96%CPU (0avgtext+0avgdata 692maxresident)k 0inputs+1011088outputs (0major+205minor)pagefaults 0swaps I.e., a 9% improvement. Compiled with bleeding edge gcc 4.8.0 20121007. From debbugs-submit-bounces@debbugs.gnu.org Mon Oct 08 08:50:24 2012 Received: (at 12350) by debbugs.gnu.org; 8 Oct 2012 12:50:24 +0000 Received: from localhost ([127.0.0.1]:32896 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLCmt-0005rt-Oi for submit@debbugs.gnu.org; Mon, 08 Oct 2012 08:50:24 -0400 Received: from mx1.redhat.com ([209.132.183.28]:48230) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLCmr-0005rl-3S for 12350@debbugs.gnu.org; Mon, 08 Oct 2012 08:50:22 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q98CnqGJ004665 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 8 Oct 2012 08:49:52 -0400 Received: from [10.36.116.94] (ovpn-116-94.ams2.redhat.com [10.36.116.94]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q98CnmD5021239 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 8 Oct 2012 08:49:49 -0400 Message-ID: <5072CBEB.7060005@draigBrady.com> Date: Mon, 08 Oct 2012 13:49:47 +0100 From: =?ISO-8859-1?Q?P=E1draig_Brady?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <50461EEA.4020200@draigBrady.com> <86ipbtpsjw.fsf@shell.gmplib.org> <504655F5.7080000@draigBrady.com> <86sjaxsb9t.fsf@shell.gmplib.org> <5072AC50.60701@draigBrady.com> <86r4p9f9hd.fsf@shell.gmplib.org> <87txu5ta5c.fsf@rho.meyering.net> In-Reply-To: <87txu5ta5c.fsf@rho.meyering.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by mx1.redhat.com id q98CnqGJ004665 X-Spam-Score: -4.2 (----) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, Torbjorn Granlund X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -4.2 (----) On 10/08/2012 01:34 PM, Jim Meyering wrote: > Torbjorn Granlund wrote: > >> > Please do, and let me and Niels know if it takes more than 45s. = Your >> > test case takes 28s on my 3.3 GHz Sandy bridge system with our cu= rrent >> > code. I'm a little disappointed the code doesn't beat the old co= de more >> > for small factorisations. >> >> So on my 2.1GHz i3-2310M, running over the range 452,930,477 to 472= ,882,027. >> >> old broken code =3D 14m >> old fixed code =3D 18m >> new code =3D 63s >> >> OK, this is about 60% slower than I would have expected. Our code at >> http://gmplib.org:8000/factoring/ should run at about 39s on your >> system. (I am using gcc 4.7.1.) >> >> I haven't looked at the final version that went into codeutils, so I >> have no idea why it runs slower. A wild guess is that its actual inpu= t >> or tokenisation has been slowed down. For smallish numbers, such thin= gs >> can dominate over actually factoring the numbers. >> >> I think the current coreutils factor performance for smallish numbers >> might be sufficient. (Larger numbers than 2^100 need a bit too much >> time, but we are working on a fix.) > > When I compare the factor built from http://gmplib.org:8000/factoring/,= and > the one in coreutils.git I see these single-trial times: (on a 3.2GHz i= 7-970) > > $ seq 452930477 472882027|env time ./factor > k > 29.28user 0.44system 0:30.85elapsed 96%CPU (0avgtext+0avgdata 548max= resident)k > 0inputs+1011088outputs (0major+162minor)pagefaults 0swaps > ... > $ seq 452930477 472882027|env time /cu/src/factor > k > 26.47user 0.48system 0:28.07elapsed 96%CPU (0avgtext+0avgdata 692max= resident)k > 0inputs+1011088outputs (0major+205minor)pagefaults 0swaps > > I.e., a 9% improvement. Compiled with bleeding edge gcc 4.8.0 20121007. Thanks for checking that. Torbjorn you seem to be interploating from your 3.3 GHz Sandy bridge to my 2.1GHz i3-2310M Sandy Bridge, but it might not be linear due to cache, turbo boost, mem bandwidth, ... cheers, P=E1draig. From debbugs-submit-bounces@debbugs.gnu.org Mon Oct 08 08:59:44 2012 Received: (at 12350) by debbugs.gnu.org; 8 Oct 2012 12:59:44 +0000 Received: from localhost ([127.0.0.1]:32900 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLCvv-00063x-Ag for submit@debbugs.gnu.org; Mon, 08 Oct 2012 08:59:43 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:49338 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLCvs-00063o-4f for 12350@debbugs.gnu.org; Mon, 08 Oct 2012 08:59:41 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 3776F816B8; Mon, 8 Oct 2012 14:59:11 +0200 (CEST) To: =?utf-8?Q?P=C3=A1draig?= Brady Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <50461EEA.4020200@draigBrady.com> <86ipbtpsjw.fsf@shell.gmplib.org> <504655F5.7080000@draigBrady.com> <86sjaxsb9t.fsf@shell.gmplib.org> <5072AC50.60701@draigBrady.com> <86r4p9f9hd.fsf@shell.gmplib.org> <87txu5ta5c.fsf@rho.meyering.net> <5072CBEB.7060005@draigBrady.com> From: Torbjorn Granlund Date: Mon, 08 Oct 2012 14:59:11 +0200 In-Reply-To: <5072CBEB.7060005@draigBrady.com> (=?utf-8?Q?=22P=C3=A1draig?= Brady"'s message of "Mon\, 08 Oct 2012 13\:49\:47 +0100") Message-ID: <86bogdf7c0.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.8 (/) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, jim@meyering.net X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: 0.8 (/) P=C3=A1draig Brady writes: Thanks for checking that. =20=20 Torbjorn you seem to be interploating from your 3.3 GHz Sandy bridge to my 2.1GHz i3-2310M Sandy Bridge, but it might not be linear due to cache, turbo boost, mem bandwidth, ... =20=20 It should be linear in clock frequency, yes. The factor program's working set (code and data) is tiny. Things should fit in L1 caches. We have a prime table, but it is smaller than L1D (at about 10 kB). All Sandy bridges in the world have the same L1 cache sizes. Mem bandwidth is therefore irrelevamt, and so is higher-level caches. "Turbo boost" is relevant, but I have that switched off since I am quite fond of reproducible benchmarking results. --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Mon Oct 08 09:04:54 2012 Received: (at 12350) by debbugs.gnu.org; 8 Oct 2012 13:04:54 +0000 Received: from localhost ([127.0.0.1]:32904 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLD0v-0006Bc-IM for submit@debbugs.gnu.org; Mon, 08 Oct 2012 09:04:54 -0400 Received: from mx.meyering.net ([88.168.87.75]:43880) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLD0t-0006BU-0K for 12350@debbugs.gnu.org; Mon, 08 Oct 2012 09:04:52 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id A42B06014F; Mon, 8 Oct 2012 15:04:22 +0200 (CEST) From: Jim Meyering To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <86bogdf7c0.fsf@shell.gmplib.org> (Torbjorn Granlund's message of "Mon, 08 Oct 2012 14:59:11 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <50461EEA.4020200@draigBrady.com> <86ipbtpsjw.fsf@shell.gmplib.org> <504655F5.7080000@draigBrady.com> <86sjaxsb9t.fsf@shell.gmplib.org> <5072AC50.60701@draigBrady.com> <86r4p9f9hd.fsf@shell.gmplib.org> <87txu5ta5c.fsf@rho.meyering.net> <5072CBEB.7060005@draigBrady.com> <86bogdf7c0.fsf@shell.gmplib.org> Date: Mon, 08 Oct 2012 15:04:22 +0200 Message-ID: <87ipalt8rt.fsf@rho.meyering.net> Lines: 16 MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, =?iso-8859-1?Q?P=E1draig?= Brady X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.3 (-) Torbjorn Granlund wrote: > P=E1draig Brady writes: > > Thanks for checking that. > > Torbjorn you seem to be interploating from your > 3.3 GHz Sandy bridge to my 2.1GHz i3-2310M Sandy Bridge, > but it might not be linear due to cache, turbo boost, > mem bandwidth, ... > > It should be linear in clock frequency, yes. "It" meaning the core computation. However, this little command does a lot of I/O, too: 191M input, 77M output. From debbugs-submit-bounces@debbugs.gnu.org Mon Oct 08 09:22:02 2012 Received: (at 12350) by debbugs.gnu.org; 8 Oct 2012 13:22:02 +0000 Received: from localhost ([127.0.0.1]:32910 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLDHV-0006Z0-Iy for submit@debbugs.gnu.org; Mon, 08 Oct 2012 09:22:02 -0400 Received: from gmplib-02.nada.kth.se ([130.237.222.242]:22558 helo=shell.gmplib.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLDHS-0006Yn-1y for 12350@debbugs.gnu.org; Mon, 08 Oct 2012 09:21:59 -0400 Received: by shell.gmplib.org (Postfix, from userid 1001) id 824CD816C0; Mon, 8 Oct 2012 15:21:29 +0200 (CEST) To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <50461EEA.4020200@draigBrady.com> <86ipbtpsjw.fsf@shell.gmplib.org> <504655F5.7080000@draigBrady.com> <86sjaxsb9t.fsf@shell.gmplib.org> <5072AC50.60701@draigBrady.com> <86r4p9f9hd.fsf@shell.gmplib.org> <87txu5ta5c.fsf@rho.meyering.net> <5072CBEB.7060005@draigBrady.com> <86bogdf7c0.fsf@shell.gmplib.org> <87ipalt8rt.fsf@rho.meyering.net> From: Torbjorn Granlund Date: Mon, 08 Oct 2012 15:21:29 +0200 In-Reply-To: <87ipalt8rt.fsf@rho.meyering.net> (Jim Meyering's message of "Mon\, 08 Oct 2012 15\:04\:22 +0200") Message-ID: <86391pf6au.fsf@shell.gmplib.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.8 (/) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, P@draigBrady.com X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: 0.8 (/) Jim Meyering writes: However, this little command does a lot of I/O, too: 191M input, 77M output. =20=20 Sure. I've never seen significant variance for such stuff, measurable as CPU time. I tested with a Sandybridge i3-2120T now. The range takes 32 s. In both cases, the systems run GNU/Linux. The kernel version is 3.2. The factoring speed varies very much with GCC version. I particular the trial division code has a very tight loop, and such loops have more compiler reliance. GCC 4.6 an later generate code that executes 4 insns per (unsuccessful) division. It is also important to use a 32bit binary. We should perhaps have provided better 32-bit code paths to be used for numbers < 2^32 on 32-bit hardware. Now, P=C3=A1draig's example needs about 3x more time for a 32-bit binary on the same hardware. --=20 Torbj=C3=B6rn From debbugs-submit-bounces@debbugs.gnu.org Mon Oct 08 10:44:19 2012 Received: (at 12350) by debbugs.gnu.org; 8 Oct 2012 14:44:19 +0000 Received: from localhost ([127.0.0.1]:33658 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLEZ8-000120-PG for submit@debbugs.gnu.org; Mon, 08 Oct 2012 10:44:19 -0400 Received: from mx1.redhat.com ([209.132.183.28]:8427) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLEZ5-00011r-Gw for 12350@debbugs.gnu.org; Mon, 08 Oct 2012 10:44:16 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q98Ehjcp017960 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 8 Oct 2012 10:43:46 -0400 Received: from [10.36.116.94] (ovpn-116-94.ams2.redhat.com [10.36.116.94]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q98Ehfs1000444 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 8 Oct 2012 10:43:44 -0400 Message-ID: <5072E69D.3090703@draigBrady.com> Date: Mon, 08 Oct 2012 15:43:41 +0100 From: =?UTF-8?B?UMOhZHJhaWcgQnJhZHk=?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Torbjorn Granlund Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <50461EEA.4020200@draigBrady.com> <86ipbtpsjw.fsf@shell.gmplib.org> <504655F5.7080000@draigBrady.com> <86sjaxsb9t.fsf@shell.gmplib.org> <5072AC50.60701@draigBrady.com> <86r4p9f9hd.fsf@shell.gmplib.org> <87txu5ta5c.fsf@rho.meyering.net> <5072CBEB.7060005@draigBrady.com> <86bogdf7c0.fsf@shell.gmplib.org> <87ipalt8rt.fsf@rho.meyering.net> <86391pf6au.fsf@shell.gmplib.org> In-Reply-To: <86391pf6au.fsf@shell.gmplib.org> Content-Type: text/plain; charset=UTF-8; format=flowed X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by mx1.redhat.com id q98Ehjcp017960 X-Spam-Score: -4.2 (----) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org, nisse@lysator.liu.se, Jim Meyering X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -4.2 (----) On 10/08/2012 02:21 PM, Torbjorn Granlund wrote: > Jim Meyering writes: > > However, this little command does a lot of I/O, too: > 191M input, 77M output. > > Sure. I've never seen significant variance for such stuff, measurable > as CPU time. > > I tested with a Sandybridge i3-2120T now. The range takes 32 s. > > In both cases, the systems run GNU/Linux. The kernel version is 3.2. > > The factoring speed varies very much with GCC version. I particular th= e > trial division code has a very tight loop, and such loops have more > compiler reliance. GCC 4.6 an later generate code that executes 4 insn= s > per (unsuccessful) division. gcc (GCC) 4.6.0 20110603 (Red Hat 4.6.0-10) With -march=3Dnative -O2 > It is also important to use a 32bit binary. We should perhaps have s/to use/to not use/ I presume. Yep I'm on 64 bit. > provided better 32-bit code paths to be used for numbers < 2^32 on > 32-bit hardware. Now, P=C3=A1draig's example needs about 3x more time = for a > 32-bit binary on the same hardware. thanks, P=C3=A1draig. From debbugs-submit-bounces@debbugs.gnu.org Mon Oct 08 10:48:19 2012 Received: (at 12350) by debbugs.gnu.org; 8 Oct 2012 14:48:19 +0000 Received: from localhost ([127.0.0.1]:33662 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLEd1-00017o-5u for submit@debbugs.gnu.org; Mon, 08 Oct 2012 10:48:19 -0400 Received: from mx1.redhat.com ([209.132.183.28]:53327) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLEcy-00017f-3o for 12350@debbugs.gnu.org; Mon, 08 Oct 2012 10:48:18 -0400 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q98EllnD017031 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 8 Oct 2012 10:47:47 -0400 Received: from [10.36.116.94] (ovpn-116-94.ams2.redhat.com [10.36.116.94]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q98Eli6M021730 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Mon, 8 Oct 2012 10:47:46 -0400 Message-ID: <5072E790.2010300@draigBrady.com> Date: Mon, 08 Oct 2012 15:47:44 +0100 From: =?ISO-8859-1?Q?P=E1draig_Brady?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> <87ehm0o1y2.fsf@rho.meyering.net> <86zk4nieni.fsf@shell.gmplib.org> <86627b1d0q.fsf@shell.gmplib.org> <87r4psxxtx.fsf@rho.meyering.net> <87d313wolz.fsf@rho.meyering.net> <86k3vbtuge.fsf@shell.gmplib.org> <87txufv836.fsf@rho.meyering.net> <86fw5ztt8s.fsf@shell.gmplib.org> <87626mhd14.fsf@hx.meyering.net> <5072ACF9.9030901@draigBrady.com> <87zk3xtew7.fsf@rho.meyering.net> In-Reply-To: <87zk3xtew7.fsf@rho.meyering.net> Content-Type: multipart/mixed; boundary="------------000609070404040702030909" X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Spam-Score: -4.2 (----) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -4.2 (----) This is a multi-part message in MIME format. --------------000609070404040702030909 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by mx1.redhat.com id q98EllnD017031 On 10/08/2012 11:52 AM, Jim Meyering wrote: > P=E1draig Brady wrote: >> On 10/07/2012 10:00 AM, Jim Meyering wrote: >>> Torbjorn Granlund wrote: >>>> Jim Meyering writes: >>>> >>>> How about this in place of the final sentence? >>>> >>>> The new prog= ram also >>>> runs a deterministic primality test for each prime factor, n= ot just >>>> a probabilistic test. >>>> >>>> That's better, thanks. >>> >>> I pushed the actual bug fix (for the issue mentioned in the Subject) >>> long ago, so I'm closing this "issue". >>> >>> Regarding your upcoming improvements, please start a new thread >>> when you're ready to discuss them, so that your comments are not >>> lost in the volume of with this now-"done" bug report. >> >> A small amendment I'm going to push is not to rely on GMP5. >> GMP4 on my fedora 15 system doesn't have mpz_inits(). >> i.e. support for initializing multiple variables at once. >> >> Patch is simple enough... > > Hi P=E1draig, > > Thanks, but wouldn't that be a slight "pessimization"? > What do you think about providing the missing function instead? > Maybe not worth the hassle, but still, it would avoid adding those 12 > in-function lines. factor.c is already large and complex enough that > every little bit helps. Borderline, but to align code with newer libs, I've done as you suggest in the attached. > BTW, Fedora 15 passed "end of life" back in June. Right, so it's not too old. The same issue will affect debian stable, RHEL, ... cheers, P=E1draig. --------------000609070404040702030909 Content-Type: text/x-patch; name="factor-inits.diff" Content-Disposition: attachment; filename="factor-inits.diff" Content-Transfer-Encoding: 7bit >From 8052c5bf1c5c6dc92b420ce2ed3c6595d9b31797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= Date: Mon, 8 Oct 2012 11:38:41 +0100 Subject: [PATCH] build: support older GMP versions The new factor code introduced usage of mpz_inits() and mpz_clears(), which are only available since GMP >= 5, and will result in a compile error when missing. * m4/gmp.m4 (cu_GMP): Define HAVE_DECL_MPZ_INITS appropriately. * src/factor (mpz_inits): New function, defined where missing. (mpz_clears): Likewise. --- m4/gmp.m4 | 2 ++ src/factor.c | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 0 deletions(-) diff --git a/m4/gmp.m4 b/m4/gmp.m4 index e337e16..59a664f 100644 --- a/m4/gmp.m4 +++ b/m4/gmp.m4 @@ -30,6 +30,8 @@ AC_DEFUN([cu_GMP], LIB_GMP=$ac_cv_search___gmpz_init AC_DEFINE([HAVE_GMP], [1], [Define if you have GNU libgmp (or replacement)]) + # This only available in GMP >= 5 + AC_CHECK_DECLS([mpz_inits], [], [], [[#include ]]) }], [AC_MSG_WARN([libgmp development library was not found or not usable.]) AC_MSG_WARN([AC_PACKAGE_NAME will be built without GMP support.])]) diff --git a/src/factor.c b/src/factor.c index 5bfbfdc..843542b 100644 --- a/src/factor.c +++ b/src/factor.c @@ -526,6 +526,29 @@ factor_insert_large (struct factors *factors, } #if HAVE_GMP + +# if !HAVE_DECL_MPZ_INITS + +# define mpz_inits(...) mpz_va_init (mpz_init, __VA_ARGS__) +# define mpz_clears(...) mpz_va_init (mpz_clear, __VA_ARGS__) + +static void +mpz_va_init (void (*mpz_single_init)(mpz_t), mpz_ptr mpz, ...) +{ + va_list ap; + + va_start (ap, mpz); + + while (mpz != NULL) + { + mpz_single_init (mpz); + mpz = va_arg (ap, mpz_ptr); + } + + va_end (ap); +} +# endif + static void mp_factor (mpz_t, struct mp_factors *); static void -- 1.7.6.4 --------------000609070404040702030909-- From debbugs-submit-bounces@debbugs.gnu.org Mon Oct 08 10:53:16 2012 Received: (at 12350) by debbugs.gnu.org; 8 Oct 2012 14:53:16 +0000 Received: from localhost ([127.0.0.1]:33666 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLEhn-0001EZ-Un for submit@debbugs.gnu.org; Mon, 08 Oct 2012 10:53:16 -0400 Received: from mx.meyering.net ([88.168.87.75]:44138) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLEhl-0001EQ-UR for 12350@debbugs.gnu.org; Mon, 08 Oct 2012 10:53:15 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 882D5600EE; Mon, 8 Oct 2012 16:52:44 +0200 (CEST) From: Jim Meyering To: =?iso-8859-1?Q?P=E1draig?= Brady Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <5072E790.2010300@draigBrady.com> (=?iso-8859-1?Q?=22P=E1drai?= =?iso-8859-1?Q?g?= Brady"'s message of "Mon, 08 Oct 2012 15:47:44 +0100") References: <86zk56orxa.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> <87ehm0o1y2.fsf@rho.meyering.net> <86zk4nieni.fsf@shell.gmplib.org> <86627b1d0q.fsf@shell.gmplib.org> <87r4psxxtx.fsf@rho.meyering.net> <87d313wolz.fsf@rho.meyering.net> <86k3vbtuge.fsf@shell.gmplib.org> <87txufv836.fsf@rho.meyering.net> <86fw5ztt8s.fsf@shell.gmplib.org> <87626mhd14.fsf@hx.meyering.net> <5072ACF9.9030901@draigBrady.com> <87zk3xtew7.fsf@rho.meyering.net> <5072E790.2010300@draigBrady.com> Date: Mon, 08 Oct 2012 16:52:44 +0200 Message-ID: <87lifhrp6r.fsf@rho.meyering.net> Lines: 45 MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.3 (-) P=E1draig Brady wrote: ... >> Thanks, but wouldn't that be a slight "pessimization"? >> What do you think about providing the missing function instead? >> Maybe not worth the hassle, but still, it would avoid adding those 12 >> in-function lines. factor.c is already large and complex enough that >> every little bit helps. > > Borderline, but to align code with newer libs, > I've done as you suggest in the attached. ... Thank you! That looks great. > Subject: [PATCH] build: support older GMP versions > > The new factor code introduced usage of mpz_inits() and > mpz_clears(), which are only available since GMP >=3D 5, > and will result in a compile error when missing. > > * m4/gmp.m4 (cu_GMP): Define HAVE_DECL_MPZ_INITS appropriately. > * src/factor (mpz_inits): New function, defined where missing. > (mpz_clears): Likewise. > --- > m4/gmp.m4 | 2 ++ > src/factor.c | 23 +++++++++++++++++++++++ > 2 files changed, 25 insertions(+), 0 deletions(-) > > diff --git a/m4/gmp.m4 b/m4/gmp.m4 > index e337e16..59a664f 100644 > --- a/m4/gmp.m4 > +++ b/m4/gmp.m4 > @@ -30,6 +30,8 @@ AC_DEFUN([cu_GMP], > LIB_GMP=3D$ac_cv_search___gmpz_init > AC_DEFINE([HAVE_GMP], [1], > [Define if you have GNU libgmp (or replacement)]) > + # This only available in GMP >=3D 5 # This is available only in GMP >=3D 5 > + AC_CHECK_DECLS([mpz_inits], [], [], [[#include ]]) > }], > [AC_MSG_WARN([libgmp development library was not found or not usab= le.]) > AC_MSG_WARN([AC_PACKAGE_NAME will be built without GMP support.])= ]) From debbugs-submit-bounces@debbugs.gnu.org Mon Oct 08 18:40:04 2012 Received: (at 12350) by debbugs.gnu.org; 8 Oct 2012 22:40:05 +0000 Received: from localhost ([127.0.0.1]:34373 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLLzX-0007R2-Rp for submit@debbugs.gnu.org; Mon, 08 Oct 2012 18:40:04 -0400 Received: from mx1.redhat.com ([209.132.183.28]:37355) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLLzT-0007QV-AH for 12350@debbugs.gnu.org; Mon, 08 Oct 2012 18:40:00 -0400 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q98MdSUf025623 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 8 Oct 2012 18:39:28 -0400 Received: from [10.36.116.28] (ovpn-116-28.ams2.redhat.com [10.36.116.28]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q98MdQpL013090 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Mon, 8 Oct 2012 18:39:27 -0400 Message-ID: <5073561D.7030602@draigBrady.com> Date: Mon, 08 Oct 2012 23:39:25 +0100 From: =?ISO-8859-1?Q?P=E1draig_Brady?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Jim Meyering Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) References: <86zk56orxa.fsf@shell.gmplib.org> <87bohiurzk.fsf@rho.meyering.net> <86ligel07f.fsf@shell.gmplib.org> <87ehm66x75.fsf@rho.meyering.net> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> <87ehm0o1y2.fsf@rho.meyering.net> <86zk4nieni.fsf@shell.gmplib.org> <86627b1d0q.fsf@shell.gmplib.org> <87r4psxxtx.fsf@rho.meyering.net> <87d313wolz.fsf@rho.meyering.net> <86k3vbtuge.fsf@shell.gmplib.org> <87txufv836.fsf@rho.meyering.net> <86fw5ztt8s.fsf@shell.gmplib.org> <87626mhd14.fsf@hx.meyering.net> <5072ACF9.9030901@draigBrady.com> <87zk3xtew7.fsf@rho.meyering.net> <5072E790.2010300@draigBrady.com> In-Reply-To: <5072E790.2010300@draigBrady.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by mx1.redhat.com id q98MdSUf025623 X-Spam-Score: -4.2 (----) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -4.2 (----) On 10/08/2012 03:47 PM, P=E1draig Brady wrote: > diff --git a/src/factor.c b/src/factor.c > index 5bfbfdc..843542b 100644 > --- a/src/factor.c > +++ b/src/factor.c > @@ -526,6 +526,29 @@ factor_insert_large (struct factors *factors, > } > > #if HAVE_GMP > + > +# if !HAVE_DECL_MPZ_INITS > + > +# define mpz_inits(...) mpz_va_init (mpz_init, __VA_ARGS__) > +# define mpz_clears(...) mpz_va_init (mpz_clear, __VA_ARGS__) > + > +static void > +mpz_va_init (void (*mpz_single_init)(mpz_t), mpz_ptr mpz, ...) > +{ > + va_list ap; > + > + va_start (ap, mpz); > + > + while (mpz !=3D NULL) > + { > + mpz_single_init (mpz); > + mpz =3D va_arg (ap, mpz_ptr); > + } > + > + va_end (ap); > +} > +# endif > + > static void mp_factor (mpz_t, struct mp_factors *); Actually the above doesn't order the va_arg() call correctly. Also it uses mpz_ptr which is not kosher it seems: http://gmplib.org/list-archives/gmp-discuss/2009-May/003769.html So I've adjusted to: #define mpz_inits(...) mpz_va_init (mpz_init, __VA_ARGS__) #define mpz_clears(...) mpz_va_init (mpz_clear, __VA_ARGS__) static void mpz_va_init (void (*mpz_single_init)(mpz_t), ...) { va_list ap; va_start (ap, mpz_single_init); mpz_t *mpz; while ((mpz =3D va_arg (ap, mpz_t *))) mpz_single_init (*mpz); va_end (ap); } cheers, P=E1draig. From debbugs-submit-bounces@debbugs.gnu.org Tue Oct 09 08:27:37 2012 Received: (at 12350) by debbugs.gnu.org; 9 Oct 2012 12:27:37 +0000 Received: from localhost ([127.0.0.1]:34829 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLYuO-0001ta-LK for submit@debbugs.gnu.org; Tue, 09 Oct 2012 08:27:37 -0400 Received: from mx.meyering.net ([88.168.87.75]:47189) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TLYuM-0001tL-CZ for 12350@debbugs.gnu.org; Tue, 09 Oct 2012 08:27:35 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 38980601EB; Tue, 9 Oct 2012 14:26:55 +0200 (CEST) From: Jim Meyering To: =?iso-8859-1?Q?P=E1draig?= Brady Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <5073561D.7030602@draigBrady.com> (=?iso-8859-1?Q?=22P=E1drai?= =?iso-8859-1?Q?g?= Brady"'s message of "Mon, 08 Oct 2012 23:39:25 +0100") References: <86zk56orxa.fsf@shell.gmplib.org> <86a9wt4tv7.fsf@shell.gmplib.org> <87pq5nt3nd.fsf@rho.meyering.net> <87ipbdsnpk.fsf@rho.meyering.net> <87d31lsnjq.fsf@rho.meyering.net> <86392hngqr.fsf@shell.gmplib.org> <87d31lq9lk.fsf@rho.meyering.net> <86haqwk54c.fsf@shell.gmplib.org> <87ehm0o1y2.fsf@rho.meyering.net> <86zk4nieni.fsf@shell.gmplib.org> <86627b1d0q.fsf@shell.gmplib.org> <87r4psxxtx.fsf@rho.meyering.net> <87d313wolz.fsf@rho.meyering.net> <86k3vbtuge.fsf@shell.gmplib.org> <87txufv836.fsf@rho.meyering.net> <86fw5ztt8s.fsf@shell.gmplib.org> <87626mhd14.fsf@hx.meyering.net> <5072ACF9.9030901@draigBrady.com> <87zk3xtew7.fsf@rho.meyering.net> <5072E790.2010300@draigBrady.com> <5073561D.7030602@draigBrady.com> Date: Tue, 09 Oct 2012 14:26:55 +0200 Message-ID: <87haq3ompc.fsf@rho.meyering.net> Lines: 60 MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.3 (-) P=E1draig Brady wrote: > On 10/08/2012 03:47 PM, P=E1draig Brady wrote: >> diff --git a/src/factor.c b/src/factor.c >> index 5bfbfdc..843542b 100644 >> --- a/src/factor.c >> +++ b/src/factor.c >> @@ -526,6 +526,29 @@ factor_insert_large (struct factors *factors, >> } >> >> #if HAVE_GMP >> + >> +# if !HAVE_DECL_MPZ_INITS >> + >> +# define mpz_inits(...) mpz_va_init (mpz_init, __VA_ARGS__) >> +# define mpz_clears(...) mpz_va_init (mpz_clear, __VA_ARGS__) >> + >> +static void >> +mpz_va_init (void (*mpz_single_init)(mpz_t), mpz_ptr mpz, ...) >> +{ >> + va_list ap; >> + >> + va_start (ap, mpz); >> + >> + while (mpz !=3D NULL) >> + { >> + mpz_single_init (mpz); >> + mpz =3D va_arg (ap, mpz_ptr); >> + } >> + >> + va_end (ap); >> +} >> +# endif >> + >> static void mp_factor (mpz_t, struct mp_factors *); > > Actually the above doesn't order the va_arg() call correctly. > Also it uses mpz_ptr which is not kosher it seems: > http://gmplib.org/list-archives/gmp-discuss/2009-May/003769.html > So I've adjusted to: > > #define mpz_inits(...) mpz_va_init (mpz_init, __VA_ARGS__) > #define mpz_clears(...) mpz_va_init (mpz_clear, __VA_ARGS__) > > static void > mpz_va_init (void (*mpz_single_init)(mpz_t), ...) > { > va_list ap; > > va_start (ap, mpz_single_init); > > mpz_t *mpz; > while ((mpz =3D va_arg (ap, mpz_t *))) > mpz_single_init (*mpz); > > va_end (ap); > } Oh! Were there symptoms? Ship it :-) From debbugs-submit-bounces@debbugs.gnu.org Wed Oct 17 06:42:18 2012 Received: (at 12350) by debbugs.gnu.org; 17 Oct 2012 10:42:18 +0000 Received: from localhost ([127.0.0.1]:47847 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TOR4s-0007SW-7T for submit@debbugs.gnu.org; Wed, 17 Oct 2012 06:42:18 -0400 Received: from cantor2.suse.de ([195.135.220.15]:40400 helo=mx2.suse.de) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TOR4n-0007SH-Ng for 12350@debbugs.gnu.org; Wed, 17 Oct 2012 06:42:15 -0400 Received: from relay1.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 1F5829A78E for <12350@debbugs.gnu.org>; Wed, 17 Oct 2012 12:40:50 +0200 (CEST) Date: Wed, 17 Oct 2012 12:40:49 +0200 From: Philipp Thomas To: 12350@debbugs.gnu.org Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) Message-ID: <20121017104049.GG7624@paradies.suse.de> References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: X-Operating-System: openSUSE - Kernel Linux 3.4.6-2.10-desktop x86_64 Organization: SUSE LINUX Products GmbH, =?iso-8859-1?Q?G?= =?iso-8859-1?Q?F=3A_Jeff_Hawn=2C_Jennifer_Guild=2C_Felix_Imend=F6rffer=2C?= =?iso-8859-1?Q?_HRB_21284_=28AG_N=FCrnberg=29?= User-Agent: Mutt/1.5.21 (2010-09-15) Content-Transfer-Encoding: quoted-printable X-Spam-Score: -4.6 (----) X-Debbugs-Envelope-To: 12350 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -4.6 (----) * Niels M=F6ller (nisse@lysator.liu.se) [20120907 11:10]: > My understanding is that most gnu/linux distributions build coreutils > without linking to gmp. So lots of users don't get this capability. At least openSUSE has been building coreutils with gmp for quite some tim= e. Philipp From debbugs-submit-bounces@debbugs.gnu.org Wed Oct 17 12:06:52 2012 Received: (at 12350) by debbugs.gnu.org; 17 Oct 2012 16:06:52 +0000 Received: from localhost ([127.0.0.1]:48668 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TOW8y-0007JQ-4W for submit@debbugs.gnu.org; Wed, 17 Oct 2012 12:06:52 -0400 Received: from mx.meyering.net ([88.168.87.75]:46029) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TOW8u-0007JI-Lr for 12350@debbugs.gnu.org; Wed, 17 Oct 2012 12:06:50 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id C449660128; Wed, 17 Oct 2012 18:05:28 +0200 (CEST) From: Jim Meyering To: Philipp Thomas Subject: Re: bug#12350: Composites identified as primes in factor.c (when HAVE_GMP) In-Reply-To: <20121017104049.GG7624@paradies.suse.de> (Philipp Thomas's message of "Wed, 17 Oct 2012 12:40:49 +0200") References: <86zk56orxa.fsf@shell.gmplib.org> <87vcftc0bo.fsf@rho.meyering.net> <87obll91td.fsf@rho.meyering.net> <86r4qhpt4z.fsf@shell.gmplib.org> <87mx156jo1.fsf@rho.meyering.net> <86wr0710fw.fsf@shell.gmplib.org> <87y5kmvntw.fsf@rho.meyering.net> <20121017104049.GG7624@paradies.suse.de> Date: Wed, 17 Oct 2012 18:05:28 +0200 Message-ID: <87pq4hkrsn.fsf@rho.meyering.net> Lines: 9 MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.4 (/) X-Debbugs-Envelope-To: 12350 Cc: 12350@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: 0.4 (/) Philipp Thomas wrote: > * Niels M=F6ller (nisse@lysator.liu.se) [20120907 11:10]: > >> My understanding is that most gnu/linux distributions build coreutils >> without linking to gmp. So lots of users don't get this capability. > > At least openSUSE has been building coreutils with gmp for quite some tim= e. So does Fedora. From unknown Sat Aug 16 15:55:22 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Thu, 15 Nov 2012 12:24:02 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator